From 0d03474e524253d1b583bb009956b22749efffb1 Mon Sep 17 00:00:00 2001 From: TizenOpenSource Date: Thu, 7 Dec 2023 12:57:43 +0900 Subject: [PATCH] Imported Upstream version 1.23.0 --- .tarball-version | 2 +- .version | 2 +- BUG-REPORT | 95 +- ChangeLog | 20173 +++++++-- ChangeLog.115 | 57 +- ChangeLog.116 | 9 +- ChangeLog.117 | 7 +- ChangeLog.118 | 9 +- ChangeLog.119 | 19 +- ChangeLog.120 | 5 +- ChangeLog.121 | 7 +- ChangeLog.122 | 5331 +++ FOR-RELEASE | 53 +- HACKING | 178 + INSTALL | 294 +- INSTALL.REPO | 181 +- INSTALL.extra | 305 +- LICENSES | 355 +- MANIFEST | 249 +- MORE.STUFF | 237 +- Makefile.am | 144 +- Makefile.in | 8408 ++-- NEWS | 2321 +- PROBLEMS | 1331 +- PROJECTS | 18 +- README | 170 +- README.MinGW | 398 +- TODO | 10 +- acinclude.m4 | 2 +- aclocal.m4 | 127 +- arch/djgpp/README | 2 +- arch/djgpp/config.bat | 2 +- arch/djgpp/config.sed | 2 +- arch/djgpp/config.site | 2 +- arch/djgpp/t-groff.bat | 4 +- arch/mingw/grap2graph.cmd | 2 +- arch/mingw/groffer.cmd | 2 - arch/mingw/mingw.am | 9 +- arch/misc/misc.am | 30 +- arch/misc/shdeps.sh | 2 +- build-aux/compile | 6 +- build-aux/config.guess | 1462 +- build-aux/config.rpath | 6 +- build-aux/config.sub | 729 +- build-aux/depcomp | 7 +- build-aux/git-version-gen | 26 +- build-aux/install-sh | 161 +- build-aux/missing | 2 +- build-aux/prefix-gnulib-mk | 229 - build-aux/test-driver | 19 +- build-aux/ylwrap | 2 +- configure | 35364 +++++++++------- configure.ac | 158 +- contrib/chem/ChangeLog | 58 +- contrib/chem/README.txt | 6 +- contrib/chem/chem.1.man | 300 +- contrib/chem/chem.am | 20 +- contrib/chem/chem.pic | 6 +- contrib/chem/chem.pl | 125 +- contrib/chem/examples/122/README.txt | 21 +- contrib/chem/examples/122/ch2a_ethyl.chem | 6 +- contrib/chem/examples/122/ch2b_benzene.chem | 4 +- .../chem/examples/122/ch2c_benzene_right.chem | 4 +- contrib/chem/examples/122/ch4a_stick.chem | 6 +- .../examples/122/ch4b_methyl_acetate.chem | 4 +- contrib/chem/examples/122/ch4c_colon.chem | 4 +- contrib/chem/examples/122/ch4d_HCl.H2O.chem | 4 +- .../chem/examples/122/ch4e_CaSO4.2H2O.chem | 4 +- contrib/chem/examples/122/ch4f_C.chem | 4 +- contrib/chem/examples/122/ch4g_BP.chem | 4 +- .../chem/examples/122/ch4h_methacrylate.chem | 4 +- contrib/chem/examples/122/ch4i_cyclo.chem | 4 +- contrib/chem/examples/122/ch4j_ring4.chem | 6 +- contrib/chem/examples/122/ch4k_ring3.chem | 4 +- contrib/chem/examples/122/ch4l_vertex.chem | 4 +- contrib/chem/examples/122/ch4m_double.chem | 4 +- contrib/chem/examples/122/ch4n_triple.chem | 4 +- contrib/chem/examples/122/ch4o_aromatic.chem | 4 +- .../chem/examples/122/ch4p_cholestanol.chem | 4 +- contrib/chem/examples/122/ch4q_rings.chem | 4 +- contrib/chem/examples/122/ch4r_spiro.chem | 4 +- .../chem/examples/122/ch4s_heteroatoms.chem | 4 +- .../chem/examples/122/ch4t_polycyclic.chem | 4 +- contrib/chem/examples/122/ch4u_nicotine.chem | 4 +- contrib/chem/examples/122/ch4v_histidine.chem | 4 +- contrib/chem/examples/122/ch4w_lsd.chem | 4 +- contrib/chem/examples/122/ch4x_anisole.chem | 4 +- contrib/chem/examples/122/ch4y_reserpine.chem | 4 +- .../chem/examples/122/ch4z1_eqn_glutamic.chem | 4 +- contrib/chem/examples/122/ch4z2_text.chem | 4 +- contrib/chem/examples/122/ch5a_size.chem | 4 +- contrib/chem/examples/122/ch6a_pic.chem | 4 +- contrib/chem/examples/122/ch6b_dna.chem | 4 +- contrib/chem/examples/122/chAa_polymer.chem | 4 +- .../chem/examples/122/chAb_vinyl_chloro.chem | 4 +- contrib/chem/examples/122/chAc_morphine.chem | 4 +- .../chem/examples/122/chAd_chlorophyll.chem | 4 +- contrib/chem/examples/122/chAe_chair.chem | 4 +- contrib/chem/examples/122/chAf_arrow.chem | 4 +- contrib/chem/examples/122/chAg_circle.chem | 4 +- contrib/chem/examples/122/chAh_brackets.chem | 4 +- .../122/chAi_poly_vinyl_chloride.chem | 4 +- contrib/chem/examples/122/chBa_jump.chem | 4 +- contrib/chem/examples/122/chBb_bonds.chem | 4 +- contrib/chem/examples/122/chBc_rings.chem | 4 +- contrib/chem/examples/README.txt | 23 +- contrib/chem/examples/atp.chem | 8 +- contrib/chem/examples/cholesterin.chem | 8 +- contrib/chem/examples/ethamivan.chem | 8 +- contrib/chem/examples/lsd.chem | 8 +- contrib/chem/examples/morphine.chem | 6 +- contrib/chem/examples/penicillin.chem | 6 +- contrib/chem/examples/reserpine.chem | 8 +- contrib/eqn2graph/eqn2graph.1.man | 102 +- contrib/eqn2graph/eqn2graph.am | 8 +- contrib/gdiffmk/ChangeLog | 47 +- contrib/gdiffmk/README | 6 +- contrib/gdiffmk/gdiffmk.1.man | 244 +- contrib/gdiffmk/gdiffmk.am | 22 +- contrib/gdiffmk/gdiffmk.sh | 4 +- contrib/gdiffmk/tests/baseline.7 | 2 +- contrib/gdiffmk/tests/gdiffmk_tests.sh | 9 - contrib/gdiffmk/tests/runtests.sh | 177 +- contrib/glilypond/ChangeLog | 60 +- contrib/glilypond/ChangeLog.0x | 8 +- contrib/glilypond/README.txt | 16 +- contrib/glilypond/args.pl | 504 - contrib/glilypond/examples/example.groff | 7 +- contrib/glilypond/glilypond.1.man | 388 +- contrib/glilypond/glilypond.am | 18 +- contrib/glilypond/glilypond.pl | 1300 +- contrib/glilypond/oop_fh.pl | 309 - contrib/glilypond/subs.pl | 471 - contrib/gperl/ChangeLog | 44 +- contrib/gperl/gperl.1.man | 213 +- contrib/gperl/gperl.am | 14 +- contrib/gperl/gperl.pl | 197 +- contrib/gpinyin/ChangeLog | 113 +- contrib/gpinyin/gpinyin.1.man | 251 +- contrib/gpinyin/gpinyin.am | 15 +- contrib/gpinyin/gpinyin.pl | 677 +- contrib/gpinyin/subs.pl | 576 - contrib/grap2graph/grap2graph.1.man | 110 +- contrib/grap2graph/grap2graph.am | 8 +- contrib/groff_filenames/ChangeLog | 108 - contrib/groff_filenames/groff_filenames.5.man | 656 - contrib/groff_filenames/groff_filenames.am | 43 - contrib/groffer/ChangeLog | 564 - contrib/groffer/README | 112 - contrib/groffer/README_PERL | 49 - contrib/groffer/groffer.1.man | 3822 -- contrib/groffer/groffer.am | 120 - contrib/groffer/groffer.pl | 331 - contrib/groffer/main_subs.pl | 2132 - contrib/groffer/man.pl | 736 - contrib/groffer/roff2.1.man | 229 - contrib/groffer/roff2.pl | 230 - contrib/groffer/split_env.sh | 47 - contrib/groffer/subs.pl | 795 - contrib/groffer/version.sh | 34 - contrib/hdtbl/ChangeLog | 88 +- contrib/hdtbl/examples/chess_board.roff | 6 +- .../hdtbl/examples/col_rowspan_colors.roff | 6 +- contrib/hdtbl/examples/color_boxes.roff | 6 +- .../hdtbl/examples/color_nested_tables.roff | 6 +- contrib/hdtbl/examples/color_table_cells.roff | 6 +- contrib/hdtbl/examples/color_transitions.roff | 6 +- contrib/hdtbl/examples/common.roff | 6 +- contrib/hdtbl/examples/fonts_n.in | 6 +- contrib/hdtbl/examples/fonts_x.in | 6 +- contrib/hdtbl/examples/mixed_pickles.roff | 10 +- contrib/hdtbl/examples/rainbow.roff | 6 +- contrib/hdtbl/examples/short_reference.roff | 6 +- contrib/hdtbl/groff_hdtbl.7.man | 601 +- contrib/hdtbl/{hdmisc.tmac-u => hdmisc.tmac} | 8 +- contrib/hdtbl/hdtbl.am | 81 +- contrib/hdtbl/{hdtbl.tmac-u => hdtbl.tmac} | 4 +- contrib/mm/ChangeLog | 683 +- contrib/mm/Makefile.sim | 11 +- contrib/mm/NOTES | 10 +- contrib/mm/README | 28 +- contrib/mm/examples/README | 10 +- contrib/mm/examples/letter.mm | 50 +- contrib/mm/groff_mm.7.man | 6049 ++- contrib/mm/groff_mmse.7.man | 85 +- contrib/mm/m.tmac | 602 +- contrib/mm/mm.am | 51 +- contrib/mm/mm/0.MT | 23 +- contrib/mm/mm/4.MT | 22 +- contrib/mm/mm/5.MT | 19 +- contrib/mm/mm/ms.cov | 83 +- contrib/mm/mmroff.1.man | 145 +- contrib/mm/mmroff.pl | 31 +- contrib/mm/mse.tmac | 16 +- contrib/mm/refer-mm.tmac | 7 +- contrib/mm/tests/LT_SP_AU_without_AT_works.sh | 50 + .../mm/tests/LT_SP_multi-word_LO_SJ_works.sh | 49 + .../mm/tests/MT-1-reports-all-TM-numbers.sh | 53 + contrib/mm/tests/MT_5_includes_AT_in_SG.sh | 43 + contrib/mm/tests/P-indentation-works.sh | 135 + contrib/mm/tests/artifacts/60657.ref | 11 + .../ms_cover_sheet_robust_to_missing_AF.sh | 39 + .../mse_has-sufficient-footnote-space.sh | 77 + ...e-equation-labels-correctly-in-displays.sh | 62 + .../mm/tests/remove-stale-bib-entry-data.sh | 72 + .../short-pages-do-not-overflow-stack.sh | 59 + contrib/mom/BUGS | 131 +- contrib/mom/ChangeLog | 166 +- contrib/mom/NEWS | 16 +- contrib/mom/TODO | 2 +- contrib/mom/copyright | 6 +- contrib/mom/examples/README-fr.txt | 16 +- contrib/mom/examples/README.txt | 16 +- contrib/mom/examples/copyright-chapter.mom | 160 + contrib/mom/examples/copyright-default.mom | 149 + contrib/mom/examples/elvis_syntax | 2 +- contrib/mom/examples/elvis_syntax.new | 2 +- contrib/mom/examples/letter.mom | 2 +- contrib/mom/examples/mom-pdf.mom | 104 +- contrib/mom/examples/mom.vim | 2 +- contrib/mom/examples/mon_premier_doc.mom | 2 +- contrib/mom/examples/sample_docs.mom | 2 +- contrib/mom/examples/slide-demo.mom | 78 +- contrib/mom/examples/test-mom.sh.in | 17 +- contrib/mom/examples/typesetting.mom | 4 +- contrib/mom/groff_mom.7.man | 906 +- contrib/mom/mom.am | 82 +- contrib/mom/momdoc/appendices.html | 157 +- contrib/mom/momdoc/color.html | 173 +- contrib/mom/momdoc/cover.html | 131 +- contrib/mom/momdoc/definitions.html | 59 +- contrib/mom/momdoc/docelement.html | 785 +- contrib/mom/momdoc/docprocessing.html | 531 +- contrib/mom/momdoc/goodies.html | 384 +- contrib/mom/momdoc/graphical.html | 271 +- contrib/mom/momdoc/headfootpage.html | 171 +- contrib/mom/momdoc/images.html | 916 +- contrib/mom/momdoc/inlines.html | 226 +- contrib/mom/momdoc/intro.html | 31 +- contrib/mom/momdoc/letters.html | 20 +- contrib/mom/momdoc/macrolist.html | 72 +- contrib/mom/momdoc/rectoverso.html | 34 +- contrib/mom/momdoc/refer.html | 98 +- contrib/mom/momdoc/reserved.html | 10 +- contrib/mom/momdoc/stylesheet.css | 20 +- contrib/mom/momdoc/tables-of-contents.html | 124 +- contrib/mom/momdoc/toc.html | 133 +- contrib/mom/momdoc/typesetting.html | 476 +- contrib/mom/momdoc/using.html | 24 +- contrib/mom/momdoc/version-2.html | 216 +- contrib/mom/om.tmac | 2488 +- contrib/pdfmark/ChangeLog | 241 +- contrib/pdfmark/PROBLEMS | 2 +- contrib/pdfmark/README | 2 +- contrib/pdfmark/TODO | 2 +- contrib/pdfmark/cover.ms | 5 +- contrib/pdfmark/pdfmark.am | 35 +- contrib/pdfmark/pdfmark.ms | 536 +- contrib/pdfmark/pdfmark.tmac | 2 +- contrib/pdfmark/pdfroff.1.man | 656 +- contrib/pdfmark/pdfroff.sh | 4 +- contrib/pdfmark/sanitize.tmac | 170 + contrib/pdfmark/spdf.tmac | 396 +- contrib/pic2graph/pic2graph.1.man | 114 +- contrib/pic2graph/pic2graph.am | 8 +- contrib/rfc1345/COPYRIGHT | 23 + contrib/rfc1345/groff_rfc1345.7.man | 265 + contrib/rfc1345/rfc1345.am | 41 + contrib/rfc1345/rfc1345.tmac | 1705 + contrib/rfc1345/tests/rfc1345-smoke-test.sh | 31 + contrib/sboxes/ChangeLog | 202 + contrib/sboxes/msboxes.ms.in | 272 + contrib/sboxes/notquine.sed | 18 + contrib/sboxes/sboxes.am | 74 + contrib/sboxes/sboxes.tmac | 147 + doc/automake.mom | 102 +- doc/doc.am | 818 +- doc/fixinfo.sh | 49 - doc/groff.dvi | Bin 0 -> 1369752 bytes doc/groff.html | 24945 +++++++++++ doc/groff.html.node/Adjustment.html | 57 + doc/groff.html.node/Argument-Units.html | 68 + doc/groff.html.node/Artificial-Fonts.html | 252 + .../Assigning-Register-Formats.html | 188 + doc/groff.html.node/Auto_002dincrement.html | 124 + doc/groff.html.node/Background.html | 96 + doc/groff.html.node/Basics.html | 232 + doc/groff.html.node/Blank-Line-Traps.html | 71 + doc/groff.html.node/Breaking.html | 119 + .../Built_002din-Registers.html | 253 + doc/groff.html.node/Calling-Macros.html | 164 + .../Changing-the-Type-Size.html | 159 + .../Changing-the-Vertical-Spacing.html | 146 + doc/groff.html.node/Character-Classes.html | 140 + .../Character-Translations.html | 200 + doc/groff.html.node/Colors.html | 208 + doc/groff.html.node/Columnation.html | 53 + doc/groff.html.node/Command-Reference.html | 60 + doc/groff.html.node/Comment-Command.html | 65 + doc/groff.html.node/Comments.html | 157 + doc/groff.html.node/Common-Features.html | 89 + doc/groff.html.node/Compatibility-Mode.html | 221 + doc/groff.html.node/Concept-Index.html | 2359 ++ doc/groff.html.node/Conditional-Blocks.html | 174 + .../Conditionals-and-Loops.html | 64 + .../Configuration-and-Customization.html | 56 + doc/groff.html.node/Control-Characters.html | 137 + .../Conventions-Used-in-This-Manual.html | 124 + doc/groff.html.node/Copy-Mode.html | 256 + doc/groff.html.node/Copying-This-Manual.html | 534 + doc/groff.html.node/Credits.html | 58 + doc/groff.html.node/DESC-File-Format.html | 258 + doc/groff.html.node/Debugging.html | 317 + doc/groff.html.node/Default-Units.html | 87 + doc/groff.html.node/Deferring-Output.html | 106 + doc/groff.html.node/Delimiters.html | 233 + .../Device-Control-Commands.html | 185 + .../Device-and-Font-Description-Files.html | 77 + .../Differences-from-AT_0026T-ms.html | 171 + doc/groff.html.node/Displays-and-Keeps.html | 74 + doc/groff.html.node/Diversion-Traps.html | 79 + doc/groff.html.node/Diversions.html | 394 + doc/groff.html.node/Document-Formats.html | 57 + doc/groff.html.node/Document-Parts.html | 84 + .../Drawing-Geometric-Objects.html | 361 + doc/groff.html.node/Dummy-Characters.html | 166 + .../End_002dof_002dinput-Traps.html | 187 + doc/groff.html.node/Environment.html | 151 + doc/groff.html.node/Environments.html | 250 + .../Escape-Sequence-Index.html | 162 + doc/groff.html.node/Fields.html | 98 + doc/groff.html.node/File-Formats.html | 62 + doc/groff.html.node/File-Keyword-Index.html | 215 + doc/groff.html.node/Filling.html | 79 + .../Font-Description-File-Format.html | 280 + doc/groff.html.node/Font-Directories.html | 113 + doc/groff.html.node/Font-Families.html | 182 + doc/groff.html.node/Font-Positions.html | 138 + .../Font-and-Size-Changes.html | 56 + .../Footnotes-and-Endnotes.html | 60 + .../Formatter-Instructions.html | 83 + doc/groff.html.node/GNU-troff-Reference.html | 99 + doc/groff.html.node/Graphics-Commands.html | 247 + doc/groff.html.node/Groff-Options.html | 536 + doc/groff.html.node/Gtroff-Internals.html | 187 + doc/groff.html.node/Headers-and-Footers.html | 61 + doc/groff.html.node/Headings-in-ms.html | 214 + doc/groff.html.node/Hyphenation.html | 66 + doc/groff.html.node/I_002fO.html | 457 + doc/groff.html.node/Identifiers.html | 210 + .../Implementation-Differences.html | 64 + .../Indented-regions-in-ms.html | 112 + doc/groff.html.node/Indexing.html | 58 + doc/groff.html.node/Input-Conventions.html | 171 + doc/groff.html.node/Input-Encodings.html | 154 + doc/groff.html.node/Input-Line-Traps.html | 185 + doc/groff.html.node/Installation.html | 57 + .../Intermediate-Output-Examples.html | 171 + .../Interpolating-Registers.html | 99 + doc/groff.html.node/Introduction.html | 68 + doc/groff.html.node/Invocation-Examples.html | 120 + doc/groff.html.node/Invoking-Requests.html | 143 + doc/groff.html.node/Invoking-groff.html | 82 + doc/groff.html.node/Italic-Corrections.html | 96 + doc/groff.html.node/Language-Concepts.html | 70 + doc/groff.html.node/Leaders.html | 126 + doc/groff.html.node/Leading-Space-Traps.html | 82 + .../Ligatures-and-Kerning.html | 157 + doc/groff.html.node/Line-Continuation.html | 166 + doc/groff.html.node/Line-Layout.html | 267 + doc/groff.html.node/Lists-in-ms.html | 216 + doc/groff.html.node/Macro-Directories.html | 125 + doc/groff.html.node/Macro-Index.html | 335 + doc/groff.html.node/Macro-Package-Intro.html | 63 + doc/groff.html.node/Macro-Packages.html | 64 + doc/groff.html.node/Major-Macro-Packages.html | 103 + .../Manipulating-Filling-and-Adjustment.html | 501 + .../Manipulating-Hyphenation.html | 580 + doc/groff.html.node/Manipulating-Spacing.html | 220 + ...lating-Type-Size-and-Vertical-Spacing.html | 74 + doc/groff.html.node/Measurements.html | 177 + doc/groff.html.node/Miscellaneous.html | 275 + .../Missing-Unix-Version-7-ms-Macros.html | 78 + doc/groff.html.node/Motion-Quanta.html | 93 + doc/groff.html.node/Numeric-Expressions.html | 395 + doc/groff.html.node/Obsolete-Command.html | 74 + doc/groff.html.node/Operator-Index.html | 188 + .../Operators-in-Conditionals.html | 222 + .../Optional-man-extensions.html | 264 + doc/groff.html.node/Other-Differences.html | 248 + doc/groff.html.node/Output-Device-Intro.html | 63 + .../Output-Language-Compatibility.html | 103 + doc/groff.html.node/Page-Control.html | 218 + doc/groff.html.node/Page-Geometry.html | 140 + .../Page-Layout-Adjustment.html | 57 + doc/groff.html.node/Page-Layout.html | 188 + doc/groff.html.node/Page-Location-Traps.html | 326 + doc/groff.html.node/Page-Motions.html | 454 + doc/groff.html.node/Paper-Format.html | 101 + doc/groff.html.node/Paragraphs-in-ms.html | 160 + doc/groff.html.node/Paragraphs.html | 109 + doc/groff.html.node/Parameters.html | 195 + doc/groff.html.node/Postprocessor-Access.html | 144 + doc/groff.html.node/Predefined-Text.html | 53 + doc/groff.html.node/Preprocessor-Intro.html | 78 + doc/groff.html.node/Preprocessor-Support.html | 56 + .../Program-and-File-Index.html | 239 + doc/groff.html.node/Punning-Names.html | 190 + doc/groff.html.node/Register-Index.html | 349 + doc/groff.html.node/Registers.html | 65 + doc/groff.html.node/Request-Index.html | 394 + doc/groff.html.node/Requests-and-Macros.html | 221 + doc/groff.html.node/Safer-Mode.html | 61 + .../Sections-and-Chapters.html | 56 + doc/groff.html.node/Selecting-Fonts.html | 227 + doc/groff.html.node/Sentences.html | 174 + doc/groff.html.node/Separation.html | 94 + doc/groff.html.node/Setting-Registers.html | 215 + doc/groff.html.node/Simple-Commands.html | 207 + doc/groff.html.node/Special-Fonts.html | 93 + doc/groff.html.node/String-Index.html | 344 + doc/groff.html.node/Strings.html | 429 + doc/groff.html.node/Suppressing-Output.html | 147 + doc/groff.html.node/Tab-Stops-in-ms.html | 67 + doc/groff.html.node/Table-of-Contents.html | 71 + doc/groff.html.node/Tabs-and-Fields.html | 276 + doc/groff.html.node/Tabs-and-Leaders.html | 87 + doc/groff.html.node/Text-settings-in-ms.html | 76 + doc/groff.html.node/Text.html | 81 + .../The-Implicit-Page-Trap.html | 74 + doc/groff.html.node/Traps.html | 73 + .../Tutorial-for-Macro-Users.html | 68 + .../Typeface-and-decoration.html | 212 + .../Typographical-symbols-in-ms.html | 80 + .../Using-Escape-Sequences.html | 206 + doc/groff.html.node/Using-Fonts.html | 148 + .../Using-Fractional-Type-Sizes.html | 172 + doc/groff.html.node/Using-Symbols.html | 632 + .../Vertical-Position-Traps.html | 94 + doc/groff.html.node/Warnings.html | 246 + doc/groff.html.node/What-Is-groff_003f.html | 68 + doc/groff.html.node/Writing-Macros.html | 267 + doc/groff.html.node/als.html | 33 + doc/groff.html.node/groff-Capabilities.html | 91 + doc/groff.html.node/groff.html_fot.html | 525 + doc/groff.html.node/gtroff-Output.html | 100 + doc/groff.html.node/if_002delse.html | 97 + doc/groff.html.node/if_002dthen.html | 111 + doc/groff.html.node/index.html | 453 + doc/groff.html.node/man.html | 71 + doc/groff.html.node/mdoc.html | 61 + doc/groff.html.node/me.html | 67 + doc/groff.html.node/mm.html | 64 + doc/groff.html.node/mom.html | 85 + doc/groff.html.node/ms-Body-Text.html | 70 + .../ms-Document-Control-Settings.html | 524 + .../ms-Document-Description-Macros.html | 189 + .../ms-Document-Structure.html | 106 + doc/groff.html.node/ms-Footnotes.html | 155 + .../ms-Headers-and-Footers.html | 122 + doc/groff.html.node/ms-Insertions.html | 181 + doc/groff.html.node/ms-Introduction.html | 60 + doc/groff.html.node/ms-Legacy-Features.html | 285 + doc/groff.html.node/ms-Margins.html | 56 + doc/groff.html.node/ms-Multiple-Columns.html | 88 + .../ms-Naming-Conventions.html | 89 + doc/groff.html.node/ms-Page-Layout.html | 64 + doc/groff.html.node/ms-TOC.html | 242 + doc/groff.html.node/ms-basic-information.html | 211 + .../ms-keeps-and-displays.html | 207 + .../ms-language-and-localization.html | 135 + doc/groff.html.node/ms.html | 75 + .../troff-and-nroff-Modes.html | 114 + doc/groff.html.node/while.html | 161 + doc/groff.info | 423 + doc/groff.info-1 | 7824 ++++ doc/groff.info-2 | 7529 ++++ doc/groff.info-3 | Bin 0 -> 238373 bytes doc/groff.pdf | Bin 0 -> 1148308 bytes doc/groff.texi | 21461 +++++----- doc/groff.txt | 18123 ++++++++ doc/me-revisions | 261 + doc/{meintro.me => meintro.me.in} | 185 +- doc/{meintro_fr.me => meintro_fr.me.in} | 511 +- doc/meref.me | 2241 - doc/meref.me.in | 2439 ++ doc/ms.ms | 4486 ++ doc/pic.ms | 145 +- doc/webpage.ms | 316 +- font/devX100-12/CB | 4 +- font/devX100-12/CBI | 4 +- font/devX100-12/CI | 4 +- font/devX100-12/CR | 4 +- font/devX100-12/HB | 4 +- font/devX100-12/HBI | 4 +- font/devX100-12/HI | 4 +- font/devX100-12/HR | 4 +- font/devX100-12/NB | 4 +- font/devX100-12/NBI | 4 +- font/devX100-12/NI | 4 +- font/devX100-12/NR | 4 +- font/devX100-12/TB | 4 +- font/devX100-12/TBI | 4 +- font/devX100-12/TI | 4 +- font/devX100-12/TR | 4 +- font/devX100-12/devX100-12.am | 29 +- font/devX100/CB | 4 +- font/devX100/CBI | 4 +- font/devX100/CI | 4 +- font/devX100/CR | 4 +- font/devX100/HB | 4 +- font/devX100/HBI | 4 +- font/devX100/HI | 4 +- font/devX100/HR | 4 +- font/devX100/NB | 4 +- font/devX100/NBI | 4 +- font/devX100/NI | 4 +- font/devX100/NR | 4 +- font/devX100/TB | 4 +- font/devX100/TBI | 4 +- font/devX100/TI | 4 +- font/devX100/TR | 4 +- font/devX100/devX100.am | 29 +- font/devX75-12/CB | 4 +- font/devX75-12/CBI | 4 +- font/devX75-12/CI | 4 +- font/devX75-12/CR | 4 +- font/devX75-12/HB | 4 +- font/devX75-12/HBI | 4 +- font/devX75-12/HI | 4 +- font/devX75-12/HR | 4 +- font/devX75-12/NB | 4 +- font/devX75-12/NBI | 4 +- font/devX75-12/NI | 4 +- font/devX75-12/NR | 4 +- font/devX75-12/TB | 4 +- font/devX75-12/TBI | 4 +- font/devX75-12/TI | 4 +- font/devX75-12/TR | 4 +- font/devX75-12/devX75-12.am | 31 +- font/devX75/CB | 4 +- font/devX75/CBI | 4 +- font/devX75/CI | 4 +- font/devX75/CR | 4 +- font/devX75/HB | 4 +- font/devX75/HBI | 4 +- font/devX75/HI | 4 +- font/devX75/HR | 4 +- font/devX75/NB | 4 +- font/devX75/NBI | 4 +- font/devX75/NI | 4 +- font/devX75/NR | 4 +- font/devX75/TB | 4 +- font/devX75/TBI | 4 +- font/devX75/TI | 4 +- font/devX75/TR | 4 +- font/devX75/devX75.am | 29 +- font/devascii/R.proto | 20 +- font/devascii/devascii.am | 10 +- font/devcp1047/devcp1047.am | 10 +- font/devdvi/EX | 1 + font/devdvi/MI | 1 + font/devdvi/S | 1 + font/devdvi/SA | 1 + font/devdvi/devdvi.am | 10 +- font/devdvi/generate/Makefile | 10 +- font/devhtml/R.proto | 11 +- font/devhtml/devhtml.am | 25 +- font/devlatin1/R.proto | 22 +- font/devlatin1/devlatin1.am | 10 +- font/devlbp/devlbp.am | 10 +- font/devlj4/S | 6 +- font/devlj4/devlj4.am | 10 +- font/devlj4/generate/Makefile | 10 +- font/devpdf/Foundry.in | 178 +- font/devpdf/devpdf.am | 136 +- font/devpdf/tests/check-default-foundry.sh.in | 99 + font/devpdf/tests/check-urw-foundry.sh.in | 86 + font/devpdf/util/BuildFoundries.pl | 342 +- font/devps/AB | 9 + font/devps/ABI | 9 + font/devps/AI | 9 + font/devps/AR | 9 + font/devps/BMB | 9 + font/devps/BMBI | 9 + font/devps/BMI | 9 + font/devps/BMR | 9 + font/devps/EURO | 1 + font/devps/HB | 39 + font/devps/HBI | 39 + font/devps/HI | 54 + font/devps/HNB | 39 + font/devps/HNBI | 39 + font/devps/HNI | 54 + font/devps/HNR | 54 + font/devps/HR | 54 + font/devps/NB | 38 + font/devps/NBI | 45 + font/devps/NI | 61 + font/devps/NR | 61 + font/devps/PB | 14 + font/devps/PBI | 14 + font/devps/PI | 14 + font/devps/PR | 14 + font/devps/S | 1 - font/devps/TB | 20 + font/devps/TBI | 16 + font/devps/TI | 19 + font/devps/TR | 14 + font/devps/ZCMI | 35 + font/devps/devps.am | 64 +- font/devps/{freeeuro.pfa => freeeuro.ps} | 0 font/devps/generate/Makefile | 146 +- .../{dingbats.rmap => dingbats-reversed.map} | 0 font/devps/generate/make-zapfdr | 2 +- .../{lgreekmap => slanted-symbol.map} | 0 font/devps/{symbolmap => generate/symbol.map} | 1 - font/devps/generate/symbolsl.afm | 210 - font/devps/generate/{textmap => text.map} | 0 font/devps/psstrip.sed | 3 +- font/devps/symbolsl.afm | 225 + font/devutf8/NOTES | 40 +- font/devutf8/R.proto | 5 + font/devutf8/devutf8.am | 21 +- font/scripts/scripts.am | 10 +- font/util/make-Rproto | 2 +- gendef.sh | 2 +- gnulib_m4/00gnulib.m4 | 107 +- gnulib_m4/absolute-header.m4 | 12 +- gnulib_m4/alloca.m4 | 53 +- gnulib_m4/asm-underscore.m4 | 72 - gnulib_m4/assert_h.m4 | 67 + gnulib_m4/errno_h.m4 | 20 +- gnulib_m4/exponentd.m4 | 2 +- gnulib_m4/exponentf.m4 | 2 +- gnulib_m4/exponentl.m4 | 16 +- gnulib_m4/extensions.m4 | 181 +- gnulib_m4/extern-inline.m4 | 30 +- gnulib_m4/float_h.m4 | 22 +- gnulib_m4/fpieee.m4 | 2 +- gnulib_m4/fprintf-posix.m4 | 2 +- gnulib_m4/free.m4 | 52 + gnulib_m4/frexp.m4 | 2 +- gnulib_m4/frexpl.m4 | 8 +- gnulib_m4/fseterr.m4 | 9 +- gnulib_m4/gnulib-cache.m4 | 12 +- gnulib_m4/gnulib-common.m4 | 1107 +- gnulib_m4/gnulib-comp.m4 | 225 +- gnulib_m4/host-cpu-c-abi.m4 | 456 - gnulib_m4/include_next.m4 | 40 +- gnulib_m4/intmax_t.m4 | 16 +- gnulib_m4/inttypes.m4 | 184 + gnulib_m4/inttypes_h.m4 | 2 +- gnulib_m4/isnand.m4 | 8 +- gnulib_m4/isnanf.m4 | 18 +- gnulib_m4/isnanl.m4 | 16 +- gnulib_m4/ldexpl.m4 | 2 +- gnulib_m4/libunistring-base.m4 | 12 +- gnulib_m4/limits-h.m4 | 14 +- gnulib_m4/longlong.m4 | 113 - gnulib_m4/math_h.m4 | 573 +- gnulib_m4/memchr.m4 | 79 +- gnulib_m4/mmap-anon.m4 | 8 +- gnulib_m4/multiarch.m4 | 69 +- gnulib_m4/nocrash.m4 | 6 +- gnulib_m4/non-recursive-gnulib-prefix-hack.m4 | 32 - gnulib_m4/off_t.m4 | 2 +- gnulib_m4/printf-frexp.m4 | 2 +- gnulib_m4/printf-frexpl.m4 | 2 +- gnulib_m4/printf.m4 | 319 +- gnulib_m4/signbit.m4 | 188 +- gnulib_m4/size_max.m4 | 16 +- gnulib_m4/snprintf.m4 | 2 +- gnulib_m4/ssize_t.m4 | 2 +- gnulib_m4/stdbool.m4 | 118 + gnulib_m4/stddef_h.m4 | 62 +- gnulib_m4/stdint.m4 | 69 +- gnulib_m4/stdint_h.m4 | 2 +- gnulib_m4/stdio_h.m4 | 212 +- gnulib_m4/stdlib_h.m4 | 209 + gnulib_m4/string_h.m4 | 142 +- gnulib_m4/sys_types_h.m4 | 38 +- gnulib_m4/unistd_h.m4 | 275 + gnulib_m4/vasnprintf.m4 | 19 +- gnulib_m4/vsnprintf.m4 | 2 +- gnulib_m4/warn-on-use.m4 | 35 +- gnulib_m4/wchar_h.m4 | 222 +- gnulib_m4/wchar_t.m4 | 2 +- gnulib_m4/wctype_h.m4 | 94 +- gnulib_m4/wcwidth.m4 | 48 +- gnulib_m4/wint_t.m4 | 47 +- gnulib_m4/xsize.m4 | 2 +- gnulib_m4/zzgnulib.m4 | 23 + lib/_Noreturn.h | 50 + lib/alloca.in.h | 33 +- lib/arg-nonnull.h | 12 +- lib/asnprintf.c | 18 +- lib/assert.in.h | 27 + lib/attribute.h | 226 + lib/c++defs.h | 37 +- lib/errno.in.h | 18 +- lib/float+.h | 18 +- lib/float.c | 16 +- lib/float.in.h | 22 +- lib/fprintf.c | 22 +- lib/fpucw.h | 26 +- lib/free.c | 53 + lib/frexp.c | 16 +- lib/frexpl.c | 16 +- lib/fseterr.c | 18 +- lib/fseterr.h | 16 +- lib/gnulib.mk | 1269 +- lib/inttypes.in.h | 1028 + lib/isnan.c | 21 +- lib/isnand-nolibm.h | 20 +- lib/isnand.c | 16 +- lib/isnanf-nolibm.h | 23 +- lib/isnanf.c | 16 +- lib/isnanl-nolibm.h | 23 +- lib/isnanl.c | 16 +- lib/itold.c | 16 +- lib/limits.in.h | 57 +- lib/localcharset.c | 289 +- lib/localcharset.h | 47 +- lib/math.c | 18 + lib/math.in.h | 454 +- lib/memchr.c | 26 +- lib/memchr.valgrind | 16 + lib/printf-args.c | 22 +- lib/printf-args.h | 30 +- lib/printf-frexp.c | 16 +- lib/printf-frexp.h | 16 +- lib/printf-frexpl.c | 16 +- lib/printf-frexpl.h | 16 +- lib/printf-parse.c | 53 +- lib/printf-parse.h | 18 +- lib/signbitd.c | 16 +- lib/signbitf.c | 16 +- lib/signbitl.c | 16 +- lib/size_max.h | 18 +- lib/snprintf.c | 18 +- lib/stdbool.in.h | 126 + lib/stddef.in.h | 75 +- lib/stdint.in.h | 102 +- lib/stdio-impl.h | 48 +- lib/stdio-read.c | 168 + lib/stdio-write.c | 206 + lib/stdio.in.h | 744 +- lib/stdlib.in.h | 1678 + lib/streq.h | 20 +- lib/string.in.h | 466 +- lib/sys_types.in.h | 18 +- lib/unictype/bitmap.h | 48 + lib/unistd.c | 22 + lib/unistd.in.h | 2393 ++ lib/unitypes.in.h | 37 +- lib/uniwidth.in.h | 18 +- lib/uniwidth/cjk.h | 18 +- lib/uniwidth/width.c | 455 +- lib/uniwidth/width0.h | 494 + lib/uniwidth/width2.h | 549 + lib/vasnprintf.c | 740 +- lib/vasnprintf.h | 41 +- lib/verify.h | 206 +- lib/vsnprintf.c | 18 +- lib/warn-on-use.h | 58 +- lib/wchar.in.h | 554 +- lib/wctype-h.c | 19 + lib/wctype.in.h | 415 +- lib/wcwidth.c | 18 +- lib/xsize.c | 18 + lib/xsize.h | 41 +- m4/groff.m4 | 1493 +- m4/lib-link.m4 | 2 +- m4/localcharset.m4 | 2 +- makevarescape.sed | 12 +- man/ditroff.7.man | 173 - man/groff.7.man | 9853 +++-- man/groff_char.7.man | 3019 +- man/groff_diff.7.man | 6798 ++- man/groff_font.5.man | 1269 +- man/groff_out.5.man | 1035 +- man/groff_tmac.5.man | 1591 +- man/man.am | 12 +- man/roff.7.man | 2973 +- mdate.pl | 2 +- src/devices/grodvi/dvi.cpp | 40 +- src/devices/grodvi/grodvi.1.man | 643 +- src/devices/grodvi/grodvi.am | 8 +- src/devices/grohtml/grohtml.1.man | 795 +- src/devices/grohtml/grohtml.am | 8 +- src/devices/grohtml/html-table.cpp | 2 +- src/devices/grohtml/html-table.h | 2 +- src/devices/grohtml/html-text.cpp | 7 +- src/devices/grohtml/html-text.h | 2 +- src/devices/grohtml/html.h | 4 +- src/devices/grohtml/output.cpp | 7 +- src/devices/grohtml/post-html.cpp | 1284 +- src/devices/grolbp/charset.h | 2 +- src/devices/grolbp/grolbp.1.man | 662 +- src/devices/grolbp/grolbp.am | 8 +- src/devices/grolbp/lbp.cpp | 84 +- src/devices/grolbp/lbp.h | 8 +- src/devices/grolj4/grolj4.1.man | 874 +- src/devices/grolj4/grolj4.am | 12 +- src/devices/grolj4/lj4.cpp | 27 +- src/devices/grolj4/lj4_font.5.man | 263 - src/devices/gropdf/TODO | 16 +- src/devices/gropdf/gropdf.1.man | 1223 +- src/devices/gropdf/gropdf.am | 10 +- src/devices/gropdf/gropdf.pl | 915 +- src/devices/gropdf/pdfmom.1.man | 157 +- src/devices/gropdf/pdfmom.pl | 14 +- src/devices/grops/grops.1.man | 1630 +- src/devices/grops/grops.am | 8 +- src/devices/grops/ps.cpp | 67 +- src/devices/grops/ps.h | 2 +- src/devices/grops/psrm.cpp | 87 +- src/devices/grotty/grotty.1.man | 904 +- src/devices/grotty/grotty.am | 13 +- .../tests/basic_latin_glyphs_map_correctly.sh | 205 + src/devices/grotty/tests/osc8_works.sh | 119 + src/devices/grotty/tty.cpp | 343 +- src/devices/xditview/ChangeLog | 14 +- src/devices/xditview/Dvi.c | 2 + src/devices/xditview/{FontMap => FontMap-X11} | 0 src/devices/xditview/GXditview.ad | 5 +- src/devices/xditview/font.c | 2 + src/devices/xditview/gxditview.1.man | 750 +- src/devices/xditview/lex.c | 2 + src/devices/xditview/page.c | 2 + src/devices/xditview/parse.c | 2 + src/devices/xditview/xditview.am | 71 +- src/devices/xditview/xditview.c | 54 +- src/include/DviChar.h | 2 +- src/include/assert.h | 38 - src/include/cmap.h | 2 +- src/include/color.h | 2 +- src/include/config.hin | 1108 +- src/include/cset.h | 2 +- src/include/curtime.h | 6 +- src/include/device.h | 2 +- src/include/driver.h | 10 +- src/include/errarg.h | 2 +- src/include/error.h | 70 +- src/include/font.h | 176 +- src/include/geometry.h | 2 +- src/include/getopt.h | 2 +- src/include/getopt_int.h | 2 +- src/include/gettext.h | 2 +- src/include/html-strings.h | 2 +- src/include/htmlhint.h | 2 +- src/include/include.am | 12 +- src/include/index.h | 2 +- src/include/itable.h | 31 +- src/include/lf.h | 2 +- src/include/lib.h | 107 +- src/include/localcharset.h | 2 +- src/include/macropath.h | 2 +- src/include/nonposix.h | 2 +- src/include/paper.h | 2 +- src/include/posix.h | 2 +- src/include/printer.h | 2 +- src/include/ptable.h | 31 +- src/include/refid.h | 2 +- src/include/relocate.h | 2 +- src/include/search.h | 11 +- src/include/searchpath.h | 2 +- src/include/stringclass.h | 5 +- src/include/symbol.h | 17 +- src/include/unicode.h | 2 +- src/libs/libbib/common.cpp | 2 +- src/libs/libbib/index.cpp | 160 +- src/libs/libbib/libbib.am | 12 +- src/libs/libbib/linear.cpp | 21 +- src/libs/libbib/map.c | 8 +- src/libs/libbib/search.cpp | 15 +- src/libs/libdriver/input.cpp | 64 +- src/libs/libdriver/libdriver.am | 12 +- src/libs/libdriver/printer.cpp | 90 +- src/libs/libgroff/assert.cpp | 15 +- src/libs/libgroff/change_lf.cpp | 3 +- src/libs/libgroff/cmap.cpp | 3 +- src/libs/libgroff/color.cpp | 45 +- src/libs/libgroff/config.charset | 2 +- src/libs/libgroff/cset.cpp | 3 +- src/libs/libgroff/curtime.cpp | 10 +- src/libs/libgroff/device.cpp | 8 +- src/libs/libgroff/errarg.cpp | 22 +- src/libs/libgroff/error.cpp | 114 +- src/libs/libgroff/fatal.cpp | 6 +- src/libs/libgroff/filename.cpp | 24 +- src/libs/libgroff/fmod.c | 4 +- src/libs/libgroff/font.cpp | 792 +- src/libs/libgroff/fontfile.cpp | 38 +- src/libs/libgroff/geometry.cpp | 2 +- src/libs/libgroff/getcwd.c | 3 +- src/libs/libgroff/getopt.c | 2 +- src/libs/libgroff/getopt1.c | 2 +- src/libs/libgroff/glyphuni.cpp | 4 +- src/libs/libgroff/htmlhint.cpp | 2 +- src/libs/libgroff/hypot.cpp | 2 +- src/libs/libgroff/iftoa.c | 18 +- src/libs/libgroff/invalid.cpp | 2 +- src/libs/libgroff/itoa.c | 19 +- src/libs/libgroff/lf.cpp | 6 +- src/libs/libgroff/libgroff.am | 68 +- src/libs/libgroff/lineno.cpp | 4 +- src/libs/libgroff/localcharset.c | 2 +- src/libs/libgroff/macropath.cpp | 2 +- src/libs/libgroff/make-uniuni | 2 +- src/libs/libgroff/matherr.c | 2 +- src/libs/libgroff/maxfilename.cpp | 23 +- src/libs/libgroff/maxpathname.cpp | 2 +- src/libs/libgroff/mksdir.cpp | 2 +- src/libs/libgroff/mkstemp.cpp | 2 +- src/libs/libgroff/nametoindex.cpp | 22 +- src/libs/libgroff/new.cpp | 29 +- src/libs/libgroff/paper.cpp | 2 +- src/libs/libgroff/prime.cpp | 25 +- src/libs/libgroff/progname.c | 2 +- src/libs/libgroff/ptable.cpp | 4 +- src/libs/libgroff/putenv.c | 2 +- src/libs/libgroff/quotearg.c | 4 +- src/libs/libgroff/ref-add.sin | 2 +- src/libs/libgroff/ref-del.sin | 2 +- src/libs/libgroff/relocatable.h | 2 +- src/libs/libgroff/relocate.cpp | 30 +- src/libs/libgroff/searchpath.cpp | 35 +- src/libs/libgroff/spawnvp.c | 2 +- src/libs/libgroff/strcasecmp.c | 2 +- src/libs/libgroff/strerror.c | 2 +- src/libs/libgroff/string.cpp | 38 +- src/libs/libgroff/strncasecmp.c | 2 +- src/libs/libgroff/strsave.cpp | 15 +- src/libs/libgroff/strtol.c | 2 +- src/libs/libgroff/symbol.cpp | 6 +- src/libs/libgroff/tmpfile.cpp | 20 +- src/libs/libgroff/tmpname.cpp | 6 +- src/libs/libgroff/unicode.cpp | 2 +- src/libs/libgroff/uniglyph.cpp | 2 +- src/libs/libgroff/uniuni.cpp | 2 +- src/libs/libxutil/DviChar.c | 8 +- src/libs/libxutil/XFontName.c | 4 +- src/libs/libxutil/libxutil.am | 12 +- src/libs/libxutil/xmalloc.c | 4 +- src/preproc/eqn/box.cpp | 21 +- src/preproc/eqn/box.h | 2 +- src/preproc/eqn/delim.cpp | 25 +- src/preproc/eqn/eqn.1.man | 2447 +- src/preproc/eqn/eqn.am | 37 +- src/preproc/eqn/eqn.cpp | 1721 +- src/preproc/eqn/eqn.h | 10 +- src/preproc/eqn/eqn.hpp | 150 +- src/preproc/eqn/eqn.ypp | 8 +- src/preproc/eqn/lex.cpp | 38 +- src/preproc/eqn/limit.cpp | 2 +- src/preproc/eqn/list.cpp | 2 +- src/preproc/eqn/main.cpp | 156 +- src/preproc/eqn/mark.cpp | 2 +- src/preproc/eqn/neqn.1.man | 54 +- src/preproc/eqn/neqn.sh | 2 +- src/preproc/eqn/other.cpp | 8 +- src/preproc/eqn/over.cpp | 2 +- src/preproc/eqn/pbox.h | 2 +- src/preproc/eqn/pile.cpp | 19 +- src/preproc/eqn/script.cpp | 11 +- src/preproc/eqn/special.cpp | 4 +- src/preproc/eqn/sqrt.cpp | 2 +- ...diagnostics-report-correct-line-numbers.sh | 55 + src/preproc/eqn/text.cpp | 8 +- src/preproc/grn/README | 4 +- src/preproc/grn/gprint.h | 10 +- src/preproc/grn/grn.1.man | 881 +- src/preproc/grn/grn.am | 12 +- src/preproc/grn/hdb.cpp | 180 +- src/preproc/grn/hgraph.cpp | 376 +- src/preproc/grn/hpoint.cpp | 22 +- src/preproc/grn/main.cpp | 436 +- src/preproc/html/html.am | 8 +- src/preproc/html/pre-html.cpp | 921 +- src/preproc/html/pre-html.h | 2 +- src/preproc/html/pushback.cpp | 11 +- src/preproc/html/pushback.h | 3 +- src/preproc/pic/common.cpp | 2 +- src/preproc/pic/common.h | 2 +- src/preproc/pic/lex.cpp | 12 +- src/preproc/pic/main.cpp | 48 +- src/preproc/pic/object.cpp | 22 +- src/preproc/pic/object.h | 2 +- src/preproc/pic/output.h | 2 +- src/preproc/pic/pic.1.man | 1219 +- src/preproc/pic/pic.am | 24 +- src/preproc/pic/pic.cpp | 3570 +- src/preproc/pic/pic.h | 10 +- src/preproc/pic/pic.hpp | 278 +- src/preproc/pic/pic.ypp | 132 +- src/preproc/pic/position.h | 2 +- src/preproc/pic/tex.cpp | 2 +- src/preproc/pic/text.h | 2 +- src/preproc/pic/troff.cpp | 24 +- src/preproc/preconv/preconv.1.man | 661 +- src/preproc/preconv/preconv.am | 21 +- src/preproc/preconv/preconv.cpp | 214 +- .../tests/do-not-seek-the-unseekable.sh | 59 + src/preproc/preconv/tests/smoke-test.sh | 88 + src/preproc/refer/command.cpp | 56 +- src/preproc/refer/command.h | 3 +- src/preproc/refer/label.cpp | 1229 +- src/preproc/refer/label.hpp | 40 +- src/preproc/refer/label.ypp | 12 +- src/preproc/refer/ref.cpp | 12 +- src/preproc/refer/ref.h | 2 +- src/preproc/refer/refer.1.man | 1279 +- src/preproc/refer/refer.am | 36 +- src/preproc/refer/refer.cpp | 170 +- src/preproc/refer/refer.h | 10 +- src/preproc/refer/tests/artifacts/62124.bib | 4 + .../tests/report-correct-line-numbers.sh | 136 + src/preproc/refer/token.cpp | 2 +- src/preproc/refer/token.h | 2 +- src/preproc/soelim/soelim.1.man | 427 +- src/preproc/soelim/soelim.am | 8 +- src/preproc/soelim/soelim.cpp | 19 +- src/preproc/tbl/main.cpp | 417 +- src/preproc/tbl/table.cpp | 729 +- src/preproc/tbl/table.h | 38 +- src/preproc/tbl/tbl.1.man | 2457 +- src/preproc/tbl/tbl.am | 34 +- .../tbl/tests/boxes-and-vertical-rules.sh | 174 + .../tbl/tests/check-horizontal-line-length.sh | 78 + .../tbl/tests/check-line-intersections.sh | 52 + .../tbl/tests/check-vertical-line-length.sh | 49 + .../tbl/tests/cooperate-with-nm-request.sh | 47 + .../tbl/tests/count-continued-input-lines.sh | 43 + .../do-not-overdraw-page-top-in-nroff-mode.sh | 225 + .../do-not-overlap-bottom-border-in-nroff.sh | 62 + ...not-segv-on-invalid-vertical-span-entry.sh | 41 + ...not-segv-when-backslash-R-in-text-block.sh | 75 + .../tbl/tests/expand-region-option-works.sh | 173 + .../tbl/tests/format-time-diagnostics-work.sh | 268 + ...save-and-restore-hyphenation-parameters.sh | 58 + .../save-and-restore-inter-sentence-space.sh | 79 + .../tests/save-and-restore-line-numbering.sh | 85 + .../tbl/tests/save-and-restore-tab-stops.sh | 84 + .../tests/warn-on-long-boxed-unkept-table.sh | 56 + .../tbl/tests/x-column-modifier-works.sh | 172 + src/roff/groff/groff.1.man | 2876 +- src/roff/groff/groff.am | 81 +- src/roff/groff/groff.cpp | 285 +- src/roff/groff/pipeline.c | 55 +- src/roff/groff/pipeline.h | 2 +- src/roff/groff/tests/ab_works.sh | 46 + src/roff/groff/tests/adjustment_works.sh | 92 + src/roff/groff/tests/artifacts/HONEYPOT | 15 + .../groff/tests/artifacts/devascii/README | 1 + .../break_zero-length_output_line_sanely.sh | 43 + ...ice_control_escapes_express_basic_latin.sh | 60 + ...o_not_loop_infinitely_when_breaking_cjk.sh | 29 + src/roff/groff/tests/dot-cp_register_works.sh | 48 + src/roff/groff/tests/dot-nm_register_works.sh | 40 + src/roff/groff/tests/dot-nn_register_works.sh | 77 + .../evc_produces_no_output_if_invalid.sh | 25 + .../fp_should_not_traverse_directories.sh | 63 + .../tests/handle_special_input_code_points.sh | 47 + .../tests/html_works_with_grn_and_eqn.sh | 46 + .../groff/tests/initialization_is_quiet.sh | 59 + src/roff/groff/tests/localization_works.sh | 61 + src/roff/groff/tests/msoquiet_works.sh | 35 + .../tests/on_latin1_device_oq_is_0x27.sh | 30 + .../output_driver_C_and_G_options_work.sh | 50 + .../groff/tests/recognize_end_of_sentence.sh | 33 + .../groff/tests/regression_savannah_56555.sh | 27 + .../groff/tests/regression_savannah_58153.sh | 34 + .../groff/tests/regression_savannah_58162.sh | 26 + .../groff/tests/regression_savannah_58337.sh | 32 + .../groff/tests/regression_savannah_59202.sh | 29 + .../groff/tests/smoke-test_html_device.sh | 90 + .../some_escapes_accept_newline_delimiters.sh | 128 + src/roff/groff/tests/soquiet_works.sh | 34 + .../groff/tests/string_case_xform_errors.sh | 30 + .../groff/tests/string_case_xform_requests.sh | 32 + .../tests/string_case_xform_unicode_escape.sh | 42 + src/roff/groff/tests/substring_works.sh | 120 + ...point_size_escape_with_single_digit_arg.sh | 44 + src/roff/grog/grog.1.man | 471 - src/roff/grog/grog.am | 62 - src/roff/grog/grog.pl | 102 - src/roff/grog/subs.pl | 1266 - src/roff/nroff/nroff.1.man | 303 +- src/roff/nroff/nroff.am | 21 +- src/roff/nroff/nroff.sh | 228 +- src/roff/nroff/tests/verbose_option_works.sh | 68 + src/roff/troff/TODO | 9 +- src/roff/troff/charinfo.h | 2 +- src/roff/troff/column.cpp | 24 +- src/roff/troff/dictionary.cpp | 4 +- src/roff/troff/dictionary.h | 2 +- src/roff/troff/div.cpp | 166 +- src/roff/troff/div.h | 15 +- src/roff/troff/env.cpp | 466 +- src/roff/troff/env.h | 17 +- src/roff/troff/hvunits.h | 6 +- src/roff/troff/input.cpp | 1424 +- src/roff/troff/input.h | 18 +- src/roff/troff/mtsm.cpp | 23 +- src/roff/troff/mtsm.h | 4 +- src/roff/troff/node.cpp | 572 +- src/roff/troff/node.h | 9 +- src/roff/troff/number.cpp | 226 +- src/roff/troff/reg.cpp | 88 +- src/roff/troff/reg.h | 14 +- src/roff/troff/request.h | 15 +- src/roff/troff/token.h | 115 +- src/roff/troff/troff.1.man | 1033 +- src/roff/troff/troff.am | 30 +- src/roff/troff/troff.h | 16 +- src/utils/addftinfo/addftinfo.1.man | 229 +- src/utils/addftinfo/addftinfo.am | 12 +- src/utils/addftinfo/addftinfo.cpp | 66 +- src/utils/addftinfo/guess.cpp | 2 +- src/utils/addftinfo/guess.h | 2 +- src/utils/afmtodit/afmtodit.1.man | 517 +- src/utils/afmtodit/afmtodit.am | 14 +- src/utils/afmtodit/afmtodit.pl | 123 +- src/utils/afmtodit/afmtodit.tables | 50 +- src/utils/afmtodit/make-afmtodit-tables | 79 +- src/utils/grog/grog.1.man | 628 + src/utils/grog/grog.am | 50 + src/utils/grog/grog.pl | 721 + .../tests/PF-does-not-start-pic-region.sh | 33 + src/utils/grog/tests/avoid-refer-fakeout.sh | 34 + src/utils/grog/tests/foo.man | 146 + .../grog/tests/preserve-groff-options.sh | 30 + src/utils/grog/tests/recognize-perl-pod.sh | 31 + src/utils/grog/tests/smoke-test.sh | 153 + src/utils/hpftodit/hpftodit.1.man | 386 +- src/utils/hpftodit/hpftodit.am | 12 +- src/utils/hpftodit/hpftodit.cpp | 54 +- src/utils/hpftodit/hpuni.cpp | 2 +- src/utils/indxbib/indxbib.1.man | 313 +- src/utils/indxbib/indxbib.am | 8 +- src/utils/indxbib/indxbib.cpp | 45 +- src/utils/indxbib/signal.c | 7 +- src/utils/lkbib/lkbib.1.man | 144 +- src/utils/lkbib/lkbib.am | 8 +- src/utils/lkbib/lkbib.cpp | 22 +- src/utils/lookbib/lookbib.1.man | 119 +- src/utils/lookbib/lookbib.am | 8 +- src/utils/lookbib/lookbib.cpp | 19 +- src/utils/pfbtops/pfbtops.1.man | 97 +- src/utils/pfbtops/pfbtops.am | 8 +- src/utils/pfbtops/pfbtops.c | 39 +- src/utils/tfmtodit/tfmtodit.1.man | 424 +- src/utils/tfmtodit/tfmtodit.am | 8 +- src/utils/tfmtodit/tfmtodit.cpp | 96 +- src/utils/xtotroff/xtotroff.1.man | 182 +- src/utils/xtotroff/xtotroff.am | 19 +- src/utils/xtotroff/xtotroff.c | 160 +- test-groff.in | 8 +- tmac/62bit.tmac | 10 +- tmac/LOCALIZATION | 102 +- tmac/X.tmac | 20 +- tmac/Xps.tmac | 18 +- tmac/a4.tmac | 28 - tmac/an-ext.tmac | 198 +- tmac/an-old.tmac | 708 - tmac/an.tmac | 1571 +- tmac/andoc.tmac | 58 +- tmac/composite.tmac | 4 - tmac/cp1047.tmac | 13 +- tmac/cs.tmac | 67 +- tmac/de.tmac | 64 +- tmac/den.tmac | 10 +- tmac/devtag.tmac | 48 +- tmac/{doc-old.tmac-u => doc-old.tmac} | 8 +- tmac/{doc.tmac-u => doc.tmac} | 1235 +- tmac/dvi.tmac | 27 +- tmac/{e.tmac-u => e.tmac} | 622 +- tmac/ec.tmac | 35 +- tmac/en.tmac | 77 + tmac/eqnrc | 4 +- tmac/europs.tmac | 6 +- tmac/fallbacks.tmac | 163 +- tmac/fr.tmac | 88 +- tmac/groff_man.7.man | 2613 -- tmac/groff_man.7.man.in | 4287 ++ tmac/groff_mdoc.7.man | 3654 +- tmac/groff_me.7.man | 884 +- tmac/groff_ms.7.man | 3536 +- tmac/groff_trace.7.man | 406 +- tmac/groff_www.7.man | 323 +- tmac/html-end.tmac | 10 +- tmac/html.tmac | 22 +- tmac/hyphen.cs | 4 - tmac/hyphen.den | 4 - tmac/hyphen.det | 4 - tmac/{hyphen.us => hyphen.en} | 568 +- tmac/hyphen.fr | 10 +- tmac/hyphen.it | 431 + tmac/hyphen.sv | 4 - tmac/hyphenex.cs | 4 - tmac/hyphenex.en | 115 + tmac/hyphenex.pl | 86 +- tmac/hyphenex.us | 1454 - tmac/it.tmac | 194 + tmac/ja.tmac | 14 +- tmac/latin1.tmac | 19 +- tmac/latin2.tmac | 147 +- tmac/latin5.tmac | 39 +- tmac/latin9.tmac | 43 +- tmac/lbp.tmac | 13 +- tmac/lj4.tmac | 13 +- tmac/man.local | 33 +- tmac/man.tmac | 2 +- tmac/mdoc.local | 17 +- tmac/{doc-common-u => mdoc/doc-common} | 735 +- tmac/{doc-ditroff-u => mdoc/doc-ditroff} | 164 +- tmac/{doc-nroff-u => mdoc/doc-nroff} | 106 +- tmac/{doc-syms-u => mdoc/doc-syms} | 361 +- tmac/papersize.tmac | 48 +- tmac/pdf.tmac | 38 +- tmac/pdfpic.tmac | 277 +- tmac/pic.tmac | 16 +- tmac/ps.tmac | 43 +- tmac/psatk.tmac | 13 + tmac/psfig.tmac | 13 + tmac/psold.tmac | 11 +- tmac/pspic.tmac | 30 +- tmac/ptx.tmac | 8 +- tmac/refer-me.tmac | 11 +- tmac/refer-ms.tmac | 13 +- tmac/refer.tmac | 22 +- tmac/s.tmac | 601 +- tmac/safer.tmac | 7 - tmac/strip.sed | 13 - tmac/sv.tmac | 65 +- tmac/tests/an-ext_MR-works.sh | 61 + tmac/tests/an-ext_MT-works.sh | 55 + tmac/tests/an-ext_UR-works.sh | 56 + .../an_AT-and-UC-footer-saved-and-restored.sh | 106 + tmac/tests/an_CS-register-off.sh | 27 + tmac/tests/an_CS-register-on.sh | 27 + tmac/tests/an_CS-register-unspecified.sh | 27 + tmac/tests/an_CT-register-off.sh | 27 + tmac/tests/an_CT-register-on.sh | 27 + tmac/tests/an_CT-register-unspecified.sh | 27 + ...an_FT-bad-value-should-not-trash-titles.sh | 93 + tmac/tests/an_HY-register-works.sh | 78 + tmac/tests/an_LL-init-sanely.sh | 48 + tmac/tests/an_ME-punct-hyphenates.sh | 55 + tmac/tests/an_MR-works.sh | 75 + tmac/tests/an_MT-body-hyphenates.sh | 37 + tmac/tests/an_MT-works.sh | 86 + tmac/tests/an_P-register-works.sh | 51 + tmac/tests/an_TH-repairs-ad-damage.sh | 41 + tmac/tests/an_TH-repairs-hy-damage.sh | 41 + tmac/tests/an_TS-adds-no-vertical-space.sh | 47 + .../an_TS-do-not-keep-tables-when-cR-set.sh | 51 + tmac/tests/an_UE-breaks-before-long-URIs.sh | 68 + tmac/tests/an_UE-punct-hyphenates.sh | 53 + tmac/tests/an_UR-body-hyphenates.sh | 37 + tmac/tests/an_UR-works.sh | 86 + tmac/tests/an_X-register-works.sh | 62 + tmac/tests/an_adjust-link-text-correctly.sh | 40 + .../an_avoid-two-font-denial-of-service.sh | 36 + ...ot-abbreviate-escape-using-TH-arguments.sh | 51 + ...n_font-remapping-does-not-affect-titles.sh | 60 + .../an_handle-degenerate-input-quietly.sh | 29 + .../an_inner-footer-abbreviation-works.sh | 70 + .../an_link-macros-work-in-paragraph-tags.sh | 88 + .../an_link-trailing-text-hugs-previous.sh | 52 + .../an_no-break-after-short-paragraph-tags.sh | 43 + ...tput-footer-when-continuously-rendering.sh | 41 + tmac/tests/an_page-footers-present.sh | 68 + tmac/tests/an_page-header-has-current-data.sh | 70 + tmac/tests/an_reset-hyphenation-correctly.sh | 63 + tmac/tests/an_title-abbreviation-works.sh | 61 + tmac/tests/an_use-input-traps-correctly.sh | 113 + tmac/tests/an_works-with-ec.sh | 40 + tmac/tests/andoc_P-register-works.sh | 117 + .../tests/andoc_check-an-to-doc-transition.sh | 68 + tmac/tests/andoc_clear-doc-traps.sh | 47 + tmac/tests/andoc_flush-between-packages.sh | 77 + tmac/tests/doc_CS-works.sh | 42 + tmac/tests/doc_CT-works.sh | 42 + .../doc_D-places-page-numbers-correctly.sh | 45 + ..._Lk-respect-sentence-ending-punctuation.sh | 40 + tmac/tests/doc_Mt-works.sh | 48 + tmac/tests/doc_Nm-works.sh | 74 + tmac/tests/doc_P-register-works.sh | 54 + tmac/tests/doc_X-register-works.sh | 70 + .../doc_accept-mixed-case-section-headings.sh | 76 + ...loop-infinitely-when-shortening-headers.sh | 37 + .../tests/doc_heading-font-remapping-works.sh | 58 + tmac/tests/doc_indents-correctly.sh | 89 + ...tput-footer-when-continuously-rendering.sh | 43 + tmac/tests/doc_smoke-test.sh | 66 + tmac/tests/e_chapter-titles-work.sh | 68 + tmac/tests/e_columns-work-on-long-pages.sh | 38 + tmac/tests/e_delayed-text-marks-work.sh | 55 + tmac/tests/e_footnote-marks-work.sh | 74 + tmac/tests/e_footnotes-work-with-columns.sh | 43 + tmac/tests/e_ld-works.sh | 131 + tmac/tests/e_line-numbering-works.sh | 141 + .../tests/e_rejects-too-short-page-lengths.sh | 61 + tmac/tests/ec_works.sh | 45 + tmac/tests/latin2_works.sh | 76 + tmac/tests/latin5_works.sh | 30 + tmac/tests/latin9_works.sh | 30 + tmac/tests/localization-works.sh | 189 + ...ic_does-not-choke-on-bad-pdfinfo-output.sh | 83 + tmac/tests/pdfpic_falls-back-to-PSPIC.sh | 77 + .../s_IP-indents-using-paragraph-type-size.sh | 50 + ...P-respects-inter-sentence-space-in-tags.sh | 40 + tmac/tests/s_PN-works.sh | 37 + tmac/tests/s_R-handles-its-arguments.sh | 41 + .../s_SH-resets-IP-indentation-amount.sh | 40 + ..._TC-works-with-percent-in-custom-titles.sh | 52 + ...A-literal-no-argument-suppresses-leader.sh | 59 + tmac/tests/s_honor-MINGW-when-two-columns.sh | 37 + tmac/tests/s_mark-column-start-correctly.sh | 38 + .../s_no-excess-space-around-displays.sh | 39 + .../tests/s_rejects-too-short-page-lengths.sh | 61 + tmac/tmac.am | 219 +- tmac/trace.tmac | 11 +- tmac/trans.tmac | 72 +- tmac/troffrc | 50 +- tmac/troffrc-end | 52 +- tmac/tty-char.tmac | 31 +- tmac/tty.tmac | 26 +- tmac/unicode.tmac | 8 - tmac/www.tmac.in | 45 +- tmac/zh.tmac | 16 +- 1334 files changed, 278239 insertions(+), 105338 deletions(-) create mode 100644 ChangeLog.122 create mode 100644 HACKING delete mode 100644 arch/mingw/groffer.cmd delete mode 100755 build-aux/prefix-gnulib-mk delete mode 100755 contrib/gdiffmk/tests/gdiffmk_tests.sh delete mode 100644 contrib/glilypond/args.pl delete mode 100644 contrib/glilypond/oop_fh.pl delete mode 100644 contrib/glilypond/subs.pl delete mode 100755 contrib/gpinyin/subs.pl delete mode 100644 contrib/groff_filenames/ChangeLog delete mode 100644 contrib/groff_filenames/groff_filenames.5.man delete mode 100644 contrib/groff_filenames/groff_filenames.am delete mode 100644 contrib/groffer/ChangeLog delete mode 100644 contrib/groffer/README delete mode 100644 contrib/groffer/README_PERL delete mode 100644 contrib/groffer/groffer.1.man delete mode 100644 contrib/groffer/groffer.am delete mode 100755 contrib/groffer/groffer.pl delete mode 100644 contrib/groffer/main_subs.pl delete mode 100644 contrib/groffer/man.pl delete mode 100644 contrib/groffer/roff2.1.man delete mode 100755 contrib/groffer/roff2.pl delete mode 100644 contrib/groffer/split_env.sh delete mode 100644 contrib/groffer/subs.pl delete mode 100644 contrib/groffer/version.sh rename contrib/hdtbl/{hdmisc.tmac-u => hdmisc.tmac} (97%) rename contrib/hdtbl/{hdtbl.tmac-u => hdtbl.tmac} (99%) create mode 100755 contrib/mm/tests/LT_SP_AU_without_AT_works.sh create mode 100755 contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh create mode 100755 contrib/mm/tests/MT-1-reports-all-TM-numbers.sh create mode 100755 contrib/mm/tests/MT_5_includes_AT_in_SG.sh create mode 100755 contrib/mm/tests/P-indentation-works.sh create mode 100644 contrib/mm/tests/artifacts/60657.ref create mode 100755 contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh create mode 100755 contrib/mm/tests/mse_has-sufficient-footnote-space.sh create mode 100755 contrib/mm/tests/place-equation-labels-correctly-in-displays.sh create mode 100755 contrib/mm/tests/remove-stale-bib-entry-data.sh create mode 100755 contrib/mm/tests/short-pages-do-not-overflow-stack.sh create mode 100644 contrib/mom/examples/copyright-chapter.mom create mode 100644 contrib/mom/examples/copyright-default.mom create mode 100644 contrib/pdfmark/sanitize.tmac create mode 100644 contrib/rfc1345/COPYRIGHT create mode 100644 contrib/rfc1345/groff_rfc1345.7.man create mode 100644 contrib/rfc1345/rfc1345.am create mode 100644 contrib/rfc1345/rfc1345.tmac create mode 100755 contrib/rfc1345/tests/rfc1345-smoke-test.sh create mode 100644 contrib/sboxes/ChangeLog create mode 100644 contrib/sboxes/msboxes.ms.in create mode 100644 contrib/sboxes/notquine.sed create mode 100644 contrib/sboxes/sboxes.am create mode 100644 contrib/sboxes/sboxes.tmac delete mode 100644 doc/fixinfo.sh create mode 100644 doc/groff.dvi create mode 100644 doc/groff.html create mode 100644 doc/groff.html.node/Adjustment.html create mode 100644 doc/groff.html.node/Argument-Units.html create mode 100644 doc/groff.html.node/Artificial-Fonts.html create mode 100644 doc/groff.html.node/Assigning-Register-Formats.html create mode 100644 doc/groff.html.node/Auto_002dincrement.html create mode 100644 doc/groff.html.node/Background.html create mode 100644 doc/groff.html.node/Basics.html create mode 100644 doc/groff.html.node/Blank-Line-Traps.html create mode 100644 doc/groff.html.node/Breaking.html create mode 100644 doc/groff.html.node/Built_002din-Registers.html create mode 100644 doc/groff.html.node/Calling-Macros.html create mode 100644 doc/groff.html.node/Changing-the-Type-Size.html create mode 100644 doc/groff.html.node/Changing-the-Vertical-Spacing.html create mode 100644 doc/groff.html.node/Character-Classes.html create mode 100644 doc/groff.html.node/Character-Translations.html create mode 100644 doc/groff.html.node/Colors.html create mode 100644 doc/groff.html.node/Columnation.html create mode 100644 doc/groff.html.node/Command-Reference.html create mode 100644 doc/groff.html.node/Comment-Command.html create mode 100644 doc/groff.html.node/Comments.html create mode 100644 doc/groff.html.node/Common-Features.html create mode 100644 doc/groff.html.node/Compatibility-Mode.html create mode 100644 doc/groff.html.node/Concept-Index.html create mode 100644 doc/groff.html.node/Conditional-Blocks.html create mode 100644 doc/groff.html.node/Conditionals-and-Loops.html create mode 100644 doc/groff.html.node/Configuration-and-Customization.html create mode 100644 doc/groff.html.node/Control-Characters.html create mode 100644 doc/groff.html.node/Conventions-Used-in-This-Manual.html create mode 100644 doc/groff.html.node/Copy-Mode.html create mode 100644 doc/groff.html.node/Copying-This-Manual.html create mode 100644 doc/groff.html.node/Credits.html create mode 100644 doc/groff.html.node/DESC-File-Format.html create mode 100644 doc/groff.html.node/Debugging.html create mode 100644 doc/groff.html.node/Default-Units.html create mode 100644 doc/groff.html.node/Deferring-Output.html create mode 100644 doc/groff.html.node/Delimiters.html create mode 100644 doc/groff.html.node/Device-Control-Commands.html create mode 100644 doc/groff.html.node/Device-and-Font-Description-Files.html create mode 100644 doc/groff.html.node/Differences-from-AT_0026T-ms.html create mode 100644 doc/groff.html.node/Displays-and-Keeps.html create mode 100644 doc/groff.html.node/Diversion-Traps.html create mode 100644 doc/groff.html.node/Diversions.html create mode 100644 doc/groff.html.node/Document-Formats.html create mode 100644 doc/groff.html.node/Document-Parts.html create mode 100644 doc/groff.html.node/Drawing-Geometric-Objects.html create mode 100644 doc/groff.html.node/Dummy-Characters.html create mode 100644 doc/groff.html.node/End_002dof_002dinput-Traps.html create mode 100644 doc/groff.html.node/Environment.html create mode 100644 doc/groff.html.node/Environments.html create mode 100644 doc/groff.html.node/Escape-Sequence-Index.html create mode 100644 doc/groff.html.node/Fields.html create mode 100644 doc/groff.html.node/File-Formats.html create mode 100644 doc/groff.html.node/File-Keyword-Index.html create mode 100644 doc/groff.html.node/Filling.html create mode 100644 doc/groff.html.node/Font-Description-File-Format.html create mode 100644 doc/groff.html.node/Font-Directories.html create mode 100644 doc/groff.html.node/Font-Families.html create mode 100644 doc/groff.html.node/Font-Positions.html create mode 100644 doc/groff.html.node/Font-and-Size-Changes.html create mode 100644 doc/groff.html.node/Footnotes-and-Endnotes.html create mode 100644 doc/groff.html.node/Formatter-Instructions.html create mode 100644 doc/groff.html.node/GNU-troff-Reference.html create mode 100644 doc/groff.html.node/Graphics-Commands.html create mode 100644 doc/groff.html.node/Groff-Options.html create mode 100644 doc/groff.html.node/Gtroff-Internals.html create mode 100644 doc/groff.html.node/Headers-and-Footers.html create mode 100644 doc/groff.html.node/Headings-in-ms.html create mode 100644 doc/groff.html.node/Hyphenation.html create mode 100644 doc/groff.html.node/I_002fO.html create mode 100644 doc/groff.html.node/Identifiers.html create mode 100644 doc/groff.html.node/Implementation-Differences.html create mode 100644 doc/groff.html.node/Indented-regions-in-ms.html create mode 100644 doc/groff.html.node/Indexing.html create mode 100644 doc/groff.html.node/Input-Conventions.html create mode 100644 doc/groff.html.node/Input-Encodings.html create mode 100644 doc/groff.html.node/Input-Line-Traps.html create mode 100644 doc/groff.html.node/Installation.html create mode 100644 doc/groff.html.node/Intermediate-Output-Examples.html create mode 100644 doc/groff.html.node/Interpolating-Registers.html create mode 100644 doc/groff.html.node/Introduction.html create mode 100644 doc/groff.html.node/Invocation-Examples.html create mode 100644 doc/groff.html.node/Invoking-Requests.html create mode 100644 doc/groff.html.node/Invoking-groff.html create mode 100644 doc/groff.html.node/Italic-Corrections.html create mode 100644 doc/groff.html.node/Language-Concepts.html create mode 100644 doc/groff.html.node/Leaders.html create mode 100644 doc/groff.html.node/Leading-Space-Traps.html create mode 100644 doc/groff.html.node/Ligatures-and-Kerning.html create mode 100644 doc/groff.html.node/Line-Continuation.html create mode 100644 doc/groff.html.node/Line-Layout.html create mode 100644 doc/groff.html.node/Lists-in-ms.html create mode 100644 doc/groff.html.node/Macro-Directories.html create mode 100644 doc/groff.html.node/Macro-Index.html create mode 100644 doc/groff.html.node/Macro-Package-Intro.html create mode 100644 doc/groff.html.node/Macro-Packages.html create mode 100644 doc/groff.html.node/Major-Macro-Packages.html create mode 100644 doc/groff.html.node/Manipulating-Filling-and-Adjustment.html create mode 100644 doc/groff.html.node/Manipulating-Hyphenation.html create mode 100644 doc/groff.html.node/Manipulating-Spacing.html create mode 100644 doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html create mode 100644 doc/groff.html.node/Measurements.html create mode 100644 doc/groff.html.node/Miscellaneous.html create mode 100644 doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html create mode 100644 doc/groff.html.node/Motion-Quanta.html create mode 100644 doc/groff.html.node/Numeric-Expressions.html create mode 100644 doc/groff.html.node/Obsolete-Command.html create mode 100644 doc/groff.html.node/Operator-Index.html create mode 100644 doc/groff.html.node/Operators-in-Conditionals.html create mode 100644 doc/groff.html.node/Optional-man-extensions.html create mode 100644 doc/groff.html.node/Other-Differences.html create mode 100644 doc/groff.html.node/Output-Device-Intro.html create mode 100644 doc/groff.html.node/Output-Language-Compatibility.html create mode 100644 doc/groff.html.node/Page-Control.html create mode 100644 doc/groff.html.node/Page-Geometry.html create mode 100644 doc/groff.html.node/Page-Layout-Adjustment.html create mode 100644 doc/groff.html.node/Page-Layout.html create mode 100644 doc/groff.html.node/Page-Location-Traps.html create mode 100644 doc/groff.html.node/Page-Motions.html create mode 100644 doc/groff.html.node/Paper-Format.html create mode 100644 doc/groff.html.node/Paragraphs-in-ms.html create mode 100644 doc/groff.html.node/Paragraphs.html create mode 100644 doc/groff.html.node/Parameters.html create mode 100644 doc/groff.html.node/Postprocessor-Access.html create mode 100644 doc/groff.html.node/Predefined-Text.html create mode 100644 doc/groff.html.node/Preprocessor-Intro.html create mode 100644 doc/groff.html.node/Preprocessor-Support.html create mode 100644 doc/groff.html.node/Program-and-File-Index.html create mode 100644 doc/groff.html.node/Punning-Names.html create mode 100644 doc/groff.html.node/Register-Index.html create mode 100644 doc/groff.html.node/Registers.html create mode 100644 doc/groff.html.node/Request-Index.html create mode 100644 doc/groff.html.node/Requests-and-Macros.html create mode 100644 doc/groff.html.node/Safer-Mode.html create mode 100644 doc/groff.html.node/Sections-and-Chapters.html create mode 100644 doc/groff.html.node/Selecting-Fonts.html create mode 100644 doc/groff.html.node/Sentences.html create mode 100644 doc/groff.html.node/Separation.html create mode 100644 doc/groff.html.node/Setting-Registers.html create mode 100644 doc/groff.html.node/Simple-Commands.html create mode 100644 doc/groff.html.node/Special-Fonts.html create mode 100644 doc/groff.html.node/String-Index.html create mode 100644 doc/groff.html.node/Strings.html create mode 100644 doc/groff.html.node/Suppressing-Output.html create mode 100644 doc/groff.html.node/Tab-Stops-in-ms.html create mode 100644 doc/groff.html.node/Table-of-Contents.html create mode 100644 doc/groff.html.node/Tabs-and-Fields.html create mode 100644 doc/groff.html.node/Tabs-and-Leaders.html create mode 100644 doc/groff.html.node/Text-settings-in-ms.html create mode 100644 doc/groff.html.node/Text.html create mode 100644 doc/groff.html.node/The-Implicit-Page-Trap.html create mode 100644 doc/groff.html.node/Traps.html create mode 100644 doc/groff.html.node/Tutorial-for-Macro-Users.html create mode 100644 doc/groff.html.node/Typeface-and-decoration.html create mode 100644 doc/groff.html.node/Typographical-symbols-in-ms.html create mode 100644 doc/groff.html.node/Using-Escape-Sequences.html create mode 100644 doc/groff.html.node/Using-Fonts.html create mode 100644 doc/groff.html.node/Using-Fractional-Type-Sizes.html create mode 100644 doc/groff.html.node/Using-Symbols.html create mode 100644 doc/groff.html.node/Vertical-Position-Traps.html create mode 100644 doc/groff.html.node/Warnings.html create mode 100644 doc/groff.html.node/What-Is-groff_003f.html create mode 100644 doc/groff.html.node/Writing-Macros.html create mode 100644 doc/groff.html.node/als.html create mode 100644 doc/groff.html.node/groff-Capabilities.html create mode 100644 doc/groff.html.node/groff.html_fot.html create mode 100644 doc/groff.html.node/gtroff-Output.html create mode 100644 doc/groff.html.node/if_002delse.html create mode 100644 doc/groff.html.node/if_002dthen.html create mode 100644 doc/groff.html.node/index.html create mode 100644 doc/groff.html.node/man.html create mode 100644 doc/groff.html.node/mdoc.html create mode 100644 doc/groff.html.node/me.html create mode 100644 doc/groff.html.node/mm.html create mode 100644 doc/groff.html.node/mom.html create mode 100644 doc/groff.html.node/ms-Body-Text.html create mode 100644 doc/groff.html.node/ms-Document-Control-Settings.html create mode 100644 doc/groff.html.node/ms-Document-Description-Macros.html create mode 100644 doc/groff.html.node/ms-Document-Structure.html create mode 100644 doc/groff.html.node/ms-Footnotes.html create mode 100644 doc/groff.html.node/ms-Headers-and-Footers.html create mode 100644 doc/groff.html.node/ms-Insertions.html create mode 100644 doc/groff.html.node/ms-Introduction.html create mode 100644 doc/groff.html.node/ms-Legacy-Features.html create mode 100644 doc/groff.html.node/ms-Margins.html create mode 100644 doc/groff.html.node/ms-Multiple-Columns.html create mode 100644 doc/groff.html.node/ms-Naming-Conventions.html create mode 100644 doc/groff.html.node/ms-Page-Layout.html create mode 100644 doc/groff.html.node/ms-TOC.html create mode 100644 doc/groff.html.node/ms-basic-information.html create mode 100644 doc/groff.html.node/ms-keeps-and-displays.html create mode 100644 doc/groff.html.node/ms-language-and-localization.html create mode 100644 doc/groff.html.node/ms.html create mode 100644 doc/groff.html.node/troff-and-nroff-Modes.html create mode 100644 doc/groff.html.node/while.html create mode 100644 doc/groff.info create mode 100644 doc/groff.info-1 create mode 100644 doc/groff.info-2 create mode 100644 doc/groff.info-3 create mode 100644 doc/groff.pdf create mode 100644 doc/groff.txt create mode 100644 doc/me-revisions rename doc/{meintro.me => meintro.me.in} (91%) rename doc/{meintro_fr.me => meintro_fr.me.in} (81%) delete mode 100644 doc/meref.me create mode 100644 doc/meref.me.in create mode 100644 doc/ms.ms create mode 100755 font/devpdf/tests/check-default-foundry.sh.in create mode 100755 font/devpdf/tests/check-urw-foundry.sh.in rename font/devps/{freeeuro.pfa => freeeuro.ps} (100%) rename font/devps/generate/{dingbats.rmap => dingbats-reversed.map} (100%) rename font/devps/generate/{lgreekmap => slanted-symbol.map} (100%) rename font/devps/{symbolmap => generate/symbol.map} (99%) delete mode 100644 font/devps/generate/symbolsl.afm rename font/devps/generate/{textmap => text.map} (100%) create mode 100644 font/devps/symbolsl.afm delete mode 100644 gnulib_m4/asm-underscore.m4 create mode 100644 gnulib_m4/assert_h.m4 create mode 100644 gnulib_m4/free.m4 delete mode 100644 gnulib_m4/host-cpu-c-abi.m4 create mode 100644 gnulib_m4/inttypes.m4 delete mode 100644 gnulib_m4/longlong.m4 delete mode 100644 gnulib_m4/non-recursive-gnulib-prefix-hack.m4 create mode 100644 gnulib_m4/stdbool.m4 create mode 100644 gnulib_m4/stdlib_h.m4 create mode 100644 gnulib_m4/unistd_h.m4 create mode 100644 gnulib_m4/zzgnulib.m4 create mode 100644 lib/_Noreturn.h create mode 100644 lib/assert.in.h create mode 100644 lib/attribute.h create mode 100644 lib/free.c create mode 100644 lib/inttypes.in.h create mode 100644 lib/stdbool.in.h create mode 100644 lib/stdio-read.c create mode 100644 lib/stdio-write.c create mode 100644 lib/stdlib.in.h create mode 100644 lib/unictype/bitmap.h create mode 100644 lib/unistd.c create mode 100644 lib/unistd.in.h create mode 100644 lib/uniwidth/width0.h create mode 100644 lib/uniwidth/width2.h delete mode 100644 man/ditroff.7.man delete mode 100644 src/devices/grolj4/lj4_font.5.man create mode 100755 src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh create mode 100755 src/devices/grotty/tests/osc8_works.sh rename src/devices/xditview/{FontMap => FontMap-X11} (100%) delete mode 100644 src/include/assert.h create mode 100755 src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh create mode 100755 src/preproc/preconv/tests/do-not-seek-the-unseekable.sh create mode 100755 src/preproc/preconv/tests/smoke-test.sh create mode 100644 src/preproc/refer/tests/artifacts/62124.bib create mode 100755 src/preproc/refer/tests/report-correct-line-numbers.sh create mode 100755 src/preproc/tbl/tests/boxes-and-vertical-rules.sh create mode 100755 src/preproc/tbl/tests/check-horizontal-line-length.sh create mode 100755 src/preproc/tbl/tests/check-line-intersections.sh create mode 100755 src/preproc/tbl/tests/check-vertical-line-length.sh create mode 100755 src/preproc/tbl/tests/cooperate-with-nm-request.sh create mode 100755 src/preproc/tbl/tests/count-continued-input-lines.sh create mode 100755 src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh create mode 100755 src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh create mode 100755 src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh create mode 100755 src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh create mode 100755 src/preproc/tbl/tests/expand-region-option-works.sh create mode 100755 src/preproc/tbl/tests/format-time-diagnostics-work.sh create mode 100755 src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh create mode 100755 src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh create mode 100755 src/preproc/tbl/tests/save-and-restore-line-numbering.sh create mode 100755 src/preproc/tbl/tests/save-and-restore-tab-stops.sh create mode 100755 src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh create mode 100755 src/preproc/tbl/tests/x-column-modifier-works.sh create mode 100755 src/roff/groff/tests/ab_works.sh create mode 100755 src/roff/groff/tests/adjustment_works.sh create mode 100644 src/roff/groff/tests/artifacts/HONEYPOT create mode 100644 src/roff/groff/tests/artifacts/devascii/README create mode 100755 src/roff/groff/tests/break_zero-length_output_line_sanely.sh create mode 100755 src/roff/groff/tests/device_control_escapes_express_basic_latin.sh create mode 100755 src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh create mode 100755 src/roff/groff/tests/dot-cp_register_works.sh create mode 100755 src/roff/groff/tests/dot-nm_register_works.sh create mode 100755 src/roff/groff/tests/dot-nn_register_works.sh create mode 100755 src/roff/groff/tests/evc_produces_no_output_if_invalid.sh create mode 100755 src/roff/groff/tests/fp_should_not_traverse_directories.sh create mode 100755 src/roff/groff/tests/handle_special_input_code_points.sh create mode 100755 src/roff/groff/tests/html_works_with_grn_and_eqn.sh create mode 100755 src/roff/groff/tests/initialization_is_quiet.sh create mode 100755 src/roff/groff/tests/localization_works.sh create mode 100755 src/roff/groff/tests/msoquiet_works.sh create mode 100755 src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh create mode 100755 src/roff/groff/tests/output_driver_C_and_G_options_work.sh create mode 100755 src/roff/groff/tests/recognize_end_of_sentence.sh create mode 100755 src/roff/groff/tests/regression_savannah_56555.sh create mode 100755 src/roff/groff/tests/regression_savannah_58153.sh create mode 100755 src/roff/groff/tests/regression_savannah_58162.sh create mode 100755 src/roff/groff/tests/regression_savannah_58337.sh create mode 100755 src/roff/groff/tests/regression_savannah_59202.sh create mode 100755 src/roff/groff/tests/smoke-test_html_device.sh create mode 100755 src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh create mode 100755 src/roff/groff/tests/soquiet_works.sh create mode 100755 src/roff/groff/tests/string_case_xform_errors.sh create mode 100755 src/roff/groff/tests/string_case_xform_requests.sh create mode 100755 src/roff/groff/tests/string_case_xform_unicode_escape.sh create mode 100755 src/roff/groff/tests/substring_works.sh create mode 100755 src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh delete mode 100644 src/roff/grog/grog.1.man delete mode 100644 src/roff/grog/grog.am delete mode 100644 src/roff/grog/grog.pl delete mode 100644 src/roff/grog/subs.pl create mode 100755 src/roff/nroff/tests/verbose_option_works.sh create mode 100644 src/utils/grog/grog.1.man create mode 100644 src/utils/grog/grog.am create mode 100644 src/utils/grog/grog.pl create mode 100755 src/utils/grog/tests/PF-does-not-start-pic-region.sh create mode 100755 src/utils/grog/tests/avoid-refer-fakeout.sh create mode 100644 src/utils/grog/tests/foo.man create mode 100755 src/utils/grog/tests/preserve-groff-options.sh create mode 100755 src/utils/grog/tests/recognize-perl-pod.sh create mode 100755 src/utils/grog/tests/smoke-test.sh delete mode 100644 tmac/a4.tmac delete mode 100644 tmac/an-old.tmac rename tmac/{doc-old.tmac-u => doc-old.tmac} (99%) rename tmac/{doc.tmac-u => doc.tmac} (87%) rename tmac/{e.tmac-u => e.tmac} (67%) create mode 100644 tmac/en.tmac delete mode 100644 tmac/groff_man.7.man create mode 100644 tmac/groff_man.7.man.in rename tmac/{hyphen.us => hyphen.en} (80%) create mode 100644 tmac/hyphen.it create mode 100644 tmac/hyphenex.en delete mode 100644 tmac/hyphenex.us create mode 100644 tmac/it.tmac rename tmac/{doc-common-u => mdoc/doc-common} (69%) rename tmac/{doc-ditroff-u => mdoc/doc-ditroff} (67%) rename tmac/{doc-nroff-u => mdoc/doc-nroff} (77%) rename tmac/{doc-syms-u => mdoc/doc-syms} (67%) delete mode 100644 tmac/safer.tmac delete mode 100644 tmac/strip.sed create mode 100755 tmac/tests/an-ext_MR-works.sh create mode 100755 tmac/tests/an-ext_MT-works.sh create mode 100755 tmac/tests/an-ext_UR-works.sh create mode 100755 tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh create mode 100755 tmac/tests/an_CS-register-off.sh create mode 100755 tmac/tests/an_CS-register-on.sh create mode 100755 tmac/tests/an_CS-register-unspecified.sh create mode 100755 tmac/tests/an_CT-register-off.sh create mode 100755 tmac/tests/an_CT-register-on.sh create mode 100755 tmac/tests/an_CT-register-unspecified.sh create mode 100755 tmac/tests/an_FT-bad-value-should-not-trash-titles.sh create mode 100755 tmac/tests/an_HY-register-works.sh create mode 100755 tmac/tests/an_LL-init-sanely.sh create mode 100755 tmac/tests/an_ME-punct-hyphenates.sh create mode 100755 tmac/tests/an_MR-works.sh create mode 100755 tmac/tests/an_MT-body-hyphenates.sh create mode 100755 tmac/tests/an_MT-works.sh create mode 100755 tmac/tests/an_P-register-works.sh create mode 100755 tmac/tests/an_TH-repairs-ad-damage.sh create mode 100755 tmac/tests/an_TH-repairs-hy-damage.sh create mode 100755 tmac/tests/an_TS-adds-no-vertical-space.sh create mode 100755 tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh create mode 100755 tmac/tests/an_UE-breaks-before-long-URIs.sh create mode 100755 tmac/tests/an_UE-punct-hyphenates.sh create mode 100755 tmac/tests/an_UR-body-hyphenates.sh create mode 100755 tmac/tests/an_UR-works.sh create mode 100755 tmac/tests/an_X-register-works.sh create mode 100755 tmac/tests/an_adjust-link-text-correctly.sh create mode 100755 tmac/tests/an_avoid-two-font-denial-of-service.sh create mode 100755 tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh create mode 100755 tmac/tests/an_font-remapping-does-not-affect-titles.sh create mode 100755 tmac/tests/an_handle-degenerate-input-quietly.sh create mode 100755 tmac/tests/an_inner-footer-abbreviation-works.sh create mode 100755 tmac/tests/an_link-macros-work-in-paragraph-tags.sh create mode 100755 tmac/tests/an_link-trailing-text-hugs-previous.sh create mode 100755 tmac/tests/an_no-break-after-short-paragraph-tags.sh create mode 100755 tmac/tests/an_output-footer-when-continuously-rendering.sh create mode 100755 tmac/tests/an_page-footers-present.sh create mode 100755 tmac/tests/an_page-header-has-current-data.sh create mode 100755 tmac/tests/an_reset-hyphenation-correctly.sh create mode 100755 tmac/tests/an_title-abbreviation-works.sh create mode 100755 tmac/tests/an_use-input-traps-correctly.sh create mode 100755 tmac/tests/an_works-with-ec.sh create mode 100755 tmac/tests/andoc_P-register-works.sh create mode 100755 tmac/tests/andoc_check-an-to-doc-transition.sh create mode 100755 tmac/tests/andoc_clear-doc-traps.sh create mode 100755 tmac/tests/andoc_flush-between-packages.sh create mode 100755 tmac/tests/doc_CS-works.sh create mode 100755 tmac/tests/doc_CT-works.sh create mode 100755 tmac/tests/doc_D-places-page-numbers-correctly.sh create mode 100755 tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh create mode 100755 tmac/tests/doc_Mt-works.sh create mode 100755 tmac/tests/doc_Nm-works.sh create mode 100755 tmac/tests/doc_P-register-works.sh create mode 100755 tmac/tests/doc_X-register-works.sh create mode 100755 tmac/tests/doc_accept-mixed-case-section-headings.sh create mode 100755 tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh create mode 100755 tmac/tests/doc_heading-font-remapping-works.sh create mode 100755 tmac/tests/doc_indents-correctly.sh create mode 100755 tmac/tests/doc_output-footer-when-continuously-rendering.sh create mode 100755 tmac/tests/doc_smoke-test.sh create mode 100755 tmac/tests/e_chapter-titles-work.sh create mode 100755 tmac/tests/e_columns-work-on-long-pages.sh create mode 100755 tmac/tests/e_delayed-text-marks-work.sh create mode 100755 tmac/tests/e_footnote-marks-work.sh create mode 100755 tmac/tests/e_footnotes-work-with-columns.sh create mode 100755 tmac/tests/e_ld-works.sh create mode 100755 tmac/tests/e_line-numbering-works.sh create mode 100755 tmac/tests/e_rejects-too-short-page-lengths.sh create mode 100755 tmac/tests/ec_works.sh create mode 100755 tmac/tests/latin2_works.sh create mode 100755 tmac/tests/latin5_works.sh create mode 100755 tmac/tests/latin9_works.sh create mode 100755 tmac/tests/localization-works.sh create mode 100755 tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh create mode 100755 tmac/tests/pdfpic_falls-back-to-PSPIC.sh create mode 100755 tmac/tests/s_IP-indents-using-paragraph-type-size.sh create mode 100755 tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh create mode 100755 tmac/tests/s_PN-works.sh create mode 100755 tmac/tests/s_R-handles-its-arguments.sh create mode 100755 tmac/tests/s_SH-resets-IP-indentation-amount.sh create mode 100755 tmac/tests/s_TC-works-with-percent-in-custom-titles.sh create mode 100755 tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh create mode 100755 tmac/tests/s_honor-MINGW-when-two-columns.sh create mode 100755 tmac/tests/s_mark-column-start-correctly.sh create mode 100755 tmac/tests/s_no-excess-space-around-displays.sh create mode 100755 tmac/tests/s_rejects-too-short-page-lengths.sh delete mode 100644 tmac/unicode.tmac diff --git a/.tarball-version b/.tarball-version index 2a0ba77..a6c2798 100644 --- a/.tarball-version +++ b/.tarball-version @@ -1 +1 @@ -1.22.4 +1.23.0 diff --git a/.version b/.version index 2a0ba77..a6c2798 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.22.4 +1.23.0 diff --git a/BUG-REPORT b/BUG-REPORT index 0a24646..0ca6f2d 100644 --- a/BUG-REPORT +++ b/BUG-REPORT @@ -1,79 +1,72 @@ -# Copyright (C) 1999-2018 Free Software Foundation, Inc. -# -# This file is part of 'groff'. -# -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - - - Groff Bug Report - -Please read the PROBLEMS file before submitting a bug report. + Copyright (C) 1999-2020, 2022 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without + modification, are permitted in any medium without royalty provided + the copyright notice and this notice are preserved. + + groff Bug Report + +[Please read the 'PROBLEMS' file before submitting a bug report. Please fill in all fields, even if you think they are not relevant. -Please delete the text in brackets before submitting it. +Please delete the text in square brackets before submitting it. -Please report separate bugs separately. +Please report distinguishable problems separately. -Place the completed form in a new bug report at -http://savannah.gnu.org/bugs/?group=groff. +Place this completed form in a new bug report at +. Click on the "Bugs" link, +then select "Submit new" from the menu.] ++verbatim+ GROFF VERSION: -[The version of groff you are using. For example, '1.22.4'] - -MACHINE: -[The machine you are using. For example, 'Sun SPARCstation 2'] +[Put the output of the failing command when run with the '--version' +option here. For example, "groff --version" or "indxbib --version".] -OS: -[The operating system you are using. For example, 'SunOS 4.1.1'] +PLATFORM: +[Put the output of the "uname -a" command here. On non-POSIX systems, +some alternative should be available; on Windows systems, use "ver".] -COMPILER: -[The compiler you used to compile groff. For example, 'g++ 1.40.3'] +CONFIGURATION REPORT: +[If you compiled groff yourself, include the portion of the 'configure' +script's output between rows of dashes. If you didn't compile groff +yourself, supply the packaging information from your distributor: in +DEB- and RPM-based GNU/Linux distributions, gather it with the commands +"dpkg -s groff" or "rpm -qi groff", respectively.] INPUT FILES: [Include all the files necessary to reproduce the problem that are not -part of the standard groff distribution. This includes font -description files, DESC files and macro files (with the exception of -the -ms and -mm macros: we have them). Attach them to the bug report. +part of the standard groff distribution. This includes device and font +description files and any macro files your document uses that groff does +not supply. Attach them to the bug report. It's easier for us if you can provide an example that doesn't depend on any macro package, but obviously if you're reporting a problem with a -macro package that won't be possible. Also a short example is more +macro package that won't be possible. Further, a short example is more convenient than a long one, but don't worry if you can't find a short -example. Don't say something like "any file that X": Always include a -definite example.] +example. A claim like "any file that X" is not helpful: always include +a concrete example.] COMMAND LINE: [The command line that we should run in order to observe the bug. For -example, 'gtroff -Tps bug.tr'. If the command line uses -ms or -mm, -say whether these refer to the groff versions or the Unix versions of -the macros.] +example, "groff -Tps bug.tr".] DESCRIPTION OF INCORRECT BEHAVIOUR: -[What goes wrong when that command line is run? For example, 'gtroff -gets a segmentation fault', or 'The output looks bad because the bar -over the x is too long and is too far over to the left.' If you get an -error message, include it here without modification: Don't edit it to +[What goes wrong when that command line is run? For example, "groff +gets a segmentation fault.", or "The output looks bad because the bar +over the x is too long and is too far over to the left." If you get an +error message, include it here without modification: don't edit it to make it more readable.] SUGGESTED FIX [optional]: -[If you can suggest a fix for the problem, include a context diff here. -But don't delay submitting a bug report in the hope of finding a fix. -Guesses about the cause of the bug are not usually helpful.] +[If you can suggest a fix for the problem, you might include a unified +diff here. But don't delay submitting a bug report in the hope of +finding a fix. A guess about a bug's cause is not usually helpful.] +-verbatim- -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set filetype= textwidth=72: diff --git a/ChangeLog b/ChangeLog index 835d26c..bfcc345 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5318 +1,18665 @@ -2018-12-18 Bertrand Garrigues +2023-06-21 G. Branden Robinson - Fix 'dvi' and 'pdf' texinfo doc generation. + [ms]: Offer advice to users of PDF who want a table of contents + at the front of the document. - GNU make has a built-in variable 'TEXI2DVI' but it is not the case - of all 'make' implementations, which causes 'make doc' to fail - with an unclear message although 'texi2dvi' is available. Also, - 'texi2dvi' is invoked inconditionnally. + * doc/groff.texi (ms Document Structure): Move mention of + pdfjam(1) from here... + (ms TOC): ...to here, and identify alternatives, including + gropdf(1)'s `pdfswitchtopage` macro. - * m4/groff.m4 (GROFF_TEXI2DVI): new macro to detect properly the - presence of 'texi2dvi'. + * doc/ms.ms (General structure of an ms document): + (Creating a table of contents): Similar. - * configure.ac: use 'GROFF_TEXI2DVI' and define automake conditional - 'HAVE_TEXI2DVI'. + Fixes . Thanks to Michał + Kruszewski for the report. - * doc/doc.am: - - Define TEXI2DVI to 'texi2dvi'. - - Print an error message if 'texi2dvi' is not available. +2023-06-01 G. Branden Robinson -2018-12-08 Bertrand Garrigues + [docs]: Migrate terminology to "scaling unit". - Install texinfo doc on 'make install-pdf' and 'make install-html' + ...from "scaling indicator". - * doc/doc.am: - - Use automake 'install-pdf-local' and 'install-html-local' rules - to install groff.pdf and groff.html - - New rules 'uninstall_pdf' and 'uninstall_html'. - - Use $(RM) instead of 'rm'. - - Don't try to build doc if 'BUILD_INFODOC' is not set. - * INSTALL.REPO: document texinfo build and installation. + Fixes . Thanks to Ingo + Schwarze for the discussion. -2018-12-10 Ingo Schwarze +2023-05-29 G. Branden Robinson - * Makefile.am: Remove the unused variables PREFIXMAN5 and PREFIXMAN7. + [docs]: Revise discussion of fonts. - They caused installation failures on Solaris 9. + * doc/groff.texi: + - Rename node/section "Fonts and Symbols" to "Using Fonts". Add + giant new introduction, properly establishing terminology. + - Rename node/section "Changing Fonts" to "Selecting Fonts". + Shift location of `.fn` and `.sty` register documentation. + Rewrite presentation of `ft` and `\f`. Discuss typeface + selection by mounting position and font (or style) name + together; since arguments to these formatter instructions are + always interpreted as mounting positions first, it doesn't + make much sense to me to present them separately, and the new + introduction provides the necessary background. Tighten + example. Document that current and previous font selections + are environment properties. + - Add several concept index entries. + - Do more migration from "symbol" and "glyph" names to "special + character" names. + + * man/groff.7 (Using fonts): Introduce new section, synced with + the renamed node from our Texinfo manual above. + + Fixes . + +2023-05-29 G. Branden Robinson + + [docs]: Revise "Page Layout" material. -2018-12-08 Bertrand Garrigues + * doc/groff.texi: + - Recast generally. + - Describe behavior of `pl` in more detail. + - Migrate terminology from "scaling indicator" to "scaling + unit". + - Stop discussing page margins in the context of the `pl` + request. + - Move concept index entries regarding margins from here to + "Traps". + - Move discussion of `pn` request to precede `tl` request. + - Add concept index entries. + - Recast description of `tl` request. Migrate terminology from + "justification" to "alignment". + - Recast description of `lt` request. Describe behavior in more + detail. + - Recast description of `pc` request. + - Add example of `lt` and `tl` usage. Add forward reference to + "Traps", mentioning page header and footer traps. + + Fixes . Thanks to Dave + Kemper for the report. + +2023-05-22 Dave Kemper + + [docs]: Correct minor punctuation, grammar, and spelling issues. + + Also remove a couple instances of unnecessarily telling the + reader to note something. - Remove gnulib's hypot module. + * doc/groff.texi: + * man/groff.7.man: + * man/groff_char.7.man: + * man/groff_diff.7.man: + * man/roff.7.man: + * src/roff/nroff/nroff.1.man: Do it. - The removal of 'GROFF_NEED_DECLARATION([hypot])' in 'configure.ac' - was correct as the test was buggy, but there is no need to use - gnulib's hypot module as previously we did not need to provide a - replacement function. + Fixes . [I threw in a few + more fixes. --GBR] - * bootstrap.conf: do it. +2023-04-22 G. Branden Robinson -2018-12-08 Deri James + [docs]: Attempt to further clarify end-of-sentence detection. - Problem running gropdf on big endian (Sparc) + * doc/groff.texi (Sentences): + * man/roff.7 (Concepts): Do it. - * src/devices/gropdf/gropdf.pl: Prior to perl v5.9 the 'L<' - template for 'unpack' was unavailable. Solaris 10 uses v5.8.4 - so safer to use the template 'V' rather than 'L<'. + Fixes . Thanks to Ingo + Schwarze and Dave Kemper for the report. -2018-12-08 Bertrand Garrigues +2023-04-14 G. Branden Robinson - Use gnulib's 'hypot' module. + [docs]: Minimally document `tag`, `taga` requests. - In 'configure.ac', the macro call - 'GROFF_NEED_DECLARATION([hypot])' checks whether the function - 'hypot' is correctly declared in 'math.h', but the test is buggy - and may yields false results. + * doc/groff.texi (Postprocessor Access): + * man/groff.7 (Request short reference): Do it. - * bootsrap.conf: add 'hypot' module. + Fixes . - * configure.ac: Remove GROFF_NEED_DECLARATION([hypot]). +2023-04-11 G. Branden Robinson - * src/libs/libgroff/hypot.cpp: remove declaration of hypot. + [docs]: Fix typos. -2018-12-07 Deri James + * doc/groff.texi (ms basic information): + * doc/ms.ms (Basic information): Do it. - Problem running gropdf on big endian (Sparc) + Fixes . Thanks to an + anonymous reporter. - * src/devices/gropdf/gropdf.pl: When loading a binary (.pfb) - font for embedding always use little endian to unpack chunk - headers. +2023-03-07 G. Branden Robinson -2018-12-05 Bertrand Garrigues + * doc/groff.texi (Operators in Conditionals): + * man/groff.7.in (Conditional expressions): Clarify how the + output comparison operator is recognized. - Skip mom tests if needed config is missing. + Fixes . Thanks to John + Gardner for the report. - * contrib/mom/examples/test-mom.sh.in: exit 77 if URW fonts are - not available. +2023-03-06 G. Branden Robinson - * contrib/mom/mom.am: distribute inconditionnally test-mom.in. + Use a better type for symbol hashes. - * m4/groff.m4 (GROFF_URW_FONTS): check if 'awk' and 'gs' are - available, and replace non-portable 'grep' command by awk script. + * bootstrap.conf: Add "stdint" module to ensure that the + `uintptr_t` type is available. + * src/include/symbol.h: Include for `uintptr_t`. + (class symbol): + (symbol::hash): Change return type from `unsigned long`, which + causes build failures on 64-bit MinGW, to `uintptr_t`. + (symbol::hash): Use a C++ type cast, not a C-style one. -2018-12-01 Colin Watson + Thanks to Bruno Haible for reporting the build failure in the + 64-bit MinGW environment, and for suggesting a remedy. - Fix error handling in tests of mom examples +2023-03-06 G. Branden Robinson - * contrib/mom/examples/test-mom.sh.in (check_number_pages): Correct - error message. - (check_has_images): Correct shell syntax error. + [groff]: Revise a test to be more revealing. -2018-11-26 Bertrand Garrigues + * src/roff/groff/tests/initialization_is_quiet.sh: Stop using + "set -e". Instead use `fail` variable and `wail` function (and + lowercase names for our internal variables) like many of our + other tests. If the "unset" shell built-in fails, skip the + test (prompted by /usr/xpg4/bin/sh on Solaris). Attempt every + groff locale, with and without compatibility mode initially + enabled, instead of stopping at the first failure. Report + standard error and standard output content separately. Use + groff's `-a` flag to prepare the standard output, for + readability. + * PROBLEMS: Document that this test might be skipped rather than + failing on Solaris. (What actually happens depends on which + shell you run it with, and we advise a variety of approaches.) - Document .sp behaviour in -me doc -- French translation + Thanks to Bruno Haible for feedback regarding mysterious + failures of this test on GNU/Hurd and NetBSD systems. - * doc/meintro_fr.me: translation of commit - 7a83f7f5003e24f020306f09f4d497e04e82cb14. +2023-03-06 G. Branden Robinson - Fixes bug https://savannah.gnu.org/bugs/?54958. + * bootstrap.conf (gnulib_modules): Add "stdbool-c99" per + recommendation from Bruno Haible. -2018-11-24 Bertrand Garrigues + Fixes build problem on Solaris using Sun compiler. - Fix tarball generation: script 'makevarescape.sed' was missing. +2023-03-06 Bruno Haible - * Makefile.am (EXTRA_DIST): add it. + * Makefile.am (AR): Remove hardcoded value. Let Automake use the + value from config.status. -2018-11-24 Bertrand Garrigues + {Fixes build problem on 64-bit AIX. Problem appears to date + back to commit 5fec19d453, 2014-08-15. --GBR} - Add automatic tests on mom examples +2023-03-06 Bruno Haible - * m4/groff.m4 (GROFF_PDFTOOLS): check presence of some pdf tools. - * configure.ac: use 'GROFF_PDFTOOLS', add new AM conditional. - * contrib/mom/examples/test-mom.sh.in: new file that use 'pdfinfo' - and 'pdfimages' to make some basic checks on mom examples. + * arch/misc/misc.am (shdeps.sed): Rename target from this... + ($(SH_DEPS_SED_SCRIPT)): ...to this, to work better with make(1) + on FreeBSD, NetBSD, and AIX. -2018-11-21 G. Branden Robinson +2023-03-01 G. Branden Robinson - tmac/sv.tmac: Set Swedish hyphenation flags to 32. + [build]: Discard now-unneeded Autoconf macro and variables. - This permits hyphenation after the first character but continues - prohibiting it before the last character of a word, in - congruence with the TeX-based hyphenation patterns we use. + * configure.ac: Stop calling `GROFF_POPPLER`. Stop populating + the Automake conditional `HAVE_PDFTOOLS`. Eliminate chatter + about their availability in the configuration report. + * m4/groff.m4 (GROFF_POPPLER): Delete. - Fixes . +2023-03-01 G. Branden Robinson -2018-11-19 Bertrand Garrigues + * m4/groff.m4 (GROFF_URW_FONTS_NOTICE): Adapt wording of notice + to presence and identity of Ghostscript interpreter command. + Clarify that it is gropdf(1) specifically that traverses the + Ghostscript search path reported by its "-h" option. - Fix build on environment where /etc/papersize contains comments + Continues . Thanks to + Deri James for the ongoing discussion. - Issue introduced on commit efea81c75f831ddc6717c2ef25556e0f49d1f679. +2023-02-25 G. Branden Robinson - * m4/groff.m4 (GROFF_PAGE): remove comments and get the 1st string - of '/etc/papersize'. + [devpdf]: Revise tests. -2018-11-12 G. Branden Robinson + * font/devpdf/tests/check-default-foundry.sh.in: Test only the + base 14 fonts of the PDF standard unconditionally. Test the + remainder from the set of 35 commonly distributed only if a + Ghostscript interpreter was detected at configuration time, + because the latter fonts _must_ be embedded in PDF documents. + If they're not present, skip the test rather than failing it. + * font/devpdf/tests/check-urw-foundry.sh.in: Skip test if no URW + fonts detected at configuration time, rather than failing it. + * m4/groff.m4 (GROFF_GROPDF_PROGRAM_NOTICE) + (GROFF_URW_FONTS_NOTICE): Drop warnings of expected test + failures. The tests no longer fail in the anticipated + circumstances. - * m4/groff.m4 (GROFF_PAGE): Try /etc/papersize first. +2023-02-24 G. Branden Robinson - Fixes . + [devpdf]: Generate tests from template files, so we can populate + the test scripts with information determined at configuration. + The default foundry test depends on $GHOSTSCRIPT, and the URW + foundry test on $urwfontsdir. -2018-11-12 G. Branden Robinson + * font/devpdf/tests/check-default-foundry.sh: + * font/devpdf/tests/check-urw-foundry.sh: Rename these... + * font/devpdf/tests/check-default-foundry.sh.in: + * font/devpdf/tests/check-urw-foundry.sh.in: ...to these. - * bootstrap.conf: Bump Autoconf dependency to 2.68. We need it - to support our bug-reporting URL, which contains a "?". - Strictly, Autoconf 2.65 is fine, but 2.66 and 2.67 broke this. - Even 2.69 is over 6 years old now. + * font/devpdf/devpdf.am (font_devpdf_default_test) + (font_devpdf_urw_test): New variables store names of generated + test scripts. + (font/devpdf/tests/check-default-foundry.sh): + (font/devpdf/tests/check-urw-foundry.sh): New targets produce + test scripts from corresponding .in files. - See . +2023-02-24 G. Branden Robinson -2018-11-12 G. Branden Robinson + [devpdf]: Trivially refactor. Rename sed-substitutum [Lat.] + from "@GROFF_GHOSTSCRIPT_INTERPRETERS@" to "@GHOSTSCRIPT@" for + clarity and brevity; this is a scalar value containing the + Autoconf-determined name of the Ghostscript interpreter. It is + not the same as the replacement that occurs in contrib/pdfmark. - * m4/groff.m4 (GROFF_PAGE): Quote shell variables that are under - external control and may contain embedded whitespace. A test - shows that our configure script is now robust in this way, but - our Automake files are not, starting with - src/utils/afmtodit/afmtodit.am. + * font/devpdf/devpdf.am: + * font/devpdf/util/BuildFoundries.pl: Do it. -2018-11-12 G. Branden Robinson +2023-02-24 G. Branden Robinson - * makevarescape.sed: - - Escape plain spaces and double-quotes (ASCII 32 and 34) so - that bad things don't happen if they are embedded in a Make - variable expanded in a man page @THUS@ _and_ given as an - argument to a macro that distinguishes its parameters, such - as .IR. - - Add discretionary breaks after groups of slashes not - preceded by a space; e.g., transform "/usr/bin/groff" into - "/usr/\:bin/\:groff". Will also work on URLs - {"https://\:example.com/\:page.html"} in case we need that. + [build]: Stop scraping output of Ghostscript executable with + "-h" option to attempt to find URW fonts. Fonts that ship with + Ghostscript are regarded as the "default" foundry, not the URW + foundry (though they often ultimately originate with URW fonts). + They are often missing Adobe Font Metric (AFM) files, so it is + impossible for groff to generate font description files for them + at build time. -2018-11-11 G. Branden Robinson + * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Drop `AC_REQUIRE` on + `GROFF_AWK_PATH`. Drop awk-based scraping of Ghostscript "-h" + output. Annotate need for sync between this list of + characteristic font file names and the one in BuildFoundries. - Undocument Werner and Ted as groff maintainers. + Thanks to Deri James for the ongoing discussions. - * README: - * doc/pic.ms: - * src/roff/grog/grog.pl: - * src/roff/nroff/nroff.sh: Werner (and Ted) retired from the - role some time ago and Bertrand Garrigues has stepped up; see - https://lists.gnu.org/archive/html/groff/2017-09/msg00048.html. - I'll let him document his maintainer status as and where he - prefers. - -2018-11-11 G. Branden Robinson - - Stop spelling "Unix" as "UNIX". - - Per AT&T Bell Labs veterans Doug McIlroy and Meg McRoberts, - spelling "Unix" in full caps was a contrivance insisted upon by - AT&T lawyers, and not a practice used in the Unix manuals - themselves or the Bell Labs Technical Journal. See - https://lists.gnu.org/archive/html/groff/2015-01/msg00026.html - and - https://lists.gnu.org/archive/html/groff/2015-01/msg00029.html - for support. - - There are instances I did _not_ change; they may require further - review. - ChangeLog.* - NEWS - One reference relevant to mdoc; see below. - doc/meintro{,_fr}.me - These documents also give the small caps - treatment to groff, troff, and nroff, suggesting - a separate changeset. - src/preproc/pic/pic.ypp - Contains a comment referring to "Compaq Tru64 - UNIX"; not worth the candle IMO. - tmac/s.tmac: - {ms macro package} Leaving UX macro definition - alone until/unless it can be established that - this doesn't change the rendering of historical - documents in an objectionable way. - tmac/doc-syms-u: - tmac/doc-old.tmac-u: - tmac/doc-common-u: - tmac/groff_mdoc.7.man: - {mdoc macro package} Similar; mdoc defines many - strings that spit out "UNIX" (albeit not with a - font size change). - - * MORE.STUFF: +2023-02-24 G. Branden Robinson + + * configure.ac: Drop now-redundant explicit + `GROFF_URW_FONTS_CHECK`. `GROFF_GROPDF_DEPENDENCIES_CHECK` + `AC_REQUIRE`s it as of commit ec001d2a23, 18 February. + +2023-02-24 G. Branden Robinson + + * m4/groff.m4 (GROFF_URW_FONTS_CHECK): When looking for a + characteristic URW font by its file name, also check for + "URWGothic-Book" with no file extension. Avoids false negatives + in URW Type 1 font detection when using Ghostscript 9.53.3. + Thanks to Deri James for suggesting the test procedure that + uncovered this flaw. + +2023-02-22 G. Branden Robinson + + * Makefile.am (uninstall_groffdirs): Remove "html.mono" and + "html.node" directories corresponding to HTML version of our + Texinfo manual. + * doc/doc.am (uninstall-html): Uninstall HTML version of our + Texinfo manual more reliably. + + Fixes a regression introduced by me in commit c2698aade, 6 April + {my claim "we're only deleting files with this command, not + directories" was not correct}. + +2023-02-22 G. Branden Robinson + + [doc]: Handle output formats of our Texinfo manual more + consistently. + + * doc/doc.am (install-doc): Add dependency on (Automake + standard) target 'install-dvi'. + (maintainer-clean-local): Remove our Texinfo manual in plain + text format. + (install-data-local): Add dependency on new target + 'install-txt'. + (install-txt): Install our Texinfo manual in plain text format. + (uninstall-local): Add dependency on new target 'uninstall-txt'. + (uninstall-txt): Uninstall our Texinfo manual in plain text + format. + + Thanks to T. Kurt Bond for noticing the discrepancy. + +2023-02-22 G. Branden Robinson + + * doc/doc.am (install-pdf-local, install-html-local): Enable + rules to work in out-of-tree builds. + +2023-02-22 G. Branden Robinson + + * doc/doc.am (uninstall-hook): Drop dependency on + "uninstall_mom"; this is not the appropriate place to declare + it, and "uninstall_groffdirs" already depends on it in mom's + Automake file. + +2023-02-22 G. Branden Robinson + + [tests]: Have more tests report output. + + * src/roff/groff/tests/ab_works.sh: + * src/roff/groff/tests/handle_special_input_code_points.sh: + * src/roff/groff/tests/initialization_is_quiet.sh: + * src/roff/groff/tests/msoquiet_works.sh: + * src/roff/groff/tests/soquiet_works.sh: + * tmac/tests/an-ext_MR-works.sh: + * tmac/tests/an_MR-works.sh: Do it. + +2023-02-22 G. Branden Robinson + + [tests]: Prevent failures when $GROFF_ENCODING is set. + + * src/roff/groff/tests/ab_works.sh: + * src/roff/groff/tests/handle_special_input_code_points.sh: + * src/roff/groff/tests/initialization_is_quiet.sh: + * src/roff/groff/tests/msoquiet_works.sh: + * src/roff/groff/tests/soquiet_works.sh: + * tmac/tests/an-ext_MR-works.sh: + * tmac/tests/an_MR-works.sh: + * tmac/tests/an_font-remapping-does-not-affect-titles.sh: Unset + $GROFF_ENCODING before running test because preconv(1) confounds + these tests. + + Thanks to Alexis for reporting this problem. + +2023-02-21 G. Branden Robinson + + [ms]: Rename test. + + * tmac/tests/s_no-excess-space-around-displays.tmac: Rename... + * tmac/tests/s_no-excess-space-around-displays.sh: ...to this. + * tmac/tmac.am (tmac_TESTS): Update. + +2023-02-21 G. Branden Robinson + + [gropdf]: Revise tests to run unconditionally, rather than + configuring them away at build time, which can cause a + distribution archive to be incorrectly structured. Update + configuration notices when optional dependencies are absent. + + * font/devpdf/devpdf.am (font_devpdf_TESTS): Remove `USE_GROPDF` + and `HAVE_URW_FONTS` conditionals. + * m4/groff.m4 (GROFF_GROPDF_PROGRAM_NOTICE): + (GROFF_URW_FONTS_NOTICE): Warn reader that a gropdf test failure + is to be expected. + + Fixes (2/2). + +2023-02-21 G. Branden Robinson + + [grohtml]: Revise tests to check for requisite programs at test + time and skip if not found, rather than configuring them away at + build time, which can cause a distribution archive to be + incorrectly structured. + + * m4/groff.m4: Annotate requisite program list since we're + violating the DRY principle. + * src/roff/groff/groff.am (groff_TESTS): Populate + unconditionally. + + * src/roff/groff/tests/html_works_with_grn_and_eqn.sh: + * src/roff/groff/tests/smoke-test_html_device.sh: Check for + requisite programs and skip test if any are not found. + + Fixes (1/2). + +2023-02-21 G. Branden Robinson + + [man pages]: Define page-local `MR` fallback. + + [man pages]: Provide page-local fallback definition of new `MR` + macro. I didn't think I was going to have to do this, but the + premier site on the web for viewing Linux man pages, Michael + Kerrisk's man7.org, has been pulling snapshots of the pages + themselves without upgrading the underlying macros, and so man + page cross references set with `MR` are getting lost in its + presentations. (I acknowledge: Ingo Schwarze warned me + something like this could happen.) This definition is intended + as a stopgap measure only. I want to revert this after groff + 1.23 is released and has spread to some reasonable degree. + + * contrib/chem/chem.1.man: + * contrib/eqn2graph/eqn2graph.1.man: + * contrib/gdiffmk/gdiffmk.1.man: + * contrib/glilypond/glilypond.1.man: + * contrib/gperl/gperl.1.man: + * contrib/gpinyin/gpinyin.1.man: + * contrib/grap2graph/grap2graph.1.man: + * contrib/hdtbl/groff_hdtbl.7.man: + * contrib/mm/groff_mm.7.man: + * contrib/mm/groff_mmse.7.man: + * contrib/mm/mmroff.1.man: + * contrib/mom/groff_mom.7.man: + * contrib/pdfmark/pdfroff.1.man: + * contrib/pic2graph/pic2graph.1.man: + * contrib/rfc1345/groff_rfc1345.7.man: + * man/groff.7.man: + * man/groff_char.7.man: + * man/groff_diff.7.man: + * man/groff_font.5.man: + * man/groff_out.5.man: + * man/groff_tmac.5.man: + * man/roff.7.man: + * src/devices/grodvi/grodvi.1.man: + * src/devices/grohtml/grohtml.1.man: + * src/devices/grolbp/grolbp.1.man: + * src/devices/grolj4/grolj4.1.man: + * src/devices/gropdf/gropdf.1.man: + * src/devices/gropdf/pdfmom.1.man: + * src/devices/grops/grops.1.man: + * src/devices/grotty/grotty.1.man: + * src/devices/xditview/gxditview.1.man: + * src/preproc/eqn/eqn.1.man: + * src/preproc/eqn/neqn.1.man: + * src/preproc/grn/grn.1.man: + * src/preproc/pic/pic.1.man: + * src/preproc/preconv/preconv.1.man: + * src/preproc/refer/refer.1.man: + * src/preproc/soelim/soelim.1.man: + * src/preproc/tbl/tbl.1.man: + * src/roff/groff/groff.1.man: + * src/roff/nroff/nroff.1.man: + * src/roff/troff/troff.1.man: + * src/utils/addftinfo/addftinfo.1.man: + * src/utils/afmtodit/afmtodit.1.man: + * src/utils/grog/grog.1.man: + * src/utils/hpftodit/hpftodit.1.man: + * src/utils/indxbib/indxbib.1.man: + * src/utils/lkbib/lkbib.1.man: + * src/utils/lookbib/lookbib.1.man: + * src/utils/pfbtops/pfbtops.1.man: + * src/utils/tfmtodit/tfmtodit.1.man: + * src/utils/xtotroff/xtotroff.1.man: + * tmac/groff_man.7.man.in: + * tmac/groff_me.7.man: + * tmac/groff_ms.7.man: + * tmac/groff_trace.7.man: + * tmac/groff_www.7.man: Do it. + + Fixes . Thanks greatly to + Alexis for identifying an issue with mandoc(1)'s handling of an + earlier iteration of this fallback, and to John Gardner for + identifying a method of detecting mandoc as the renderer at + formatting time. + +2023-02-20 G. Branden Robinson + + * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh: Improve + portability of script by using shell constructs instead of the + nonstandard GNU coreutils 'seq' utility. Resolves test failure + on Solaris 10. + * HACKING: Document this problem. + +2023-02-20 G. Branden Robinson + + * m4/groff.m4 (GROFF_MAKE_DEFINES_RM): Test the make(1) in the + environment variable $MAKE if defined, not a literal "make". + Required on (some) Solaris 10 configurations where traditional + make(1) is not installed but GNU make is installed as "gmake". + +2023-02-19 G. Branden Robinson + + * tmac/tests/latin2_works.sh: Fix missing backslash in printf. + Solaris printf(1) was sensitive to this error; macOS and GNU + printf were not. Fixes a test failure on Solaris 11. + +2023-02-19 G. Branden Robinson + + * src/roff/groff/tests/regression_savannah_58153.sh: Improve + portability. Avoid the unpredictability of implementations when + putting backslashes inside a groff-piped printf shell command + inside a here document inside a command substitution by changing + the groff escape character to something meaningless to the shell + and to printf ('@'). Fixes a test failure on Solaris 11. + +2023-02-18 G. Branden Robinson + + * font/devpdf/Foundry.in: Recognize URW foundry replacements for + Helvetica Bold-Oblique and Helvetica Oblique under the file + names "NimbusSans-BoldItalic.t1" and "NimbusSans-Italic.t1", + respectively. + +2023-02-18 G. Branden Robinson + + * doc/doc.am (uninstall-pdf): Clean more fastidiously; try to + remove the configured `pdfdocdir` in the event it is empty, but + do not fail if it isn't. (It can be a directory shared with + other groff components; we don't know in what order the + uninstall targets will serialize, but the last one run should + succeed.) + +2023-02-18 G. Branden Robinson + + [build]: Detangle "pdfroff" and "gropdf" configuration (2/2). + + * m4/groff.m4: Give pdfroff its own Autoconf macros to handle + dependency checking, build objectives, and user notice. + (GROFF_PDFROFF_DEPENDENCIES_CHECK): New macro requires + `GROFF_AWK_PATH` and `GROFF_GHOSTSCRIPT_PATH`, determines + whether pdfroff can be used at build time, and (if not) + constructs part of message to be shown to user explaining why. + (GROFF_PDFROFF_PROGRAM_NOTICE): New macro requires + `GROFF_PDFROFF_DEPENDENCIES_CHECK` and emits message if needed. + (GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE): Drop mention of impact + on pdfroff since its dedicated notice covers this now. + * configure.ac: Call the new macros at appropriate times. + Produce a new Automake macro, `USE_PDFROFF`, to replace + inapposite use of `USE_GROPDF` in pdfmark.am. + * contrib/pdfmark/pdfmark.am: Use `USE_PDFROFF` instead of + `USE_GROPDF`. + +2023-02-18 G. Branden Robinson + + [build]: Detangle "pdfroff" and "gropdf" configuration (1/2). + + * m4/groff.m4 (GROFF_GROPDF_DEPENDENCIES_CHECK): Add + `AC_REQUIRE`ment on `GROFF_URW_FONTS_CHECK`. Per discussion + with Deri James, if _either_ Ghostscript or the URW fonts are + avilable, gropdf will be fully functional, consequent to commit + d5515, 22 June. Drop dependency on awk; it is used only at + configuration time (in an Autoconf macro) and since Savannah + #62775 was resolved (19 September), it has not been strictly + necessary. (It is useful for searching more locations for URW + fonts, but several others are searched even if it is absent.) + Stop populating notice text here, instead moving it... + (GROFF_GROPDF_PROGRAM_NOTICE): ...here, since it no longer needs + to be dynamically constructed. + + Continues . Thanks to + Deri James for the continued discussion. + +2023-02-18 G. Branden Robinson + + [build]: Rename `GROFF_CHECK_GROPDF_PROGRAMS` macro to + `GROFF_GROPDF_DEPENDENCIES_CHECK` to generalize for greater + accuracy in forthcoming change. + + * configure.ac: + * m4/groff.m4: Do it. + +2023-02-18 G. Branden Robinson + + [gropdf]: Don't run automated tests if 'gropdf' will be + operating with reduced function. If neither Ghostscript nor the + URW fonts are available at configuration time, there is no point + testing for successful build-time population of the font + descriptions for the default and URW foundries. + + * font/devpdf/devpdf.am (font_devpdf_TESTS) [USE_GROPDF]: Run + "check-default-foundry" only if gropdf is fully functional. + (font_devpdf_TESTS) [USE_GROPDF && HAVE_URW_FONTS]: Run + "check-urw-foundry" only if the URW fonts were found. + + Continues . Thanks to + Deri James for the continued discussion. + +2023-02-18 G. Branden Robinson + + [gropdf]: Rename tests to more accurately characterize their + purpose. + + * font/devpdf/tests/basic-fonts-present.sh: + * font/devpdf/tests/urw-fonts-present.sh: Rename these... + * font/devpdf/tests/check-default-foundry.sh: + * font/devpdf/tests/check-urw-foundry.sh: ...to these. + * font/devpdf/devpdf.am (font_devpdf_TESTS): Reflect rename. + +2023-02-18 G. Branden Robinson + + [gropdf]: Revise tests to be foundry-focussed. + + * font/devpdf/tests/basic-fonts-present.sh: Stop trying to match + font descriptions in the "devps" directory with ones in + "devpdf"; instead, test whether "BuildFoundries" did its job. + Test for font descriptions corresponding to the full 35 + PostScript Level 2 font repertoire, plus groff's "EURO". + * font/devpdf/tests/urw-fonts-present.sh: Drop stale comment and + rename variable for better parallelism with the other test + above. + + Continues . Thanks to + Deri James for the continued discussion. + +2023-02-18 G. Branden Robinson + + [man]: Tweak fix to Savannah #63768. + + * tmac/an.tmac (MR): Ensure `an*url` always has a value, + defaulting to "format 1" (man:page(section)). Resequence the + macOS URL formats to sort the contemporary one before the + others. + * tmac/man.local: Reflect resequencing of integer assignments to + formats. Clarify historicity of annotations. + + Continues . Thanks to + John Gardner for further discussion. + +2023-02-16 G. Branden Robinson + + [ms]: Port a test to Solaris 11 sed. + + * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Put + newlines after opening braces in sed scripts. macOS and GNU sed + tolerate their absence, but this sed does not. + * HACKING: Document this problem. + +2023-02-16 G. Branden Robinson + + * src/roff/groff/groff.am (groff_TESTS) [!USE_GROHTML]: Don't + test the 'grohtml' driver if we know it won't work. + +2023-02-16 G. Branden Robinson + + * src/roff/groff/tests/\ + device_control_escapes_express_basic_latin.sh: Use printf(1), + which is often a shell built-in command, more consistently. + Double backslashes intended as literals in the format string, + and single-quote format strings using them. Fixes test failure + seen on Solaris 11 with GNU Bash 4.4 and ksh 93u+ (2012-08-01). + +2023-02-15 G. Branden Robinson + + * tmac/tests/an_use-input-traps-correctly.sh: Explicitly test + `SM` and `SB` with 'ps' output device. If one set + GROFF_TYPESETTER=utf8 in the test environment, these test cases + would fail. Thanks to John Gardner for the report. + +2023-02-15 G. Branden Robinson + + * configure.ac: Add Automake conditional, `HAVE_GHOSTSCRIPT`, so + that we can populate the list of PDF device font tests + dynamically. Call new macro + `GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE`. Call + `GROFF_GHOSTSCRIPT_VERSION_NOTICE` after it, but before + `GROFF_URW_FONTS_NOTICE`. + * m4/groff.m4 (GROFF_AWK_NOTICE): New macro produces warning if + no awk could be found. This reduces gropdf functionality, but + so do missing URW fonts, so we report this problem separately. + Report the names under which we sought it, since there's a + configure script option for that. + (GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE): New macro explains + consequences of missing optional dependency on Ghostscript + program: reduced grohtml functionality, nonfunctional pdfroff. + Report the names under which we sought it, since there's a + configure script option for that. + (GROFF_CHECK_GROPDF_PROGRAMS): Better characterize gropdf's + reduced function, pointing out the ways in which it would be + more useful if the dependencies were met. Also simplify the + computational grammar. + (GROFF_URW_FONTS_NOTICE): Identify 'U' as the foundry name + gropdf uses for the URW fonts. Confirm continuing availability + of most recent URW fonts release; bump date. + * font/devpdf/devpdf.am: Test availability of "basic" (PDF base + 14) fonts (plus groff's "EURO") if either Ghostscript or URW + fonts are available. Test availability of URW fonts (35) only + if Ghostscript _and_ the URW fonts were found at configuration + time. + + Fixes . Thanks to Deri + James for the report and extremely helpful pseudocode. + +2023-02-15 G. Branden Robinson + + * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK, + GROFF_URW_FONTS_NOTICE): Add macro dependency on + `GROFF_GHOSTSCRIPT_PATH`, which should have been there already. + (GROFF_GROHTML_PROGRAM_NOTICE): Add macro dependency on + `GROFF_CHECK_GROHTML_PROGRAMS`, which should have been there + already. + + (GROFF_CHECK_GROHTML_PROGRAMS, GROFF_PNMTOOLS_CAN_BE_QUIET): + Move `AC_REQUIRE` expansions to precede shell variable + assignments (after checking that the required macros don't + clobber the assignments we're making). + +2023-02-15 G. Branden Robinson + + * font/devpdf/tests/basic-fonts-present.sh: Revise test again, + per feedback from Deri James. Even without Ghostscript or URW + fonts available, gropdf can generate valid PDF documents; it + simply can't embed fonts in general (without further + arrangements made on the host system), which means it is + restricted to the PDF base 14 fonts. That's enough for many + purposes, including generating our compiled man pages document + {with minor degradations to the typeface lists in gropdf(1) and + grops(1)}. Drop the 'gs' command check, which also didn't check + for the name of the Ghostscript interpreter determined by the + "configure" script. Replace dynamically generated font list + with a static one (the base 14 fonts plus groff's EURO). + +2023-02-13 G. Branden Robinson + + * font/devpdf/tests/basic-fonts-present.sh: Revise test. + Improve explanation of why we're looking for the gs(1) command + in a font availability test. Prefix diagnostic output with name + of test script. Perform a search for the 'ps' device font + descriptions that will work in more build scenarios (i.e., don't + assume an out-of-tree build taking place in an immediate + subdirectory of the source). Distinguish failure to find the + font descriptions from a failure to locate the 'gs' command, + skipping the test in both scenarios. Reduce noise in output. + * m4/groff.m4 (GROFF_CHECK_GROPDF_PROGRAMS): Revise warning + issued when awk and Ghostscript are unavailable; gropdf will not + be completely inoperative. Characterize its reduced function. + + Thanks to Deri James in for prompting me to take a + another look at this. + +2023-02-13 G. Branden Robinson + + * tmac/tests/latin2_works.sh: + * tmac/tests/latin5_works.sh: + * tmac/tests/latin9_works.sh: Port to work around macOS's + apparently POSIX non-conforming 'od' command. Use single-byte + octal output format instead of "character", and update test + expectations accordingly. Apparently gratuitously, macOS also + puts more spaces after the octal address field when using this + output format. + * HACKING: Document, and elaborate upon, this problem. + +2023-02-13 G. Branden Robinson + + [mdoc]: Port a test to work with macOS sed. + + * tmac/tests/doc_heading-font-remapping-works.sh: Put semicolons + between commands and closing braces in sed script. Put each of + multiple closing braces on a separate input line, because macOS + doesn't accept them otherwise. Resolves test failure observed + on macOS. + * HACKING: Document the closing brace sequence problem. + +2023-02-13 G. Branden Robinson + + [man]: Port a test to work with macOS sed. + + * tmac/tests/an_TS-adds-no-vertical-space.sh: Put semicolons + between commands and closing braces in sed script. Separate + command stream into multiple '-e' expressions, breaking them + after branch and label commands. Resolves test failure observed + on macOS. + * HACKING: Document the above problems. + +2023-02-13 G. Branden Robinson + + * src/roff/groff/tests/\ + some_escapes_accept_newline_delimiters.sh: Weaken regexes in two + test cases to accommodate excessive output from macOS's 'od' + command. Resolves test failure seen on macOS. + * HACKING: Add section "Writing Tests" and document the above + since this is the second time I've cracked my shin on this. + +2023-02-13 G. Branden Robinson + + * font/devpdf/tests/basic-fonts-present.sh: Skip test if 'gs' + command not available. The test is to ensure that gropdf will + produce sound documents using the base fonts from PostScript, + but since gropdf requires Ghostscript to do this (as noted in + our "./configure" messages), it makes no sense to validate font + availability if the program is absent. Resolves test failure + seen on macOS with minimal dependencies installed. + +2023-02-12 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjustment): Say more + about the consequences of a break. + + Fixes . Thanks to Dave + Kemper for the report. + +2023-02-12 G. Branden Robinson + + [docs]: Re-re-christen 'ESCAPE_AMPERSAND' ('\&'). Now call it a + {non-transparent} "dummy character". Also rechristen + 'ESCAPE_RIGHT_PARENTHESIS', ('\)') as the "transparent dummy + character"; it has no impact on sentence-ending detection. + + * doc/groff.texi: + * doc/meref.me.in: + * man/groff.7.man: + * man/groff_diff.7.man: + * man/roff.7.man: + * src/preproc/refer/refer.1.man: + * tmac/groff_man.7.man.in: Do it. + + Fixes . Thanks to Dave + Kemper for the report and to the groff mailing list for the + vigorous discussion. I don't expect my solution to please + everyone. + +2023-02-11 G. Branden Robinson + + * tmac/an.tmac: Add internal register `an*MR-URL-format` to + select from a few known formats of man page hyperlink. There + are three known on macOS, and one used everywhere else. + * tmac/man.local: Document this feature so macOS users can enjoy + the OSC 8 hyperlink feature if their terminal application + supports it. + + I hope that this feature will be a temporary measure while macOS + implements support for the man page URL format used everywhere + else in the world. + + Fixes . Thanks to John + Gardner for the report, research, consultation, and testing. + +2023-02-11 Deri James + + [BuildFoundries]: Fails if neither ghostcript nor URW fonts + are installed. + + * font/devpdf/util/BuildFoundries.pl: When the change to hold + paths in an array, rather than a delimited string (see commit + 4ae4aeb6555f4f16c28fcb03eb1f56577826054c), the FindGSpath + subroutine should return a pointer to an empty array when the + call to ghostscript fails, rather than return an empty string, + as was done previously. + + See ; thanks to Bruno Haible for the report. + +2023-02-09 G. Branden Robinson + + Switch to using system's assert.h header file. It is futile to + attempt to preserve compatibility with ISO C90 systems by + providing a bespoke predicate-reporting assert() (a C99 feature) + when gnulib, which we require, itself demands C99. This ensures + that `static_assert` remains defined so that gnulib can use it. + Thanks to Bruno Haible for the consultation. + + + * src/include/assert.h: Delete. + + * src/devices/grodvi/dvi.cpp: + * src/devices/grolbp/lbp.cpp: + * src/devices/grolj4/lj4.cpp: + * src/include/itable.h: + * src/include/stringclass.h: + * src/libs/libbib/linear.cpp: + * src/libs/libbib/search.cpp: + * src/libs/libdriver/printer.cpp: + * src/libs/libgroff/assert.cpp: + * src/libs/libgroff/color.cpp: + * src/libs/libgroff/errarg.cpp: + * src/libs/libgroff/font.cpp: + * src/libs/libgroff/nametoindex.cpp: + * src/libs/libgroff/prime.cpp: + * src/libs/libgroff/relocate.cpp: + * src/libs/libgroff/searchpath.cpp: + * src/preproc/eqn/box.cpp: + * src/preproc/eqn/delim.cpp: + * src/preproc/eqn/pile.cpp: + * src/preproc/eqn/script.cpp: + * src/preproc/html/pre-html.cpp: + * src/preproc/pic/pic.h: + * src/preproc/preconv/preconv.cpp: + * src/preproc/soelim/soelim.cpp: + * src/roff/groff/groff.cpp: + * src/roff/troff/troff.h: + * src/utils/hpftodit/hpftodit.cpp: + * src/utils/indxbib/indxbib.cpp: + * src/utils/lkbib/lkbib.cpp: + * src/utils/lookbib/lookbib.cpp: + * src/utils/tfmtodit/tfmtodit.cpp: Respell "assert.h" inclusion + with angle brackets instead of quotation marks. + + Fixes . + +2023-02-09 G. Branden Robinson + + * src/roff/troff/input.cpp (token::next): Use correct kind of + null object in comparison. Fixes latent bug that would be + exposed if we were to migrate from zero literals to `nullptr`. + +2023-02-09 Deri James + + [gropdf] Parse multiple entries in 'papersize' as specified in + the groff_font man page. Reported by Ben Wong and fix based on + his patch, thanks. + + * src/devices/gropdf/gropdf.pl: Parse papersize string for + possible multiple (space separated) entries. First valid entry + wins. + + Fixes https://savannah.gnu.org/bugs/?63757 + +2023-02-04 G. Branden Robinson + + Correct numerous typos and solecisms throughout the source tree. + + * ChangeLog: + * ChangeLog.115: + * ChangeLog.116: + * ChangeLog.117: + * ChangeLog.118: + * ChangeLog.119: + * ChangeLog.121: + * ChangeLog.122: + * Makefile.am: * NEWS: - * README.MinGW: - * contrib/groffer/README: + * PROBLEMS: + * README: + * contrib/chem/chem.am: + * contrib/chem/chem.pl: + * contrib/glilypond/README.txt: + * contrib/glilypond/glilypond.pl: + * contrib/hdtbl/groff_hdtbl.7.man: + * contrib/mm/ChangeLog: + * contrib/mm/m.tmac: * contrib/pdfmark/pdfmark.ms: - * contrib/pdfmark/pdfroff.1.man: + * doc/automake.mom: * doc/groff.texi: + * doc/me-revisions: * doc/webpage.ms: - * m4/groff.m4: + * m4/lib-link.m4: + * man/groff.7.man: * man/groff_diff.7.man: - * man/groff_tmac.5.man: * man/roff.7.man: + * src/devices/grohtml/post-html.cpp: + * src/devices/grolbp/lbp.h: + * src/devices/gropdf/TODO: + * src/devices/gropdf/gropdf.1.man: + * src/devices/gropdf/gropdf.pl: + * src/devices/xditview/ChangeLog: + * src/devices/xditview/xditview.c: + * src/libs/libdriver/input.cpp: + * src/libs/libgroff/glyphuni.cpp: + * src/preproc/eqn/eqn.1.man: + * src/preproc/grn/gprint.h: + * src/preproc/grn/main.cpp: * src/preproc/html/pre-html.cpp: - * src/roff/troff/troff.1.man: Change "UNIX" to "Unix", - discarding markup as necessary. + * src/preproc/preconv/preconv.cpp: + * src/preproc/tbl/table.cpp: + * src/roff/groff/pipeline.c: + * src/roff/groff/tests/substring_works.sh: + * src/roff/groff/tests/ + use_point_size_escape_with_single_digit_arg.sh: + * src/roff/troff/div.cpp: + * src/roff/troff/input.cpp: + * src/roff/troff/troff.1.man: + * src/utils/grog/grog.pl: + * src/utils/indxbib/indxbib.cpp: + * src/utils/tfmtodit/tfmtodit.1.man: + * tmac/doc-old.tmac: + * tmac/doc.tmac: + * tmac/groff_man.7.man.in: + * tmac/hyphen.fr: Do it. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2023-02-04 G. Branden Robinson + + [tbl]: Drop XFAIL test. It was written with an unclear + understanding of how DWB (AT&T) and Heirloom Doctools troff + behaved. The individual checks might come back, modified. + + * src/preproc/tbl/tests/table-lacks-spurious-top-border.sh: + Delete. + + * src/preproc/tbl/tbl.am (tbl_TESTS): Drop it. + (tbl_XFAIL_TESTS, XFAIL_TESTS): Drop now empty assignment and + unnecessary update, respectively. + +2023-02-04 Bertrand Garrigues + + Update gnulib submodule + + gnulib now points on sha1 4e9fcc7b84fcac07a3e5a3cd5f66d1ff320dc8e8 + +2023-02-03 G. Branden Robinson + + [tbl]: Fix bugs using boxes or vertical rules at table edges on + nroff devices, particularly when combined with region or column + expansion. + + * src/preproc/tbl/table.h (class table): Add `GAP_EXPAND` + enumeration constant. James Clark seems to have designed GNU + tbl carefully to avoid distinguishing region expansion from + column expansion in a categorical way, but I needed a way for + formatting-time logic to know which was in use. (Column + expansion, the "x" modifier, expands columns--i.e., text. + Region expansion expands [or compresses] the _gaps_ between + columns.) + * src/preproc/tbl/main.cpp (process_options): Set `GAP_EXPAND` + flag in table if "expand" region option seen. + * src/preproc/tbl/table.cpp: Add new macro `LEFTOVER_FACTOR_REG` + to name a new roff register for the remainder of gap-expansion + space when the amount of space available for expansion is + divided by the number of gaps. + (table::compute_overall_width): If _not_ expanding a table in + either respect and in nroff mode, reduce line length by 1n for + each of any left and right border (because the vertical lines + eat character cells). This prevents bordered or boxed tables + from being overset even when they use neither expansion feature. + (table::compute_separation_factor): If gap-expanding a table, + store any remainder from the division used to compute the + separation factor into the new `LEFTOVER_FACTOR_REG`. + (table::compute_column_positions): Insert that remainder into + the gap before the last (rightmost) column of the table. This + _could_ be done more elegantly by spreading each en in a + symmetric way across a subset of the gaps. (It is necessarily a + subset by the pigeonhole principle.) But it didn't seem worth + the effort for a feature (region expansion) that few users + employ. (Usually what you want is the "x" column modifier.) + Alternatively, "forget it, Jake--it's a terminal emulator". + + * src/preproc/tbl/tbl.am (tbl_XFAIL_TESTS): Remove now-passing + tests. -2018-11-10 G. Branden Robinson + Fixes and + . + +2023-02-03 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::compute_column_positions): + Stop multiplying the gaps at the left and right edges of a table + {which occur when it is boxed or has a leading and/or trailing + vertical line} by the column separation factor. Only interior + column gaps should be spread. This change prevents tables using + the "expand" region option from being overset (exceeding the + line length), but might not (yet) fully expand to that length on + low-resolution devices due to integer roundoff. + +2023-02-03 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::compute_total_separation) + (table::compute_separation_factor, table::compute_widths): Add + comments to generated roff output to assist the mystified user. + +2023-02-03 G. Branden Robinson + + [tbl]: Refactor. + + * src/preproc/tbl/table.cpp: + * src/preproc/tbl/table.h: Rename `compute_expand_width` to + `compute_overall_width`, since this member function is used on + _all_ tables, not just those undergoing column or gap expansion. + For instance, in a post-groff 1.22.4 development, it throws a + diagnostic if an unexpanded table overruns the line length. + * src/preproc/tbl/table.cpp (table::compute_widths): Update call + site of `compute_overall_width`. + * src/preproc/tbl/table.cpp: Split the roff register behind the + `EXPAND_REG` C++ preprocessor macro into two, adding + `AVAILABLE_WIDTH_REG`. Annotate the distinction. + (compute_overall_width): Annotate. Move and conditionalize + logic so as not to produce as much unnecessary roff output. - man pages: Escape interpolated Make variables. +2023-02-03 G. Branden Robinson - * makevarescape.sed: Transform - to \-, ~ to \(ti, and so forth, - {with an extra layer of backslashes--see below} so that Makefile - variables containing ASCII characters that do not represent - themselves literally in *roff (see groff_char(7)) are correctly - interpolated into man page text. + * src/preproc/tbl/main.cpp (main): Avoid reading from invalid + memory upon failure to open an input file. - * Makefile.am (.man): Transform Makefile variables with the - above script when interpolating them into man page text. + Fixes . - Note that while the script, combined with this target, will - transform ` to \(ga, including grave accents in Makefile - variables is likely to fail when the shell lexes the argument to - echo within the old-style command substitution ``. Testing - shows that grave accents should work[1] if POSIX-style command - substitution $() is done instead. However, $() is less - portable. (Triple-escaping grave accents \\\` inside the - interpolated Makefile variable will work, but is not attempted - at present.) +2023-02-03 G. Branden Robinson - Note also that the amount of backslash-escaping in the sed - script is excessive (and incorrect) for normal purposes, but - required here because a command substitution is being nested - inside yet another invocation of sed. + * src/preproc/eqn/lex.cpp (get_delimited_text): Avoid reading + from invalid memory when throwing diagnostic. Duplicate + `filename` string, then free it on all paths out of function. - {1} For this target; no assurances about the good behavior of - unusual characters in Makefile variables in other aspects of the - groff build are offered. + Fixes . - Fixes . +2023-02-03 G. Branden Robinson -2018-11-06 G. Branden Robinson + [tbl]: Add more tests. - * src/utils/lookbib/lookbib.cpp: Doesn't make much sense to mark - Version_string as a C extern if you're just going to hide it in - a throwaway scope again. Remove braces, exposing it. + * src/preproc/tbl/tests/boxes-and-vertical-rules.sh: + * src/preproc/tbl/tests/expand-region-option-works.sh: + * src/preproc/tbl/tests/x-column-modifier-works.sh: Do it. - "lookbib -v" now reports a version number, instead of "(null)". + * src/preproc/tbl/tbl.am (tbl_TESTS): Run tests. + (tbl_XFAIL_TESTS): Add; future changes will resolve these. - Fixes . +2023-02-02 G. Branden Robinson -2018-11-06 G. Branden Robinson + * src/preproc/tbl/table.cpp (table::compute_column_positions): + If a table has "left separation" (it is boxed, or has a vertical + rule on the left-hand side), increase the first column's start + register value by 1n, for symmetry with the right-hand size. - * src/libs/libgroff/error.cpp (do_error_with_file_and_line): - If: - a program name is known; - but - no file is being processed or the line number is negative, - then there was no space between the program name (with colon), - and the succeeding diagnostic message. + * src/preproc/tbl/tests/check-horizontal-line-length.sh: + * src/preproc/tbl/tests/check-line-intersections.sh: + * src/preproc/tbl/tests/check-vertical-line-length.sh: Update + output expectations. - Example: lookbib:fatal error: no databases + * src/preproc/tbl/tbl.am (tbl_XFAIL_TESTS): Remove now-passing + test. - Fixes . + See for background. -2018-11-05 G. Branden Robinson +2023-02-02 G. Branden Robinson - Make strip.sed operate only if given permission. + * src/preproc/tbl/table.cpp (table::compute_total_separation): + Trivially refactor; rename loop indices so it's obvious which + dimension of a matrix they're referring to. - * tmac/strip.sed: Do nothing whatsoever to any input file that - lacks a line matching "%beginstrip%". This implements a - contract between the macro file writer and the stripper script - {roff input is not parseable with crude weaponry like regular - expressions}. In practice, most of the changes performed by the - script were already in a block enforcing this. My changes: - - Stop unconditionally inserting a roff comment noting the - reader of stripping at line 2. Instead, replace the line - matching "%beginstrip%" with this comment if and only if it - is present. - - Stop deleting lines containing only the empty request if - they occur before "%beginstrip%". - - Tweak the wording of the roff comment. - - Remove comment within the sed script; see - https://lists.gnu.org/archive/html/groff/2017-11/msg00057.html - and the sed section of "Limitations of Usual Tools" in the - GNU Autoconf Manual. +2023-02-02 G. Branden Robinson - Invalidates . + * src/preproc/tbl/table.cpp (table::determine_row_type) + (table::compute_widths, table::do_row): Boolify some local ints. -2018-11-04 G. Branden Robinson +2023-02-02 G. Branden Robinson - * tmac/an-old.tmac: When emitting diagnostics, report the name - of the macro file complaining, and the name and line number of - the input file at the time of trouble. Thanks to Bjarni Ingi - Gislason for part of the patch. + [tbl]: Refactor handling of vertical lines in format. Validate + input more strictly. Add diagnostics when vertical lines are + redundant with box borders. - Fixes and continues the - long process of fixing . + * src/preproc/tbl/main.cpp (process_format): Shift diagnostic + about excess vertical lines in a sequence at the beginning of a + row description to later, after the first proper column + descriptor has been interpreted. Normalize a sequence of more + than two consecutive vertical lines to 2 when they occur at the + beginning of a row description. Unconditionally update + `list->vline` and reset `vline_count` once we start looking for + modifiers, since we know we've finished any sequence of vertical + lines, and at the end of a row definition. Rename and retype + loop variable int `success` to Boolean + `is_valid_modifier_sequence`. Drop now-invalid assertion. + * src/preproc/tbl/table.cpp (table::add_vlines): Throw new + diagnostics when vertical lines are redundant with box borders. + Add assertion to ensure we got a valid vertical line value (0, + 1, or 2) from `process_format`. Throw these only once per table + format, not for every row. -2018-11-04 G. Branden Robinson +2023-01-30 G. Branden Robinson - * doc/meintro_fr.me: Add encoding hint to top of file so preconv - works correctly even if the build environment's encoding is not - UTF-8. Adapted from Bjarni Ingi Gislason's patch. Also add - long-form Emacs coding declaration at end of file. Vim's - auto-detection seems to be fine, so did not update its modeline. + * src/preproc/tbl/main.cpp (process_table): Trivially refactor. + Rename `form` to `fmt` to imply "format", not "form". - Fixes . +2023-01-30 G. Branden Robinson -2018-11-04 G. Branden Robinson + * src/preproc/tbl/main.cpp (process_format): Throw error + diagnostic if more than 2 vertical lines are specified at the + beginning of a row definition. - * tmac/groff_man.7.man: Reorganize and largely rewrite to more - precisely document the macro package's behavior and to be more - helpful and accessible to man page writers who may never read - any other groff documentation. + Fixes . -2018-10-25 G. Branden Robinson +2023-01-30 G. Branden Robinson - Clarify meaning of \p escape. Also make more explicit that line - adjustment for the .brp request and \p escape depends on the - current adjustment mode. + * src/preproc/tbl/main.cpp (process_format): Recast diagnostic + message to refer to character by its Unicode name and generalize + to accurately cover additional circumstance of excess '|' + symbols at end of row definition. - * doc/groff.texi: Clarify that \p has effect at the next word - boundary. Thanks to Dave for pointing out the issue and - providing elucidating language. +2023-01-29 G. Branden Robinson - * man/groff.7.man: Similar, but terser. + * doc/ms.ms: Remove redundant initializations. - Fixes https://savannah.gnu.org/bugs/index.php?54894. +2023-01-29 G. Branden Robinson -2018-10-04 Deri James + * doc/ms.ms: Define appropriate hyphen-minus mapping on 'cp1047' + output device. - Savannah bug # 54812 +2023-01-26 G. Branden Robinson - * font/devpdf/util/BuildFoundries.pl: If a font is not found - report list of paths searched. + * tmac/s.tmac (TE): Enable no-space mode after outputting the + display distance vertically, replacing any inter-paragraph + distance that might follow. - Fix https://savannah.gnu.org/bugs/?54812 +2023-01-24 G. Branden Robinson -2018-10-10 Bertrand Garrigues + [grohtml]: Fix misleading diagnostic message. - Update 'gnulib' submodule. + * src/preproc/html/pre-html.cpp (main): The suggestion should be + to re-run the formatter (groff, troff), not "pre-grohtml", with + a different output driver since the document may be malformed. - * gnulib: now points on dce8759f0f0236a860a3e68b63c5e99cc6f168f9 - from 'gnulib' repository. This fixes build error with glibc 2.28 - (see https://bugzilla.redhat.com/show_bug.cgi?id=1595702). +2023-01-11 G. Branden Robinson -2018-10-04 Deri James + * src/preproc/tbl/main.cpp (process_format): Fix code hygiene + nit: nullify `list` pointer after freeing its target. - Savannah bug # 54779 +2023-01-11 G. Branden Robinson - * font/devpdf/Foundry.in: Recent ghostscript changed name - used for embedding groff font HNBI + [tbl]: Really fix Savannah #63449. - Fix https://savannah.gnu.org/bugs/?54779 + * src/preproc/tbl/main.cpp (process_format): "Or" on the + `HAS_TOP_VLINE` flag if the format specification begins with a + "|"; the beginning is a separate state in the FSM used to parse + the description. I missed it in commit 0e93ab4102, 1 December. -2018-08-27 Ingo Schwarze + Fixes . - * tmac/groff_www.7.man: Do not use .URL, .MTO, .FTP. +2023-01-10 G. Branden Robinson -2018-08-21 Ingo Schwarze + * src/preproc/tbl/tests/\ + do-not-overdraw-page-top-in-nroff-mode.sh: Correct erroneous + check of test output, and add two more test cases. - Improve terminal rendering for a few special characters: +2023-01-08 G. Branden Robinson - * tmac/tty.tmac: add \[.j] (dotless j) - * tmac/tty-char.tmac: for \[a.], fall back to "." - * tmac/tty-char.tmac: add playing card suits + * tmac/an-ext.tmac: Move the saving of the hyphenation mode from + the "top level" to... + (mY): ...this new macro. + (SY, mQ, MR): Call `mY` before disabling hyphenation. -2018-08-16 Ingo Schwarze + Problem introduced by me in commit 096c2f0567, 16 February. + "an-ext.tmac" gets sourced by "an.tmac" before any + command-line setting of the `HY` register is handled, so (for + groff) the stored hyphenation mode was the default for the + language, not reflecting user disablement. The synopsis macros, + which do not have an alternate implementation in "an.tmac" for + leverage of groff features, were causing hyphenation to be + resurrected (after `YS`) even if the user had disabled it. + Saving the hyphenation mode anew upon entry to these macros is + arguably inefficient, but it is more correct since a man page + could conceivably manipulate the automatic hyphenation mode + {even if that's not recommended outside of tbl(1) text blocks}. - * src/preproc/preconv/preconv.1.man: add -D to the SYNOPSIS +2023-01-08 G. Branden Robinson -2018-08-09 Ingo Schwarze + [man]: Add regression test for hyphenation getting wrongly + restored by `YS`, `ME`, `UE`, and `MR` macros. - * Makefile.am: correctly calculate MAJOR_VERSION etc. + * tmac/tests/an_HY-register-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2018-06-19 Deri James +2023-01-03 G. Branden Robinson - Fixes to gropdf + * tmac/mdoc/doc-common (Sh, Ss): Narrow scope of font remappings + lexically and restrict remapping to the heading font family (if + any) to avoid undesired remapping of fonts in page headers if, + say, a (sub)section heading begins just prior to a page + break--which is ugly anyway and should be avoided, but the + package has no keep macros and solving that problem in an + automatic way promises to be complex. - * src/devices/gropdf/gropdf.pl: Make default line width 0.4pt - to match grops. Use 'S' operator (stroke) rather than 's' (close - and stroke) when Dl command received. Improve switching between - text and graphic modes. +2023-01-03 G. Branden Robinson -2018-07-01 Bertrand Garrigues + * tmac/an.tmac (MT, UR): Throw style warning if macro called + without (exactly one) argument. - [me] paragraph with umlaut incorrectly rendered +2022-12-27 G. Branden Robinson - * tmac/e.tmac-u: workaround done by Werner LEMBERG . + * doc/doc.am (doc/groff-man-pages.pdf): Set (sub)section + headings in Helvetica bold in compiled man pages, as a test and + demonstration of the `HF` feature's application to both man(7) + and mdoc(7) documents. - Fix https://savannah.gnu.org/bugs/?42191 +2022-12-27 G. Branden Robinson -2018-06-19 Deri James + [mdoc]: Support `HF` string. - Add gropdf new features to NEWS file. + * tmac/doc.tmac (initialization): Add logic supporting `HF` + string just as our man(7) implementation does. If the font name + ends with `B` (as the default does), set + `doc-remap-I-style-in-headings` register and extract font + family, which can be empty (as is the default). + * tmac/mdoc/doc-common (Sh, Ss): If + `doc-remap-I-style-in-headings` register set, perform (and + unwind) font remapping of italic to bold-italic face. + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Define `doc-Sh-font` in terms of `HF`. - * NEWS: new features. + * tmac/tests/doc_heading-font-remapping-works.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. -2018-05-29 Werner LEMBERG + * tmac/groff_mdoc.7.man (Options): Document it. + * NEWS: Update item. - [dvi] Fix glyph map for `cmitt10'. + Fixes last part of . - Problem reported by Pali Rohár . +2022-12-26 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2018-05/msg00088.html + [tmac]: Revise "fallback" character definitions in several + respects for Unicode characters from General Punctuation block. - * font/devdvi/texitt.map: New file. This is identical to - `textt.map' except the dollar glyph, which gets replaced by the - pound glyph. + * tmac/fallbacks.tmac: Comment out fallbacks for U+200B, U+2010, + U+2011, and U+201[89CD], due to ineffectuality or apparent groff + bugs. Redefine U+2012 fallback to include hair space (\^) + around synthetic figure dash. Redefine U+2016 to use `\[ba]` + special characters instead of ordinary `|` characters to dodge + possible character translations by user. - * font/devdvi/generate/Makefile (CWI): Use `texitt.map'. + Fixes part of . Thanks to + Dave Kemper for the (multifarious) discussion. - * font/devdvi/CWI: Regenerated. +2022-12-25 G. Branden Robinson -2018-05-07 G. Branden Robinson + * doc/groff.texi (Invoking groff, Built-in Registers): + * man/groff.7.man (Writable predefined registers): + * src/roff/groff/groff.1.man (Environment): + * src/roff/troff/troff.1.man (Environment): Replace erroneous + reference to ctime(3) with localtime(3). - Improve diagnostics on bad hyphenation requests. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * src/roff/troff/env.cpp: Add new HYPHEN_* symbols to anonymous - enum. +2022-12-19 G. Branden Robinson - * src/roff/troff/env.cpp (hyphenate_request): - - Warn about hyphenation request values that are completely - out of range. - - Report bad hyphenation request value in diagnostic messages. + [tests]: Fix potential problem(s) in trap handler. -2018-04-28 G. Branden Robinson + * src/roff/groff/tests/smoke-test_html_device.sh: Move call of + `cleanup` function from end of script to after the tests that + generate temporary files have been run, and before script + possibly exits with status 77 to skip some checks. Within trap + handler, mask trapped signals while running handler. + (cleanup): Reset trap dispositions to default after removing + files; once the temporary files are gone, we no longer need a + trap handler. One might already be running however, and this + ensures that its "suicide" ("kill -s INT $$") will succeed. - grap2graph: Parallelize changes with pic2graph. +2022-12-18 G. Branden Robinson - * contrib/grap2graph/grap2graph.sh: - - Refactor temp directory handling. - - Handle embedded whitespace in temp dir. - - Adapt to old convert(1) programs. + [mdoc]: Support `FT` register. - * contrib/grap2graph/grap2graph.1.man: Make editorial/style - changes and minor corrections. + * tmac/doc.tmac (initialization): Add logic supporting `FT` + register just as our man(7) implementation does. + * tmac/mdoc/doc-common (doc-set-up-titles): Plant footer trap in + validated user-requested location. + * tmac/groff_mdoc.7.man (Options): Document it. + * NEWS: Update item. -2018-04-26 G. Branden Robinson + Fixes part of . - eqn2graph: Remove -unsafe option. +2022-12-18 G. Branden Robinson - * contrib/eqn2graph/eqn2graph.sh: Unrecognize "-unsafe" option - and eliminate $groff_opts variable. As far as I can tell, this - option had no effect because (1) pic is not run on the input - stream (no -p argument to groff); (2) eqn doesn't support - "shelling out" as pic does; and (3) there is no way to embed - *roff requests inside a sequence of eqn commands. If I'm wrong, - let me know. + * tmac/an.tmac: Fix code style nit: use `as` requests to + avoid overlong input lines. - * contrib/eqn2graph/eqn2graph.1.man: Undocument "-unsafe" - option. +2022-12-17 G. Branden Robinson -2018-04-26 G. Branden Robinson + * tmac/doc.tmac: Inform user we're ignoring their "-rD1" setting + if also formatting HTML; parallels groff man(7) behavior. - eqn2graph: Parallelize changes with pic2graph. +2022-12-17 G. Branden Robinson - * contrib/eqn2graph/eqn2graph.sh: - - Refactor temp directory handling. - - Handle embedded whitespace in temp dir. - - Adapt to old convert(1) programs. + * tmac/doc.tmac: Trivially refactor. Relocate handling of `D` + command-line register to prepare for greater synchronization + with groff man(7). - * contrib/eqn2graph/eqn2graph.1.man: Make editorial/style - changes and minor corrections. +2022-12-17 G. Branden Robinson -2018-04-25 G. Branden Robinson + * src/preproc/tbl/table.cpp: Trivially refactor. Rename + {portion of} internal register to include an interword hyphen + for readability. - pic2graph: Refactor temp directory handling. +2022-12-16 G. Branden Robinson - * contrib/pic2graph/pic2graph.sh: Issue a diagnostic and give up - if the user's desired temporary directory does not exist. Also - document the Bashism $RANDOM and work around its absence. + [ms]: Change default line length to 6.5 inches. -2018-04-25 G. Branden Robinson + * tmac/s.tmac (par@load-init): Do it. - pic2graph: Handle embedded whitespace in temp dir. + * doc/groff.texi (ms Document Control Settings): + * doc/ms.ms (Document control settings): + * tmac/groff_ms.7.man (Document control settings): Document it. - * contrib/pic2graph/pic2graph.sh: Quote shell variables having - to do with the temporary directory's location; without - quotation, temporary directory names with embedded whitespace - are wrongly handled. + * tmac/tests/s_honor-MINGW-when-two-columns.sh: + * tmac/tests/s_mark-column-start-correctly.sh: Update test + expectations. -2018-04-24 G. Branden Robinson + * NEWS: Add item. - * doc/groff.texi: Bump end of copyright range to 2018. Werner - added substantial text this year about hyphenation. +2022-12-15 G. Branden Robinson -2018-04-24 G. Branden Robinson + * tmac/an.tmac (TH): Relocate `an-break-body-text` trap to be + one half-inch above footer (instead of twice the footer + distance). I reason that anyone who customizes `FT` is doing so + to overprint some kind of material at the bottoms of pages, or + simply to make the margin larger. (One then wonders why we + don't have an `HD` register for the top.) Also remove register + when done with it. + * tmac/groff_man.7.man.in (Options) : Document this. - Set version to 1.22.4 in the few places that hard-code it. +2022-12-15 G. Branden Robinson - * arch/mingw/grap2graph.cmd: - * contrib/groffer/version.sh: - * doc/groff.texi: - * doc/webpage.ms: Bump from 1.22.3 to 1.22.4. + * tmac/an.tmac (TH): Trivially refactor. Rename + `an-footer-location` to `an*footer-location` and set page traps + in order descending the page. -2018-04-24 Deri James +2022-12-11 G. Branden Robinson - Restrict scaling factors to 3dp and better handle CR/LF in import. + [mdoc]: Support `X` register. - * src/devices/gropdf/gropdf.pl: Restrict scaling factors to 3dp - rounded. If pdf imported with pdfpic uses CR/LF line termination - ibclude XObject Image, length of stream out by 1. + * tmac/doc.tmac (initialization): Add logic supporting `X` + register just as our man(7) implementation does. + * tmac/groff_mdoc.7.man (Options): Document it. + * NEWS: Update item. -2018-04-23 G. Branden Robinson + Fixes part of . - man pages: Shorten version footer. +2022-12-15 G. Branden Robinson - * **/*.man: Replace "Groff Version" with "groff" in the fourth - argument to .TH in all man pages. This suffices to keep that - part of the footer from overrunning the date, even in dirty - trees on 80-column terminals. + [mdoc]: Add unit test for `X` register. - Fixes https://savannah.gnu.org/bugs/index.php?53721. + * tmac/tests/doc_X-register-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2018-04-23 G. Branden Robinson +2022-12-15 G. Branden Robinson - pic2graph(1): Make editorial/style changes and minor - corrections. + * tmac/doc.tmac (Nm): Fix `if` -> `ie` typo/thinko. -2018-04-23 G. Branden Robinson + Fixes . Thanks to John + Gardner for the report. - pic2graph: Adapt to old convert(1) programs. +2022-12-15 G. Branden Robinson - * contrib/pic2graph/pic2graph.sh: Grep convert's -help output - for the string "-trim". If it is not found, the old method for - image trimming documented in pic2graph's man page, "-crop 0x0", - is used. I am motivated by the fact that the warning about this - in our man page is very old (10 years or more), and I wanted to - get rid of it. + * tmac/tests/doc_Nm-works.sh: Add more checks. - pic2graph emits a warning when performing this fallback, in the - event the ImageMagick and/or GraphicsMagick teams surprise the - world again. +2022-12-13 G. Branden Robinson - * contrib/pic2graph/pic2graph.1.man: Remove BUGS section, the - entire contents of which was dedicated to convert's change in - behavior. + * src/roff/groff/tests/smoke-test_html_device.sh: Add checks for + inlining of images when tbl(1) or eqn(1) used. -2018-04-22 G. Branden Robinson +2022-12-12 G. Branden Robinson - groff_man(7): Expand command synopsis section. + * tmac/andoc.tmac (reload-man): Unplant `doc-break-body-text` + trap, added in commit 892703b17e, 6 September. Its survival + into man(7) pages didn't seem to cause any problems but I have + no confidence that will remain true forever. - This section now explains in detail how to write (and read) a - command synopsis. +2022-12-12 G. Branden Robinson -2018-04-12 Deri James + * tmac/an.tmac (initialization): Fix problem with `FT` register + validation. Small but valid values were being rejected due to + inappropriate use of scaling operator. Also throw user a bone + by expressing what size '1v' is for the output device, in basic + units. - Make PDFPIC behave the same whether -Tps or -Tpdf used. +2022-12-12 G. Branden Robinson - Previously the -Tpdf version did not cause a break nor position - to the line beneath the imported picture, whilst the -Tps - version did. + [man, mdoc]: Fix Savannah #63500. Support use of `P` (initial + page number) register when batch rendering, regardless of + switching macro packages between man(7) and mdoc(7) or setting + of `C` (continuous numbering) register. (`P` without `C` means + "start numbering each rendered document at \n[P]".) - * tmac/pdfpic.tmac: Corrected behavior. + * tmac/an.tmac (an-end): Call `an*break-page-with-new-number` + instead of invoking `bp`. + (an*break-page-with-new-number): If `P` is set and `C` is not, + use value of `P` as the next page number. + (TH): If `C` register is set, remove `P` register after ending a + previous document. + (initialization): If `P` is set, assign the page number using + the `pn` request if the transition to the first formatted page + has not yet occurred; otherwise update page number register `%` + directly. Also ignore it with diagnostic if `ps4html` register + {for grohtml's internal use} is set. Add explanatory comment. - * NEWS: Explain the change of behaviour and how to reinstate - the previous behaviour using register PDFPIC_NOSPACE or the - environment variable GROFF_PDFPIC_NOSPACE. + * tmac/mdoc/doc-common (Dd): If `C` register is set, remove `P` + register after ending a previous document. + (doc-end-macro): Call `doc-break-page-with-new-number` instead + of invoking `bp`. + (doc-break-page-with-new-number): If `P` is set and `C` is not, + use value of `P` as the next page number. + * tmac/doc.tmac (initialization): If `P` is set, assign the page + number using the `pn` request if the transition to the first + formatted page has not yet occurred; otherwise update page + number register `%` directly. Also ignore it with diagnostic if + `ps4html` register (for grohtml's internal use) is set. Add + explanatory comment. -2018-03-27 Bertrand Garrigues + Fixes . - Define a short version for data installation dir name. +2022-12-11 G. Branden Robinson - This is the full version stripped of any characters after the - third digit. Used for installation of font, macro and various - data (by default in /usr/local/share/groff). The various programs - and scripts still use the full version from gnulib script - 'git-version-gen' . + [mdoc]: Support `P` register. - * configure.ac (SHORT_VERSION): short version definition. + * tmac/doc.tmac (initialization): Add logic supporting `P` + register just as our man(7) implementation does. + * tmac/groff_mdoc.7.man (Formatting with groff, troff, and + nroff): Document it. + * NEWS: Update item. - * Makefile.am: use 'SHORT_VERSION' for 'docdir' and 'datasubdir' - definitions. + Fixes part of . -2018-03-11 Bertrand Garrigues +2022-12-11 G. Branden Robinson - Remove doc/automake_migration_tests.txt + [tests]: Add unit tests for man/mdoc `P` register. - Automake migration was completed long time ago and this file is no - longer needed. + * tmac/tests/an_P-register-works.sh: + * tmac/tests/andoc_P-register-works.sh: + * tmac/tests/doc_P-register-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run tests. -2018-03-11 Colin Watson +2022-12-11 G. Branden Robinson - Switch to Gnulib implementation of snprintf + [man, mdoc]: Refactor. Rename a Boolean register to more + clearly communicate its purpose. This also reverses its sense. - This is more actively maintained, straightforward to integrate now - that we have Gnulib integration, and simplifies groff's overall - licensing. + * tmac/an.tmac (TH): Rename `an-is-first-page-of-document` to + `an*need-titles-reset`. Drop redundant store. Reverse sense of + test. + (initialization): Initialize it to zero. - * bootstrap.conf (gnulib_modules): Add `snprintf' and `vsnprintf'. - * configure.ac: Remove local checks for `snprintf' and `vsnprintf'. - * Makefile.am: Remove various comments related to local checks for - `snprintf' and `vsnprintf'. - * src/include/lib.h: Remove declarations of `snprintf' and - `vsnprintf'. - * src/libs/libgroff/libgroff.am (EXTRA_DIST): Remove - `src/libs/snprintf/snprintf.c'. - * src/libs/snprintf/snprintf.c: Remove. + * tmac/mdoc/doc-common (Dd): Rename + `doc-is-first-page-of-document` to `doc-need-titles-reset`. + Drop redundant store. Reverse sense of test. + (initialization): Initialize it to zero. - * LICENSES: Remove section about `src/libs/snprintf/snprintf.c'. - * MANIFEST: Remove entry for `src/libs/libxutil'. +2022-12-11 G. Branden Robinson -2018-03-09 Deri James + [tests]: Add future regression test for header/footer + mishandling that wasn't already covered (not a live bug; was + exposed by attempted refactoring). - PDF must not open in presentation mode. + * tmac/tests/andoc_check-an-to-doc-transition.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - * src/devices/gropdf/gropdf.pl: When GROPDF_NOSLIDE=1 - passed do not set pdf to presentation mode. +2022-12-11 G. Branden Robinson -2018-03-09 Deri James + [man, mdoc]: Trivially refactor. - Allow a "." to signify a missing parameter in .pdftransition + * tmac/an.tmac (an-start-new-document): Rename this... + (an*break-page-with-new-number): ...to reflect its reduced + responsibility. - * src/devices/gropdf/gropdf.1.man: Explain the .pdftransition - macro (and underlying '\X' command) accepts a "." to specify - a parameter retains its current value. + * tmac/mdoc/doc-common (doc-start-new-document): Rename this... + (doc-break-page-with-new-number): ...to reflect its reduced + responsibility. -2018-03-09 Colin Watson +2022-12-11 G. Branden Robinson - man pages: fix incorrect cross-referenced section + [man, mdoc]: Refactor to separate page number management from + header trap management. - * man/roff.7.man (FILE NAME EXTENSIONS): Correct reference to - groff_filenames(5). + * tmac/an.tmac (an-start-new-document): Stop removing + `an-header` trap. + (TH): Clear the trap here even if not continuously rendering, + and call `an-start-new-document`. -2018-03-09 Colin Watson + * tmac/mdoc/doc-common (doc-start-new-document): Stop removing + `doc-header` trap. + (Dd): Clear the trap here even if not continuously rendering, + and call `doc-start-new-document`. - mdate.sh: rewrite in Perl +2022-12-11 G. Branden Robinson - groff already requires perl to build. This version is much shorter - and easier to understand than the shell/awk version: we don't have - to worry about convincing ls to produce output that we can parse, - and we don't have to play games with the way that the same field may - contain either the year or the time depending on how old the file - is. + * tmac/mdoc/doc-common: Refactor for better parallelism with our + man(7) implementation and to prepare for a synchronized change + to both. + (Dd): Move open-coded (inlined) operations from here... + (doc-start-new-document): ...to this new macro. + (doc-end-macro): Drop unnecessary register assignment. `Dd` + takes care of it if there is a subsequent mdoc(7) document. - While I'm at it, this version also adds `SOURCE_DATE_EPOCH' support - for reproducible builds: when `SOURCE_DATE_EPOCH' is set, files are - considered to have been last modified at that time. +2022-12-07 G. Branden Robinson - * mdate.sh: Rewrite in Perl, moving to ... - * mdate.pl: ... this new file. - * Makefile.am (EXTRA_DIST, .man): Update references. + [tbl]: Fix off-by-one error in generated diagnostic message. -2018-03-09 Colin Watson + * src/preproc/tbl/table.cpp: Define new preprocessor macro, + `PREVIOUS_PAGE_REG`. + (table::init_output): Compute value for register named using + `PREVIOUS_PAGE_REG`, use it in diagnostic, and then remove it. + Also fix verb tense in message. - Remove #! lines from non-executable files +2022-12-07 G. Branden Robinson - These are always invoked by the build system (either in-tree or via - the installed Makefiles) using the necessary program, so the #! - lines were unnecessary. They were harmless except that they caused - Debian's `lintian` tool to complain about installed non-executable - scripts. + [tbl]: Expose the fact of a table's boxedness via a troff + register so that macro packages can make more intelligent + decisions about space requirements (since box borders occupy + significant space on nroff devices). - * font/devlj4/generate/special.awk: Remove #! line. - * font/devps/generate/symbol.sed: Likewise. + * src/preproc/tbl/table.cpp: Define new preprocessor macro, + `IS_BOXED_REG`. + (table::do_top): Initialize "boxedness" register. -2018-03-09 Colin Watson +2022-12-07 G. Branden Robinson - doc: stop generating W3C validation icons + * tmac/s.tmac (TH): Clarify computation and diagnostic message. - Debian's `lintian' tool says: +2022-12-07 G. Branden Robinson - These badges may be displayed to tell readers that care has been - taken to make a page compliant with W3C standards. Unfortunately, - downloading the image from www.w3.org might expose the reader's IP - address to potential tracking. + [tbl]: Fix Savannah #61878. - I think the risk is a small one, but I also don't think the badges - are especially valuable, so it doesn't seem like much to ask to just - drop them at least for groff's own documentation. + * src/preproc/tbl/table.cpp: Define new preprocessor macro, + `STARTING_PAGE_REG`. + (table::define_bottom_macro): Have the formatter issue a warning + if an unkept, boxed table ends on a different page than it + began. + (table::do_top): Save current page number when table begins. - * doc/doc.am (.ms.html, doc/pic.html): Remove `-P-V' option. + Fixes . -2018-03-01 Deri James +2022-12-07 G. Branden Robinson - Place pdf in presentation mode if new commands used. + [tbl]: Regression-test Savannah #61878. - * src/devices/gropdf/gropdf: The new commands which - control page transitions should result in the pdf being - opened in presentation mode. + * src/preproc/tbl/tests/\ + warn-on-long-boxed-unkept-table.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. -2018-03-02 Werner LEMBERG +2022-12-06 G. Branden Robinson - Hyphenation exceptions in pattern files now obey `.hy' (#53196). + * src/preproc/tbl/table.cpp: Write comments to generated output; + these correspond to functions in this file and to major + operations of table construction. + (init_output, compute_widths, define_bottom_macro, do_row) + (do_top, do_bottom): Do it. - * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Mark - `\hyphenation' entries with a trailing space. - (hyphen_trie::insert_hyphenation): Updated. - (hyphenate): Make `\hyphenation' entries obey `.hy' restrictions. +2022-12-05 G. Branden Robinson - * doc/groff.texi (.hy): Updated. + [troff]: Trivially refactor. Rename class `constant_int_reg` to + `readonly_register`. Say "readonly" instead of "const" to + try to avoid confusion with C++ constness. Drop "int" because + integer-valued registers are the norm, not the exception. -2018-03-01 Werner LEMBERG + * src/roff/troff/column.cpp (init_column_requests): + * src/roff/troff/div.cpp (init_div_requests): + * src/roff/troff/input.cpp (top level, init_input_requests): + * src/roff/troff/node.cpp (init_node_requests): + * src/roff/troff/reg.h: Do it. - Adjust `.hy' values. +2022-12-05 G. Branden Robinson - In most cases hyphenation constraints were too strict. The now - selected values reflect the parameters used for the generation of - the (TeX) hyphenation patterns. + [troff]: Trivially refactor. Rename class `constant_reg` to + `readonly_text_register`. Say "readonly" instead of "const" to + try to avoid confusion with C++ constness. Say "text" because + this class is _mostly_ used for interpolation of string-valued + registers like the version registers `.x`, `.y` and `.Y`. + Nevertheless there are some abuses (apparently because the + constructors for register classes don't accept integer + parameters for initialization--why?). - * tmac/an-old.tmac, tmac/cs.tmac, tmac/de.tmac, tmac/doc-common-u, - tmac/e.tmac-u, tmac/fr.tmac, tmac/s.tmac, tmac/sv.tmac: Fix `.hy', - `\n[HY]', and `\n[doc-hyphen-flags]' values. + * src/roff/troff/input.cpp (top level) + (readonly_text_register::readonly_text_register) + (readonly_text_register::get_string) + (main, init_registers, init_requests): Do it. - * doc/groff.texi, tmac/groff_man.7.man, tmac/groff_ms.7.man, NEWS: - Updated. +2022-12-05 G. Branden Robinson -2018-03-01 Werner LEMBERG + [troff]: Trivially refactor. Rename `number_reg_dictionary` to + `register_dictionary`. It's shorter _and_ non-abbreviated _and_ + matches our documentation. - Fix some problems related to hyphenation. + * src/roff/troff/column.cpp (init_column_requests): + * src/roff/troff/div.cpp (page_number, init_div_requests): + * src/roff/troff/env.cpp (print_env, init_env_requests) + (init_hyphen_requests): + * src/roff/troff/input.cpp (length_request) + (interpolate_number_format, do_register, do_if_request, main) + (init_registers, init_input_requests): + * src/roff/troff/node.cpp (get_register, init_node_requests): + * src/roff/troff/reg.cpp (top level, define_number_reg) + (inline_define_reg, alter_format, remove_reg, alias_reg) + (rename_reg, print_number_regs): + * src/roff/troff/reg.h: Do it. - Introduce values 16 (allow hyphenation before last character) and 32 - (allow hyphenation after first character) to the `hy' request - (#48904). +2022-12-04 G. Branden Robinson + + [man]: Add regression test. + + * tmac/tests/an_link-trailing-text-hugs-previous.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2022-12-03 G. Branden Robinson + + * tmac/fallbacks.tmac: Really use troff-mode fallbacks only on + typesetting devices; because this macro file is loaded so early, + we cannot rely on ".if t". Thanks to Dave Kemper for the + discussion in Savannah #63354. + +2022-12-03 G. Branden Robinson + + * tmac/an-ext.tmac: Use more mnemonic register names, thanks to + the recent freeing up of some name space. + - mJ -> mH: saved automatic hyphenation mode + - mX -> mE: formatting in EX/EE context (Boolean) + +2022-12-03 G. Branden Robinson + + * tmac/pdf.tmac: Drop deletion of unused string `PDFHREF.TEXT`. + +2022-12-03 G. Branden Robinson + + * tmac/an.tmac (an-end, AT, UC, DT, PD, SH, IP, BI, BR, IB, IR) + (RB, RI, OP, an*end-hyperlink, MR): Refactor; "nop"ify macros + that produce formatted output or call other macros using string + interpolations--except where we can't: see Savannah #63470. + +2022-12-03 G. Branden Robinson + + * tmac/an.tmac (R): Drop macro definition, which implements a + hack for people who try to use "R" as a font style macro. This + doesn't seem to happen much in actual practice (though perhaps + the diagnostic this hack produces is responsible for suppression + of the mistake). Retaining it interferes with the + "nop"-ification of this macro file. + * NEWS: Add item. + +2022-12-03 G. Branden Robinson + + * tmac/an-ext.tmac: Use truly traditional hyphenation mode on + non-groff-compatible formatters. + +2022-12-03 G. Branden Robinson + + [man]: Update test coverage and expectations. + + * tmac/tests/an_ME-punct-hyphenates.sh: Test both "an.tmac" and + "an-ext.tmac" implementations of `ME`. + * tmac/tests/an_UE-punct-hyphenates.sh: Test both "an.tmac" and + "an-ext.tmac" implementations of `UE`. + * tmac/tests/an_UE-breaks-before-long-URIs.sh: Update test + expectations. I appear to have inadvertently fixed some + inelegant rendering. + +2022-12-02 G. Branden Robinson + + [tests]: Rename to reflect code reorganization. + + * tmac/tests/an-ext_ME-punct-hyphenates.sh: + * tmac/tests/an-ext_MT-body-hyphenates.sh: + * tmac/tests/an-ext_UE-breaks-before-long-URIs.sh: + * tmac/tests/an-ext_UE-punct-hyphenates.sh: + * tmac/tests/an-ext_UR-body-hyphenates.sh: Rename these... + * tmac/tests/an_ME-punct-hyphenates.sh: + * tmac/tests/an_MT-body-hyphenates.sh: + * tmac/tests/an_UE-breaks-before-long-URIs.sh: + * tmac/tests/an_UE-punct-hyphenates.sh: + * tmac/tests/an_UR-body-hyphenates.sh: ...to these. + + * tmac/tmac.am (tmac_TESTS): Reflect renames. + +2022-12-02 G. Branden Robinson + + * tmac/an-ext.tmac: Remove groff-feature-dependent code for + hyperlink management, greatly reducing the size of the file, + which we permissively license and encourage people to copy + around. Drop register definitions corresponding to + groff-specific output device names. Drop definition and use of + `mL` and `mR` strings for angle brackets; no observable change + on non-groff formatters. Recognize `mG` register to enable + testing of these macros even if the formatter is groff. + (mV): Radically simplify. This internal "back-end" for `MT` and + `UR` now just stores its argument in a string, `m1`. + (mQ): Radically simplify. This internal "back-end" for `ME` and + `UE` now just disables automatic hyphenation, formats the saved + `m1` string between angle brackets, suffixes it with the + optional argument, and restores automatic hyphenation. + (UR, MT): Call `mV` with one argument, not nine. + (UE, ME): Call `mQ` with one argument, not nine. + + * tmac/tests/an-ext_MR-works.sh: Add test of this file's + simplified `MR` implementation. + * tmac/tests/an-ext_MT-works.sh: + * tmac/tests/an-ext_UR-works.sh: Move tests of groff-specific + hyperlink output from here... + * tmac/tests/an_MT-works.sh: + * tmac/tests/an_UR-works.sh: ...to these new files. + * tmac/tests/an_MR-works.sh: + * tmac/tests/an_MT-works.sh: + * tmac/tests/an_UR-works.sh: Add tests for valid HTML formatting + of hyperlinks, which experience shows is a bit fragile in the + face of diversion manipulation and output line continuation. + + * tmac/tmac.am (tmac_TESTS): Run new tests. + +2022-12-02 G. Branden Robinson + + * tmac/an-ext.tmac: Support `mG` register: clear it to force the + loading of this file's macros even if they have an + implementation in tmac/an.tmac and the formatter claims groff + compatibility. This is to ease these macros' testing under + groff and keep the implementations here simple. + * tmac/an.tmac: Initialize `mG` register to 1 if not set on + command line. + +2022-12-02 G. Branden Robinson + + * tmac/an-ext.tmac: Initialize `mX` register. + +2022-12-02 G. Branden Robinson + + * tmac/an-ext.tmac: Define `mC` string (constant-width typeface + used by `EX`/`EE` macros) as `R` in nroff mode. Thanks to + Russ Allbery for prompting me to think more about the + limitations of Solaris troff. Implementations do varying + things with the "previous" font restored by `\fP` or an + unargumented `.ft` if a requested font is not found. + +2022-11-30 G. Branden Robinson + + [tbl]: Fix Savannah #63449. + + * src/preproc/tbl/table.h (class table): Add new enumeration + constants for use with `flags` member variable: `HAS_TOP_VLINE` + and `HAS_TOP_HLINE`, which track properties of the table. + Unlike others, these have no correspondence to table region + options. + * src/preproc/tbl/main.cpp (process_format): Add new local + Boolean to track whether we're interpreting a format for the + first row. Use this to "or" on the `HAS_TOP_VLINE` or + `HAS_TOP_HLINE` flags if "|" or [_-] are encountered in the + first row's format, as appropriate. + (process_data): "Or" on `HAS_TOP_HLINE` if a single or double + horizontal line is used as the first row's data. + * src/preproc/tbl/table.cpp (do_top): On nroff mode devices, add + one vee of space above the table if we're going to be drawing an + unintersected vertical rule above the table's top. + + Fixes . + +2022-11-30 G. Branden Robinson + + [tbl]: Regression-test Savannah #63449. + + * src/preproc/tbl/tests/\ + do-not-overdraw-page-top-in-nroff-mode.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. + +2022-11-29 G. Branden Robinson + + * src/preproc/tbl/main.cpp (struct input_entry_format) + (input_entry_format::input_entry_format) + free_input_entry_format_list, process_format): Trivially + refactor. Rename `pre_vline` to `vline_count`. + +2022-11-29 G. Branden Robinson + + * src/preproc/tbl/table.cpp + (vertical_rule::contribute_to_bottom_macro, table::print) + (table::init_output, table::divide_span) + (table::compute_expand_width, table::define_bottom_macro) + (table::do_bottom): Produce roff output that is more readable, + for maintainability. Indent control lines inside macro + definitions. Standardize form of `if`, `ie`, and `el` requests. + Some output will not be indented because it is produced within + narrowly-scoped C++ functions (set_troff_location, + table::print_single_hline, table::print_double_hline, + table::do_row), I haven't verified that each one is called from + a consistent troff indentation level, and I'm not sure it's a + win to parameterize those functions in the indentation level. + +2022-11-29 G. Branden Robinson + + [tbl]: Fix Savannah #61909. + + * src/preproc/tbl/table.cpp (SAVED_INTER_WORD_SPACE_SIZE) + (SAVED_INTER_SENTENCE_SPACE_SIZE): Add new preprocessor macros. + (block_entry::do_divert): Restore saved inter-word and + inter-sentence space when formatting a text entry. + (table::init_output): When a table region begions, save the + values of inter-word and inter-sentence space. Add request to + the reset macro to restore saved inter-word and inter-sentence + space when leaving table region. + (table::do_top): Set inter-sentence space to be equal to + inter-word space. This way spaces are "literal" in ordinary + table extries (but not text blocks). + + Fixes . + +2022-11-29 G. Branden Robinson + + [tbl]: Regression-test Savannah #61909. + + * src/preproc/tbl/tests/\ + save-and-restore-inter-sentence-space.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. + +2022-11-29 G. Branden Robinson + + [tbl]: Suppress line numbering when formatting tables, and + restore it afterward. + + * src/preproc/tbl/table.cpp: Revert much of commit b69062693's + {2011-07-20} changes to this file. They were too complex for me + to understand, and permitted Savannah #60140 to persist (or + caused it). + (ROW_START_LINE_REG, ROW_SAVE_LINE_REG, ROW_MAX_LINE_REG) + (REPEATED_NM_SET_MACRO, REPEATED_NM_SUS_MACRO): Drop + preprocessor macros. + (SAVED_NUMBERING_LINENO, SAVED_NUMBERING_SUPPRESSION_COUNT): Add + new preprocessor macros. + (table::init_output, table::print_single_hline) + (table::print_double_hline, table::define_bottom_macro) + (table::do_row, table::do_top, table::do_bottom): Drop old + logic. + + (table::init_output): When the table begins, save the current + line number register `ln` and the count of remaining lines to be + suppressed (the new `.nn` register). Then suppress numbering + for the next 2 billion+ lines of output, with a groveling + apology to the elegance police. + (table::do_bottom): Restore saved value of `.nn`. If numbering + was active (even if suppressed), restore it with `nm` request. + If it wasn't, disable it, in case it was turned on inside the + table region. + + Fixes . Thanks to Hans + Bezemer for noting the practical significance of this bug. + +2022-11-29 G. Branden Robinson + + [tbl]: Regression-test Savannah #60140. + + * src/preproc/tbl/tests/save-and-restore-line-numbering.sh: Do + it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. - Really fix problem reported in issue #48904. +2022-11-28 G. Branden Robinson - Fix #53243, which is a regression introduced in 2016-09-09. + [troff]: Implement new `.nn` register to report the remaining + count of lines to have their numbering suppressed. - * src/roff/troff/env.cpp (HYPHEN_LAST_CHAR, HYPHEN_FIRST_CHAR): New - enumeration values. - (hyphenate_request): Check for contradicting values. - (environment::hyphenate_line): Fix minimum word length considered - for hyphenation. - (environment::print_env): Updated. - (hyphenate): Fix and extend logic. The original patch to handle - #48904 was bad. + * src/roff/troff/env.h (class environment): Declare new member + function `get_no_number_count()`. + * src/roff/troff/env.cpp (get_no_number_count): Define new + member function, returning value of member variable + `no_number_count`. + (init_env_requests): Define new ".nn" register and attach it to + `get_no_number_count()`. - * doc/groff.texi, man/groff_diff.7.man, NEWS: Updated. + * doc/groff.texi (Miscellaneous): Document it. Include example + of use to determine whether current output line will be + numbered. Also clarify meaning of register; `.nn` is not + decremented except when output line numbering is enabled. + * man/groff.7.man (Read-only registers): Document it. -2018-03-01 Deri James + * src/roff/groff/tests/dot-nn_register_works.sh: Test it. + * src/roff/groff/groff.am (groff_TESTS): Run test. - Add page transitions to pdfs created with gropdf. + * NEWS: Add item. - * src/devices/gropdf.pl: Handle new '\X' commands to support page - transitions in presentation mode pdfs. These commands are a subset - of the commands used in present.tmac allowing slideshows to be - directly produced from -Tpdf without using postscript -> gpresent.pl - -> ghostscript. + See . - * tmac/pdf.tmac: New macros '.pdfpause' and '.pdftransition' to - support page transitions. +2022-11-27 G. Branden Robinson - * src/devices/gropdf.1.man: Document the '\X' commands supported. + * tmac/fallbacks.tmac: Comment out four of the fallback + character definitions for (preconv'd) Unicode character input + added to address Savannah #58930 (corresponding to \[dg], \[dd], + \[%0], and \[rn]; they are failing for not yet understood + reasons involving "macros" attached to groff character info + structs, and the semantics of what it means for a character to + "exist" per the 'c' conditional operator. Fixes regression when + using "tty-char.tmac" (which nroff loads by default). Problem + introduced by me in commit 132182bd71, 23 October. The hope is + to resolve this issue post-groff 1.23.0. Thanks to Dave Kemper + for the report and discussion in Savannah #63332. -2018-03-01 Werner LEMBERG +2022-11-25 G. Branden Robinson - Use $(AM_V_GEN) and $(AM_V_P) to silence even more file generation. + * tmac/an-ext.tmac (SY, YS, mV): Remove `mA`, `mI`, and `mT` + registers when done with them. - * font/devpdf/devpdf.am (BuildFoundries, DESC, Foundry, - build_font_files): Do it. +2022-11-25 G. Branden Robinson -2018-02-28 Werner LEMBERG + * src/roff/troff/node.h (character_exists): + * src/roff/troff/node.cpp (character_exists): Boolify. - Use $(GROFF_V) to silence documentation creation. +2022-11-25 G. Branden Robinson - * Makefile.am (GROFF_V): Define. + [doc]: Add make(1) dependency. - * doc/doc.am (.me.txt, .me.ps, .ms.html, .ms.txt, .ms.ps, pic.html, - webpage.html): Use $(GROFF_V). + * doc/doc.am (doc/groff-man-pages.pdf): Add dependency on our + FreeEuro font since we embed it. -2018-02-28 Werner LEMBERG +2022-11-25 G. Branden Robinson - Use $(AM_V_GEN) to silence file generation. + [build]: Refactor generation of "freeeuro.pfa" to make more + economical use of existing infrastructure, per a suggestion from + Deri James. This also puts the file where gropdf's "download" + file can find it when running it in a separate build directory. + We use it to generate "groff-man-pages.pdf". - * Makefile.am (.man), contrib/eqn2graph/eqn2graph.am (eqn2graph), - contrib/grap2graph/grap2graph.am (grap2graph), contrib/pic2graph.am - (pic2graph), src/devices/gropdf/gropdf.am (gropdf, pdfmom), - src/preproc/eqn/eqn.am (neqn), src/roff/grog/grog.am (grog), - src/roff/nroff/nroff.am (nroff), src/utils/afmtodit/afmtodit.am - (afmtodit), font/devascii/devascii.am (DEVASCIIFONTSFILES, DESC), - font/devcp1047/devcp1047.am (DEVCP1047FONTSFILES, DESC), - font/devhtml/devhtml.am (DEVHTMLFONTSFILES, DESC), - font/devlatin1/devlatin1.am (DEVLATIN1FONTSFILES, DESC), - font/devutf8/devutf8.am (DEVUTF8FONTSFILES, DESC), - font/devps/devps.am (DESC, prologue, zapfdr.pfa, symbolsl.pfa), - font/devdvi/devdvi.am (DESC), font/devlbp/devlbp.am (DESC), - font/devlj4/devlj4.am (DESC): Do it. + * font/devps/freeeuro.pfa: Rename this... + * font/devps/freeeuro.ps: ...to this. We can now use the suffix + rule that also applies to "symbolsl.ps" and "zapfdr.ps". -2018-02-28 Werner LEMBERG + * font/devps/devps.am (DEVPSFONTFILES): Move "freeeuro.pfa" from + here... + (DEVPSFONTFILES_GENERATED): ...to here. + (EXTRA_DIST): Ship the "new" "freeeuro.ps" file. - * configure.ac: Activate silent Makefile rules. +2022-11-25 G. Branden Robinson -2018-02-28 Werner LEMBERG + * font/devps/psstrip.sed: Stop stripping comment lines in + general instead of preserving only ones that use the form in the + Document Structuring Conventions. This way we won't strip + copyright notices, like Werner Lemberg's in the FreeEuro font. + Thanks to Deri James for pointing this out. - Minor compilation warnings. +2022-11-22 G. Branden Robinson - * src/devices/xditview/draw.c: Don't declare `MaxFontPosition'. + tmac/an-ext.tmac: Refactor to reduce code size. - * src/roff/troff/input.cpp (psbb_locator::context_args): Avoid - shadowing of `buf'. + * tmac/an-ext.tmac: Refactor to reduce code size. `UE` and `ME` + have nearly identical implementations so... -2018-02-28 Werner LEMBERG + (mQ): Define new macro to perform the requisite actions, and... - * src/roff/troff/env.cpp: s/HYPHEN_/HYPHEN_NOT/ for clarification. + (UE, ME): Make these into wrappers calling mQ. -2018-02-26 Bertrand Garrigues +2022-11-22 G. Branden Robinson - Update installation doc. + [man]: Add unit tests for `MT/ME` and `UR/UE`. - * INSTALL.REPO: mention that 'pkg-config' is a dependency. + * tmac/tests/an-ext_MT-works.sh: + * tmac/tests/an-ext_UR-works.sh: Do it. - * INSTALL.extra: add dependency 'makeinfo' and optional - dependencies 'pkg-config' and 'uchardet'. + * tmac/tmac.am (tmac_TESTS): Run tests. - * TESTS: move to doc/automake_migration_tests.txt +2022-11-18 G. Branden Robinson - * INSTALL.gen: remove, this file is redundant with the 'INSTALL' - file from gnulib. + * src/devices/gropdf/gropdf.pl: Throw warning if paper format is + unrecognized. -2018-02-02 Bertrand Garrigues +2022-11-18 G. Branden Robinson - Update 'gnulib' submodule. + * src/devices/gropdf/gropdf.pl (Msg): Align more closely with + diagnostic message format prescribed by GNU Coding Standards: + emit space (only) prior to message severity. - * gnulib: now points on cf56f8f618c48cfadd2499ced58574633d12f129 - from 'gnulib' repository. +2022-11-17 G. Branden Robinson -2018-02-02 Bertrand Garrigues + * doc/meref.me.in: Drop unnecessary initialization parameters + from document. The line and title length do not need to be set + in troff mode; the document lays out fine for a variety of paper + formats if these are not forced to 6.5 inches. Also drop + redundant initialization of `pp` register. - Use gnulib script 'git-version-gen' to define groff's version +2022-11-17 G. Branden Robinson - * bootstrap.conf: add 'git-version-gen' script. + [mdoc]: Fix Savannah #63377. - * configure.ac: suppress 'GROFF_VERSION_STRING' and replace it by - the script. If the current commit corresponds to a tag, then the - version is simply the tag name. Otherwise the version has the - format: --. The - version is now stored in '.version'. + * tmac/doc.tmac (Nm): Properly leverage new + `doc-in-name-section` variable. Set page topic `doc-topic-name` + to the first encountered argumentful `Nm` call in the "Name" + section while handling other "Name" section concerns, instead of + later after deciding we're not in the "Synopsis" section. + Problem caused by me when fixing antediluvian mdoc bug in commit + 0d85615c62, 5 November. - * REVISION: removed. + Fixes . Thanks to John + Gardner for the report. - * VERSION: removed. +2022-11-17 G. Branden Robinson - * Makefile.am: define 'MAJOR_VERSION', 'MINOR_VERSION' and - 'REVISION'. + [mdoc]: Add tests for `Nm` macro. - * src/libs/libgroff/libgroff.am: use 'MAJOR_VERSION', - 'MINOR_VERSION' and 'REVISION', add dependency on '.version'. + * tmac/tests/doc_Nm-works.sh: Do it. Test regression reported + in Savannah #63377. Also ensure that we handle the case where + multiple `Nm` items are declared in the "Name" section (as might + happen in library man pages). + * tmac/tmac.am (tmac_TESTS): Run test. - * src/roff/troff/troff.am: ditto. +2022-11-17 G. Branden Robinson - * contrib/mom/om.tmac-u (short_revision): new string that extracts - the first digit of the revision, to be used when checking groff - version. + * tmac/papersize.tmac: Improve integration with mm(7) macro + package. If a paper format has been selected, set `W` register + to new line length (if not already set on command line). + Similarly, set `O` register to 1 inch for the symmetric + horizontal margins otherwise assumed by this macro file. This + means that "groff -mm" and "groff -dpaper=letter -mm" are _not_ + synonymous (when groff is configured to use U.S. letter as the + default paper format), because groff mm(7) uses a page offset of + 0.963 inches on typesetters for compatibility with DWB mm. + * NEWS: Add item. -2018-01-18 Deri James + See discussion in and (some) follow-ups. - On reflection using an array for Filter is not optimal. +2022-11-16 Deri James - * src/devices/gropdf.pl: revert single line from commit - 18fd1fd0bf05eb9a5ba0d2be1a655a044662a8bf. + * src/devices/gropdf/gropdf.pl: If the argument to the paper + format option '-p' matches a recognized format but includes a + trailing 'L' or 'l' ("legalL" or "a4l", for example), rotate the + document's MediaBox. -2018-01-17 Deri James +2022-11-16 Deri James - All values should be 3 decimals + * src/devices/gropdf/gropdf.pl: Fix incorrect hotspot placement + if page is in landscape orientation. + (FixRect): Perform coordinate transform if page is rotated. + (Rotate): New function performs relevant trigonometry. - * src/devices/gropdf.pl: for values approaching zero values - in the for 0.nnnnnnE-nn could be written, not valid syntax for - PDF. Make all values rounded to 3 decimals, becomes 0.000. + Fixes . Thanks to Blake + McBride for the report. - Also changed stream Filter dictionary entry to an array. +2022-11-16 G. Branden Robinson -2018-01-14 Bertrand Garrigues + * tmac/e.tmac: Integrate better with papersize.tmac by no longer + forcing line (and title) length to 6 inches for typesetters on + initialization. Gather default line length from output device + description, possibly modified later (by other macro file or + input). No change to terminal ("nroff mode") output. + * NEWS: Add item. - Fix tarball generation ('make distcheck' failed) +2022-11-16 Peter Schaffter - * src/devices/xditview/xditview.am: add .h created by commit - 382ab4af269a1dea422c8f9bb5c67a065d026deb to EXTRA_DIST + * tmac/papersize.tmac: If a paper format has been selected, + smuggle right margin setting to mom(7) if not overridden by the + user. See discussion in and (some) follow-ups. - * contrib/mm/mm.am: restore distribution of files removed by - commit 445bf58765b759546e238a235651eb0bf5b34325. +2022-11-12 G. Branden Robinson -2018-01-13 Ingo Schwarze + * doc/doc.am (doc/groff-man-pages.pdf) + (doc/groff-man-pages.utf8.txt): Add dependencies on new + `TMAC_PACKAGE_MAN` and `TMAC_PACKAGE_MDOC` convenience macros. + +2022-11-12 G. Branden Robinson + + * tmac/tmac.am (TMAC_PACKAGE_MAN, TMAC_PACKAGE_MDOC): Define + convenience macros for in-tree documents to depend on. + +2022-11-12 G. Branden Robinson + + * tmac/an.tmac: Trivially refactor. Rename `an-section` to + `an*section`. + +2022-11-12 G. Branden Robinson + + * src/devices/grolbp/lbp.cpp (usage): Tweak usage message. The + output driver should be perfectly capable of handling output + from non-GNU (but device-independent) troffs. + +2022-11-12 G. Branden Robinson + + * src/devices/grops/ps.cpp (usage): Employ more informative + metasyntactic variable names in usage message. Also summarize + program's function and direct reader to man page if help + explicitly requested (inferred from identity of output stream). + +2022-11-11 G. Branden Robinson + + * tmac/an.tmac: Trivially refactor for congruence with + documentary terminology. Rename strings and macros. + - an-title -> an*topic + - an-abbreviate-page-title -> an*abbreviate-page-topic + - an-title-abbv -> an*topic-abbv + - an-title-string -> an*topic-string + - an-title-length -> an*topic-length + - an-title-length-prev -> an*topic-length-prev + - an-title-new-length -> an*topic-new-length + - an-page-title-style -> an*topic-style + (TH): Recast diagnostic message to refer to "section", not + "volume" title. + +2022-11-11 G. Branden Robinson + + * tmac/an-ext.tmac: Refactor to reduce code size. `UR` and `MT` + have identical implementations so... + (mV): Define new macro to perform the requisite actions, and... + (UR, MT): Make these into wrappers calling mV. + +2022-11-11 G. Branden Robinson + + * tmac/an-ext.tmac (UR, MT): Fix problem with incorrect line + lengths and occasional "can't adjust" warnings when using + hyperlinks. Reduce the line length within the diversion by the + amount of indentation used in the context. Without this, lines + were getting set too short. (You might think they'd be too + long, but when creating a new environment, the _formatter's_ + default line length is used; that's 65n on terminal devices.) + +2022-11-11 G. Branden Robinson + + [man]: Add test to ensure that link text (when the hyperlink + itself is not formatted because the device supports + hyperlinking) uses the correct line length and is adjusted. + + * tmac/tests/an_adjust-link-text-correctly.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run tests. + +2022-11-11 G. Branden Robinson + + * font/devpdf/devpdf.am: Refactor. + (MOSTLYCLEANFILES): Populate macro incrementally, adjacent to + the targets that build the files to be cleaned. This will + enable cleaner refactoring in the future. + (DEFAULT_BASE35_FONTS): Add new macro storing the targets of the + PostScript Level 2 standard base 35 font descriptions. + (devpdffont_DATA): Populate using `DEFAULT_BASE35_FONTS`. + (URW_BASE35_FONTS): Add new macro, empty if [!HAVE_URW_FONTS]; + and [HAVE_URW_FONTS] otherwise naming the `U` foundry font + description counterparts of the `DEFAULT_BASE35_FONTS`. + (devpdffont_DATA): Append `URW_BASE35_FONTS`. + ($(DEFAULT_BASE35_FONTS) $(URW_BASE35_FONTS)): Assert dependency + on "font/devpdf/download". This isn't literally true, but + BuildFoundries generates all of these together, so if the + "font/devpdf/download" target rule runs successfully, the font + description files named in these macro expansions will be + generated too. + +2022-11-09 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Add new command-line option to + specify the generated font description's "spacewidth" parameter; + in commit bf7f6862c3, 2021-09-24, I made libgroff complain if + this directive is missing (since any font, even a "special" one, + can be selected as current and the formatter's behavior when + encountering an input space should be well-defined under that + circumstance). Adding this option enables a well-formed font + description to be produced. + * src/utils/afmtodit/afmtodit.pl (usage): + * src/utils/afmtodit/afmtodit.1.man (Synopsis, Options): + Document it. + * NEWS: Add item. - Makefile.am: Re-add -F and -M flags needed to build out of src. +2022-11-09 G. Branden Robinson -2018-01-13 Ingo Schwarze + * src/utils/afmtodit/afmtodit.pl: Use our own fatal exit + function instead of Perl's "die". + (croak): New subroutine emits argument as part of diagnostic + message and exits with status 1. + (usage): Exit with status 2, not 1, on usage errors. - [mdoc]: rewrite the implementation of the .Lk macro + * NEWS: Document new exit behavior. - * tmac/doc.tmac-u (Lk): Rewrite. +2022-11-09 G. Branden Robinson - The old implementation was written before the big mdoc - rewrite for groff-1.17. In contrast to most other macros, - it was never updated to use the new techniques. - This new implementation makes .Lk callable, makes trailing - punctuation work in the normal way, and makes the style of - the implementation consistent with other macros. + * font/devpdf/devpdf.am (font/devpdf/download): Improve + comprehensibility of comments in generated "download" file. + Stop bracketing path element separator with spaces. - It also removes the feature of automatically switching - between in-line and displayed rendering depending on the - length of the link because that was inconsistent across - output modes and counter-intuitive, resulting in ugly - output for many existing real-world manual pages. - It now always renders in-line. Use .D1 Lk where desired. +2022-11-09 G. Branden Robinson - Merging http://savannah.gnu.org/bugs/?52849 - OK wl@gnu, jmc@openbsd, bentley@openbsd + * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Stop + capitalizing beginning of diagnostic message (per GNU Coding + Standards). Drop ellipsis from end since no further diagnostics + relevant to that message are expected. Trim trailing slashes + from font path elements. -2017-12-14 G. Branden Robinson +2022-11-08 G. Branden Robinson - man pages: Comment compatibility-mode switching. + * font/devps/devps.am: Refactor. Turn two identical target + rules into a (BSD-make-style, old-fashioned) pattern rule. - The '.do' and '.cp' requests (both groffisms) are some of the - more obscure features of groff's own man page corpus. - Consequently, they get cargo-culted around, within and outside - groff. Thanks to Werner Lemberg for the discussion, which - revealed (to me) that groff ships with compatibility mode on by - default on Solaris 10 and 11. +2022-11-08 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?52444. + * configure.ac: Rechristen self "GNU roff". -2017-11-30 G. Branden Robinson +2022-11-07 G. Branden Robinson - * src/roff/troff/input.cpp: - Make writers to stderr identify themselves. + * src/preproc/pic/pic.ypp: Slightly refactor. Rename parameter + `form` (format) to `fmt` to make its nature as an abbreviation + clear. + (format_number, do_sprintf): Reorder null pointer equality + comparisons to avoid inadvertent lvalue assignment. + (do_sprintf): Declare lists of valid format conversion + specifiers and modifiers explicitly instead of as happenstance + literals. Recast diagnostic messages to refer to "invalid", not + "bad" input; refer to input keyword correctly as "sprintf" (not + "snprintf"); and report the identity of the invalid conversion + specifier we reject. - * font/devpdf/util/BuildFoundries.pl: - Same; also refactor all diagnostics into Notice(), Warn(), and - Die() functions, which delegate their common message-printing to - Msg(). +2022-11-07 G. Branden Robinson - Fix part of bug https://savannah.gnu.org/bugs/?52463. + * tmac/doc.tmac (Fl, doc-flag-recursion, doc-print-recursive) + (doc-print-prefixes, Ar, Nm, Pa, Xr, doc-do-func, Fn) + (doc-do-func-args, Fo): Remove now-relic resets of type size to + previous value. Since commit 5125754cdf, 23 February, no mdoc + macro ever changes the type size. -2017-11-21 G. Branden Robinson +2022-11-08 Deri James - man pages: Fix compatibility-mode problems. + [gropdf]: Cater for invalid entries in download file. - * contrib/gperl/gperl.1.man: Use idiomatic .BI macro instead of - leading an input line with a font escape followed by a dot, - the interpretation of which differs based on compatibility - mode. + * src/devices/gropdf/gropdf.pl: Test if path in the "download" + file points to a readable file. Also change order so that the + first valid entry is used as the font to embed. This replaces + previous order where last found entry is used. - * src/preproc/soelim/soelim.1.man: Make .mso request only after - compatibility mode is turned off. + Fixes . -2017-11-19 G. Branden Robinson +2022-11-05 G. Branden Robinson - * Makefile.am: Protect arguments to "tr" from globbing. + [mdoc]: Set page topic in roman in "Name" section. - Prevents errors from tr during man page generation and possible - incorrect program prefixing in those pages if, for example, some - doofus has directories called "A", "B", ... hanging around in - the build tree. + * tmac/doc.tmac (Nm): If in the "Name" section of the page, set + argument(s) with the `No` (normal formatting) macro instead of + handling them...normally. Since `Nm`'s usual behavior is to set + the next argument in boldface, in this circumstance it is set in + roman. Aligns page rendering with man(7) and fixes a bug + documented in the 4.3BSD-Reno mdoc.samples(7) page (1990-06-22), + upon which the groff_mdoc(7) page is based. + * tmac/groff_mdoc.7.man (Bugs): De-document bug. -2017-11-18 G. Branden Robinson + Fixes part of . - * tmac/groff_mdoc.7.man: Use unstripped symbol names. +2022-11-05 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?52442. + * tmac/mdoc/doc-common: Add internal register + `doc-in-name-section` to keep track of whether a macro is called + within the "Name" section of the document, to prepare a means of + fixing a long-standing bug with `Nm`. + (Sh): Canonicalize capitalization of section heading sooner. + Set or clear `doc-in-name-section` based on result. + (Rd): Add new register to dump. + * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars): + Handle new register. -2017-11-18 G. Branden Robinson +2022-11-04 G. Branden Robinson - * src/include/.gitignore: Ignore config.hin~ files. + [mdoc]: Use font CR, not CB, for `Cm` ("command modifier") and + `Fl` ("flag") macros on typesetters. -2017-11-18 Bjarni Ingi Gislason + * tmac/mdoc/doc-ditroff (doc-Cm-font, doc-Fl-Font): Switch to + Courier roman from Courier bold. This congrues better with + other `Li` literals, which were not in boldface. - test-groff.in: Enable backtraces and all warnings by default. +2022-11-04 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51482. + * tmac/mdoc/doc-nroff (doc-Li-Font): Switch from roman to bold. + On typesetters, the use of Courier (roman) plainly distinguishes + unquoted literals from their context. On terminals there was no + such visible distinction. Fortunately, in groff_mdoc(7) itself, + this does not result in a blinding blitz of boldface because the + `Ql` (quoted literal) macro is so often used, and it maintains + the roman style. This change further aligns groff mdoc(7) with + groff man(7) style conventions. (Also see how we handle + literals for typesetters and terminals in the "ms.ms" document.) -2017-11-18 G. Branden Robinson +2022-11-03 G. Branden Robinson - * tmac/**: Migrate macro package diagnostics away from `quotes'. + [mdoc]: Make `Sx` macro perform quotation, not italicization. + It's thorougly inconsistent with English composition practices + to refer to (sub)section headings within a document as if they + were major works. -2017-11-15 G. Branden Robinson + * tmac/doc.tmac (Sx): Implement. + * tmac/mdoc/doc-ditroff (doc-Sx-font): + * tmac/mdoc/doc-nroff (doc-Sx-font): Delete. + * tmac/groff_mdoc.7.man (Section Cross References): Rename... + ((Sub)section cross references): ...to this. Recognize + existence of `Ss` macro, curiously overlooked before. + * NEWS: Add item. - * src/libs/libgroff/new.cpp: Quieten compiler warning. +2022-11-03 G. Branden Robinson - Define sized version of overloaded delete operator. Duplicate - code from unsized delete operator because simply calling through - to it provokes another warning, -Wdelete-incomplete. + [mdoc]: Drop now-unused `doc-pageref` string. It was nowhere + interpolated outside of state management macros. - Fix rest of https://savannah.gnu.org/bugs/?52335. + * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars): + * tmac/mdoc/doc-common: Do it. -2017-11-12 Deri James +2022-11-03 G. Branden Robinson - Better handle glyphs in font positions > 255 + * tmac/mdoc/doc-common (doc-header, doc-footer): Revise for + clarity and to use correct typefaces for titles. + (doc-header): Add new strings to ease title construction. + `doc-xref` stores the fully formatted page topic and section + number, e.g., "troff(1)"; `doc-abbv` stores the its potentially + abbreviated form when it is too long to fit. + (doc-footer): Use `doc-xref` as above. Stop setting the `Os` + and `Dd` parameters in the ("semantic"?) font used for the + page's section number (probably unnoticed all these years + because the font used to render that was (Times) roman). - * src/devices/gropdf/gropdf.pl: Improve handling - when glyphs above 255 are used. +2022-11-03 G. Branden Robinson -2017-11-12 Deri James + * tmac/doc.tmac: + * tmac/mdoc/doc-common: Rename strings for clarity. + - doc-document-title -> doc-page-topic + - doc-document-title-saved -> doc-page-topic-saved + * tmac/mdoc/doc-common: Use new name. - gropdf should load ALL 'download' files +2022-11-03 G. Branden Robinson - * src/devices/gropdf/gropdf.pl: only the first 'download' file - found was loaded, it should load all found. + * tmac/mdoc/doc-ditroff (doc-page-topic-font): + * tmac/mdoc/doc-nroff (doc-page-topic-font): Set man page topic + names in italics. -2017-11-12 G. Branden Robinson +2022-11-03 G. Branden Robinson - * src/libs/libxutil/DviChar.c: Initialize "buckets" field of - structs. + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Rename strings for clarity. + - doc-caption-font -> doc-page-topic-font + - doc-caption-font2 -> doc-page-section-font + * tmac/mdoc/doc-common (doc-header, doc-footer): Use new names. - Resolves missing-field-initializers warnings. +2022-11-03 G. Branden Robinson -2017-11-12 G. Branden Robinson + * tmac/doc.tmac: Delete suppression of `Pa` font selection in a + "Files" section. This special handling was not documented. - * tmac/strip.sed: Stop rewriting symbol names. A substitution - originally intended to strip the "doc-" prefix off of mdoc macro - and string names unintentionally caught some mom stuff. - Harmlessly in this instance, but with potentially surprising - future effects. Remove (only) this substitution per discussion - in - https://lists.gnu.org/archive/html/groff/2017-11/msg00055.html - et sequentia. +2022-11-03 G. Branden Robinson -2017-11-11 Bjarni Ingi Gislason + * tmac/mdoc/doc-ditroff (doc-Pa-font): Set file specifications + in italics on typesetters. (Terminals already use italics.) - * src/devices/grolbp/lbp.cpp (lbp_printer::setfillmode): Address - misleading indentation warning. +2022-11-03 G. Branden Robinson - * src/roff/troff/mtsm.cpp (mtsm::push_state, mtsm::pop_state): - Same. Only flush standard error if we just wrote to it, - instead of unconditionally. + * tmac/mdoc/doc-ditroff (doc-Xr-font): + * tmac/mdoc/doc-nroff (doc-Xr-font): Set man page topic cross + references in italics. - Fix bug https://savannah.gnu.org/bugs/?51483. +2022-11-03 G. Branden Robinson -2017-11-11 G. Branden Robinson + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Rename `doc-Tn-font-shape` to + `doc-Tn-font` for better parallelism with other font selection + strings for mdoc macros, since the `Tn` macro no longer + manipulates the type size. + * tmac/doc.tmac (Tn): Use new name. - * src/utils/xtotroff/xtotroff.c: Mark private function static. +2022-11-02 G. Branden Robinson -2017-11-11 G. Branden Robinson + * doc/groff.texi (Debugging): Fix misleading claim. The + arguments to the `tm`, `tmc`, and `tm1` requests are not read in + copy mode. For example, you don't need to double backslashes to + get them to interpolate registers or strings. - * src/libs/libxutil/xmalloc.c: Quieten gcc warning. Mollify - -Wmissing-prototypes for xmalloc() in single-function file. +2022-11-02 G. Branden Robinson -2017-11-11 G. Branden Robinson + * tmac/an.tmac (an-end): + * tmac/mdoc/doc-common (doc-end-macro): Ensure that document + footer appears in continuous rendering mode even when a final + pending output line in the document is 1v from the page bottom. + Replace `fl` call with `br`, which IMO has clearer semantics. + Extend page length by 1v before doing so if the current vertical + position is within 1v of the page bottom. - gxditview: Migrate extern declarations to headers. + Thanks to Alex Colomar for the report. - Also mark some private functions as static. +2022-11-02 G. Branden Robinson -2017-11-11 Bjarni Ingi Gislason + [man, mdoc]: Regression-test special case of continuous + rendering when the last pending output line in the document is + 1v from the (notional) page bottom. - src: Declare function protypes where necessary. + * tmac/tests/an_output-footer-when-continuously-rendering.sh: + * tmac/tests/doc_output-footer-when-continuously-rendering.sh: + Do it. + * tmac/tmac.am (tmac_TESTS): Run tests. - Fix bug https://savannah.gnu.org/bugs/?51513. +2022-11-02 G. Branden Robinson -2017-11-10 Bjarni Ingi Gislason + * tmac/an.tmac (TE): Update diagnostic to mention another + failure mode: a man page that is simply a `so` request requires + soelim(1) to be run if the sourced page uses tbl(1). - mom: Abort early with diagnostic in compatibility mode. +2022-11-01 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?52333. + * src/devices/xditview/xditview.am + ($(GXDITVIEW_GROFF_VERSION_H)): Run `$(MKDIR_P)` and `printf` as + separate rule commands in order to use them with `$(AM_V_at)` + and `$(AM_V_GEN)`, respectively. Prevents noise from build. -2017-11-10 G. Branden Robinson + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * contrib/**: Migrate diagnostics away from `quotes'. +2022-10-31 G. Branden Robinson -2017-11-09 G. Branden Robinson + [eqn]: Fix Savannah #63299. - * src/**: Migrate diagnostics away from `these quotes'. + * src/preproc/eqn/main.cpp: Revise input file line number + handling. + (read_line): Stop dealing with `current_lineno` here; it's now + up to its caller (`do_file()`) to manipulate the line number. + (do_file): When reading new file, initialize `current_lineno` to + 1 instead of 0. Reset it to zero when encountering EOF (so that + diagnostics will not include a line number at all). When + performing nested call to `read_line()` to gather '.EN' from + input, increment the line number. Write correct line number in + output groff `lf` requests; in groff, its first argument assigns + the number of the _next_ input line. Increment line number at + end of outer `read_line()` loop. - Fix bug https://savannah.gnu.org/bugs/?52374. + Fixes . Thanks to Alex + Colomar for the report. -2017-11-07 G. Branden Robinson +2022-10-31 G. Branden Robinson - * tmac/strip.sed: Remove nilpotent capture from address. + [eqn]: Regression-test Savannah #63299. -2017-11-05 Bertrand Garrigues + * src/preproc/eqn/tests/\ + diagnostics-report-correct-line-numbers.sh: Do it. + * src/preproc/eqn/eqn.am (eqn_TESTS, TESTS, EXTRA_DIST): Run + test. - `preconv': fix usage of lib `uchardet'. +2022-10-30 G. Branden Robinson - * src/preproc/preconv/preconv.cpp (detect_file_encoding): Fix - usage of uchardet 0.0.1, which may fail but return an empty string - instead of a null pointer, and fix some incorrect error - managements that might cause memory leaks. + * src/utils/grog/grog.pl (fail, warn, construct_command) + (version): Restore trailing newlines to `print`ed output. They + went missing when I removed the assignment of the output record + separator in commit 6f2e367836, 24 October. Thanks to Dave + Kemper for catching this. -2017-11-05 G. Branden Robinson +2022-10-30 G. Branden Robinson - * font/devpdf/devpdf.am: Silence warning from grep during clean. + * src/preproc/preconv/preconv.cpp: Trivially refactor. Rename + `default_encoding` to `fallback_encoding` for clarity. Update + comments and debugging diagnostic messages accordingly. -2017-11-04 G. Branden Robinson +2022-10-29 G. Branden Robinson - * Makefile.am: Drop unnecessary -F and -M flags from pdfmom - call. + [grolj4]: Absorb lj4_font(5) man page into grolj4(1). -2017-11-02 Bjarni Ingi Gislason + * src/devices/grolj4/lj4_font.5.man: Delete, moving content... + * src/devices/grolj4/grolj4.1.man (Fonts): ...hither. - man/groff_diff.7.man: Correct the explanation of the request - ".itc"--it was backwards. + * doc/doc.am (GROFF_MAN_PAGES1): + * src/devices/grolj4/grolj4.am (man5_MANS, EXTRA_DIST): Stop + formatting and shipping removed page. - Fix bug https://savannah.gnu.org/bugs/?51502. + * src/roff/groff/groff.1.man: + * src/utils/hpftodit/hpftodit.1.man: Drop references to page. -2017-11-02 Bjarni Ingi Gislason + Fixes . - test-groff.in: Recognize additional contrib tmacs. +2022-10-29 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51598. + [mdoc]: Support `SN` register to configure subsection heading + indentation. -2017-11-02 G. Branden Robinson + * tmac/doc.tmac: Recognize `SN` register if set on command line + and use groff man(7)-compatible default if it is not. + * tmac/mdoc/doc-common (Ss): Use this register instead of a + literal. + * tmac/groff_mdoc.7.man (Formatting with groff, troff, and + nroff): Document it. + * NEWS: Update item. - * Makefile.am: Force build to generate test-groff script. + Fixes part of . -2017-11-02 G. Branden Robinson +2022-10-29 G. Branden Robinson - * font/devpdf/devpdf.am: Silence warning from grep during build. + [mdoc]: Support `IN` register to configure paragraph + indentation. -2017-11-02 G. Branden Robinson + * tmac/doc.tmac: Recognize `IN` register if set on command line + and use groff man(7)-compatible defaults if it is not. + * tmac/mdoc/doc-common (Sh): Use this register instead of + `doc-paragraph-indentation`. + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Stop setting pargraph indentation + defaults here. + * tmac/groff_mdoc.7.man (Formatting with groff, troff, and + nroff): Document it. + * NEWS: Update item. - * doc/doc.am: Fix build of pic.html from clean tree. + * tmac/tests/doc_Mt-works.sh: + * tmac/tests/doc_indents-correctly.sh: Update test expectations. -2017-11-02 G. Branden Robinson + Fixes part of . - * m4/groff.m4: Kill whitespace in macro diagnostic. +2022-10-29 G. Branden Robinson -2017-11-01 Bjarni Ingi Gislason + * tmac/mdoc/doc-common (Sh): Fix code style nit. Set paragraph + indentation absolutely rather than incrementally. mdoc(7) + doesn't have relative inset macros like man(7)'s `RS`/`RE`, so + the relative measurement could mislead the reader. (The + section heading itself uses an indentation of 0.) - src/roff/grog/subs.pl: Fix typo in usage message. +2022-10-29 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51540. + [mdoc]: Fix Debian #1022179. -2017-10-28 Bjarni Ingi Gislason + * tmac/mdoc/doc-common (Ss): Indent entire subsection heading by + 3 ens, even if it breaks across output lines. (Change and + restore indentation explicitly instead of using a temporary + indent to achieve this. Also indent absolutely by 3n instead of + retreating by one quarter inch.) - m.tmac: Fix some formatting and textual issues. - * Protect full stops in strings \*[Letns!{1,2,10,11}]. - * Remove extraneous whitespace from string \*[Pg_type!1]. + Fixes . Thanks to наб for the + report. - Fix bug https://savannah.gnu.org/bugs/?51610. +2022-10-29 G. Branden Robinson -2017-10-22 Bjarni Ingi Gislason + * tmac/tests/doc_indents-correctly.sh: Add regression test for + Debian #1022179. - refer-mm.tmac: Protect full stop in abbreviation of "ed.". + * tmac/tmac.am (tmac_TESTS): Run test. - Fix bug https://savannah.gnu.org/bugs/?51611. +2022-10-29 G. Branden Robinson -2017-10-22 G. Branden Robinson + [mdoc]: Fix misleading register name. - * src/preproc/html/pre-html.cpp: Fix grammar in usage message. - When used attributively, e.g. as an adjectival phrase, - "command-line" should be hyphenated. + * tmac/mdoc/doc-common (Sh): + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Rename `doc-subheader-indent` to + `doc-paragraph-indentation`, because the latter is what it's + used for. -2017-10-22 Bjarni Ingi Gislason +2022-10-29 G. Branden Robinson - pdfpic: Suppress warning if in compatibility mode. + * m4/groff.m4 (GROFF_POPPLER): Improve shell code portability. + Per the GNU Autoconf manual, "The -a, -o, '(', and ')' operands + are not present in all implementations, and have been marked + obsolete by Posix 2008. ...portable uses of test should never + have more than four arguments, and scripts should use shell + constructs like '&&' and '||' instead." - Fix bug https://savannah.gnu.org/bugs/?51945. +2022-10-26 G. Branden Robinson -2017-10-22 Bjarni Ingi Gislason + * src/preproc/preconv/preconv.cpp: Alter usage message handling. + (usage): Summarize purpose of program and steer reader to man + page (only) if help was explicitly requested, and exit + successfully from here... + (main): ...instead of calling scope. - www.tmac: Rename font 'C' to 'CR'; define 'CR'. +2022-10-26 G. Branden Robinson - The font name 'C' ('CW') is not a part of groff's fonts. + * src/preproc/preconv/preconv.cpp (usage): Use more + communicative metasyntactic variable names. + * src/preproc/preconv/preconv.1.man (Synopsis, Options): Align + with updated usage message. - Fix bug https://savannah.gnu.org/bugs/?51417. - Also see https://savannah.gnu.org/bugs/?51426. +2022-10-24 G. Branden Robinson -2017-10-04 Bertrand Garrigues + * src/preproc/html/pre-html.cpp: Alter usage message handling. + (usage): Summarize purpose of program and steer reader to man + page (only) if help was explicitly requested, and exit + successfully from here... + (main): ...instead of calling scope. - Fix build on MacOS X +2022-10-24 G. Branden Robinson - See https://savannah.gnu.org/bugs/?49651 + * src/devices/grolbp/lbp.cpp: Alter usage message handling. + (usage): Summarize purpose of program and steer reader to man + page (only) if help was explicitly requested, and exit + successfully from here... + (main): ...instead of calling scope. -2017-09-11 Bertrand Garrigues +2022-10-24 G. Branden Robinson - Build from git: Make `configure' fail if `yacc' is not found. + * src/devices/grolbp/lbp.cpp (main): Handle `getopt_long()` + return value more idiomatically. - * m4/groff.m4 (GROFF_PROG_YACC): look for (in this order) `byacc', - `bison -y', `yacc'. Set `YACC' to `missing' is nothing is found - and generate an error. Don't generate an error if build is not - done from git as tarball already distribute files generated by - `yacc'. +2022-10-24 G. Branden Robinson -2017-09-02 Bertrand Garrigues + * src/devices/grolbp/lbp.cpp: Fix code style nits. + (main): Use standard C library symbols `EXIT_SUCCESS` and + `EXIT_FAILURE` instead of integer literals as arguments to + `exit()`. Add assertion. - Update `gnulib' submodule with latest version. +2022-10-24 G. Branden Robinson - * gnulib: now points on 07a187be7f66d3ced66587405f18205971c762e9 - from `gnulib' repository. + * src/devices/grotty/tty.cpp: Alter usage message handling. + (usage): Summarize purpose of program and steer reader to man + page (only) if help was explicitly requested, and exit + successfully from here... + (main): ...instead of calling scope. -2017-09-02 Bertrand Garrigues +2022-10-24 G. Branden Robinson - Fix .gitignore files for in-source build. + * src/devices/grotty/tty.cpp: Fix code style nits. + (main): Use standard C library symbols `EXIT_SUCCESS` and + `EXIT_FAILURE` instead of integer literals as arguments to + `exit()`. Replace `assert(0)` call with communicative + predicate. - Fix bug https://savannah.gnu.org/bugs/?51415. +2022-10-24 G. Branden Robinson -2017-09-01 Bertrand Garrigues + * src/roff/groff/groff.cpp: Alter usage message handling. + (synopsis, help): Coalesce these two functions... + (usage): ...into this one. Summarize purpose of program and + steer reader to man page only if help was explicitly requested, + rather than blitzing user with text upon a usage error. Also + drop option summary from usage message, as it duplicates + groff(1). - Fix build on MacOS X +2022-10-24 G. Branden Robinson - * Makefile.am: define `SED' command with LANG and LC_ALL set to C. - * contrib/mm/mm.am: use it. - * doc/doc.am: Ditto. + * src/utils/grog/grog.pl: Alter usage message handling. + (help): Rename this subroutine... + (usage): ...to this. Summarize purpose of program and steer + reader to man page only if help was explicitly requested, rather + than blitzing user with text upon a usage error. Also drop + option summary from usage message, as it duplicates grog(1). - Fix bug https://savannah.gnu.org/bugs/?49649 +2022-10-24 G. Branden Robinson -2017-08-30 Colin Watson + * src/utils/grog/grog.pl: Drop relic code and comments. - `BuildFoundries' should not be installed. +2022-10-24 G. Branden Robinson - * font/devpdf/devpdf.am: remove installation of generated script - `BuildFoundries'. + [grog]: Migrate expansion of Perl interpreter in shebang. + Use the same technique as afmtodit, mmroff, gropdf, and pdfmom. -2017-08-30 Bjarni Ingi Gislason + * src/utils/grog/grog.am (grog): Replace "@PERL@" instead of + '^\(#! \).*perl'. + * src/utils/grog/grog.pl: Use "@PERL@" in shebang. - pic2graph.1.man: Fix wrong macro for e-mail addresses. +2022-10-24 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51110. + [afmtodit]: Give program a usage message. -2017-08-30 Bjarni Ingi Gislason + * src/utils/afmtodit/afmtodit.pl: Add new scalar `want_help` of + Boolean sense. Recognize new long option `--help`, attached to + `$want_help`. Stop stripping off directory name components from + program name when emitting diagnostics. No other groff program + does this (well, gropdf did until recently), and it might save + users some confusion if they're working with multiple copies of + afmtodit. + (usage): New subroutine reports usage message. If help was + explicitly requested, summarize purpose of program and steer + reader to man page. - groff_diff(7): Remove a repeated word. +2022-10-24 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51077. + [afmtodit]: Migrate expansion of Perl interpreter in shebang. + Use the same technique as mmroff, gropdf, and pdfmom. -2017-08-30 Bjarni Ingi Gislason + * src/utils/afmtodit/afmtodit.am (afmtodit): Replace "@PERL@" + instead of "/usr/bin/perl". + * src/utils/afmtodit/afmtodit.pl: Use "@PERL@" in shebang. - groff_tmac(5): Fix double dot before request. +2022-10-24 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51070. + [gropdf] Give program a usage message. -2017-08-28 Bjarni Ingi Gislason + * src/devices/gropdf/gropdf.pl: Add new scalar `want_help` of + Boolean sense. Recognize new long option `--help`, attached to + `$want_help`. + (usage): New subroutine reports usage message. If help was + explicitly requested, summarize purpose of program and steer + reader to man page. - groff.texi: remove repeated words. +2022-10-24 G. Branden Robinson - Fix bug https://savannah.gnu.org/bugs/?51046. + * src/devices/xditview/xditview.c (Syntax): "#if 0" out + reference to `-noPolyText` option, whose effect is likewise + bracketed in another file. -2017-08-28 Bjarni Ingi Gislason +2022-10-24 G. Branden Robinson - groff_man(7) manual page: Fix explanation of the ".itc" request. + * src/roff/troff/input.cpp (enable_warning, disable_warning): + Recast diagnostic messages for clarity. - See bug at https://savannah.gnu.org/bugs/?51043. +2022-10-24 G. Branden Robinson -2017-08-28 Ingo Schwarze + [pfbtops]: Fix code style and diagnostic nits. - groff_man(7) manual page: recommendations for escape sequences. + * src/utils/pfbtops/pfbtops.c (error): Exit with `EXIT_FAILURE` + status (from standard C library) instead of status 2. + (main): Exit with `EXIT_SUCCESS` status when writing version or + help information. Exit with status 2 when dying due to usage + error. Use `fprintf()` and `strerror()` to construct error + message when dying due to inability to open input file instead + of using `perror()`, which anonymizes its caller and thus should + never be used in serious work. Avoid it like `gets()`. + * NEWS: Add item for exit status changes. - See bug at https://savannah.gnu.org/bugs/?51021. + Continues the long process of fixing Savannah #52463. -2017-08-28 Ingo Schwarze +2022-10-24 G. Branden Robinson - groff_char(7) manual: fix table "7-bit Character Codes" + [man pages]: Don't document macro package compatibility wrapper + directory if it's not used. - See bug at https://savannah.gnu.org/bugs/?51020. + * Makefile.am (.man): Use sed to replace + '@COMPATIBILITY_WRAPPERS@' in man page text with value of + `compatibility_wrappers` shell variable. Document its purpose. + * src/preproc/eqn/eqn.1.man (Description): + * src/preproc/grn/grn.1.man (Options): + * src/roff/groff/groff.1.man (Installation directories): + * src/roff/troff/troff.1.man (Environment): Mention + `@SYSTEMMACRODIR@` only if `@COMPATIBILITY_WRAPPERS@` expands to + something other than "no" (it could be "yes" or "manual"). -2017-08-28 Bertrand Garrigues + Thanks to Alexander Kanavin and Jeremy Puhlman for the report. - Fix troff.1 misleading definition of -w all. +2022-10-21 Robert Yang - See bug at https://savannah.gnu.org/bugs/?47784. Suggested by Kaz - Kylheku . + * font/devpdf/util/BuildFoundries.pl: + * src/devices/gropdf/gropdf.pl: + * src/devices/gropdf/pdfmom.pl: Replace use of '-w' in shebang + line with "use warnings;". + +2022-10-23 G. Branden Robinson + + * tmac/fallbacks.tmac: Define fallback characters for many code + points from the Unicode General Punctuation Block. This is to + ease migration from other documentation formats; in many cases + there are more idiomatic *roff ways of getting results that + typeset better and are amenable to fine tuning. For instance, + Unicode defines spaces and dashes of various discrete widths; + when typesetting with *roff, you can have a space or dash (among + other things) of any length achievable by the output device. + * tmac/ps.tmac: Migrate non-breaking hyphen fallback character + definition from here to the foregoing. + + Fixes . Thanks to Dave Kemper + for the report and discussion. + +2022-10-23 G. Branden Robinson + + * tmac/an.tmac: + * tmac/s.tmac: Escape newlines when opening conditional blocks. + + Fixes . Thanks to Bjarni Ingi + Gislason for the report and Dave Kemper for the quick fix. + +2022-10-21 G. Branden Robinson + + * src/devices/grodvi/dvi.cpp (usage): + * src/devices/grohtml/post-html.cpp (usage): + * src/devices/grolbp/lbp.cpp (usage): + * src/devices/grolj4/lj4.cpp (usage): + * src/devices/grops/ps.cpp (usage): + * src/devices/grotty/tty.cpp (usage): + * src/devices/xditview/xditview.cpp (usage): + * src/preproc/eqn/main.cpp (usage): + * src/preproc/grn/main.cpp (usage): + * src/preproc/html/pre-html.cpp (usage): + * src/preproc/pic/main.cpp (usage): + * src/preproc/preconv/preconv.cpp (usage): + * src/preproc/refer/refer.cpp (usage): + * src/preproc/soelim/soelim.cpp (usage): + * src/preproc/tbl/main.cpp (usage): + * src/roff/groff/groff.cpp (synopsis, help): + * src/roff/nroff/nroff.sh: + * src/roff/troff/input.cpp (usage): + * src/utils/addftinfo/addftinfo.cpp (usage): + * src/utils/hpftodit/hpftodit.cpp (usage): + * src/utils/indxbib/indxbib.cpp (usage): + * src/utils/lkbib/lkbib.cpp (usage): + * src/utils/lookbib/lookbib.cpp (usage): + * src/utils/pfbtops/pfbtops.c (usage): + * src/utils/tfmtodit/tfmtodit.cpp (usage): + * src/utils/xtotroff/xtotroff.c (usage): Update usage message. + Present different modes of operation on separate output lines. + Sort options in English lexicographic order. Document help + option(s) as last mode of operation. + +2022-10-21 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl: Revise handling of argument 0. + Rename scalar `progname` to `prog` for brevity (and preparation + for writing a usage message). Also stop stripping off directory + name components from it. No other groff program does this, and + it might save users some confusion if they're working with + multiple copies of gropdf. + +2022-10-21 G. Branden Robinson + + Migrate terminology from "paper size" to "paper format" or + "paper dimensions" as appropriate in documentation and + diagnostic messages. "Format" implies an orientation (which can + be overridden in many cases) whereas size does not. When only + the magnitudes of measurements are at issue (mainly for internal + purposes), use the term "dimensions". -2017-08-25 Bjarni Ingi Gislason + * NEWS: + * PROBLEMS: + * doc/groff.texi: + * m4/groff.m4 (GROFF_PAGE): + * man/groff_font.5.man: + * man/groff_tmac.5.man: + * src/devices/grodvi/dvi.cpp (main): + * src/devices/grolbp/grolbp.1.man: + * src/devices/grolbp/lbp.cpp (main): + * src/devices/grolj4/grolj4.1.man: + * src/devices/grolj4/lj4.cpp (lj4_printer::lj4_printer, main): + * src/devices/grolj4/lj4_font.5.man: + * src/devices/gropdf/gropdf.1.man: + * src/devices/grops/grops.1.man: + * src/devices/grops/ps.cpp (main): + * src/roff/groff/groff.1.man: + * tmac/papersize.tmac: Do it. - `preconv --version' crashes. +2022-10-19 G. Branden Robinson - See bug at: https://savannah.gnu.org/bugs/?51587. + * tmac/mdoc/doc-ditroff (doc-left-parenthesis) + (doc-right-parenthesis, doc-left-bracket, doc-right-bracket): + Drop thin and hair space escape sequences from these string + definitions. (Also, doc-right-bracket was inconsistent with + doc-left-bracket, the former inserting horizontal motion only + before the bracket character.) Eliminates excess space when + using Pq, Po, Pc and Bq, Bo, Bc macros and formatting for + typesetters, and aligns output with behavior of `Pq` and `Bq` as + documented in groff_mdoc(7). - * src/preproc/preconv/preconv.cpp: Add a missing comma in the - argument list of "printf". + Fixes . Thanks to наб for the + report. -2017-08-25 Bjarni Ingi Gislason +2022-10-19 G. Branden Robinson - Fix bug: `.itc' request breaks subsequent `.it' requests. + * tmac/mdoc/doc-ditroff: Use groff-canonical typeface names in + font selection escape sequences. Migrate 'C' to 'CR' and 'CO' + to 'CI'. (Admittedly, "Courier oblique" is more pedantically + correct than "Courier italic". But the iron ball of Unix troff + history and its style trio [later quartet] of "R", "I", "B" + {then "BI"} will not be ignored.) - See bug at: https://savannah.gnu.org/bugs/?51376. Using `.itc' - lets all later uses of `.it' behave like `.itc', that is, - interrupted text line ending with \c is not counted as a separate - line. +2022-10-19 G. Branden Robinson - * env.cpp: Restore input_trap state to normal when '.it' is - called. + * tmac/mdoc/doc-ditroff: Drop nilpotent type size escape + sequences from string definitions. -2017-08-25 Bjarni Ingi Gislason +2022-10-18 G. Branden Robinson - Fix a part of a virtual (pseudo) structure in "tty.tmac". + Document a CSTR #54 erratum regarding \n(st and \n(sb. - * tmac/tty.tmac: Fix warning: ".../git/groff/tmac/tty.tmac:19: - warning: unbalanced .el request" + * doc/groff.texi (Page Motions): + * man/groff.7.man (Writable registers): + * man/groff_diff.7.man (New registers): Do it. -2017-08-25 Ingo Schwarze + * PROBLEMS: Further clarify. Note DWB and Heirloom behavior. - `tty-char.tmac': focus on meaning rather than graphical shape +2022-10-18 G. Branden Robinson - * tmac/tty-char.tmac: add ASCII renderings for six missing - mathematical symbols + * src/preproc/eqn/main.cpp (read_line): Fix switched test + consequents when updating `current_lineno`. -2017-08-22 Ingo Schwarze +2022-10-18 G. Branden Robinson - `tty-char.tmac': focus on meaning rather than graphical shape + * src/utils/xtotroff/xtotroff.c (main): Annotate "xtotroff" as a + GNU program in version information. - * tmac/tty-char.tmac: Switch the policy from trying to imitate the - characters' graphical shapes, which resulted in unintelligible - renderings in many cases, to transliterations conveying the - characters' meanings. One benefit is making these characters - usable for portable manual pages. +2022-10-18 G. Branden Robinson -2017-08-21 Deri James + * src/devices/xditview/xditview.am + ($(GXDITVIEW_GROFF_VERSION_H): Perform correct substitution to + get groff version string into `Version_string` C symbol. + Continues commit c73decb58f, 9 October. - 'gropdf' does not correctly load new ghostscript fonts +2022-10-18 G. Branden Robinson - See bug at: https://savannah.gnu.org/bugs/?50989. Since ghostscript - 9.21 the fonts supplied have changed from .pfb to .pfa type (with a - raw binary section). These failed to be properly loaded. + * src/utils/afmtodit/afmtodit.1.man (Files): Fix ordering error. - * src/devices/gropdf/gropdf: Changes to handle raw binary section in - a .pfa type font. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. -2017-08-18 Bertrand Garrigues +2022-10-15 G. Branden Robinson - `pdfmom' man page incorrectly displayed. + * src/preproc/eqn/lex.cpp (get_delimited_text): Clear line + number when hitting EOF. + * src/preproc/eqn/main.cpp: Revise end-of-file handling. Clear + line number upon reaching EOF so that we don't report a nonsense + value one greater than the number of lines in the input file. + (read_line): Boolify. Make static (local linkage only), since + it has no external callers. Introduce new Boolean variable + `is_end_of_file`. Clear `current_lineno` if EOF, and increment + it otherwise. + (do_file, main): Clarify diagnostic messages. - * src/devices/gropdf/pdfmom.1.man: Remove `]' character mistakenly - added at the beginning of the file. +2022-10-15 G. Branden Robinson -2017-08-18 Bertrand Garrigues + [eqn]: Improve diagnostics involving unprintable characters. - Incorrect font name for CBI in Foundry.in. + * src/preproc/eqn/main.cpp (input_char_description): New + function constructs a human-readable string describing + characters. + (read_line, inline_equation, main): Call new function and adjust + diagnostic message wording to accommodate the phrase it returns. -2017-08-15 Ingo Schwarze + Fixes . - Fix build if `configure' check for `fprintf-posix' fails. +2022-10-14 G. Branden Robinson - See bug at: https://savannah.gnu.org/bugs/?51554. If tests for - posix compliance of fprintf from `gnulib_m4/fprintf-posix.m4' - fail, a replacement function of `fprintf' is used. Consequently, - all executables that use this function must link against the - gnulib (`libgnu.a'). The bug was introduced by commit - fa41eeba06987a12bc0434f8b51896d4618a3997. + [eqn]: Improve diagnostics. - * src/devices/xditview/xditview.am - * src/preproc/eqn/eqn.am - * src/preproc/pic/pic.am - * src/preproc/preconv/preconv.am - * src/preproc/refer/refer.am - * src/preproc/soelim/soelim.am - * src/preproc/tbl/tbl.am - * src/utils/addftinfo/addftinfo.am - * src/utils/hpftodit/hpftodit.am - * src/utils/indxbib/indxbib.am - * src/utils/lkbib/lkbib.am - * src/utils/lookbib/lookbib.am - * src/utils/pfbtops/pfbtops.am - * src/utils/tfmtodit/tfmtodit.am - * src/utils/xtotroff/xtotroff.am: link against libgnu.a - - * INSTALL.REPO: recommend the autoconf and automake versions used - during automake migration rather than the minimum versions. - -2017-08-04 Deri James - - See bug at: https://savannah.gnu.org/bugs/?51568 - - * src/devices/gropdf/gropdf: Further 'fix' to handle those octal - characters. See comment #5 - thank you Bjarni. - -2017-07-31 Deri James - - See bug at: https://savannah.gnu.org/bugs/?51568 - - * src/devices/gropdf/gropdf: previous 'fix' was too narrow, all - '\' characters should be escaped. Also there was an unwanted - interaction with code in routine 'do_t'. Sometimes, do_C, when - the named glyph is mapped to a chr < 32, this is encoded as octal - \nnn, so in this case the '\' must not be escaped. - -2017-07-25 Deri James - - If input text contained string which could be interpreted as - escaped octal (\ddd) a pdf viewer would interpret as an octal - character. See bug at: https://savannah.gnu.org/bugs/?51568 - - * src/devices/gropdf/gropdf: protect text which resembles \ddd - by escaping with extra '\'. - -2017-07-12 Bertrand Garrigues - - Use uchardet library in `preconv' to detect input file encoding - - * m4/groff.m4 (GROFF_UCHARDET): new macro that use pkg-config to - check if uchardet library is available and define new option - `--with-uchardet': - - If `yes' is passed and uchardet is not found, configure fails. - - If `no' is passed we don't use uchardet and don't display any - warning. - - If `auto' (or any other option) is passed of if --with-uchardet - is not passed, we use uchardet if available, otherwise the build - goes on but a warning is displayed at the end of the configuration - phase. + * src/preproc/eqn/lex.cpp (file_input::~file_input): + * src/preproc/eqn/main.cpp (main): Die if `fclose()` fails and + report underlying system error. + (inline_equation): Identify inline equation context. - * configure.ac: use pkg-config and `GROFF_UCHARDET' to detect the - presence of uchardet library. +2022-10-15 G. Branden Robinson - * src/preproc/preconv/preconv.am: link against uchardet library if - available. + * tmac/e.tmac (2c, 1c): Throw diagnostic if changing columnation + with a footnote pending. This isn't necessarily an error per + se, but in many cases it will flag an undesirable page layout + due to the limited flexibility of me(7)'s footnote support at + present. See . - * src/preproc/preconv/preconv.cpp (detect_file_encoding): new - function that uses uchardet library to detect input file encoding. - (do_file): `detect_file_encoding'. +2022-10-14 G. Branden Robinson - * src/preproc/preconv/preconv.1.man: update `preconv' - documentation. + * src/preproc/eqn/main.cpp: Fix code style nits. + (usage): Align output with man page. Document separate + invocation modes separately. + (main): Use standard C library symbols `EXIT_SUCCESS` and + `EXIT_FAILURE` with `exit()` calls instead of integer literals. + Replace `assert(0)` call with communicative predicate. Check + return value of `fclose()`, and exit with fatal error if it + fails. Distinguish `ferror()` status and `fflush(stdout)` + failures when cleaning up before exit. - See https://savannah.gnu.org/bugs/?51330 +2022-10-12 G. Branden Robinson -2017-07-12 Bertrand Garrigues + * src/roff/troff/input.cpp (read_color_draw_node): Clarify + diagnostic. - Add gnulib module fprintf-posix +2022-10-10 G. Branden Robinson - * bootstrap.conf: do it. + * tmac/dvi.tmac: Always render \[aq] as a neutral apostrophe. + Thanks to the TC fonts, we can do this even when the default CM + text fonts are in use. - * Fix compilation in some files that needed inclusion of - `config.h'. + Fixes . - See https://savannah.gnu.org/bugs/?51330 +2022-10-10 G. Branden Robinson -2017-05-09 Bertrand Garrigues + * tmac/ec.tmac: Remove apparently unnecessary remappings of + styles (and reassertion of style slots in the font mounting + position list, albeit in an unusual order (RBI instead of RIB)). + This code frustrated the rendering of man pages with post-1.22.4 + groff for the 'dvi' output device when using EC fonts. Instead + remap the T and H family typefaces in all four styles + explicitly. (The CW and CWI faces were already handled.) Also + add remappings of groff+PostScriptish font names "CB" and "CBI" + to CW EC faces of normal weight, corresponding to dvi.tmac; see + commits 529e2ca0c4, 2002-03-23 and c9741da6c0, 2021-05-06. - Package `ghostscript' 9.21 renamed some fonts installed in - `/usr/share/ghostscript/9.21/Resource/Font', e.g. URWGothicL-Demi - renamed to URWGothic-Demi, and droped the installation of URW - fonts in `/usr/share/fonts/type1/gsfonts/', breaking font - generation in `font/devpdf/util/BuildFoundries.pl'. + Fixes . - * m4/groff.m4 (GROFF_URW_FONTS_PATH): New option - `--with-urw-fonts-dir' to pass a custom path to URW fonts. - (GROFF_URW_FONTS): search the presence of URW fonts by checking if - file `a010013l.pfb' exists in the paths given by `gs -h', in the - default paths used in `Foundry.in' and in the path given with - option `--with-urw-fonts-dir'. - (GROFF_URW_FONTS_CHECK): print a warning at the end of the - configuration phase if no URW fonts were found. +2022-10-10 G. Branden Robinson - * configure.ac: call new macros `GROFF_URW_FONTS_PATH', - `GROFF_URW_FONTS' and `GROFF_URW_FONTS_CHECK'. + * tmac/tests/an_works-with-ec.sh: Add regression test for + Savannah #63194. + * tmac/tmac.am (tmac_TESTS): Run test. - * font/devpdf/Foundry.in: add new basic fonts names and pass - custom URW fonts path `urwfontsdir'. +2022-10-10 G. Branden Robinson - * font/devpdf/devpdf.am: subsitute `urwfontsdir' in `Foundry' - generation. + * tmac/tests/ec_works.sh: Add unit test to validate use of EC + fonts when "-mec" option given. + * tmac/tmac.am (tmac_TESTS): Run test. - Fixes https://savannah.gnu.org/bugs/?50786 +2022-10-10 G. Branden Robinson -2017-05-04 Deri James + * tmac/latin2.tmac: + * tmac/latin5.tmac: + * tmac/latin9.tmac: Perform the character remapping shenanigans + of the fix for Savannah #63112 only if the output device is + "latin1" (a terminal using an 8-bit character encoding). Only + then can we be sure that Latin-1 glyphs will be unavailable when + other encodings are used and that `\N` escape sequences will + identify correct glyph indices in a font (because there is no + font per se accessible to groff--simply a terminal implementing + a character encoding). - Fixes for gropdf - - * src/devices/gropdf/gropdf.pl: Escape '(' and ')' if - used in a bookmark, and ignore relative move 'h' if - followed by absolute move 'H' in groff intermediate output. - -2017-04-29 Ingo Schwarze +2022-10-10 G. Branden Robinson - groff_char(7): improve description of ASCII characters + * src/devices/gropdf/gropdf.pl (GetType1): Clarify diagnostic. + When failing to open a font file for embedding in a PDF, mention + this context. - * man/groff_char.7.man: improve description of ASCII - characters that do not render as themselves +2022-10-09 G. Branden Robinson - See https://savannah.gnu.org/bugs/?50898 + * src/utils/afmtodit/afmtodit.tables: Update against Unicode 15. + No substantive changes. -2017-04-28 Osamu Sayama + Fixes . - lkbib with empty file dumps core +2022-10-09 G. Branden Robinson - * src/libs/libbib/index.cpp: Test if argument to malloc(3) - is zero. + * configure.ac: If URW fonts were located, add the directory + where they were found to the configuration report. - See https://savannah.gnu.org/bugs/?48433 + Attempts to fix (2/2). -2017-04-28 David Gilman +2022-10-09 G. Branden Robinson - Typo in groff.texi + * m4/groff.m4: Try to make gropdf's search for URW font files + more deterministic. To disambiguate cases where multiple--not + necessarily identical--copies may be found on the system, search + _only_ in the directory given to the `--with-urw-fonts-dir` + configure option, if present. This populates the "Foundry" file + generated by the build, causing gropdf to search there first. + (GROFF_URW_FONTS_PATH): Stop `AC_SUBST`ing `urwfontsdir` here. + (GROFF_URW_FONTS_CHECK): `AC_REQUIRE` `GROFF_URW_FONTS_PATH` to + be run first. If `urwfontsdir` is not null, search only there + for URW fonts. Assign `urwfontsdir` the value of the directory + in which the fonts are found. Assign it an empty value if none + are found. Either way, `AC_SUBST` the variable. - * doc/groff.texi: Dp instead of DP used + Attempts to fix (1/2). - https://savannah.gnu.org/bugs/index.php?42251 +2022-10-09 G. Branden Robinson -2017-04-28 Rich Burridge + * src/devices/gropdf/gropdf.pl (LoadFont): Clarify diagnostic. + gropdf opens "fonts" in two distinct ways. On the one hand, it + opens groff font description files for essentially all + nontrivial output. On the other, it may open actual Type 1 font + files for embedding in a PDF. Make failure of the former case + less confusable with the latter. - "grops -c a" dumps core +2022-10-09 G. Branden Robinson - * src/devices/grops/ps.cpp: conversion specifier %s changed - to %1 (errprint() uses special syntax different from - printf(3)) + [ms]: Document new XN/XH and related macros. - https://savannah.gnu.org/bugs/?42190 + * doc/groff.texi (Creating a table of contents): + * doc/ms.ms (Creating a table of contents): + * tmac/groff_ms.7.man (Creating a table of contents): Do it. -2017-04-28 Bjarni Ingi Gislason + Fixes . - Macro "itc" is needed to make escape "\c" useful +2022-10-09 G. Branden Robinson - * tmac/an-old.tmac: .it changed to .itc + [gxditview]: Support `-version`, `--version` option. As a C + program, gxditview had no access to the (C++) libgroff + `Version_string` symbol, so construct a header file to store + this datum at build time. If groff gets other user-facing C + programs, we should consider generating this header in + src/include instead. - https://savannah.gnu.org/bugs/?42907 + * src/devices/xditview/xditview.am: Generate "groff_version.h" + file. + (GXDITVIEW_GROFF_VERSION_H): Define new macro. + ($(GXDITVIEW_GROFF_VERSION_H)): Define target to generate file. + (XDITVIEW_GENHDRS): Add $(GXDITVIEW_GROFF_VERSION_H). + + * src/devices/xditview/xditview.c: Include new header file. + (Syntax): Report newly supported options. + (main): Recognize and handle new options. + + * src/devices/xditview/gxditview.1.man (Synopsis): Document + them. + +2022-10-09 G. Branden Robinson + + [gxditview]: Update usage message production and contents. + + * src/devices/xditview/xditview.c: Use C99 Boolean type. + (Syntax): Accept additional Boolean argument indicating whether + the usage message is to be issued due to an error. Write + message to stderr if so, and stdout otherwise. Stop presuming + length of output line; guessing where to wrap is unreliable due + to variable terminal width and length of argv[0]. Write one + line per invocation mode of the program. Stop duplicatively + documenting standard X Toolkit options. Exit with standard C + library `EXIT_FAILURE` status if there was an error, and + `EXIT_SUCCESS` otherwise. + (main): Refactor to prepare for `--version` support. + + * src/devices/xditview/gxditview.1.man (Synopsis): Sync list of + options with usage message. + +2022-10-09 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Recognize "--version" as + synonym for "-v". To achieve this, use Getopt::Long instead of + Getopt::Std. + * src/utils/afmtodit/afmtodit.1.man (Synopsis, Options): + Document it. -2017-04-28 Bjarni Ingi Gislason +2022-10-09 G. Branden Robinson - First italic correction (\,) is absent in macros IR and IB + * src/devices/gropdf/pdfmom.pl: Recognize "--version" as synonym + for "-v". + * src/devices/gropdf/pdfmom.1.man (Synopsis, Description): + Document it. - * tmac/an-old.tmac: Italic correction added +2022-10-08 G. Branden Robinson - https://savannah.gnu.org/bugs/?42906 + * src/utils/grog/grog.pl (version): Identify as a GNU program. -2017-04-13 Ingo Schwarze +2022-10-06 G. Branden Robinson - * tmac/doc.tmac-u: Make .Lk with more than two arguments - mdoc(7) conform + * src/devices/grolj4/grolj4.1.man (Typefaces): Add new + subsection. - Use the second and following arguments as the link text. + Fixes . Thanks to T. Kurt + Bond for the report. - Do not mark up the following colon with \fI. +2022-10-05 G. Branden Robinson - Handle any number of trailing delimiters. + * doc/meref.me.in (Columnated Output): Document persistence of + `$s` register value across columnation mode changes. - Problem reported by Anthony Bentley , - fixed by Ingo Schwarze . + Fixes . Thanks to Dave + Kemper for the report. - https://savannah.gnu.org/bugs/?50789 +2022-10-05 G. Branden Robinson -2017-04-12 Werner LEMBERG + * doc/meref.me.in: Annotate empty default arguments more + consistently. - Update German hyphenation patterns. + Fixes . Thanks to Dave + Kemper for the report. - * tmac/de.tmac: Add more hcode values. - No longer use `hyphenex.det'. - * tmac/hyphen.den, tmac/hyphen.det: Updated to `dehyph-exptl-0.41'. - * tmac/hyphenex.det: Removed, no longer needed. - * tmac/tmac.am (TMACNORMALFILES): Updated. +2022-10-05 G. Branden Robinson -2017-04-10 Ingo Schwarze + * doc/meref.me.in: Fix documentation error. + (Summary) <\_>: Describe as "underrule", not "underscore". + These are distinct: the latter is a glyph; the former is drawn + by typesetters and rendered with SGR attributes on terminals. - * tmac/doc.tmac-u: Punctuation handling of .Lk fixed +2022-10-04 G. Branden Robinson - The implementation of the groff_mdoc(7) .Lk (hyperlink) macro - contains code to make sure that the second argument is not - punctuation before treating it as a link text, but the test - can never lead to the result "punctuation" because the - initialization of the global variable doc-width was missing - before the call to doc-get-arg-type. Consequently, even "." - was not recognized as punctuation. + * NEWS: Advise users of changes to "name" directive handling in + font description files. - Problem reported by Anthony Bentley , - fixed by Ingo Schwarze . + Fixes . Thanks to Dave + Kemper for the report. - https://savannah.gnu.org/bugs/?50771 +2022-10-04 G. Branden Robinson -2017-04-07 Werner LEMBERG + * src/roff/troff/number.cpp: Refactor and fix code style nits. + Boolify and rename static (local) functions. + - parse_expr -> is_valid_expression + - start_number -> is_valid_expression_start + - parse_term -> is_valid_term + Rename preprocessor macro `SCALE_INDICATOR_CHARS` to + `SCALING_UNITS`. + (is_valid_expression, is_valid_term): Rename parameters and + demote them from `int` to `bool`. + - scaling_indicator -> scaling_unit (no demotion) + - parenthesised -> is_parenthesized + - rigid -> is_mandatory + (is_valid_expression_start, is_valid_expression, is_valid_term): + Return Boolean rather than integer literals. + (get_vunits, get_hunits, get_number_rigidly, get_number) + (get_integer): Update call sites of renamed functions. Replace + Boolean-valued integer literals used as Booleans with Boolean + literals and annotate their purposes. (See .) + (get_vunits, get_hunits, get_number, get_integer): Replace `0` + in assertions with a communicative predicate. In all of these + it's an unhandled `switch()` case. - * tmac/hyphenex.us: Updated to current release from TeXLive. +2022-10-04 G. Branden Robinson -2017-02-23 Bertrand Garrigues + * src/roff/troff/input.cpp (do_expr_test, do_zero_width): Use + better terminology in diagnostic messages. - * bootstrap: update with latest version from gnulib. - * gnulib: update the git submodule with latest version (commit - 4084b3a1094372b960ce4a97634e08f4538c8bdd from gnulib). +2022-10-04 G. Branden Robinson -2017-02-18 Colin Watson + [troff]: Fix Savannah #63151. - * src/preproc/eqn/main.cpp: Define EQ and EN if they are not already - defined, to appease "groff -wmac". - * src/preproc/pic/main.cpp: Likewise for PS and PE. + * src/roff/troff/input.cpp (read_draw_node): Throw "delim" + warning diagnostic when a drawing escape sequence ends the line + without a closing delimiter. - Fixes: http://bugs.debian.org/495713 + Fixes . -2017-02-16 Ingo Schwarze +2022-10-03 G. Branden Robinson - mdoc %T: use typographic quotes + * tmac/fallbacks.tmac: Define fallbacks for characters in ISO + Latin-{2,5,9} but not in Latin-1. - * tmac/doc.tmac-u: Changed \*[q] to \*[Lq] and \*[Rq] + Fixes . Thanks to Rafal Pietrak + for the report. - Citing Anthony J. Bentley: +2022-10-03 G. Branden Robinson - The below patch causes -mdoc to generate typographic quotes - around a %T (reference title) instead of straight quotes. + [troff]: Fix Savannah #63149. - I also submitted similar diffs to mandoc and heirloom troff - (which haven't been committed yet). It would be nice for - the major implementations not to differ here, and the change - is trivial. + * src/roff/troff/reg.cpp (alter_format): Throw comprehensible + diagnostic when input delete character encountered in register + format. - It's worth noting that groff's refer(1) already uses typographic - quotes around %T with my -ms documents. + Fixes . - https://savannah.gnu.org/bugs/?43553 - http://comments.gmane.org/gmane.comp.tools.mdocml.devel/723 - https://github.com/n-t-roff/heirloom-doctools/pull/6 +2022-10-03 G. Branden Robinson -2017-02-16 Ingo Schwarze + [troff]: Describe an input delete character comprehensibly. - mdoc \*[Lq], \*[Rq]: map to \[lq], \[rq] for all terminal - devices + * src/roff/troff/input.cpp (token::description): The delete + character (ISO 127 decimal, EBCDIC 7) is a valid `TOKEN_CHAR` + but is not printable. Don't attempt to output it literally in + diagnostics; describe it in a phrase instead. - * tmac/doc-nroff-u: .ds Lq \[lq], .ds Rq \[rq] +2022-10-03 G. Branden Robinson - If you use \[lq] and \[rq] directly in your document, the - quotes already render nicely for all terminal devices: - as U+201C and U+201D for devutf8 and as ASCII 0x22 (") for - devascii and devlatin1. - So it is not quite clear why doc-nroff should avoid - \[lq] and \[rq] when resolving \[Lq] and \[Rq] for devascii - and devlatin1. Quite to the contrary, many people seem to - consider "``" and "''" ugly renderings because they look - unbalanced. + [troff]: Apply consistent terminology. - See + * src/roff/troff/input.cpp: Rename functions to better align + with our documentation, and decouple their names from an + assumption of diagnostic severity. Also give them imperative + names since they are called for their side effects, not their + return values. + - empty_name_warning -> diagnose_missing_identifier + - non_empty_name_warning -> diagnose_invalid_identifier + (diagnose_missing_identifier): Refer to absent operand as + "identifier", not "name", in diagnostic messages since the + latter (strictly) refers to the request/macro/string/diversion + name space, and this function is also used to gather register + identifiers. - https://savannah.gnu.org/bugs/?43554 +2022-10-02 G. Branden Robinson -2017-02-16 Bjarni Ingi Gislason + [tmac]: Fix Savannah #63112 (3/3). - Use the traditional (portable) method of using a backslash - after '\{' + * tmac/latin2.tmac: Replace characters that ISO Latin-1 has but + Latin-2 doesn't. Map characters that ISO Latin-2 has and + Latin-1 doesn't to their numeric code points. - * contrib/mm/m.tmac, tmac/e.tmac-u, - tmac/s.tmac: Add '\' after "\{" +2022-10-02 G. Branden Robinson - See + [tmac]: Regression-test Savannah #63112 (3/3). - https://savannah.gnu.org/bugs/?49917 + * tmac/tests/latin2_works: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2017-02-16 Bjarni Ingi Gislason +2022-10-01 G. Branden Robinson - Use explicit \s±n after a variable string instead of \s0 + [tmac]: Fix Savannah #63112 (2/3). - * tmac/e.tmac-u: Change \s0 to \s+3 + * tmac/latin5.tmac: Replace characters that ISO Latin-1 has but + Latin-5 doesn't. Map characters that ISO Latin-5 has and + Latin-1 doesn't to their numeric code points. - See +2022-10-01 G. Branden Robinson - https://savannah.gnu.org/bugs/?49915 + [tmac]: Regression-test Savannah #63112 (2/3). -2016-12-29 Deri James + * tmac/tests/latin5_works: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - Remove duplicate '-e' from gropdf manual. - - * src/devices/gropdf/gropdf.1.man: Remove first '-e'. - -2016-11-25 Deri James +2022-10-01 G. Branden Robinson - Remove incorrect info from gropdf manual. - - * src/devices/gropdf/gropdf.1.man: Remove references - to postscript. - -2016-11-22 George HELFFRICH + [tmac]: Fix Savannah #63112 (1/3). - [me]: Fix alignment of `(c' macro (#43306). + * tmac/latin9.tmac: Replace characters that ISO Latin-1 has but + Latin-9 doesn't. Map characters that ISO Latin-9 has and + Latin-1 doesn't to their numeric code points. - * tmac/e.tmac-u ((c): Properly initialize environment. +2022-10-01 G. Branden Robinson -2016-11-20 George HELFFRICH + [tmac]: Regression-test Savannah #63112 (1/3). - [me] Fix vertical spacing of `(b' macro (#42217). + * tmac/tests/latin9_works: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - * tmac/e.tmac-u (@k): Apply pre-spacing conditionally. - ()b): Updated. +2022-10-01 G. Branden Robinson -2016-11-19 George HELFFRICH + * src/roff/troff/input.cpp: Refactor to parallelize logic in + similar routines; namely, those handling escape sequences that + accept newlines as argument delimiters. - [me] Fix remaining bugs with line numbering (#49650). +2022-10-01 G. Branden Robinson - * tmac/e.tmac-u (nm): Redefine. - (.n1, .n2): Update so all environments affected. - (.ip): Fix double numbering. - (.)c, .)l): Restore numbering after diversion included. + * src/roff/troff/input.cpp: Fix inconsistencies in handling of + escape sequences that accept newlines as delimiters. Some threw + spurious warnings as in Savannah #63011; others failed to treat + a newline-terminated escape sequence also as the ending of an + input line. + (do_name_test, do_zero_width): Suppress spurious warning. + (do_zero_width, do_width, do_special): Synthesize newline to + terminate input line. -2016-11-01 Deri James +2022-10-01 G. Branden Robinson - gropdf remaps characters to position 13 (#48986). - - * src/devices/gropdf/gropdf: Do not remap anything to chr(13). + * src/roff/groff/tests/\ + some_escapes_accept_newline_delimiters.sh: Add test cases for + `\A` and test formatted output of escape sequences, not just the + absence of diagnostics from permitted use of newlines as + argument delimiters. -2016-11-01 Deri James +2022-09-29 G. Branden Robinson - pdfmom was not including $preconv in the initial groff run. - - * src/devices/gropdf/pdfmom.pl: Include $preconv in first - groff run which resolves forward pdf references. + * src/libs/libdriver/input.cpp (do_file): Make use of + positioning commands before the first page is started fatal + errors; they suggest ill-formed input. The 'p' command + clobbers the vertical position anyway. (See + https://bugs.debian.org/421437 for discussion.) -2016-10-05 Ingo Schwarze +2022-09-29 G. Branden Robinson - * tmac/doc.tmac-u: Simplify behaviour of .Bl -tag - * tmac/groff_mdoc.7.man: Update documentation to the new - behaviour of .Bl -tag + * tmac/pdf.tmac: Add inclusion guard; if a `pdfmark` macro is + already defined, skip inclusion of this file. Unfortunately + there are multiple name collisions with pdfmark.tmac. - If an mdoc(7) .Bl -tag macro lacks the -width argument, the - body indentation is calculated separately for each child .It - macro. Neither the Heirloom nor the mandoc(1) implementation - of the mdoc(7) language show such behaviour; both use a - constant default width for the whole list in that case. +2022-09-28 G. Branden Robinson - Apart from doubts whether lists with variable indentation are - typographically sound in the first place, support for variable - widths in groff is so restricted that it's practically - useless. For each .It, the width will be the default width of - whatever happens to be the leading macro after the .It, or of - .No if .It is not followed by a macro. + * src/roff/troff/input.cpp: + * src/roff/troff/request.h: Trivially refactor. Boolify + `interpolate_macro` and `request::invoke`. Also rename + parameter `no_next` to `do_not_want_next_token`, exposing + potentially confusing interface design. + +2022-09-28 G. Branden Robinson + + * src/roff/troff/input.cpp (spring_trap, interpolate_string) + (interpolate_string_with_args): Improve error diagnostics: when + a sprung trap or an interpolation fails because it's being + attempted on a request, say so explicitly and _name_ it. If the + argument to the trap-planting request or to a string + interpolation escape sequence is itself an interpolation, this + name might not be obvious. Consider: + .wh \n[pos] \*[mac] + .em \*[mac] + .itc 1 \*[mac] + \*[\*[mac]] + Supplying this information requires no additional overhead. + +2022-09-28 G. Branden Robinson + + * src/roff/troff/input.cpp (interpolate_string): Trivially + refactor. Rename function parameter from `s` to `nm` to more + obviously align with `interpolate_string_with_args()`. - See +2022-09-28 G. Branden Robinson - https://savannah.gnu.org/bugs/index.php?49272 + * src/roff/troff/input.cpp (do_zero_width, token::description) + (interpolate_string, interpolate_string_with_args) + (token::get_char): Revise diagnostic messages to stop presuming + the identity of the escape character. - and +2022-09-28 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2016-10/msg00006.html + * src/roff/troff/input.cpp (set_escape_char): Recast error + message to describe attempted operation and tell the user what + we're doing about being instructed to use an invalid escape + character. +2022-09-28 G. Branden Robinson -2016-09-09 Werner LEMBERG + * src/roff/troff/input.cpp (read_size): Be more helpful to + ambiguous type size escape sequence users; offer advice in + terms of the current escape character. - * tmac/sv.tmac: Fix `.hy' settings (#48904). +2022-09-28 G. Branden Robinson - The Swedish patterns allow hyphenation after the first character and - before the last two characters, not vice versa. + * src/roff/groff/groff.cpp (main): Fix SEGV when exiting + gxditview. The `postdriver` pointer always referred to + allocated memory except when the `-X` option was given; it was + then assigned the address of a #defined string literal. It was + thus statically allocated and an error to attempt to `free()` + it. Duplicate the string on the heap instead so that we can + clean up uniformly regardless of postprocessor. Problem caused + by me when introducing `xexit()` in commit 6769e56aab, 20 June. -2016-09-09 Werner LEMBERG +2022-09-28 G. Branden Robinson - troff: Fix hyphenation (#48904). + * tmac/e.tmac (@o, n2, sk (f, ++): Consistently call `@err` + macro with `do`. - This commit fixes two bugs present from the very beginning: troff - (a) didn't allow to hyphenate words shorter than 4 characters - (ignoring `.hy' settings), and (b) never tried to hyphenate after - the first character due to wrong handling of the `.hy' settings. +2022-09-25 G. Branden Robinson - * src/roff/troff/env.cpp (environment::hyphenate_line): Use - hyphenation flags to determine the minimum word length considered - for hyphenation. - (hyphenate): Fix handling of `HYPHEN_FIRST_CHARS'. + * tmac/e.tmac: Initialize new register `_f`, the value of `$m` + {column count} of the previous pending footnote, to zero, + meaning there is no previous pending footnote. + (@o): Emit diagnostic when flushing footnotes into a different + column layout than the pending footnote last added. Set `_f` to + zero. + ((f): Emit diagnostic when enqueueing footnote using a different + column layout than the previous pending footnote used. Set `_f` + to `$m`. -2016-07-29 Colin Watson + Fixes . Thanks to Dave + Kemper for the report and discussion. - Implement `SOURCE_DATE_EPOCH' for reproducible builds. +2022-09-25 G. Branden Robinson - * src/include/curtime.h: New file. - * src/libs/libgroff/curtime.cpp: New file. - * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Add - src/libs/libgroff/curtime.cpp. + * tmac/e.tmac: Explicitly initialize and annotate internal + register `?f`. - * src/roff/troff/input.cpp (init_registers): Use `current_time' - instead of `time(0)'. - * src/devices/grohtml/post-html.cpp - (html_printer::do_file_components): Likewise. - (html_printer::~html_printer): Likewise. - * src/devices/grops/ps.cpp (ps_printer::~ps_printer): Likewise. - * src/devices/gropdf/gropdf.pl: Use `$ENV{SOURCE_DATE_EPOCH}` if - available in preference to `time`. +2022-09-08 Nikita Ivanov - * doc/groff.texi (Environment): Document `SOURCE_DATE_EPOCH'. - * src/devices/grohtml/grohtml.1.man (ENVIRONMENT): Likewise. - * src/devices/gropdf/gropdf.1.man (ENVIRONMENT): Likewise. - * src/devices/grops/grops.1.man (ENVIRONMENT): Likewise. + * tmac/ps.tmac: Fallback definitions for glyphs that usually + come from special fonts should use `schar` instead of `fchar`. + {Define fallback special characters using `schar` instead of + `fchar` for glyphs that we do not expect to find in text fonts; + that is, they don't have bold, italic, and bold-italic stylistic + variants. This means all special character definitions in the + file except for rules, ligatures, and digraphs. Problem dates + back to a series of commits from March 2002 to February 2003, + straddling the introduction of the `schar` request in November + 2002. --GBR} -2016-04-19 Carsten Kunze + Fixes . - eqn: Fix problem with explicite spacing before unary operator +2022-09-21 G. Branden Robinson - * src/preproc/eqn/list.cpp (list_box::compute_metrics): Change - item spacing type from BINARY to ORDINARY also when previous - type is SUPPRESS_TYPE. + [ms]: Slightly simplify new `XN` macro feature to align it more + closely with Berkeley TOC macro behavior; don't prepend the + table of contents entry with the section number (`\*[SN]`). If + desired, a document can define `XN-REPLACEMENT`. This does not + regress "pdfmark.ms" because it uses an alternative, older + implementation of these features from "spdf.tmac". - As reported in + * tmac/s.tmac (XH-UPDATE-TOC): Update comments. + (XN-REPLACEMENT): Do it. - http://lists.gnu.org/archive/html/groff/2016-04/msg00024.html +2022-09-20 G. Branden Robinson - by Douglas McIlroy + * tmac/pdf.tmac (pdf*href-I): Call `pdf:error` macro by its + correct name. Both this macro file and + contrib/pdfmark/pdfmark.tmac seem to want to use the 'pdf' + prefix for their macro names, with much confusing overlap. + Problem dates back to commit 87046b2948, 2011-07-26. - an implicite space is added between an unary operator and it's - operand when an explicite space is put before the unary - operator. Unary operators are initially set up as binary. - Depending on the preceding element their type can be changed - to unary. This did not happen when an explicite space ('~' or - '^') had been before that operator. +2022-09-19 G. Branden Robinson -2016-02-16 Bálint Réczey + * m4/groff.m4 (GROFF_URW_FONTS_CHECK): If Ghostscript or awk are + unavailable, skip only the prepopulation of the URW font search + path instead of the entire check. This way we still locate the + URW fonts if they are in one of several standard locations. - Fix many malloc/new vs. free/delete/delete[] mismatches (#47164) + Fixes . - * src/devices/grops/ps.cpp (ps_font::~ps_font, - ps_printer::define_encoding): Use `free'. - * src/devices/grops/psrm.cpp (resource::~resource, - resource_manager::output_prolog, resource_manager::supply_resource, - resource_manager::read_download_file): Ditto. +2022-09-19 G. Branden Robinson - * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Ditto. + [troff]: Trivially refactor. - * src/libs/libgroff/searchpath.cpp - (search_path::open_file_cautious): Ditto. + * src/roff/troff/input.cpp (do_name_test): Boolify and rename + local variables to..."impredicate" their names. + - bad_char -> got_bad_char + - some_char -> got_some_char - * src/libs/libgroff/string.cpp: Include `stdlib.h'. - (string::extract): Use `malloc'. +2022-09-19 G. Branden Robinson - * src/preproc/eqn/box.cpp (quoted_text_box::~quoted_text_box): Use - `free'. + [grodvi, ...]: Trivially refactor. - * src/preproc/eqn/lex.cpp (definition::~definition, - macro_input::~macro_input, top_input::~top_input, do_definition): - Ditto. + Tidy up #includes of the "assert.h" header, which we locally + provide to ensure a C99-conformant implementation. Drop + inclusion of header from files that don't directly need it, add + it where they do, and spell the inclusion consistently with + double quotes to cue the reader of its local status. - * src/preproc/eqn/main.cpp (main): Ditto. + * src/devices/grodvi/dvi.cpp: + * src/devices/grolj4/lj4.cpp: + * src/libs/libdriver/printer.cpp: + * src/preproc/eqn/box.cpp: + * src/preproc/eqn/delim.cpp: + * src/preproc/eqn/pile.cpp: + * src/preproc/eqn/script.cpp: Add inclusion. - * src/preproc/eqn/other.cpp: Include `stdlib.h'. - (size_box::~size_box, font_box::~font_box): Use `free'. + * src/include/driver.h: + * src/libs/libgroff/fontfile.cpp: + * src/preproc/eqn/eqn.h: + * src/preproc/html/pushback.cpp: + * src/preproc/refer/refer.h: + * src/preproc/tbl/table.h: + * src/utils/addftinfo/addftinfo.cpp: Drop inclusion. + + * src/include/itable.h: + * src/include/stringclass.h: + * src/libs/libbib/linear.cpp: + * src/libs/libbib/search.cpp: + * src/libs/libgroff/color.cpp: + * src/libs/libgroff/font.cpp: + * src/libs/libgroff/nametoindex.cpp: + * src/libs/libgroff/prime.cpp: + * src/libs/libgroff/searchpath.cpp: + * src/preproc/html/pre-html.cpp: + * src/preproc/preconv/preconv.cpp: + * src/preproc/soelim/soelim.cpp: + * src/utils/indxbib/indxbib.cpp: + * src/utils/lkbib/lkbib.cpp: + * src/utils/lookbib/lookbib.cpp: Respell inclusion. - * src/preproc/eqn/text.cpp: Include `stdlib.h'. - (box::set_spacing_type, special_char_box::~special_char_box, - split_text): Use `free'. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * src/preproc/grn/main.cpp (conv): Use `free'. +2022-09-18 G. Branden Robinson - * src/preproc/html/pre-html.cpp (get_resolution): Ditto. + [troff, ...]: Trivially refactor. - * src/preproc/pic/lex.cpp (macro_input::~macro_input, - argument_macro_input::~argument_macro_input, for_input::~for_input): - Ditto. + Boolify and rename internal library function from + `invalid_input_char` to `is_invalid_input_char`. - * src/preproc/pic/main.cpp (do_picture): Ditto. + * src/include/lib.h: Do it. - * src/preproc/pic/object.cpp: Include `stdlib.h'. - (text_piece::~text_piece, string_list::~string_list): Use `free'. + * src/libs/libgroff/font.cpp (text_file::next_line): + * src/preproc/eqn/lex.cpp (file_input::read_line): + * src/preproc/eqn/main.cpp (read_line, main): + * src/preproc/pic/lex.cpp (file_input::read_line, + simple_file_input::get, simple_file_input::peek): + * src/preproc/pic/main.cpp (top_input::get, top_input::peek) + (do_file): + * src/preproc/refer/command.cpp (input_stack::push_file): + * src/preproc/refer/refer.cpp (do_file, do_bib): + * src/roff/troff/env.cpp (environment::make_tag): + * src/roff/troff/input.cpp (file_iterator::fill) + (file_iterator::peek, get_char_for_escape_parameter) + (transparent_translate, read_request, asciify) + (input_char_description, read_string, transparent_file, + set_string): Update call sites. - * src/preproc/pic/pic.ypp (placeless_element, element, text, label, - expr_not_lower_than): Ditto. +2022-09-18 G. Branden Robinson - * src/preproc/pic/troff.cpp (troff_output::reset_color): Ditto. + [troff]: Tweak diagnostic messages. - * src/preproc/preconv/preconv.cpp (check_coding_tag): Ditto. + * src/roff/troff/input.cpp (token::description) + (input_char_description): Consistently use articles in + descriptive noun phrases. - * src/preproc/soelim/soelim.cpp (do_file): Ditto. +2022-09-18 G. Branden Robinson - * src/preproc/tbl/table.cpp (text_entry::~text_entry): Ditto. + [troff]: Tweak diagnostic messages. - * src/roff/groff/groff.cpp (possible_command::~possible_command, - possible_command::set_name): Ditto. + * src/roff/troff/input.cpp (non_empty_name_warning): Say + "identifier", not "name", in diagnostic message; it can be + thrown for attempted assignments to invalid register + identifiers, and some of our documentation refers to identifiers + in the name space shared by requests, macros, strings, and + diversions as "names". - * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Ditto. + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): + * src/roff/troff/input.cpp (get_char_for_escape_parameter) + (token::usable_as_delimiter, non_empty_name_warning) + (pipe_source, psbb_locator::psbb_locator, open_request) + (opena_request, define_class, pipe_output, system_request): + Consistently say "_is_ not allowed". The zero copula poses too + great a risk of incomprehension IMO. - * src/roff/troff/node.cpp (suppress_node::tprint): Ditto. +2022-09-15 G. Branden Robinson -2016-02-16 Bálint Réczey + [mdoc]: Add internal string `doc-Lk-font` to manage the typeface + in which to render URIs. - Use `malloc' in `strsave'; use `free' for returned pointers (#47164). + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Add it. Use roman instead of (Courier) + bold. This is more consistent with man(7)'s `UR` and less with + mandoc(1). - * src/libs/libgroff/font.cpp (text_file::~text_file): Use `free'. + * tmac/doc.tmac (Lk): Use it instead of `doc-Sy-font`. - * src/libs/libgroff/searchpath.cpp (search_path::open_file): Use - `free'. +2022-09-15 G. Branden Robinson - * src/libs/libgroff/strsave.cpp: Include `stdlib.h'. - (strsave): Use `malloc'. + [mdoc]: Fix Savannah #59738. -2016-02-16 Bálint Réczey + * tmac/doc.tmac (Lk): Process further macro arguments more like + other macros do, calling `doc-print-recursive`. This permits + recognition of end-of-sentence punctuation in the argument list. - Simplify memory allocation (#47162). + Fixes . - Many invalid memory accesses were caught by UBSAN (e.g., invalid - memory access in `small_temp_iterator::operator new') while - bootstrapping hardened1-linux-amd64 Debian port in the `free_list' - handling because it doesn't properly handle the padding between - array elements. +2022-09-15 G. Branden Robinson - Some places were already #if 0-d out anyway. + [mdoc]: Regression-test Savannah #59738. - * src/roff/troff/input.cpp (small_temp_iterator): Remove class. - (make_temp_iterator): Use `temp_iterator' only. + * tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh: Do + it. + * tmac/tmac.am (tmac_TESTS): Run test. - * src/devices/grotty/tty.cpp (tty_glyph): Remove `free_list', `new', - and `delete'. +2022-09-15 G. Branden Robinson - * src/include/color.h, src/include/color.cpp (color): Ditto. + [mdoc]: Fix code style nit. Rename `doc-arg-limit` to + `doc-arg-count`. This register doesn't track any sort of limit + on the number of arguments you can give to an mdoc(7) macro, or + anything like that. It is simply a count of the number of + arguments visible to the currently operating macro. - * src/roff/troff/env.cpp (tab): Ditto. + * tmac/doc.tmac: + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: + * tmac/mdoc/doc-syms: Do it. - * src/roff/troff/node.cpp (glyph_node): Ditto. +2022-09-13 G. Branden Robinson -2016-02-15 Bálint Réczey + [docs]: Fix errors in documentation regarding which escape + sequences accept newlines as argument delimiters, and other + inaccuracies. - [pre-grohtml] Fix out-of-bounds array access (#47161). + * doc/groff.texi (Escape Sequences): Cover general cases before + exceptional ones. Leaders can be used as argument delimiters. + Call out letters and numerals as (usually) usable as well. + Correct an almost completely inaccurate list of escape sequences + that accept a newline as an argument delimiter: \A, \b, \o, \w, + \X, and \Z do; \B does not. Correct example of use of newline + as delimiter with \o escape sequence. Stop referring to the + decimal point as an "operator". Drop "newline" from a list of + prohibited delimiters by several escape sequences since it has + already been discussed. - * src/preproc/html/pre-html.cpp (char_buffer::write_upto_newline): - Implement it. + * man/groff.7.man (Escape sequences): Replace weaksauce cross + reference to our Texinfo manual with a proper discussion of + acceptable delimiters in escape sequences, synced with the + foregoing change. Stop using quotation marks around escape + sequences, except for "\ " which obviously needs it. -2016-02-15 Bálint Réczey + Fixes . Thanks to Dave + Kemper for the report. - Don't use `memcpy' with NULL input or output argument (#47160). +2022-09-13 G. Branden Robinson - * src/libs/libgroff/string.cpp (string::string, string::operator=): - Implement it. + [troff]: Don't throw a spurious warning when using newline as + delimiter with the few escape sequences that permit this. - * src/roff/troff/input.cpp (temp_iterator::temp_iterator): Implement - it. + * src/roff/troff/input.cpp (do_overstrike, do_bracket, do_width) + (do_special): Do it. -2016-02-04 Carsten Kunze + Fixes . Thanks to Bjarni + Ingi Gislason for the report and Dave Kemper for the discussion. - * tmac/s.tmac: Bugfix of previous commit simplified (and - introduced redundancy removed) by use of .par*start for .QS and - .QE. This is consistent since any other paragraph macro is - using .par*start. +2022-09-13 G. Branden Robinson -2016-02-02 Carsten Kunze + [troff]: Add regression test for Savannah #63011. - * tmac/s.tmac: Macros .QS and .QE changed to insert vertical - inter-paragraph space. A paragraph bracketed with .QS/.QE - should appear identical to a .QP paragraph followed by .LP. + * src/roff/groff/tests/\ + some_escapes_accept_newline_delimiters.sh: Do it. + * src/roff/groff/groff.am (groff_TESTS): Run it. - * tmac/groff_ms.7.man, doc/groff.texi: Documentation of macros - .QS and .QE added and .QP information improved (effect of - registers QI and PD). +2022-09-13 G. Branden Robinson - See also discussion at groff@gnu.org, thread starting at + * src/roff/troff/input.cpp (do_special): Fix code style nit; + align function definition with declaration (internal linkage). - http://lists.gnu.org/archive/html/groff/2016-01/msg00033.html +2022-09-13 G. Branden Robinson - Issue reported by Douglas McIlroy + * src/devices/grops/ps.cpp (ps_printer::special) + (resource_manager::process_file): Fix code style nit. Mark + static structs initialized within functions and never modified + thereafter as `const`. This attempts to work around an apparent + false positive from AddressSanitizer. If it doesn't pacify + ASAN, please explain to me how constant structure members + initialized to string literals and pointers to functions within + the translation unit can ever be null. If that is infeasible, + please report a bug to your compiler vendor. -2015-12-26 Carsten Kunze + Fixes (addresses, at any rate) https://savannah.gnu.org/bugs/\ + ?61643>. Thanks to Bjarni Ingi Gislason for the report. - * contrib/mm/m.tmac: Disable macro misc@tag in case output - type is not HTML. +2022-09-09 G. Branden Robinson - This macro did cause unwanted space in case a MM macros .H - had been followed immediately by .DS. + [mdoc]: Refactor: relocate most rendering option handling to + "doc.tmac" from "doc-ditroff" and "doc-nroff", cutting down on a + lot of duplication. The `S` register retains separate handling. - (See also discussion at groff@gnu.org, thread starting at - http://lists.gnu.org/archive/html/groff/2015-12/msg00033.html) + * tmac/doc.tmac: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Do it. - Bug reported by Damian McGuckin . +2022-09-09 G. Branden Robinson -2015-12-14 Werner LEMBERG + * tmac/mdoc/doc-ditroff (doc-setup-page-layout): In troff mode, + if the user does not define the `LL` register, use the device's + default line length, not 6.5 inches. If the user does not + define the `LT` register, make the default line length for + titles the same as the regular line length, not 6.5 inches + independently of it. This is consistent with man(7)'s handling + of `LL` and `LT`. - * src/preproc/eqn/text.cpp (entity_table): s/lamda/lambda/. +2022-09-09 G. Branden Robinson - Bug reported by Brian McGuinness . + [mdoc]: Support `AD` string to set default adjustment mode. -2015-10-27 Deri James + * tmac/mdoc/doc-common (Sh): Set adjustment mode to + user-specified default, not troff's default (and not only in + troff mode). - gropdf was choking on -I flag passed by groff, now uses - these directories to search for included pdfs. - - * src/devices/gropdf/gropdf.pl: Handle -I flag, avoid - unitialised values. - - * src/roff/groff/groff.1.man: Include 'X pdf: pdfpic' - - * src/devices/gropdf/gropdf.1.man: Document -I flag - -2015-09-10 Bernd Warken + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Process `AD` string setting from command + line as man(7) does. - * src/roff/grog/subs.pl: fix comments + * tmac/groff_mdoc.7.man (Formatting with groff, troff, and + nroff): Document it. -2015-09-03 Bernd Warken + * NEWS: Add and update items. - * tmac/troffrc: Add .mso for file `pdfpic.tmac'. + Fixes part of . -2015-08-28 Bertrand Garrigues +2022-09-09 G. Branden Robinson - * Makefile.am: - - Use only the naming `.section.man' for all man.pages. - - Replace `.man.n' by `.man' only, such that no `.n' is - generated. - - For example, the source `groff.7.man' is transformed into - `groff.7' in the same directory and then is by installing just - copied into one of the suitable installed man directory. + * tmac/doc.tmac (doc-tag-list): Fix code style nit: don't give + `ad` request a numeric argument. Say `l` instead of `0`. -2015-08-27 Bernd Warken +2022-09-08 G. Branden Robinson - * tmac/pfdpic.tmac: Add tmac file for macro `PDFPIC'. + [mdoc]: Align inter-paragraph spacing with man(7). - * tmac/tmac.am: Add new `pdfpic.tmac' file. + * tmac/mdoc/doc-common: Use `doc-paragraph-space` when spacing + prior to section and subsection headings instead of spacing by + the 1v default. + * tmac/mdoc/doc-ditroff: Align inter-paragraph distance amount + in troff mode with man(7), reducing to 0.4v from 0.5v. - * man/groff_tmac.5.man: Add definition for the new tmac. +2022-09-08 G. Branden Robinson -2015-08-22 Bernd Warken + * tmac/mdoc/doc-nroff: Map monospaced fonts (CR, CB, CI, CBI) to + standard styles as man(7) has done for 15 years. This silences + warnings from the formatter when a man page attempts to use + fonts from the Courier family in tbl(1) tables, which is about + the only place a reasonable man page attempts such a thing. - * all man-pages *.man: Rename man-pages such that the man section - number before the final `.man'. +2022-09-07 G. Branden Robinson - * all *.am: Include renaming. + [mdoc]: Stop prefixing center header with name of operating + system. This was hard-coded to "BSD" and stuck on all mdoc(7) + pages using a default manual section number, regardless of host + operating system. Bad idea. Further, the argument to the `Os` + call, if any, or a default, is always disclosed in the left + footer. - * Makefile.am: Reset `.man.n' by `.[157].man.n' with SUFFIXES - `.[157].man .n'. + * tmac/mdoc/doc-common: Do it. + (Dt): Initialize `doc-volume` as empty and annotate it; + calling the macro with a numeric second argument overrides the + fallback default of "LOCAL". A slash is no longer needed to + separate a recognized architecture string from the OS name, so + drop it. -2015-08-20 Bernd Warken + * tmac/tests/doc_smoke-test.sh: Update test expectations. - * Makefile.am: Fix definition of man[157]_MANS. +2022-09-07 G. Branden Robinson -2015-08-13 Bernd Warken + [mdoc]: Drop dead code. The register + `doc-volume-operating-system-ateol`, introduced in groff 1.18 + {July 2002}, was being tested but never set to a nonzero value. + In fact, it seems never to have been. - * all *.am: Correct Emacs mode `End:' instead of `End.'. + * tmac/mdoc/doc-common: Get rid of it... + (Dt): ...and the dependent block. -2015-08-09 Werner LEMBERG +2022-09-07 G. Branden Robinson - Revert previous commit, since it doesn't work correctly yet. + [mdoc]: Make `Ux` render "Unix" in mixed case. -2015-08-07 Bernd Warken + * tmac/mdoc/doc-syms (Ux): Do it. Also remove local string + after we're done with it. - Add section name to all man-page names. + Continues work begun prior to groff 1.22.4 release. - * Makefile.am: In `install-prefix-man' and `uninstall-prefix-man' - change `sed' commands. Correct saving in man[157]_MANS. +2022-09-07 G. Branden Robinson - * all *.man in source tree: Rename `manpage.man' to - `manpage.[157].man'. + [mdoc]: Align spacing around headers with man(7). - * all makefile.am in source tree: Add new man-page file name. + * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars): + * tmac/mdoc/doc-common (Rd): + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Stop defining, saving, and restoring + `doc-header-space`. -2015-08-05 Bernd Warken + * tmac/mdoc/doc-common (doc-header): When starting new document + and not continuously rendering, space by one half-inch instead + of by the now-defunct `doc-header-space` amount (which, + strictly, should not have applied to this measurement). If + continuously rendering, extend page length by 1v to accommodate + header line. After formatting header, if not continuously + rendering, space to 1 inch below first text baseline. - * Makefile.am, arch/mingw/mingw.am, arch/misc/misc.am, - * contrib/eqn2graph/eqn2graph.am, contrib/grap2graph/grap2graph, - * contrib/pic2graph/pic2graph.am, doc/doc.am, - * font/devX100/devX100.am, font/devX100-12/devX100-12.am, - * font/devX75/devX75.am, font/devX75-12/devX75-12.am, - * font/devascii/devascii.am, font/devcp1047/devcp1047.am, - * font/devdvi/devdvi.am, font/devhtml/devhtml.am, - * font/devlatin1/devlatin1.am, font/devlbp/devlbp.am, - * font/devlj4/devlj4.am, font/devpdf/devpdf.am, - * font/devps/devps.am, font/devutf8/devutf8.am, - * font/scripts/scripts.am, man/man.am, - * src/devices/grodvi/grodvi.am, src/devices/grohtml/grohtml.am, - * src/devices/grolbp/grolbp.am, src/devices/grolj4/grolj4.am, - * src/devices/gropdf/gropdf.am, src/devices/grops/grops.am, - * src/devices/grotty/grotty.am, - * src/include/include.am, src/libs/libbib/libbib.am, - * src/libs/libdriver/libdriver.am, src/libs/libgroff/libgroff.am, - * src/libs/libxutil/libxutil.am, src/preproc/grn/grn.am, - * src/preproc/html/html.am, src/preproc/pic/pic.am, - * src/preproc/preconv/preconv.am, src/preproc/tbl/tbl.am - * src/preproc/refer/refer.am, src/preproc/soelim/soelim.am, - * src/roff/groff/groff.am, src/roff/grog/grog.am, - * src/roff/nroff/nroff.am, src/roff/troff/troff.am, - * src/utils/addftinfo/addftinfo.am, - * src/utils/afmtodit/afmtodit.am, src/utils/hpftodit/hpftodit.am, - * src/utils/indxbib/indxbib.am, src/utils/lkbib/lkbib.am, - * src/utils/lookbib/lookbib.am, src/utils/pfbtops/pfbtops.am, - * src/utils/tfmtodit/tfmtodit.am, src/utils/xtotroff/xtotroff.am, - * tmac/tmac.am: - Add `Last update'. Setup Emacs mode. +2022-09-07 G. Branden Robinson -2015-07-29 Bernd Warken + [mdoc]: Support `C` register for consecutive page numbering. - * src/roff/grog/subs.pl: Add -T for all `grog' output, also using - -Tps when no option -T is given in the arguments. + * tmac/mdoc/doc-common (Dd): Reset page number to 1 upon new + document only if not consecutively numbering. - * src/roff/grog/grog.man: Add information about -T output. + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Process `C` register setting from command + line as man(7) does. -2015-07-23 Bernd Warken + * tmac/groff_mdoc.7.man (Formatting with groff, troff, and + nroff): Document it. - * man/groff.man: Add last update. Add link on Wikipedia on groff. - Add link of groff tutorial by Laha. + Fixes part of . -2015-07-19 Bernd Warken +2022-09-07 G. Branden Robinson - * src/roff/grog/*.pl: Add last update. + [mdoc]: Align trap management more closely with man(7). - * src/roff/grog/subs.pl: Remove call to Perl INC::System::Simple, - use backticks instead. - Define &err(). - Reorder some extensions. - Distinguish between .TH at first command for man and later on for - ms. + * tmac/mdoc/doc-common: Call new macro (see below) + `doc-set-up-continuous-rendering` when initializing, if that + mode is configured. + (doc-ne): New macro replaces `ne` request + in continuous rendering mode. It extends the page length by the + amount in the argument or by 1v if none given. + (doc-bp): New macro replaces `bp` request in continuous + rendering mode, setting the page length to the vertical drawing + position. + (doc-set-up-continuous-rendering): New macro renames requests to + emplace the foregoing. + (Dd): Interpret this macro call strictly as starting a new + mdoc(7) document. (andoc.tmac already makes this assumption, + and has for over 20 years. groff_mdoc(7) and mandoc_mdoc(7) + also prescribe the sequence `Dd`, `Dt`, `Os`.) We require this + invariant even more rigidly now because it's the only way we can + be sure that we can process multiple documents while rendering + headers and footers with information corresponding to the + appropriate document. (man(7)'s `TH` has an advantage here in + that calling it is "atomic": from its arguments alone you can + obtain everything you need to know to format the header and + footer. In mdoc(7), permuting the initialization macro order + reliably produces chaos.) Break the page (if necessary) + _before_ processing any arguments (instead of after), to flush + the previous page's footer. Stop calling `doc-set-up-titles` + here; we don't have enough information to do that yet. Also + stop writing the PDF bookmark here, because `doc-document-title` + and `doc-section` will not reflect the new page content yet. + (Os): Once the `doc-operating-system` string content has been + determined, call `doc-set-up-titles`, write the PDF bookmark for + the page, and call `doc-header`, causing the page header to be + formatted. These changes further imply a stronger requirement + on initialization macro ordering being canonical. -2015-07-01 Peter Bray + Fixes (7/7). - Fix Savannah bug #44784. +2022-09-07 G. Branden Robinson - Compatibility Mode rendering of groff manual pages + [mdoc]: Trivially refactor. Relocate string and macro + definition within file. mdoc(7) mandates that the document + setup macros `Dd`, `Dt`, and `Os` be called in that order; + arrange their definitions accordingly, for maintainability. - * m4/groff.m4 (GROFF_WITH_COMPATIBILITY_WRAPPERS): New macro to - implement 'configure' option - '--with-compatibility-wrappers='. With this option the - user can control how groff compatibility wrappers for - vendor-provided non-GNU macro sets are installed. +2022-09-06 G. Branden Robinson - * configure.ac: Use new macro GROFF_WITH_COMPATIBILITY_WRAPPERS. + [mdoc]: Refactor. Rename strings and macro for clarity. These + things don't only affect headers. + - doc-header-string -> doc-pageref + - doc-header-string-saved -> doc-pageref-saved + - doc-setup-header -> doc-set-up-titles - * Makefile.am: Define tmac_*_prefix if 'compatibility_wrappers' is - set to 'yes'. + * tmac/doc.tmac: + * tmac/mdoc/doc-common: Do it. - * tmac/tmac.am: Use 'compatibility_wrappers' to control the - installation: +2022-09-06 G. Branden Robinson - - If set to `no', the groff-provided macro set are installed in - /share/groff//tmac/ with the original macro set - name. + [mdoc]: Refactor. There is no difference in + `doc-header-string` and `doc-setup-header` between the files + "doc-ditroff" and "doc-nroff", so define them only once, in + "doc-common". - - If set to `yes', the groff-provided macro set are installed in - /share/groff//tmac/ with a prefix of - $(tmac_prefix) (which is usually `g') and the generated - compatibility wrappers are installed in - /lib/groff/site-tmac, with the original macro set name. + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Do it. + +2022-09-06 G. Branden Robinson + + [mdoc]: Align footer management more closely with man(7). - - If set to `manual', the groff-provided macro set are installed - in /share/groff//tmac/ with the original macro - set name and the generated compatibility wrappers are installed in - /lib/groff/site-tmac, with a name of - (which is usually `-os'). + * tmac/doc.tmac (doc-save-global-vars, doc-restore-global-vars): + * tmac/mdoc/doc-common (Rd): + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Stop defining, saving, and restoring + `doc-footer-space`. -2015-06-17 Werner LEMBERG + * tmac/mdoc/doc-common (doc-break-body-text): New macro, called + only when not continuously rendering, schedules a page break. + (doc-footer): Stop vertically spacing by `doc-footer-space`, + instead relying upon a trap to move us here. - * tmac/tty.tmac: Fix mapping of \[bu] character for -Tutf8. + * tmac/mdoc/doc-ditroff (doc-setup-header): + * tmac/mdoc/doc-nroff (doc-setup-header): Set traps at the end + of the page where man(7) does by default; break the body text at + 1 inch from the page bottom, and write the footer at ½ inch. - Problem reported by carsten.kunze@arcor.de. + * tmac/mdoc/doc-nroff (doc-setup-header): Add 1/6 em "thin + space" between man page name and parenthesized section, for + precise parity with doc-ditroff implementation. (`\|` does not + take up any character cells on nroff devices.) -2015-06-15 Deri James + Fixes (6/7). - pdfmom should use $RT_SEP as path separator. +2022-09-06 G. Branden Robinson - * src/devices/gropdf/gropdf.am: Use @RT_SEP@ as path separator. + * tmac/mdoc/doc-common (Dt, Dd): Emit diagnostic warnings if + macros called with no arguments. - * src/devices/gropdf/pdfmom.pl: As above but also fix typo in regex - for grep. + Fixes (5/7). -2015-05-08 Eli Zaretskii +2022-09-06 G. Branden Robinson - [groff] Make relocation really work. + [mdoc]: Fix code style nit: stop using Control+G as an escape + sequence argument delimiter. This is not necessary in groff and + hasn't been for at least thirty years. See the node/section + "Implementation Differences" of our Texinfo manual. Our mdoc + implementation does not operate in compatibility mode, so using + control characters like this obfuscates input to no advantage. - See + * tmac/doc.tmac: + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: + * tmac/mdoc/doc-syms: Do it. - https://lists.gnu.org/archive/html/groff/2015-05/msg00000.html +2022-09-06 G. Branden Robinson - * src/roff/groff/groff.cpp: Include `relocate.h'. - (main): Use `relocatep'. + * tmac/mdoc/doc-common (doc-footer): Pull more footer concerns + into this macro. Don't bail out if continuously rendering; + instead, format the appropriate footer text if we are. For now, + break the page only if we are not continuously rendering. + (doc-end-macro): Call `doc-footer` instead of formatting footer + here. -2015-05-03 Bertrand Garrigues + Fixes (4/7). - Fix Savannah bug #44768 (Solaris 10 compatibility issues). +2022-09-06 G. Branden Robinson - * m4/groff.m4 (GROFF_DIFF_D): new macro to check if `diff' has - option -D, and search for `gdiff' if not (new variable DIFF_PROG - will contain the `diff' program to be used). + * tmac/mdoc/doc-common (doc-end-macro): When continuously + rendering, set the page reference (e.g., "ls(1)") in the right + footer instead of repeating the left footer. Thanks to Ingo + Schwarze for the discussion. - * m4/groff.m4 (GROFF_HAVE_TEST_EF_OPTION): new macro to check if - `test' supports the option -ef (created new variable - HAVE_TEST_EF_OPTION). + * tmac/tests/doc_smoke-test.sh: Update expectations of footer + regression test. - * m4/groff.m4 (GROFF_BASH): new macro to search for `bash' (new - variable BASH_PROG will contain the full path to `bash' or - `/bin/sh' if `bash' was not found). + Fixes part of . - * configure.ac: use the 3 new macros defined in m4/groff.m4. +2022-09-06 G. Branden Robinson - * contrib/gdiffmk/gdiffmk.am: set HAVE_TEST_EF_OPTION, BASH_PROG, - DIFF_PROG in the generated script `gdiffmk'. + * tmac/mdoc/doc-common (doc-end-macro): Reset strings to reduce + info leaks from one man page to the next. - * contrib/gdiffmk/gdiffmk.sh: - - Fix incorrect space after '!' in sed script regex. - - `test -ef' is not portable: If `bash' is not available and the - shell does not support `test -ef', the option to pass a third - argument as the output file is disabled. - - Report an error if `diff' does not support -D option. - - GNU diff and Solaris diff support -D, but #ifndef / #endif are - treated differently (GNU adds a '!' in the #endif): modify the - regexs in the sed script accordingly. + Fixes (3/7). -2015-05-01 Werner LEMBERG +2022-09-06 G. Branden Robinson - * tmac/tmac.am (TMACNORMALFILES): Add `zh.tmac'. + * tmac/mdoc/doc-common (Dt): Stop reinitializing `doc-volume` + and `doc-section`. This is the job of package initialization + {and, soon, the end-of-input macro}. -2015-04-30 Darcy SHEN + Fixes (2/7). - Fix Savannah bug #44941. +2022-09-06 G. Branden Robinson - * tmac/zh.tmac: New file to support basic Chinese (both simplified - and traditional). + * tmac/mdoc/doc-common: Populate default date string + `doc-date-string` with "UNDATED". + (Dd, Dt, Os): Make more orthogonal: stop touching + `doc-topic-name`. It is "doc.tmac"'s job to initialize it and + the `Nm` macro's job to update it. + (Dd): Do nothing if given no arguments. (You can still blank + out the document date with an explicitly empty argument: + .Dd "" + .) -2015-04-22 Deri James + Fixes (1/7). - Fix Savannah bug #44891. +2022-09-06 G. Branden Robinson - * src/devices/gropdf/gropdf.pl: If module Compress::Zlib is not - available fall back to producing uncompressed PDF and output a - warning. + * tmac/mdoc/doc-common: Change `doc-default-operating-system` + string from "BSD" to "GNU", per discussion with Ingo Schwarze. + See . -2015-04-22 Bjarni Ingi Gislason + * tmac/tests/doc_smoke-test.sh: Update expectations of footer + regression test. - Fix Savannah bug #44894. +2022-09-06 G. Branden Robinson - * tmac/strip.sed: Add a `generated file' warning. + * tmac/mdoc/doc-common (Dt): Delete lingering and useless + definition of `doc-command-name` string. Thanks to Steffen + Nurpmeso for the report. See commit e9e92ee008, 27 August. -2015-04-21 Deri James +2022-09-03 G. Branden Robinson - Fix Savannah bug #44890. - Patch by Peter Bray. + * src/preproc/pic/pic.ypp (not_lower_than): Emit deprecation + warning for use of 'rand()' with a (non-empty) argument. The + man page has declared it thus for over 30 years, at least since + groff 1.02 (June 1991). - * font/devpdf/devpdf.am: Don't use 'find -maxdepth'. +2022-09-03 G. Branden Robinson -2015-03-07 Ingo Schwarze + * src/preproc/pic/pic.ypp (object_spec): Emit deprecation + diagnostic for "plot" command. The man page has declared it + thus for over 30 years, at least since groff 1.02 (June 1991). - [mdoc] Fix Savannah bug #44733. +2022-09-03 G. Branden Robinson - Prevent mdoc(7) Bl with trailing -width or -offset from picking up - old args. + * src/preproc/pic/pic.ypp (placeless_element): Explicitly say + that an unsafe command is being ignored in diagnostic. - * tmac/doc.tmac-u (doc-do-Bl-args): When checking whether there is - another argument to a Bl macro, do not inspect the argument list - because it is never cleaned and may contain arguments from previous - macro invocations. Instead, inspect the argument count which is - always up to date. +2022-09-03 G. Branden Robinson -2015-04-10 Daiki Ueno + * src/preproc/eqn/main.cpp (main): Drop man page reference from + deprecation diagnostics. The man page might be installed with a + prefix determined at configuration time, and that's too much + trouble to mess with for construction of a message. Trust the + user of these ancient options to try reading the man page with + the same name as the command. - Fix link error on NetBSD 6. +2022-09-03 G. Branden Robinson - Reported by carsten.kunze@arcor.de in: - . - The problem can also be reproduced if gl_cv_func_wcwidth_works=no - is passed to configure. + [docs]: Revise discussion of measurements. - * src/preproc/grn/grn.am (grn_LDADD): Change the link order of - libgroff.a and lib/libgnu.a according to dependency. - * src/roff/troff/troff.am (troff_LDADD): Likewise. + * doc/groff.texi: Drop Texinfo @codequote* command brackets + around revised sections; relevant nodes have been reviewed for + correct glyph usage. Move concept index entries for obsolescent + term "machine units" to same location as "basic units". + Bump document date. + (Measurements): Rewrite presentation. We have already + introduced page geometry concepts, including the concept of + basic units. + (Motion Quanta): New subsection node; introduce this concept + much sooner, right after measurement units. Relocate + documentation of `.H` and `.V` registers from a miscellaneous + read-only register list here. Introduce example of rounding to + horizontal motion quantum. + (Default Units): Revise discussion. Stop abusing @result + notation in example. + (Built-In Registers): Relocate `.H` and `.V` as above. -2015-04-08 Werner LEMBERG + * man/groff.7.man: Sync with Texinfo content updates. - Fix Savannah bug #44767. - Patch by Peter Bray. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * src/roff/grog/grog.am (grog): Correctly substitute `grog_dir'. +2022-09-02 G. Branden Robinson -2015-04-03 Werner LEMBERG + Drop groff_filenames(5) document. It says nothing accurate that + is not covered elsewhere. - Fix Savannah bug #44708 (2/2). + * contrib/groff_filenames: Delete. + * doc/doc.am (GROFF_MAN_PAGES): Drop. + * src/roff/groff/groff.1.man: Drop cross reference to it. + * NEWS: Add item. - Make man pages work in compatibility mode. - Also fix some minor typos. + Fixes . - * contrib/pic2graph/pic2graph.man, man/ditroff.man, man/groff.man, - man/groff_diff.man, man/groff_out.man, man/groff_tmac.man, - man/roff.man, src/devices/grodvi/grodvi.man, - src/devices/grohtml/grohtml.man, src/devices/grolbp/grolbp.man, - src/devices/grolj4/grolj4.man, src/devices/grolj4/lj4_font.man, - src/devices/gropdf/gropdf.man, src/devices/gropdf/pdfmom.man, - src/devices/grops/grops.man, src/devices/grotty/grotty.man, - src/devices/xditview/xditview.man, src/preproc/eqn/eqn.man, - src/preproc/eqn/neqn.man, src/preproc/grn/grn.man, - src/preproc/pic/pic.man, src/preproc/preconv/preconv.man, - src/preproc/refer/refer.man, src/preproc/soelim/soelim.man, - src/preproc/tbl/tbl.man, src/roff/groff/groff.man, - src/roff/grog/grog.man, src/roff/nroff/nroff.man, - src/roff/troff/troff.man, src/utils/addftinto/addftinfo.man, - src/utils/afmtodit/afmtodit.man, src/utils/hpftodit/hpftodit.man, - src/utils/indxbib/indxbib.man, src/utils/lkbib/lkbib.man, - src/utils/lookbib/lookbib.man, src/utils/pfbtops/pfbtops.man, - src/utils/tfmtodit/tfmtodit.man, src/utils/xtotroff/xtotroff.man, - tmac/groff_man.man, tmac/groff_trace.man: Do it. +2022-09-01 G. Branden Robinson -2015-04-03 Werner LEMBERG + * src/preproc/tbl/tbl.1.man (Table data): Generalize discussion + of roff control line use in tables. + (Examples): Illustrate how to embed a comment in a table. - Fix Savannah bug #44708 (1/2). +2022-08-31 G. Branden Robinson - * tmac/andoc.tmac (reload_doc, reload_man): Don't use `de1', - otherwise we can't manipulate the compatibility flag within the - macro. + * NEWS: man(7)'s `TS` no longer adds vertical space. See commit + 7ec36dc9b9, 30 July. - * tmac/doc-common-u (Dt): Remove invalid leading whitespace. +2022-08-28 G. Branden Robinson -2015-03-11 Deri James + * src/preproc/eqn/main.cpp (main): Issue deprecation warning + upon use of '-p' or '-s' options. The eqn(1) man page has + documented these as deprecated since at least groff 1.02 (June + 1991). Don't count on them sticking around another 30 years. - * src/devices/gropdf/gropdf.pl: Was not handling the final glyph - correctly in the "standard" fonts which are not embedded. They - actually have 257 glyphs (0-256) not 256 as I'd assumed, so the - remappiing code needs to be applied for them as well as the - embedded downloadable fonts. +2022-08-28 G. Branden Robinson -2015-03-11 Deri James + * src/preproc/eqn/main.cpp (main): Clarify error diagnostics + regarding invalid option arguments. Identify the option being + handled at the time and characterize the argument as "invalid", + not "bad". - * src/devices/gropdf/gropdf.pl: Fix problem remappiing - ellipsis (affects all glyphs > 255). +2022-08-28 G. Branden Robinson -2015-03-07 Werner LEMBERG + [eqn]: Drop support for undocumented '-D' option. It has been + undocumented, and issued a warning of its obsolescence upon use, + for 30 years, since groff 1.06 (September 1992). That's plenty + long enough for a deprecation cycle. - * tmac/tmac.am (TMACSPECIALFILES): Removed. No longer used. + * src/preproc/eqn/main.cpp (main): Do it. + * NEWS: Add item. -2015-03-07 Ingo Schwarze +2022-08-27 G. Branden Robinson - * tmac/doc-common-u (Dd): Avoid warning `unbalanced .el request'. + [man]: (EX, EE): Always break line, even if call invalid. -2015-02-12 Werner LEMBERG + * tmac/an.tmac (EX, EE): + * tmac/an-ext.tmac (EX, EE): Do it. Ingo Schwarze pointed out + that page authors will expect breaking semantics from these + macros even if using them in an ill-formed way. In a + well-formed document, the breaks are redundant but harmless (the + later `nf` and `fi` requests, respectively, also cause breaks). - Minor fixes due to renaming `groff.texinfo' to `groff.texi'. +2022-08-27 G. Branden Robinson - * doc/doc.am (SUFFIXES): Update. - * m4/groff.m4 (GROFF_MAKEINFO): Update. + [mdoc]: Trivially refactor. -2015-01-30 Bertrand Garrigues + * tmac/doc.tmac: + * tmac/mdoc/doc-common: Rename string `doc-command-name` to + `doc-topic-name`; the former is misleading for man pages not in + sections 1, 6, or 8. - Automake migration and Gnulib integration. +2022-08-25 Bjarni Ingi Gislason - Gnulib: - - Added gnulib as a git submodule. - - Integrated bootstrap scripts from gnulib. - - Gnulib m4 directory is now in `gnulib_m4', while Gnulib's .c - files are located in `lib'. `gnulib_m4' and `lib' are generated - and distributed. + * man/groff_char.7.man: Fix bad example syntax. - Automake: - - Removed Makefiles from the old build system. - - Converted Makefile.in into Makefile.am. - - Converted Makefile.sub files in all directories to a .am file. - - Removed configure, src/include/config.hin (now generated). - - Removed various helper scripts (config.guess, config.rpath...), - now installed by bootstrap in `build-aux'. - - Moved aclocal.m4 to acinclude.m4 (aclocal.m4 is now generated). - - Makefile in non-recursive style. - - Updated INSTALL.REPO (INSTALL is now a symlink to - gnulib/doc/INSTALL, original INSTALL file moved to INSTALL.extra) - - Added (empty) THANKS, AUTHORS files. - - Added a document on the usage of automake in groff in - doc/automake.pdf. + Fixes . - Additional features: - - Out-of-source build is supported. - - Parallel build is possible (make -j). - - Automatic targets from Automake: `make dist', `make distcheck'. - - 'make check' is available for automatic testing, gdiffmk's test - was plugged to this target. - - Auto-detect if make has builtin variable `RM'. +2022-08-25 G. Branden Robinson -2015-01-14 Ingo Schwarze + [mdoc]: Trivially refactor. - Fix Savannah bug #43905. + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Stop using "Null" as an empty string + indicator when comparing a string interpolation to an empty + parameter will serve just as well; it is also more idiomatic. + The string in question, `doc-section`, is never formatted if it + is empty anyway; the very tests at issue, which populate + `doc-header-string`, ensure this. - * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), - * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Remove - double entries for `rk', `lk', `lt', `rt', `rb', and `lb'. +2022-08-23 G. Branden Robinson -2014-12-16 Werner LEMBERG + * src/roff/troff/env.cpp (environment::set_family): Throw error + if user requests a font family that (when combined with the + current style) can't be resolved to a real font name. Fixes a + regression introduced by me in commit d8cb8cf9d8, 2021-09-15, + arising from a revision of font selection logic in node.cpp to + enable a bunch of _other_ font error diagnostics. - Update Unicode-to-Unicode mapping to version 7.0.0. + Fixes . Thanks to Dave + Kemper for the report and two useful end points for a bisection. - * src/libs/libgroff/make-uniuni: Update emitted copyright. +2022-08-23 G. Branden Robinson - * src/libs/libgroff/uniuni.cpp: Regenerated. + * src/roff/troff/env.cpp (environment::set_family): Add some + paranoia. Add `assert()`s on the previous font mounting + position still being valid and the font family dictionary lookup + not returning a null pointer. Add an early return for the + latter case (which should be impossible). -2014-11-29 Werner LEMBERG +2022-08-23 G. Branden Robinson - Fix previous commit. + * src/roff/troff/node.cpp (font_family::make_definite): + Refactor. Rename parameter from inscrutable `i` to + `mounting_position`. Add `assert()` to enforce invariant: we're + passed a mounting position that is nonnegative. Use `pos` as + short alias of parameter once we're into the function body. + Relocate conditional branches to front-load early returns as + well as those requiring little code to handle. This reduces the + average indentation level of the function, a readability win. - We forgot to test whether the patch works if compiling from - scratch... +2022-08-23 G. Branden Robinson - Problem reported by Bertrand Garrigues - . + [man]: Restore robustness to `EE` misuse. - * src/include/lib.h (interpret_lf_args, normalize_for_lf): Move - declarations to... - * src/include/lf.h: This new file. + * tmac/an.tmac: Add `an*is-in-example` register to track state + of within-exampleness. Not doing so can cause a spurious use of + `EE` to wrongly set the inter-paragraph distance to zero. + (TH): Initialize register. + (EX): Test register; if set, ignore macro call and, if + `CHECKSTYLE` warnings are on, throw diagnostic. Set register. + (EE): Test register; if clear, ignore macro call and, if + `CHECKSTYLE` warnings are on, throw diagnostic. Clear register. - * src/libs/libgroff/lf.cpp, src/preproc/pic/pic.h, - src/preproc/preconv/preconv.cpp, src/preproc/refer/refer.h, - src/preproc/soelim/soelim.cpp, src/preproc/tbl/table.h: Include - `lf.h'. - Make `lib.h' the first included header file. + * tmac/an-ext.tmac (EX, EE): Similar, using `mX` register. + Because AT&T troff had no `return` request, invert the sense of + the tests and put the entire macro bodies inside conditionals. - * src/preproc/eqn/eqn.h: Don't include `stringclass.h'. - * src/preproc/eqn/main.cpp: Include `stringclass.h' and `lf.h'. + This regressed post-1.22.4. Thanks to Ingo Schwarze for the + report and a proposed patch. - * src/roff/groff/groff.cpp: Make `lib.h' the first included header - file. +2022-08-23 G. Branden Robinson -2014-11-10 Eli Zaretskii + * tmac/an-ext.tmac: Refactor. Rename `mX` to `mZ` so we can use + `mX` for an "in-example" state register in a future commit. + Rename `mE` to `mF` to store the current font's mounting + position. Bizarrely, `mF` was not already used for this + purpose. - Improve native Windows port. +2022-08-22 G. Branden Robinson - This patch fixes two issues. + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + Trivially refactor. Use separate string constant for invariant + material. (This will make it easier to, for example, store the + diagnostic level strings in an array that can be indexed by + their corresponding `enum` type.) - . Handle backslashes in `.lf' arguments for MSDOS and Windows. - . Fix file name quoting for the groff pipeline. +2022-08-22 G. Branden Robinson - * src/preproc/soelim/soelim.cpp (do_file): - * src/preproc/refer/refer.cpp (do_file): - * src/preproc/preconv/preconv.cpp (do_file): - * src/preproc/pic/main.cpp (do_file): - * src/preproc/eqn/main.cpp (do_file): Call `normalize_for_lf' to - convert backslashes in the file name being processed to forward - slashes. + * src/roff/troff/input.cpp (fatal_with_file_and_line) + (error_with_file_and_line, debug_with_file_and_line): Align more + closely with GNU Coding Standards regarding diagnostics: don't + suffix the colon after the program name with a space when + location information follows. - * src/include/lib.h (normalize_for_lf): Add prototype. +2022-08-22 G. Branden Robinson - * src/preproc/eqn/eqn.h: - * src/preproc/pic/pic.h: - * src/preproc/refer/refer.h: - * src/preproc/tbl/table.h: Include stringclass.h before lib.h. + * src/devices/grohtml/grohtml.1.man: Fix erroneous claim. + Images are not generated when "baseline rules" or "box rules" + are encountered in the input. These are troff special + characters; the former is converted to an underscore and the + latter to U+2502, "box drawings light vertical". This remains + true even if a series of them is drawn with the `\l` escape + sequence. (I also checked vertical line drawing with `\L`. + grohtml's handling of that provoked a rather wet eructation from + my lower esophageal sphincter--the output is assuredly not + correct. But it's still not an image.) - * src/libs/libgroff/lf.cpp (normalize_for_lf): New function. +2022-08-22 Deri James - * src/roff/groff/groff.cpp: Include stringclass.h before lib.h. - (append_arg_to_string) [_WIN32 && !__CYGWIN__]: Use only "..." for - quoting in native Windows builds. + Bug #62934 - after glyph remapped mark it as used -2014-11-18 Deri James + When many glyphs are remapped from code points above 255 + such as writing documents in cyrillic with the U-TR fonts, + gropdf starts reusing code points in the range 128-255. + If subsequently one of those code points is actually required, + such as \(em (code 138), and it has been replaced by a + cyrillic, then it needs to be mapped to another free code. - My commit '3fe78135c9fe666dadffde2a822b0535d8db6feb' introduced - problem in subroutine `TextWid'. Octal char `\nnn' returns width of - 4 char string rather than width of single character. + To determine if a particular code point is free each glyph + has a USED flag. The bug was caused because after remapping + \(em to the next free glyph the USED flag was not set. So the + next new cyrillic character to be entered was given the same + code point as had been allocated to \(em. - * src/devices/gropdf/gropdf.pl: Change `TextWid' to recognise octal - escaped characters (\nnn). + * src/devices/gropdf/gropdf.pl: Set the USED flag on remapped + glyphs. -2014-11-07 Deri James + Fixes . - See bug #43555. + Thanks to Nikita Ivanov for spotting the problem and testing + the fix. - * src/devices/gropdf/gropdf.pl: Correct Date Format. +2022-08-20 Deri James -2014-11-04 Werner LEMBERG + Bug #62923 - problem using aliased glyphs - * src/libs/gnulib/*: Regenerate autotool files. + With a large font if 2 characters above the 255 code + point limit are aliased, the aliased glyph has incorrect meta + data. -2014-11-04 Werner LEMBERG + * src/devices/gropdf/gropdf.pl: Instead of duplicating a pointer + to the font metadata, duplicate the data itself. Then, if the + glyph is remapped to a code point under 256, the metadata is + preserved. -Version 1.22.3 released -======================= + Fixes . Thanks to Nikita + Ivanov for the report. - * NEWS, README, doc/webpage.ms: Updated. +2022-08-18 Deri James - * doc/texinfo.tex: Updated from `texinfo' repository. + [gropdf]: Improve parsing of troff font files. -2014-10-29 Bertrand Garrigues + * src/devices/gropdf/gropdf.pl: Allow the glyph code number + to be octal or hex as well as a decimal number. If entity_name + is missing use name instead. - * Makefile.in (OTHERDIRS): Mention `afmtodit' first. +2022-08-15 G. Branden Robinson - Otherwise, some fonts in `devpdf' (`U-*') are not built. + [ms]: Support pic(1) "flyback" feature. -2014-10-26 Eli Zaretskii - Werner LEMBERG + * tmac/s.tmac (PF): Add macro; it does what `PE` formerly did, + minus vertical spacing. + (PE): Call `PF` and vertically space as before. - Add Windows `.cmd' wrapper files. + * doc/groff.texi (ms Insertions): + * doc/ms.ms (Tables, figures, equations, and references): + * tmac/groff_ms.7.man (Tables, figures, equations, and + references): Document it. - * arch/mingw/*: New files, provided by Eli. + * NEWS: Add item. - * Makefile.in (make_winscripts, make_install_winscripts, - make_uninstall_winscripts): New target variables. - (MDEFINES): Add them. - (OTHERDIRS): Add `arch/mingw'. + Fixes . - * m4/groff.m4 (GROFF_CMD_FILES): New macro - * configure.ac: Call it. - * configure: Regenerated. +2022-08-15 G. Branden Robinson -2014-10-23 Bertrand Garrigues + * tmac/s.tmac (@PS): Validate better; check for 2 arguments + exactly. - Fix `install' and `uninstall' issues. +2022-08-14 G. Branden Robinson - * contrib/chem/Makefile.sub (install_data): Fix build with option - --with-doc=no passed to configure (target `install_examples' - should not be executed). + [pic]: Recognize `.PY` as synonym of `.PF`. - * contrib/chem/Makefile.sub (uninstall_sub): `uninstall' failed - if directories to be removed were not present. + * src/preproc/pic/main.cpp: + * src/preproc/pic/pic.h: Add new Boolean variable, + `want_alternate_flyback` to record `.PY` usage. - * contrib/gpinyin/Makefile.sub (uninstall_sub): Ditto. + * src/preproc/pic/main.cpp (top_input::get, top_input::peek): + Recognize it. Update diagnostic messages to mention it. + (main): Define `PY` troff macro as empty if not defined. - * contrib/hdtbl/Makefile.sub (GENFILES): generated files should - depend on the creation of the `examples' directory. + * src/preproc/pic/troff.cpp (troff_output::finish_picture): + Don't advance the vertical position if `want_alternate_flyback`. + Write out the `PY` macro call if it was on the input. -2014-10-23 Daiki Ueno + * src/preproc/pic/pic.1.man: Document it. - * m4/iconv.m4: Really avoid false detection of non-working iconv. + * tmac/pic.tmac (PY): Define the same as `PF`. -2014-10-21 Daiki Ueno + * NEWS: Add item. - iconv: avoid false detection of non-working iconv + Fixes . - The INBUF/OUTBUF arguments of iconv can be either 'const char **' - or 'char **'. If CC is g++, the difference causes a compile error - and thus leads to a false detection of non-working iconv. - Reported by Eli Zaretskii and Werner LEMBERG in: - . +2022-08-14 G. Branden Robinson - * m4/iconv.m4 (AM_ICONV_LINK): Try all possible argument types of - iconv. Bump serial number. + [pic]: Refactor `flyback_flag`. -2014-10-20 Werner LEMBERG + * src/preproc/pic/main.cpp: + * src/preproc/pic/pic.h: + * src/preproc/pic/troff.cpp: Rename to `want_flyback`. - * src/libs/gnulib/lib/wctype.in.h: Include `config.h'. + * src/preproc/pic/main.cpp: + * src/preproc/pic/pic.h: Demote type from `int` to `bool`. - Problem reported by Eli Zaretskii . + * src/preproc/pic/main.cpp (top_input::get, top_input::peek): + Use parentheses to clarify operation precedence. - This is a temporary hack to make groff compile with MinGW. After - the switch to an automake infrastructure, together with proper use - of `gnulib', we can safely replace the patched file with a standard - version. +2022-08-14 G. Branden Robinson -2014-10-19 Doug McIlroy + * src/preproc/eqn/eqn.1.man: Expand to include lists of + recognized primitives and predefined macros. - Fix Savannah bug #42151. +2022-08-04 G. Branden Robinson - * src/preproc/eqn/lex.cpp (file_input::read_line): Handle CR/LF. - * src/preproc/pic/pic.cpp (file_input::read_line): Ditto. + * NEWS: Add item for new groff mm `V` register support. -2014-10-18 Werner LEMBERG +2022-08-04 G. Branden Robinson - [mdoc] Add Darwin version string for OS X 10.10. + * src/preproc/eqn/lex.cpp (do_delim): Recognize "delim on" even + in compatibility mode, enabling tbl to toggle eqn delimiter + recognition when it is run in compatibility mode as well. + * src/preproc/eqn/eqn.1.man (Controlling delimiters): Update. + * NEWS: Add item. - * tmac/doc-common (doc-operating-system-Darwin-14.0.0): New string. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * tmac/groff_mdoc.man: Updated. +2022-08-03 G. Branden Robinson -2014-10-15 Werner LEMBERG + * tmac/an.tmac (TH): Fix spurious complaint from `CHECKSTYLE` + feature when a custom manual section title is declared for a + standard section number. Thanks to Quentin Monnet for the + report. - * doc/webpage.ms: Remove obsolete references to tarballs and diffs. +2022-07-31 G. Branden Robinson - Reported by Dave Kemper . + * tmac/pdfpic.tmac: Finish incomplete string renames. Continues + 0fd6ab6b4c, 21 January. + pdfpic*file-name -> pdfpic*file-name-base + pspic-args -> pdfpic*pspic-args -2014-10-15 Colin Watson +2022-07-30 G. Branden Robinson - Always distribute the parts of groff that require X11. + * tmac/an.tmac (TS): Stop inserting space before tables. Unlike + ms(7), man(7) has no concept of "displays" and thus none of + "display distance". It is up to the page author to use + paragraphing macros around tables if vertical space is desired. + And not up to us to impose it. - * Makefile.in (ALLLIBDIRS): Clone from `LIBDIRS', but include - src/devices/libxutil unconditionally. - (ALLPROGDIRS): Clone from `PROGDIRS', but include - src/devices/xditview and src/utils/xtotroff unconditionally. - (DISTDIRS): Use `ALLLIBDIRS' and `ALLPROGDIRS' rather than `LIBDIRS' - and `PROGDIRS'. + Fixes . -2014-10-14 Keith Marshall +2022-07-30 G. Branden Robinson - Minor update to NEWS for pdfroff. + [man]: Regression-test Savannah #62841. - * NEWS (pdfroff): Note use of PHASE register, and not pdf:href.map, - to choose when to emit toc_relocation control record. + * tmac/tests/an_TS-adds-no-vertical-space.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2014-10-13 Keith Marshall +2022-07-30 G. Branden Robinson - For pdfroff, deduce "--no-toc-relocation" from input stream. + * src/preproc/tbl/table.cpp (table::do_bottom): Avoid + overprinting a double-boxed table's bottom border on nroff + devices. - * NEWS: Add notification; document the effect of changes, as recorded - in contrib/pdfmark/ChangeLog. +2022-07-30 G. Branden Robinson -2014-10-12 Ingo Schwarze + [tbl]: Expand regression test for Savannah #49390. Check for + overlap of double box borders, too. - [mdoc] Support `Mdocdate' CVS keyword substitution. - This fixes Savannah bug #42968. + * src/preproc/tbl/tests/\ + do-not-overlap-bottom-border-in-nroff.sh: Do it. - This feature is used for OpenBSD manuals. +2022-07-30 G. Branden Robinson - * tmac/doc-common (Dd): Handle `$Mdocdate:' argument. + [tbl]: Fix Savannah #49390. - * tmac/groff_mdoc.man: Document it. + * src/preproc/tbl/table.cpp (table::do_bottom): Avoid + overprinting a boxed table's bottom border on nroff devices. -2014-10-12 Ingo Schwarze + Fixes . Thanks to Osamu + Sayama for the report. - [mdoc] Add `.At III' and `.St -iso8601'. - This fixes Savannah bug #42971. +2022-07-30 G. Branden Robinson - * tmac/doc-syms: Add corresponding version strings. + [tbl]: Regression-test Savannah #49390. - * tmac/groff_mdoc.man: Synchronize. + * src/preproc/tbl/tests/\ + do-not-overlap-bottom-border-in-nroff.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. -2014-10-12 Ingo Schwarze +2022-07-28 Deri James - [mdoc] Update operating system release numbers. - This fixes Savannah bug #42969. + [gropdf]: Improve slant application to lowercase Greek letters. + - * tmac/doc-common: Update NetBSD, OpenBSD, FreeBSD, and DragonFly - version strings. + * tmac/pdf.tmac: Slant only if the glyph is sourced from a + special font, not a regular (text) font containing Greek glyphs. - * tmac/groff_mdoc.man: Synchronize. +2022-07-26 G. Branden Robinson -2014-10-12 Werner LEMBERG + * tmac/s.tmac: Add italic correction support to `I` and `BI` + macros. Call `par*define-font-macro` with newly recognized + third argument indicating that italic corrections should be + applied. + (par*define-font-macro): Apply the corrections if directed. - * doc/Makefile.in: Use `LC_ALL' in addition to `LANG'. - Suggested by Steffen. +2022-07-25 G. Branden Robinson -2014-10-12 Werner LEMBERG + * src/roff/troff/input.cpp (input_char_description): Clear + static buffer on every entry to the function so that calling it + twice in succession where the second call populates the buffer + with less data than the first doesn't leave garbage characters + in a diagnostic message. Problem appears to date back to 1991 + or earlier. - * doc/groff.texinfo: Make PDF version compilable with makeinfo 5.x. + Fixes . - makeinfo 5.x handles macro expansion better, which changes the way - how an \LE macro (for a less-than sign) has to be defined. However, - since we can't be sure that the latest version of `texinfo.tex' gets - used with makeinfo 5.x only, we would have to support both 4.x and - 5.x. No idea whether this is possible at all... For this reason, - we now simply use @value directly instead of wrapping it into a - macro, avoiding any issues. +2022-07-25 G. Branden Robinson -2014-10-12 Werner LEMBERG + * src/roff/troff/input.cpp (token::usable_as_delimiter): + (do_non_interpreted, interpolate_arg): Recast diagnostic + messages for clarity. - [doc] Protect against picky `sed' programs. - Problem reported by Axel Kielhorn . +2022-07-25 G. Branden Robinson - * doc/Makefile.in (GROFF_BIN_PATH, GROFF): Add `LANG=' to avoid - interpretation of non-ASCII characters by sed. + * tmac/e.tmac: Initialize section number registers. Fixes + warnings when starting section numbering at a depth greater than + 1. -2014-10-12 Michail Vidiassov + Fixes . - * tmac/doc-common: Add new Darwin versions. +2022-07-23 G. Branden Robinson -2014-10-12 Werner LEMBERG + * m4/groff.m4 (GROFF_PAGE): Use 'grep -q' instead of redirecting + standard output to null device. The '-q' option was + standardized in POSIX Issue 5 (1997) or earlier. Also drop the + redirection of the standard error stream; we have already + checked the file named in "$descfile" for existence and + readability. grep should thus not emit diagnostic messages. - * doc/groff.texinfo: s/which/that/ where apropriate. +2022-07-22 G. Branden Robinson -2014-10-12 Werner LEMBERG + * m4/groff.m4 (GROFF_PAGE): Macro used awk(1) without + `AC_REQUIRE`-ing a relevant macro or checking for its existence. + Fortunately, sed is powerful enough for our needs. Remove + dependency on awk. Cope with "search" directive in resolv.conf + having multiple arguments. Match "domain" directive in same + file instead of "dom", which I cannot find attested (this logic + dates to 1991). Rename `dom` shell variable to `domains` for + clarity, since its multiplicity could be greater than 1. - * doc/groff.texinfo: Various minor fixes. +2022-07-22 G. Branden Robinson - Most of those glitches have been found by comparing the info output - from makeinfo 4.13 and the current SVN development version (of - makeinfo). + * m4/groff.m4 (GROFF_PAGE): Refactor: drop AC_DEFINE of + `PAGEA4`. This symbol appears to be a relic; it is nowhere + tested or dereferenced. -2014-10-12 Werner LEMBERG +2022-07-15 G. Branden Robinson - * doc/groff.texinfo: Improve indexing. + * tmac/tty-char.tmac: Drop definition of \[sd] special + character. This was superseded by commit 78e666246c, 8 May, + which defined a fallback for the character in tty.tmac instead. + Thanks to Dave Kemper for the catch. - Change @DefXXXItem and @DefXXXListEnd macros to not insert an index - entry. New macro variants with a trailing `x' (like `@DefreqItemx') - can override this. +2022-07-15 G. Branden Robinson - Update macro calls where necessary. + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: + Skip test if "pdfinfo" command not available. -2014-10-12 Werner LEMBERG +2022-07-14 G. Branden Robinson - [doc] Improve call to generation of `groff.pdf'. - Problem reported by Axel Kielhorn . + [build]: Add sanity checks for font description file generation + for PDF output device, prompted by discussion with Ingo + Schwarze. See . - Since `groff.texinfo' contains latin-1 characters, some sed - implementations (like the one used on Mac OS 10.8) fail if called - with the wrong locale. Basically, this is a `texi2dvi' bug, but we - can set `LANG' by ourselves to improve the situation. + * font/devpdf/tests/basic-fonts-present.sh: + * font/devpdf/tests/urw-fonts-present.sh: Add files. - * doc/Makefile.in (.texinfo.dvi, .texinfo.pdf): Set `LANG' - environment variable to empty string. + * font/devpdf/devpdf.am (font_devpdf_TESTS): Add the former test + unconditionally, and the latter only if `HAVE_URW_FONTS`. -2014-10-12 Werner LEMBERG +2022-07-14 G. Branden Robinson - [doc] Correctly handle `MAKEINFO' environment variable. - Bug introduced in commit from 2014-03-29. + * font/devpdf/devpdf.am: Refactor to simplify. Now that + symbol.map lives in the "devpdf/generate" directory along with + the other map files, it doesn't need a dedicated Makefile target + to produce it. + (DEVPDFFONTMAP_1, DEVPDFFONTMAP_2): Coalesce and rename to... + (devpdffontmapdata): ...this. + (font/devpdf/map/symbol.map:): Drop target. + (devpdffontmap_DATA, font/devpdf/download): Update dependencies. - * m4/groff.m4 (GROFF_MAKEINFO): Don't set MAKEINFO to empty string - before actually testing it. +2022-07-13 G. Branden Robinson - * configure: Regenerated. + * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Recast + diagnostic message so that the user understands the consequence + of failure to locate a Type 1 font file (that isn't one of the + base 14 PostScript level 1 fonts): the font will be unavailable + for the "pdf" output device. -2014-10-11 Bertrand Garrigues +2022-07-13 G. Branden Robinson - Fix an issue on `make dist'. + * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Separate + lists of Type 1 font names with spaces as well as commas, for + better diagnostic message readability. Also begin message in + lowercase (per GNU Coding Standards). - In order to make the tarball, `make dist' copies src/libs/gnulib - directories into the `tmp' directory without the `.deps' - directories, causing the failure of `make distclean' in - tmp/src/libs/gnulib. Forcing a call to `config.status' recreates - the `.deps' directories. +2022-07-13 G. Branden Robinson - * Makefile.in (dist): For gnulib, call `config.status' before `make - distclean'. + * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Verify that + `$foundrypath->[$j]` is defined before operating on it. -2014-10-11 Bernd Warken +2022-07-10 G. Branden Robinson - * src/roff/grog/*.pl: Remove call from `IPC', use normal system - `instead'. + [afmtodit]: Clarify diagnostic message. -2014-10-11 Guillem Jover + * src/utils/afmtodit/afmtodit.pl: When we have excess Adobe + Glyph List mappings for a groff special character identifier + {making the reverse mapping from groff special character to font + glyph name ambiguous}, report that we're ignoring the excess. + Use "print STDERR" instead of Perl "warn" built-in since we want + diagnostic messages to start with the name of the program + emitting them. - Add support for various BSD versions. +2022-07-10 G. Branden Robinson - * tmac/doc-common: Add new FreeBSD and DragonFly versions. + [build]: Name and place PS->groff glyph name maps consistently. -2014-10-11 Keith Marshall + * font/devps/symbolmap: Rename from this... + * font/devps/generate/symbol.map: ...to this. - Refactor .psbb request handling code. + * font/devpdf/devpdf.am (font/devpdf/map/symbolmap): Rename + target... + (font/devpdf/map/symbol.map): ...to this. + (font/devpdf/map/symbol.map): Copy "devps" version of file from + its new location in the "generate" subdirectory. - * src/roff/troff/input.cpp (do_ps_file): Reimplement it, using... - (psbb_locator): ...this new locally declared and implemented class; - its constructor replaces all `do_ps_file()' capability, delegating - to other class methods, as appropriate. - (assign_registers): Encapsulate it, as a `psbb_locator' method. - (ps_get_line): Likewise, also renaming it to become... - (get_line): ...this class method; its internally defined `lastc' - static variable also becomes a non-static class member variable. - (PSBB_RANGE_IS_BAD, PSBB_RANGE_IS_SET, PSBB_RANGE_AT_END): New - manifest constants; define them. They are now used by... - (parse_bounding_box): ...this function, now also encapsulated as - a `psbb_locator' class method, to convey parsing status. - (bounding_box): Struct obsoleted by `psbb_locator'; delete it. - (ps_bbox_request): Delegate to `psbb_locator'. + * font/devpdf/Foundry.in: Reflect rename. -2014-10-11 Werner LEMBERG + * font/devps/generate/Makefile (symbolmap): Rename target... + ($(srcdir)/symbol.map): ...to this. - Various clean-ups. + * font/devps/devps.am (DEVPSGENFILES, EXTRA_DIST): + * font/devps/generate/Makefile (S, EURO $(SPECIALFONTS), clean): + * src/utils/afmtodit/afmtodit.1.man: Reflect rename and + relocation. - * NEWS: More updates. + * font/devps/generate/dingbats.rmap: Rename from this... + * font/devps/generate/dingbats-reversed.map: ...to this. - * REVISION: Set to 3. + * font/devps/devps.am (DEVPSGENFILES): + * font/devps/generate/Makefile (ZDR): + * src/utils/afmtodit/afmtodit.1.man: Reflect rename. - * doc/groff.texinfo: Update version and year. + * font/devps/generate/lgreekmap: Rename from this... + * font/devps/generate/slanted-symbol.map: ...to this. - * configure: Regenerated. + * font/devps/devps.am (DEVPSGENFILES): + * font/devps/generate/Makefile (SS): + * src/utils/afmtodit/afmtodit.1.man: Reflect rename. - * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. + * font/devps/generate/textmap: Rename from this... + * font/devps/generate/text.map: ...to this. -2014-10-11 Werner LEMBERG + * font/devpdf/Foundry.in: + * font/devpdf/devpdf.am (DEVPDFFONTMAP_1): + * font/devps/devps.am (DEVPSGENFILES): + * font/devps/generate/Makefile (TEXTMAP): + * src/devices/gropdf/gropdf.1.man: + * src/devices/grops/grops.1.man: + * src/utils/afmtodit/afmtodit.1.man: Reflect rename. - Update generic GNU files to recent versions. +2022-07-10 G. Branden Robinson - * INSTALL.gen, config.guess, config.rpath, config.sub, - contrib/groff_filenames/Makefile.sub, doc/fdl.texi, doc/texinfo.tex, - doc/txi-en.tex, install-sh, m4/ax_prog_perl_version.m4, - m4/codeset.m4, m4/fcntl-o.m4, m4/glibc21.m4, m4/iconv.m4, - m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4, m4/localcharset.m4, - src/include/localcharset.h, src/libs/gnulib/Makefile.in, - src/libs/gnulib/aclocal.m4, src/libs/gnulib/build-aux/compile, - src/libs/gnulib/build-aux/config.guess, - src/libs/gnulib/build-aux/config.sub, - src/libs/gnulib/build-aux/depcomp, - src/libs/gnulib/build-aux/install-sh, - src/libs/gnulib/build-aux/snippet/arg-nonnull.h, - src/libs/gnulib/build-aux/snippet/c++defs.h, - src/libs/gnulib/build-aux/snippet/warn-on-use.h, - src/libs/gnulib/configure, src/libs/gnulib/lib/Makefile.in, - src/libs/gnulib/lib/config.charset, src/libs/gnulib/lib/intprops.h, - src/libs/gnulib/lib/localcharset.c, - src/libs/gnulib/lib/localcharset.h, src/libs/gnulib/lib/ref-add.sin, - src/libs/gnulib/lib/ref-del.sin, src/libs/gnulib/lib/stdbool.in.h, - src/libs/gnulib/lib/stddef.in.h, src/libs/gnulib/lib/streq.h, - src/libs/gnulib/lib/unitypes.in.h, - src/libs/gnulib/lib/uniwidth.in.h, - src/libs/gnulib/lib/uniwidth/cjk.h, - src/libs/gnulib/lib/uniwidth/width.c, src/libs/gnulib/lib/verify.h, - src/libs/gnulib/lib/wchar.in.h, src/libs/gnulib/lib/wctype-h.c, - src/libs/gnulib/lib/wctype.in.h, src/libs/gnulib/lib/wcwidth.c, - src/libs/gnulib/m4/00gnulib.m4, src/libs/gnulib/m4/Makefile.in, - src/libs/gnulib/m4/codeset.m4, src/libs/gnulib/m4/configmake.m4, - src/libs/gnulib/m4/extensions.m4, src/libs/gnulib/m4/fcntl-o.m4, - src/libs/gnulib/m4/glibc21.m4, src/libs/gnulib/m4/gnulib-tool.m4, - src/libs/gnulib/m4/inttypes-pri.m4, - src/libs/gnulib/m4/localcharset.m4, src/libs/gnulib/m4/longlong.m4, - src/libs/gnulib/m4/onceonly.m4, src/libs/gnulib/m4/wchar_t.m4, - src/libs/gnulib/m4/wint_t.m4, src/libs/libgroff/config.charset, - src/libs/libgroff/localcharset.c, src/libs/libgroff/ref-add.sin, - src/libs/libgroff/ref-del.sin, src/preproc/refer/refer.man: Do it. + * doc/doc.am (doc/ms.ps): Add dependency on "eqn", and call + groff with "-e" option. + * src/utils/grog/tests/smoke-test.sh: Update expected "grog" + output for the ms.ms document. -2014-10-11 Werner LEMBERG +2022-07-09 G. Branden Robinson - * NEWS, MANIFEST: Updated. + * doc/doc.am (doc/ms.ps): Add dependency on "tbl". -2014-10-11 Werner LEMBERG +2022-07-08 G. Branden Robinson - * Makefile.in (OTHERDIRS, NOMAKEDIRS): Remove `ideal' references. + * src/roff/troff/node.cpp (suppress_node::tprint): Add source + file line number after its name when emitting "grohtml-info", to + aid debugging. -2014-10-10 Bernd Warken +2022-07-08 G. Branden Robinson - * contrib/gideal: Temporarily remove this directory, because the - documentation and the preprocessor are not yet finished for - groff-1.2.23. + * src/roff/troff/node.cpp (get_register, get_string): Reorder + null pointer inequality comparisons; they don't need to be in a + funny order because it's pretty hard to mistype `!=` as an + assignment operator. Annotate them as null pointers to ease any + future migration to ISO C++11. Use primitive type constructor + instead of C-style cast operator; this seems more idiomatic. -2014-10-10 Werner LEMBERG +2022-07-08 G. Branden Robinson - * Makefile.in (dist): Clean up `src/libs/gnulib'. + * src/preproc/html/pre-html.cpp (generateImages): Flush the + standard error stream after writing to it in a loop. -2014-10-10 Werner LEMBERG +2022-07-08 G. Branden Robinson - * doc/webpage.ms: Updates. + * tmac/s.tmac (RP): Recognize new optional arguments + `no-renumber` and `no-repeat-info`, the latter as a synonym for + the existing `no`. The former suppresses the page number + manipulation that normally occurs. Drop now-unnecessary `pn 0` + request. + (top level, cov*first-page-init, RP, cov*print): Rename + `cov*rp-format` to `cov*use-rp-format` for clarity. + (cov*break-page): New macro breaks the cover page at the end, + resetting next page number to 1 only if desired by user. + (cov*print, cov*rp-print): Call `cov*break-page` instead of + invoking `bp`. - The README and NEWS sections are not yet synchronized, though. + * doc/groff.texi (Document Description Macros) : + * doc/ms.ms (Document description macros) : + * tmac/groff_ms.7.man (Document description macros) : + Document them. -2014-10-09 Ingo Schwarze + * NEWS: Add item. - * Makefile.in: Let `clean' and `distclean' descend into gnulib. +2022-07-08 G. Branden Robinson - This fixes Savannah bug #42970. + * tmac/s.tmac: Rename register `cov*rp-no` to + `cov*rp-no-repeat-info`. -2014-10-02 Bertrand Garrigues +2022-07-08 Deri James - Set default X11 resources dir to `$prefix/lib/X11/app-defaults'. + * font/devpdf/util/BuildFoundries.pl (LocateFile): Some systems + store .afm files in a parallel directory to the Type 1 files, + restore original path after checking for parallel directory. - Previously, X11 resources for gxditview were installed in - `/usr/X11/lib/X11/app-defaults', no matter which prefix was set. +2022-07-07 G. Branden Robinson - Now, gxditview resources are installed in - `appresdir=$prefix/lib/X11/app-defaults'. If `appresdir' is not a - standard X11 resource directory, the environment variable - `XFILESEARCHPATH' should be set to this path. + * font/devpdf/devpdf.am (font/devpdf/download): Call + "BuildFoundries" with new `--strict` option so that the build + fails if the AFM files for the URW fonts can't be found. - The behaviour of `--with-appresdir' is unchanged: This option can - still be used to set `appresdir', and its value will not be modified - by the prefix. +2022-07-07 G. Branden Robinson - * m4/groff.m4 (GROFF_APPRESDIR_DEFAULT): Implement new behaviour. - Fix detection app-defaults location on the system. - (GROFF_APPRESDIR_CHECK): Updated. + * font/devpdf/util/BuildFoundries.pl: Add Boolean-valued scalar + `beStrict` (defaults false) and new command-line option + `--strict` to make it true. + (LoadFoundry): Check return value of subroutine `LocateAF`. + Emit diagnostic if it is null, as a warning if not "strict", and + fatal if so. - * configure.ac: Improve output of configuration. - * configure: Regenerated. +2022-07-07 G. Branden Robinson - * NEWS: Mention it. + * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries): Add + dependency on "afmtodit" since "BuildFoundries" calls this + program when generating groff font description files from URW + fonts. -2014-09-27 Werner LEMBERG +2022-07-06 G. Branden Robinson - Set `transparent' flag for `\[cq]. - Problem reported by Dave Kemper . + [ms]: Fix Savannah #62690. - * src/roff/troff/input.cpp (init_charset_table): Do it. + * tmac/s.tmac (P1, SC, UC, P2): Drop undocumented support for + document-private macros used by Kernighan & Cherry's + "Typesetting Mathematics -- User's Guide (Second Edition)". - * doc/groff.texinfo (Sentences, Using Symbols), man/groff_diff.man: - Document it. + Fixes . -2014-09-25 Bernd Warken +2022-07-06 G. Branden Robinson - * src/roff/grog/*.pl: Program more reasonable subs (functions). - Repair details in many places. + [ms]: Fix Savannah #62688. -2014-09-24 Keith Marshall + * tmac/s.tmac (DE): Set no-space mode when ending displays. + (@EN): Set no-space mode after outputting the display distance + so that it doesn't combine with inter-paragraph space. - Refactor psbb line input function; avoid a buffer overrun. + Fixes . - * src/roff/troff/input.cpp (ps_get_line): Declare it as `static'. - Refactor, to avoid the overhead of character look-ahead and push-back - on CR stream input. Add new `dscopt' parameter, in place of internal - `err' variable; update all call references, passing value of... - (DSC_LINE_MAX_ENFORCE): ...this new manifest constant; define it. - (DSC_LINE_MAX_IGNORED): Likewise; currently unused, but intended for - future use as an alternative to `DSC_LINE_MAX_ENFORCE'. - (DSC_LINE_MAX_CHECKED): New manifest constant; used internally only. - (PS_LINE_MAX): Manifest constant, renamed for notional consistency... - (DSC_LINE_MAX): ...to this; defined value remains as 255. - (do_ps_file): Increase stack allocation for `buf' char array; former - allocation of PS_LINE_MAX (now DSC_LINE_MAX) bytes exposed a potential - buffer overrun, after reading DSC_LINE_MAX bytes; two additional bytes - are required, to accommodate a terminating LF and NUL. Add `dscopt' - parameter, with value `DSC_LINE_MAX_ENFORCE', in each of three calls - to `ps_get_line()'. +2022-07-06 G. Branden Robinson -2014-09-20 Bernd Warken + [ms]: Regression-test Savannah #62688. - * src/roff/groff/Makefile.sub: Remove too much deleting while - running `make'. + * tmac/tests/s_no-excess-space-around-displays.tmac: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2014-09-20 Bernd Warken +2022-07-06 G. Branden Robinson - * `Makefile.sub' in the whole groff source tree: Add $(RM) and - change all `rm -f'. Add directory test before `rmdir'. + [ms]: Fix Savannah #62687. -2014-09-20 Bernd Warken + * tmac/s.tmac (@MC): Honor `MINGW` register even when setting + only two columns, as clearly implied by our documentation. - * Man-pages (*.man) in the whole groff source tree: Improve - documents by adding \[co], \[cq], \[aq] instead of ` or ' and use - also \[co] as long as it makes sense. Remove \[en] in the years - date in order to allow the automatic license year increasing. + Fixes . -2014-09-18 Bernd Warken +2022-07-06 G. Branden Robinson - * /*: Improve the license information and Emacs - setup. + [ms]: Regression-test Savannah #62687. -2014-09-18 Bernd Warken + * tmac/tests/s_honor-MINGW-when-two-columns.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - * tmac/*: Improve the license information and Emacs setup. +2022-07-06 G. Branden Robinson -2014-09-18 Bernd Warken + [ms]: Fix Savannah #62686. - * src/utils/xtotroff/*: Improve the license information and Emacs - setup. + * tmac/s.tmac (@MC): Set no-space mode before doing a paragraph + reset, not after: we don't want vertical space at the top of the + first column when entering multi-column mode, because then it + doesn't align with the tops of subsequent columns. -2014-09-18 Bernd Warken + Fixes . - * src/utils/tfmtodit/*: Improve the license information and Emacs - setup. +2022-07-06 G. Branden Robinson -2014-09-18 Bernd Warken + [ms]: Regression-test Savannah #62686. - * src/utils/pfbtops/*: Improve the license information and Emacs - setup. + * tmac/tests/s_mark-column-start-correctly.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2014-09-18 Bernd Warken +2022-07-06 G. Branden Robinson - * src/utils/lookbib/*: Improve the license information and Emacs - setup. + * tmac/s.tmac (IX): Drop. + * NEWS: Add item. -2014-09-18 Bernd Warken +2022-07-06 G. Branden Robinson - * src/utils/lkbib/*: Improve the license information and Emacs - setup. + * tmac/s.tmac: Add "sorry" implementations for documented but + unsupported Unix Version 7 ms macros. This way it's easier to + tell when a historical document needs one and this case is + distinguishable from a document-private macro warned about with + "groff -w mac". -2014-09-18 Bernd Warken +2022-07-06 G. Branden Robinson - * src/utils/indxbib/*: Improve the license information and Emacs - setup. + * tmac/s.tmac (UX): Drop undocumented support for this macro. + This implementation isn't consistent with historical ones, which + identified the trademark holder. But doing that is a problem, + so just stop trying to cope. Also, spelling Unix in full caps + was an imposition by the AT&T legal department on the CSRC. -2014-09-18 Bernd Warken + "The name Unix is a trademark, originally owned by Bell Labs and + subsequently traded off like a baseball card among a number of + companies." -- Ben Klemens - * src/utils/hpftodit/*: Improve the license information and Emacs - setup. +2022-07-06 G. Branden Robinson -2014-09-18 Bernd Warken + [ms]: Replace incomplete documentation of unimplemented macros. - * src/utils/afmtodit/*: Improve the license information and Emacs - setup. + * doc/groff.texi (Missing ms Macros): + * doc/ms.ms (AT&T ms macros not appearing in groff ms): Drop, + replacing with... -2014-09-18 Bernd Warken + * doc/groff.texi (Unix Version 7 ms Macros Not Implemented by + groff ms): + * doc/ms.ms (Unix Version 7 ms macros not implemented by groff + ms): + * tmac/groff_ms.7.man (Unix Version 7 macros not implemented by + groff ms): ...these. - * src/utils/addftinfo/*: Improve the license information and Emacs - setup. +2022-07-06 G. Branden Robinson -2014-09-18 Bernd Warken + * src/roff/troff/input.cpp (do_translate): Throw an error + diagnostic when the user attempts to translate space characters. + {By contrast, translating _to_ [unbreakable, unadjustable] + spaces is an old troff hack often seen as ".tr ~ ", and largely + superseded by groff's "\~" escape sequence, now widely supported + by other troffs.} - * src/roff/troff/*: Improve the license information and Emacs - setup. + Fixes . Thanks to T. Kurt + Bond and Oliver Corff for the report. + +2022-07-01 G. Branden Robinson + + * src/roff/groff/pipeline.c: Refactor. Drop function rename via + preprocessor macro usage. Declare and define `c_error` by its + correct name. + (run_pipeline): Update call sites. Stop flushing standard error + stream after calling libgroff's `error` function (which + `c_error` wraps); libgroff already guarantees this operation. + +2022-07-01 G. Branden Robinson + + * src/roff/troff/input.cpp (abort_request): Flush the standard + error stream before exiting, to improve chances of user seeing + any message as arguments to the `ab` request. + +2022-06-28 G. Branden Robinson + + * src/preproc/html/pre-html.cpp + (char_buffer::run_output_filter): Die if platform supports + neither `fork()` nor `spawn()` for child process creation. + +2022-06-27 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (cleanup): Add function to tidy + memory before exiting. + (main): Register aforementioned function with `atexit()`. Die + if registration fails. + +2022-06-27 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (do_file): Die if `fclose()` + fails; such a situation suggests a pretty hosed environment. + +2022-06-27 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (checkImageDir): If `mkdir()` + fails, use `strerror()` to report the underlying problem. + +2022-06-27 G. Branden Robinson + + * src/preproc/html/pre-html.cpp: Refactor. Drop unnecessary + prototype for static function. Use idiomatic C++98 null pointer + constant. Annotate it as null pointer to ease any future + migration to ISO C++11. Boolify. Use C++98 bool data type + instead of preprocessor macros `TRUE` and `FALSE`. Demote some + global Boolean variables from `int` to `bool` and rename some to + be more clear: `show_progress` -> `want_progress_report`; + `debugging`; `eqn_flag` -> `need_eqn`. + (make_message): Rename this... + (make_string): ...to this. Align more closely with contemporary + version of example from Linux man-pages printf(3) page. Use + `vsnprintf()` to determine size of memory buffer needed prior to + allocation instead of iteratively growing it until it is large + enough. Always die if `vsnprintf()` fails: this function now + always returns a valid pointer if it returns at all. + (makeFileName, setupAntiAlias, imageList::createPage, + imageList::createImage): Update call sites to use + `make_string()`. + (char_buffer::can_see): Demote return type from `int` to `bool`. + (char_buffer::skip_spaces): Drop unused member function. + (char_buffer::read_file, makeTempFiles): Demote return type from + `int` to `void`. Stop returning after calling functions that + don't return. + (char_buffer::read_file): Call `sys_fatal()` if `fread()` + returns an error, similarly to other calls into the standard C + library that this file makes. Improve check for error from + `fread()` by not regarding a return value of zero when the + end-of-file indicator is set as an error condition. + (makeFileName, checkImageDir, char_buffer::run_output_filter, + scanArguments): Call `fatal()` instead of `error()` and then + `exit(1)`. + (makeFileName, scanArguments): Dismiss Shlemiel the Painter: + save return value of `strlen()` and call `strcpy()` multiple + times instead of mixing `strcpy()` and `strcat()`; the latter + approach rescans the string unnecessarily. + (char_buffer::run_output_filter): Stop passing unnecessary null + pointer argument to diagnostic message functions. Stop calling + `fflush()` after libgroff diagnostic function, which always + {ultimately} flushes the standard error stream itself. + (makeTempFiles, do_file, main): Boolify. + (makeTempFiles, do_file): Reorder null pointer equality + comparisons to avoid inadvertent lvalue assignment. + (scanArguments, main): Use `EXIT_SUCCESS` and `EXIT_FAILURE` + constants from C library instead of integer literals for exit + status. + (do_file): Demote return type from `int` to `bool`. Return + Boolean literals. Drop conditional with empty consequent. + (main): Declare local variables closer to the points of use. + Stop trying to be a register allocator: stop reusing loop index + variable `i` as integer storage for another (albeit related) + purpose; introduce `operand_index` instead. Clarify logic by + splitting combined initialization and comparison operations, and + by testing function return value directly instead of storing it + in a pointless temporary. Use `EXIT_SUCCESS` and `EXIT_FAILURE` + constants from C library instead of integer literals for exit + status. + +2022-06-27 G. Branden Robinson + + * src/roff/groff/groff.cpp (run_commands): Trivially refactor. + Rename variable for clarity; add comment. + +2022-06-27 G. Branden Robinson + + * src/preproc/html/pre-html.cpp + (char_buffer::run_output_filter): Return wait status of child + process. + (char_buffer::run_output_filter, main): Rename local variable + `status` to `wstatus` to recognize distinction between exit + status (a 7-bit quantity) and wait status (a wider type). + (main): Issue fatal diagnostic if child process exited with + nonzero status. Since the child's output to the standard error + stream is lost, advise re-running with different output driver + to see them. This unhappy shortcoming is filed as Savannah + #62673. Explicitly return zero otherwise. + + Fixes . + +2022-06-22 G. Branden Robinson + + * src/roff/groff/tests/ab_works.sh: Add regression test for + Savannah #60782. + +2022-06-22 G. Branden Robinson + + [troff]: Trivially refactor. + + * src/roff/troff/input.cpp (token::next): Rename statement label + to use documentary terminology. + * src/roff/troff/node.cpp (make_composite_node) + (make_glyph_node): Make functions static since nothing outside + this translation unit calls them. + * src/roff/troff/node.cpp (make_glyph_node): Refactor optional + argument and its usage. Put it down, flip it, and reverse it. + That is, demote its type from `int` to `bool`, invert its sense, + and rename it since it affects warning, not error, diagnostics. + (character_exists): Update only call site of `make_glyph_node()` + that uses non-default argument value. + +2022-06-22 G. Branden Robinson + + [troff]: Adjust diagnostic message text to clarify and better + match terminology used in documentation. + + * src/roff/troff/input.cpp (set_escape_char, do_overstrike) + (do_bracket, do_name_test, do_width, do_special): + * src/roff/troff/node.cpp (suppress_node::tprint): Migrate from + "escape" to "escape sequence". + + * src/roff/troff/node.cpp (make_composite_node) + (make_glyph_node): Clarify what went wrong. + + * src/roff/troff/input.cpp (token::get_char) + (check_missing_character): Migrate from "normal character" to + "ordinary character" (see groff_char(7)). + +2022-06-22 G. Branden Robinson + + [troff]: Rename a function for clarity. + + * src/roff/troff/input.cpp (add_to_node_list): Rename this... + (add_to_zero_width_node_list): ...to this. + (do_zero_width): Update call site. + * src/roff/troff/token.h: Update declaration. + +2022-06-22 G. Branden Robinson + + * src/roff/groff/groff.cpp (handle_unknown_desc_command): + Refactor to skip unnecessary string comparisons. We explicitly + return in the final case instead of falling off the end of this + void function for consistency if additional cases are added. -2014-09-18 Bernd Warken +2022-06-22 G. Branden Robinson - * src/roff/nroff/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp (handle_unknown_desc_command): + Partially revert commit 64dc40d23a, 19 June. I forgot to save + and restore the previous values of the globals + `current_filename` and `current_lineno`, and, noticing that this + function has 3 return paths, decided that it's cheaper just to + go back to `error_with_file_and_line()`. -2014-09-18 Bernd Warken +2022-06-21 Deri James - * src/roff/grog/*: Improve the license information and Emacs - setup. + [gropdf]: Add more search paths to the Foundry file. -2014-09-18 Bernd Warken + * font/devpdf/Foundry.in: Use the directory specified with the + config flag --with-urw-fonts-dir to populate the default foundry + as well as the U foundry. Important to populate the download + file with font files to embed the fonts not part of the base + pdf fonts or if user wants all fonts embedded. - * src/roff/groff/*: Improve the license information and Emacs - setup. +2022-06-21 G. Branden Robinson -2014-09-18 Bernd Warken + * tmac/an-ext.tmac (UR, MT): Fix problem with hyphenation + occurring before the end of the line when the line length was + not the device default (common for man pages at the terminal) + and hyperlinks were enabled. The issue is that the new + environment we created inherits the default environment's line + length (its state at troff initialization, prior to macro + package loading and configuration). This latent issue was + exposed by post-groff 1.22.4 changes to enable the hyphenation + of link text and add the hyperlink feature. Fix it by copying + the line length at the time the macro is called, which is + necessarily after man(7) sets up the line length, to the new + environment. - * src/preproc/tbl/*: Improve the license information and Emacs - setup. +2022-06-21 G. Branden Robinson -2014-09-18 Bernd Warken + * src/devices/grops/psrm.cpp (resource_manager::output_prolog): + (resource_manager::supply_resource): + (resource_manager::read_download_file): Update diagnostic + message language and report underlying problem encountered by + system when failing to open files. This will probably be the + text for ENOENT in most cases, but should help avoid frustration + in those where it isn't. - * src/preproc/soelim/*: Improve the license information and Emacs - setup. +2022-06-20 G. Branden Robinson -2014-09-18 Bernd Warken + * src/devices/grops/psrm.cpp + (resource_manager::read_download_file): Align diagnostic message + wording with gropdf in the same circumstance. - * src/preproc/refer/*: Improve the license information and Emacs - setup. +2022-06-20 G. Branden Robinson -2014-09-18 Bernd Warken + [troff]: Throw warning in font category when a font selection + escape sequence is used after the output line continuation + escape sequence on an input line, because it is ignored. - * src/preproc/preconv/*: Improve the license information and Emacs - setup. + * src/roff/troff/env.cpp (environment::set_font): Do it. -2014-09-18 Bernd Warken + * doc/groff.texi (Warnings): + * src/roff/troff/troff.1.man (Warnings): Document it. - * src/preproc/pic/*: Improve the license information and Emacs - setup. +2022-06-20 G. Branden Robinson -2014-09-17 Bernd Warken + * src/roff/troff/env.cpp (font_change): Boolify. - * src/preproc/html/*: Improve the license information and Emacs - setup. +2022-06-20 G. Branden Robinson -2014-09-17 Bernd Warken + * src/devices/gropdf/gropdf.pl (LoadFont): Revise error message + when a font can't be found for embedding. User failure to add + an entry for locating the font file seems a more likely scenario + than outright corruption of the file. - * src/preproc/grn/*: Improve the license information and Emacs - setup. +2022-06-20 G. Branden Robinson -2014-09-17 Bernd Warken + * src/roff/troff/env.cpp (font_change): Warn upon selection of a + nonexistent font name. - * src/preproc/eqn/*: Improve the license information and Emacs - setup. + Fixes . -2014-09-17 Bernd Warken +2022-06-20 G. Branden Robinson - * src/libs/libxutil/*: Improve the license information and Emacs - setup. + [troff]: Revise `environment::set_font` to return Boolean value + indicating success of font selection operation. -2014-09-17 Bernd Warken + * src/roff/troff/env.cpp (environment::set_font): + * src/roff/troff/env.h (environment::set_font): Do it. - * src/libs/libgroff/*: Improve the license information and Emacs - setup. + This prepares the way for a fix for Savannah #62656. -2014-09-17 Bernd Warken +2022-06-20 G. Branden Robinson - * src/libs/libdriver/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp: Use single exit path, freeing + memory allocated for strings. + (xexit): Add `exit()` wrapper; free allocated memory. + (main): Use it in all three exit paths. -2014-09-17 Bernd Warken +2022-06-20 G. Branden Robinson - * src/libs/libbib/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp: Refactor to be more meticulous with + memory. Add globals `saved_path`, `groff_bin_path`, and + `groff_font` to store pointers into the process environment + returned by `putenv()`; once used, they need to remain valid for + the lifetime of the program. + (xstrdup): Add `strdup()` wrapper: dies if `strdup()` fails. + (main): Split nested `strsave()` and `xputenv()` (until recently + `putenv()`) calls. Free duplicate strings prior to exit. -2014-09-17 Bernd Warken +2022-06-19 G. Branden Robinson - * src/libs/gnulib/*: Improve the license information and Emacs - setup. The former run of that was not yet complete. + * src/roff/groff/groff.cpp (main): Rename temporary variable to + avoid shadowing one in enclosing scope, which can lead to + cut-and-paste errors (ask me how I know). -2014-09-17 Bernd Warken +2022-06-19 G. Branden Robinson - * src/libs/gnulib/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp: Slightly refactor to indirect + `putenv` calls through an error-checking wrapper. + (xputenv): Add new function to die if `putenv()` fails. + (main): Update call sites to use it. -2014-09-17 Bernd Warken +2022-06-19 G. Branden Robinson - * src/include/*: Improve the license information and Emacs setup. + [groff]: Add information to diagnostic messages. -2014-09-17 Bernd Warken + * src/roff/groff/groff.cpp (main): Report underlying system + error if `putenv()` fails. + (handle_unknown_desc_command): Set globals `current_filename` + and `current_lineno` from `filename` and `lineno` arguments + passed to us to we can use the simpler interface of `error()` + rather than `error_with_file_and_line()`. - * src/devices/grotty/*: Improve the license information and Emacs - setup. +2022-06-19 G. Branden Robinson -2014-09-17 Bernd Warken + [libgroff]: Update return type of `font::load_desc` function to + enable more informative diagnostics from callers. - * src/devices/grops/*: Improve the license information and Emacs - setup. + * src/include/font.h (font::load_desc): Change return type from + `bool` to `const char` pointer. + * src/libs/libgroff/font.cpp (font::load_desc): Return null + pointer literal on failed `open()` or validation failures. + Return filespec on success. -2014-09-17 Bernd Warken + * src/libs/libdriver/input.cpp (do_file): + * src/preproc/grn/main.cpp (getres): + * src/roff/groff/groff.cpp (main): + * src/roff/troff/input.cpp (main): Compare `font::load_desc()` + return value to null pointer literal instead of treating it as a + Boolean. - * src/devices/gropdf/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp (main): Report full filespec of + troublesome "DESC" file when complaining of missing "postpro" + directive. -2014-09-17 Bernd Warken +2022-06-18 G. Branden Robinson - * src/devices/grolj4/*: Improve the license information and Emacs - setup. + * src/roff/groff/groff.cpp: Add new Boolean global, + `need_postdriver`, and initialize it true. + (main): Make `need_postdriver` false if the `-X` or `-Z` options + are given. Test it later. This prevents groff from exiting + with a fatal error if an output driver is not available, but + also not required. Also reorder null pointer equality + comparison to avoid inadvertent lvalue assignment. -2014-09-17 Bernd Warken + Fixes . - * src/devices/grolbp/*: Improve the license information and Emacs - setup. +2022-06-16 G. Branden Robinson -2014-09-17 Bernd Warken + * src/roff/groff/groff.cpp (help): Revise usage message for + expressiveness and clarity. - * src/devices/grohtml/*: Improve the license information and Emacs - setup. +2022-06-21 Deri James -2014-09-17 Bernd Warken + [gropdf]: Correct display of pathnames used. - * src/devices/grodvi/*: Improve the license information and Emacs - setup. + * font/devpdf/util/BuildFoundries.pl: Convert array to + string of pathnames. -2014-09-15 Bernd Warken +2022-06-21 Deri James - * man/*.man: Improve the license information (definiton of .co and - .au). + [gropdf]: Fix to gropdf. -2014-09-15 Bernd Warken + * src/devices/gropdf/gropdf.pl: If pdfbookmark was called + within 5p of top of page (e.g. straight after a .bp when + \n[nl] was zero) the click destination would be off by a + page. - * m4/*.m4: Improve the license information without changing the - related information. +2022-06-19 Ingo Schwarze -2014-09-06 Werner LEMBERG + * font/devpdf/devpdf.am: Always build PDF font description + files. - Fix build issues. + Build font/devpdf/download and the various TR, TB, CR etc. + files in the same directory even when they are not required + by the build because USE_GROPDF is unset, usually because + ghostscript is either unavailable or deliberately disabled + by the person running the build. These files need to be + built and installed anyway, and can be used on the target + system when the required infrastructure is available at run + time. - * m4/groff.m4: Fix typo. - s/refer_dir/referdir/ for consistency. +2022-06-15 G. Branden Robinson - * configure: Regenerated. + [docs]: Revise introduction of vertical spacing concept to avoid + render inference that the formatter will compute a vertical + spacing appropriate to the type size automagically--it will not. - * Makefile.in: s/refer_dir/referdir/ for consistency. + Fixes . Thanks to Dave + Kemper for the report. - * src/preproc/refer/Makefile.sub (install_data, uninstall_sub): - Don't handle binaries or manpages; this is handled elsewhere - already. Right now, only install and uninstall the `refer' data - directory. +2022-06-15 G. Branden Robinson -2014-09-04 Bernd Warken + [docs]: Revise discussion of end-of-sentence detection. - * configure: When I change the `configure' file manually, the - refer data dir is created. But when running aclocal/autoreconf, - the dir is again not created. + * doc/groff.texi (Filling): + * man/roff.7.man (Concepts): Do it. "Spaces" is a now a term + with a much more restricted usage. Emphasize the input context, + now explicitly identified as plain text files with Unix line + endings. -2014-09-04 Bernd Warken + Fixes (one hopes) . + Thanks to Ingo Schwarze for the report and Dave Kemper for the + discussion. - * m4/groff.m4, configure.ac, Makefile.in, - src/preproc/refer/Makefile.sub: Add information to create a refer - data directory by installing. That dir is not yet generated - anyway. +2022-06-10 Deri James -2014-09-05 Werner LEMBERG + [gropdf]: Changes to BuildFoundries. - Regenerate configure files with correct parameters. + * font/devpdf/util/BuildFoundries.pl: Collect search paths into + an array rather than a colon delimited string, this allows + the @PATH_SEPARATOR@ character (':' or ';') to be used to + delimit paths yielded by the command 'gs -h' but still use ':' + to delimit paths in the Foundry file. This means the same + Foundry file can be used on all systems. - * configure.ac: Comment out m4 macros still missing. + * font/devpdf/Foundry.in: Add more likely paths to find the URW + fonts. - * aclocal.m4, config.hin, configure: Regenerated. +2022-06-09 G. Branden Robinson -2014-09-04 Bernd Warken + [build]: Weaken dependency on TeX, instead using it (to generate + the DVI and PDF forms of our Texinfo manual) only if it is + available. - * some files in doc: Change the copying years to package form. - But many files have strange or no copying information. + * m4/groff.m4 (GROFF_USE_TEX_CHECK): Check for presence of 'tex' + executable in path. Set shell variable `groff_use_tex` to "yes" + if present, and "no" otherwise. This check runs only if the + 'makeinfo' and 'texi2dvi' version checks have already passed. -2014-09-04 Bernd Warken + * configure.ac: Run the new check. Set Automake conditional + `USE_TEX` only if shell variable `groff_use_tex` is "yes". + Report whether "groff.dvi" and "groff.pdf" are (re-)buildable. - * contrib/pic2graph/Makefile.sub: Change the copying years to - package form. + * doc/doc.am: Parameterize names of groff.{dvi,pdf} targets as + Make macros `GROFF_DVI` and `GROFF_PDF`. Define them only if + `USE_TEX`. Do _not_ update `EXTRA_DIST` macro; leave the + literal file names there because we require that distribution + archives contain these files. + (.texi.dvi, .texi.pdf): Update suffix rules to check `USE_TEX` + and fail, complaining of missing 'tex' program, if these targets + are attempted without it being true. Only manually specifying + the file names as targets to 'make' or attempting to generate a + distribution archive without TeX present should cause these + errors. -2014-09-04 Bernd Warken + * INSTALL.REPO: Update dependency information. - * FDL: Replace the changed actual file by the original `fdl.txt' - from . + Fixes . Thanks to Deri + James for the report. -2014-09-03 Bernd Warken +2022-06-09 G. Branden Robinson - * contrib/grap2graph/Makefile.sub: Remove `Last updates' from all - files. Add and repair copyright. Write Emacs setup. + * doc/doc.am (.texi.dvi, .texi.pdf, $(DOC_GNU_EPS)): Quote names + of programs when aborting because they're missing. -2014-09-03 Bernd Warken +2022-06-09 G. Branden Robinson - * src/preproc/refer/refer.man: Include more distances for better - reading of the source file. Add `%' for documentation of - bibliographic database lines. + * m4/groff.m4 (GROFF_PROG_MAKEINFO, GROFF_PROG_TEXI2DVI): + Largely revert commit d5013ededc, 21 May: run checks for + 'makeinfo' and 'texi2dvi' programs regardless of presence of + ".tarball-version" file. Their presence is a necessary (but not + sufficient) condition for refresh of formatted forms of our + Texinfo manual if the source is modified. -2014-09-03 Bernd Warken + Begins addressing . - * tree contrib/eqn2graph: Remove `Last updates' from all files. - Add and repair copyright. Write Emacs setup. +2022-06-08 G. Branden Robinson -2014-09-03 Bernd Warken + [build]: Rename some groff Autoconf macros to better match + Autoconf's own naming conventions. - * tree `arch': Remove `Last updates' from all files. Add - and repair copyright. Write Emacs seetup. + * m4/groff.m4 (GROFF_MAKEINFO): Rename to... + (GROFF_PROG_MAKEINFO): ...this. + (GROFF_TEXI2DVI): Rename to... + (GROFF_PROG_TEXI2DVI): ...this. -2014-09-03 Bernd Warken + * configure.ac: + * m4/groff.m4 (GROFF_TEXI2DVI): Update call sites. - * : Remove `Last updates' from all - files. Only `timestamp' values are left. +2022-06-07 G. Branden Robinson -2014-09-03 Bernd Warken + * tmac/an.tmac (SH, SS, B, I, SM, SB): Set input trap with `it` + instead of `itc` for better Unix Version 7 man(7) compatibility. - * : Repair copyright years from - starting year to actual year for almost all files. + Fixes . Also see + discussion at + https://lists.gnu.org/archive/html/groff/2022-06/msg00020.html + et sequentia (amid a vigorous bikeshedding of `\&`'s name). -2014-09-03 Bernd Warken +2022-06-07 G. Branden Robinson - * autom4te.cache: Remove that tree after running - `autoconf' or `autoreconf'. + [man]: Regression-test use of input traps. - * .gitignore: Add all files within `autom4te.cache' to get rid of - them automatically. Not sure so far, if this works. + * tmac/tests/an_use-input-traps-correctly.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2014-09-03 Bernd Warken +2022-06-06 G. Branden Robinson - * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS, - PROJECTS, README*: Remove Emacs settings for coding style. Change - copyright years from 1989-2014 and 1993-2014 into 2014 only. + * src/devices/gropdf/gropdf.pl (LoadDesc): Validate device + description file for essential directives and acceptable values + as grops(1) does. -2014-09-03 Bernd Warken +2022-06-04 G. Branden Robinson - * configure.ac, Makefile.in: Try to use /usr/local/share directory - for `refer'. Does not work so far. + [troff, grohtml, grops, grotty]: Update wording of diagnostic + messages to refer to "motion quantum" rather than "resolution" + where appropriate. -2014-09-02 Bernd Warken + * src/devices/grohtml/post-html.cpp + (html_printer::html_printer): + * src/devices/grops/ps.cpp (ps_printer::ps_printer): + * src/devices/grotty/tty.cpp (tty_printer::set_char) + (tty_printer::add_char, tty_printer::end_page): + * src/roff/troff/env.cpp (line_length, title_length): Do it. + +2022-06-04 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl: Do more "DESC" file validation. + (LoadDesc): Bomb out gracefully if any of "unitwidth", "res", or + "sizescale" missing from "DESC" file. This prevents Perl + warnings about use of uninitialized values, and undoubtedly + mangled output. + +2022-06-04 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl: Revise diagnostic message + handling. + (top level): Add new scalar `progname` to house executable name. + (Msg): Output messages in format recommended by GNU Coding + Standards manual. Identify who's talking (Savannah #52463). + Rename `lev` scalar to `fatal` since it is used only as a + Boolean for immediately exiting with failure status. Report + diagnostic severity as part of message. + (Warn, Die): Add new subroutines through which all diagnostics + are now emitted. + (top level): Migrate a use of Perl `die` builtin to our `Die`. + (top level, ToPoints, LoadDownload, LoadDesc, do_x, GetPoints, + LoadSWF, LoadPDF, LoadStream, BuildStream, ParsePDFHash, + LoadFont, GetType1, GetChunk, RemapChr, do_N): Migrate `Msg(0, + ...)` calls to `Warn` and `Msg(1, ...)` to `Die`. Begin + messages in lowercase (GNU Coding Standards). Recast a few + messages for clarity. + + Continues the long process of fixing Savannah #52463. + +2022-06-04 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl (Load_Config): Drop unused + subroutine and its commented-out call site, which came in that + way in July 2011. + +2022-06-04 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl (LoadFont): Warn if a font to be + embedded in PDF output cannot be located in the "download" file. + + Fixes . Thanks to Deri + James. + +2022-06-04 G. Branden Robinson + + * tmac/a4.tmac: Drop file from distribution. It has been + superseded by papersize.tmac for nearly 20 years. + * tmac/tmac.am (TMACNORMALFILES): Delete reference. + * NEWS: Add item. + + Fixes . + +2022-06-03 G. Branden Robinson + + [build]: Parameterize X11-related man pages, so they don't get + spuriously generated (and not cleaned) when building with X11 + support disabled. + + * Makefile.am (.man): Fix logic nit: drop unnecessary removal of + target before clobbering it with sed. + * src/devices/xditview/xditview.am (GXDITVIEW_MAN1): Add new + macro, expanding to nothing if `WITHOUT_X11` and to the target + name otherwise. + (man1_MANS): Append `GXDITVIEW_MAN1` expansion, not a literal. + * src/devices/xditview/xditview.am (XTOTROFF_MAN1): Add new + macro, expanding to nothing if `WITHOUT_X11` and to the target + name otherwise. + (man1_MANS): Append `XTOTROFF_MAN1` expansion, not a literal. + * doc/doc.am (GROFF_MAN_PAGES1): Append foregoing expansions + instead of literals. + +2022-06-03 G. Branden Robinson + + * configure.ac: Add `AM_CONDITIONAL`: `HAVE_URW_FONTS`, so our + Automake files can more easily cope with their absence. + * font/devpdf/Foundry.in: Add easily matched phrases to + comments, to clearly delimit the URW foundry portion of the file + so it can be omitted if those fonts are absent. + * font/devpdf/devpdf.am (font/devpdf/Foundry): Generate file + differently depending on `HAVE_URW_FONTS`; keep the existing + procedure if true, and delete the URW section from the generated + file otherwise, avoiding diagnostic messages from afmtodit(1) + and our BuildFoundries script. + + Fixes . + +2022-06-03 G. Branden Robinson + + * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries): + Generate script using the `PATH_SEPARATOR` Automake macro. + * font/devpdf/util/BuildFoundries.pl: Add `pathsep` scalar to + house the build-time path separator. + (LocateFile): Use it. + (LoadFoundry, CheckFoundry): Stop using spaces as part of the + path separation delimiter. It is not idiomatic. + +2022-06-02 G. Branden Robinson + + * configure.ac: Explicitly identify poppler tools in report. + +2022-06-02 G. Branden Robinson + + * font/devpdf/util/BuildFoundries.pl: Trivially refactor. Drop + unused hash `foundry`. Drop scalar `warn` that was set and + updated but never tested. + +2022-06-02 G. Branden Robinson + + * font/devpdf/util/BuildFoundries.pl: Alter script to write to + the standard output stream instead of (re)writing a file named + "download" in the current working directory. This recovers from + a problem I introduced in commit 6e62be835d, 2 May, as an + unforeseen side effect of improving build parallelism so that + the "download" file wouldn't be read until it was fully + populated. As a side benefit, this approach is more Unixy, and + less dependent on $PWD. + (top level): Stop calling `WriteDownload` with an argument. + (LoadFoundry): Close only the file handle of interest when done, + not all of them (including `STDOUT`, which we now need). + (CheckFoundry): Same--just for cleanliness, since at present + running the script in 'check' mode doesn't write to any streams. + (WriteDownload): Stop taking an argument and manipulating file + handles. Write download file to standard output. + (LoadDownload, WriteDownload): Drop `top` scalar, used as a + mutex to serialize read and write access to "download" file; it + is no longer needed since the "download" file is now only read. + +2022-06-01 G. Branden Robinson + + [build]: Rename shell variables and Autoconf/Automake macros of + Boolean sense to have names more like logical predicates and + avoid doofy "DONT" nomenclature. + + * m4/groff.m4 (GROFF_MAKE_RM): Rename shell variable + `groff_is_rm_defined` to `groff_make_defines_rm` (purely for + clarity; it already had a good name). + (GROFF_MAKE_RM): Rename this... + (GROFF_MAKE_DEFINES_RM): to this, to make parallelism obvious, + and enabling... + * configure.ac: ...rename of `MAKE_DONT_HAVE_RM` to + `MAKE_DEFINES_RM` with sense of test reversed. Also interpolate + `GROFF_MAKE_DEFINES_RM` instead of `GROFF_MAKE_RM`. This in + turn enables... + * Makefile.am: ...revision of conditional from + `MAKE_DONT_HAVE_RM` to "!`MAKE_DEFINES_RM`". + +2022-06-01 G. Branden Robinson + + * m4/groff.m4 (GROFF_URW_FONTS_PATH) + (GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_APPDEFDIR_OPTION) + (GROFF_UCHARDET): Recast help strings to more closely parallel + structure and style of Autoconf's own help strings. + (GROFF_WITH_COMPATIBILITY_WRAPPERS): Recast to tighten wording. + +2022-06-01 G. Branden Robinson + + * configure.ac: + * m4/groff.m4 (GROFF_APPDEFDIR_OPTION, GROFF_APPDEFDIR_DEFAULT) + (GROFF_APPDEFDIR_CHECK): Rename m4 macros and shell variable + from "*appres*" to "*appdef*. Update interpolation sites. + + * configure.ac: + * m4/groff.m4 (GROFF_APPDEFDIR_CHECK): Further rename this... + (GROFF_APPDEFDIR_NOTICE): ...to this, for consistency with other + post-report output macros. - * All Makefile*: Add Emacs settings and lacking licenses. + * Makefile.am: + * PROBLEMS: + * doc/automake.mom: + * src/devices/xditview/xditview.am: Update interpolation sites + of `appresdir`. -2014-09-02 Bernd Warken + * Makefile.am: + * src/devices/xditview/gxditview.1.man: + * src/roff/groff/groff.1.man: Update interpolation sites of + `APPRESDIR`. - * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS, - PROJECTS, README*: Add Emacs settings. + * NEWS: Add item. -2014-09-02 Bernd Warken +2022-06-01 G. Branden Robinson - * PROJECTS: Add TODO for `refer'. + * m4/groff.m4 (GROFF_X11, GROFF_UCHARDET): Drop redundant + messages (which are easily overlooked amid the torrent of + "checking" output anyway). Discovery failures of X11 and the + uchardet library are already parts of the configuration report + at or near the end of output. -2014-08-31 Bernd Warken +2022-06-01 G. Branden Robinson - * man/roff.man (roff.7): Replace Heirloom links to more actual - places. Create macro definitions for authors (.au) and copying - (.co). + * m4/groff.m4 (GROFF_PNMTOPS_NOSETPAGE): Partially revert change + from 21 May and document why in a comment. -2014-08-30 Bernd Warken +2022-06-01 G. Branden Robinson - * man/groff_font.man (groff_font.7): Restructure - file format, but keep content. + * tmac/troffrc: Skip loading of "papersize.tmac" if not in troff + mode. -2014-08-30 Bernd Warken + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * src/utils/addftinfo/addftinfo.man (addftinfo.1): Restructure - file format, but keep content. +2022-05-31 G. Branden Robinson -2014-08-30 Bernd Warken + * configure.ac: Report use of "g" prefix for commands and macro + package compatibility wrappers. + * m4/groff.m4 (GROFF_G): Fix code style nits. Update + indentation to match recent practice. - * man/roff.man (roff.7): Repair documentation of heirloom. +2022-05-31 G. Branden Robinson -2014-08-28 Bernd Warken + * configure.ac: Fix code style nits and tweak report. Stop + superfluously using braces for shell parameter expansions that + don't require them. The shell is not make(1). Say + "installation _directory_ prefix" since another kind of prefix + can be used by groff (the "g" in front of command and macro + package names shared with AT&T troff). - * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add `gpinyin'. +2022-05-31 Dave Kemper - * src/roff/grog/grog.man: Restructure `SEE ALSO'. + * doc/groff.texi: Fix content and style nits. + - Remove redundancy ("fixed-width... character that can't be + adjusted"). + - Fix incorrect word ("environment value" -> "environment + variable"). + - Add or change the placement of a couple tie{}s to comport + with style-guide recommendation. + - Grammarify. + - Clarify and tighten wording. -2014-08-28 Bernd Warken + Fixes . - * contrib/gpinyin: Make it runnable, version 1.0.0. +2022-05-30 G. Branden Robinson -2014-08-20 Bernd Warken + * src/roff/troff/node.cpp (font_position): If mounting a font + fails and a third argument was given (to the `fp` request), + report its value in the diagnostic message. This could reveal a + prohibited attempt at directory traversal. See commit + a891161bc9, 7 November. - * groff.7 (man/groff.man): Add further preprocessor regions. - Repair documentation for Unicode. +2022-05-30 G. Branden Robinson -2014-08-08 Bernd Warken + * src/libs/libgroff/fontfile.cpp (font::open_file): Refactor. + Move more logic, including memory allocation, inside conditional + that accepts only file names without '/' characters, skipping + unnecessary work in the alternative. Annotate use of zero + literals as null pointers to ease any future migration to ISO + C++11. Add 'const' qualifier to variable that doesn't require + modification (and which is used in the LHS of an equality + comparison, so that clumsy operator misuse will provoke a + compiler warning). - * configure.ac, configure, Makefile.in, m4/groff.m4: Install paths - for implementing contrib/gpinyin's sub.pl. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. -2014-08-06 Bernd Warken +2022-05-30 G. Branden Robinson - * man/groff_char.man: Add description for displaying `uxxxx' as - `\[uxxxx]'. + * configure.ac: In configuration report, say that we're + reporting compiler options along with the compiler executable. + Fix leftover test(1) comparison with garbage, overlooked in + commit faa22d89d2, 20 May. -2014-08-05 Bernd Warken +2022-05-30 G. Branden Robinson - * man/groff.man (groff.7): Replace \[rs] to \e as far as useful. + * doc/doc.am (doc/meintro_fr.ps): Build with '-t' option. -2014-08-05 Bernd Warken + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * man/groff.man (groff.7): Add documentation for the Unicode - escapes \[u....] and \[u.....]. +2022-05-28 G. Branden Robinson -2014-08-02 Bernd Warken + * src/roff/groff/groff.1.man (Options) <-l>: Handle case where + no default print spooler is configured, and report formatter + behavior correctly if it isn't. - * src/roff/groff/groff.man: Improve documentation for `utf8'. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. -2014-08-01 Bernd Warken +2022-05-28 G. Branden Robinson - * contrib/gpinyin: New preprocessor for having the European-style - writing `pinyin' for the Chinese language. + * Makefile.am (.man): Process '@PSPRINT@' substitutions with + "makevarescape.sed". -2014-07-22 Bernd Warken +2022-05-26 G. Branden Robinson - * groff.7 (man/groff.man): Add some useful special characters. + * m4/groff.m4 (GROFF_PROG_YACC, GROFF_MAKEINFO, GROFF_TEXI2DVI): + Fix logic error in detection of build scenario: the presence of + a ".git" directory is not an indicator that we're not building + from a distribution archive, because we might be building from a + snapshot archive (which also lacks it). Instead, perform checks + required only by builds from Git checkouts and snapshot archives + if the ".tarball-version" file is not present. -2014-07-21 Bernd Warken +2022-05-26 G. Branden Robinson - * tbl.1 (src/preproc/tbl/tbl.man): Add simple examples. + * Makefile.am (EXTRA_DIST): Ship "HACKING" file. -2014-07-12 Bernd Warken +2022-05-26 G. Branden Robinson - * groff.7 (man/groff.man): Add section about underlining. + * bootstrap.conf: Add "pkg-config" to `buildreq`. Not having it + causes pretty horrible macro expansion problems and diagnostics + when 'autoreconf' is run; they're still pretty bad even if you + use `AC_REQUIRE` and `m4_pattern_forbid`. So just demand it. -2014-07-07 Bernd Warken +2022-05-25 G. Branden Robinson - * man/groff.man (groff.7): Add some basic special characters - `\(xy'. + * font/devps/S: + * font/devps/symbolmap: Drop excess mapping of `*U` special + character. groff maps it to the Adobe Glyph List name + 'Upsilon1'. (The AGL 'Upsilon' is a homoglyph of the Latin + capital 'Y'.) + * PROBLEMS: De-document build-time warning, now resolved. -2014-07-06 Bernd Warken +2022-05-25 G. Branden Robinson - * grog, groffer: Minor repairing. + * src/utils/afmtodit/afmtodit.tables: Regenerate using Unicode + 14.0. No substantive changes. -2014-07-06 Bernd Warken +2022-05-25 G. Branden Robinson - * src/roff/grog/subs.pl: Repair ligatures handling. + * src/utils/afmtodit/make-afmtodit-tables: Refactor. Drop + unused variable `prog`. Use value of `CPP` from environment (if + defined) and use parameter expansion to apply a default if null + or not set. Use for loop to eliminate duplicative if statement. + Test input files for readability, not just existence. Use more + portable test(1) and shell syntax. Swap usage error and fatal + error exit statuses; using "1" for failure and "2" for usage + errors is more common in shell scripts I've seen. Update usage + message to put non-literal parameter in full caps, and clarify + its name. Update comment blocks written to generated files to + further clarify data provenance. -2014-07-06 Bernd Warken +2022-05-25 G. Branden Robinson - * src/roff/grog/subs.pl: Correct handling of standard input. + * m4/groff.m4 (GROFF_PRINT): Refactor. Stop performing checks + for spooler options if none is available. Stop redundantly + reporting command name used for spooling PostScript files. If + an option is required for spooling DVI files, report it alone + instead of repeating the command name as well. -2014-07-06 Bernd Warken +2022-05-25 G. Branden Robinson - * src/roff/groff/groff.man: Minor correction. + Fix insensitivity of groff(1) man page to configured spooler. -2014-07-06 Bernd Warken + * Makefile.am (.man): Replace `@PSPRINT@` in man page sources + with name of configured print spooler command. + * src/roff/groff/groff.1.man (Options) <-l>: Use configured + print spooler command instead of literal 'lpr'. - * src/roff/grog/*: Minor corrections. +2022-05-24 G. Branden Robinson -2014-07-05 Bernd Warken + * m4/groff.m4 (GROFF_UCHARDET_CHECK): Fix grammar nit in failure + message when user demands uchardet support but the library + cannot be located. - * src/roff/groff/groff.cpp: In `usage()' and `help()' order - alphabetically. +2022-05-24 G. Branden Robinson -2014-07-05 Bernd Warken + * m4/groff.m4 (GROFF_CHECK_GROHTML_PROGRAMS): Fix logic error in + computation of verb to be used in notice message. - * grog.pl, subs.pl: Heavily improve argument handling and `groff' - command line creation. +2022-05-24 G. Branden Robinson -2014-07-05 Bernd Warken + * m4/groff.m4 (GROFF_PROG_YACC, GROFF_URW_FONTS_CHECK) + (GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_UCHARDET_NOTICE): + Improve shell code portability. Per the GNU Autoconf manual, + "The -a, -o, '(', and ')' operands are not present in all + implementations, and have been marked obsolete by Posix 2008. + ...portable uses of test should never have more than four + arguments, and scripts should use shell constructs like '&&' and + '||' instead." - * grog.man: Make file runnable for `doclifter'. +2022-05-24 G. Branden Robinson -2014-07-05 Bernd Warken + * src/roff/groff/groff.1.man (Installation directories): Don't + output a tagged paragraph for the X11 application defaults + directory if the build symbol '@APPRESDIR@' is not defined (that + is, we didn't build with X11 support). - * grog.man: Replace all .de by copying. Restrict all .char names - to lenght 2 only. +2022-05-24 G. Branden Robinson -2014-07-04 Bernd Warken + * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK): Fix code style + nits. Use lowercase for shell variables we define. Don't quote + literal operands to test(1) that don't contain syntactically + shell-significant characters. Update indentation to match + recent practice. - * grog.man: Minor optimization. +2022-05-24 G. Branden Robinson -2014-07-04 Bernd Warken + * m4/groff.m4 (GROFF_URW_FONTS_NOTICE): Don't emit the notice if + Ghostscript isn't available, since it was a prerequisite for + the `GROFF_URW_FONTS_CHECK` macro in the first place. - * grog.man: Transform in classical man-page style. +2022-05-24 G. Branden Robinson -2014-07-04 Bernd Warken + [build]: Add print spooler determination to configuration + report. - * grog.pl, subs.pl: Add option `--warnings'. Rename - `--with_ligatures' to `--ligatures', but keep `--with_ligatures' - for compatibility. + * m4/groff.m4 (GROFF_PRINT): Add shell variable + `groff_have_spooler` to house the name of the print spooler + {"lp" or "lpr"} or the word "no". + * configure.ac: Report determined spooler, or its absence. -2014-07-03 Bernd Warken +2022-05-24 G. Branden Robinson - * Makefile.in: Remove directories `groffer/perl' and - `groffer.shell', which don't exist any more. + * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Skip + seekability check of the standard input stream if there is no + controlling terminal. -2014-07-03 Bernd Warken + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * PROJECTS: Mention the start of the `ideal' project. +2022-05-24 G. Branden Robinson -2014-06-21 Ingo Schwarze + * m4/groff.m4 (GROFF_CHECK_GROHTML_PROGRAMS): Migrate from + `AC_FOREACH` to `m4_foreach` to avoid obsolescence warning from + GNU Autoconf 2.70 or later. - * Makefile.in: Unbreak make install: - Add missing gideal dirs to the dist tarball. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. -2014-06-19 Bernd Warken +2022-05-22 G. Branden Robinson - * src/roff/groff/groff.man: Correct the collection of the - installation directories. + * man/groff.7.man: Rename "pilot" list macros for man(7) from + `BL`/`EL` to `LS`/`LE`, per suggestion from Alejandro Colomar. -2014-06-19 Bernd Warken +2022-05-21 G. Branden Robinson - * src/roff/groff/groff.man: Add the installation file and - directory positions of the whole package with @...@. + * m4/groff.m4 (GROFF_MAKEINFO, GROFF_TEXI2DVI): Check for + makeinfo(1) and texi2dvi(1) programs only if building from Git, + not a distribution archive. -2014-06-19 Bernd Warken +2022-05-21 G. Branden Robinson - * man/groff.man, src/roff/groff/groff.man: Add file position - before and after installation and the latest update. + * doc/doc.am (doc/meintro_fr.ps): Call groff with `-K utf8` + instead of `-k`, in case the "configure" script didn't find + uchardet (and preconv(1) thus can't auto-detect an encoding). -2014-06-18 Bernd Warken + Fixes . - * src/roff/grog/grog.pl: Corrections about `require' and `our' - definitions. +2022-05-21 G. Branden Robinson - * src/roff/grog/subs.pl: In the `groff' output command line, split - the single character options collections into different - 1-character options, each with a leading minus `-'.. -2014-06-20 Bernd Warken + * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Skip + a check if /dev/stdin is not a character special device. - * src/roff/grog/subs.pl: Repair call of `push'. +2022-05-21 G. Branden Robinson -2014-06-18 Bernd Warken + * m4/groff.m4 (GROFF_PDFTOOLS): Rename this... + (GROFF_POPPLER): ...to this. + * configure.ac: Update call site. - * src/roff/grog/subs.pl: Minor correction at `do_first_line'. +2022-05-21 G. Branden Robinson -2014-06-18 Bernd Warken + * m4/groff.m4 (GROFF_UCHARDET_CHECK): Rename this... + (GROFF_UCHARDET_NOTICE): ...to this. + * configure.ac: Update call site. - * src/roff/grog/subs.pl: Adjust for first lines with non-preproc - and not-tmac names to be ignored. + * m4/groff.m4 (GROFF_UCHARDET_NOTICE): Tighten wording of + message reported to user. -2014-06-18 Bernd Warken + Fixes . Thanks to Dave + Kemper for the report. - * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add new first line - of roff files with the names of the needed preprocessors and the - actual tmac, see 2014-06-17 Ulrich Lauther. Replace the - word `ideal' by `gideal', when the preprocessor is meant. +2022-05-21 G. Branden Robinson -2014-06-18 Bernd Warken + * m4/groff.m4 (GROFF_PNMTOOLS_CAN_BE_QUIET) + (GROFF_PNMTOPS_NOSETPAGE): Skip check if prerequisite not met. - * src/roff/grog/Makefile.sub: Add $(RM). +2022-05-21 G. Branden Robinson - * src/roff/grog/grog.pl: Remove call to perl_test.pl. `require - 5.6;' is enough as Perl test. + * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Rename this... + (GROFF_URW_FONTS_NOTICE): ...to this. + (GROFF_URW_FONTS): ...and this... + (GROFF_URW_FONTS_CHECK): ...to this. + (GROFF_URW_FONTS_NOTICE): Give lengthy notice message a one-line + summary. + * configure.ac: Update call sites. - * src/roff/grog/perl_test.pl: Remove this file. +2022-05-21 G. Branden Robinson -2014-06-18 Bernd Warken + * m4/groff.m4 (GROFF_URW_FONTS): Refactor. If our prerequisites + are not met (availability of 'awk' and 'gs'), don't even run the + check logic or print a "checking" message. - * ChangeLog: Add Emacs-mode and a separator for the license. +2022-05-20 G. Branden Robinson -2014-06-17 Ulrich Lauther + Handle missing programs required to construct files needed at + runtime by gropdf more gracefully. Rename and refactor + configuration-time logic to be more understandable. - * grog: Invent new first comment line of roff files with long - names of needed preprocessors and the tmac. + * configure.ac: + * m4/groff.m4: Rename `GROFF_PDFDOC_PROGRAMS` macro to + `GROFF_CHECK_GROPDF_PROGRAMS`. Rename shell variable + `make_pdfdoc` to `use_gropdf`. Set it explicitly to "no" or + "yes" instead of null or not null. -2014-06-17 Bernd Warken + * configure.ac: + * m4/groff.m4: + * doc/doc.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`. - * src/roff/grog/subs.pl: Correct handling of option `-J' for - ideal. + * configure.ac: Call `GROFF_GROPDF_PROGRAM_NOTICE`. -2014-06-17 Bernd Warken + * doc/doc.am: Bracket definition of `PROCESSEDDOCFILES_PDF` + macro and `$(PROCESSEDDOCFILES_PDF)` dependency declaration in + Automake `if USE_GROPDF` conditional. This prevents attempts + to build PDF documents using groff that are doomed to fail. - * src/roff/groff/groff.cpp, src/roff/groff/pipeline.h, - * src/roff/grog/subs.pl: Add `groff' option `-J' for `gideal'. + * m4/groff.m4: Refactor gropdf runtime-dependency program check. + Split into two macros: one (`GROFF_CHECK_GROPDF_PROGRAMS`) + performs the check, the other (`GROFF_GROPDF_PROGRAM_NOTICE`) + issues a notice at the end of the configuration process if at + least one program was not found. Rename `docnote` shell + variable to `gropdf_notice`. Tighten wording of notice. Drop + unused `make_install_pdfdoc` and `make_uninstall_pdfdoc` shell + variables. -2014-06-16 Bernd Warken +2022-05-20 G. Branden Robinson - * src/roff/grog/subs.pl: Remove too early listing of 3 `groff' - preprocessors options: gideal, glilypond, gperl. + Handle missing programs required at runtime by grohtml more + gracefully. Rename and refactor configuration-time logic to be + more understandable. -2014-06-16 Bernd Warken + * configure.ac: + * m4/groff.m4: Rename `GROFF_HTML_PROGRAMS` macro to + `GROFF_CHECK_GROHTML_PROGRAMS`. Rename shell variable + `make_htmldoc` to `use_grohtml`. Set it explicitly to "no" or + "yes" instead of null or not null. - * contrib/gideal: New project for installing `ideal' for `groff'. + * configure.ac: + * m4/groff.m4: + * doc/doc.am: Rename `BUILD_HTML` to `USE_GROHTML`. - * Makefile.in: Add `gideal' for `OTHERDIRS'. + * configure.ac: Call `GROFF_GROHTML_PROGRAM_NOTICE`. -2014-06-15 Bernd Warken + * doc/doc.am: Bracket definition of `PROCESSEDDOCFILES_HTML` + macro and `$(PROCESSEDDOCFILES_HTML)` dependency declaration + in Automake `if USE_GROHTML` conditional. This prevents an + attempt to build an HTML version of the "pic.ms" document that + is doomed to fail (noisily). - * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Repair argument - handling for output `groff' line. + * m4/groff.m4: Refactor grohtml runtime-dependency program + check. Split into two macros: one + {`GROFF_CHECK_GROHTML_PROGRAMS`} performs the check, the other + {`GROFF_GROHTML_PROGRAM_NOTICE`} issues a notice at the end of + the configuration process if at least one program was not found. + Rename `html_docnote` shell variable to `grohtml_notice`. + Tighten wording of notice. Drop unused `make_install_htmldoc` + and `make_uninstall_htmldoc` shell variables. -2014-06-15 Bernd Warken +2022-05-20 G. Branden Robinson - * src/roff/grog/grog.pl, src/roff/grog/grog.man: Correct and add - the documentation for filespec options. + * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_NOTICE): Add newline at + end of buggy Ghostscript notification, so that the multiple + possible lengthy notices after the configuration report have + blank lines separating them. -2014-06-14 Bernd Warken +2022-05-20 G. Branden Robinson - * src/roff/grog/subs.pl: Activate handling of `--run', such that - now the generated `groff' command line can run. + Check for m4 program at configuration time. -2014-06-14 Bernd Warken + * m4/groff.m4 (GROFF_PROG_M4): Define new macro to perform the + check and error out if the program is missing. + * configure.ac: Call the new macro. + * tmac/tmac.am (tmac/groff_man.7.man) + (tmac/groff_man_style.7.man): Use the new implicitly AC_SUBST-ed + variable `M4` to run the program. - * src/roff/grog/subs.pl: Repair handling of filespec arguments. +2022-05-20 G. Branden Robinson -2014-06-12 Bernd Warken + * m4/groff.m4 (GROFF_PROG_YACC): Update wording of error + message: we search for "yacc", so report it as missing if it is + not found (along with "byacc" and "bison"). - * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add testing - methods of Ralph Corderoy's `grog.sh' of 2006. Add primary usage - of file name extensions. +2022-05-20 G. Branden Robinson -2014-06-10 Bernd Warken + * configure.ac: Fix shell style nits. Get rid of string + {non-}nullity tests and comparisons involving concatenation with + garbage (usually "x"). See 13 November entry regarding m4. Use + idiomatic shell "brace style" for control structures. - * src/roff/grog/grog.pl: Totally rewrite the `grog' version, - starting at the last stable version. Write many parts as `sub' - functions. +2022-05-20 G. Branden Robinson - * src/roff/grog/subs.pl: New file by splitting the src file - `grog.pl', such that all functions get into the new file - `subs.pl'. + Trivially refactor libgroff allocator configuration. - * src/roff/grog/Makefile.sub: Add file `subs.pl', which goes into - the `grog' libdir. + * m4/groff.m4 (GROFF_USE_GROFF_ALLOCATOR): Update description of + configuration flag to clarify that it's implemented in a + library. Rename shell variable to prefix it with "groff_", + putting it in an ad hoc name space as with other variables. If + feature disabled, set variable to literal "no". + * configure.ac: Use renamed variable and interpolate it directly + into configuration report, simplifying shell logic. -2014-06-03 James Cloos +2022-05-20 G. Branden Robinson - * src/roff/grog/grog.pl: The errors with `ligatures' come also - from `TeX GYRE' fonts. Print this information, when `grog' should - work with the `pdf' device. + * configure.ac: Revise configuration report for intelligibility. + Add report of C++ compiler and flags used: we compile much more + C++ than C code so this seems appropriate. Report Perl + interpreter version so that we can collect build reports and + turn the ratchet past Perl 5.6.1 at some point. Fix X11 + "resources" misnomer (application defaults are what is meant). + Rephrase generally. -2014-06-02 Bernd Warken +2022-05-20 G. Branden Robinson - * src/roff/grog/grog.pl: The `grog' version of yesterday has many - bugs. So reinstall an old version of `grog'. + * Makefile.am (EXTRA_DIST): Ship "ChangeLog.122" in distribution + archive. Overlooked in commit c11995df16, 19 February 2021. -2014-06-01 Bernd Warken +2022-05-20 G. Branden Robinson - * src/roff/grog/Makefile.sub: Remove changing of first line - `#! ...'. + * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh: + Fix portability problem: POSIX says that "od -c" (and "od -t c") + are supposed to emit printing characters as defined by the + underlying locale, but GNU coreutils od doesn't do this and + macOS od does. Set `LC_ALL` to "C" when running it to force + 3-digit octal reporting of characters with their eighth bit set. -2014-06-01 Bernd Warken + Fixes . Thanks to John + Gardner for the report. Also see . - * src/roff/grog/grog.pl: Remove `$Sp' mostly. Reorder script. - Check and repair requests. Add final character `$' to many - checked requests. +2022-05-19 G. Branden Robinson -2014-06-01 Bernd Warken + * INSTALL.extra (In Case of Trouble): Add advice on using the + test suite, particularly if it fails. - * man/roff.man: Move .TH at the beginning. + Fixes (one hopes). -2014-05-29 Bernd Warken +2022-05-19 G. Branden Robinson - * man/groff.man: In special characters, add the mentioning of the - `groff' writing `\[xy]'. + * doc/groff.texi (Input Line Traps): Expand discussion. The + `it` and `itc` requests count neither input lines (strictly) nor + text lines. Instead, they count input lines that _directly + produce formatted output_ (and, in the case of `itc`, are not + "interrupted" or continued with the `\c` escape sequence). This + is useful--empty requests and requests that don't put nodes on + the output don't break things--but does demand some explanation. + Clarify and provide example. + * man/groff.7.man (Escape sequence short reference) : Sync. -2014-05-27 Bernd Warken +2022-05-18 G. Branden Robinson - * man/groff_char.man: Finish notes in all tables. + * src/roff/troff/env.cpp (environment::choose_breakpoint): Tweak + diagnostic message ("can't" -> "cannot"). + * doc/groff.texi (Breaking): Update example. -2014-05-26 Bernd Warken +2022-05-17 G. Branden Robinson - * man/groff_char.man: Add notes in some tables, more will come. + * doc/groff.texi (Copy Mode): + * man/groff.7.man (Copy mode): Fix omission; `\?` is interpreted + in copy mode. -2014-05-26 Bernd Warken +2022-05-17 G. Branden Robinson - * src/roff/grog/grog.pl: Add further first line characters for - single character `groff' options. + * tmac/s.tmac (PT): Unclutter name space; remove + `pg*saved-page-number-format` string when we're done with it. - * src/roff/grog/grog.man: make generated options more readable. +2022-05-17 G. Branden Robinson -2014-05-26 Bernd Warken + [tbl]: Add unit tests, including one XFAIL for bad behavior. - * src/roff/grog/grog.pl: Add detection of `.\" [eprt]' as first - line to `grog'. Change usage of `$Sp' to reasonable efforts in - `groff'. + * src/preproc/tbl/tests/check-horizontal-line-length.sh: + * src/preproc/tbl/tests/check-line-intersections.sh: + * src/preproc/tbl/tests/check-vertical-line-length.sh: + * src/preproc/tbl/tests/table-lacks-spurious-top-border.sh: Do + it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run tests. + (tbl_XFAIL_TESTS, XFAIL_TESTS): Expect one test failure. - * src/roff/grog/grog.man, man/groff_char.man: Add website for - license text, not only the postal address. +2022-05-16 G. Branden Robinson -2014-04-03 Steffen Nurpmeso + * src/devices/grotty/tty.cpp (tty_printer::add_char): Modify + diagnostic message: what gets written "above [the] first line" + might not be a character (glyph) per se, but a line (rule) from + a drawing command, and in fact the occurrence of these from + boxed tables is the most common cause of this message I've seen. - * */Makefile.*: Path quoting fixes, whitespace, formatting. +2022-05-16 G. Branden Robinson - Remove many quotes (and introduce a few as additional guards) - since groff's build system is generally not set up to properly - handle paths that need quoting. + [grotty]: Do more input validation. -2014-04-03 Steffen Nurpmeso + * src/devices/grotty/tty.cpp (tty_printer::draw): Throw warning + if an unsupported geometric primitive is encountered. + (tty_printer::line): Throw warning if a line is diagonal. Die + if length of a horizontal or vertical line is not a multiple of + the appropriate motion quantum of the device (troff should never + emit such nonsense, and currently doesn't appear to). - * Makefile.comm (extraclean): Don't delete `old'. +2022-05-16 G. Branden Robinson - The rule calling `rm -f' was originally thought to remove private, - temporary files. However, we now have a subdirectory called `old' - in `fonts/devps' that may not be removed, and trying so now causes - an error because we no longer ignore the returned error code of - `rm'. + * src/preproc/tbl/tbl.1.man (Miscellaneous): Document GNU tbl's + use of `#T` and `T.` registers. -2014-04-03 Steffen Nurpmeso +2022-05-15 G. Branden Robinson - * Makefile.in (OTHERDIRS): Fix directory order. + * src/roff/troff/input.cpp (read_color_draw_node): Tweak + diagnostic message to better distinguish drawing commands and + device control commands. - This has been accidentally broken in commit 51476bee from - 2014-02-25. +2022-05-14 G. Branden Robinson -2014-04-03 Steffen Nurpmeso + [grohtml]: Mitigate double-free problem exposed by malformed + input. - * src/devices/gropdf/pdfmom.pl: Fix perl(1) warning. + * src/roff/troff/mtsm.h (struct statem): Place member variable + `issue_no` behind `DEBUGGING` preprocessor symbol, omitting it + from production and ordinary development builds. + * src/roff/troff/mtsm.cpp (no_of_statems): Place global variable + behind `DEBUGGING` preprocessor symbol, omitting it from + production and ordinary development builds. + (statem::statem): Make constructor trivial if `DEBUGGING` not + defined in preprocessor; it manipulates only `issue_no` and + `no_of_statems`, which are synchronized. + (statem::statem {copy}): Gate assignment of `issue_no` member + variable from copy constructor behind `DEBUGGING` preprocessor + symbol. + (statem::flush, mtsm::inherit): Gate debugging output, already + runtime-gated on `debug_state` symbol, of `issue_no` member + variable, so that we don't reference it when it is not declared. -2014-03-30 Werner LEMBERG + See . - * configure: Regenerated. +2022-05-05 G. Branden Robinson -2014-03-30 Steffen Nurpmeso + [refer]: Rename a test artifact; it's a bibliographic database + file, not a refer(1) command file. - * */Makefile.*: Put straight error-prevention prefixes for `rm'. + * src/preproc/refer/tests/artifacts/62124.ref: Rename this... + * src/preproc/refer/tests/artifacts/62124.bib: ...to this. + * src/preproc/refer/refer.am (EXTRA_DIST): + * src/preproc/refer/tests/report-correct-line-numbers.sh: Use + new name. -2014-03-30 Steffen Nurpmeso +2022-05-05 G. Branden Robinson - `uninstall' target: Avoid spurious and misleading error messages. + * src/preproc/refer/command.cpp (process_commands): Begin + migration to use existing global variables for location reports + in diagnostic messages. Save current file name and line number + before calling `command_loop()` and restore them afterward. + Also decrement line counter before entering that loop because it + would be too far advanced by one due to the final newline on a + parsed input line. - * Makefile.comm (uninstall_dev): Improve. +2022-05-05 G. Branden Robinson - * font/devpdf/Makefile.sub (install_data): Remove superfluous `rm'. - (uninstall_sub): Improve. + * src/preproc/refer/refer.cpp (main): Report system error on + `fflush()` failure. POSIX Issue 5 a.k.a. SUSv2 (1997) specifies + several possible `errno` values this C standard library function + can set; see + . - * src/roff/groff/Makefile.sub (uninstall_sub): Fix. +2022-05-05 G. Branden Robinson -2014-03-30 Steffen Nurpmeso + [refer]: Refactor: drop unused version of function (taking only + a `const char *` parameter). - Fixes for `uninstall' target. + * src/preproc/refer/command.cpp (process_commands): Drop + definition. + * src/preproc/refer/command.h (process_commands): Drop + declaration. - * Makefile.in (uninstall_dirs): Use `DESTDIR'. +2022-05-04 G. Branden Robinson - * src/libs/libgroff/Makefile.sub (uninstall_charset_data): Typo. + * src/preproc/refer/refer.cpp (do_file): Fix another off-by-one + line number reporting bug exposed by fix for Savannah #62391. - * src/roff/groff/Makefile.sub (uninstall_sub): Typo. +2022-05-04 G. Branden Robinson - * src/roff/grog/Makefile.sub (uninstall_sub): Minor. + * src/preproc/refer/tests/report-correct-line-numbers.sh: Add + more regression tests. -2014-03-30 Steffen Nurpmeso +2022-05-04 G. Branden Robinson - * src/roff/grog/Makefile.sub (install_data): Typo. + [refer]: Trivially refactor: boolify. -2014-03-29 Steffen Nurpmeso + * src/preproc/refer/command.cpp (input_stack::push_file): Demote + and rename local variable from `int` to `bool`. + (bol): Renamed from this... + (is_at_beginning_of_line): ...to this. - Add fine-tuning of doc generation to `configure'. +2022-05-04 G. Branden Robinson - * m4/groff.m4 (GROFF_DOC_CHECK): New macro, handling option - `--with-doc' and its new arguments. It sets - `docadd_{html,info,other,pdf,examples}' and exports - `make{_,_install_,_uninstall_}{otherdoc,examples}'. - (GROFF_MAKEINFO): Extended to export - `make{_,_install_,_uninstall_}infodoc'. - (GROFF_HTML_PROGRAMS): Extended to export - `make{_,_install_,_uninstall_}{htmldoc,htmlexamples}'. - (GROFF_PDFDOC_PROGRAMS): Extended to export - `make{_,_install_,_uninstall_}{pdfdoc,pdfexamples}'. - (GROFF_INSTALL_INFO): Guard test with `docadd_info'. + [refer]: Trivially refactor. - * configure.ac: Use GROFF_DOC_CHECK. - * Makefile.in: Updated. + * src/preproc/refer/command.cpp (input_stack::push_file): + * src/preproc/refer/refer.cpp (do_file): Drop unnecessary + construction of integer from integer (return type of `getc()`) + in argument to error diagnostic functions; parallelizes with + other diagnostic function calls. - * doc/Makefile.sub: Handle examples separately, controlled by - $(make{_,_install_,_uninstall_}examples). +2022-05-04 G. Branden Robinson -2014-03-27 Bjarni Ingi Gislason + * src/preproc/refer/command.cpp: Refactor to simplify. + (get_location): Demote return type from `int` to `void`. The + function only ever returned a `1` literal. + (input_stack::error): Update call site to stop uselessly testing + return value of `get_location()`. - * tmac/www.tmac (TAG): Define register `PN'. +2022-05-03 G. Branden Robinson -2014-03-27 Bjarni Ingi Gislason + * doc/doc.am (dist-info-bits, install_infodoc, dist-gnueps): Fix + logic error. When checking both source and build trees for + files to copy, break after successfully copying the files, not + after the first iteration of the loop unconditionally. This + caused the Info documents not to be installed from out-of-tree + builds, and potentially would prevent them and doc/gnu.eps from + being included in the distribution archive if for some reason + they didn't build and that build failure were not treated as an + error. Problems introduced by me in commits e78bd20d54, 27 + March, and d79c3f3a4a, 11 November. - * tmac/an-ext.tmac (EX, EE): Preserve font family. +2022-05-03 G. Branden Robinson -2014-03-17 Werner LEMBERG + * m4/groff.m4 (GROFF_APPRESDIR_OPTION): Update comments and + human-readable output to (1) stop claiming that existing + gxditview application defaults in the installation directory + will be backed up; this is no longer true as of commit + c66cb7725f, 3 April; and (2) refer to these files as + "application defaults", not "resources". (X11 application + defaults are client-side and mandatory [for Xt-based programs]; + X resources are stored server-side and need not be configured to + determine an X client's geometry and rendering.) + +2022-05-03 G. Branden Robinson + + * font/devX100-12/devX100-12.am (devX100_12_fontdir): + * font/devX100/devX100.am (devX100_fontdir): + * font/devX75-12/devX75-12.am (devX75_12_fontdir): + * font/devX75/devX75.am (devX75_fontdir): Define macros without + an extra "font/" layer in the directory hierarchy. - * src/preproc/eqn/box.cpp (set_script_size): Fix minimum test. + Fixes problem introduced by me in commit 3c82cbbfe5, 27 + February. + +2022-05-03 G. Branden Robinson + + * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries): Spell + dependency on `$(SH_DEPS_SED_SCRIPT)` using that macro expansion + instead of a literal file name. See doc/automake.mom. - Problem reported by Ted Harding in a - thread starting with +2022-05-02 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2014-03/msg00181.html + * src/preproc/eqn/eqn.am (MAINTAINERCLEANFILES): + * src/preproc/pic/pic.am (MAINTAINERCLEANFILES): + * src/preproc/refer/refer.am (MAINTAINERCLEANFILES): Preserve + byacc/bison output artifacts unless "maintainer-clean"ing. Per + the GNU Automake manual, "The intermediate files generated by + yacc (or lex) will be included in any distribution that is made. + That way the user doesn’t need to have yacc or lex." + +2022-05-02 G. Branden Robinson + + * Makefile.am: Stop manually handling "test-groff". Per the + GNU Automake manual, "If configure built it, then distclean + should delete it." This is taken care of automatically if we + don't interfere. + (BUILT_SOURCES, MOSTLYCLEANFILES): Drop "test-groff". + +2022-05-02 G. Branden Robinson -2014-03-16 Werner LEMBERG + * src/preproc/eqn/eqn.am (neqn): Produce temporary file first + and set its permissions before moving it into place. If + anything in the future ever has a dependency on it, this avoids + a race where the file exists, satisfying a dependency, but + execution is attempted before its `x` permission bit is set. + +2022-05-02 G. Branden Robinson + + [build]: Ensure that we install *.me source files, but don't + include them in the distribution archive. + + * doc/doc.am (dist_otherdoc_DATA): Move `$(GENERATEDDOCFILES)` + from here... + (nodist_otherdoc_DATA): ...to here. + (.PRECIOUS): Add `$(GENERATEDDOCFILES)` so that make(1) doesn't + automatically remove "intermediate" objects in the .me.in -> .me + -> .ps chain. + +2022-05-02 G. Branden Robinson + + [build]: Handle "gnu.eps" file better. + + * doc/doc.am (GENERATEDDOCFILES): Remove `$(DOC_GNU_EPS)`. + (EXTRA_DIST): Ship `$(DOC_GNU_EPS)` in distribution archive. + ($(DOC_GNU_EPS)): Simplify rule commands; stop trying to copy + the file around since it will either be (1) in the distribution + archive from which a build is performed; or (2) missing because + a build is being done from Git, in which case we expect the PNM + tools to be available. + +2022-05-02 G. Branden Robinson + + * doc/doc.am (clean_otherdoc): Drop target: it doesn't seem to + accomplish anything. + (clean_infodoc): Drop target, moving its rules into... + (maintainer-clean-local): ...this. Drop deps, both gone now. + +2022-05-02 G. Branden Robinson + + * doc/doc.am (distclean-local): Drop target: stop cleaning + generated forms of our Texinfo manual with the "distclean" + target. They ship with the distribution archive and should + remain in the tree even if the user needs to re-./configure. + +2022-05-02 G. Branden Robinson + + [build]: Fix problems exposed by high build parallelism. + + * font/devpdf/devpdf.am (font/devpdf/util/BuildFoundries) + (font/devpdf/DESC, font/devpdf/Foundry): Drop + unnecessary removal of target prior to creating it. + (font/devpdf/Foundry): Add creation of destination build + directory as other targets do. + (font/devpdf/download): Create dedicated target instead of + lumping its generation under the stamp file. Add missing + dependencies on `$(DEVPDFFONTMAP_1)`, `$(DEVPDFFONTMAP_2)`, + `font/devpdf/Foundry` and `font/devpdf/enc/text.enc`. Remove + now-unnecessarily complicated "forgery" of "GEN" line in quiet + builds. Tweak format of comment written to "download" file to + make field identities clearer. Construct output (with multiple + shell commands) in temporary file so it is not read prematurely + by the "BuildFoundries" script. Move target into place as the + last step. + (font/devpdf/stamp): Relocate target to follow its dependencies. + Add dependency on "font/devpdf/download". + +2022-05-02 G. Branden Robinson + + [build]: Tweak diagnostic messages in BuildFoundries script. + + * font/devpdf/util/BuildFoundries.pl (LoadFoundry) + (WriteDownload, CheckFoundry): Recast for specificity and + consistent style. + (Die): Stop reporting line number with fatal errors; none of the + call sites are parsing input. + +2022-05-02 G. Branden Robinson + + [refer]: Fix off-by-one error in line number for some + diagnostics. + + * src/preproc/refer/command.cpp (input_item::get_location): + Decrement reported line number by one after looping over input + so that we report the line number as it was before the last + newline character seen. This off-by-one error was partially + masked by... + * src/preproc/refer/refer.cpp (do_file): ...initialization of + `current_lineno` to zero. However, for syntax problems (as + opposed to the semantic problems of refer(1) command + processing), this could result in complaints about the line + number before they occurred, even on "line zero". Initialize + the variable to 1. + + Fixes . + +2022-05-02 G. Branden Robinson + + * src/preproc/refer/tests/report-correct-line-numbers.sh: Add + regression test for Savannah #62391. + +2022-05-02 G. Branden Robinson + + * src/utils/tfmtodit/tfmtodit.cpp (usage): Tweak usage message. + Condense `-v` and `--version` into a single output line with + brace and pipe notation, which we do not use in our man pages, + but consistently do in our usage messages. Use lowercase for + option arguments since they are separated from option flag + letters by space. Call `fprintf()` once instead of 3 times. + +2022-05-01 G. Branden Robinson + + * src/preproc/refer/refer.cpp (main): Tweak wording of + diagnostic messages to refer to options consistently and to + characterize input as "invalid" rather than "bad". + (usage): Document --version option. Use more informative + metasyntactic variable names. Organize usage message + consistently with our others, and stop wrapping the output + lines: we know neither the width of the terminal nor the length + of the `program_name` string we're interpolating. See commit + b4de44f0, 19 July 2021. + +2022-05-01 G. Branden Robinson + + * src/roff/troff/input.cpp (string_iterator::backtrace): Fix + spurious output when `mac.filename` is empty. Provoked by: + $ printf '\\(' | troff -b + +2022-05-01 G. Branden Robinson + + * src/preproc/refer/refer.cpp: Trivially refactor. Demote + global variable `recognize_R1_R2` from integer to Boolean. + (main, do_bib): Give expressions to `assert()` meaningful + content. + (is_list): Demote return type from `int` to `bool`. + (do_file): Demote and rename integer local variables + `start_of_line` to Boolean `at_start_of_line`. + (is_list, do_file): Reorder equality comparisons to avoid + inadvertent lvalue assignment. + +2022-05-01 G. Branden Robinson + + [build]: Reduce and rationalize in-tree document dependencies. + This eliminates spurious rebuilds of numerous documents + {including the 380+-page groff-man-pages collections}. It also + fixes missing dependencies when using the build's groff to + generate PostScript documents. + + * .gitignore: Drop old name of devpdf stamp file. + * doc/.gitignore: Drop now-unused "example.stamp" file. + * doc/doc.am (PROCESSEDDOCFILES_HTML, PROCESSEDDOCFILES_PDF) + (PROCESSEDDOCFILES_TXT): Add new macros grouping targets by the + format/output driver used to produce them, to better organize + dependencies for their generation. + (PROCESSEDDOCFILES): Redefine as simply the expansions of the + foregeoing. + (PROCESSEDFILES_DEPS_HTML, PROCESSEDFILES_DEPS_HTML, + PROCESSEDFILES_DEPS_PDF, PROCESSEDFILES_DEPS_TXT): Add new + macros defining prerequisites for production of the + corresponding output document formats. + ($(PROCESSEDDOCFILES_HTML), $(PROCESSEDDOCFILES_PDF), + $(PROCESSEDDOCFILES_PS), $(PROCESSEDDOCFILES_TXT)): Declare the + dependencies using expansions of the foregoing macros. + (MOSTLYCLEANFILES): Drop "doc/automake.pdf", now part of + `PROCESSEDDOCFILES_PDF`. + (doc/automake.pdf): Drop dependencies already supplied by + `PROCESSEDFILES_DEPS_PDF`. + (HTMLDOCFILES): Drop macro. "doc/pic.html" is now in the + expansion of `PROCESSEDDOCFILES_HTML`. + (htmlpic_DATA): Redefine as expansion of + `PROCESSEDDOCFILES_HTML` instead of `HTMLDOCFILES`. + (PROCESSEDEXAMPLEFILES_HTML) [BUILD_HTML]: Define as + "doc/webpage.html", otherwise as empty. + (PROCESSEDEXAMPLEFILES_PS): Contain "doc/webpage.ps" and + "doc/grnexampl.ps". + (PROCESSEDEXAMPLEFILES): Redefine as expansions of + `PROCESSEDEXAMPLEFILES_HTML` and `PROCESSEDEXAMPLEFILES_PS`. + ($(PROCESSEDEXAMPLEFILES_HTML), $(PROCESSEDEXAMPLEFILES_PS)): + Declare dependencies using `PROCESSEDFILES_DEPS_HTML` and + `PROCESSEDFILES_DEPS_PS`, respectively. + (HTMLEXAMPLEFILES): Drop macro. "doc/webpage.html" is now in + the expansion of `PROCESSEDDOCFILES_HTML`. + (nodist_htmlexamples_DATA): Drop macro, no longer needed. + ($(PROCESSEDDOCFILES_PS)): Relocated and redefined above. + ($(PROCESSEDEXAMPLEFILES) $(PROCESSEDDOCFILES)): Drop overbroad + dependency declarations in favor of the above. + (MOSTLYCLEANFILES, doc/examples.stamp): Drop generation and + removal of unnecessary stamp file. + (doc/pic.html, doc/webpage.html): Add explicit dependency on + required preprocessors. Drop redundant and spurious + dependencies. + * font/devhtml/devhtml.am (MOSTLYCLEANFILES) + (font/devhtml/stamp): Generate and remove stamp file to enable + reliable target dependencies for build-time generation of HTML + documents by groff. + * font/devpdf/devpdf.am (MOSTLYCLEANFILES, font/devpdf/stamp): + Rename stamp file from "font/devpdf/build_font_files". + (font/devpdf/stamp): Drop unnecessary dependency on "afmtodit". + * font/devps/devps.am (MOSTLYCLEANFILES, font/devps/stamp): + Generate and remove stamp file to enable reliable target + dependencies for build-time generation of PostScript documents + by groff. + * font/devutf8/devutf8.am (MOSTLYCLEANFILES) + (font/devutf8/stamp): Generate and remove stamp file to enable + reliable target dependencies for build-time generation of + UTF-8-encoded text documents by groff. + + Fixes ; thanks to + Sergei Trofimovich for the report. Also fixes + ; thanks to Bjarni Ingi + Gislason for the report. + +2022-04-30 G. Branden Robinson + + [build]: Fix code style nits in Automake files. + + * doc/doc.am: Put spaces around (Auto)make variable assignments, + for consistency with the rest of this .am file, and our others. + * font/devpdf/devpdf.am (font/devpdf/build_font_files): Use + shell '>' operator instead of touch(1). + * font/devhtml/devhtml.am (font/devhtml/DESC): + * font/devps/devps.am (font/devps/DESC): Construct target in + temporary file, since doing so is a multi-step process, moving + it to the target name when it is complete and usable by + dependencies. + +2022-04-29 G. Branden Robinson + + * src/preproc/refer/refer.cpp (main): When complaining of + unrecognized option, report the entire option string (after + the leading dash), not just its first character. + +2022-04-29 G. Branden Robinson + + * src/libs/libgroff/error.cpp: Trivially refactor. Explicitly + compare pointer lvalues to null pointers instead of punningly + treating them as Booleans. Annotate use of zero literals as + null pointers to ease any future migration to ISO C++11. + +2022-04-27 G. Branden Robinson + + * tmac/an.tmac (an*abbreviate-inner-footer): Clean up better + before early returns. Remove temporary registers. + +2022-04-27 G. Branden Robinson + + * tmac/fallbacks.tmac: Add fallbacks for U+02C6 MODIFIER LETTER + CIRCUMFLEX ACCENT and U+02DC SMALL TILDE to Basic Latin + characters. + +2022-04-27 G. Branden Robinson + + [tests]: Fix portability problem. Don't pass echo(1) arguments + containing backslashes because implementations handle them + differently. Use printf(1) instead. Thanks to Bertrand + Garrigues for reporting the problem and confirming the fix on + his build host. + + * tmac/tests/e_chapter-titles-work.sh: + * tmac/tests/e_ld-works.sh: + * tmac/tests/localization-works.sh: Do it. + +2022-04-27 G. Branden Robinson + + * src/devices/gropdf/gropdf.pl (ppsz): Recognize "com10" (U.S. + commercial envelope) paper format. + + Addresses the original issue reported in + . We have however broadened + its scope; see . + +2022-04-27 Dave Kemper + + * src/devices/gropdf/gropdf.pl (ppsz): Recognize ISO B-series + paper formats using strings of the form "b0-b6", not "isob0-b6", + for consistency with libgroff and papersize.tmac. - Fix previous commit. + Fixes . - Problem reported (with a patch) by Ingo Schwarze - . +2022-04-27 G. Branden Robinson - * doc/Makefile.sub (groff_bin_dirs): Add `preconv'. + * doc/doc.am: Refactor to simplify. Ingo's removal of the + "--with-doc" "configure" option, among other changes, clears the + way to remove many phony targets and simplify dependencies + involving generation of the 5 formats of our Texinfo manual. + (build_infodoc, doc, doc_all, doc_txt, dvi, doc_dvi, pdf, + doc_pdf, html, doc_html): Drop phony targets. + (all): Depend directly on doc/groff.{info,txt,html,dvi,pdf}. + * NEWS: Add item since "make doc" is no longer necessary and + will do nothing. - * doc/Makefile.in (groff_bin_dirs): Add `preconv'. - (.me.txt): Call preconv. Use UTF8 as output encoding. - (.me.ps): Call preconv. +2022-04-26 G. Branden Robinson -2014-03-14 Werner LEMBERG + [tbl]: Handle `\R` sequences in text blocks robustly. - [me] Add translation of `meintro.me' to French. + * src/preproc/tbl/table.cpp (table::add_entry): Fix SEGV when + repeating glyph table entry syntax (`\Rx`) used in a text block. + Lift extraction of entry string to be done unconditionally, + rather than in 5 different special cases. This frees us up to + rewrite the entry if necessary, changing '\R' to '\&' inside a + text block. Recast diagnostic to describe the problem + clearly--"bad repeated character" suggests that something is + wrong with the "argument" to `\R`, when really the problem is + the _context_. - Contributed by Grégoire Babey . + Fixes . - * doc/meintro_fr.me: New file. - * LICENSES, doc/Makefile.sub: Updated. +2022-04-27 G. Branden Robinson -2014-03-13 Ingo Schwarze (tiny change) + [tbl]: Regression-test Savannah #62366. - man: Correctly reset margins. + * src/preproc/tbl/tests/\ + do-not-segv-when-backslash-R-in-text-block.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. - See +2022-04-26 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2013-11/msg00026.html + * src/libs/libgroff/string.cpp (string::extract): Check return + value of `malloc()` for nullity, and only poke into the buffer + returned if it is valid. Discovered while troubleshooting + Savannah #62366. - for more. +2022-04-23 Bertrand Garrigues - * tmac/an-old.tmac (set-an-margin): Whenever (re)setting - `\n[an-level]' to 1 (which happens when encountering `.TH', `.SH', - and `.SS') make sure to also (re)set `\n[an-saved-margin1]' and - `\n[an-saved-prevailing-indent1]' to a sane value such that an - immediate `.RE' cannot wreak havoc. - (TH, SH, SS): Updated. + gnulib: replace non-recursive-gnulib-prefix-hack with + automake-subdir option -2014-03-11 Ingo Schwarze (tiny change) + 'non-recursive-gnulib-prefix-hack' is deprecated by gnulib's + commit f8eed11b15e9141d061900e4068ea1f3ba9b63f6 and replaced by + '--automake-subdir'. - * Makefile.in: Do not forget to install gropdf manuals. + * bootstrap.conf: + (gnulib_modules): Remove option + 'non-recursive-gnulib-prefix-hack'. + (gnulib_tool_option_extras): Add option '--automake-subdir'. + (bootstrap_post_import_hook): Remove the invocation of + 'build-aux/prefix-gnulib-mk'. - This got broken in 290eaaac6cfc33856cd683838accc72ccf3e5a84: - src/devices/gropdf was split out of OTHERDIRS into SHPROGDIRS, and - consequently, Makefile.man was no longer used there. Note that - Makefile.dev is *not* needed, even though it's below /devices/. + * doc/automake.mom: update documentation accordingly. -2014-03-11 Ingo Schwarze (tiny change) + Fixes and + , issues reported and fix + suggested by Bjarni Ingi Gislason . Fix + also suggested by Werner LEMBERG (see + ). - * src/roff/groff/Makefile.sub: POSIX conformance. +2022-04-23 Bertrand Garrigues - - POSIX says that the meaning of the make(1) `$<' macro shall be - unspecified except in inference rules. Consequently, use `$?' - for portability. + Update gnulib submodule - That's safe because the rules have only one prerequisite and - are not `.PHONY', so `$?' will always expand to one item. + * gnulib now points on c8b8f3bbcde37a53cd226f4c9cebd0dde6aca37f - - While here, clean up two instances of superfluous use of cat(1). + * bootstrap: merge the latest version from gnulib/build-aux + {groff's bootstrap has a patch for OS X}. -2014-03-11 Ingo Schwarze (tiny change) + * bootstrap.conf: update copyright date. - * Makefile.in (dist): Improve. +2022-04-17 G. Branden Robinson - - Bugfix: Do not error out if one of the DISTDIRS - contains a subdirectory. - - Make debugging easier by splitting the huge "cd tmp; ...; ..." - command sequence into several independent shell commands, - such that one can see which command actually fails. + * tmac/s.tmac (XH-UPDATE-TOC): Modify Keith Marshall's new XN/XH + feature to indent TOC entries by section heading depth. The + increment is 2 ens per depth level. -2014-03-06 Deri James +2022-04-17 G. Branden Robinson - Missing RE escape in grep. + * tmac/s.tmac (XA): Drop apparently useless `ll` request. It + doesn't do anything according to my tests. - * src/devices/gropdf/pdfmom.pl: Escape '\' dot in grep RE. +2022-04-15 G. Branden Robinson -2014-02-26 Bernd Warken + * src/preproc/refer/label.ypp: Drop redundant declaration of + `yyparse`. Both byacc 20140715 and GNU Bison 3.3.2 supply the + the function prototype themselves. Addresses + "-Wredundant-decls" warning from GCC. - * src/roff/grog/grog.pl: Add detection of `gperl' to `grog'. + Fixes . -2014-02-25 Bernd Warken +2022-04-15 G. Branden Robinson - * contrib/gperl: New preprocessor for Perl parts in groff files. + * src/preproc/grn/hdb.cpp (DBGetType): Lower fatal diagnostics + to errors when encounting invalid element type characters. + Return a value interpreted by our caller as an error indication + instead. Helps compilers determine that we're not implicitly + falling through our cases. Addresses "-Wimplicit-fallthrough" + warnings from GCC. -2014-02-15 Ingo Schwarze + Fixes https://savannah.gnu.org/bugs/?54702>. - * tmac/groff_mdoc.man: Improve the manual page template. +2022-04-15 G. Branden Robinson - - Add the EXIT STATUS section. It is widely used in at least - NetBSD, FreeBSD, OpenBSD, and DragonFly manuals. - - Recommend the DIAGNOSTICS section for section 4 manuals. Such - usage is very widespread, in particular for kernel printf - messages emitted by device drivers. - - Do not recommend the DIAGNOSTICS section for command return - values to the shell any longer. While such usage historically - existed, it does not seem common nowadays, and in any case, using - the now well-established EXIT STATUS section seems preferable to - me. - - Mention the possibility to use ERRORS for section 4 manuals. - While most section 4 manuals have a DIAGNOSTICS section, only - some will need an ERRORS section, but these cases aren't exactly - rare, either. Quite some device driver manuals explain how to - use the device using system calls like ioctl(2), open(2), read(2) - or write(2), in which case the ERRORS section is the natural - place to explain which errno values the driver may set during - such system calls. - - Mentioning signal handling as a content of the ERRORS section - seems redundant, it is already covered by talking about the - errno. The case of errno == EINTR should be handled just like - all other errno cases. For an example showing that there is no - need to single out error handling in any way, please look at a - typical read(2) manual page. - - Mention the CAVEATS section. It first appeared in the 4.2BSD - execve(2) manual in 1983, was already used by several manuals by - the time of 4.4BSD-Lite2 in 1995, and is in whidespread use - today, not just in BSD base system manuals, but for example in - Perl manuals as well. + * src/preproc/grn/hdb.cpp (DBRead): Add more validity checking. + Verify that the number of conversions returned by fscanf() is as + expected instead of throwing this information away--abort + processing ("giving up" like pic(1) does) if it does not. + Consistently report this abandonment in diagnostic messages. + Similarly validate pointer returned by fgets(). Soften handling + of invalid text condition from fatal error, introduced in + commit eb4f0675e, 16 August, to a normal one with abandonment of + Gremlin file. Addresses "-Wunused-result" warnings from GCC. -2014-02-14 Bernd Warken +2022-04-14 G. Branden Robinson - * src/roff/grog/grog.pl: Add detection of glilypond-parts in groff - files. For example `grog example.groff' from the glilypond source - gets `glilypond example.groff | groff'. + * src/preproc/grn/main.cpp (conv): Throw an error diagnostic + when failing to open a Gremlin picture file. -2014-02-12 Bernd Warken +2022-04-14 G. Branden Robinson - * src/roff/grog/grog.pl: With the former bugfix of 2014-02-12, - it's now possible to run `grog meref.me' etc., which wasn't - possible before. That addition of the macro handling was - necessary for the automatic for `groffer'. + [man]: Fix extraneous space in output after `ME` or `UE` when + mandoc wrapper is used. -2014-02-12 Bernd Warken + * tmac/an-ext.tmac (UE, ME): Double backslashes in macro + definitions when interpolating `.$` register (just like we tell + everyone else to do). This one was interesting to track down. + When using just `-man`, the problem never manifested; only with + `-mandoc`. The difference is that with the former, the `.$` + register is initialized to zero; with the latter, because `TH` + is aliased to another macro (then unaliased), `.$` has the + argument count to the `TH` macro, not to the macros actually + being called. This caused the wrong branch of a conditional to + be taken and put an extra space node on the output. - * src/roff/grog/grog.pl: Add handling of macro definition and fix - problems with @VERSION@. + Fixes . -2014-02-12 Rich Burridge +2022-04-14 G. Branden Robinson - [grn] Prevent crash if more than 50 command line arguments. + * tmac/cp1047.tmac: + * tmac/latin1.tmac: + * tmac/latin2.tmac: + * tmac/latin5.tmac: + * tmac/latin9.tmac: Stop remapping input soft hyphen characters + with `tr` requests in character encoding macro files. The + formatter does this for us now. - * src/preproc/grn/main.cpp (INIT_FILE_SIZE, FILE_SIZE_INCR): New - macros. - (add_file): New function. - (main): Use it to add file arguments. +2022-04-14 G. Branden Robinson -2014-01-29 Ulrich Spörlein + [troff]: Translate 8-bit NBSP and SHY on input. - * tmac/doc-common: Add even more DragonFlyBSD releases. + * src/roff/troff/input.h: Define constant integers for "input" + no-break spaces and soft hyphens for EBCDIC and non-EBCDIC + (presumably ASCII/ISO 8859/Unicode) systems. -2014-01-28 Ulrich Spörlein + * src/roff/troff/input.cpp (token::next): Translate the input + character codes for NBSP to \~ and SHY to \%. - * tmac/doc-common: Add some new *BSD version strings. + Fixes . Thanks to Dave + Kemper for the report, code review, and his suggestion to push + more work to compile time. -2014-01-06 Bernd Warken +2022-04-14 G. Branden Robinson - * man/roff.man: Add information of new archives for RUNOFF and - roff_classical. + [groff]: Regression-test Savannah #58962. - * Makefile.in: Replace `contrib/RUNOFF' by - `contrib/groff_filenames'. + * src/roff/groff/handle_special_input_code_points.diff: Do it. + * src/roff/groff/groff.am (groff_TESTS): Run test. -2014-01-05 Bernd Warken - Werner LEMBERG +2022-04-14 G. Branden Robinson - * groff/tmac/groff_man.man: Minor typos, formatting, reordering. + * src/roff/troff/input.cpp (do_if_request): Clarify diagnostic; + at the point it is thrown, we know not merely that we're in a + conditional expression, but processing an output comparison + operator. -2014-01-05 Werner LEMBERG +2022-04-13 G. Branden Robinson - Revert recent changes to `an-ext.tmac' and `groff_man.man'. + * doc/groff.texi: + * doc/ms.ms: + * man/groff.7.man: Characterize "roff language" in the singular, + not the plural, emphasizing the similarity of extant specimens. - * groff/tmac/an-ext.tmac (.FONT): Remove. This doesn't belong into - this file. + * doc/groff.texi (Conventions Used in This Manual): Add + paragraph discussing denotations of "groff" and "roff". - * groff/tmac/groff_man.man: Reset to state previous to 2014-01-04. - Useful changes will be re-committed in smaller, logical chunks. + Fixes . Thanks to John + Gardner and Dave Kemper for the discussion. -2014-01-05 Bernd Warken +2022-04-12 Ingo Schwarze - * groff/tmac/an-ext.tmac: in .FONT change variable name `result' - to `an_ext_FONT_result'. + Delete the harmful, ill-designed, buggy, and essentially + unmaintained and untested --with-doc option of the configure + script. -2014-01-04 Bernd Warken + * configure.ac: Delete five AM_CONDITIONAL variables, one + autoconf(1) macro call, and some related diagnostic output. + * doc/doc.am: Delete two BUILD_EXAMPLES and one BUILD_OTHERDOC + conditional and use BUILD_HTML instead of BUILD_HTMLEXAMPLES. + * m4/groff.m4: Delete the GROFF_DOC_CHECK macro and simplify the + macros GROFF_HTML_PROGRAMS, GROFF_INSTALL_INFO, GROFF_MAKEINFO, + and GROFF_PDFDOC_PROGRAMS. This also deletes more than thirty + configuration variables. + * Makefile.am: Delete comments about 16 variables that are no + longer set. + * NEWS: Add details regarding the rationale. - * groff/tmac/an-ext.tmac: add new request .FONT for using - different font names on a single line. +2022-04-12 G. Branden Robinson - * groff/tmac/groff_man.man: put under GPL2, reordered and enhanced. + * src/preproc/preconv/preconv.cpp (unicode_entity): Convert + input U+00A0 to \~ as troff would, not to \[u00A0]. -2014-01-02 Deri James + Fixes . - * src/devices/gropdf/gropdf.pl: gropdf use to fail when handling - output from preconv, now works. +2022-04-11 Deri James - * src/devices/gropdf/pdfmom.pl: can now be used as a pipeline, and - improvements made to its switch handling and use with preconv. + [gropdf] fails to deal with 255th glyph in font. - * tmac/pdf.tmac: changes to support preconv. + * src/devices/gropdf/gropdf.pl: a pdf font can only contain 255 + glyphs. The array which holds the glyph names also holds the + start position (zero) as first element, it is legal for it to + contain 256 elements, so truncate to 256 (not 255). -2014-01-02 Colin Watson + Fixes . - * font/devascii/Makefile.sub ($(FONTS)): Convert extended regex - syntax to basic for sed. - * font/devcp1047/Makefile.sub ($(FONTS)): Likewise. - * font/devhtml/Makefile.sub ($(FONTS)): Likewise. - * font/devlatin1/Makefile.sub ($(FONTS)): Likewise. - * font/devutf8/Makefile.sub ($(FONTS)): Likewise. +2022-04-09 G. Branden Robinson -2013-12-23 Bernd Warken + [localization]: Define hyphenation mode registers for Japanese + and Chinese. They are set to zero but must be defined so that + macro packages can rely on their existence without causing 'reg' + warnings. - * groff/src/roff/groff/groff.cpp: add groff option `-G' to the - documentation in `synopsis()'. + * tmac/ja.tmac: + * tmac/zh.tmac: Do it. -2013-12-06 Mike Frysinger +2022-04-09 G. Branden Robinson - Fix parallel build with gropdf and mom examples. + [tests]: Add test for multi-lingual man(7) scenario. - The `contrib/mom/examples/' directory uses the helper script from - `src/devices/gropdf/'. Currently though, parallel builds might fail - like so: + * tmac/tests/localization-works.sh: Test two more cases. Ensure + that the 'trap bit' (hyphenation value 2, which has nothing to + do with any language) is preserved when switching locales back + from a CJK language, since those languages' modes + unconditionally clear it. We test Japanese and Chinese; we have + no localization macro file for Korean at this time. - ... - make[2]: Entering directory `.../groff-1.22.2/contrib/mom' - examples/letter.mom >examples/letter.pdf - examples/mom-pdf.mom >examples/mom-pdf.pdf - /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory - make[2]: *** [examples/letter.pdf] Error 127 - /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory - make[2]: *** [examples/mom-pdf.pdf] Error 127 - make[2]: Leaving directory `.../groff-1.22.2/contrib/mom' - make[1]: *** [contrib/mom] Error 2 - ... - make[2]: Entering directory `.../groff-1.22.2/src/devices/gropdf' - sed -f .../groff-1.22.2/arch/misc/shdeps.sed \ - -e "s|@VERSION@|1.22.2|" \ - -e "s|@PERLPATH@|/usr/bin/perl|" ./pdfmom.pl >pdfmom +2022-04-09 G. Branden Robinson - The top level makefile tries to account for this in general with - OTHERDIRS, but looks like `src/devices/gropdf/' was added to this - variable (which holds `contrib/mom/' too) because gropdf installs a - shell script, and the other prog vars require it to be a dir of - things to compile. + [man]: Slightly refactor `an*abbreviate-inner-footer`. - URL: http://crbug.com/324116 - URL: https://bugs.gentoo.org/487276 + * tmac/an.tmac (an*abbreviate-inner-footer): Discard + unnecessary string. - * Makefile.in (SHPROGDIRS): Declare. - (PROGDIRS): Add $(SHPROGDIRS). - (OTHERDIRS): Delete src/devices/gropdf. - ($(SHPROGDIRS):): Add to existing rule. - ($(OTHERDIRS):): Depend on $(SHPROGDIRS). +2022-04-09 Ingo Schwarze -2013-12-08 Eric S. Raymond + Fix the configuration of texi2dvi. - Repository fully converted to git. + * m4/groff.m4: Set groff_have_texi2dvi if texi2dvi(1) is + available and usable, even if the availability was specified by + the user by manually providing the configure variable + PROG_TEXI2DVI, and not only if it was autodetected. + Also, set the PROG_TEXI2DVI Makefile variable to the name of + the texi2dvi program specified by the user or autodetected, + and not to the string "found", such that this Makefile variable + can be used for invoking the program. + * doc/doc.am: Call the texi2dvi program specified by the user + or autodetected rather than hardcoding "texi2dvi". This lets + the groff build succeed on systems where the first texi2dvi + in the $PATH is an old version unfit for groff's purposes. -2013-11-21 Werner LEMBERG +2022-04-08 G. Branden Robinson - * config.guess, config.sub: Updated from `config' repository. + [man]: Abbreviate long `TH` arguments more carefully. -2013-11-06 Werner LEMBERG + * tmac/an.tmac: Do it. + (an*scan-string-for-backslash): Add new helper macro. + (an*abbreviate-inner-footer): Rewrite. Use the foregoing and a + different technique to compute available space and shorten the + string. - * src/libs/libgroff/tmpname.cpp (gen_tempname): Use O_BINARY. + Fixes . - Problem reported by Charlie Van Dien ; see +2022-04-08 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2013-10/msg00006.html + [man]: Add regression test for Savannah #62257. -2013-11-06 Werner LEMBERG + * tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh: + Do it. + * tmac/tmac.am (tmac_TESTS): Run it. - * Makefile.comm (.man.n): Use C locale. +2022-04-08 G. Branden Robinson - Problem reported by Petr Man ; fix suggested by - Ralph Corderoy . + * tmac/an.tmac: Trivially refactor. Rename strings `an-ifoot` + to `an*ifoot` and `an-outer-footer-text` to `an*ofoot`. -2013-07-24 Ingo Schwarze +2022-04-08 G. Branden Robinson - [mdoc] Implement `.%C'. + * tmac/an.tmac: Refactor. Abbreviate page title and inner + footer only once per document instead of once per page. + Exception: the legacy macros `AT` and `UC` change the inner + footer, so re-abbreviate it if they are called. + (TH, AT, UC): Call abbreviation macros from here... + (an-header, an-footer): ...instead of here. - * tmac/doc.tmac, tmac/doc-common: Do it. - * tmac/groff_mdoc.man: Updated. +2022-04-08 G. Branden Robinson -2013-07-31 Deri James + * tmac/an.tmac: Refactor: initialize header/footer environment + only once. Also rename it to `an*env-header-and-footer`. + (TH): Do it here... + (an-header, an-footer): ...instead of here. - Fix overprinting issue with Acrobat reader. +2022-04-08 G. Branden Robinson - Problem reported by Heinz-Jürgen Oertel . + * tmac/an.tmac: Trivially refactor. + (an*prepare-page-title): Rename this... + (an*abbreviate-page-title): ...to this. + (an-prepare-inner-footer): And this... + (an*abbreviate-inner-footer): ...to this. + (an-header, an-footer): Update call sites. - * src/devices/gropdf/gropdf.pl (do_t, FindChar): Use ascii octal - notation (i.e., \015) when outputting characters with value < 32. - This fixes a bug which affected acroread when control-M (cr) was - embedded in a text string. +2022-04-08 G. Branden Robinson -2013-07-16 Werner LEMBERG + * src/preproc/eqn/other.cpp (hmotion_box::output): Fix typo in + generated MathML diagnostic message. - * tmac/fallbacks.tmac: Make it work in compatibility mode. +2022-04-07 G. Branden Robinson - Problem reported by Y T . + * doc/doc.am (EXTRA_DIST): Add "groff.dvi" and "groff.pdf" to + ensure that the GNU-released groff distribution archive contains + our Texinfo manual in these formats. (This doesn't increase the + build-dependency requirements unless you want to "make dist", in + which case it _should_.) -2013-07-16 Werner LEMBERG +2022-04-06 G. Branden Robinson - * src/roff/grog/Makefile.sub (install_data, uninstall_sub): Typos. + [ms]: Add nroff mode fallback for `UL` macro. -2013-07-16 Werner LEMBERG + * tmac/s.tmac (UL): On nroff devices, bracket the first argument + with \(ul (underline rule) special character escape sequences. + {In plain language, '.UL "like this"' renders "_like this_".} + See corresponding 12 February change to "tmac/e.tmac". - * Makefile.in (GREP, MDEFINES): Define and use plain grep. +2022-04-06 G. Branden Robinson - Necessary for Bernd's code to extract groff options. + * doc/doc.am: Drop unnecessary `-I` options to groff. + (DOC_GROFF): There is no need to look at the top of the build + directory for any file inclusions. + (doc/webpage.html): There is no need to look in `doc_builddir` + for file inclusions, since that is the current working directory + when "webpage.ms" is processed. -2013-07-16 Ingo Schwarze +2022-04-06 G. Branden Robinson - * tmac/an-old.tmac (TP): Do not clobber line length after double - call to `.TP'. + * doc/doc.am: Trivially refactor. Use `RM` macro idiomatically. + Automake ensures that it is defined to call an `rm` command with + the `-f` option, and this in turn ignores failures to delete + nonexistent files, so... + (uninstall_doc_examples, uninstall-pdf): Stop adding superfluous + `-f` flag. + (clean_infodoc uninstall-pdf, uninstall-html): Stop prefixing + command with `-` to ignore error exit status. + (uninstall-html): Drop superfluous `-r` flag; we're only + deleting files with this command, not directories. -2013-07-02 Colin Watson +2022-04-05 G. Branden Robinson - * doc/groff.texinfo: Fix syntax error in documentation of `\z'. + * doc/doc.am: Trivially refactor shell style in rule commands. + The placement of `&&` was inconsistent. Always begin a + continued rule line with it, and don't give it its own + indentation level. In general, operators adjacent to line + continuations should _follow_ the continuations because they are + easier for humans to spot at the (possibly indented) beginning + of a physical line. -2013-07-02 Colin Watson +2022-04-05 G. Branden Robinson - * src/devices/grolbp/lbp.cpp (main): Don't write trailer if no - printer was created. + * Makefile.am: Rename `TFLAG` macro, which means "tmac flag", to + `MFLAG`, because it expands to `-M` options to groff, not the + `-T` option, which can be bewildering. + * doc/doc.am (DOC_GROFF): Update expansion site. + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Rename `DOC_GROFF_ONLY` to `DOC_GROFF`. + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Refactor. Drop ghastly hack used to get file + names into troff diagnostics when reading from standard input. + We've refactored so that it no longer does, making the hack + unnecessary. For the same reason, no users of the `DOC_GROFF` + macro remain, so delete it. Add comments to explain what + `DOC_SED` and `DOC_GROFF_ONLY` are for. + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Refactor. + (doc/pic.html, doc/webpage.html): Drop indirection of source + document through `DOC_SED` macro. It was not necessary since + neither of these documents are parameterized in configuration + options (that is, they don't contain @VERSION@ or @g@). + +2022-04-05 G. Branden Robinson + + * doc/doc.am: Trivially refactor. + (doc/webpage.html): Tidy up dependency list. Create directory + using the same macro interpolation we use to change into it. + +2022-04-05 G. Branden Robinson + + * doc/doc.am: Refactor and fix error in builds in remote + out-of-source-tree builds exposed by pending commit and `make + distcheck`. The images generated for the pic.html and + webpage.html files were being built in the wrong directory, and + subsequently not found by an install rule. + (imagedir): Add comment explaining purpose of macro. It should + _not_ be used with any file specifications relative to the + source or build trees--it is for installation directories only. + (htmldocimagedir, exampleimagedir): Drop macros. + + (doc/pic.html, doc/webpage.html): Replace interpolations of + `imagedir` with literal "img", since these files are being + generated within the build tree: the directory name is known. + + (mostlyclean_doc, install_doc_htmldoc, install_doc_examples): + Replace interpolations of `htmldocimagedir` relative to + `doc_builddir` with "img" literals. + + (install_doc_htmldoc, uninstall_doc_htmldoc): Interpolate + concatenation of `htmldocdir` and `imagedir` instead of + `htmldocimagedir` (relative to `DESTDIR`). + (install_doc_examples, uninstall_doc_examples): Interpolate + concatenation of `exampledir` and `imagedir` instead of + `exampleimagedir` (relative to `DESTDIR`). + +2022-04-01 G. Branden Robinson + + * doc/doc.am: Refactor. Relocate "doc/grnexampl.ps" target to + group it with other me(7) documents. Put addition of + "doc/examples.stamp" to `MOSTLYCLEANFILES` adjacent to its + target rule. Relocate same rule so that it precedes the target + depending on it (make(1) might not benefit from this, but human + readers can). + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Refactor. + (DOC_GROFF_ONLY): Drop preprocessor options from groff command. + This macro is now, simply, a way to run the in-tree groff: no + assumptions about preprocessors, macro packages, or output + device are made. + (doc/pic.html, doc/webpage.html): Add only necessary + preprocessor options after expansion of `DOC_GROFF_ONLY`. + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Refactor. Add explicit dependencies of compiled + man page documents on preprocessors needed to generate them. In + their target rules, explicitly use groff's preprocessor options, + freeing us up to simplify the `DOC_GROFF_ONLY` macro. + +2022-03-29 G. Branden Robinson + + * doc/doc.am: Rationalize dependencies. Drop dependency of + `PROCESSEDEXAMPLEFILES` and `PROCESSEDDOCFILES` on expansion of + `hdtbltmac_DATA`, because nothing in this directory uses the + hdtbl package. Move dep of same expansions on "gnu.eps" to + "doc/webpage.html", which actually uses it. Put the numerous + dependencies of "doc/pic.html" and "doc/webpage.html" in a + parallel ordering so that they are easier for humans to + evaluate. These targets' dependencies on `bin_PROGRAMS` and + `prefixexecbin_PROGRAMS` are overkill and should be reviewed at + a later date. + +2022-04-03 G. Branden Robinson + + * doc/doc.am: Refactor use of target and suffix rules. + (doc/meintro.me, doc/meintro_fr.me, doc/meref.me): Add target + rules, with lengthy, exasperated comment about lack of feature + parity in various make(1) implementations. + (doc/meintro_fr.ps): Add target rule, as this seems to be the + only way to keep GNU Make from ignoring a '_fr.me._fr.ps' suffix + rule in favor of '.me.ps', which doesn't call preconv (and + doesn't need to--and moreover we don't want to build English + me(7) documents with the `-mfr` option). Depend on `preconv`. + (doc/webpage.ps): Convert from suffix rule to target rule. + (doc/ms.ps, doc/pic.ps, doc/webpage.ps): Add target rules and + dependencies. + (.ms.ps): Add commented-out suffix rule (since nothing uses it, + but might in the future). + (doc/meintro_fr.ps, .me.ps, doc/pic.ps, doc/webpage.ps): Migrate + expansions of `DOC_GROFF` to `DOC_GROFF_ONLY` to prepare for a + forthcoming simplification. + +2022-04-03 G. Branden Robinson + + * doc/doc.am: Clean generated doc files better. doc/me*.me were + getting left behind in the build tree. + (MOSTLYCLEANFILES): Add `GENERATEDDOCFILES`. This includes + `DOC_GNU_EPS`, so... + (clean_maintdoc): Drop phony target that manually removes it. + (maintainer-clean-local): Drop dependency on foregoing. + +2022-04-03 G. Branden Robinson + + * src/devices/xditview/xditview.am (install_xditview) + [!WITHOUT_X11]: Stop backing up existing "GXditview" and + "GXditview-color" application defaults files. There is no + symmetric restoration of them in the uninstall target, and it + seems like unjustifiable complexity to add such. These are + groff-specific file names, installed (by default) to /usr, + not /etc, so they are not going to be "configuration files" in + Debian-based systems, for example (and likely not elsewhere). + There are other ways to supersede application defaults for + programs using the X Toolkit Intrinsics. + +2022-04-03 G. Branden Robinson + + * doc/doc.am: Stop treating "gnu.eps" as an "example" file; it + is also used by pdfmark's cover.ms, which is ordinary + documentation. We therefore must not omit it when building. + (install-data-hook): Add dependency on new phony target, + "install_doc_gnu_eps". + (install_doc_examples): Move installation of "gnu.eps" from + here... + (install_doc_gnu_eps): ...to here. Also refactor the loop we + use to locate the file to follow a more idiomatic pattern. + +2022-04-03 G. Branden Robinson + + * doc/doc.am (dist-info-bits, install_infodoc, dist-gnueps): Fix + code style nit: use consistent "brace style" in conditionals and + loops. + +2022-04-01 G. Branden Robinson + + * doc/doc.am (mostlyclean_doc): When cleaning, try harder to + remove the image directory created by the "pic.html" and + "webpage.html" targets. + +2022-04-02 Ingo Schwarze + + * doc/doc.am: Stop installing doc/meintro.me.in, + doc/meintro_fr.me.in, and doc/meref.me.in. + +2022-03-30 G. Branden Robinson + + * doc/webpage.ms: Die horribly if `PSPIC` call fails. + +2022-03-30 G. Branden Robinson + + * tmac/pspic.tmac (pspic*error-hook): Define (as empty). + * man/groff_tmac.5.man (Auxiliary packages) : Document. + * NEWS: Add item. + +2022-03-29 G. Branden Robinson + + * doc/doc.am (doc/webpage.ps): Relocate target rule. + +2022-03-29 G. Branden Robinson + + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: + * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: Remove output file + even when skipping test. Quote `fail` variable when checking it + with `test -z`. + +2022-03-29 G. Branden Robinson + + * man/groff_tmac.7.man (Auxiliary packages): Tweak sboxes + documentation to imply ms dependency. + + Fixes . + +2022-03-29 G. Branden Robinson + + * tmac/an.tmac (an*bookmark): Trivially refactor. Now that + we're no longer doing arithmetic on our first argument, simplify + our definition. Made possible by commit 3baf0e2f3, 23 February. + +2022-03-29 G. Branden Robinson + + * src/preproc/preconv/preconv.cpp (detect_file_encoding): Demote + an error diagnostic to a debugging message. libuchardet has no + man page, and inspecting the source of the + `uchardet_handle_data` function we find that it effectively + returns a Boolean value (if the result of a + `reinterpret_cast`(!) is not `NS_OK`). This is useless + information for a user-facing tool. We're designed to muddle on + regardless (see preconv(1)). -2013-06-19 Eric S. Raymond +2022-03-29 G. Branden Robinson - * src/utils/lkbib/lbib.man: Move running text out of synopsis. + * src/devices/grodvi/dvi.cpp (dvi_printer::set_color) + (draw_dvi_printer::fill_next): + * src/devices/grops/ps.cpp (output::put_color): + * src/libs/libgroff/color.cpp (color::print_color): Construct + doubles instead of casting to them. -2013-05-06 Bernd Warken +2022-03-28 G. Branden Robinson - * src/roff/groff/Makefile.sub: Replace `cpp' by `groff.cpp'. + [doc]: Refactor handling of "gnu.eps" file. -2013-05-06 Bernd Warken + * doc/doc.am: Put "gnu.eps" in a Make macro, `DOC_GNU_EPS`. + ($(PROCESSEDEXAMPLEFILES) $(PROCESSEDDOCFILES), + doc/webpage.html, install_doc_examples): Migrate dependency to + `DOC_GNU_EPS`. + (doc/webpage.ps): Add (missing) dependency on `DOC_GNU_EPS`. + (DOC_GROFF_ONLY): Drop `-I` flag; it's not necessary given the + following. + (.ms.ps): Drop `-mwww` argument from suffix rule. A truly + generic ms document won't need it. + (doc/webpage.ps): Add target rule. Include `-mwww` argument. + (doc/webpage.ps, doc/webpage.html): Pass `-I` option to + `DOC_GROFF` and `DOC_GROFF_ONLY` (respectively) to enable + location of "gnu.eps" file. Search the build and source trees' + "doc" directories because the file can be generated as part of + the build or can come with the distribution archive. + (EXTRA_DIST): Drop redundant inclusion of "doc/gnu.xpm". + (clean_maintdoc): Add phony target to dispose of `DOC_GNU_EPS`. + (maintainer-clean-local): Depend on "clean_maintdoc". - * Makefile.in: Add new `contrib' directory `RUNOFF'. + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: + * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: Update tests to look + for "gnu.eps" in "doc" directory of build tree. Give generated + files distinguishable names so their tests can run concurrently. -2013-05-01 Bernd Warken +2022-03-23 G. Branden Robinson - * src/roff/groff/Makefile.sub: Remove all `.PHONY:' lines. + * doc/doc.am: Add new macro `PROCESSEDDOCFILES_PS` to isolate + names of targets in PostScript format. Expand this macro in + definition of `PROCESSEDDOCFILES` and use it to move PostScript + font description file dependencies of the latter and + `PROCESSEDEXAMPLEFILES` to the former. (At present, the + dependency might seem superfluous, since those files are in the + source distribution, but it's conceivable that in the near + future, they will be produced at build time from Adobe font + metric files; see font/devps/generate/Makefile). The "pic.html" + and "webpage.html" targets already had such a dependency because + of the way grohtml (pre-grohtml) works. -2013-04-30 Bernd Warken +2022-03-26 G. Branden Robinson - * src/roff/groff/Makefile.sub: Replace `egrep' by `$(GREP)'. - commands. Don't use $(CCSRCS) any more. + * INSTALL.extra: Add a section on uninstalling. -2013-04-30 Bernd Warken +2022-03-23 G. Branden Robinson - * Makefile.in, m4/groff.m4: Add `@libprogramdir@' and - `$libprogramdir' (usually `/usr/local/lib/groff'). Change - `$libdir/groff' into $libprogramdir for several `groff' programs. - Run `autoreconf -I m4'. + * doc/doc.am: Create target rule for "doc/grnexampl.ps" instead + of relying on a suffix rule. Explicitly depend on grn and eqn + executables. Produce output using their groff flags, "-ge". - * src/roff/groff/MAkefile.sub: Add $(DESTDIR) and $(srcdir) in - order to support installation outside of source code. +2022-03-25 G. Branden Robinson - * contrib/glilypond/Makefile.sub, contrib/glilypond/glilypond.pl: - Correct the install directories. + * tmac/pdfpic.tmac (PDFPIC): Fix breakage when no temporary + directory environment variables are defined: actually use string + interpolation syntax in comparand to output comparison + operator. Problem introduced by me in commits adc1999af and + 24900cf6d, 15 February. -2013-04-29 Bernd Warken +2022-03-25 G. Branden Robinson - * src/roff/groff/Makefile.sub: Replace some variables by shell - commands. Improve the output for the `make' runs. + * font/devX100-12/devX100-12.am: + * font/devX100/devX100.am: + * font/devX75-12/devX75-12.am: + * font/devX75/devX75.am: Fix in-tree build; expand `fontdir` + instead of `abs_top_builddir` Make macro when defining Automake + variable for generated artifacts. Problem introduced by me in + commit 3c82cbbfe, 27 February. Thanks to Robert Goulding for + the report. -2013-04-28 Bernd Warken +2022-03-22 Ingo Schwarze - * src/roff/groff/Makefile.sub: Make this Makefile compatible. + * doc/doc.am: delete redundant "SUFFIXES +=" line -2013-04-28 Bernd Warken -2013-04-28 Werner LEMBERG +2022-03-22 Ingo Schwarze - * src/roff/groff/Makefile.sub: Use `make' variables to get - `groff' options from `getopt' in `groff.cpp'. Create 2 files - `groff_opts_no_arg.txt' and `groff_opts_with_arg.txt'. + * doc/doc.am: fix non-portable syntax in the meintro_fr.ps + target: This rule requires DOC_GROFF and hence $<, so turn it + into a suffix rule. -2013-04-26 Bernd Warken +2022-03-22 Ingo Schwarze - * src/roff/groff/read_groff_options.pl: Remove this file. It's - no longer needed. + * doc/doc.am: fix non-portable syntax in the doc/me*.me targets: + POSIX does not define the meaning of $< in non-suffix rules, so + use the portable $? instead. This is adequate here because each + of these three rules has exactly one prerequisite. - * src/roff/groff/Makefile.sub: Get the `groff' options from the - use of `getopt...' in `groff.cpp' using `$(EGREP)' and `sed'. - Store this information in a new file `groff_options.txt', which - is copied to `groff libdir' during the installation. +2022-03-22 Ingo Schwarze -2013-04-26 Werner LEMBERG + * doc/doc.am: fix non-portable syntax in the groff-man-pages.* + targets by using DOC_GROFF_ONLY rather than DOC_GROFF in order + to not use $< outside a suffix rule; DOC_GROFF functionality is + not needed here in the first place. - Various minor fixes. +2022-03-21 G. Branden Robinson - * INSTALL.gen: Take the newest version from the `gnulib' - repository. + * tmac/an.tmac: + * tmac/doc.tmac: Stop remapping input hyphens on `utf8` device. - * configure: Regenerated. +2022-03-21 G. Branden Robinson -2013-04-26 Bernd Warken + * tmac/doc.tmac: Stop remapping ` and ' on `utf8` output device. + Aligns mdoc(7) with commit 697e6db7f, 19 October 2020 (for + man(7)). - * INSTALL.gen: Restore an older version from `2006' in - `groff-1.21'. +2022-03-21 G. Branden Robinson - * FOR-RELEASE: New file which describes how to prepare `groff' - for a new release. + * src/utils/afmtodit/afmtodit.pl: Fix bug introduced in commit + 0d451902c, 10 March. Don't store a newline in the version + string. Put `\n` in its interpolation context as necessary. -2013-04-26 Bernd Warken +2022-03-19 G. Branden Robinson - * src/roff/groff/read_groff_options.pl: Reads `groff' options - from `groff.cpp' and writes them into the file `groff_options.info'. + Install ptx.tmac. - * src/roff/groff/Makefile.sub: Have the generated file - `groff_options.info' be installed into the `groff libdir'. + * tmac/tmac.am (TMACNORMALFILES): Add it. + * NEWS: Report availability. -2013-04-16 Bernd Warken + Fixes . Thanks to Ralph + Corderoy for the report. - * INSTALL.gen: Replace this file by the daily `git' version of - `automake' `INSTALL' file. +2022-03-19 G. Branden Robinson - * INSTALL.autotools: Remove file. + Drop ditroff(7) document. It says nothing that is not covered + elsewhere. - * INSTALL.CVS: New file, moved from `INSTALL.autotools'. + * man/ditroff.7.man: Delete. + * doc/doc.am (GROFF_MAN_PAGES): + * man/man.am (man7_MANS, EXTRA_DIST): Stop processing, shipping. + * src/roff/groff/groff.1.man: Drop cross reference to it. + * NEWS: Add item. - * m4/ax_prog_perl_version.m4: New file, taken from package - `autoconf-archive-2013.04.06'. + Fixes . - * m4/groff.m4: Remove unnecessary blank line. +2022-03-18 G. Branden Robinson - * Makefile.in: Add `$(PERLVERSION)'. + [preconv]: Trivially refactor. - * aclocal.m4: Run `autoreconf -I m4' (this includes - `aclocal -I m4'). This creates a suitable `aclocal.m4'. Remove - generated subdirectory `autom4te.cache'. + * src/preproc/preconv/preconv.cpp: Use diagnostic message + functions from libgroff where possible. Explain in a comment + why we don't use `debug()`. Boolify and rename some variables, + and use Boolean literals to assign to them. + debug_flag -> is_debugging + invalid_warning -> emit_invalid_utf8_warning + incomplete_warning -> emit_incomplete_utf8_warning + Rename `expected_bytes` to `expected_byte_count`. Except for + the debugging flag, these are all members of `struct + conversion`. + (get_tag_lines): Migrate to `warning()`. + (detect_file_encoding): Migrate to `error()` and `fatal()`, as + appropriate. + (utf8::invalid, utf8::incomplete, get_tag_lines): Don't break a + line in the middle of a diagnostic; doing so frustrates grepping + and necessarily makes an assumption about the terminal width. - * src/roff/grog/Makefile.sub: Correct `sed' command. Use `tabs' - that are needed by `GNU make'. +2022-03-17 G. Branden Robinson -2013-04-16 Bernd Warken + [troff]: Trivially refactor. - * Makefile.sub: Add `m4/ax_compare_version.m4'. + * src/roff/troff/input.cpp: Rename global variable + `have_string_arg` to `have_multiple_params` and demote it from + an integer to a Boolean. Assign Boolean literals to it. + (read_long_escape_parameters, get_copy, token::next): Do it. - * aclocal.m4: Run the latest `aclocal -I m4' which generates a - suitable content in that file. +2022-03-16 G. Branden Robinson - * INSTALL.autotools: Information of the usage of `GNU autotools' - with `groff'. + [tbl]: Fix Savannah #62191. - * INSTALL.gen: Move `autotool' parts to file `INSTALL.autotools'. + * src/preproc/tbl/main.cpp (table_input::get): Increment input + line counter when encountering an escaped newline; this fixes + inaccurate diagnostics from the formatter at any point in a + document after a line-continued row of table data. Also drop a + "perhaps" comment. I tested the surmise (setting the FSM state + to "START"), and it results in bad formatting. -2013-04-15 Bernd Warken + Fixes . Problem appears + to date back to groff 1.02 (June 1991) at the latest. - * m4/groff.m4: Replace tabs by spaces. Use a double line between - AC_DEFUNs. +2022-03-16 G. Branden Robinson -2013-04-15 Bernd Warken + [tbl]: Regression-test Savannah #62191. - In the whole `groff' system, rename autoconf variable `$PERLPATH' - to `$PERL', which has the same content. But `$PERL' suits to - `AX_PROG_PERL_VERSION' in m4 macro `GROFF_PERL' in `m4/groff.m4'. + * src/preproc/tbl/tests/count-continued-input-lines.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. - * src/utils/afmtodit/Makefile.sub, - * src/devices/gropdf/gropdf.pl, - * src/devices/gropdf/Makefile.sub, - * src/devices/gropdf/pdfmom.pl, - * arch/djgpp/config.site, - * font/devpdf/Makefile.sub, - * contrib/mm/Makefile.sub, - * m4/groff.m4, - * Makefile.in: Replace `$PERLPATH' by `$PERL'. +2022-03-16 G. Branden Robinson - * m4/ax_compare_version.m4: New file, copied from daily version of - `GNU autoconf-archive'. + * doc/groff.texi (Environments): Clarify environment handling. + * man/groff.7.man (Environments): Add new section. - `autoconf' was not yet run, a newer version is needed. + Fixes . Thanks to Dave + Kemper for the report and a suggested patch. -2013-04-15 Bernd Warken +2022-03-15 G. Branden Robinson - * README, INSTALL, INSTALL.gen, MANIFEST: Add documentation in the - top directory about some parts of `autotools' and `glilypond'. + * tmac/e.tmac (initialization): Define `@b` as empty if + formatting for HTML, because no page breaks occur in that + format. -2013-04-15 Bernd Warken + Fixes . - * configure.ac: Add information of the macro `GROFF_PERL'. +2022-03-15 G. Branden Robinson - * Makefile.in: Add definitions of the macro variables and their - `@...@' counterparts. + * src/devices/grodvi/dvi.cpp (usage): Align usage message with + man page; disclose `-l` option. - Run `autoreconf -I m4'. +2022-03-15 G. Branden Robinson -2013-04-15 Bernd Warken -2013-04-15 Werner LEMBERG -2013-04-15 Ralph Carderoy + * src/devices/grodvi/dvi.cpp (main): + * src/devices/grops/ps.cpp (main): Update diagnostic: + characterize bad `-w` argument as "invalid", not "bad", and + explicitly report it as ignored. - Add Perl test to configuration. During the run of `configure' the - program is broken with error when there is no `Perl' or the `perl' - program is too old. + * src/devices/grodvi/dvi.cpp (main): Report invalid parameter + in `-w` diagnostic. - * m4/groff.m4: Add macro `GROFF_PERL' that tests the availability - of the `perl' program and tests wether this has a version of at - most `v5.6.1'. Define variables $PERL and $PERLPATH for the full - name of the `perl' program and $PERLVERSION as the lest version. +2022-03-15 G. Branden Robinson -2013-04-13 Keith Marshall + * src/devices/grodvi/dvi.cpp (dvi_printer::set_color) + (draw_dvi_printer::fill_next): + * src/devices/grops/ps.cpp (output::put_color): + * src/libs/libgroff/color.cpp (color::print_color): Explicitly + cast `enum` divisors to `double`; quietens + `-Wdeprecated-enum-float-conversion` warnings. - Avoid consideration of autotool cache for CVS inclusion. + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - * .cvsignore (autom4te.cache): Add reference. +2022-03-15 G. Branden Robinson -2013-04-13 Bernd Warken + * tmac/an.tmac: Recover more quickly from missing `EE` calls. + (initialization): Define new strings, `an*body-family` and + `an*example-family` to house the font families used in these + rendering contexts. + (TH, SH, SS): Restore the font family to `an*body-family`. + (TH): Set font style to roman as well. + (EX): Change to `an*example-family` instead of literal "C". - * `autotools': During the run of `autoconf' and `autoreconf' a - subdirectory `autom4te.cache' was created. I first added this to - groff CVS and removed it again after an email-discussion. + Fixes . -2013-04-12 Bernd Warken +2022-03-15 G. Branden Robinson - * `grog': Remove the shell version of `grog'. Now there is only - Perl version. + * tmac/e.tmac: Test register for existence before using it to + set hyphenation mode. A site troffrc or other local + customization might remove the register (which is guaranteed to + be set under the stock configuration) and, perversely, Heirloom + Doctools troff interprets a `do` request, instead of ignoring it + as a historical troff implementation would, so if they borrow + our me(7) changes, the register would be unset, interpolate + zero, and hyphenation would wind up disabled. - * src/roff/grog/perl.sh: Remove this file. + Fixes . Thanks to Dave + Kemper for the report. - * src/roff/grog/Makefile.sub: This file handles the removement of - the shell version. +2022-03-14 G. Branden Robinson - * src/roff/grog/perl_test.pl: New file for testing the available - Perl version in the system to be installed into. This file will - be installed into the grog lib-directory. + [tests]: Rename test to apply naming scheme. -2013-04-12 Bernd Warken + * tmac/tests/pdfpic_falls_back_to_PSPIC.sh: Rename this... + * tmac/tests/pdfpic_falls-back-to-PSPIC.sh: ...to this. + * tmac/tmac.am (tmac_TESTS): Use new name. - * `grog': In the following, the file `grog.pl' will be split. For - the coming files, a lib-directory is needed for storage. +2022-03-14 G. Branden Robinson - * m4/groff.m4, configure.ac: Add libdir information for `grog'. + * src/devices/grops/ps.cpp (usage): Align usage message with man + page synopsis. - * Makefile.in: Add @grog_dir@. +2022-03-13 G. Branden Robinson + + * doc/groff.texi (Input Line Traps): Fix error; input traps do + _not_ ignore control lines. Error appears to have crept in with + the first version of our Texinfo manual, shipped with groff 1.14 + {December 1999}. + +2022-03-13 G. Branden Robinson + + * font/devps/devps.am: Rename targets. + (fonts): + (devps_fonts): Rename these... + (maintainer-font-descriptions): + (devps_font-descriptions): ...to these. Add comments explaining + what they're for and why they aren't used in a build. + + * font/devps/generate/Makefile: Add `outdir` variable to store + destination directory of font description files, and update all + targets that write artifacts to use this directory. This makes + the targets "phony", which I don't regard as a problem since the + generated artifacts are kept under source control, and this + isn't really a user-facing script (even though it gets + installed). I think there is a good chance that this will + become a shell script, because to avoid regressions we need to + generate the font descriptions using both the 229-glyph and + 314-glyph versions of the Adobe fonts' AFM files (so that we get + wider glyph coverage _and_ more kerning pair data) and we need + to add kerning information for the ellipsis (Savannah #58897). + (symbolsl.afm): Revise generation process to be sensitive to + failure. + +2022-03-09 G. Branden Robinson + + * font/devps/symbolsl.afm: New file. + * font/devps/devps.am (EXTRA_DIST): We have long shipped + "symbol.afm" with the distribution archive--I don't see why we + don't ship "symbolsl.afm" and "zapfdr.afm" as well (metrics for + `SS`, the slanted symbol font, and ZDR, reversed Zapf Dingbats). + Like the Type 1 font descriptions themselves, this file is + updated only in "maintainer mode", not as part of the build. + Moreover, these fonts are not part of the PostScript level 2 + base 35 fonts so their AFM files are unlikely to be readily + available elsewhere. + +2022-03-09 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Trivially refactor. Store the + program's version string in scalar `afmtodit_version` and use + that in the usage message and comment embedded in the output. + +2022-03-09 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Fix code style nits. Migrate + to the shebang line style we use in more recently modified Perl + scripts. Replace `-w` with `use warnings;`. Shorten an output + comment since the groff version string can grow long (see commit + 1264531310, 14 January 2018). + +2022-03-09 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Stop writing full file name to + the generated font description file as the "name" (i.e., don't + include directory components). + + Fixes . Thanks to Dave + Kemper for the discussion and code review. + +2022-03-08 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.1.man: + * src/utils/afmtodit/afmtodit.pl: Update and align man page + synopsis, option descriptions, and command usage output. + +2022-03-07 G. Branden Robinson + + * tmac/X.tmac: Redirect `fchar` requests for \[lq] and \[rq] to + \[dq] since the X11 Type 1-based text fonts encode ISO 8859-1 + {Latin-1} and don't have typopgrapher's quotes. Drop `fchar` + request for \[aq], which _is_ represented, per recent changes. + +2022-03-07 G. Branden Robinson + + * /font/devX100-12/CB: + * /font/devX100-12/CBI: + * /font/devX100-12/CI: + * /font/devX100-12/CR: + * /font/devX100-12/HB: + * /font/devX100-12/HBI: + * /font/devX100-12/HI: + * /font/devX100-12/HR: + * /font/devX100-12/NB: + * /font/devX100-12/NBI: + * /font/devX100-12/NI: + * /font/devX100-12/NR: + * /font/devX100-12/TB: + * /font/devX100-12/TBI: + * /font/devX100-12/TI: + * /font/devX100-12/TR: + * /font/devX100/CB: + * /font/devX100/CBI: + * /font/devX100/CI: + * /font/devX100/CR: + * /font/devX100/HB: + * /font/devX100/HBI: + * /font/devX100/HI: + * /font/devX100/HR: + * /font/devX100/NB: + * /font/devX100/NBI: + * /font/devX100/NI: + * /font/devX100/NR: + * /font/devX100/TB: + * /font/devX100/TBI: + * /font/devX100/TI: + * /font/devX100/TR: + * /font/devX75-12/CB: + * /font/devX75-12/CBI: + * /font/devX75-12/CI: + * /font/devX75-12/CR: + * /font/devX75-12/HB: + * /font/devX75-12/HBI: + * /font/devX75-12/HI: + * /font/devX75-12/HR: + * /font/devX75-12/NB: + * /font/devX75-12/NBI: + * /font/devX75-12/NI: + * /font/devX75-12/NR: + * /font/devX75-12/TB: + * /font/devX75-12/TBI: + * /font/devX75-12/TI: + * /font/devX75-12/TR: + * /font/devX75/CB: + * /font/devX75/CBI: + * /font/devX75/CI: + * /font/devX75/CR: + * /font/devX75/HB: + * /font/devX75/HBI: + * /font/devX75/HI: + * /font/devX75/HR: + * /font/devX75/NB: + * /font/devX75/NBI: + * /font/devX75/NI: + * /font/devX75/NR: + * /font/devX75/TB: + * /font/devX75/TBI: + * /font/devX75/TI: + * /font/devX75/TR: Regenerate font descriptions with xtotroff, + using updated ISO-8859_1 map. \[aq] and \[oq] are now aliases + of "'" and \[ga] is an alias of "`". This change probably + should have been made when the X11 fonts were corrected in + XFree86 4.0 (March 2000). See + . + + Fixes . + +2022-03-07 G. Branden Robinson + + * src/libs/libxutil/DviChar.c (ISO_8859_1_map): Fix incorrect + assignment of Latin-1 grave accent to \[oq] special character; + reassign it to the neutral apostrophe. Map \[aq] to neutral + apostrophe. Map \[ga] to '`'. + +2022-03-07 G. Branden Robinson + + * src/utils/xtotroff/xtotroff.1.man (Options) <-d>: Document new + option. + * src/utils/xtotroff/xtotroff.c (usage): Align with man page. + +2022-03-07 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjustment): + Explicitly identify the page offset as an output line property + that is not determined until a break occurs. + + (Line Layout) : Correct error; the page offset for terminal + devices is set by "tty.tmac", not "troffrc". (The manual has + been wrong for a long time; we've had it in tty.tmac since James + Clark put it there in 1992.) Recast and tighten wording. Drop + the word "horizontal"; there is no vertical page offset (as + such) in *roff. Replace hand-waving about unexpected results + with a description of the formatter's behavior. Document + request behavior without an argument before getting into the + weeds (and CSTR #54 errata). Migrate terminology from "scaling + indicator" to "scaling unit". + + Fixes . + +2022-03-07 G. Branden Robinson + + * doc/groff.texi (Expressions): Expand '|' operator explanation. + Split discussion of its application into horizontal and vertical + contexts. Add example of vertical usage. + + Fixes . + +2022-03-07 G. Branden Robinson + + * src/roff/troff/input.cpp: Trivially refactor. Drop `#define` + that was working around a GCC 2.95-era libstdc++ problem. + Shorten long line. + (get_char_for_escape_parameter): Demote parameter from `int` to + `bool` and use Boolean literal for default argument. Annotate a + null pointer constant. - Run `autoconf'. +2022-03-07 G. Branden Robinson + + [troff]: Rename some internal functions. + + * src/roff/troff/input.cpp: Do it. + (read_escape_name): + (read_long_escape_name): + (read_two_char_escape_name): + (get_char_for_escape_name): + (read_increment_and_escape_name): Rename these... + (read_escape_parameter): + (read_long_escape_parameters): + (get_char_for_escape_parameter): + (read_two_char_escape_parameter): + (read_increment_and_escape_parameter): ...to these. + (read_two_char_escape_parameter, read_long_escape_parameters, + read_escape_parameter, read_increment_and_escape_parameter, + get_copy, token::next): Update call sites. - `grog' has now a lib-directory at `$prefix/lib/groff/grog'. +2022-03-07 G. Branden Robinson -2013-04-11 Bernd Warken + * src/roff/troff/input.cpp (get_char_for_escape_name): Recast + diagnostic messages to more accurately refer to escape + "sequence" rather than "name". "Name" is a confusing term here, + given that it also applies to a group of objects sharing a name + space (natch): requests, macros, strings, and diversions. + Further, the "escape name" cited by these diagnostics is not the + escape function selector; that is, the character after the + escape character which determines how the escape sequence is to + be interpreted. These diagnostics are only thrown after that + function is known, however, when parsing of an escape sequence + parameter is attempted. + (input_char_description): Drop leading articles ("a") from + input character descriptions, to economize in diagnostic + messages this function helps produce. + (non_empty_name_warning): Use zero copula for economy. - * contrib/groffer/: There is a free `git' package containing all - old `groffer' versions `v0.*' and `v1.*'. The new versions - `groffer 2.*' will actually not be included. This package can be - got at: + * src/roff/troff/input.cpp (empty_name_warning, read_size) + (token::get_char, check_missing_character): + * src/roff/troff/number.cpp (start_number, parse_term): Recast + messages to more consistently use the form "expected X, got Y" + where feasible. - $ git clone git@github.com:RUNOFF/groffer.git + * src/roff/troff/number.cpp (start_number): Say "numeric + expression missing" instead of "missing number"; we don't + require a terminal symbol in the expression grammar here. Also + use `tok.description()` where we can, and remove assumption that + the escape character is the default. -2013-04-11 Bernd Warken +2022-03-06 G. Branden Robinson - * contrib/glilypond/: There is a free `git' package containing all - old versions of the former name `groff_lilypond v0.*'. They work - with `lilypond' parts in `roff' files, but were not installed. - This package can be got at: + * tmac/an.tmac (AT, UC, HP): Add deprecation warnings. For the + last, only do so if we're not inside a synopsis (SY/YS), since + our definition of `SY` calls `HP` internally. (This does seem + hypocritical. Perhaps if we knew the correct CSS incantation + to speak in grohtml, we could un-deprecate `HP`.) - $ git clone git@github.com:RUNOFF/groff_lilypond.git +2022-03-06 G. Branden Robinson - The new versions `glilypond v1.*' are not included there. + * tmac/tmac.an (M4CHECK): Rename stamp file to make its purpose + clearer. -2013-04-11 Bernd Warken +2022-03-06 G. Branden Robinson - * man/roff.man: For roff(7), add information about the free git - package RUNOFF.git with documentation about historical RUNOFF and - the available files written in the classical RUNOFF language.. + [man]: Tweak customization management. -2013-03-29 Bernd Warken + * tmac/an.tmac: Load "man.local" with `msoquiet` request, so + people can get rid of the file if they don't need it. + (PT, BT): Define these macros only if not already defined. This + is slightly less paranoid but far more ergonomic, given + interactions with the andoc wrapper. Now user-defined page + header traps (PT) defined in man.local can take effect on the + first page rendered. - Rename `groff_lilypond' to `glilypond'. So remove the former - source directory `/contrib/lilypond' and newly - install `/contrib/glilypond', which now has many - files. The new version starts at `v1.0'. + * tmac/groff_man.7.man.in (Hooks): Document how to remove page + headers and/or footers entirely. - * m4/groff.m4, configure.ac: Add libdir information for - `glilypond'. + Fixes . - * Makefile.in: Add `/contrib/glilypond'. +2022-03-06 G. Branden Robinson - Run `autoconf'. + [refer,mm]: Add and use `ref*reset` macro to clean up between + bibilography entries. - `glilypond' can now be installed to the system. + * tmac/refer.tmac (]-): Move string clean up logic from here... + (ref*reset): ...to this new macro. Now we can also use it... -2013-03-17 Ingo Schwarze + * contrib/mm/refer-mm.tmac (ref*][-first-pass): ...here. - * font/devpdf/Makefile.sub: Build system fixes. + Problem appears to date back to refer-mm.tmac's introduction in + January 2011. Thanks to Bjarni Ingi Gislason for the root-cause + analysis and proposed fix, to which I applied the DRY principle + and added a reset of `ref*string` as well. - (GROFF_FONT_FILES): Avoid installing Makefile.sub.orig when it's - around. - (install): Create $(DESTDIR)$(fontsubdir)/util when missing. + Fixes . -2013-03-05 Werner LEMBERG +2022-03-06 G. Branden Robinson - * doc/groff.texinfo: Improve documentation of `\s'. + [mm]: Regression-test Savannah #60657. - Reported by Jim Avera . + * contrib/mm/tests/remove-stale-bib-entry-data.sh: Do it. + * contrib/mm/tests/artifacts/60657.ref: Add new file. + * contrib/mm/mm.am (mm_TESTS): Run test. + (EXTRA_DIST): Ship test artifact in distribution archive. -2013-02-16 Werner LEMBERG + Thanks to Bjarni Ingi Gislason for the straightforward + bug reproducer. - * doc/groff.texinfo: Improve documentation of `.substring'. +2022-03-06 G. Branden Robinson - Reported by Jim Avera . + [refer]: Report correct line number in bibliography file + diagnostics. -2013-02-13 Werner LEMBERG + * src/preproc/refer/refer.cpp (do_bib): Set line number to 1 + upon successfully opening a bibliography file. - * doc/groff.texinfo: Fix if-else example. + Problem appears to date back to groff 1.02 (June 1991) at the + latest. - Reported by Jim Avera . + Fixes . -2013-02-10 Werner LEMBERG +2022-03-06 G. Branden Robinson - [grops] Make binary `%%BeginData' work; support `fontset' resource. + [refer]: Regression-test Savannah #62124. - * src/devices/grops/psrm.cpp (resource_table): Add `fontset'. + * src/preproc/refer/tests/report-correct-line-numbers.sh: Do it. + * src/preproc/refer/tests/artifacts/62124.ref: Add new file. + * src/preproc/refer/refer.am (refer_TESTS): Run test. + (EXTRA_DIST): Ship test artifact in distribution archive. - (resource_manager::read_resource_arg): Do a case insensitive - comparison. The PostScript Reference Manual gives the following - example for a CFF resource (example 5.7): +2022-03-05 G. Branden Robinson - %!PS-Adobe-3.0 Resource-FontSet - %%DocumentNeedResources: ProcSet (FontSetInit) - %%Title: (FontSet/CFFRoman27) - %%Version: 1.000 - %%EndComments - %%IncludeResource: ProcSet (FontSetInit) - %%BeginResource: FontSet (CFFRoman27) - /FontSetInit /ProcSet findresource begin - %%BeginData: 622532 Binary Bytes - /CFFRoman27 622503 StartData - ... 622,503 bytes of binary data ... - %%EndData - %%EndResource - %%EOF + * src/roff/troff/div.cpp + (top_level_diversion::transparent_output): + * src/roff/troff/input.cpp (transparent_translate): Suppress two + troublesome (i.e., more or less spurious) error diagnostics + about transparent output/throughput unless the environment + variable `GROFF_ENABLE_TRANSPARENCY_WARNINGS` is present. This + is a bit of a bodge until we get diversion sanitization worked + out. See Savannah #61407. - Note the `ProcSet' and `FontSet' keywords. While the old DSC - (Document Structure Convention) documentation doesn't cover - `FontSet' at all (the DSC documentation predates the invention of - CFF), it describes only `procset' (all letters downcase), and it - also says that the DSC parser works in a case sensitive manner. +2022-03-04 G. Branden Robinson - In other words, `ProcSet' is not valid according to the DSC - documentation, only `procset' is. So much about today's validity - of DSC... This patch adapts grops's code to the PostScript - reality. + [preconv]: Stop assuming that the default input stream, or an + explicit '-' operand, is the only unseekable stream. Check + instead. - (resource_manager::do_begin_data): Fix typo (present since the - beginning) which prevented correct handling of binary data. + * src/preproc/preconv/preconv.cpp (do_file): Add new Boolean + `is_seekable`. Test the input stream with `fseek()` per a + suggestion from Ingo Schwarze. Report unseekability in debug + output and skip coding tag and uchardet tests altogether + {precisely paralleling our description in the preconv(1) man + page}. Also update debugging output to say "" + instead of "-". - * src/devices/grops/ps.h (resource_type): Add RESOURCE_FONTSET. + Fixes . -2013-02-10 Bernd Warken +2022-03-04 G. Branden Robinson - * contrib/lilypond: New files for adding lilypond parts into groff - files. + [preconv]: Regression-test Savannah #62131. -2013-02-07 Werner LEMBERG + * src/preproc/preconv/tests/do-not-seek-the-unseekable.sh: Do + it. + * src/preproc/preconv/preconv.am (preconv_TESTS): Run test. + +2022-03-01 G. Branden Robinson + + * src/preproc/tbl/main.cpp (process_format): Update diagnostic + to recognize that a font mounting position is also an acceptable + argument to the 'f' column modifier. + +2022-02-27 G. Branden Robinson + + Refactor X11 font description generation. Integrate it with our + "new" (post-2014) Automake-based build system. + + * src/utils/xtotroff/Makefile.in: Delete relic of old build + system. Also, it had a bug: it generated X11 output device + 'DESC' files with a "unitwidth 10" directive even for the "-12" + devices, which is not correct (the in-tree DESC files we've been + shipping for years were nevertheless correct, apparently fixed + by hand by James Clark in groff 1.07 [March 1993]). + + * src/utils/xtotroff/xtotroff.am: Define `xtotroff` variable for + use by X11 font description generation targets below. + + * font/devX100-12/devX100-12.am: + * font/devX100/devX100.am: + * font/devX75-12/devX75-12.am: + * font/devX75/devX75.am: Add new (phony) targets, variously + named "devX{100,100_12,75,75_12}", to generate the corresponding + output device's DESC file and run xtotroff(1) to generate its + font description files. Be sure to set the correct "unitwidth" + for the "-12" devices. Add new dependency-only rule + "maintainer-font-descriptions" depending on these new targets + for convenience (and future expansion to devps and devlj4). + + * FOR-RELEASE: Document existence of + "maintainer-font-descriptions" Make target and when to run it. + + Running this target with the aforementioned bug fix, overwriting + the in-tree DESC and font description files using data gathered + from a running X server, results in no changes whatsoever. Say + what you will about X11 core font technology--it's stable. + +2022-02-27 G. Branden Robinson + + Rename and ship "FontMap-X11". xtotroff(1) is not very useful + without a font name mapping file to read. To date it has been + available only in the source distribution. Remedy that. The + file is placed directly in the groff font directory alongside + the device directories because it applies to four different + devices, and four copies of this data are not required. + + * src/devices/xditview/FontMap: Rename to... + * src/devices/xditview/FontMap-X11: ...this. + + * LICENSES: + * src/devices/xditview/xditview.am (EXTRA_DIST): Reflect rename. + + * src/devices/xditview/xditview.am (install_xditview + [!WITHOUT_X11], uninstall_xtdiview): (Un-)install it. + + * src/utils/xtotroff/xtotroff.1.man (Files): Add section + documenting the presence and purpose of this file. + +2022-02-26 G. Branden Robinson + + [xtotroff]: Add `-d` option to produce font description files in + specified directory. + + * src/utils/xtotroff/xtotroff.c: Do it. Add global `destdir` + pointer. + (xtotroff_exit): Add new function to clean up storage allocated + by `strdup()` (below) for destination directory. + (MapFont): Introduce new variable `file_name`, into which we + assemble a destination file name from `destdir` (if not null) + and the troff font name. Handle memory allocation failure (by + carefully dying). Free allocated storage on success and failure + paths out of the function. + (usage): Document new `-d` option. + (main): Instruct `getopt_long` to expect a `-d` flag with an + argument. Use `strdup()` to make a copy of any such option + argument. Call `xtotroff_exit()` instead of `exit()`. -Version 1.22.2 released -======================= + * src/utils/xtotroff/xtotroff.1.man: Document new `-d` option. + +2022-02-26 G. Branden Robinson + + [xtotroff]: Trivially refactor. + + * src/utils/xtotroff/xtotroff.c: Boolify. Include `stdbool.h` + and `errno.h` headers. + (charExists, CanonicalizeFontName, FontNamesAmbiguous, MapFont): + Boolify. Demote return type from `int` to `bool` and return + Boolean instead of integer literals. + (FontNamesAmbiguous, main): Reorder equality comparisons with + simple left-hand sides to avoid inadvertent lvalue assignments. + (FontNamesAmbiguous, MapFont): Refer to font name as "invalid", + not "bad", in diagnostic messages. + (MapFont, main): Use `strerror()` instead of `perror()` so that + diagnostics include the program name and an indication of + problem severity. + (MapFont): Compare `FILE` stream pointer to `NULL` instead of + treating it as a Boolean. + (main): Use `EXIT_SUCCESS` and `EXIT_FAILURE` constants from C + library instead of integer literals for exit status. + +2022-02-24 G. Branden Robinson + + [pic]: Fix "unused result" compiler warning. + + * src/preproc/pic/pic.ypp (placeless_element) : Check return + value of `system()` to quieten `-Wunused-result` warning; if it + is less than zero, report it to the standard error stream. + +2022-02-23 G. Branden Robinson + + * tmac/safer.tmac: Drop file from distribution. It contained + only comments. + * tmac/tmac.am (TMACNORMALFILES): Delete reference. + * NEWS: Add item. Suggest two workarounds for its absence. + + Fixes . + +2022-02-23 G. Branden Robinson + + * tmac/doc.tmac (initialization): Drop definition of + `doc-curr-size` register. It is no longer needed since nothing + internal to the package now changes the type size. + + * tmac/doc.tmac (Fl, doc-print-recursive, doc-print-prefixes) + (doc-generic-macro, Ar, Cd, doc-do-func-decl, Fd, In, Nm, Pa) + (Tn, doc-enclose-string, Ef, Bd, doc-save-global-vars) + (doc-restore-global-vars, doc-diag-list, Xr, Dl, Vt, Ft, Fa) + (doc-do-func, Fn, doc-do-func-args, Fo, Fc, %A, %B, %C, %D, %I) + (%J, %N, %O, %P, %Q, %R, %T, %U, %V, doc-do-reference, Hf, An) + Lk): + * tmac/mdoc/doc-common (Sh, Ss, Rd): + * tmac/mdoc/doc-syms (Ux, Bx, At, Dx, Fx, Nx, Ox, Bsx, St, Lb): + Drop interpolations of the string and comments documenting that + each macro has a side effect on the type size. + +2022-02-23 G. Branden Robinson + + * tmac/doc.tmac (Tn): + * tmac/mdoc/doc-syms (Ux, Bx): Stop interpolating string + `doc-Tn-font-size` to set macro arguments at a smaller type + size. This leaves the string without a purpose, so... + + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Drop definitions of `doc-Tn-font-size`. - * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated. + * tmac/mdoc/doc-syms: Drop interpolations of that string from + numerous other string definitions. - * configure: Regenerated. + Fixes . - * doc/texinfo.tex: Updated from `texinfo' repository. +2022-02-23 G. Branden Robinson - * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. + Revert addition of man(7) `BD` register. This feature, which I + introduced in commit ea3b27102f (31 January) doesn't work + because pdf.tmac normalizes the bookmark depth. Embedding a man + page in a larger PDF document with appropriately nested + bookmarks is a project that will have to await another day (or + perhaps already has tools to implement it). -2013-02-07 Werner LEMBERG + * tmac/an.tmac: Do it. + * tmac/groff_man.7.man.in: De-document it. + +2022-02-23 G. Branden Robinson + + * tmac/pdf.tmac: Add string containing the name of the macro + package for use in diagnostic messages. + (pdf:warn, pdf:error): Use it. + + Continues the long process of fixing Savannah #52463. + +2022-02-23 G. Branden Robinson + + [man,mdoc,me]: Revise hyphenation localization. + + * tmac/an.tmac (an*reset-hyphenation-mode): New macro sets the + hyphenation mode appropriate to the locale depending on the + values of `cR` (continuous rendering mode) and `HY` (hyphenation + enablement); the latter is now interpreted as a Boolean. Define + new register `an*hyphenation-mode` reflecting these conditions. + (TH): Call the foregoing instead of invoking `hy` request. + (MR): Restore hyphenation mode to `an*hyphenation-mode`. + (initialization): Simplify; if not defined, set `HY` to 1. + + * tmac/e.tmac (ld): Set the hyphenation mode here instead of in + initialization (which already calls this macro). Set the mode + to 6 for the benefit of anyone borrowing our me(7) changes, but + then immediately change to the mode determined by the + localization file. + + * tmac/mdoc/doc-common (doc-hyphen-flags): Set a hyphenation + mode appropriate to the locale, depending on the values of `cR` + and `HY`. + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: Simplify initialization; if not defined, + set `HY` to 1. - * src/libs/gnulib/*: Update `gnulib' files. + * tmac/cs.tmac: + * tmac/de.tmac: + * tmac/en.tmac: + * tmac/fr.tmac: + * tmac/it.tmac: + * tmac/sv.tmac: Before switching locales, set a flag if + troublesome value 2 of the hyphenation mode is set so that we + can preserve it. Shift man(7) and me(7) logic to follow setup + of the new hyphenation mode; for the former, call the new + `an*reset-hyphenation-mode`. -2013-02-02 Gilles Espinasse + * tmac/groff_man.7.man.in: + * tmac/groff_mdoc.7.man: Document updated meaning of `HY` + register. - [grohtml] Don't ignore return value of `dup'. + * NEWS: Add item noting change of man(7) `HY`'s meaning. Update + existing item regarding mdoc(7)'s support for it (groff 1.22.4 + mdoc(7) didn't recognize the register at all). - * src/preproc/html/pushback.cpp (pushBackBuffer::pushBackBuffer, - pushBackBuffer::~pushBackBuffer): Abort if `dup' fails. + Fixes (for real this + time?). -2013-01-30 Bernd Warken +2022-02-22 G. Branden Robinson - * tmac/groff_man.man: Fix wrong connection for tbl(1). + [man]: Regression-test Savannah #61734. -2013-01-29 Werner LEMBERG + * tmac/tests/an_reset-hyphenation-correctly.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - * doc/groff.texinfo: Fix documentation of .LP macro in ms. - Problem reported by Omari Norman . +2022-02-21 G. Branden Robinson -2013-01-29 Werner LEMBERG + * man/groff_char.7.man (History): Add new section. + (See also): Add cross reference to 1976 edition of CSTR #54. - * doc/Makefile.sub (uninstall_sub): Handle `gnu.eps'. +2022-02-21 G. Branden Robinson -2013-01-29 Werner LEMBERG + * tmac/groff_man.7.man.in (Document structure macros) + [style]: Add material cautioning writers against asoociating + the disablement of filling with some sort of "literal mode". + Document still-operational status of inter-sentence space + supplementation. + (Notes) [style]: Describe an alternative (and macro + call-symmetrical) means of using `RS` and `RE` with `TP`. - Building clean-ups. +2022-02-20 G. Branden Robinson - * Makefile.in: Use $(top_srcdir) where appropriate. - * Makefile.sub (M4MACROS): Add `fcntl-o.m4' and `localcharset.m4'. + * doc/doc.am: Add phony targets "man-all" and "man-clean" to + {re-}generate and delete all man pages, respectively. - * font/devpdf/Makefile.sub (UTILFILES): Removed, unused. - (MOSTLYCLEANADD): Add `BuildFoundries'. - * src/devices/gropdf/Makefile.sub (MOSTLYCLEANADD): Add `pdfmom'. + Arguably fixes . -2013-01-24 Bernd Warken +2022-02-20 G. Branden Robinson - * Add a shell command to 'MANIFEST' that displays all man source - files and their section. + * Makefile.am (.man): Prefix hyphenation control escape + sequences to more configuration-time interpolations to prevent + their hyphenation: @DEVICE@, @g@, @INDEX_SUFFIX@, @PAGE@, + @TMAC_{AN,M,S}_PREFIX@, @TMAC_MDIR@. -2013-01-22 Bernd Warken +2022-02-16 G. Branden Robinson - * Add email address in all files having the name. + [man]: Refactor `EX` and `EE` macros. -2013-01-14 Deri James + * tmac/an-ext.tmac: Add new `mC` string to store the font name + to be used for example regions. In AT&T device-independent + troff, "CW" was a common name, so use that. It is however a + terrible fit for groff's font family and style-combination + functionality, and is inflexible in the face of font selection + requests and escape sequences within the example region. (One + either needs to know the names of the fonts available on the + output device, or suffer the indignity of mixed constant-width + and proportional typefaces.) Relatedly, drop groff-specific + font remapping requests. + (EX, EE): Ignore definition if GNU troff is the formatter. Drop + font family manipulation. Drop specialized logic for groff's + DVI output device. + + * tmac/an.tmac (initialization): Resurrect font remapping + requests here. + (EX, EE): Add new definitions, saving and restoring more state + and remapping DVI output device fonts to reflect the absence of + CWB and CWBI faces. - * src/devices/gropdf/gropdf.pl (do_x, do_p, do_s, Set_LWidth): The - grops driver defaults to round linecaps and linejoins, gropdf - incorrectly used butt caps and miter joins. +2022-02-16 G. Branden Robinson - (Since the MOM package expects to use butt caps and miter joins - (emitting the necessary postscript code to change the caps and - joins), gropdf now parses the same postscript commands.) + * tmac/an-ext.tmac: Slightly refactor. Stop using groff's `HY` + register to restore the hyphenation mode, since I plan to change + its semantics to a Boolean value (see Savannah #61734). + Introduce new register `mJ` to store "1" (if not groff) and the + current hyphenation mode otherwise. Explain why in a comment. + (YS, UE, ME, MR): Restore hyphenation mode using `mJ` instead of + `HY`. - * src/devices/gropdf/gropdf.man: Document the handling of linecaps - and linejoins. +2022-02-16 G. Branden Robinson - * tmac/pdf.tmac (pdfbookmark): Fix bug where the current - PDFOUTLINE.FOLDLEVEL may not be honoured if warnings of the type + * tmac/an-ext.tmac: Trivially refactor. Use a better idiom + {seen in James Clark's changes to BSD me(7)} for conditionally + defining a (simple) macro. - macro warning: adjusted level n bookmark; should be <= n +2022-02-16 G. Branden Robinson - Added copyright and mention debt owed to Keith Marshall for - original `pdfmark.tmac', upon which `pdf.tmac' is largely based. + * src/devices/grotty/tty.cpp (tty_printer::special): Warn upon + encountering unrecognized device control commands using the + 'tty:' tag. - * font/devpdf/Foundry.in, font/devpdf/util/BuildFoundries.pl - (LocateFile): The font for EURO had the wrong entry in the - `download' file (it pointed to The font in the build directory, - which is wrong). It has always been permissable to include a path - along with the font name in the Foundry file, but until now the - font had to exist to be valid. It is now permitted to start the - path with an asterisk which tells BuildFoundry to use the - path/filename in the download file without checking if the font - exists. This allows the font to be found in `../devps' even - though it is not there during the build (if source and build are - different), but will be there after the install. +2022-02-16 G. Branden Robinson -2013-01-13 Werner LEMBERG + [grotty]: Remove 'sgr' device control command. - [eqn] Fix display of matrices in nroff output. + * src/devices/grotty/tty.cpp (tty_printer::special): Do it. + * src/devices/grotty/grotty.1.man (Device control commands): + {De-}document it. + * NEWS: Add item. - Problem reported by Andy Spencer . + Fixes . - * src/preproc/eqn/pile.cpp (pile_box::compute_metrics, - matrix_box::compute_metrics): Fix rounding. +2022-02-15 G. Branden Robinson -2013-01-07 Deri James + * tmac/pdfpic.tmac: Add support for Cygwin/MinGW temporary + directory conventions. - * tmac/europs.tmac: Protect against missing fonts. +2022-02-15 G. Branden Robinson -2013-01-07 Deri James + * tmac/pdfpic.tmac: Search for temporary directories as groff(1) + does, instead of going straight to /tmp. + (pdfpic@get-temporary-directory): New function checks each of + its arguments for validity as a temporary directory; if one is + found, its name is left in `pdfpic*temporary-directory`. + (pdfpic@cleanup): Remove strings `pdfpic*temporary-directory` + and `pdfpic*temporary-file`. + (PDFPIC): Call `pdfpic@get-temporary-directory`, using the + contents of the environment variables $GROFF_TMPDIR and $TMPDIR, + and then /tmp, in that order. Store the temporary file name in + string `pdfpic*temporary-file`. Use this string in subsequent + `sy` and `so` requests. - * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Improve - warning. + Fixes for Unix systems. -2013-01-07 Werner LEMBERG +2022-02-15 G. Branden Robinson - [tbl] Allow characters #, `, and ' as eqn delimiters. + [tests]: Add test for PDFPIC fallback to PSPIC. - While problems ` and ' have been unintentionally introduced rather - recently, the limitation regarding # was there from the beginning. + * tmac/tests/pdfpic_falls_back_to_PSPIC.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - At the same time, fix a small bug causing `.lf' requests not - starting a line. +2022-02-15 G. Branden Robinson - * src/preproc/tbl/table.cpp (table::init_output) - (table::compute_expand_width, table::compute_separation_factor) - (table::define_bottom_macro, table::do_bottom): Temporarily switch - off eqn delimiters, wrapping the code into a `.ig' block. This - uses the new functionality just added to eqn. + [tests]: Tweak PDFPIC test input. - * src/preproc/eqn/eqn.man, src/preproc/tbl/tbl.man: Updated. + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: + Eliminate unnecessary blank lines from input. Also call gs(1) + with '-q' in addition to '-o'. (Why does the latter not imply + the former?!) Thanks to Deri James for the advice. -2013-01-06 Werner LEMBERG +2022-02-15 G. Branden Robinson - [eqn] Add `delim on'. + * tmac/pdfpic.tmac: Slightly refactor. + (pdfpic@cleanup, PDFPIC): Rename `pdfpic*file-name` to + `pdfpic*file-name-base` since it is not used as a complete file + name (but rather a basis for an ".eps" extension). + (PDFPIC): When testing PDF file extension, include the "."; a + file name like "mxyzptlkpdf" is too dubious to accept. Also + explicitly compare `systat` register as equal or not equal to + zero, since its truth value is inverted from the expectations of + *roff expressions. - * src/preproc/eqn/lex.cpp (start_delim_saved, end_delim_saved): - New global variables. - (do_delim): Handle `delim on' to restore previous start and end - delimiters. +2022-02-15 G. Branden Robinson - * src/preproc/eqn/eqn.man, NEWS: Document it. + * tmac/pdfpic.tmac (PDFPIC): Refactor PDFPIC_NOSPACE handling. + Stop shelling out to create, and then sourcing, a temporary file + just to obtain the value of an environment variable. groff + already has the `\V` escape sequence for that purpose (it's even + safe!). Check that the value of $GROFF_PDFPIC_NOSPACE is a + valid numeric expression before assigning it to a register. + Trivially, use '=' instead of '==' as an equality operator. + *roff languages do not use '=' as an assignment operator, and I + believe the '==' synonym to be a sop to C programmers. -2013-01-02 Deri James +2022-02-14 G. Branden Robinson - [gropdf] Various minor fixes. + [man]: Stop attempting to adjust pargraph tag lines. - * src/devices/gropdf/gropdf (do_x) <'X'> <'pdfpic'>: Using + * tmac/an.tmac (TP): Disable adjustment inside the diversion. + (an-write-paragraph-tag): Restore adjustment outside of it. - \X'pdf: pdfpic' + Fixes . - with a zero width now works correctly. +2022-02-13 G. Branden Robinson - (LoadPDF): Scale width in proportion to given height. + * tmac/e.tmac (@z): Conceal bare tab after request name (exposed + by no longer stripping the macro file). See commit ad0575f20, 9 + December. - (do_s): In some circumstances a font size change is emitted before - current font is established. Fix handles this situation. +2022-02-12 G. Branden Robinson -2012-12-30 Werner LEMBERG + [grops,troff]: Migrate to term "scaling unit" in diagnostics. -Version 1.22.1 released -======================= + * src/devices/grops/ps.cpp (ps_printer::do_import): + * src/roff/troff/input.cpp (warnscale_request): + * src/roff/troff/number.cpp (parse_term): Do it. - Due to CVE-2012-3386, ftp.gnu.org rejected uploading of version - 1.22 -- in other words, 1.22 has never been released. +2022-02-12 G. Branden Robinson - * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated. + [me]: Add nroff mode fallback for `u` macro. - * Makefile.in (NOMAKEDIRS): Updated. + * tmac/e.tmac (u): On nroff devices, bracket the first argument + with \(ul (underline rule) special character escape sequences. + {In plain language, '.u "like this"' renders "_like this_".} -2012-12-30 Werner LEMBERG + I regard this as a cosmetic and semantic improvement; since the + quarter-em vertical motions used in troff mode were ignored in + nroff mode, the effect was not underlining but a sort of + strike-through, visible only at spaces in the argument. The use + of this macro was thus invisible in nroff output if no spaces + were present in the argument. This is probably the best we can + do without a fatter interface to terminal device capabilities. - * src/libs/gnulib/*: Update `gnulib' files. +2022-02-12 G. Branden Robinson - Because we currently don't support `gnulib-tool' directly but add - everything to the CVS repository, and many internal details of the - gnulib setup has changed, it is necessary to do redo the import. + [me]: Simulate boxed text support on nroff devices with ISO 6429 + color escape sequences. - . Temporarily rename `src/libs/gnulib' to `src/libs/gnulib.old'. + * tmac/e.tmac (bx): Do it. Add further fallback for non-groff + formatters in nroff mode, bracketing the boxed argument with '|' + glyphs. + * doc/meref.me.in: Document it. - . Call + Fixes . - gnulib-tool --create-testdir \ - --dir=src/libs/gnulib \ - wcwidth +2022-02-12 G. Branden Robinson - . Manually move directories `src/libs/gnulib/gl{lib,m4}' to - `src/libs/gnulib/{lib,m4}', and do `s/gllib/lib/' and `s/glm4/m4/' - in all files to `convert' the gnulib testbed to a standard gnulib - configuration as maintained by gnulib-tool. Additionally, remove - the directory `src/libs/gnulib/gltests' and the references to - `gltests' in all files. + [me]: Rename registers `$v` -> `tv`, `$V` -> `dv`. - (All of this could be done with a script, but I hope that this is - eventually replaced with migrating groff as a whole to gnulib and - its setup). + * tmac/e.tmac: Do it. Also include much commentary (including + some from James Clark in 1992) attempting to illuminate the + confusing history (and naming) of `$[rRvV]`. - . Call + * doc/meref.me.in: Document it. Introduce new terms + "text vertical spacing" and "display vertical spacing" earlier + and use them to condense and clarify discussions of their use. - gnulib-tool --add-import \ - --dir=src/libs/gnulib \ - wcwidth + * NEWS: Add item. - to update everything. + Fixes . - . Merge the changed, new, and deleted files into `gnulib.old', - delete `gnulib', rename `gnulib.old' to `gnulib', then commit. +2022-02-09 G. Branden Robinson -2012-12-28 Werner LEMBERG + * doc/groff.texi (Deferring Output): Add new node introducing + and motivating environments, diversions, and traps. - [doc] More documentation generation rules. +2022-02-06 G. Branden Robinson - * doc/Makefile.in (.texinfo.txt): New rule. - (.texinfo.html): Use `LANG='. - (split-html): New target. + [tmac]: Add more compatibility mode guards. -2012-12-28 Werner LEMBERG +2022-02-06 G. Branden Robinson - * doc/fixinfo.sh: Make it work with makinfo 4.13 also. + * tmac/pdf.tmac: Add compatibility mode guards so that we can + run even if troff is given the -C option. Resurrect your + vintage 1975 Sixth Edition Unix manuals from '.deth' and format + them in PDF today! -2012-12-28 Werner LEMBERG + Fixes . - Split ChangeLog. +2022-02-06 G. Branden Robinson - * ChangeLog: Split off older entries into... - * ChangeLog.121: this new file. + * tmac/andoc.tmac: Prefix diagnostic with package file name + literally. -2012-12-28 Werner LEMBERG +2022-02-04 G. Branden Robinson -Version 1.22 released -===================== + [man]: Trivially refactor. - * NEWS, VERSION, doc/groff.texinfo, doc/webpage.ms: Updated. + * tmac/an.tmac (an*localize): Rename to... + (an*localize-strings): ...this. + (TH): Update call site. - * config.guess, config.sub: Updated from `config' repository. +2022-02-03 G. Branden Robinson - * INSTALL.gen: Updated from `gnulib' repository (file `INSTALL'). + [docs]: Present several fundamental concepts. - * aclocal.m4, configure: Regenerated. + * doc/groff.texi (Page Geometry): + * man/roff.7.man (Concepts): Add new node/section. + - page geometry + - basic units + - device resolution + - drawing position + - text baseline + - page offset + - vertical spacing + - page break - * doc/texinfo.tex: Updated from `texinfo' repository. + Fixes the remainder of . - * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. +2022-02-02 G. Branden Robinson -2012-12-27 Bjarni Ingi Gislason + [me]: Add page length insufficiency check. - * man/groff_font.man: Typographical improvements and typos. + * tmac/e.tmac (@h): Port Keith Marshall's page length checker + from ms(7). -2012-12-27 Bjarni Ingi Gislason + Fixes and + . - * man/ditroff.man: Typographical improvements and typos. +2022-02-02 G. Branden Robinson -2012-12-18 Bjarni Ingi Gislason + [me]: Add test for insufficient page length error. - * man/groff_diff.man: Typographical improvements and typos. + * tmac/tests/e_rejects-too-short-page-lengths.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2012-12-16 Bjarni Ingi Gislason +2022-02-02 G. Branden Robinson - * man/groff.man: Typographical improvements (and one typo). - * man/groff_char.man: Typographical improvements. + [me]: Slightly refactor. -2012-10-17 Deri James + * tmac/e.tmac (@h): Use groff default scaling operator in + conditional expression. Add `do` requests so that the logic for + checking the line length works in compatibility mode. Also move + misplaced parenthesis in conditional expression. - * src/devices/gropdf/gropdf.pl (do_D): The command \D't N' moves - horizontal position by 'N'. gropdf now obeys this rule. - (do_t): Fixed kerning issue where width of non-kerned text could - be wrongly calculated using previous kern factor. +2022-02-02 G. Branden Robinson -2012-09-21 Werner LEMBERG + [ms]: Refactor insufficient page length check. - * doc/groff.texinfo: Improve documentation of `.ad'. + * tmac/s.tmac (pg@top): Drop extraneous closing parenthesis from + numeric expression. Change operator from '>' to '>='; a page + length right at the boundary causes a spurious extra page break + when a paragraphing macro is used to initialize the document. + Condense diagnostic emission using the @error macro instead of + duplicating it. Change indentation to fit the style of the rest + of the file (use hard tabs). If aborting, truncate the page + length to the current vertical position so that we don't + uselessly output further vertical space. -2012-09-20 Werner LEMBERG +2022-02-01 G. Branden Robinson - * doc/Makefile.sub (uninstall_sub): Fix removal of info files. + [ms]: Add test for insufficient page length error. -2012-09-20 Werner LEMBERG + * tmac/tests/s_rejects-too-short-page-lengths.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - Simplify environment handling. +2022-02-01 G. Branden Robinson - Suggested by Ivan Shmakov . + [me]: Vertically space delayed text like other annotations. - * doc/Makefile.in, doc/Makefile.sub (GROFF): Don't use export. + * tmac/e.tmac ((d): Set vertical spacing using percentage in + `$V` register. + ()d): Restore vertical spacing using percentage in `$v` + register. -2012-09-20 Deri James + Fixes . - [gropdf] Various minor fixes. +2022-01-31 G. Branden Robinson - * font/devpdf/Foundry.in: Add font path to debian `gsfonts' - package. + [build]: Expand '@PAGE@' when generating man pages. - * font/devpdf/util/BuildFoundries.pl: Handle missing fonts in a - more sane way, do NOT abort the complete make run! + * Makefile.am (.man): Substitute the './configure'd paper format + for @PAGE@. + * src/roff/groff/groff.1.man: Use it. - * src/devices/gropdf/gropdf: Accept papersize names (i.e. A4) as - either upper or lower case. The -p (papersize) option should be - length,width (currently reversed - width,length) +2022-01-31 G. Branden Robinson - * src/devices/gropdf/pdfmom.pl: Support use of GROFF_BIN_PATH. + [man]: Trivially refactor an-ext.tmac. -2012-09-11 Ralph Corderoy - Werner LEMBERG + * tmac/an-ext.tmac (EX, EE): Do a better job of keeping the + name space promise made in comments at the top of the file. + Rename `sP` register to `mP`. Problem introduced by me in + commit 69895ec20, 15 January 2020. Also rename `la` and `ra` + strings to `mL` and `mR`, respectively. These (undocumented) + string names date back to commit 259929625, 15 January 2007. - * src/preproc/tbl/tbl.man: Better document `d' column specifier. + * tmac/groff_man.7.man.in (Files) : Document the + aforementioned promise. -2012-08-31 Deri James +2022-01-31 G. Branden Robinson - Add `pdfmom' to handle mom documents with gropdf. + [man]: Refactor PDF bookmark support. - * Makefile.in (OTHERDIRS): Move contrib/mom to be run after - devices/gropdf. + * tmac/an.tmac (an*bookmark): New internal macro calls + `pdfbookmark` (only if the output device is 'pdf'). + (initialization): Migrate macro appendments to appropriate + definitions. Two cases... + (SH, SS): ...were straightforward. + (initialization): Another (for the man page title) was poorly + placed when appended to the `TH` macro, skipping over the page + header. Move it instead... + (PT): ...here. But to keep this bookmark from being generated + on every page of a document, we need a new variable + `an*was-TH-bookmark-emitted` which is tested here and assigned + once one bookmark corresponding to a `TH` call has been written. + (TH): Initialize `an*was-TH-bookmark-emitted` to zero. + (SS): Write the bookmark _before_ the subsection heading text. + (initialization): Drop short-lived `BM` register. It seems + harmless to unconditionally include bookmarks in PDF output. A + PDF tool can strip them out if they're not desired, and viewers + seem capable of minimizing or reducing the navigation pane (if + they even offer one in the first place). - * src/devices/gropdf/gropdf.pl: Various fixes: + * tmac/an.tmac (initialization): Rename new `BN` register to + `BD`... + * tmac/groff_man.7.man.in (Options) : ...and document it. + Also document `PT`'s new bookmarking responsibility. - . Correct image scaling issue. - . Handle relative horizontal movement 'h' followed by absolute - vertical movement 'V'. - . Correct handling of track kerning. + Fixes and + . - * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom) - using gropdf or grops driver. - * src/devices/gropdf/pdfmom.man: New man page. - * src/devices/gropdf/Makefile.sub: Updated to handle new files. +2022-01-31 G. Branden Robinson -2012-08-31 Deri James + [grohtml,groff,nroff,troff]: Tweak usage message. - * Makefile.in (OTHERDIRS): Move contrib/mom to be run after - devices/gropdf. + * src/devices/grohtml/post-html.cpp (usage): + * src/roff/groff/groff.cpp (synopsis): + * src/roff/nroff/nroff.sh: + * src/roff/troff/input.cpp (usage): Partly revert commit + 06ae7b0b8, 16 January. Move an ellipsis back inside a bracketed + operand (that is, an optional one). On reflection, I think this + notation makes it clearer that the command can be meaningfully + run without operands. - * src/devices/gropdf/gropdf.pl: Various fixes: +2022-01-31 G. Branden Robinson - . Correct image scaling issue. - . Handle relative horizontal movement 'h' followed by absolute - vertical movement 'V'. - . Correct handling of track kerning. + * tmac/papersize.tmac: Slightly refactor. Use new `stringdown` + request instead of a combination of `tr`, `di`, `asciify`, and + `chop`. + +2022-01-27 G. Branden Robinson - * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom) - using gropdf or grops driver. - * src/devices/gropdf/pdfmom.man: New man page. - * src/devices/gropdf/Makefile.sub: Updated to handle new files. + [man]: Slightly refactor. -2012-08-31 Julien Moutinho + * tmac/an.tmac (an-prepare-page-title): Rename to... + (an*prepare-page-title): ...this. Also simplify numeric + expression. Add comment regarding necessity of correct + environment. - * tmac/www.tmac (www-push-li): Fix indentation. + (an-header): Update call site of `an*prepare-page-title`. - See + (TH): Move planting of `an-header` trap from out of the midst of + footer trap management. Add comments. + + (an-header): Move `pl` and `sp` requests from here... + (PT): ...to here. While it's conceptually nice to have these + macros consist solely of `tl` requests, it doesn't yield enough + power to those who want to redefine them. Add comment. + + (an-footer, BT): ...simile. + +2022-01-27 Dave Kemper + + [man pages]: Add more references to pic(1)'s .PF. + + * contrib/chem/chem.1.man: + * contrib/pic2graph/pic2graph.1.man: + * src/utils/grog/grog.1.man: Do it. + + Fixes . + +2022-01-27 G. Branden Robinson + + Implement PDF bookmark support for man pages. Limitation: A + {sub}section can only be bookmarked if it is specified in the + arguments to the `SH` or `SS` requests, not on the next line in + an input trap. Thanks to Deri James for providing the + fundamentals (blame me for any weird bits). + + * tmac/an.tmac (an-prepare-page-title): Define a new string, + `an*page-ref-string`, which is the man page's own reference + {such as "groff(1)"} without any abbreviation, ellipsis, or font + selection or italic correction escape sequences. + (SS): Define a new string, `an*subsection-heading`, storing the + macro arguments (if any). These could contain font selection + escape sequences, for instance, a fact that becomes important + later. + (initialization): + - Recognize `BM` register to enable PDF bookmarks (only on the + 'pdf' output device); defaults on. Recognize `BN` register to + set a base level/depth for the bookmarks; this is to ease + embedding of man pages in other PDF documents that already use + bookmarks. The default is 0. The registers are not yet + documented. + - If the output device is 'pdf' and bookmarks are enabled, set + `PDFOUTLINE.FOLDLEVEL` and `PDFHREF.VIEW.LEADING` registers + {recognized by 'pdf.tmac'}. Append to `TH`, `SH`, `SS` to get + the `an*page-ref-string`, `an-section-heading`, and + `an*subsection-heading` bookmarks in the document at the + applicable levels. + + * tmac/mdoc/doc-common: Add straw-man implementation--it doesn't + support the `BM` and `BN` configuration parameters yet. (This + is enough to get bookmarks for the groff_mdoc(7) page to + correctly appear in the new 'groff-man-pages.pdf' document.) + (Dt, Sh, Ss): If the output device is 'pdf', place bookmarks in + the document at levels 1, 2, and 3. + + Fixes . - http://lists.gnu.org/archive/html/bug-groff/2012-08/msg00009.html +2022-01-26 Deri James - for the full report. + [gropdf]: Allow multiline text in .pdfinfo -2012-08-08 Eric S. Raymond + * src/devices/gropdf/gropdf.pl: Use either '\\\\\\\\n' or + '\[u000a]' as line separators in the string. - TBLization, as discussed on the list. There's a rewrite of - this file in planning, but this gets the content clean for now. +2022-01-25 G. Branden Robinson - * tmac/groff_mdoc.man: In this file. + * tmac/trans.tmac: Further follow up commit c64fd60dff. If the + `andoc` wrapper is being used, perform man(7) localization (not + just when `an` is loaded). -2012-08-09 Werner LEMBERG +2022-01-25 G. Branden Robinson - Provide proper Unicode mapping from and to dotless j. + [man pages]: Fix options used to generate compilations. - * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), - src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Add it. + * doc/doc.am (doc/groff-man-pages.pdf): Drop `-rU0` option (it's + unnecessary since we don't yet have PDF hyperlink support in + this document). Add `-rC1` option to enable continuous page + numbering. + (doc/groff-man-pages.utf8.txt): Drop `-rC1 -rU1`. Continuous + page numbering is superfluous since page numbers are not shown + in continuous rendering mode. Stop turning on OSC 8 defaults; + we don't know if the document will be viewed with a supporting + pager+terminal combination, and further we don't yet have a + mechanism for making `MR` man page cross references internal to + the document when they indicate groff man pages. -2012-08-08 Eric S. Raymond +2022-01-24 G. Branden Robinson - Added Unicode code point for dotless j. + [man pages]: Ship compilations in UTF-8 text and PDF. - * man/groff_char.man: In this file. + Localization support and the resolution of Savannah #61266 have + made it practical to batch-render all of groff's man pages as a + single giant document. Provide PDF and UTF-8 text (with ECMA-48 + escape sequences, but not the italic attribute or OSC 8 + sequences). -2012-08-08 Werner LEMBERG + Reasons for this addition include: {1} it is now possible, + whereas I don't believe it was in any previous groff release; + {2} many people still don't realize how much more pleasant + reading typeset man pages can be (while a subjective assessment, + I'm not alone[1]); {3} providing these forms permits full-text + searching of groff's entire man page corpus via the PDF viewer + or a pager like "less -R", the latter without sacrificing the + style variations of the text that aid the reader to comprehend + the material; {4} sentimentally, it honors the 50th anniversary + of the first Unix manual (dated 3 November 1971) + . - * man/groff_char.man: Clean-ups. + * doc/doc.am (PROCESSEDDOCFILES): Add + 'doc/groff-man-pages.{pdf,utf8.txt}'. + (GROFF_MAN_PAGES{1,2,3}): Add new macro storing names of all man + pages generated in the build tree. Motivate the reason for 3 + variables in a comment (it's due to groff locale switching). + (GROFF_MAN_PAGES_ALL): Add convenience macro for use in + dependency lists required by... + ('doc/groff-man-pages.{pdf,utf8.txt}'): ...these targets. + Generate pages with the lint dial turned all the way up. -2012-08-08 Eric S. Raymond + Fixes . - Elimination of nasty presentation-level macro tangles makes - structural translation to XML possible. + [1] "The manual was intended to be typeset; some detail is + sacrificed on terminals." (man(1), _Unix Time-Sharing System + Programmer's Manual_, Eighth Edition, Volume 1, February 1985) - * man/groff_char.man: Clean up the mess, use real TBL tables. +2022-01-24 G. Branden Robinson -2012-07-23 Eric S. Raymond + [man]: Commit c64fd60dff was not quite cooked. The localized + strings (in English) for the manual section titles need to be + set at every document load (i.e., when `TH` is called), but only + if the groff locale is "english". When switching locales, these + strings were getting "stuck" in their non-English translations + even when returning to an English page. - More elimination of low-level troff hackery in the documentation - so it can be lifted to structural markup. + * tmac/an.tmac (an*localize): New macro initializes strings. + (TH): Call `an*localize` if the locale is "english". + (initialization): Drop initialization of section title strings. - * tmac/groff_me.man: Use TBL rather than wacky diversions and .ti - requests. + Continues fixing . -2012-07-24 Werner LEMBERG +2022-01-24 Deri James - Fix appearance of groff.texinfo's HTML output. + [gropdf]: Fix Savannah #61908 - Cartouches within an `example' environment don't work. + * src/devices/gropdf/gropdf.pl: Adjust text position when + given landscape media (i.e -P-l). - * doc/groff.texinfo (CartoucheExample, endCartoucheExample): New - macros. Use them where appropriate. + Fixes . -2012-07-17 Ingo Schwarze + Thanks to KUBO Koichi for finding the problem and supplying a + patch. - [mdoc] Make `Fl' correctly restore fonts. +2022-01-24 Deri James - * tmac/doc.tmac (doc-flag-recursion): Do it. + * src/devices/gropdf/gropdf.pl: A fix to importing pdf + versions > 1.4. -2012-07-07 Eric S. Raymond +2022-01-23 G. Branden Robinson - * src/preproc/eqn/eqn.man, src/preproc/grn/grnn.man, - src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man, - src/devices/grops/grops.man, src/utils/lkbib/lkbib.man, - src/utils/indxbib/indxbib.man, src/utils/tfmtodit/tfmtodit.man, - src/utils/xtotroff/xtotroff.man: - Remove running text in the synopses of various manual pages, - as it badly screws up attempts to mechanically parse them. + [grotty]: Skip part of test if locale doesn't support UTF-8. - * contrib/mom/groff_mom.man: Use .URL rather than .UR/.UE, as this - is now preferred for manual pages. + * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh: + Skip test of 'utf8' output device if locale lacks UTF-8 support. + But if the 'ascii' or 'latin1' test cases have already failed, + report that instead. -2012-07-03 Werner LEMBERG + Fixes . Thanks to Bjarni + Ingi Gislason for the report. - Fix Unicode mapping of Greek stroked and curly phi. +2022-01-23 Bjarni Ingi Gislason - Problem reported by Alkis Georgopoulos ; - see + [man pages]: Fix typos. - https://bugs.launchpad.net/ubuntu/+source/groff/+bug/1008115 + Fixes . - * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Flip - values of U+03C6 and U+03D5. +2022-01-22 G. Branden Robinson -2012-06-13 Deri James + [tmac]: Fix style nits in test. - * src/devices/gropdf/gropdf.pl: When using variable page - sizes (with \X'papersize ...') ensure final page is correct - size. + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: + - Emit complaints about test environment to standard error. + - Replace lingering literal file name with variable expansion. + - Skip test if gs(1) fails, instead of reporting failure. + - Begin continued lines with operators, for visibility. -2012-05-24 Werner LEMBERG +2022-01-22 G. Branden Robinson - * src/roff/grog/grog.pl (process): Fix .so handling. + [grohtml]: Fix misspelled member variable. - This does the same as the previous commit. + * src/devices/grohtml/post-html.cpp (class html_printer): + Rename `supress_sub_sup` to `suppress_sub_sup`. -2012-05-24 Denis M. Wilson +2022-01-21 G. Branden Robinson - * src/roff/grog/grog.sh: Fix .so handling. + [pdfpic]: Fix Savannah #58206. - See + * tmac/pdfpic.tmac (PDFPIC): Scrub null bytes out of pdfinfo(1) + output. Thanks to an anonymous contributor for the patch (the + commentary about it is mine, if someone wants an argument). + + Fixes . - http://lists.gnu.org/archive/html/bug-groff/2012-05/msg00000.html +2022-01-21 G. Branden Robinson - for the report and the bug fix. + [pdfpic]: Regression-test Savannah #58206. -2012-05-24 Ivan Shmakov + * tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh: Do + it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2022-01-21 G. Branden Robinson + + [pdfpic]: Refactor. + + Now that the package does not abort upon the first whiff of any + trouble, avoid littering groff's name spaces. Take this + opportunity to rename registers and strings to have obvious + meaning to even the casual reader. + + * tmac/pdfpic.tmac: Do it. + (pdfpic@cleanup): New macro removes temporary strings and + registers. + (PDFPIC): Call the cleanup macro upon entry; this way, if we + errored out from a previous call, we avoid confusion. (We don't + clean up upon an error return because the leftover objects might + be useful for troubleshooting.) Rename registers and strings, + to get them under name space discipline and also to better + suggest their purpose. + - convert-pdf -> pdfpic*do-conversion + - pdf-offset-mode -> pdfpic*offset-mode + - pspic-args -> pdfpic*pspic-args + - pdf-offset -> pdfpic*indentation + - is-pdf -> pdfpic*file-extension + - img-file -> pdfpic*file-name + - pdf-wid -> pdfpic*width + - pdf-ht -> pdfpic*height + - pdf-deswid -> pdfpic*desired-width + - pdf-desht -> pdfpic*desired-height + Call cleanup macro before returning upon successful operation. + +2022-01-21 G. Branden Robinson + + [pdfpic]: Improve robustness. + + * tmac/pdfpic.tmac (@abort): Rename to `pdfpic@error`. This is + an auxiliary package, and something else could very well step on + the former name (or worse, we break it if we're loaded later). + (pdfpic@error): Stop aborting; simply report an error. It's up + to the user how serious `PDFPIC` macro problems are. As noted + in a comment, the user can easily `am pdfpic@error` to tack an + `ab` request onto the end of its definition. Always report + input file name and line number. Replace "[PDFPIC]" prefix with + the name of the macro file complaining, to make it easier for + groff non-experts to find. + (PDFPIC): Return upon errors. Recast diagnostic messages. Stop + implying that we perform any sort of probing test of file type + {there's no telling what pdfinfo(1) will say}. Apply new + 'stringdown' request so that we accept '.pdf' file name + extension in any lettercase. Test file argument for existence + before proceeding (acknowledge TOCTTOU exposure). Skip file if + pipeline returned a non-zero exit status or the registers into + which we extract the height and width are undefined (indicating + failure of a temporary file to be created or read). Reject + files with non-positive image width or height reported by + pdfinfo. Validate `width` and `height` arguments, if given, + rejecting non-positive values. + + Fixes . + +2022-01-21 G. Branden Robinson + + [mdoc]: Make `Pa` macro interpolate basic Latin tilde on all + output devices. + + * tmac/doc.tmac (Pa): Do it. + +2022-01-21 G. Branden Robinson + + [tbl]: Fix incorrect line numbers in diagnostics. Line numbers + for multiple format-time diagnostics emitted by tbl(1)-generated + groff input were off by +5 lines. + + * src/preproc/tbl/table.cpp: Fix it. + (NOP_NAME): Add new preprocessor symbol to construct name of + "nop" macro to be used as end macro for `ig` requests inside + macro definitions. + (table::init_output, table::compute_expand_list, + table::compute_separation_factor): + - Move `entry_list->set_location()` calls to more auspicious + locations. + - Replace "around line X" language in diagnostic messages with a + more idiomatic, and less embarrassing, simple report of an + integer. + (table::init_output): + - Add `entry_list->set_location()` call right before emitting + diagnostic about a table row not fitting on a page. + - Turn off eqn(1) delimiters when emitting diagnostic about a + boxed table not fitting on a page (necessitating `.TS H` + support), using new NOP_NAME-based end macro to achieve this + inside a macro definition. + (table::compute_expand_list): Suppress issue of too-wide table + diagnostic when the `EXPAND` table flag is set (corresponding to + the `expand` region option), because other code already emits + diagnostics in this case. + + Fixes . Problem appears + to date back to commit 3bc4a53a45, 2013-01-07. + +2022-01-21 G. Branden Robinson + + [tbl]: Add unit test for format-time diagnostics. + + Ensure that the various format-time diagnostics that a + tbl-preprocessed document can generate (1) occur when they are + supposed to and (2) are appropriately suppressed by the + "nowarn" and/or "nokeep" region options. One of them is an + error and cannot be suppressed by the former, but _can_ be by + "nokeep", which is arguably a bug (Savannah #61878). + + * src/preproc/tbl/tests/format-time-diagnostics-work.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TEST): Run test. + +2022-01-21 G. Branden Robinson + + [tbl]: Trivially refactor. + + * src/preproc/tbl/table.cpp (table::compute_expand_width): + Declare and initialize variables closer to use. Also, the width + computed is compared to the line length and indentation, so use + these well-established *roff terms in the diagnostic message. + +2022-01-20 G. Branden Robinson + + [tbl]: Fix Savannah #61854. + + * src/preproc/tbl/table.cpp (compute_expand_width): To properly + warn if a table is too wide to fit between the indentation and + the right margin, we need to compute its column widths including + those eligible for expansion via the 'x' column modifier; we + cannot use the same expression that we do to determine the + amount of space we have to distribute among the expanded + columns. Iterate through columns again (the function was + already doing so twice), once to potentially produce the + warning, and then as before to distribute any available width. + In other words, warnings were only being emitted for too-wide + tables where one or more columns used the 'x' modifier. + + Fixes . + +2022-01-19 G. Branden Robinson + + [ms]: Don't add leaders that don't lead anywhere. + + * tmac/s.tmac (toc*end-entry): If no page number string + `toc*num` is defined, don't interpolate its emptiness prefixed + with a leader (and tab). This makes "no" as the first argument + to `XS` and `XA` work as documented, suppressing not only the + page number but the leader after the entry. + + Fixes . + +2022-01-19 G. Branden Robinson - Add some generic fallback characters. + [ms]: Add regression test for Savannah #61853. - * tmac/fallbacks.tmac: New file. - * tmac/troffrc: Include it. - * tmac/Makefile.sub (NORMALFILES): Include it. + * tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh: Do + it. + * tmac/tmac.am (tmac_TESTS): Run it. -2012-05-20 Deri James +2022-01-19 G. Branden Robinson - * doc/groff.texinfo: Add extra info about `.asciify'. - Document new gropdf options -u and -s. + [me]: Fix bad unit test. - * src/devices/gropdf/gropdf.man: Remove references to Type 42 - fonts, they do not work in PDFs. + * tmac/tests/e_chapter-titles-work.sh: Fix missing shell test at + end of script, which caused it to exit successfully regardless + of any test failures. Irritating. This is among the fruits of + the "never, ever use 'set -e'" tree. (This religion has a thick + bible: .) Fortunately, + all the tests pass legitimately. - Document new option -s which adds `statistics' line to end of PDF - file showing number of pages in document. This has always been - the default behaviour (to add this line), all other software seems - to ignore it as intended, but `gs' sometimes complains, so the - default is now to omit the statistics. +2022-01-16 G. Branden Robinson - Document new option -u[cmapfilename] to allow a user ToUnicode - CMap instead of gropdf's default. If no `cmapfilename' given then - do not include any ToUnicode CMap. + [font]: For 'ascii' and 'latin1' devices, consistently define + glyphs for ordinary characters before their special character + aliases. This parallels existing usage for the 'cp1047' device, + and, I think, makes the file contents slightly more accessible. - * src/devices/gropdf/gropdf.pl : Allow `bundled' flags on - command line (i.e. -de = -d -e). + * font/devascii/R.proto: + * font/devlatin1/R.proto: Do it. - Use $RT_SEP as multi path separator, not hard coded `:'. Update - all users. +2022-01-16 G. Branden Robinson + + [grohtml]: Update diagnostic messages. - New flags -u and -s. Once a custom papersize has been set as - \X'papersize x,y' make it sticky so all following pages use custom - size. When importing pdf with \X'pdf: pdfpic ...' do not compress - objects which are already compressed! This caused problems with - PDFs created with ImageMagick, now fixed. + * src/devices/grohtml/post-html.cpp (assert_state::add) + (assert_state::compare, replace_negate_str) + (assert_state::check_value_error, make_val): Make format of + internal assertion system messages shorter and more mutually + parallel. + (html_printer::set_char, html_printer::set_numbered_char) + (html_printer::set_char_and_width): Parallelize diagnostic + messages with libdriver; see yesterday's commit. + (main): Put information in argument to `assert()`; see commit + 11b43053, 24 November. - (IsText, PutLine, do_t): The troff `u' command can contain a - kerning adjustment number, this was not being handled, now fixed. +2022-01-16 G. Branden Robinson + + [nroff]: Emit usage message on usage errors. - (do_c): The troff `c' command was not being handled correctly, now - fixed. - (FindChar, RemapChr, do_N): Handle fonts with more than 255 glyphs. - ($ucmap): Define CMap ToUnicode to convert ligatures - (fl,fi,ff,ffl,ffi) back to individual characters, useful for - cut'n'paste and text searching. - (LoadFont): Handle it. - (ToPoints, GetPoints): Handle `z' unit. - (do_x, FixPDFColour, PutHotSpot): Allow Annotation colour to be - groff colour, i.e. 0-65535 *3, or #rrggbb, or #rrrrbbbbgggg. - (do_p):The papersize width/length in switch -p were reversed, - corrected. + * src/roff/nroff/nroff.sh: Store the usage message in a shell + variable instead of a here document, and sling it to the + standard output or standard error streams, as appropriate. - * src/devices/gropdf/Makefile.sub (gropdf): Use $RT_SEP. - Use $fontpath rather than $fontdir (this ensures site-font is - included in searches). +2022-01-16 G. Branden Robinson + + [grohtml,groff,nroff,troff]: Tweak usage message. - * tmac/pdf.tmac (PDFBOOKMARK.VIEW, PDFHREF.VIEW, PDFPAGE.Y): Fix - strings. - (pdfbookmark): Correct handling of bookmark levels. - Convert \[em] to hyphen in bookmarks + * src/devices/grohtml/post-html.cpp (usage): + * src/roff/groff/groff.cpp (synopsis): + * src/roff/nroff/nroff.sh: + * src/roff/troff/input.cpp (usage): Stop putting an ellipsis + inside a bracket expression (for file arguments); that suggests + misleading complexity. - Rather use -N than -T for "named" bookmarks (-T already used for - "tag" in pdfmark.tmac) + * src/devices/grohtml/post-html.cpp (usage): Also don't set + metasyntactic variable names in screaming capitals when they are + separated from option letters by space and thus can't be + confused with them. - (.pdfclean): New macro which attempts to asciify bookmark text. - (.pdfpagename): New wrapper macro for \X'pdf: pagename'. - (.pdfswitchtopage): New wrapper macro for \X'pdf: switchtopage'. +2022-01-15 G. Branden Robinson -2012-03-10 Werner LEMBERG + [libdriver]: Update diagnostic messages. - Fix compiler warnings. + * src/libs/libdriver/printer.cpp (printer::find_font): Describe + the problem encountered instead of saying lamely "sorry, I can't + continue". + (printer::set_char_and_width, printer::set_numbered_char): + Characterize input as "invalid", not "bad"; see commit bb7512b5, + 17 September. When referring to font mounting position, say so. + (printer::set_char_and_width): Describe required input character + as "ordinary", not "ascii". Apart from the incorrect casing, + doing so better aligns with our terminology in groff_char(7), + groff_out(5), our Texinfo manual, and other diagnostic messages; + moreover, the use of "ascii" is potentially confusing to those + whose environments use another encoding, like UTF-8 or IBM code + page 1047. - * src/preproc/html/pre-html.cpp (alterDeviceTo): Avoid ambiguous - if-else clause. + Fixes . - * src/preproc/grn/main.cpp (sccsid): Comment out. +2022-01-15 G. Branden Robinson - * src/roff/troff/number.cpp (parse_expr) : Add cast. + [grotty]: Check basic Latin ("ASCII") glyph mappings. - * src/devices/xditview/Makefile.sub (EXTRA_CFLAGS): Add `-Dlint' - so that unused static ID arrays don't cause a warning. + * src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh: + Do it. + * src/devices/grotty/grotty.am (grotty_TESTS): Run test. - (Some) problems reported by Bjarni Ingi Gislason - . +2022-01-15 G. Branden Robinson -2012-03-05 Werner LEMBERG + [font,tmac]: Simplify Unicode character mapping process. - * tmac/an-ext.tmac (SY): Handle argument with spaces correctly. + * tmac/unicode.tmac: Drop. It was originally added in 2005 to + suppress horizontal spacing of glyphs in the range U+0483..9. + Its purpose has wandered over the years; most recently to map + the Basic Latin ("ASCII") hyphen-minus, apostrophe, and grave + accent to special characters (and thus ultimately to the General + Punctuation block). But this is unnecessary since the font + descriptions for devices with the `unicode` property can provide + this information, and anyone who wants to alter the mappings can + change either font description files, output device macro files, + or troffrc; or add `char` requests to their macro packages or + documents (in decreasing magnitude of ambition). + + * tmac/html.tmac: + * tmac/tty.tmac: Stop sourcing unicode.tmac. + + * tmac/tmac.am (TMACNORMALFILES): Stop shipping it. + + * font/devutf8/NOTES: Drop remarks about mapping of \[a~], + \[a^], and Basic Latin circumflex accent and tilde. Not only do + I disagree with the reasoning (whether these glyphs are "too + small" depends on the font used by the terminal emulator, over + which we have no control), but this mapping happens in a + completely different part of the source tree, + src/libs/libgroff/glyphuni.cpp. + + * font/devhtml/R.proto: + * font/devutf8/R.proto: Add mappings for the five Basic Latin + characters that map surprisingly (see groff_char(7)) and are not + syntactically significant to troff. Three of these are ported + from unicode.tmac. + (html): Don't migrate the hyphen-minus--yet. + +2022-01-15 G. Branden Robinson + + * tmac/tty-char.tmac: Drop redundant logic. We don't need to + source the `cp1047` or `latin1` files here; `troffrc` will + already have loaded `tty` for us, which loads whichever applies. + +2022-01-14 G. Branden Robinson + + * doc/doc.am: Separate concerns better; stop re-generating plain + text and HTML documents when the 'doc' target is updated; these + are already handled by the 'build_infodoc' target. + (build_infodoc): Use existing phony targets for plain text and + HTML output files instead of repeating filename literals. + (doc_all): Remove those same two phony targets from this one's + dependencies. + +2022-01-14 G. Branden Robinson + + * src/roff/troff/input.cpp: Rename `eoi_macro_name` to + `end_of_input_macro_name`. It's long, yes, but better parallels + `blank_line_macro_name` and `leading_spaces_macro_name`. It is + not used in lengthy expressions and furthermore clarifies the + meaning of the nearby function name `eoi_macro` in one use. + +2022-01-11 G. Branden Robinson + + * src/preproc/preconv/preconv.1.man (Limitations): Add + subsection. + + Fixes . + +2022-01-11 G. Branden Robinson + + [docs]: Be more careful with control characters when they are + word-initial in filled text lines. The idea is to prevent + baffling surprises if a sentence is recast in a text editor, and + a word beginning with a dot or neutral apostrophe is reflowed + onto the beginning of the next input line--suddenly it is parsed + as a control character. Based on a patch by Bjarni Ingi + Gislason. + + * contrib/hdtbl/groff_hdtbl.7.man: + * doc/automake.mom: + * doc/meintro.me.in: + * doc/meintro_fr.me.in: + * doc/pic.ms: + * doc/webpage.ms: + * src/devices/gropdf/gropdf.1.man: Do it. - Problem reported by Bjarni Ingi Gislason . + Fixes . -2012-03-01 Bjarni Ingi Gislason +2022-01-11 G. Branden Robinson - [an-old] Fix warnings. + * doc/groff.texi (Font Description File Format): + * man/groff_font.5.man (Font description file format): Document + restriction of kerning adjustment to glyph pairs from within a + single font (since that is the scope of the font description). - * tmac/an-old.tmac (an-init): Insert missing braces. + Fixes . -2012-02-26 Werner LEMBERG +2022-01-11 G. Branden Robinson - Update configuration files from `gnulib' and `config' repositories. + * contrib/groff_filenames/groff_filenames.5.man: Remove + superfluous paragraphing macro. - This also fixes a problem with `iconv' on Solaris 10, as reported - in + Fixes . Thanks to Bjarni + Ingi Gislason for the report and a suggested patch. - http://lists.gnu.org/archive/html/bug-groff/2012-02/msg00007.html +2022-01-10 G. Branden Robinson - * configure.ac: Call `gl_LOCALCHARSET. - Call `AM_ICONV' as C++. + * doc/groff.texi (Operators in Conditionals): Update explanation + of output-comparison conditional operator. - * config.guess, config.rpath, config.sub, install-sh, mkinstalldir: - Updated. + Fixes . - * m4/codeset.m4, m4/glib21.m4, m4/iconv.m4, m4/lib-ld.m4, - m4/lib-link.m4, m4/lib-prefix.m4: Updated. - * m4/fcntl-o.m4, m4/localcharset.m4: New files. +2022-01-08 G. Branden Robinson - * Makefile.in: Updated. + [build]: Use pnmtops(1)'s -quiet option if possible, to quieten + build. - * src/include/localcharset.h, src/libs/libgroff/config.charset, - src/libs/libgroff/localcharset.c: Updated. + * m4/groff.m4 (GROFF_PNMTOOLS_CAN_BE_QUIET): Add new macro to + test pnmtops for support for (undocumented) '-quiet' option. - * aclocal.m4, configure, src/include/config.hin: Regenerated. + * configure.ac: Perform the check. -2012-02-20 Werner LEMBERG + * doc/doc.am: Alter check of shell variable `pnmtops_nosetpage` + {processed by AC_SUBST} to correctly match even if pnmtops + accepts the '-quiet' option. - Update `gnulib' files. +2022-01-06 G. Branden Robinson - The invocation was + [tmac]: Manage hyphenation mode more carefully in localization + packages. - gnulib-tool --add-import \ - --dir=src/libs/gnulib \ - wcwidth + * tmac/{cs,de,it,sv}.tmac: Localize the man(7) package's HY + register. - Additionally, src/libs/gnulib/configure.ac was adjusted from a - `test' run as described in the change from 2010-12-13. + * tmac/{cs,de,fr,it,sv}.tmac: When localizing the ms(7) package, + use mode "2" instead of "3": the 'hy' request complains of + contradictory hyphenation modes if "3" is used (the semantics of + the hyphenation mode are complex and non-orthogonal; see + groff(7) or our Texinfo manual). - * src/libs/gnulib/*: Updated. + * tmac/{cs,de,en,fr,it,sv}.tmac: If the one language-independent + hyphenation bit (don't hyphenate just prior to a page location + trap) is set, preserve it; this way a system's troffrc or a + macro package can set it and it will not get turned off by the + localization package, which for best results should be loaded + after any full-service package (and any auxiliary package + requiring localized strings, though none are yet distributed + with groff). -2012-02-15 Deri James +2022-01-06 G. Branden Robinson - [gropdf] Fixes and omissions. + [tmac]: Add unit test for localization macro files. Right now + this just covers the hyphenation mode. - * src/devices/gropdf/gropdf.pl (, do_u): Add facility to - handle track kerning (.tkf). + * tmac/tests/localization-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - (do_x, do_p, do_t): If pages are reordered using `pagename' and - `switchtopage' keep track of outline bookmarks. - (do_x): Handle multiple files on gropdf command line, stitch - multiple groff_out files together. In the main read loop any argc - values not consumed by options are taken as input files and - processed in order. What prevented it working properly before is - the way an `x i' (initialize) record has been handled. It now - processes the initialization code only in the first file. +2022-01-05 G. Branden Robinson - (PutHotSpot): Allow user to control size of hotspot bounding box - on clickable links by setting PDFHREF.LEADING + [indxbib]: Document --version in usage message. - * tmac/pdf.tmac (PDFHREF.LEADING): Adjust value. - (pdf*href): Pass value of PDFHREF.LEADING to gropdf. + * src/utils/indxbib/indxbib.cpp (usage): Document --version + option. Use more informative metasyntactic variable names. + Organize usage message consistently with our others, and stop + wrapping the output lines: we know neither the width of the + terminal nor the length of the `program_name` string we're + interpolating. See commit b4de44f0, 19 July 2021. -2012-02-10 Deri James +2022-01-05 G. Branden Robinson - [gropdf] Fix compatibility issues with pdfmark. + [libbib]: Refactor index header checking. - * tmac/pdf.tmac (PDFHREF.VIEW.LEADING): Fix value. - (pdf:href.opt-X): Add check for -X option for .pdfhref. + * src/libs/libbib/index.cpp: Move more header validity checks... + (index_search_item::load): ...from here... -2012-02-08 Werner LEMBERG + (index_search_item::check_header): ...to here. Test all size + values in header for negative values (never valid) before + proceeding. (These data could be changed to unsigned integer + types in the file format, but that would require bumping the + file version. That in turn would make indexes generated with + groff 1.23 unusable on systems running older groffs and, perhaps + worse, would make groff 1.23 reject index files produced by + older groffs. On the other hand, the regeneration of index + files should be, for those who use them, a common activity, and + as long as the original database files are kept intact, it seems + likely that most people, given modern machines, won't even + notice a slowdown in document generation when refer(1) and + friends fail to open the indices and fall back to full-text + searches of the originals. So we could still consider revising + the file format before the groff 1.23 release.) - * src/preproc/pic/main.cpp (do_file): Check for invalid characters. + * src/libs/libbib/index.cpp (index_search_item::load): + Explicitly perform widening conversion from signed `off_t` value + {from a stat(2) buffer} to an unsigned integer; quietens + compiler warning about comparison between integers differing in + signedness. - Problem reported by Doug McIlroy . +2022-01-05 G. Branden Robinson -2012-01-25 Ingo Schwarze + * configure.ac (AC_CHECK_HEADERS): Expect stdbool.h, since we + now use it in src/include/lib.h. - [mdoc] * tmac/doc-syms: Fix meaning of XBD acronym. +2022-01-05 G. Branden Robinson -2012-01-25 Tadziu Hoffmann + [libbib, libgroff, indxbib]: Slightly refactor. - * tmac/e.tmac (bl): Make it work inside blocks. + Also, it's silly to test even numbers > 2 for primality. Stop. - See threads starting with + * src/include/lib.h: Include `stdbool.h` since this header file + is used for both C and C++ code. - http://lists.gnu.org/archive/html/groff/2011-12/msg00055.html - http://lists.gnu.org/archive/html/groff/2012-01/msg00000.html + * src/include/lib.h (is_prime): + * src/libs/libgroff/prime.cpp (is_prime): Boolify. Return + Boolean instead of integer literals and demote return type to + `bool`. Include `assert.h` and add assertion to reject + mathematically offensive input. -2012-01-10 Bruno Haible + * src/libs/libbib/index.cpp + (index_search_item::read_common_words_file): Test only odd + numbers for primality. + * src/utils/indxbib/indxbib.cpp (main): Same. Since the number + comes from user input, make it (a potential hash table size) odd + first. + +2022-01-04 G. Branden Robinson + + [man]: Internationalize and localize. + + * tmac/an.tmac (TH): Indirect predefined manual section titles + through new strings `an*section[1-9]` so that they can be + localized. + (initialization): Give these strings English defaults. + (TH): Move `ss` request from here... + + * tmac/en.tmac: ...to here. It's not the man(7) package's + business what the inter-word and inter-sentence spacing values + are. Also, having the correct[disputed] inter-sentence spacing + value for English in its localization file restores it for the + benefit of multi-lingual documents (mainly roff applications + other than man(7)). + + * tmac/{cs,de,fr,it,sv}.tmac: Supply translations for the manual + section titles; these were done by a monoglot American employing + Google Translate, so those scandalized or running into howlingly + wrong locutions are warmly invited to submit corrections. + + * tmac/trans.tmac: Load localized strings. - Fix handling of MAKEFLAGS variable. + Fixes . - * Makefile.in (MAKE_K_FLAGS): Improved definition, - as explained and discussed in +2022-01-04 G. Branden Robinson - http://lists.gnu.org/archive/html/groff/2012-01/msg00039.html + * src/utils/grog/grog.pl: Handle auxiliary macro package + arguments correctly. + (process_arguments): Don't append the argument to the '-m' + option to the command line; requested macro packages have + dedicated logic. + (construct_command): When iterating through requested package + list, assume each element is an auxiliary package unless it + matches an element in the list of main packages. If the + assumption holds, append the package name to a new list, + `auxiliary_package_argument` (prefixed with '-m'). Push this + list onto the command line after any main package. -2012-01-03 Ingo Schwarze + Also rename `$selected_main_package` to `$main_package` for + brevity, and drop unused global lists `m` and + `supplemental_package`. - Improve parallel builds. + Fixes . - Some hdtbl and mom examples want PostScript formatting which - requires the `DESC' file to be ready; however, the top-level - `Makefile.in' doesn't currently enforce the proper order of - building of `font/dev' before `contrib/hdtbl', `contrib/mom', and - so on. +2022-01-04 G. Branden Robinson - Given that `font/dev' and the contrib examples are in different - child processes of the recursive make system, it doesn't seem - possible to solve this using clean Makefile dependencies. We now - enforce the order by splitting the shell command invoking - recursive make in the top level `Makefile.in'. + * src/utils/grog/tests/smoke-test.sh: Add test cases for user + specification of auxiliary macro packages. - * Makefile.in (ALLDIRS): Remove `OTHERDIRS'. - (dodirs): Updated. - (`$(TARGETS)'): Handle `OTHERDIRS' separately. +2022-01-03 G. Branden Robinson -2012-01-03 Kristaps Dzonsons + [me]: Drop unnecessary code. Apart from being superfluous, it + prevented a user-defined value of the `sx` register from being + applied to the first footnote marker interpolated, a subtlety + that escaped my notice because the first footnotes in our + "meref" and "meintro" documents are not numeric, but symbolic, + and their markers occurred on lines with vertical space above + and below. (The bug was further masked by an otherwise + redundant redefinition of the `*` string inside the `)f` macro.) - [mdoc] Add `-isoC-2011'. + * tmac/e.tmac ()f, +c): Stop redefining footnote marker string + `*` after updating the automatic footnote number; its + interpolation is already backslash-protected. + ()d, pd): Stop redefining delayed text marker string `#` for an + analogous reason. + (initialization): Drop unneeded `_*` and `_#` strings. - * tmac/doc-syms (doc-str-St--isoC-2011): Add it. - * tmac/groff_mdoc.man: Document it. + Thanks to Robert Goulding for his feedback and patience. See + . -2011-12-26 Deri James +2022-01-03 G. Branden Robinson - * font/devpdf/Makefile.sub: Only build fonts on first `make'. + * tmac/tests/e_footnote-marks-work.sh: Enhance test. Confirm + that the automatic footnote number is reset to 1 by starting a + new chapter with the `+c` macro. -2011-12-08 Werner LEMBERG +2022-01-02 G. Branden Robinson - * doc/groff.texinfo (.tl): Improve documentation. - Wording suggested by Keith Marshall - . + [me]: Revise `n1` and `n2` interface and behavior. -2011-12-01 Werner LEMBERG + There were several bugs in the previous implementation. - [me] Fix behaviour of centered block. - Problem and possible fix reported in thread starting at + * tmac/e.tmac (po): Issue diagnostic if an attempt is made to + set the page offset to a negative value. - http://lists.gnu.org/archive/html/groff/2011-11/msg00002.html + (n1): Accept new optional "C" argument to behave more (but not + exactly) like roff(1), as the formerly-recognized "c" argument + to `n2` did. If present, the line length is reduced by the same + amount (in new interface register `no`) as the line number field + to preserve the overall line length. Save the previous line + length in internal register `_l` and set a flag, stored in `?N`, + indicating this reduction. Otherwise, the macro expects to be + able to reduce the page offset to accommodate the line number. + If it cannot (for example, with the zero page offset default + used by nroff output devices), see above re: the `po` macro. - * tmac/e.tmac (`(c'): Always start with a new line. + (n2): Cache the last line number that may have been output, + instead of the current one, so that we can operate on it + consistently with user expectations. Do this earlier, and + rename this macro-local variable from `_ln` to `_n` so that we + don't need groff's `do` request to operate on it. Drop + recognition of "c" as an optional second argument. If turning + off line numbering: if the line length was shortened (`?N`) + restore the saved value and delete `_l` register; otherwise, + reverse the change to the page offset. Delete `_n` register. -2011-12-01 Ingo Schwarze + (initialization): Assign `\w'0000'u` to `no` register; this was + previously hard-coded in `n1` and `n2`. Initialize `?N` with 0. - [man] Print volume headers like mdoc. + * doc/meref.me.in (roff Support): Update to reflect interface + changes and describe behavior more accurately. - * tmac/an-old.tmac (an-init): Add default volume name if fifth - argument to `.TH' is missing. + * doc/meref.me.in (Summary): + * tmac/groff_me.7.in (Registers): Document new `no` register and + mark it as a groff extension. -2011-11-22 Werner LEMBERG + * NEWS: Add item documenting interface changes. - * tmac/groff_man.man: Minor documentation improvements. - Suggested by Jeff Conrad . + Fixes . See the comments + in the report for a lengthy enumeration of rendering problems + exhibited by the previous implementation. -2011-11-14 Werner LEMBERG +2022-01-02 G. Branden Robinson - * doc/groff.texinfo: Improve doc for calling undefined identifiers. + [me]: Add unit test for line numbering feature. -2011-11-14 Werner LEMBERG + * tmac/tests/e_line-numbering-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. - * src/preproc/tbl/tbl.man: Improve documentation of `_' and - friends. +2021-12-31 G. Branden Robinson -2011-10-31 Werner LEMBERG + * src/devices/grohtml/post-html.cpp (style::style): Add + initializer to argumentless constructor to avoid later read from + uninitialized memory in `html_printer::do_font`. - Fix compiler warnings. + Fixes . - * src/preproc/eqn/main.cpp (do_file), src/roff/troff/env.cpp - (environment::print_env), src/roff/troff/mtsm.cpp - (statem::display_state): Add syntactical sugar. +2021-12-31 G. Branden Robinson - * src/utils/tfmtodit/tfmtodit.cpp (char_info_word): Use `unsigned - char' for all members. + [groff]: Add regression test for Savannah #61748. - * src/devices/grohtml/html-text.cpp (html_text::remove_def): - Remove unused variable `q'. + * src/roff/groff/tests/html_works_with_grn_and_eqn.sh: Do it. + * src/roff/groff/groff.am (groff_TESTS): Run it. + +2021-12-31 G. Branden Robinson * src/devices/grohtml/post-html.cpp - (html_printer::lookahead_for_tables): Remove unused variable `left' - and `seen_text'. + (html_printer::do_file_components): Emit fatal diagnostic if + we're unable to `freopen()` standard output. Quietens + `-Wunused-result` warning from GCC 8.3. + +2021-12-31 G. Branden Robinson + + * src/devices/grohtml/html.h (INT_HEXDIGITS): Add new constant + to store the maximum possible quantity of digits in the + hexadecimal representation of an `int`. + + * src/devices/grohtml/html-text.cpp (html_text::issue_tag): + * src/devices/grohtml/post-html.cpp (html_printer::do_body): + Guard against format string overflow by large integers in RGB + color channel specifications; in a *printf format string, the + precision (like the field width) is a _minimum_. Quietens + `-Wformat-overflow` warnings from GCC 8.3. + +2021-12-30 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (get_image_generator): Clarify + complex conditional expression. Quietens `-Wparentheses` + warning from GCC 8.3. -2011-10-23 Ingo Schwarze +2021-12-28 G. Branden Robinson - [mdoc] Synchronize string tables with the mandoc(1) utility. + [me]: Rename new `$x` register to `sx`. Since we expect the + user to set this register directly, it should not be named with + a leading '$' per the "me Reference Manual". - * tmac/doc-common: Add many architecture names used in NetBSD and - OpenBSD (and "arm" from FreeBSD) and remove the duplicate OS - version entry for Darwin-10.6.0. + * tmac/e.tmac (initialization, {, }): Do it. - * tmac/doc-syms: Add many library names used in NetBSD and FreeBSD. + * tmac/groff_me.7.man: + * doc/meref.me.in: + * NEWS: Update documentation. - * tmac/groff_mdoc.man: Document all supported architecture names) - (OS versions, and library names. + * doc/meintro.me.in: + * doc/meintro_fr.me.in: + * doc/meref.me.in: Sync with new register name. -2011-09-11 Joseph Koshy + See . Thanks to Dave + Kemper for the discussion in + . - [mdoc] Add some library strings. +2021-12-28 G. Branden Robinson - * tmac/doc-syms: Add `libdwarf' and `libelf'. - * tmac/groff_mdoc.man: Document them. + [troff]: Slightly refactor. -2011-08-14 Deri James + * src/roff/troff/div.cpp: + * src/roff/troff/div.h: + * src/roff/troff/input.cpp: Rename variables to reduce confusion + between "end macros" and "end-of-input macros". Call the latter + "eoi" macros for brevity. - [gropdf] More minor fixes. +2021-12-28 G. Branden Robinson - * font/devpdf/Makefile.sub (MOSTLYCLEANADD): Don't attempt to - install 'util/BuildFoundries', only used in 'make'. + * tmac/e.tmac: Fix code style nits. + - Use new terminology in diagnostic. See commit 66ac1a8db9, + 11 December. + - Drop unused '&&&' annotation for macro definitions. This + was a BSD me(7) implementation detail wherein parts of the + package were broken out into module files, loaded if/when + their macros were called. groff me(7) is monolithic, except + for devtag and refer(1) support. + - Remove '&&' end macro when we're done using it. - * src/devices/gropdf/gropdf.pl (, GetType1): Make STDOUT and - any font files read to be accessed in binary rather than text mode. - Prevents errors when running on systems set up for UTF-8. +2021-12-27 G. Branden Robinson -2011-08-10 Deri James + [me]: (Re-)localize strings. - [gropdf] Minor updates and fixes. + * tmac/{cs,de,fr,it,sv}.tmac: Update package localizations to + use new resources. As a happy side effect (and with the new + appendix string), the `+c` macro is now localized for Czech, + German, and Swedish. - * src/devices/gropdf/gropdf.pl: Change command line option `-fy' - to `-y' for consistency. + * doc/meintro_fr.me.in (Les Parties du Document): Update example + to reflect mixed-case default string used in chapter headings. - Better support for Windows platform. - (do_x): Handle keywords `pagename' and `switchtopage'. + * tmac/tests/e_ld-works.sh: Add tests for localization. - * doc/groff.texinfo, src/devices/gropdf/gropdf.man: Updated. +2021-12-27 G. Branden Robinson - * font/devpdf/Foundry: Renamed to... - * font/devpdf/Foundry.in: This. - Add default alias font names. + [me]: Internationalize strings. - * font/devpdf/util/BuildFoundries.pl: This is now an installation - helper script and gets not longer installed. - Support alternative font file names (separated with `!'). + * tmac/e.tmac (initialization): Introduce internal + `_mo1`..`_mo12`, `_dw1`..`_dw7`, and `_td_format` strings (with + English defaults). Define them outside of the new `ld` macro so + that they can be overridden by localization packages. + (ld) : Populate via the above new strings. + * tmac/trans.tmac: Stop defining `mo` and `dw`. Instead, make + them aliases of the new strings above. Handle `wa` and `wc` + similarly. - * font/devpdf/Makefile.sub: Fixes to work with a separate build - directory. - Font files are now build at `make' time; this makes `test-groff' - work with -Tpdf. +2021-12-26 G. Branden Robinson - * font/devpdf/util/Makefile.sub: Removed. + [me]: Add `ld` macro to re-init date/l10n stuff. - * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Handle devpdf - specially. + * tmac/e.tmac (ld): New macro updates `y2` and `y4` registers + and `wa`, `wc`, `mo`, `dw`, and `td` strings. -2011-07-29 Daiki Ueno + * doc/meref.me.in (Miscellaneous, Predefined Strings): + * tmac/groff_me.7.man (Macros): Document it. - Fix cross building. Problem reported by Christophe Jarry - . + * tmac/tests/e_ld-works.sh: Add unit test. + * tmac/tmac.am (tmac_TESTS): Run test. - * Makefile.in ($GNULIBDIRS): Pass original config arguments to - src/libs/gnulib/configure. + Fixes . -2011-06-25 Deri James +2021-12-26 G. Branden Robinson - Add new output device `gropdf'. + * tmac/tests/e_chapter-titles-work.sh: Add unit test for chapter + heading feature. + * tmac/tmac.am (tmac_TESTS): Run test. - * font/devpdf/*: New device files for gropdf. - * src/devices/gropdf/*: New device. +2021-12-26 G. Branden Robinson - * Makefile.comm (install_dev, uninstall_dev): Handle more - subdirectories. - * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Add directories - related to gropdf. - * MANIFEST: Updated. - * test-groff.in (GROFF_BIN_PATH): Updated. + * tmac/e.tmac: Ease localization and customization by exposing + strings for "Chapter" and "Appendix" instead of hard-coding + these words into the `$c` macro. + (initialization): Define new `wa` and `wc` strings. Separate + these and existing localization strings from `y2` and `y4` + initialization since the latter don't involve natural languages. + ($c): Interpolate these strings in chapter and appendix headings + and in calls to `$C` hook macro. Set "Chapter" and "Appendix" + in mixed case instead of full capitals, and set one + adjustable nonbreaking word space `\~` between them and the + chapter number instead of two unadjustable nonbreaking spaces. + {These changes do slightly alter the default output of the + package when the `+c` macro is used.} - * tmac/Makefile.sub (NORMALFILES): Updated. - * tmac/pdf.tmac: New file. - * tmac/troffrc: Updated. + * doc/meref.me.in (Predefined Strings): + * tmac/groff_me.7.man (Strings): Document new strings. - * doc/groff.texinfo: Document it. - * doc/Makefile.in, doc/Makefile.sub (groff_bin_dirs): Udpated. - * doc/pic.ms: Updated. + * doc/meintro.me.in (Parts of the Basic Paper): Update example + to reflect mixed-case default string. - * man/groff_out.man, src/devices/grops/grops.man, - src/preproc/pic/pic.man, src/roff/groff/groff.man, - src/utils/afmtodit/afmtodit.man, src/utils/pfbtops/pfbtops.man: - Updated. + Fixes . - * contrib/pdfmark/pdfmark.ms: Updated. +2021-12-25 G. Branden Robinson -2011-07-20 George HELFFRICH + * tmac/e.tmac (@p): Deactivate right alignment (the effect of + groff's `rj` request) when starting a new paragraph. + * doc/meref.me.in (Paragraphing) : Document this. - Improve line numbering support in tbl and with me macros. +2021-12-25 G. Branden Robinson - * tmac/e.tmac (n1, n2, TH, PS): Implement it. - (@h, @n, @o, @t, @k, )b, (c, (q, )q, (l, )l, (f, @q, PE): Updated. - * doc/meref.me: Document changes. + * tmac/e.tmac ()c): Add bounds check to avoid attempting to set + a negative indentation, provoking a troff warning. Problem + exposed by formatting "meintro_fr.me" document with default + nroff mode line length. - * src/preproc/tbl/table.cpp (ROW_START_LINE_REG) - (ROW_SAVE_LINE_REG, ROW_MAX_LINE_REG, REPEATED_NM_SET_MACRO) - (REPEATED_NM_SUS_MACRO): New macros. +2021-12-24 G. Branden Robinson - (table::init_output): Define REPEATED_NM_SET_MACRO and - REPEATED_NM_SUS_MACRO. - (table::print_single_hline, table::print_double_hline, - table::define_bottom_macro, table::do_row, table::do_top, - table::do_bottom): Updated. + [troff]: Slightly refactor (boolify). - * doc/webpage.ms: Updated. + * src/roff/troff/div.cpp: + * src/roff/troff/div.h: + * src/roff/troff/env.cpp: + * src/roff/troff/input.cpp: Rename variables and demote from + `int` to `bool`. Initialize and assign them using Boolean + literals. The new names try harder to express a logical + predicate, and start with verbs to resist interpretation as + noun phrases. + - exit_started -> is_exit_underway + - done_end_macro -> is_end_macro_finished + - seen_last_page_ejector (demoted but not renamed) + - began_page_in_end_macro (demoted but not renamed) -2011-07-12 Ted Harding - Werner LEMBERG +2021-12-20 G. Branden Robinson - * src/preproc/tbl/tbl.man: Mention trick to get abutting rules. + * tmac/e.tmac: Explain presence of undocumented `$r` and `$R` + registers. -2011-07-03 Ben Laurie + Fixes . - Fix clang warnings. +2021-12-20 G. Branden Robinson - * src/libs/libdriver/input.cpp (odd): Use parentheses. + * tmac/e.tmac (bc): To get to the next column, space by the page + length `.p`, not by the distance to the next trap (or 24 inches, + as hard-coded in me(7) traditionally). It is up to any sprung + traps to issue further space requests or otherwise ensure a + transition to the next column. - * src/roff/troff/mtsm.cpp (state_set::is_in): Fix parentheses; - previous code always tested for bit 0. + See for discussion. -2011-07-03 Guillem Jover +2021-12-17 G. Branden Robinson - mdoc: Update more OS versions strings. + * tmac/e.tmac ({): Fix missing scaling unit in arithmetic + expression: broke footnotes in troff mode. Problem introduced + by me in commit 6eafd208, 16 December. Thanks to Robert + Goulding for the (informal) report. - * tmac/doc-common: Add versions strings for NetBSD, OpenBSD, - FreeBSD, and DragonFly. +2021-12-17 G. Branden Robinson -2011-04-08 Michail Vidiassov + * doc/doc.am (doc/{pic,webpage}.html): Quieten build. Stop + passing `-p` (progress) option to postprocessor, which produces + TeX-like bracketed page numbers when images occur. - mdoc: Update various strings related to Mac OS X and FreeBSD. +2021-12-17 G. Branden Robinson - * tmac/doc-common: Add strings for FreeBSD 8.2 and Darwin 9.7-11.0. - * tmac/doc-syms: Add strings -lbsm and -lSystem. + * doc/doc.am (.ms.html): Drop unused suffix rule. -2011-03-29 Christian Weisgerber +2021-12-16 G. Branden Robinson - Fix compilation issues with gcc 2.95. + * tmac/tmac.am (tmac_XFAIL_TESTS): Mark test + "e_footnotes-work-with-columns.sh" as expected to fail (as it + does now, consequent to a reverted commit). - * src/roff/troff/input.cpp (my_input_iterator): Define as an alias - for `input_iterator' which is predefined by an old libstdc++. +2021-12-16 Dave Kemper -2011-03-29 Ingo Schwarze + * man/groff_tmac.5.man: Fix minor errors. - Add another POSIX standard. + Fixes . - * tmac/doc-syms: Add POSIX 1003.1b. +2021-12-16 G. Branden Robinson -2011-03-29 Christian Weisgerber + Parameterize line height adjustment when super/subscripting. - Fix build with non-GNU make. + * tmac/e.tmac (initialization): Assign 0.2m to register `$x`.2m. + ({, <}: Apply adjustment, multiplied by -1 for superscripts. - * Makefile.in ($TARGETS): We must not pass `$MDEFINES' recursively - down to the sub-makes started in src/libs/gnulib, because that - directory has its own values for `$top_srcdir' etc., and - overriding those from the command line will cause the build to - fail. Currently, `$MAKEOVERRIDES' will prevent the recursive - passing of those overrides with GNU make, but not with other - make(1) implementations. It looks like all targets that require - `$MDEFINES' set them explicitly anyway, so we shouldn't need to - set `$MDEFINES' on the top level. + * doc/meref.me.in: + * tmac/groff_me.7.man: Document it. -2011-03-21 Jan Vcelak - Bernd Warken + * NEWS: Add item. + + * doc/meintro.me.in: + * doc/meintro_fr.me.in: + * doc/meref.me.in: Forego extra line height for more attractive + typesetting. + + Fixes . Thanks to Robert + Goulding for the suggestion. + +2021-12-15 G. Branden Robinson + + * tmac/e.tmac ($c): Draw the footnote separator no wider than + the column width. + + Fixes . + +2021-12-15 G. Branden Robinson + + * tmac/e.tmac (2c): Accept an empty first argument, permitting + the number of columns to be specified but preserving the default + column separation. + + Fixes . + +2021-12-12 G. Branden Robinson + + * tmac/e.tmac (initialization): Initialize `$C` hook, preventing + `mac` warnings from troff(1) if chapter title feature is used. + +2021-12-10 G. Branden Robinson + + * tmac/e.tmac (i, bi): Add italic corrections. + +2021-12-09 G. Branden Robinson + + * tmac/e.tmac: Fix groff warnings and correctness issue. + (n2): Prefix `ie` request with `do` because it uses the groff + `\B` escape sequence. Use braces to group multiple requests + after an `el` request: `ie` and `el` count as two requests, not + one. Add comment regarding the unfortunate choice of brace + style given *roff's syntactical constraints. + (n2, (c): Conceal bare tab in request argument list (exposed by + no longer stripping the macro file). + +2021-12-08 G. Branden Robinson + + [me]: Revise diagnostic messages to follow GNU Coding Standards, + identifying what is emitting them. + + * tmac/e.tmac (_e): New string holds "e.tmac". + (@err): New macro constructs and issues diagnostics. Add file + name to messages when available. Suppress line number when + unavailable. + (check_page_length, @z, @h, n2, sk, @p, @(, @), (c, )c, EQ, (f, + ++, @U): Call `@err` instead of invoking `tm` request. Revise + wording of messages in an attempt at clarity. + + Continues the long process of fixing Savannah #52463. + +2021-12-08 G. Branden Robinson + + * tmac/e.tmac: Slightly refactor footnote numbering. + ()f): Tighten code style and end string definition with comment. + (+c, initialization): Drop unused auto-incrementation of + footnote number register `$f`. Add new string `_*` to use when + {re-}initializing `*` outside of a footnote diversion, and + interpolate the footnote number register instead of a literal. + +2021-12-08 G. Branden Robinson + + * tmac/tests/e_footnote-marks-work.sh: Add unit test. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-12-08 G. Branden Robinson + + * tmac/e.tmac: Fix automatic numbering of delayed text. + (initialization): Add `_#` string for use in multiple + assignments of `#` string. + (initialization, pd): Remove unused auto-incrementation from + `$d` delayed text number register. + ()d): Increment `$d` register unconditionally, no longer + conditionally on whether the delayed text marker string `#` has + been interpolated. + ()d, pd): Update `#` string using new `_#` string. Stop + initializing the string with `\k` mark-setting escape sequence. + + * doc/meref.me (Annotations) <)d>: Document now-unconditional + incrementation of `$d` register. + + Fixes . + +2021-12-07 G. Branden Robinson + + * tmac/tests/e_delayed-text-marks-work.sh: Add test. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-12-07 G. Branden Robinson + + * tmac/e.tmac: Rename internal register out of user name space. + (@f): Rename `VL` to `__`; remove it immediately after using it. + +2021-12-07 G. Branden Robinson + + * doc/meref.me: Fix documentation error; the `$s` macro draws a + horizontal line of 2 inches' length, not 1.5 inches. + + Fixes . Thanks to Dave + Kemper for the report. + +2021-12-06 G. Branden Robinson + + Generate me(7) manual sources as part of the build. We had been + shipping 'me' sources with the string '@VERSION@' in them and + only sed-replacing that to produce generated PostScript, but + this replacement was not occurring for users who processed the + documents themselves. + + * doc/meintro.me: + * doc/meintro_fr.me: + * doc/meref.me: Rename these to... + * doc/meintro.me.in: + * doc/meintro_fr.me.in: + * doc/meref.me.in: ...these. + + * doc/doc.am (DOCFILES): Add the new *.in files. Move the *.me + files from here... + (GENERATEDDOCFILES): ...to this new variable. + (dist_otherdoc_DATA, EXTRA_DIST): Add `$(GENERATEDDOCFILES)`. + (doc/me{intro{,_fr},ref}.me): Add new target rules. + + * src/utils/grog/tests/smoke-test.sh: Update test to look for + the above source tree documents under their new names. + +2021-12-06 G. Branden Robinson + + * doc/doc.am (.me.txt, .ms.txt): Drop unused suffix rules. + +2021-12-06 G. Branden Robinson + + * doc/doc.am (DOC_SED): Add substitution of command prefix + {"@g@"} so we can make accurate reference to groff commands with + Unix counterparts in our documentation. + +2021-12-05 G. Branden Robinson + + * tmac/e.tmac: Add nroff mode string definitions for 4.4BSD + compatibility. + - Define '{' and '}' (superscripting) strings as '[' and ']'. + - Define '<' and '>' (subscripting) strings as '\(la and + '\(ra' if available on the device, otherwise '<' and '>'. + + * tmac/tests/e_footnote-marks-work.sh: Update expected output. + + * doc/meref.me: Document it. + + Fixes . + +2021-12-05 G. Branden Robinson + + * doc/doc.am (doc/meintro_fr.ps): Add target rule (overriding + suffix rule) to generate this file using `-mfr` (load the French + localization macro file). + +2021-11-27 G. Branden Robinson + + [troff]: Drop redundant `do_divert()` declaration. + + * src/roff/troff/env.h: Do it. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-11-27 G. Branden Robinson + + [troff]: Remove `DEBUGGING` preprocessor cruft. + + * src/roff/troff/input.cpp: + * src/roff/troff/mtsm.cpp: Stop defining `DEBUGGING` + preprocessor macro (as empty). + + * src/roff/troff/input.cpp: Give `DEBUG_OPTION` an empty string + value if the former is undefined, so the `getopt_long()` call + will compile. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-11-26 G. Branden Robinson + + [tbl]: Slightly refactor table format column modifier `p` and + `v` validation. + + * src/preproc/tbl/main.cpp (process_format): Make code terser by + introducing references to `list->point_size` and + `list->vertical_spacing`. Doing this requires a new scope + {because a switch case isn't one} so add it, without updating + indentation for this commit. When complaining of out-of-range + type size or vertical spacing, report the limit. + +2021-11-25 G. Branden Robinson + + [tbl]: Improve diagnostic messages. + + Revise diagnostic messages generally to use terminology + consistent with the recent rewrite of tbl(1), identify a + contextual token when possible, and communicate more helpfully. + + * src/preproc/tbl/main.cpp (process_options): Tell the user + which region option is missing a closing parenthesis or cannot + accept an empty argument. Refer to region options as such, not + simply "options" (so they can't be confused with command-line + options). Say that input is "invalid" instead of "bad". + (process_format): Say "table format specification" instead of + just "format". Say "column classifier" instead of "format". + When a column modifier is missing an argument or a closing + parenthesis, identify it and refer to it as a "column modifier" + instead of omitting context. Inform user that arguments to `p` + and `v` column modifiers must be "(optionally signed) integer"s, + not "numbers", lower these diagnostics' levels from error to + warning, and indicate that the modifier is ignored. Clarify + diagnostic when extra characters trail `.` at the end of a table + format line. + (process_data): Say "table entry" instead of "data entry" when + discarding an excess one. + (process_table): Say we're giving up on "this table region", not + this "table", particularly since any table continuations (.T&) + are ignored. + +2021-11-25 G. Branden Robinson + + [tbl]: Fix call to `getopt_long()`. + + * src/preproc/tbl/main.cpp (main): Stop telling `getopt_long()` + to look for a `T` option. Continues b4bbf32e, 16 October 2020. + +2021-11-25 G. Branden Robinson + + [tbl]: Tweak usage message. + + * src/preproc/tbl/main.cpp (usage): Document `--version`. Give + version retrieval mode separate synopsis. Use more normative + synopsis syntax. + +2021-11-25 G. Branden Robinson + + [tbl]: Fix code style nits. + + * src/preproc/tbl/main.cpp (process_input_file) + (entry_format::debug_print, process_data, main): Replace + `assert(0)` calls with communicative predicates. + (struct input_entry_format, input_entry_format::debug_print, + process_format): Boolify. Demote and rename `int`s + `last_column` and `equal` to `bool`s named `is_last_column` and + `is_equal_width`. Assign them Boolean literals. + (process_format): Boolify. Demote `have_expand`, `got_format`, + and `got_period` from `int` to `bool`. Use Boolean literals in + assignments thereto. + (process_options): Swap order of null pointer comparison when a + typo or thinko could lead to lvalue assignment. + (process_data): Boolify. Demote `give_up` from `int` to `bool`. + Demote and rename `int` `row_comment` to `bool` + `seen_row_comment`. Use Boolean literals in assignments + thereto. + (main): Use standard C library symbols `EXIT_SUCCESS` and + `EXIT_FAILURE` with `exit()` calls instead of `0` and `1`. + +2021-11-24 G. Branden Robinson + + [grog]: Fix Savannah #61520. + + * src/utils/grog/grog.pl: Move hash `preprocessor_for_macro` to + global scope since it is now mutable across `do_line` subroutine + calls. + (do_line): Adjust regex matching an end macro to work better. + Check names of macros being defined by the document; if they + start with '[' or ']', stop attempting to detect refer(1) usage, + by deleting its key from the `preprocessor_for_macro` hash. + + Fixes . + +2021-11-24 G. Branden Robinson + + [grog]: Add regression test for Savannah #61520. + + * src/utils/grog/tests/avoid-refer-fakeout.sh: Do it. + * src/utils/grog/grog.am (grog_TESTS): Run test. + +2021-11-23 G. Branden Robinson + + * doc/groff.texi (Page Motions): + * man/groff.7.man (Escape short reference): Fix error: the `\r`, + `\u`, and `\d` escape sequences move in ems, not vees, despite + being vertical motions. Add discussion and example. Thanks to + Bjarni Ingi Gislason for pointing out the problem in groff(7) + and Tadziu Hoffman for his lucid explanation. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report and a suggested patch. + +2021-11-20 G. Branden Robinson + + * src/include/error.h: Drop `extern` storage class from + diagnostic function prototypes. Drop parameter names from + prototypes, in keeping with the Stroustrup-style C++ used in + most of groff. + +2021-11-20 G. Branden Robinson + + * src/libs/libgroff/font.cpp (font::load): Update diagnostic + messages to say "kerning pair" instead of "kern pair". + +2021-11-20 G. Branden Robinson + + * src/roff/troff/input.cpp (read_size): Update diagnostic + messages to use more normative language: say "type size" instead + of "point-size", and "escape sequence" instead of "escape". + * src/roff/groff/tests/\ + use_point_size_escape_with_single_digit_arg.sh: Update expected + diagnostic wording in text. + +2021-11-20 G. Branden Robinson + + * src/roff/troff/input.cpp (read_size): Boolify. Update + prototype. Demote return type from `int` to `bool`. Use + Boolean literals for return values. Similarly demote local + variable, rename it from `bad_digit` to + `contains_invalid_digit`, and use Boolean literals with it. + +2021-11-16 Deri James + + * src/devices/gropdf/gropdf.pl: Fixes to importing pdf versions + > 1.4. + +2021-11-15 G. Branden Robinson + + [tbl]: If "nowarn", suppress table row warning. + + * src/preproc/tbl/table.cpp (table::init_output): Bracket the + generated groff code that emits a warning if a table row + overruns a page location trap (usually, is too long to + vertically fit on the page) in a test for whether the "nowarn" + region option was given, so that this warning is suppressed as + well when that option is used. + * src/preproc/tbl/tbl.1.man (Region options): Document new + "nowarn" behavior. + + {"nokeep" also suppresses this warning, for a different reason; + no diversion is created to hold the table row, so its vertical + size does not exist to be compared to the distance to the next + page trap.} + + Fixes . + +2021-11-13 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::do_vspan): Fix code style + nits. Swap order of null pointer and zero equality comparisons + when a typo or thinko could lead to lvalue assignment. Break a + series of 6 and-ed assertion predicates into separate `assert()` + calls--sure to be less maddening for anyone who has to debug + such a contingency. Clarify comment since C++98 didn't yet have + `nullptr`. + +2021-11-13 G. Branden Robinson + + [m4]: Clean up shell variable quoting and bracing. + + * m4/groff.m4 (GROFF_PROG_YACC, GROFF_MAKEINFO) + (GROFF_BROKEN_SPOOLER_FLAGS, GROFF_TARGET_PATH_SEPARATOR): Stop + bracing shell variable expansions that don't require it; the + shell is not make(1). + (GROFF_PROG_YACC, GROFF_MAKEINFO): Double-quote shell variable + expansions that might produce whitespace. + (GROFF_MAKEINFO): Drop unnecessary leading zeroes from version + number component construction. Drop unnecessary escaping of + plus sign in expr(1) input. + +2021-11-13 G. Branden Robinson + + [m4]: Clean up test(1) usage. + + Get rid of string (non-)nullity tests and comparisons involving + concatenation with garbage (usually "x"). Even the GNU Autoconf + manual's shell portability material doesn't recommend this. It + must be either a bodge cooked up by shell programmers who + couldn't remember to quote variable expansions, or a workaround + for shells of such poor quality that they defied the odds and + decayed out of usage or got fixed. + + Instead, use double quotes (only where necessary). Test for + non-empty strings with "test -n" and empty strings with "test + -z". Stop quoting literal comparands that obviously have no + shell metacharacters in them. + + * m4/groff.m4 (GROFF_PRINT, GROFF_PROG_YACC, GROFF_PERL) + (GROFF_DOC_CHECK, GROFF_MAKEINFO, GROFF_TEXI2DVI) + (GROFF_HTML_PROGRAMS, GROFF_PDFDOC_PROGRAMS, GROFF_PAGE) + (GROFF_TMAC, GROFF_WITH_COMPATIBILITY_WRAPPERS, GROFF_X11) + (GROFF_APPRESDIR_DEFAULT, GROFF_APPRESDIR_CHECK) + (GROFF_HAVE_TEST_EF_OPTION, GROFF_BASH, GROFF_UCHARDET) + (GROFF_UCHARDET_CHECK, GROFF_PDFTOOLS) + (GROFF_USE_GROFF_ALLOCATOR): Do it. + +2021-11-12 G. Branden Robinson + + * m4/groff.m4 (GROFF_TEXI2DVI): Add dependency on + `GROFF_MAKEINFO` macro. Rewrite to also test `MAKEINFO` + variable, which is empty if the `makeinfo` command is not + installed or too old. Consequently ignore `texi2dvi` if is too + old without having to do a version check (since it and + `makeinfo` are distributed together, both being part of GNU + Texinfo). + + * doc/doc.am (.texi.dvi, .texi.pdf): Update error message to + indicate that `texi2dvi` is _either_ missing or too old. + +2021-11-12 G. Branden Robinson + + * m4/groff.m4 (GROFF_MAKEINFO): Stop throwing a warning if the + installed `makeinfo` is old but the distributed Info manual is + up to date. This is not a configure-time problem; the user will + be notified when they run 'make' if they modify doc/groff.texi, + or if they run 'make doc' (which has required a TeX installation + for years). Empty the `MAKEINFO` variable immediately if a + too-old version is detected. Drop needless `AC_SUBST`itution of + the detected `makeinfo` version. + +2021-11-12 G. Branden Robinson + + * m4/groff.m4 (GROFF_HTML_PROGRAMS): Clarify message; it is only + groff-generated HTML that is disabled by the absence of the + programs checked for. (`makeinfo` can still generate our + Texinfo manual in HTML format.) + +2021-11-11 G. Branden Robinson + + [build]: Drop `BUILD_INFODOC` symbol. Ship manual in GNU Info, + text, and HTML forms in distribution archive. + + * Makefile.am (MAINTAINERCLEANFILES): Initialize. + (MOSTLYCLEANADD): Drop unused variable. + * configure.ac: Drop `AM_CONDITIONAL([BUILD_INFODOC]...`. + * doc/doc.am (EXTRA_DIST): Rearrange shipment of our Texinfo + manual source files to precede all of the generated forms, for + clarity. Drop all `BUILD_INFODOC` conditionals. Make + `build_infodoc` phony target depend on plain text, GNU Info, and + HTML forms of Texinfo manual unconditionally. Also drop unused + variables `groffinfodir`, `groffpdfdir`, and `texi2dvi_missing`. + (EXTRA_DIST, MAINTAINERCLEANFILES): Add Info form of manual. + Drop glob pattern attempting to match the segments that + `makeinfo` breaks it into. It isn't necessary for + MAINTAINERCLEANFILES. + (EXTRA_DIST, MAINTAINERCLEANFILES): Add text form of manual. + (EXTRA_DIST, MAINTAINERCLEANFILES): Add HTML form of manual. + (dist-hook): Depend on new (phony) target `dist-info-bits`. + (dist-info-bits): Look for the info document in the build + directory, then the source directory. (It could be in either + place depending on whether the build from a Git working tree is + being done in or out of a separate build directory.) When + found, copy the segments to the assembly area for the + distribution archive. + (install_infodoc): Refactor. Remove any groff info files from + the destination info directory using a shell glob directly + instead of a partly redundant ls(1) command substitution. + Similarly, use a shell glob to cp(1) the info files (including + any matched segments) to the destination info directory before + running `install-info`. (In this process I learned that + `install-info` doesn't "install" anything; instead, it + {de-}registers info files with their top-level catalog.) + +2021-11-11 G. Branden Robinson + + * doc/doc.am (.texi.txt, .texi.html): Reorder pattern rules to + make it clearer which formats require only `makeinfo` and which + require `texi2dvi`. The latter imposes more build dependencies, + including a full TeX installation. + +2021-11-11 G. Branden Robinson + + [mom]: Build more quietly. + + * contrib/mom/mom.am (penguin.{ps,.pdf}): Make targets quiet by + default; they are simple file copies. + +2021-11-11 G. Branden Robinson + + [tests]: Revise a test's setup. + + * src/roff/groff/tests/fp_should_not_traverse_directories.sh: + Revise search for device/font description directory to work in + within-source-tree builds and (for now) with the approach used + by Automake's "distcheck" target. + +2021-11-10 G. Branden Robinson + + [tbl]: Accept `\&` as an empty table entry. + + * src/preproc/tbl/table.cpp (table::add_entry): Suppress + diagnostic about non-empty table entries classified as `_` or + `=` if the entry consists of exactly `\&`. + + * src/preproc/tbl/tbl.1.man (Table data): Document this idiom. + +2021-11-10 G. Branden Robinson + + [tbl]: Update diagnostic messages. + + * src/preproc/tbl/main.cpp (process_options, process_format): + * src/preproc/tbl/table.cpp (table::add_entry): Align diagnostic + text with terminology now used in tbl(1) man page. + - "global option" -> "region option" + - "specifier" -> "column modifier" + - "format" -> "column classifier" + +2021-11-10 G. Branden Robinson + + [libgroff]: Fix missing colon in diagnostic messages. + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + Restore missing colon to diagnostic text. Problem introduced by + me in commit 9a038161, 8 November. + +2021-11-09 G. Branden Robinson + + [libgroff,grops]: Slightly refactor. + + * src/devices/grops/ps.cpp: Explicitly preprocessor-include + "lib.h" since we use the `PI` symbol it defines. + + * src/include/lib.h: Add inclusion guard. Wrap only `extern "C" + and its braces in preprocessor conditionals, so that prototypes + are present in the header even for C language code that + #includes this header. Add `static` storage class to `PI` + symbol to avoid redefinition errors from the linker. + + * src/libs/libgroff/iftoa.c (if_to_a): + * src/libs/libgroff/itoa.c (i_to_a, ui_to_a): Add `const` type + qualifier to function definitions for agreement with prototypes + in "lib.h". Drop local copies of prototypes. + +2021-11-09 G. Branden Robinson + + [libgroff]: Centralize definitions of {U,}INT_DIGITS. + + * src/libs/libgroff/iftoa.c: + * src/libs/libgroff/itoa.c: Move definitions of `INT_DIGITS` and + `UINT_DIGITS` from here... + * src/include/lib.h: ...to here. + + * src/libs/libgroff/iftoa.c: + * src/libs/libgroff/itoa.c: Preprocessor-include "lib.h". This + revealed missing guards around `extern "C"` declarations, so... + + * src/include/lib.h: Add them where necessary. + +2021-11-09 G. Branden Robinson + + * tmac/an.tmac (OP): Fix code style nits. Don't quote macro + arguments unnecessarily. Use consistent backslashing. Use + groff font escape sequence syntax. Use adjustable non-breaking + space escape sequence instead of a non-adjustable one. + Parenthesize numeric expression for better readability. + +2021-11-09 G. Branden Robinson + + [libgroff]: Make allocator replacement optional. Switch it + off by default, relying on C++ runtime new/delete support. + + * configure.ac: Call new `GROFF_USE_GROFF_ALLOCATOR` m4 macro. + Use `AM_CONDITIONAL` to set Automake variable + `USE_GROFF_ALLOCATOR` if appropriate. Report whether the + allocator is used in configure script output summary. + * m4/groff.m4 (GROFF_USE_GROFF_ALLOCATOR): Define new macro to + collect user preference. The default is off. + * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Build and + link new.cpp only if we are to `USE_GROFF_ALLOCATOR`. + + * NEWS: Add item. + +2021-11-09 G. Branden Robinson + + * m4/groff.m4 (GROFF_TMAC): Report a human-readable message if + no system tmac prefix is found, instead of leaving the ellipsis + hanging. + +2021-11-09 G. Branden Robinson + + * m4/groff.m4 (GROFF_TMAC): Use separate shell variable for + `AC_MSG_RESULT()` content since the human-readable string we + populate it with in the empty case is not appropriate for later + `AC_SUBST()`-itution. Problem introduced by me in commit + 19670348, 31 October. + +2021-11-09 G. Branden Robinson + + * tmac/tmac.am (MOSTLYCLEANFILES): Remove `$(TMACMDOCFILES)`. + This variable, formerly named `TMACMDOCSTRIPFILES`, should not + be used in a clean target because its contents are (no longer) + generated files. Problem introduced by me in commit 24602f42, 4 + July (only noticeable in within-source-tree builds). + +2021-11-08 G. Branden Robinson + + [libgroff,pic]: Check `strdup()` return value. + + * src/libs/libgroff/font.cpp (struct text_file): Add `fatal()` + member function. + (text_file::fatal): Implement it. + + * src/libs/libgroff/font.cpp (font::load_desc): + * src/preproc/pic/troff.cpp (troff_output::set_location): Die if + `strdup()` returned a null pointer. + +2021-11-08 G. Branden Robinson + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + Revise to eliminate `fprintf()` calls, which might perform + dynamic memory allocation, rendering this function unsafe to + call after memory allocation failures. Since this function is + near the top of our diagnostic output call stack, that would be + unfortunate. `errprint()` does not use dynamic allocation, nor + do the `i_to_a()` and `ui_to_a()` functions it calls to format + integers. + +2021-11-08 G. Branden Robinson + + * configure.ac: Add `strdup` to AC_CHECK_FUNCS since we are + using it and the whole point of libgroff's `strsave()` was to + get along without it. But `strdup` has been standardized in + POSIX for 20 years (SUSv3, POSIX:2001) and is on its way into + ISO standard C (N2353) and C++ (P2391R0) as well. + +2021-11-08 G. Branden Robinson + + * src/libs/libgroff/strsave.cpp (strsave): Call `strcpy()` only + if `malloc()` did not return a null pointer. Problem noted by + Ingo Schwarze. + +2021-11-07 G. Branden Robinson + + * src/libs/libgroff/fontfile.cpp (font::open_file): Don't open + user-specified font file names with slashes in them; i.e., don't + traverse directories outside the configured font path. Also + refuse to open the file if the `sprintf()` used to construct its + file name doesn't write the expected quantity of bytes to the + destination buffer. + + Fixes . Thanks to Ingo + Schwarze for feedback. + +2021-11-07 G. Branden Robinson + + [libgroff]: Regression-test Savannah #61424. + + * src/roff/groff/tests/fp_should_not_traverse_directories.sh: Do + it. + * src/roff/groff/tests/artifacts/HONEYPOT: Add test artifact. + * src/roff/groff/tests/artifacts/devascii/README: ...and this; + we need a directory to make the test work but empty ones tend to + look unintentional. + * src/roff/groff/groff.am (groff_TESTS): Run test. + (EXTRA_DIST): Ship artifacts. + +2021-11-06 G. Branden Robinson + + [libgroff]: Fix diagnostic error wording. + + * src/libs/libgroff/font.cpp (font::load): Fix diagnostic + message; this is issued when an unrecognized directive is + encountered, so it necessarily occurs _before_ any `charset` or + `kernpairs` directive. Give the user a hint accordingly. + +2021-11-06 G. Branden Robinson + + [man]: Fix paragraph tag regressions. + + * tmac/an-ext.mac (UR, MR): Only create an environment and + diversion if we're not already in one of the latter. If we are + {in groff man, this occurs only when collecting a `TP` paragraph + tag}, then typeset the URI as part of the indented paragraph. + (UE, ME): Pop the diversion and environment stacks only if we + pushed them in the first place. Eliminate spurious space in + post-URI arguments by only typesetting excess macro parameters + if there were any. + +2021-11-05 G. Branden Robinson + + [man]: Regression-test Savannah #61425. + + * tmac/tests/an-ext_link-macros-work-in-paragraph-tags.sh: Do + it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-11-05 G. Branden Robinson + + * tmac/s.tmac (DS): Drop a redundant unconditional break; every + display macro we call in the event of a valid call already + breaks the line, and it's polite to not break if we're given an + invalid argument. Emit a diagnostic error if the argument we're + given is invalid, and immediately end the diversion we just + opened. + +2021-11-04 G. Branden Robinson + + * src/roff/troff/env.cpp (environment::set_font): Clarify + diagnostic warning. + +2021-11-04 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::add_entry): If we see a '\^' + entry on the first row of a table, it's invalid, but we need to + create an empty entry in its place. Otherwise, someone can put + another '\^' right below the one on the first row, creating a + reference to a nonexistent table entry and provoking a SEGV. + Issue an error diagnostic (distinct from the one in + `do_vspan()`), create the entry, and skip `do_vspan()` (given a + '^' in a first-row definition, it issues an error diagnostic and + returns early, which suffices). Problem appears to date back to + groff 1.02 (June 1991) at the latest. + + Fixes . + +2021-11-04 G. Branden Robinson + + [tbl]: Regression-test Savannah #61417. + + * src/preproc/tbl/tests/\ + do-not-segv-on-invalid-vertical-span-entry.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. + +2021-11-02 G. Branden Robinson + + [man]: Fix Savannah #61408. + + * tmac/an.tmac (an-prepare-inner-footer): Don't try to get a + substring of an empty string; the man page author might not have + specified a third argument to `TH` (or supplied an empty one). + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-11-02 G. Branden Robinson + + [man]: Add regression test for Savannah #61408. + + * tmac/tests/an_inner-footer-abbreviation-works.sh: Do it. + +2021-11-02 G. Branden Robinson + + [man]: Tweak computation in URI breaking. + + * tmac/an-ext.tmac (UE, ME): Stop adding the page offset `.o` + when performing the available horizontal space computation for + the typeset URI string. This made no difference on nroff + devices (grotty; even with `.po 15n`), but it caused the + breaking decision to be too conservative on troff devices + {grops}, forcing some URIs that would fit on the current line to + the next one. + + * tmac/tests/an-ext_UE-breaks-before-long-URIs.sh: Add test of + URI with no link text, which also has break points after every + character, so that we detect even slight alterations. + +2021-11-02 G. Branden Robinson + + [libgroff]: Do more device and font description file validation, + resolve an assertion failure arising from a negative declared + device resolution, and correct a documentation error. + + * src/libs/libgroff/font.cpp (font::load): Include more + information about invalid input in diagnostic messages. + - When a kern pair's amount is missing or invalid, report the + name of the kern pair. + - When someone tries to declare the first entry in the charset + section as an alias, report the glyph name. + - Identify the token for the unnamed character if an attempt + is made to alias it. + - When an out-of-range character type is applied to a glyph, + name the glyph. + (font::load_desc): Same. + - Drop redundant zero initialization of `res`. + - Check all directives that take basic units for positive + values, adding `res`, `unitwidth`, `paperwidth`, and + `paperlength`. Update this diagnostic to demand positive, + not nonnegative, values. + - When the font count is long in a `fonts` directive, report + how many font names were declared (and thus expected). (If + the count is short, the next line is read for a font name, + like 'tcommand' in our devutf8/DESC.) + - When interpreting a `papersize` directive, throw an error + and return false if `res` has not yet been encountered, + since it is used in subsequent computations. + - When a paper format cannot be determined, report the + original declared value from the DESC file. Use `strdup()` + to save it since it gets clobbered by the resolving process. + `free()` the saved string when we're done, regardless of + error condition. + + * doc/groff.texi (Device and Font Files): + * man/groff_font.5.man (DESC file format): Document additional + exception to order-indifference of directives: (at least one) + `res` must precede `papersize`. + + Fixes . + +2021-11-01 G. Branden Robinson + + * src/devices/grohtml/post-html.cpp + (html_printer::do_file_components): Add assertion. - [groffer] Remove hardcoded path to 'libdir/groff/groffer' - directory. +2021-11-01 G. Branden Robinson - * configure.ac: add GROFFERDIR variables. + * src/devices/grops/ps.cpp (usage): Document -p and --version + options. - * Makefile.in: add and handle variable groffer_dir +2021-10-31 G. Branden Robinson - * m4/groff.m4: set up the --with-grofferdir command line option. + * tmac/mdoc/doc-nroff (doc-setup-page-layout): Set the title + length to the device line length (register `.l`) if register + `LT` is not defined. This keeps the title length from being set + to 78n when the line length is not, preventing the output from + looking silly. -2011-03-18 Werner LEMBERG +2021-10-31 G. Branden Robinson - [troff] Improve error message. + * src/preproc/tbl/main.cpp (main): Emit groff code to define + macro `T&` as empty if it is not already defined. (All of our + full-service macro packages [except mdoc(7)] already do this, so + there's no change in semantics; mom(7) even defines it as an + empty _string_.) - * src/roff/troff/input.cc (token::delimiter): Improve error - message. Suggested by Doug McIlroy . +2021-10-31 G. Branden Robinson -2011-03-04 Werner LEMBERG + * src/roff/groff/tests/string_case_xform_requests.sh: Migrate + test to POSIX shell, dropping use of process substitution (a + Bashism). Also rewrite to stop using a here document within a + command substitution, mainly for paranoia. - [mdoc] Within .An, .Aq, .Ao, and .Ac now use `<' and `>'. - Problem reported by Ulrich Spörlein + * src/roff/groff/tests/string_case_xform_requests.sh: + * src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh: Update + shebang lines to use /bin/sh as the interpreter. - * tmac/doc.tmac (Aq, Ao, Ac): Implement it to follow RFC 822 and - RFC 2822. +2021-10-31 G. Branden Robinson + + * src/devices/grops/ps.cpp (encode_subfont): Update assertion to + check for `sub` parameter being a null pointer rather than + `sub->glyphs`; the latter is a member array of a `subencoding` + struct so it can't be a null pointer. (`glyphs` is an array of + pointers to `const char`; the _elements_ of the array can [and + are initialized to] be null pointers, but the address of the + array itself will never be in a C/C++ implementation.) Detected + by Clang 13's "-Wtautological-pointer-compare". -2011-02-14 Werner LEMBERG +2021-10-31 G. Branden Robinson - * doc/groff.texinfo: Add another example for .em request - Based on a patch from Anton Shepelev . + * src/libs/libgroff/new.cpp (delete): Declare `throw()` (no + exceptions thrown); quiets "-Wimplicit-exception-spec-mismatch" + from Clang 13. -2011-01-31 Werner LEMBERG +2021-10-31 G. Branden Robinson - More fixes for Savannah bug #32301. + * m4/groff.m4: Fix messaging nits. + (GROFF_MAKEINFO): Set `missing` to "missing 'makeinfo'" for + consistency with other assignments to `missing`. + (GROFF_TMAC): Utter an intelligible result in the configure + check when no system macro files requiring groff wrapping are + located. + +2021-10-30 G. Branden Robinson + + [troff]: Handle special character escape sequences that map to + basic Latin glyphs in device control escape sequences + consistently among output devices. + + * src/roff/troff/input.cpp (encode_char): Rearrange + conditionals. This is the logic that puts the "whatever" within + a \X'whatever' escape sequence into GNU troff's intermediate + output. Handle adjustable and nonadjustable space escape + sequences ("\~" and \ ") first. Then, if the token is a special + character escape sequence, retrieve its "contents" (glyph name). + Move the basic Latin mapping for the seven glyph names '-', + 'aq', 'dq', 'ga', 'ha', 'rs', and 'ti' here, before checking + whether the device description issued the + 'use_charnames_in_special' directive. This way, the 'html' and + 'xhtml' output devices can straightforwardly embed these basic + Latin characters in device control escapes (notably, "html:", + for which the present convention is to follow the this tag + immediately with a literal HTML URI, complete with `` + element syntax). If the special character is none of these and + we should 'use_charnames_in_special', proceed as groff 1.22.4 + and earlier did. This is a behavior change, as was my addition + of this translation mechanism in the first place, so... + + * doc/groff.texi (Postprocessor Access): Document it. + + * src/roff/groff/tests/\ + device_control_escapes_express_basic_latin.sh: Test it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + Fixes . + +2021-10-30 G. Branden Robinson + + [troff]: Map \[ti] correctly in device control escape sequences. + + * src/roff/troff/input.cpp (encode_char): Fix copy-and-paste + error. \[ti] should put '~', not '^', into a device control + command. + + Fixes ; problem introduced + by me in commit 9d61b3d1, 1 October. + +2021-10-30 G. Branden Robinson + + [man]: Handle degenerate input quietly. + + * tmac/an.tmac (TH): Define new register `an-TH-was-called`. + (an-end): Return immediately if that register is not defined; + to format the default page footer we must have the information + declared in a valid `TH` call. (`TH` also initializes the type + size and baseline spacing registers we use to prepare the page + footer environment.) If the register _is_ defined, remove it + just prior to the end of this macro definition, in preparation + for next page to be rendered. + + * tmac/tests/an_handle-degenerate-input-quietly.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes , a regression from + groff 1.22.4 (problem introduced by me in the course of many + changes to trap management and header/footer handling to work + nicely in batch rendering with -mandoc and mdoc(7) documents). + +2021-10-28 G. Branden Robinson + + [man]: Warn if `TE` table macro called but `TW` register (set by + tbl(1)) undefined. Arrange it so that we warn only once per + man(7) document, not per table region. + + * tmac/an.tmac (TH): Remove `TW` register when processing new + document and clear `an-was-tbl-failure-reported` register. + (TE): Check `TW` and `an-was-tbl-failure-reported` registers; if + the former is undefined and the latter false, emit the message + and set `an-was-tbl-failure-reported`. + + Addresses part of . + Thanks to Bjarni Ingi Gislason for the suggestion. + +2021-10-28 G. Branden Robinson + + [tests]: Improve portability. + + * src/devices/grotty/tests/osc8_works.sh: Fix typo in test. + Multiple regex quantifiers after an atom were not flagged with a + diagnostic by GNU grep 3.3, but were by BSD grep 2.5.1-FreeBSD. + + * src/roff/groff/tests/smoke-test_html_device.sh: Stop trying to + set $LC_CTYPE to "C.UTF-8"; some systems don't support this + expediency. Skip the test if the tester hasn't configured the + environment adequately. + + * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Fix + portability problems exposed by FreeBSD sed (which version is + unclear). {1} Use POSIX BREs, dropping use of '+' quantifier. + {2} Add semicolons to terminate commands before braces on the + same line. Simplify surrounding test structure. + * tmac/tests/e_footnotes-work-with-columns.sh: Fix same two sed + problems. + * tmac/tests/andoc_flush-between-packages.sh: + * tmac/tests/doc_accept-mixed-case-section-headings.sh: + * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh: Fix same + sed semicolon problem. + + * src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh: Rewrite + test to stop using a here document (containing an unpaired + single quote) inside a command substitution, which is broken in + GNU Bash 3.2 and some other versions. Instead construct the + input with printf(1). Also gets rid of a Bashism (process + substitution) that Ingo pointed out years ago. + * src/utils/grog/tests/recognize-perl-pod.sh: Same problem, + different solution. The Perl POD output is far too large to + construct programmatically, so move it into an external file... + * src/utils/grog/tests/foo.man: ...here. + * src/utils/grog/grog.am (EXTRA_DIST): Ship new test artifact. - * src/devices/grops/Makefile.sub (XLIBS), - src/devices/grodvi/Makefile.sub, src/devices/grolj4/Makefile.sub, - src/devices/grohtml/Makefile.sub, src/devices/grolbp/Makefile.sub: - Add $(LIBGNU). +2021-10-27 G. Branden Robinson -2011-01-31 Werner LEMBERG + * doc/doc.am: Make sed-based insertion of `lf` requests more + portable: a dance is required to embed a literal newline inside + a sed expression inside a shell command executed as part of a + Make target rule. We assume that neither the POSIX shell $'' + operator nor a working printf(1) is available. + (DOC_GROFF): Define a shell variable containing a literal + newline, evading make(1) and echo(1)'s valiant attempts to + consume it. + (doc/pic.html, doc/webpage.html): Repeat trick, slightly + modified since the dependency needs to be manually identified. - Fix Savannah bug #32301. + Solution adapted from the GNU Autoconf manual, "Newlines in Make + Rules". - * src/roff/groff/Makefile.sub (XLIBS), - src/preproc/grn/Makefile.sub, src/preproc/html/Makefile.sub: Add - $(LIBGNU). + Fixes . Thanks to John + Gardner for the report. -2011-01-29 Krzysztof Żelechowski +2021-10-26 G. Branden Robinson - * doc/groff.texinfo: Complete documentation on output devices. + * tmac/an.tmac (TH): Stop populating `an-extra3` (the default + center header) if the section argument is "3p". "3p" does not + always mean a Perl-related man page; Debian- and Arch + Linux-based systems[1][2] (at least) have long used a "3perl" + suffix, while OpenBSD appears to still use "3p" for Perl[3], + which is also used by the POSIX man page distribution[4]. + Fortunately, Perl and POSIX are reliable at providing a fifth + argument to `TH` anyway, so our fallback is as unnecessary as it + is non-impartial. + * tmac/groff_man.7.man.in (Document structure macros) : + De-document the above behavior. -2011-01-28 Werner LEMBERG + [1] https://manpages.debian.org/bullseye/perl-doc/\ + Pod::Man.3perl.en.html + [2] https://man.archlinux.org/man/Pod::Man.3perl + [3] https://man.openbsd.org/man3p/Pod::Man.3p + [4] https://man7.org/linux/man-pages/man3/system.3p.html - Handle `refer*.tmac'. +2021-10-26 G. Branden Robinson - * tmac/Makefile.sub (NORMALFILES): Add `refer*.tmac'. - * tmac/refer-mm.tmac: Moved to contrib/mm. + [man]: Abbreviate the inside footer if necessary. -2011-01-28 Werner LEMBERG + * tmac/an.tmac (an-prepare-inner-footer): Prevent the inside + footer from overrunning the center footer. + (BT): Use new string `an-ifoot` instead of `an-extra2` in page + footers. - Improve `refer' support of -me. + Fixes . - * tmac/refer.tmac, tmac/refer-me.tmac, tmac/refer-ms.tmac, - tmac/refer-mm.tmac: New files. The code in refer.tmac is - based on the old code from `s.tmac'. +2021-10-26 G. Branden Robinson - * tmac/s.tmac: Remove direct refer support and include - `refer-ms.tmac' instead. - * tmac/e.tmac: Remove direct refer support and include - `refer-me.tmac' instead. + Add regression test for Savannah #61386. - * NEWS: Updated. + * tmac/tests/an_inner-footer-abbreviation-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. -2011-01-22 Werner LEMBERG +2021-10-26 G. Branden Robinson - [groff.texinfo]: Updates. + * man/groff_char.7.man (Description, Special character escape + forms): Document the `\C` escape sequence. Fix error: \[a] is + _not_ "translated to \a, the uninterpreted leader escape + sequence," but requests a glyph _named_ '\a' internally--it + appears thus in diagnostic messages and, importantly, in the + font description files defining special character glyph names. - * doc/groff.texinfo: Document groff's `-j' option. - Add dummy section for `chem' preprocessor. +2021-10-25 G. Branden Robinson + + * tmac/an.tmac: Refactor to reduce repetition. + (an-break-paragraph): New macro handles paragraph-breaking tasks + previously duplicated. + (SH, SS, P, TP, IP, HP): Call it rather than issuing its + constituent requests. + +2021-10-25 G. Branden Robinson + + * tmac/an.tmac (TP): Reset type size, vertical spacing, and font + to defaults before setting the new paragraph. + + Fixes . + +2021-10-24 G. Branden Robinson + + * doc/groff.texi (Auto-increment): Fix error; the `\R` escape + sequence does _not_ support an auto-incrementation amount. + * man/groff_out.5.man (Command reference/Simple commands): Fix + erroneous claim: 'N' is not a GNU roff extension; it appears on + page 27 of CSTR#54 (1992). + +2021-10-24 Keith Marshall + + [ms]: Provide global default XH and XN implementations. + + cf. + + * tmac/s.tmac (XH-INIT, XN-INIT, XH-UPDATE-TOC) + (XH, XN, XH-REPLACEMENT, XN-REPLACEMENT): Implement them, and... + * tmac/groff_ms.7.man: ...document them. + +2021-10-24 Keith Marshall + + [ms]: Fix misleading NH macro indentation. + + * tmac/s.tmac (@NH) [.T is html]: .if statement should exhibit + same indentation as preceding .DEVTAG-NH statement, but is + overindented; fix it. + +2021-10-23 Keith Marshall + + [ms]: Defend against uncontrolled page trap recursion. + + * tmac/s.tmac (pg@top) [HM+FM+.V>.p]: Diagnose insufficient page + length, and abort; cf. + +2021-10-21 G. Branden Robinson + + [groff]: Fix code style nits. + + * src/roff/groff/groff.cpp (main, help): Use standard C library + preprocessor symbols `EXIT_SUCCESS` and `EXIT_FAILURE` instead + of 0 and 1 literals, respectively. See commit fa4c27e9, 7 + September. + (main): Replace `assert(0)` with a communicative predicate. + +2021-10-21 G. Branden Robinson + + * src/devices/grotty/tty.cpp (tty_printer::special_link): + Eliminate casts by retyping `uri` and `pair` to pointers to + `const char`s. + +2021-10-21 G. Branden Robinson + + * tmac/tmac.am: Build more quietly. + (tmac/stamp-wrap): Prefix all rule commands with `$(AM_V_at)`; + since this target is a stamp file instead of a useful artifact + to be distributed, make its creation completely silent by + default. + +2021-10-21 G. Branden Robinson + + * src/roff/troff/troff.am: Build more robustly. + (src/roff/troff/majorminor.cpp): Drop progress-reporting `echo` + in favor of prefixing final rule command with `$(AM_V_GEN)`. + Prefix earlier rule commands with `$(AM_V_at)`. Use `printf` + instead of `echo` to build the file, and create a temporary file + at first so that we don't race with the compiler on parallelized + builds. + +2021-10-21 G. Branden Robinson + + * src/preproc/eqn/eqn.am (neqn): Simplify: drop removal of + target prior to overwriting it; any system we can build groff on + should have a shell that implements the clobbering semantics of + the POSIX shell '>' operator. (If this isn't true, we have + _many_ other target rules in our build to which we must add + prefatory `$(RM)`s, or I miss my guess.) + +2021-10-21 G. Branden Robinson + + * src/libs/libgroff/libgroff.am: Build more quietly and + robustly. + (src/libs/libgroff/version.cpp): Drop progress-reporting `echo` + in favor of prefixing final rule command with `$(AM_V_GEN)`. + Prefix earlier rule commands with `$(AM_V_at)`. Use `printf` + instead of `echo` to build the file, and create a temporary file + at first so that we don't race with the compiler on parallelized + builds. Drop nilpotent sed transformation; this looks like a + relic of past times when we'd drop a trailing ".0" from the + version number stored in the C symbol `Version_string`. + (charset.alias, ref-del.sed, ref-add.sed): Prefix rule command + with `$(AM_V_GEN)`. + +2021-10-21 G. Branden Robinson + + * src/devices/xditview/xditview.am: Build more quietly. + (src/devices/xditview/GXditview-ad.h): Drop progress-reporting + `echo` in favor of prefixing rule command with `$(AM_V_GEN)`. + +2021-10-21 G. Branden Robinson + + * font/devpdf/devpdf.am: Build more quietly. + (font/devpdf/enc/text.enc, font/devpdf/map/symbolmap, + $(DEVPDFFONTMAP_1)): Prefix all rule commands with + `$(AM_V_at)`; since these are all `mkdir`s and `cp`s, I reason + that little can go wrong with them that won't be disclosed by + these tools' own diagnostic messages, so they are insignificant + from a perspective of build progress. + +2021-10-21 G. Branden Robinson + + * doc/doc.am: Build more quietly. + (doc/examples.stamp): Prefix all rule commands with + `$(AM_V_at)`; since this target is a stamp file instead of + a useful artifact to be distributed, make its creation + completely silent by default. + (doc/groff.info, .texi.txt): Prefix directory creation with + `$(AM_V_at)` and `makeinfo` command with `$(AM_V_GEN)`. + (.texi.dvi, .texi.pdf): Prefix directory creation with + `$(AM_V_at)` and `makeinfo` command with `$(AM_V_GEN)`. Send + diagnostic message to standard error if `texi2dvi` is + unavailable. + (.texi.html): Prefix directory creation with + `$(AM_V_at)`. Two HTML versions are produced, in split and + unsplit versions; prefix one `makeinfo` command with + `$(AM_V_GEN)` and the other with `$(AM_V_at)` so that only one + message is produced. + (gnu.eps): Drop useless/noisy `echo` command. Prefix copy + operation with `$(AM_V_at)`. Send diagnostic messages to + standard error if there are problems with the Netpbm tools. + + (MOSTLYCLEANFILES): The `mostlyclean` target was leaving a file, + `groff.info-3`, behind in the build tree. At some point our + Texinfo manual grew beyond earlier expectations. Use a glob + `[0-9]` instead (giving a hostage to fortune that `makeinfo` + will never split our manual into more than nine chunks). + +2021-10-21 G. Branden Robinson + + * arch/misc/misc.am: + (arch_shdeps_sh): Pull file name into a new variable. + (EXTRA_DIST, shdeps.sed): Use it. + (shdeps.sed): Build more quietly; prefix with `$(AM_GEN_V)`. + +2021-10-20 G. Branden Robinson + + [nroff]: Support groff's -R flag to run refer(1). + + There's no reason not to support calling `refer` with nroff-mode + documents; typographically, it's less demanding than tbl(1). + GNU troff(1) supports an incompatible `-R` flag to suppress the + reading of troffrc{,-end} files, but this is likely not the `-R` + that users will want--it is most useful for troubleshooting + troff, and nroff already unconditionally loads a macro file + {tty-char.tmac}. + + * src/roff/nroff/nroff.sh: Do it. + + * src/roff/nroff/nroff.1.man: + * NEWS: Document it. + +2021-10-20 G. Branden Robinson + + * tmac/tmac.am (tmac/groff_man.7.man) + (tmac/groff_man_style.7.man): Be quieter by default; use + $(AM_V_GEN) more consistently with the rest of the build. + +2021-10-19 G. Branden Robinson + + * src/roff/troff/input.cpp (do_error): Format diagnostic + messages in closer alignment with GNU Coding Standards: don't + introduce a space between the program name and the input file + name. + + * src/roff/groff/tests/string_case_xform_errors.sh: Update + expected output. + +2021-10-19 G. Branden Robinson + + * src/roff/troff/env.cpp (distribute_space): Revert an + `assert()` I added in commit b93eacd8d7 (5 September); we can + indeed reach this code with a negative amount of desired space, + and in fact the "show hyphenation points" trick + + relies upon it. Add explanatory comment. + + Fixes . + +2021-10-17 G. Branden Robinson + + * test-groff.in: Add support for sboxes.tmac. + +2021-10-11 Paul Eggert + + Include before any standard headers. + + Gnulib requires that files that might use Gnulib features (which + pretty much means every C or C++ source file) must include + first. Arrange for that. This will be needed once + Groff updates to the latest Gnulib; see Bjarni Ingi Gislason's + problem report in: + + + The only exception I can see is src/utils/addftinfo/guess.cpp, + which does not include any standard include file either directly + or indirectly, and so need not include . + + * src/devices/xditview/Dvi.c: + * src/devices/xditview/font.c: + * src/devices/xditview/lex.c: + * src/devices/xditview/page.c: + * src/devices/xditview/parse.c: + * src/libs/libbib/map.c: + * src/libs/libgroff/change_lf.cpp: + * src/libs/libgroff/cmap.cpp: + * src/libs/libgroff/cset.cpp: + * src/libs/libgroff/fmod.c: + * src/libs/libgroff/getcwd.c: + * src/libs/libgroff/lf.cpp: + * src/libs/libgroff/ptable.cpp: + * src/libs/libgroff/quotearg.c: + * src/libs/libxutil/DviChar.c: + * src/libs/libxutil/XFontName.c: + * src/libs/libxutil/xmalloc.c: + * src/utils/indxbib/signal.c: Do it. + + [Fixes . --GBR] + +2021-10-10 Deri James + + Handle pdfs > v1.4 loaded by \X'pdf: pdfpic'. + + * src/devices/gropdf/gropdf.pl: Improve loading of pdfs above + version 1.4, i.e. handle compressed nodes in /ObjStm. Also + improve code in \X'pdf: import'. + +2021-10-10 Deri James + + Add new background boxes to gropdf. + + * src/devices/gropdf/gropdf.pl: New \X'pdf: background' command. + * tmac/pdf.tmac: Covenience command .pdfbackground added. + * contrib/sboxes/: Files which demonstrate use of background + boxes using -ms macros. + +2021-10-09 G. Branden Robinson + + [tests]: Fix portability problems in 2 tests. + + * src/roff/groff/tests/break_zero-length_output_line_sanely.sh: + * tmac/tests/s_PN-works.sh: Migrate from `echo` to `printf` for + test inputs containing backslashes to be interpreted literally. + + Fixes part of . Thanks to + Deri James for identifying the problem. + +2021-10-08 G. Branden Robinson + + [grotty]: Slightly refactor. + + * src/devices/grotty/tty.cpp: Boolify. Demote numerous + variables (and one return type) from `int` to `bool`, use + Boolean instead of integer literals with them, and give the + variables names resembling logical predicates. + - horizontal_tab_flag -> want_horizontal_tabs + - form_feed_flag -> want_form_feeds + - bold_flag_option -> want_emboldening_by_overstriking + - bold_flag -> do_bold + - underline_flag_option -> want_italics_by_underlining + - underline_flag -> do_underline + - overstrike_flag -> want_glyph_composition_by_overstriking + - draw_flag -> allow_drawing_commands + - italic_flag_option -> want_sgr_italics + - italic_flag -> do_sgr_italics + - reverse_flag_option -> want_reverse_video_for_italics + - reverse_flag -> do_reverse_video + - old_drawing_scheme -> use_overstriking_drawing_scheme + (class tty_printer:printer): Similarly. + - is_underline -> is_underlining + - is_bold -> is_boldfacing + - cu_flag -> is_continuously_underlining + (tty_printer::tty_color): Demote return type as above. Invert + its sense; rename `unknown_color` to `is_known_color`. + (tty_printer::color_to_idx): Invert sense of test at + `tty_color()` call site. + +2021-10-07 G. Branden Robinson + + [ms]: Finish documenting new `TC-MARGIN` register and + `TC-LEADER` special character. + + Fixes . + +2021-10-06 G. Branden Robinson + + [grotty]: Slightly refactor. + + * src/devices/grotty/tty.cpp (tty_printer::special_link): Use + consistent loop styles and drop unnecessary arithmetic. + +2021-10-06 G. Branden Robinson + + [man]: Fix oversight and improve `MR` test. + + * tmac/an-ext.tmac (initialization): Enable `mY` register to + indicate use of grotty(1) (and therefore OSC 8 support) if the + "ascii", "cp1047", or "latin1" output devices are used, not just + "utf8". + + * tmac/tests/an_MR-works.sh: Drop copy-and-paste cruft from a + different test. Update expected output and check for the + presence of "link" device control subcommands, not just correct + font selections. + +2021-10-05 G. Branden Robinson + + [man]: Add `MR` macro for man page cross references. + + * tmac/an.tmac (an-prepare-page-title): After a possibly + abbreviated man page title is determined, redefine `an-pageref` + to set the title portion in the font stored in the `MF` string + and bracket it with italic corrections if that font is thought + to be oblique. + (MR): Add macro to format the text of a man page cross + reference, and hyperlink it on HTML and terminal output devices + if permitted by the `U` register. + (initialization): Define `MF` string as `I` if not already set. + Define `an-lic` and `an-ic` strings as either empty or as + containing italic corrections. + + * tmac/an-ext.tmac (MR): If the formatter is not GNU troff, + define macro to format the text of a man page cross reference. + + * tmac/groff_man.7.man.in: Document it. + (Description): Add macro to summary table. + (Description/Hyperlink macros): Document new feature. Note + origin in Plan 9 troff. [style] Add examples of use. + (Description/Font style macros): Drop man page cross references + from list of items whose typeface conventions are disputed, + since we have a semantic macro now and a configurable means of + resolving the problem. + (History): Add `MR` item. + (Options) : Document new string. + (Files) : Revise discussion to accommodate `MR`. + (Authors): Add myself an author of extension macros. + + * tmac/tests/an_MR-works.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + * NEWS: Add item. + +2021-10-05 G. Branden Robinson + + * tmac/an.tmac (SH, SS): Invoke `ne` request _before_ performing + font remapping: any page-breaking decision will be taken before + the remapping happens, and so won't be in effect across a page + boundary, undesirably impacting header and footer text. + + Fixes . + +2021-10-05 G. Branden Robinson + + Regression-test Savannah #61279. + + * tmac/tests/an_font-remapping-does-not-affect-titles.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-10-04 G. Branden Robinson + + * tmac/an.tmac (an-abbreviate-title): Rename to... + (an-prepare-page-title): ...this. + +2021-10-03 G. Branden Robinson + + [docs]: Correct erroneous claim: the ".NH S" extension to ms(7) + comes from 4.2BSD, not GNU. + +2021-10-03 G. Branden Robinson + + * doc/ms.ms (Creating a table of contents): Sync with recent + additions to groff_ms(7), expand, and heavily revise. + +2021-10-03 G. Branden Robinson + + [andoc,man,mdoc]: Fix Savannah #61266. Resolve problems in + batch rendering of man pages to PDF arising from entanglement + of end-of-input traps, page location traps, continuous rendering + mode, and andoc's reloading of the (m)an and (m)doc packages. + + * tmac/andoc.tmac (reload-doc, reload-man): Remove end-of-input + traps alongside others. + + * tmac/an.tmac (an-end): Only perform flush and "manual" page + footer placement if in continuous rendering mode, since this + macro is not only called by a trap placed only in continuous + rendering mode, but also by andoc when changing macro packages. + Unconditionally remove the `an-header` trap since the next + document might be using a different macro package. + + * tmac/mdoc/doc-common: In initialization, set flag indicating + that manual header placement will be required. + (Dt): Call `doc-setup-header` (which sets up several types of + trap) unconditionally, and break the page if the vertical + drawing position is anywhere but at the top. + (Os): If the package has just been initialized, call + `doc-header` to force the page header to be written. + (doc-end-macro): Remove `doc-header` trap since the next + document might be using a different macro package. Break the + page. Set flag indicating that manual header placement will be + required for the next document. + + * tmac/mdoc/doc-ditroff (doc-setup-header): Only set page + location traps for the header and footer if not continuously + rendering. + * tmac/mdoc/doc-nroff (doc-setup-header): Stop calling + `doc-header` here if continuously rendering. Emit an + unconditional break. Except for the location of the footer + trap, the `doc-setup-header` implementations are now identical. + + Refactoring is needed: some macros and registers have misleading + names, there is some code duplication in mdoc, and some of the + trap management problems are solved in slightly different ways + in man(7) and mdoc(7), perhaps unnecessarily. We also need some + test scripts to protect us from regressions. But this fixes the + rendering problems. + + Fixes . + +2021-10-02 Keith Marshall + + Correct manpage typo/inconsistency. + + * tmac/groff_ms.7.man (TC_LEADER, TC_MARGIN): Correct; should + be... + (TC\-LEADER, TC\-MARGIN): ...respectively, for consistency + with... + * tmac/s.tmac (TC-LEADER, TC-MARGIN): ...these. + +2021-10-03 G. Branden Robinson + + * src/roff/troff/input.cpp (encode_char): Update diagnostic + messages to not presume the identity of the escape character; + continues 9be3f8e3 (4 June). + +2021-10-03 G. Branden Robinson + + * src/devices/grotty/tty.cpp (tty_printer:special_link): Tighten + code slightly by taking advantage of preprocessor string literal + concatenation. + +2021-10-01 G. Branden Robinson + + [man]: Fix `U` enablement override so it actually works the way + I had in mind. + - The package proper enables it by default, but + - the sample site configuration file switches it off, on the + assumption that distributors and users will know better than + we do when they get a capable pager in place, and + - a register setting at the command line (or otherwise prior to + the loading of the macro package) is dispositive. + + * tmac/an-ext.tmac: Rename URI output device capability register + from `U` to `mU`. + (UR, UE, MT, ME): Test both `U` and `mU` before handling + hyperlinks specially. + * tmac/an.tmac: If `man.local` did not initialize `U`, switch it + on. The hope is that we can drop the stuff in `man.local` + completely at some point. + * tman/man.local: Only initialize `U` if it is not already + defined. + +2021-10-01 G. Branden Robinson + + [man]: Use OSC 8 hyperlinks. + + * tmac/an-ext.tmac: Add registers `mY` (output driver is + "grotty") and `U` (generate hyperlinks). `U` is intended to + apply to hyperlinking support in general, not just grotty's OSC + 8 feature. If the output driver is either grohtml or grotty, + make `U` true (`man.local` is read subsequently and can override + it). + (UR, MT): Conditionalize diversion production on hyperlink + support, not grohtml use per se. + (UE, ME): Generate device control commands for `tty` device to + emit hyperlinks. + + * tmac/groff_man.7.man.in (Options): Document -rU. + (Files) [style]: Add example of `U` register enablement. + + * tmac/man.local: Disable `U` register by default, except on the + `html` device. + + * NEWS: Add item. + +2021-10-01 G. Branden Robinson + + [grotty]: Add OSC 8 hyperlink support. + + * src/devices/grotty/tty.cpp: Do it. Define `OSC` (Operating + System Command) and `ST` (String Terminator) preprocessor + symbols for these ECMA-48 (ISO 6429) character sequences. + (tty_printer::simple_add_char): Add stripped-down alternative to + `add_char()` member function for cases where we want to use many + defaults because we're writing a terminal escape sequence, not + rendering a glyph. (A function like `add_char()` that takes 8 + arguments of varying types is a code smell--phew!) + (tty_printer::special): Call `special_link()` member function if + the device control command is `link`. + (tty_printer::special_link): Add new member function to generate + OSC 8 hyperlinks. + + * src/devices/grotty/grotty.1.man: Document it. Observe in + multiple places that disablement of SGR escape sequences + disables OSC 8 too. + + * src/devices/grotty/tests/osc8_works.sh: Test it. + * src/devices/grotty/grotty.am (TESTS, grotty_TESTS): Run test. + (EXTRA_DIST): Ship test. + + * NEWS: Add item. + + Fixes . Thanks to Steffen + Nurpmeso for supplying a proof-of-concept. (I went with my own + implementation, though, so blame me if it breaks.) + +2021-10-01 G. Branden Robinson + + [troff]: Convert special character glyphs corresponding to + Unicode Basic Latin ("ASCII") code points to those code points + when they occur in device escapes. (They should be correct for + IBM code page 1047 as well, but this is untested.) This is + necessary for encoding URLs in device control commands. Special + character identifiers are presumed to be the defaults documented + in groff_char(7); this is a design gap that we should consider + addressing. (We don't have a way to ask "is this the special + character corresponding to Unicode basic Latin code point X?") + + * src/roff/troff/input.cpp (encode_char): Do it. + +2021-09-30 G. Branden Robinson + + [man, mdoc]: Draw line after each page more consistently in + continuous rendering mode. + + * tmac/an.tmac (an-bp): Move responsibility for line-drawing + after each document from here... + (an-end): ...to here. Refactor; drop + `an-do-draw-line-after-document` register in favor of testing + `\n[.F]` for nullity; if it is not null, then another document + is due to be processed (in fact, `.F` already contains its file + name), and we need to draw a separating line. If it is null, we + have reached the end of input and none is necessary. + + * tmac/mdoc/doc-ditroff.tmac (doc-setup-page-layout): + * tmac/mdoc/doc-nroff.tmac (doc-setup-page-layout): Save + configured line length in new register `doc-line-length`. + * tmac/mdoc/doc-common.tmac (doc-end-macro): Port the above + man(7) feature to mdoc(7); draw a line of this length after each + document if continuously rendering. + +2021-10-01 Keith Marshall + + [ms]: Update footnote handling documentation. + + * tmac/groff_ms.7.man: Make some linguistic style adjustments. + (FP): Document it; see . + (FS-MARK): Likewise, document this recently added feature. + +2021-10-01 Keith Marshall + + [ms]: Support user-defined TOC leader style. + + * tmac/s.tmac (toc*leader-char): Rename it as... + (TC-LEADER): ...this; within PX, leave it unchanged, if + predefined. + (TC-MARGIN): New numeric register; if predefined, leave it + unchanged, otherwise define as \w'000'; use it instead of + hard-wired definition, within PX; see + . + + * tmac/groff_ms.7.man (TC-LEADER, TC-MARGIN): Document them. + +2021-09-28 G. Branden Robinson + + [pic]: Update input file name correctly. + + * src/preproc/pic/troff.cpp (troff_output::set_location): Copy + the inbound file name argument with `strdup()` and store pointer + to this copy in `last_filename` instead of aliasing argument. + (troff_output::~troff_output): `free()` the memory allocated by + `strdup()` in destructor. + + Fixes . Pointer + assignment instead of a string copy was being performed, which + means that after its initial assignment, `last_filename` always + shared its value ultimately with the `current_filename` pointer + {a libgroff symbol}, so `strcmp()` was always being performed on + identical pointers. Problem appears to date back 30+ years, to + the dawn of our repo history. + +2021-09-24 G. Branden Robinson + + * font/devlj4/S: Make font name consistent with file name. + +2021-09-24 G. Branden Robinson + + * src/libs/libgroff/font.cpp (font::load): Throw error if a font + description file is missing a `spacewidth` directive, since it + is now re-documented as mandatory. Atypically, we don't return + false in this scenario; instead we proceed with the existing + logic to compute a space width for the font based on typical + practices for Western alphabetic fonts (see, e.g., + . + + * font/devdvi/EX: + * font/devdvi/MI: + * font/devdvi/S: + * font/devdvi/SA: + * font/devps/EURO: Add `spacewidth` directive to font + description files we ship that were missing it. We use the same + values that libgroff would have computed, so there should be no + visible difference. + +2021-09-24 G. Branden Robinson + + * Makefile.am: Mark `$(TEST_SUITE_LOG)` as `.PRECIOUS`. This + prevents the test suite log from being deleted if there are any + failures. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-09-23 G. Branden Robinson + + * src/utils/grog/grog.pl (do_line): Move first-macro-call test + for `TH` to a more appropriate location. + +2021-09-23 G. Branden Robinson + + [grog]: Refactor to make it easier to generalize a per-package + scoring mechanism. + + * src/utils/grog/grog.pl: Convert `inferred_main_package` from + scalar to list. Add scalar `selected_main_package` to store a + "winner" from the list of main packages inferred. + (push_main_package): Add subroutine to populate + `inferred_main_package`. + (do_line, infer_man_or_ms_package): Update to use + `push_main_package`. + (construct_command): Rewrite to select a main package from the + list `inferred_main_package`, taking user-supplied arguments + into account as an overriding factor. Drop now-unused `msupp` + list. + +2021-09-23 G. Branden Robinson + + * src/roff/groff/groff.cpp (main): If the `-I` option is given, + run the grn preprocessor and pass it an `-M` option with `-I`'s + argument. + + * NEWS: + * src/roff/groff/groff.1.man (Options): Document it. Also + document that `-I` options are passed to the output driver. + +2021-09-23 G. Branden Robinson + + * src/utils/grog/grog.pl (do_line): Don't strip groff-style + comments \# if AT&T compatibility mode is enabled. + +2021-09-23 G. Branden Robinson + + [libgroff]: Perform more font description file validation. Our + documentation said that the `name` directive was mandatory but + we didn't actually enforce this. Also be more specific in our + complaints of ill-formedness. + + * src/libs/libgroff/font.cpp (font::load): Add local Boolean + variable `saw_name_directive`. Rename `had_charset` to + `saw_charset_directive` for symmetry. Emit distinct diagnostics + for `spacewidth` and `slant` directives having a missing, + non-numeric, or out-of-range argument. Emit diagnostic if the + file lacks a `name` directive. + +2021-09-23 G. Branden Robinson + + [libgroff]: Slightly refactor. + + * src/libs/libgroff/font.cpp (struct text_file): Rename member + variable `size` to `linebufsize` for clarity (it's certainly not + the size of the text file). + (text_file::text_file): Initialize `linebufsize` in constructor. + (text_file::next_line): Allocate new `buf` using `linebufsize` + instead of magic number (which was also stored to `size`, making + it only semi-magic, I guess). Rename local variable `i` to + `length` since it is in fact the length (in `char`s) of the + string stored in `buf`. + +2021-09-23 G. Branden Robinson + + [libgroff]: Revisit fix for Savannah #61173. + + * src/libs/libgroff/font.cpp (text_file::text_file): Restore + setting of `lineno` member variable to `0` in constructor + initializer list, but... + (text_file::next_line): ...unconditionally increment it every + time through this member function's outer loop. + +2021-09-23 G. Branden Robinson + + [troff]: Align diagnostic message format with libgroff. + + * src/roff/troff/input.cpp (fatal_with_file_and_line): Report + the program name if one is defined. + (fatal_with_file_and_line, error_with_file_and_line, + debug_with_file_and_line): Report the line number of the input + file only if it is positive, so that other values can be used + for "whole file" complaints. See commit cd0457b6, 17 September. + +2021-09-23 G. Branden Robinson + + [libgroff]: Drop redundant diagnostic. + + * src/libs/libgroff/font.cpp (font::load): Drop redundant + diagnostic; a missing `charset` directive is already checked for + later, circa line 998. + +2021-09-22 G. Branden Robinson + + [libgroff]: Fix code style nits. + + * src/libs/libgroff/font.cpp (font::font): Use initializer list + as much as possible in constructor. + (font::unit_scale, font::get_width, font::get_height, + font::get_depth, font::get_italic_correction, + font::get_left_italic_correction, + font::get_subscript_correction, font::get_character_type, + font::get_code, font::get_special_device_encoding): These member + functions rely on the font being either indexed or associated + with an output device that uses the `unicode` directive in its + `DESC` file. The compiler doesn't know this, so annotate the + `abort()` calls that conclude them. Add an `assert()` before + each one to more usefully describe the violated invariant in the + event this unreachable code is somehow reached. + (font::get_width): Annotate special meaning of zero zoom factor. + +2021-09-21 G. Branden Robinson + + * src/include/font.h (UNDEFINED_GLYPH): Use idiomatic C++98 null + pointer constant. + +2021-09-19 G. Branden Robinson + + [grohtml]: Fix compiler warning and dead store. + + * src/devices/grohtml/post-html.cpp (html_printer::special): + Update call of `font::load_font()` to stop passing obsolete + parameter (deleted by me in 2dff87d3, 17 September). The value + stored to the parameter by that function was never read anyway, + so also get rid of the variable that contained it. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-09-19 G. Branden Robinson + + [libgroff]: Slightly refactor. + + * src/include/font.h (font::scan_papersize): Demote return type + from `int` to `bool`. + * src/libs/libgroff/font.cpp (font::scan_papersize): As above. + Use Boolean instead of integer literals. Also rename `FILE` + stream pointer from `f` to `fp` and perform an explicit + comparison against the idiomatic C++98 null pointer constant. + +2021-09-17 G. Branden Robinson + + [libgroff, troff]: Slightly refactor device and font description + file loading. Remove dead code. + + * src/include/font.h (font::load_font): Drop second parameter. + It was never used for its intended purpose. + (load): Drop first parameter; likewise. + * src/libs/libgroff/font.cpp (font::load, load): As above. + + * src/libs/libgroff/font.cpp (struct text_file): Rename + `skip_comments` to `recognize_comments`. Demote that and + `silent` from `int` to `bool`. + (text_file::text_file): Use Boolean rather than integer literals + in constructor. + (text_file::next_line, font::load): Apply above renaming. + + * src/libs/libgroff/font.cpp (font::load): Rename parameter from + `head_only` to `load_header_only` to be more communicative. + Drop test of font description file name being `DESC`; this code + was not being reached. Stop throwing errors from this function + on failure to open the file; the caller will handle this when it + sees our false return value. Rename local variable `command` to + `directive` for alignment with our documentation. Replace "I + dont think this should happen" test and comment with `assert()`. + (struct table): Rename member from `command` to + `numeric_directive` to indicate its specificity, tracking only a + subset of valid `DESC` file directives. + + * src/libs/libgroff/font.cpp (font::load, font::load_desc): + Remove redundant assignments to the member variable formerly + known as `skip_comments`. + + * src/libs/libgroff/font.cpp (font::load_desc): Rename local + variable `directive_found` to `numeric_directive_found` to + clarify logic. + + * src/roff/troff/node.cpp (mount_font_no_translate): Simplify + call of `font::load_font`. The `not_found` in-out parameter + which was so agonizingly passed up through layers of library + calls was never actually read. Drop code that has been `#if + 0`-ed out since 1993. + +2021-09-17 G. Branden Robinson + + * src/libs/libgroff/font.cpp (font::load_desc): Clear line + number before emitting whole-file validity diagnostics. + +2021-09-17 G. Branden Robinson + + * src/libs/libgroff/font.cpp (font::load_desc): Emit correct + line numbers when complaining of invalid `sizescale`, `hor`, or + `vert` values in device description files. + + Fixes . + +2021-09-17 G. Branden Robinson + + [libgroff]: Increase validation of device and font description + files. + + * src/libs/libgroff/font.cpp (font::load): Validate the syntax + and value of the `name` directive. + (font::load_desc): Issue distinct diagnostics for a `fonts` + directive that is missing arguments and for a first argument + that can't be interpreted as a valid number. + +2021-09-17 G. Branden Robinson + + [libgroff]: Make error reporting more flexible. + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + Interpret a nonpositive line number specially: treat the + diagnostic as applying to the entire file, and omit the line + number. + +2021-09-17 G. Branden Robinson + + [libgroff]: Add information to diagnostics. + + * src/libs/libgroff/font.cpp (font::load): Drop unused argument + from `error()` call. + (font::load_desc): In another, add name of numeric directive + that is given an unparsable number. + +2021-09-17 G. Branden Robinson + + [libgroff]: Tweak code style. + + * src/libs/libgroff/font.cpp (trim_args, font::load) + (font::load_desc): Compare pointer explicitly to null pointer + literal `0` instead of using logical complementation. + (font::load, font::load_desc): Swap order of null pointer + equality comparisons when a typo or thinko could lead to lvalue + assignment. + +2021-09-17 G. Branden Robinson + + [libgroff]: Use idiomatic C++98 null pointer constant. + + * src/libs/libgroff/font.cpp (text_file::error) + (glyph_to_unicode, font::get_special_device_encoding) + (font::load): + * src/libs/libgroff/fontfile.cpp (font::image_generator): + * src/libs/libgroff/nametoindex.cpp (class charinfo) + (character_indexer::named_char_glyph) + (character_indexer::numbered_char_glyph): + * src/libs/libgroff/string.cpp (string::clear): + * src/libs/libgroff/tmpfile.cpp (temp_init::temp_init): + * src/libs/libgroff/tmpname.cpp (gen_tempname): Use `0` literal + instead of `NULL` to represent a null pointer; this was + idiomatic in C++98 and is mostly the practice elsewhere in + groff. Also swap order of null pointer equality comparisons + when a typo or thinko could lead to lvalue assignment. + + * src/roff/troff/input.cpp (input_stack::diversion_state) + (input_stack::get_diversion_state, charinfo::contains) + (glyph_to_name): Similar. + +2021-09-17 G. Branden Robinson + + [libgroff]: Slightly refactor. + + * src/libs/libgroff/font.cpp (font::load): Use same loop style + as `font::load_desc()`. + +2021-09-17 G. Branden Robinson + + [libgroff]: Fix off-by-one error in font and device description + file reader diagnostics. + + * src/libs/libgroff/font.cpp (text_file::text_file): All text + files begin with line 1, not line 0. + + Fixes . + +2021-09-17 G. Branden Robinson + + [libgroff]: Boolify more interfaces. + + * src/include/font.h (font::unit_scale): + * src/libs/libgroff/font.cpp (font::unit_scale): Demote return + type from `int` to `bool`. Use Boolean literals instead of + integers. + + * src/libs/libgroff/font.cpp (struct text_file): Rename `next` + member function to `next_line`. Demote its return type from + `int` to `bool`. Use Boolean literals instead of integers. + +2021-09-16 G. Branden Robinson + + [libgroff]: Boolify local variables. + + * src/libs/libgroff/font.cpp (font::load, font::load_desc): + Demote local variables used as Booleans from `int` to `bool` and + update literals used with them from integer to Boolean. + +2021-09-16 G. Branden Robinson + + [grn, groff, troff]: Communicate better when device DESC file + can't be loaded. + + * src/libs/libgroff/font.cpp (font::load_desc): Stop writing + diagnostic to standard error. + * src/preproc/grn/main.cpp (getres): + * src/roff/troff/troff.cpp (main): Replace "sorry, I can't + continue" fatal diagnostic with a more informative message. + Instead say which device's DESC file the program was trying to + open, which might reveal a user's logic error or typo. + * src/roff/groff/groff.cpp (main): Replace "invalid device" text + of fatal diagnostic similarly. I think it is more helpful to + indicate the operation that failed rather than saying the device + was invalid, particularly since there are other ways for a + device description to be invalid even if a DESC file is found + and loaded. + +2021-09-16 G. Branden Robinson + + [troff]: Throw warning diagnostic if device DESC file attempts + to load unavailable fonts. + + * src/roff/troff/input.cpp (main): Take advantage of new Boolean + return values of `mount_style()` and `mount_font()` to produce + warning diagnostics if mounting a style or font as directed by + the DESC file fails. Explain in a comment why, at present, this + style mount warning will never actually trip. + +2021-09-15 G. Branden Robinson + + [troff]: Lift font mounting diagnostic messages to be closer to + their user-controlled contexts to provide more information. In + many cases no diagnostic was being thrown at all when an + unavailable font was requested by name, which is the method most + users prefer, and which meant that failures resulting from typos + in font names for many requests (`uf`, `fschar`, `rfschar`, + `special`, `fspecial`, `fzoom`, `bd`, `tkf`, `cs`) were going + unreported. Further, promote these font warnings to errors + because the request will utterly fail to do what was requested + with no reasonable fallback. Possibly, they were formerly + warnings because at the low level they were being emitted, they + could also have originated from unavailable fonts encountered in + device description files, and while that's bad news, it results + in no formatting problems if it doesn't affect fonts that an + input document actually uses. + + * src/roff/troff/node.cpp (struct font_lookup_info): New struct + keeps the font name or position requested, and the position of + successful font lookup. + (font_lookup_info::font_lookup_info): Add constructor. + (font_lookup_error): New function builds error message using a + `font_lookup_info` struct and a message argument. + (get_fontno): Rename to... + (has_font): ...this. Add argument to take a pointer to a + `font_lookup_info` struct. Return a `bool` indicating whether + the lookup succeeded. Place former `int` return value into the + struct instead. Populate the other struct members with the + requested font name or position, as appropriate. + (mount_font_no_translate): Stop throwing warning diagnostic here + if a font cannot be loaded. Instead, throw them... + (font_position): ...here, and... + (underline_font, define_font_special_character, + remove_font_special_character, read_special_fonts, + font_special_request, font_zoom_request, bold_font, track_kern, + constant_space): ...here, using `font_lookup_info` structs and + `has_font()`. + (remove_font_special_character): Stop returning early if font + lookup fails; it's gratuitously inconsistent with other similar + functions (save one, which has a reason to be different). + (define_font_special_character): Return early if font lookup + fails and say why in a comment (we can't `skip_line()`). + + Fixes . + +2021-09-15 G. Branden Robinson + + * [libgroff, troff]: Further boolify. + + * src/include/font.h (load_font, font): Demote parameters from + {pointer to} `int` to `bool` and update default literal from + integer to Boolean (except for the pointer). Update comment. + * src/libs/libgroff/font.cpp (load_font, load): Similarly. + + * src/roff/troff/node.h (mount_font): + * src/roff/troff/node.cpp (mount_font): Demote return type from + `int` to `bool`. + + * src/roff/troff/node.h (mount_style): + * src/roff/troff/node.cpp (mount_style): Promote return type + from `void` to `bool`. + + * src/roff/troff/node.cpp (mount_font_no_translate): Demote + return type and `check_only` parameter from `int` to `bool` and + use Boolean rather than integer literals with them. + (check_font): Update call site of `mount_font_no_translate` to + use Boolean literal. + (font_position): Indicate that "error" is ignored by casting + return value of `mount_font` to void instead of using a comment. + (style): Cast return value of `mount_style` to `void`. + +2021-09-15 G. Branden Robinson + + * Makefile.am: Add `.DELETE_ON_ERROR` special target; both GNU + and FreeBSD make(1)s support it so maybe it will be portable + enough. This avoids, among other problems, a target appearing + falsely up-to-date (often as an empty file) when the troff + process generating it experiences an assertion failure. + +2021-09-12 G. Branden Robinson + + Since June 1991 if not earlier, groff (technically, the refer, + lookbib, and lkbib programs) has trusted the header contents of + binary bibliographic index files (canonically generated with + indxbib(1)) regarding the sizes of the data structures that + follow in the file, a notorious class of security problem. In + July 2013, the Mayhem Team at Carnegie Mellon University + reported to the Debian Bug Tracking System a problem with + groff's refer(1) implementation dumping core when reading an + index file prepared by a fuzzer. + + * src/libs/libbib/index.cpp (index_search_item::check_header): + Add new member function to validate the header of an indexed + bibliography file, returning a string describing in detail the + first validity problem encountered. + (index_search_item::load): Perform the foregoing check before + using any of the size values taken from the header; they are + relied upon for pointer arithmetic. If in verification mode + {using the undocumented `-V` flag to refer(1), lkbib(1), or + lookbib(1)}, report the details of the problem encountered. + Regardless of that mode, if there is a validity problem, report + corruption of the index file and abandon it, forcing fallback to + the text version of the corresponding bibliography file. + + Fixes . + +2021-09-12 G. Branden Robinson + + * src/libs/libbib/index.cpp + (index_search_item::get_invalidity_reason): Don't complain about + a last list element being nonnegative if the list size was zero + in the first place, as can happen with an empty index. More + seriously from a language standpoint, avoid reading through a + negative array index (this can escape a compiler's attention + because we're reading from the midst of a heap-allocated or + `mmap()`ed region, but it's still a code smell). + + Fixes . + +2021-09-12 G. Branden Robinson + + * src/libs/libbib/index.cpp (index_search_item::load) + (index_search_item::get_invalidity_reason) + (index_search_item::add_out_of_date_file): Clarify diagnostic + messages. Make it more obvious when we're complaining of a + problem in an indexed bibliographic database file (rather than a + plain text one). Dial down the amount of Unix jargon a little. + +2021-09-12 G. Branden Robinson + + [libbib]: Partially boolify. + + * src/include/search.h: + * src/libs/libbib/index.cpp: + * src/preproc/refer/refer.cpp: + * src/utils/lkbib/lkbib.cpp: + * src/utils/lookbib/lookbib.cpp: Demote `verify_flag` from an + `int` to a `bool`, rename it to `do_verify`, use Boolean + instead of integer literals with it, and update call sites. + + * src/libs/libbib/index.cpp: Rename `do_verify()` member + function to `get_invalidity_reason()` (it returns a string). + Demote `load()` from `int` to `bool`; do the same for `verify()` + and rename it to `is_valid()` as well. Use Boolean instead of + integer literals with them. + (index_search_item::is_valid, make_index_search_item): Update + call sites of renamed member functions. + +2021-09-12 G. Branden Robinson + + * src/libs/libbib/map.c (mapread): Compare return value of + `mmap()` to `MAP_FAILED` instead of `(char *)-1`. `MAP_FAILED` + is documented in POSIX Issue 5 a.k.a. SUSv2 + + {1997} and should be portable enough by now. + +2021-09-11 G. Branden Robinson + + [troff]: Clamp negative tab stop positions to zero instead of + throwing an assertion failure. + + * src/roff/troff/env.cpp (tab_stops::distance_to_next_tab): + Replace `assert` with clamping logic, ensuring that `lastpos` + can never be negative. While negative tab stop positions don't + make much sense (they result in zero horizontal motion), user + input like `.ta T -5` should never provoke an assertion failure. + + (set_tabs): Throw range warning in additional scenario, viz., if + a repeating tab offset is negative. + + Fixes . Thanks to наб for the + report. + +2021-09-11 G. Branden Robinson + + [troff]: Boolify `set_tabs` function. + + * src/roff/troff/env.cpp (set_tabs): Demote local variables from + `int` to `bool` and give them predicate-like names. + - `first` -> `is_first_stop` + - `repeated` -> `is_repeating_stop` + Use Boolean instead of integer literals in assignments to them. + +2021-09-11 G. Branden Robinson + + [man]: Deprecate `OP` macro. + + * tmac/an-ext.tmac (OP): Move implementation from here... + * tmac/an.tmac (OP): ...to here. Throw deprecation warning. + Throw style warning if wrong number of arguments given. + + * tmac/groff_man.7.man.in (Description): Drop from introductory + macro summary. + (Description/Command synopsis macros): Move discussion from + here... + (Description/Deprecated features): ...to here. Explain why it's + deprecated. + +2021-09-07 G. Branden Robinson + + [troff]: Make `ab` request quiet if given no arguments. The + `tm`, `tm1`, and `tmc` requests provide ample flexibility for + constructing diagnostic messages prior to an error exit, and + it's convenient to make `ab` itself quiet instead of saying + "User Abort." as Unix Version 7 troff did. Further, there is no + standardization across troffs regarding what `ab` should emit if + arguments are absent. + + * src/roff/troff/input.cpp (abort_request): Do it. + + * src/roff/groff/tests/ab_works.sh: + * src/roff/groff/groff.am (groff_TESTS): Test it. + + * doc/groff.texi (Debugging, Implementation Differences): + * man/groff.7.man (Requests/Request short reference): + * man/groff_diff.7.man (Implementation differences): Document + it. + + Fixes . Thanks to Dave + Kemper for the discussion. + +2021-09-07 G. Branden Robinson + + [troff]: Update exit status literals. + + * src/roff/troff/div.cpp (top_level_diversion::begin_page): + * src/roff/troff/input.cpp (exit_troff, abort_request, do_error) + (fatal_with_file_and_line): Use standard C library preprocessor + symbols `EXIT_SUCCESS` and `EXIT_FAILURE` instead of 0 and 1 + literals, respectively. + +2021-09-06 G. Branden Robinson + + [troff]: Drop unused member function. + + * src/roff/troff/token.h (class token): Drop unused `title` + member function. Its implementation was apparently removed in + the prehistory of our Git repository: see James Clark's + ChangeLog entry of 1990-09-06. + +2021-09-06 G. Branden Robinson + + [troff]: Remove workaround for Cfront 1.2 bug. + + * src/roff/troff/input.cpp (do_define_macro): Move `dot_symbol` + from to file to function local scope as originally intended. + +2021-09-06 G. Branden Robinson + + [troff]: Rename parameter. + + * src/roff/troff/input.cpp (token::usable_as_delimiter): Rename + parameter from `err` to `report_error` to be more communicative. + +2021-09-06 G. Branden Robinson + + [troff]: Boolify members of `token` class. + + * src/roff/troff/token.h (class token): Demote return type of + several member functions from `int` to `bool` and rename them. + - `backspace` -> `is_backspace` + - `delimiter` -> `usable_as_delimiter` + - `dummy` -> `is_dummy` + - `eof` -> `is_eof` + - `horizontal_space` -> `is_horizontal_space` + - `hyphen_indicator` -> `is_hyphen_indicator` + - `leader` -> `is_leader` + - `left_brace` -> `is_left_brace` + - `newline` -> `is_newline` + - `page_ejector` -> `is_page_ejector` + - `right_brace` -> `is_right_brace` + - `space` -> `is_space` + - `special` -> `is_special` + - `stretchable_space` -> `is_stretchable_space` + - `tab` -> `is_tab` + - `transparent_dummy` -> `is_transparent_dummy` + - `transparent` -> `is_transparent` + - `unstretchable_space` -> `is_unstretchable_space` + - `white_space` -> `is_white_space` + - `zero_width_break` -> `is_zero_width_break` + (class token): Drop 1991 comment anticipating that member + function `nspaces` could return "2" for a "double space"; this + was apparently never implemented. + (class token): Drop parameter names from declarations; the + prevailing style (familiar from Stroustrup) is not to use them. + (token::is_special): Simplify implementation. + + * src/roff/troff/input.cpp (has_arg) + (token::usable_as_delimiter): Update definitions of above member + functions not defined in token.h. + + * src/roff/troff/div.cpp (begin_page, space_request, need_space) + (output_saved_vertical_space, flush_output): + * src/roff/troff/env.cpp (fill, no_fill, center) + (right_justify, indent, temporary_indent, margin_character) + (number_lines, do_break_request, hyphen_word): + * src/roff/troff/input.cpp (next_file, do_overstrike) + (do_bracket, do_name_test, do_expr_test, do_zero_width) + (token::skip, has_arg, skip_line, empty_name_warning) + (non_empty_name_warning, do_get_long_name, process_input_stack) + (flush_pending_lines, decode_args, read_request) + (do_define_string, do_define_character, remove_character) + (do_define_macro, length_request, get_delim_number) + (get_line_arg, read_size, get_delim_name, do_register, do_width) + (read_title_parts, encode_char, do_special, device_request) + (output_request, skip_alternative, begin_alternative) + (nop_request, do_if_request, do_source, pipe_source) + (ps_bbox_request, tag, taga, do_terminal, do_translate) + (hyphenation_code, hyphenation_patterns_file_code, define_class) + (get_optional_char, check_missing_character, abort_request) + (copy_file, transparent_file, do_macro_source) + (charinfo_to_node_list, read_draw_node, read_color_draw_node): + * src/roff/troff/node.cpp (get_fontno) + (remove_font_special_character, bold_font): + * src/roff/troff/number.cpp (start_number, parse_term): + * src/roff/troff/reg.cpp (define_number_reg, alter_format): + Update call sites to use new names. + + * src/roff/troff/input.cpp (token::usable_as_delimiter) + (read_draw_node): Return Boolean, not integer, literals. + +2021-09-06 G. Branden Robinson + + [troff]: Clamp line and title lengths to device horizontal + resolution. + + * src/roff/troff/env.cpp (line_length, title_length): Do it. + + Fixes . + +2021-09-06 G. Branden Robinson + + * src/roff/troff/env.cpp (do_hyphenation_patterns_file): + Refactor slightly. Demote `append` from `int` to `bool`. + (hyphenation_patterns_file, hyphenation_patterns_file_append): + Update call sites to use Boolean, not integer, literals. + +2021-09-05 G. Branden Robinson + + * src/roff/troff/hvunits.h: + * src/roff/groff/number.cpp: Mark `H0`, `V0` objects as `const`. + +2021-09-05 G. Branden Robinson + + * src/roff/troff/env.cpp (do_underline_special): Refactor + slightly. + - Rename `underline_spaces` -> `do_underline_spaces`. + - Demote it from an `int` to a `bool`. + - Use ternary operator and explicit character literals when + writing device control command instead of doing arithmetic + on a character literal. + - Update call sites to use Boolean literals. + - Relocate function to avoid forward reference. + - Mark function as static to eliminate external linkage. + Remove now-unnecessary prototype. + +2021-09-04 Keith Marshall + + Add "ms" footnote marker placement hook. + + * tmac/s.tmac (FS-MARK): New macro; define as no-op, by default. + (@FS): Invoke FS-MARK as first action, allowing caller to "hook" it. + +2021-09-04 G. Branden Robinson + + * src/roff/troff/env.cpp (distribute_space): Refactor slightly. + - Rename `force_reverse` to `force_reverse_node_list`. + - Rename `reverse` to `do_reverse`. + - Demote both of the above from `int` to `bool`. + - Use Boolean literals with them. + - Add assertions to enforce positive values of `nspaces` and + `desired_space`. + - Remove now-redundant test for `nspaces` being positive. + - Add explanatory comments. + (environment::wrap_up_field): Update call sites of + `distribute_space` when non-default value of + `force_reverse_node_list` is supplied. + +2021-09-04 G. Branden Robinson + + [troff]: Don't adjust nonadjustable lines. This means that the + direction from which an output line in adjustment mode "b" (or + its "n" synonym) is filled with supplemental space is not + changed if that output line does not require adjustment. This + will result in whitespace changes to documents using that + adjustment mode, and these changes will be plainly visible on + low-resolution output devices like terminals. + + To illustrate, in the following "A" means an output line + requiring adjustment; "F" a line that is "full" and does not; + and "L" and "R" indicate distribution of adjustment spaces from + the left and right, respectively. + + groff 1.22.4 groff 1.23.0 + ------------ ------------ + A L A L + A R A R + F L F R + A R A L + + * src/roff/troff/env.cpp (distribute_space): Return early if + either the amount of desired space to be distributed or the + count of space nodes in the output line to distribute it among + is zero. + + * tmac/tests/an_TH-repairs-ad-damage.sh: Update test to expect + space to be distributed differently. + + Fixes and + . + +2021-09-04 G. Branden Robinson + + Skip core-dump-checking test if a core file already exists. + + * src/roff/groff/tests/regression_savannah_59202.sh: Skip test + if a core dump is already present. + +2021-09-04 G. Branden Robinson + + Add regression test for Savannah #60189. + + * src/roff/groff/tests/break_zero-length_output_line_sanely.sh: + Do it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2021-08-29 G. Branden Robinson + + [troff]: Tweak diagnostic message. + + * src/roff/troff/env.cpp (environment::environment): Use + terminology more rigorously in diagnostic. + +2021-08-29 G. Branden Robinson + + [libgroff]: Fix code style nit. + + * src/libs/libgroff/errarg.cpp (errprint): Replace `assert(0)` + with a meaningful predicate. + +2021-08-28 G. Branden Robinson + + [libgroff]: Demote `need_space` to Boolean. + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + Demote local integer `need_space` and its assignments to `bool`. + +2021-08-28 G. Branden Robinson + + [libgroff]: Boolify `font::load()` and `font::load_desc()` + return values. + + * src/include/font.h (font::load, font::load_desc): + * src/libs/libgroff/font.cpp (font::load, font::load_desc): Do + it. + +2021-08-28 G. Branden Robinson + + * m4/groff.m4 (TRADITIONAL_CPP): Update `AC_MSG_CHECKING` + argument to refer to "pre-ISO C90 syntax" instead of a + "traditional" preprocessor. Call `AC_MSG_ERROR` (aborting + configuration) if the check (for pre-C90 transformation) + succeeds. We thus withdraw support for such superannuated + {"Reiser"} C preprocessors. + +2021-08-28 G. Branden Robinson + + [libgroff]: Un-indirect token concatenation through macro. + + * src/include/itable.h: + * src/include/ptable.h: Do it. + +2021-08-28 G. Branden Robinson + + [libgroff]: Drop support for `TRADITIONAL_CPP`. This means a C + preprocessor that does not support the ANSI C89/ISO C90 + token concatenation operator "##". + + * src/include/itable.h: + * src/include/ptable.h: Do it. + + * Makefile.am: Undocument preprocessor symbol. + +2021-08-27 G. Branden Robinson + + [libgroff]: Drop `a_delete` preprocessor wrapper for the + `delete` operator. It has been rendered unnecessary by the + removal of support for ancient C++ compilers. + + * src/include/lib.h (a_delete): Drop symbol definition. + + * src/devices/grohtml/output.cpp (word::~word): + * src/devices/grohtml/post-html.cpp (char_block::char_block) + (assert_state::~assert_state, assert_state::add) + (assert_state::close, replace_negate_str): + * src/devices/grops/ps.cpp (ps_font::ps_font) + (subencoding::subencoding, ps_printer::define_encoding) + (ps_printer::encode_fonts): + * src/devices/grops/psrm.cpp (resource_manager::document_setup) + (resource_manager::supply_resource): + * src/devices/grotty/tty.cpp (tty_printer::tty_color) + (tty_printer::tty_printer, tty_printer::color_to_idx) + (tty_printer::add_char): + * src/include/itable.h (ITABLE(T)::~ITABLE(T)) + (ITABLE(T)::define): + * src/include/ptable.h (PTABLE(T)::~PTABLE(T)) + (PTABLE(T)::define): + * src/libs/libbib/index.cpp + (index_search_item::~index_search_item, make_index_search_item, + index_search_item_iterator::index_search_item_iterator, + index_search_item::get_tag, index_search_item::munge_filename, + index_search_item::search): + * src/libs/libbib/linear.cpp (bmpattern::~bmpattern) + (file_buffer::file_buffer, file_buffer::load) + (linear_searcher::linear_searcher) + (linear_searcher::~linear_searcher): + * src/libs/libbib/search.cpp + (search_list_iterator::search_list_iterator) + (search_item::search_item): + * src/libs/libdriver/input.cpp (IntArray::~IntArray) + (IntArray::append, StringBuf::~StringBuf, StringBuf::append) + (get_integer_arg, parse_x_command, do_file): + * src/libs/libdriver/printer.cpp (printer::printer) + (printer::load_font, text_file::~text_file, text_file::next) + (font::~font, font_widths_cache::~font_widths_cache) + (font:alloc_ch_index, font::extend_ch, font::compact) + (font::load_desc): + * src/libs/libgroff/fontfile.cpp (font::open_file): + * src/libs/libgroff/relocate.cpp (searchpath, searchpathext) + (set_current_prefix): + * src/libs/libgroff/searchpath.cpp (search_path::search_path) + (search_path::command_line_dir, search_path::open_file) + (search_path::open_file_cautious): + * src/libs/libgroff/string.cpp (sfree, srealloc) + (string::remove_spaces): + * src/libs/libgroff/symbol.cpp (symbol::symbol, concat): + * src/libs/libgroff/tmpfile.cpp (temp_init::temp_init) + (xtmpfile_list_init::~xtmpfile_list_init, xtmpfile): + * src/preproc/eqn/box.cpp (set_gfont, set_grfont, set_gbfont) + (box_list::append, box_list::~box_list): + * src/preproc/eqn/delim.cpp (make_delim_box) + (delim_box::~delim_box): + * src/preproc/eqn/eqn.ypp (number): + * src/preproc/eqn/lex.ypp (file_input::~file_input) + (argument_macro_input::~argument_macro_input): + * src/preproc/eqn/pile.ypp (matrix_box::~matrix_box) + (matrix_box::append): + * src/preproc/eqn/special.cpp (special_box::~special_box): + * src/preproc/eqn/text.ypp (set_char_type): + * src/preproc/html/pre-html.cpp (get_line, scanArguments): + * src/preproc/pic/object.cpp (output::~output) + (output::set_args, text_item::~text_item) + (object_spec::~object_spec, command_object::~command_object) + (line_object::~line_object): + * src/preproc/pic/pic.ypp (placeless_element, reset_variables) + (print_args, text_expr, object_spec, text, sprintf_args, path): + * src/preproc/refer/command.cpp (input_item::~input_item) + (input_item::peek_char): + * src/preproc/refer/label.ypp (lookup_label): + * src/preproc/refer/refer.cpp (store_citation, store_reference): + * src/preproc/tbl/main.cpp (format::add_rows, format::~format): + * src/preproc/tbl/table.cpp (block_entry::~block_entry) + (table::~table, table::allocate): + * src/roff/groff/groff.cpp (possible_command::~possible_command) + (possible_command::clear_name): + * src/roff/troff/column.cpp + ((justification_spec::~justification_spec) + (justification_spec::append): + * src/roff/troff/dictionary.cpp (dictionary::lookup): + * src/roff/troff/env.cpp (override_sizes, tab_stops::to_string) + (hyphen_word, hyphen_trie::insert_hyphenation): + * src/roff/troff/input.cpp (read_long_escape_name, token::next) + (do_get_long_name, temp_iterator::~temp_iterator) + (get_delim_name, pipe_source, read_string, pipe_output) + (system_request, open_mac_file, do_macro_source) + (do_register_assignment, do_string_assignment, read_draw_node) + (copy_mode_error): + * src/roff/troff/node.cpp (troff_output_file::set_font) + (troff_output_file::~troff_output_file, draw_node::is_tag) + (grow_font_table, font_family::~font_family) + (font_family::make_definite): + * src/utils/hpftodit/hpftodit.cpp (name_list::~name_list) + (read_map): + * src/utils/indxbib/indxbib.cpp (main, get_cwd): + * src/utils/tfmtodit/tfmtodit.cpp (tfm::~tfm, tfm::load): Port + uses of `a_delete` to `delete[]`. + +2021-08-27 G. Branden Robinson + + [libgroff]: Drop `ad_delete` preprocessor wrapper for the + `delete` operator. It has been rendered unnecessary by the + removal of support for ancient C++ compilers. + + * src/include/lib.h (ad_delete): Drop symbol definition. + + * src/preproc/pic/object.cpp (graphic_object::print_text): + * src/preproc/refer/ref.cpp (reference::reference) + (reference::merge, reference::insert_field) + (reference::delete_field): + * src/preproc/tbl/main.cpp (format::add_rows): Port uses of + `ad_delete` to `delete[]`. + +2021-08-28 G. Branden Robinson + + * m4/groff.m4 (GROFF_ARRAY_DELETE): Update `AC_MSG_CHECKING` + argument to refer to "ISO C++98" instead of "ANSI". Call + `AC_MSG_ERROR` (aborting configuration) if the check fails. + +2021-08-27 G. Branden Robinson + + [libgroff]: Drop support for `ARRAY_DELETE_NEEDS_SIZE`. + + * src/include/lib.h [ARRAY_DELETE_NEEDS_SIZE]: Drop preprocessor + conditional branch. This abandons support for certain pre-ISO + C++98 compilers. (According to a now-removed comment, unsized + array deletion was documented in "ARM", meaning _The C++ + Annotated Reference Manual_, published in 1989.) + + * Makefile.am: Undocument preprocessor symbol. + +2021-08-27 G. Branden Robinson + + [libgroff]: Drop redefinition of `INT_MIN`. + + * src/include/lib.h: Drop redefinition of `INT_MIN`. It was + motivated by a bug in the AT&T C++ compiler (cfront), version + 2.0, released in June 1989. Implementations have had 30 years + to get this right; assume that they have. + + * PROBLEMS: Drop corresponding item. + +2021-08-27 G. Branden Robinson + + [libgroff]: Drop long-dead `COOKIE_BUG` logic. + + * src/libs/libgroff/new.cpp (operator new, operator delete): + Drop preprocessor conditional branches on the `COOKIE_BUG` + symbol. This was de-documented, and an autoconf check for its + necessity removed, way back in groff 1.10 (November 1995). It + was relevant only to GCC from versions 2.0 to 2.2.2 (all 1992). + +2021-08-24 G. Branden Robinson + + [libgroff]: Refactor `font::scan_papersize()`. + + * src/libs/libgroff/font.cpp (font::scan_papersize): Ensure + successful return value of `fgets()` before attempting to parse + string for paper format. Convert `test_file` to Boolean and + rename to `attempt_file_open`. Quiets GCC `-Wunused-result` + warning. + +2021-08-23 G. Branden Robinson + + [tests]: Apply naming convention. + + * tmac/tests/e_footnotes_work_with_columns.sh: Rename from... + * tmac/tests/e_footnotes-work-with-columns.sh: ...to this. + * tmac/tmac.am (tmac_TESTS): Update. + +2021-08-23 G. Branden Robinson + + * tmac/an.tmac (IP): Make code more accessible by using a + Boolean operator rather than an arithmetic one (assembly + language programmers are comfortable with the interchangeability + of subtraction and comparison, but not everyone is). + +2021-08-23 G. Branden Robinson + + groff(7): Document more escapes. + + * man/groff.7.man (Escape short reference): Document + `\[charNNN]`, `\[uNNNN]`, `\[uNNNN_NNNN...]` escape sequences. + Revise descriptions of `\O0` and `\O1` escape sequences. + Document `\O2`, `\O3`, `\O4`, and `\O5` escape sequences. + +2021-08-23 G. Branden Robinson + + groff(7): Fix bug in `\?` escape rendering. + + * man/groff.7.man (ESC?): Fix bug in page-private macro: the + question mark that ends this uniquely-syntaxed escape sequence + was not shown with the mandatory escape character before it. + Problem dates back at least to commit 41b0e794, 19 February + 2007, but possiby to f790bc7a9, 6 January 2002. + +2021-08-21 G. Branden Robinson + + [docs]: Elaborate macro definition discussion. + + Fixes . Thanks to Dave + Kemper for the report. + +2021-08-21 G. Branden Robinson + + [tests]: Make robust against $GROFF_TYPESETTER settings. + + * src/roff/groff/tests/\ + use_point_size_escape_with_single_digit_arg.sh: + * src/roff/nroff/tests/verbose_option_works.sh: + * tmac/tests/s_IP-indents-using-paragraph-type-size.sh: Export + an empty $GROFF_TYPESETTER to the environment. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-08-21 G. Branden Robinson + + [libgroff]: Treat an empty $GROFF_TYPESETTER as unset. + + * src/libs/libgroff/device.cpp (device_init::device_init): Test + both returned pointer from `getenv()` and, if that's not null, + the first character of the string for nullity before assigning + it to `device`. + + Fixes . + +2021-08-21 G. Branden Robinson + + [libgroff]: Rename font class member variable. + + * src/include/font.h (font class): Rename `unscaled_charwidths` + member variable to `use_unscaled_charwidths`: since it is a + Boolean, make it read more like a logical predicate. + + * src/libs/libgroff/font.cpp (font::get_width, font::load_desc): + * src/libs/libgroff/fontfile.cpp (font class): Update + initialization and assignments. + +2021-08-20 G. Branden Robinson + + * src/roff/troff/input.cpp (get_copy): Demote integer arguments + to Booleans and use Boolean literals for default values. Rename + `defining` to `is_defining`. + (get_char_for_escape_name, do_define_macro): Update call sites + that use non-default arguments to use Boolean literals and + comments to document what's being requested. + +2021-08-17 G. Branden Robinson + + * doc/doc.am (DOC_GROFF_ONLY): Stop running groff in unsafe + mode; no documents (in _this_ directory) appear to require it. + +2021-08-16 G. Branden Robinson + + [grn]: Fix code style issues. + + * src/preproc/grn/hgraph.cpp: + * src/preproc/grn/hpoint.cpp: + * src/preproc/grn/main.cpp: + * src/preproc/grn/hdb.cpp: Drop use of `register` storage class. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report and a suggested patch. + + * src/preproc/grn/hgraph.cpp (len, HGPrintElt, picurve): + * src/preproc/grn/hdb.cpp (DBRead): Wrap long lines. + + * src/preproc/grn/hgraph.cpp: Rename function from + `Paramaterize` to `Parameterize`. + (HGCurve): Update call site. + + * src/preproc/grn/main.cpp (add_file): Drop redundant cast in + `realloc()` call. + (conv, interpret): Use standard English in diagnostic messages. + +2021-08-16 G. Branden Robinson + + * src/preproc/grn/hdb.cpp: Perform more input validation. + Improve diagnostics by taking advantage of libgroff + infrastructure and tracking the line number of the input file. + Add global `lineno`. + (DBRead): Increment `lineno` after reading newlines from input. + Call `error_with_file_and_line()` instead of `error()`. If + input reports a negative length for the text (string) to follow + in the file, exit with a fatal diagnostic. Check for EOF while + reading text string. + (DBGetType): Convert `fprintf()` call for warning diagnostic to + `warning_with_file_and_line()`. + (DBRead, DBGetType): Add contextual information to diagnostic + messages. + + Fixes . Thanks to + Savannah user eqkws for the report. + +2021-08-16 G. Branden Robinson + + * src/preproc/grn/main.cpp (usage): Update usage message. + +2021-08-16 G. Branden Robinson + + [grn]: Add and use `malloc()` wrapper. + + * /src/preproc/grn/main.cpp (grnmalloc): New function takes + argument of `size_t` type and constant string argument to + describe what is being allocated. Return non-null pointer from + `malloc()`, otherwise call `fatal()`, describing what was being + allocated and the problem reported by the system. + + * src/preproc/grn/hdb.cpp (DBCreateElt): + * src/preproc/grn/hpoint.cpp (PTMakePoint): + * /src/preproc/grn/main.cpp (main, interpret): Migrate + `malloc()` callers to `grnmalloc()`. + +2021-08-16 G. Branden Robinson + + * src/preproc/grn/hdb.cpp (DBRead): Check return value of + `sscanf()` and call `fatal()` if no conversions succeeded. The + blithe discard of a useful return value is bad enough, but this + one took place inside a do-while such that it could loop + forever trying fruitlessly to parse two doubles out of strings + that didn't contain them (the loop never checked the EOF status + of the file stream from which it was reading, and relied on + `fgets()` to keep advancing the stream pointer). Discovered + while root-causing Savannah #61043. + +2021-08-15 G. Branden Robinson + + Resolve compiler warnings relating to format string security and + ISO C++98 conformance. + + * src/preproc/eqn/delim.cpp (define_extensible_string): + * src/preproc/pic/pic.ypp (do_sprintf): Use #pragma to silence + GCC "format-nonliteral" warning and explain why our usage is + safe in a comment. + + * src/preproc/preconv/preconv.cpp (detect_file_encoding): Use + `l` modifier to `%u` `fprintf()` conversion instead of `z`, and + cast return values of `size_t` to unsigned long; "ISO C++98 + does not support the ‘z’ gnu_printf length modifier" (it doesn't + support `ll` either). N.B. this is debugging output only. + + * src/roff/groff/groff.cpp (synopsis): + * src/roff/troff/input.cpp (usage): Repeat variadic argument for + `%s` conversion in `fprintf()` call because "ISO C++98 does not + support %n$ operand number formats". + + * src/roff/troff/env.cpp: Initialize adjustment and hyphenation + mode enums without commas at the end of the enumeration lists. + +2021-08-15 G. Branden Robinson + + [man]: Clean up the interface between `an-footer` and `BT`, and + HTML header and footer suppression generally. Move + responsibility for checking the `ps4html` register from the + latter to the former. This is not something a `BT` redefiner + {see groff_man(7)} should have to worry about. + + * tmac/an.tmac (BT): Drop test of `ps4html` register and early + return. + (an-header, an-footer): Return immediately if + `an-suppress-header-and-footer` is true. Remove conditional on + `an-is-output-html`. + (initialization): Define `an-suppress-header-and-footer` + register; true if `an-is-output-html` is true, or if `ps4html` + is defined. + +2021-08-13 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (get_resolution): Unbrace a + single-statement `while` loop per prevailing coding style. Add + comments noting how we aren't parsing DESC files _precisely_ as + our documentation specifies. + +2021-08-13 G. Branden Robinson + + Convert font class `int` members to `bool` where appropriate. + + * src/include/font.h (font class): Demote integers to Booleans + and use Boolean literals where possible. Rename some member + variables to look like logical predicates. + - contains() + - is_special() + - has_ligature() + - tcommand -> has_tcommand + - unscaled_charwidths + - pass_filenames + - use_charnames_in_special + - is_unicode + - special (private) + * src/libs/libgroff/font.cpp (font::font): Construct object + using Boolean literal. + (font::contains): + (font::is_special): + (font::has_ligature): Convert return type to `bool`. + (font::load): + (font::load_desc): Assign to member variables using Boolean + literals. + * src/libs/libgroff/fontfile.cpp: Initialize appropriate globals + using `bool` type and Boolean literals. + * src/roff/troff/troff.h: + * src/roff/troff/input.cpp (main): + * src/roff/troff/node.cpp (troff_output_file::put_char_width): + Rename `tcommand_flag` to `device_has_tcommand` to suggest a + logical predicate, and to emphasize the formatter's concern with + what the output device can accept in the intermediate output + language. + * src/roff/troff/input.cpp: Initialize `device_has_tcommand` + global using `bool` type and Boolean literal. + +2021-08-13 G. Branden Robinson + + [me]: Clarify breadth of application of `ll` macro. + + * doc/meref.me: Document application of .ll macro only to the 3 + environments that me(7) uses, not any the user might create. + * tmac/e.tmac (@C, xl, ll): Update comments. + + Fixes . + +2021-08-13 G. Branden Robinson + + Add regression test for Savannah #58736. + + * tmac/tests/e_footnotes_work_with_columns.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-08-13 G. Branden Robinson + + * tmac/e.tmac (bc): Fix problem with multiple columns on long + pages. Space to the next page location trap, not 24 inches. + Thanks to Dave Kemper and Bjarni Ingi Gislason for help tracking + this bug down. + + Fixes . + +2021-08-13 G. Branden Robinson + + Add regression test for Savannah #55081. + + * tmac/tests/e_columns-work-on-long-pages.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-08-09 G. Branden Robinson + + * man/groff.7.man (Localization): Add section. + +2021-08-09 G. Branden Robinson + + * tmac/cs.tmac: + * tmac/de.tmac: + * tmac/fr.tmac: + * tmac/it.tmac: + * tmac/sv.tmac: Update ms package localization to use an + appropriate hyphenation mode for the `HY` register (the + mode for the pattern files, plus 2 as is traditional in ms). + +2021-08-08 G. Branden Robinson + + * tmac/e.tmac (1c): Place comment escape sequence immediately + after macro argument. (When redefining a request, one needs to + remember that request arguments are not parsed exactly as macro + arguments are.) Quiets "-w tab" warning. + +2021-08-08 G. Branden Robinson + + [me]: Fix misleading documentation claim; gremlin(1) pictures + cannot be included directly; they must be preprocessed with + grn(1). + + * doc/meref.me: + * tmac/groff_me.7.man: Replace "gremlin" with "grn". + +2021-08-08 G. Branden Robinson + + * tmac/groff_me.7.man: Document `n1` and `n2` macros. + +2021-08-08 G. Branden Robinson + + [me]: Fix PS/n1 combination diagnostic spew and apparent logic + error. + + * tmac/e.tmac (@h): Place comment escape sequence immediately + after macro argument. (When redefining a request, one needs to + remember that request arguments are not parsed exactly as macro + arguments are.) + (n2): Prefix with `do` requests using long register names. + (n2): Add macro-local register `|l` to store length of first + argument. Don't attempt to extract a substring beyond the + bounds of its source, which produces a warning diagnostic. + (&&): Define no-op macro for use as end macro in nested macro + definition. + (PS): Fix unbalanced-else diagnostic by changing `if` to `ie`. + (PS): Initialize `PS_nm_cnt` register to 0 instead of relying on + implicit definition. + (PS): Prefix with `do` definition of long macro name. + (PS): Indent call of end macro. + (PS): Add comment after escaped space. + (PS, PF): Prefix with `do` call of long macro name. + + Fixes . + +2021-08-08 G. Branden Robinson + + * src/utils/grog/grog.pl (do_line): Recognize `n1` and `n2` as + characteristic me(7) macros. + +2021-08-08 G. Branden Robinson + + * tmac/groff_me.7.man: Document GF, IE, IF, IS, and PF macros. + +2021-08-08 Dave Kemper + + * tmac/e.tmac: Rename `PE` to `PF` but remove vertical spacing. + (PE): New `PE` calls `PF` and then spaces as old `PE` did. + + Fixes . + +2021-08-06 Dave Kemper + + * doc/meref.me: Improve documentation of image-inclusion macros. + + Fixes . + +2021-08-06 Dave Kemper + + GNU pic recognizes two possible endings of a pic block: .PE or + .PF. This fact was documented in doc/pic.ms but not in the pic + man page. The minimal pic implementation provided by pic.tmac + also did not include a .PF definition. + + * src/preproc/pic/main.cpp (main): Add dummy definition of `PF` + macro. + * tmac/pic.tmac (PF): Add macro that performs indentation only. + (PE): Call PF for indentation. + + * doc/pic.ms (Interface to [gt]roff/How Scaling is Handled): + * src/preproc/pic/pic.1.man (Description, Options): Mention `PF` + in addition to `PS` and `PE`. + + Fixes . + +2021-08-05 G. Branden Robinson + + * tmac/refer-ms.tmac: + * tmac/s.tmac (fn@init, @PP): Rename strings + `fn@sup-{start,end}` to `fn@mark-{start,end}`. This makes it + more clear that the strings are brackets for the footnote + marker, and not so much to do with the note text. Further, in + nroff mode, they aren't superscripts at all, but bracket glyphs. + +2021-08-02 G. Branden Robinson + + * src/preproc/refer/refer.1.man (Examples): Add section. + + Addresses part of . + +2021-08-02 G. Branden Robinson + + * tmac/refer-ms.tmac: Use `fn@sup-{start,end}` instead of + `par@sup-{start,end}` when setting refer(1) citation labels. + This improves the appearance of the default labels on nroff + devices. Continues commit caeede07, 1 May. + +2021-08-01 G. Branden Robinson + + * tman/an-ext.tmac (EX, EE): Stop manipulating hyphenation. + It's redundant since disabling fill mode already prevents + automatic breaking, and therefore automatic hyphenation. + * tmac/groff_man.7.man.in (Description/Document structure + macros) : Update documentation. + +2021-08-01 G. Branden Robinson + + * src/utils/grog/grog.pl: Update authorship credits. I appear + to have removed or refactored all of the "device" (recte: macro + package) inference logic adapted from Ralph Corderoy's grog.sh; + see commit 3617f42048f54cc3f0adc282ee3b9e481c75ebd5, 13 June + 2014. + +2021-07-31 G. Branden Robinson + + * src/utils/grog/grog.pl: Refactor through relocation and + renaming. Move several global objects into subroutines. + - `@request` -> `&do_line` + - `@macro_ms`, `@macro_man`, `@macro_man_or_ms` -> + `&infer_man_or_ms_package` + - `@main_package` -> `&construct_command` + Rename some objects for clarity. + - `%Groff` -> `%score` + - `@filespec` -> `$input_file` + Delete unused object. + - `@standard_macro` + Add comments. + +2021-07-31 G. Branden Robinson + + * src/utils/grog/grog.pl (do_line): When matching macro/request + names, accept any non-whitespace character (Perl: \S) instead of + just a word-constituent character (Perl: \w), since roff + identifiers can contain unusual characters (refer(1) and + groff_me(7) illustrate some real-world cases). + +2021-07-31 G. Branden Robinson + + * src/utils/grog/grog.pl: Refactor macro package inference. + - Stop manually populating `Groff` hash. (It's itching for a + rename.) + - Stop calling now-dead subroutine `infer_macro_packages`. + (do_line): Always store the names of all macros called to the + `Groff` hash, incrementing it. Now it's a proper scoreboard. + Populate `inferred_main_package` from here upon encountering + characteristic (i.e., uniquely named) macros of each package. + Bug fix: drop "SP" from list of characteristic mom(7) macros; + it's shared with mm(7). + (infer_man_or_ms_package): Update comment. Return 0 (false) if + document appears to be "raw", using no full-service macro + package. + (infer_macro_packages): Delete; do_line() does this work. + +2021-07-31 G. Branden Robinson + + * src/utils/grog/grog.pl: Refactor preprocessor inference. + - Add new list, `inferred_preprocessor`. + - Drop preprocessor-related keys from `Groff` hash. + - Drop scalar `inside_tbl_table`. + (do_line): Set up hash `preprocessor_for_macro`. Detect + preprocessor macros the way the preprocessors do, explained in a + comment. Respect AT&T compatibility mode when doing so. Build + list of inferred preprocessors. This replaces the extensive and + gaseous series of `if` statements that manipulated the `Groff` + hash. + (infer_preprocessors): Completely replace. Set up a hash + `option_for_preprocessor` mapping preprocessor names to groff + options (where applicable). Append to `command` and + `preprocessor` lists as appropriate. Sort the preprocessor + options so they don't move around in the argument list depending + on the order of their macros' appearance in the input. + + * src/utils/grog/tests/smoke-test.sh: Update test cases to + expect preprocessor options to show up in sorted order. + +2021-07-31 G. Branden Robinson + + * src/utils/grog/grog.pl: Drop dead code. Delete global + hash `preprocs_tmacs`, unused since commit b0de53c9, 30 June. + +2021-07-30 G. Branden Robinson + + [grohtml]: Fix code nit. + + * src/preproc/html/pre-html.cpp (get_image_generator): + Type-qualify `keyword_len` as `const` to encourage the compiler + to compute this value (the length of a string literal) at build + time. + +2021-07-30 G. Branden Robinson + + [troff]: Slightly refactor. + + * src/roff/troff/node.cpp: Add static `image_filename_len` to + store length of cached image file name, so we don't wastefully + recompute its length every time one is re-used. + (suppress_node::tprint): Compute image file name length only + when saving a new image file name. Use saved length in later + expressions. + (min): Drop unused inline function. + +2021-07-30 G. Branden Robinson + + [troff]: Fix regression (breaking important pdfmark/pdfroff + features) caused by my commit + e876d4bfd193abb9a7d1fb6e76519349bded482a, 27 July. An empty + image file name is in fact semantically valid when writing a + bounding box; pdfmark uses such boxes to frame hyperlinks. + Avoid null pointer dereference by initializing `image_filename` + to an empty string literal. Thanks to Tadziu Hoffman and Keith + Marshall for their patient explanations. + +2021-07-29 G. Branden Robinson + + [troff]: Refactor some internal functions. + + * src/roff/troff/node.cpp: Rename two functions that have only + one caller. + - get_reg_int -> get_register + - get_reg_str -> get_string + We now have: + (get_register, get_string): Use `assert()` aggressively because + these are deeply internal and validation is imperative. Get rid + of diagnostic messages (one of which perpetuated the dubious + "number register" nomenclature) accordingly. + (fetch_register): Also rename `prev_value`, misleadingly + specific and seemingly copy-and-pasted out of a context where an + auto-increment or -decrement might have been applied. It's just + the `value`. + (suppress_node::tprint): Update call site. + +2021-07-29 G. Branden Robinson + + [troff]: Refactor `get_value` member functions. Given their + names and popular "getter/setter" paradigms from many OO + languages, the return type is misleading. Change it from `int` + to `bool` since it returns only a success/failure status and + modifies an argument (passed by reference) to deliver the + requested data. + + * src/roff/troff/reg.h (reg, variable_reg): + * src/roff/troff/div.cpp (page_offset_reg, page_length_reg) + (vertical_position_reg, high_water_mark_reg) + (distance_to_next_trap_reg, page_number_reg, no_space_mode_reg): + * src/roff/troff/env.cpp (int_env_reg, vunits_env_reg) + (hunits_env_reg, horizontal_place_reg): + * src/roff/troff/input.cpp (writable_lineno_reg): + * src/roff/troff/reg.cpp (reg, number_reg, variable_reg): Update + class and member function definitions to reflect the new type. + Update member function definitions to return appropriate Boolean + literals instead of 0 and 1. + +2021-07-28 G. Branden Robinson + + [grohtml]: Fix Savannah #60981. Refactor device description + file handling and make it more robust. Make pre-grohtml's + -F option work as documented and honor device description file + semantics documented in groff_font(5). + + * src/preproc/html/pre-html.cpp: Store partial filespecs of HTML + and PostScript device files in constant strings. + (get_resolution): Initialize `res` to zero. Only `free()` the + pointer `pathp` if `open_file()` succeeded (populating it). + Stop checking for valid `sscanf()` conversions of an integer to + store in `res`, and don't return early. Instead process the + whole DESC file; per our Texinfo manual and groff_font(5), + "Later entries in the file ... override previous values." + (get_image_generator): Add new function, paralleling + `get_resolution()`, replacing open-coded logic in `main()`. + Only the body of the `while` loop significantly differs. + Instead of using `sscanf`, process the input character by + character matching the keyword and {1,} spaces or tabs + after it. Whatever follows in `linebuf` must be the program + name. + (imageList::createPage): Add `assert()` to cause failure if an + empty image generator program gets this far, because it creates + repeated messes if it does. (Something isn't checking exit + statuses.) + (main): Condense `image_gen` collection to a function call, a + null pointer check, and a fatal diagnostic. Add a sanity check + and a fatal diagnostic if the PostScript resolution is garbage. + {It's initialized to -1 and `get_resolution()` will return 0 if + it doesn't find one.} + + Fixes . + +2021-07-28 G. Branden Robinson + + [grohtml]: Delete or rename `debug` symbols to avoid clash with + new `debug` function in libgroff. + + * src/preproc/html/pre-html.cpp: Update a comment to refer to + "debugging" mode. Rename static global from `debug` to + `debugging`. + (html_system, imageList::createPage, imageList::createImage, + print_args, char_buffer::do_html, char_buffer::do_image, + scanArguments): Update uses of static global. + + * src/preproc/html/pushback.cpp: + * src/preproc/html/pushback.h: Delete unused `debug` member + variable. + +2021-07-27 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Fix straggling use of `$1`, which + might not have a clear meaning in some shells after being + shifted (what if we just shifted the last argument?). Also + `continue` after processing a (groff) option argument, as we + should make no attempt to parse it. + +2021-07-27 G. Branden Robinson + + * src/roff/troff/input.cpp (do_suppress): Recast diagnostic + messages for clarity, to communicate in terms of what the + escape sequence _is_, and to quote literals expected as input. + * src/roff/troff/node.cpp (suppress_node::tprint): Recast + diagnostic to prevent misinterpretation of image "description" + as being HTML IMG tag alt text or something like that. + Unfortunately, the new language speaks in terms of internal + implementation details ("grohtml-info"), but at least that way + it's easier for a user to decide if they care about it. + +2021-07-27 G. Branden Robinson + + [troff]: Avoid using sprintf() with user-controlled format + string. + + * src/preproc/html/pre-html.cpp (makeFileName): Add comment + noting need for implementation synchrony between this function, + which generates \O5 escape sequences, and troff's + suppress_node::tprint member function, which interprets them. + * src/roff/troff/node.cpp: Rename 2 static globals for clarity. + - `last_image_filename` -> `image_filename` + - `last_image_id` -> `subimage_counter` + (suppress_node::tprint): Set up the buffer for image file name + to be written using a constant rather than an embedded literal. + Unconditionally initialize the buffer with a string terminator, + so there is no chance of a read from uninitialized storage. + Drop unused code involving `tem`. Drop stale comments. Clarify + comment: an `image_filename` doesn't _always_ contain a format + string, only sometimes. Replace use of `sprintf` with manual + construction of a new image filename string. There are two + cases, one where a format string {presently "%d"} is present, + and one where it is not. If it is present, locate it + {`percent`}. This means a limited/bounded image ("subimage") is + being processed; increment the subimage counter. Write a new + image file name preserving the parts before and after "%d" (the + "prefix" and "suffix", and replacing only the middle, using + `sprintf` with the subimage counter and the (string literal) + format. Be mindful of string bounds and memory allocation, + issuing diagnostics or aborting as necessary. If the image file + name does _not_ contain a format string, but needs only to be + copied, do that (`strcpy`), again instead of using `sprintf`. + + Fixes . + +2021-07-26 G. Branden Robinson + + [grohtml]: Fix Savannah #60971. + + * src/preproc/html/pre-html.cpp (makeFileName): Consistently put + a dash at the end of `macroset_template` whether the image file + name stem is user-supplied or the default. Stop adding the dash + before the image number in `image_template` instead. This makes + the image file name format reliable whether the image needs to + be subdivided (eqn) or not (tbl). + + Fixes . + +2021-07-26 G. Branden Robinson + + [grohtml]: Reduce noise to standard error stream. + + * src/preproc/html/pre-html.cpp (imageList::createImage): Fix + apparent oversight: `EXE_EXT` was not being applied to the + second of three commands being run in a pipeline (did Windows + users notice?). Also issue (undocumented!) `-quiet` option to + `pnmtopng` to shut up its commentary about counting colors. + +2021-07-26 G. Branden Robinson + + [grohtml]: Stop discarding standard error output. + + * src/preproc/html/pre-html.cpp (html_system): Stop sending the + standard error stream to /dev/null; this just makes debugging + harder, and doesn't produce much more output for well-formed + input documents. Rename `save_stdout` to `saved_stdout`. + +2021-07-26 G. Branden Robinson + + [grohtml]: Fix misspelled variable. + + * src/preproc/html/pre-html.cpp: Rename `IMAGE_BOARDER_PIXELS` + to `IMAGE_BORDER_PIXELS`. + +2021-07-26 G. Branden Robinson + + [libgroff, troff]: Add debug diagnostic level. + + * src/include/error.h: Declare functions + `debug_with_file_and_line` and `debug`. + * src/libs/libgroff/error.cpp: Add `DEBUG` to enum `error_type`. + (do_error_with_file_and_line): Add case for `DEBUG` in switch. + (debug, debug_with_file_and_line): Add new functions. + + Do the same for troff since it has a private implementation of + the diagnostic functions (thanks to `output_warning()`). + + * src/roff/troff/input.cpp: Add `DEBUG` to enum `error_type`. + (do_error_with_file_and_line): Add case for `DEBUG` in switch. + (debug, debug_with_file_and_line): Add new functions. + +2021-07-26 G. Branden Robinson + + * src/utils/hpftodit/hpftodit.cpp (hp_msl_to_ucode_name) + (unicode_to_ucode_name): Hush "format nonliteral" compiler + warnings by using a preprocessor-defined string literal as an + sprintf() format string instead of a C++ variable that just + compared identically to the same thing. + +2021-07-25 G. Branden Robinson + + * src/utils/hpftodit/hpftodit.cpp (show_symset): Prevent + sprintf() from overunning a static buffer. Thanks to Bjarni + Ingi Gislason for the report. Resize buffer to be large enough + to accommodate a 64-bit unsigned int type formatted as decimal. + Also add assert() before the sprintf() to abort if the int type + is even larger than that. Use "%u" conversion instead of "%d" + since the quantity is unsigned. + (hp_msl_to_ucode_name): Similar, but for a signed int. + (unicode_to_ucode_name): Similar, but for a signed int formatted + as (unsigned) hexadecimal. + + Fixes . + +2021-07-23 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Refactor, mostly by relocation. Move + locale character set inference logic so that we only run it if + we have to (`-T` option was invalid or not given and + `GROFF_TYPESETTER` was not set in the environment or invalid). + Initialize `T` variable as empty. + +2021-07-23 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Use Version 7 Unix sh-compatible form + of parameter expansion; per the GNU Autoconf manual[1], "[o]ld + BSD shells, including the Ultrix sh, don't accept the colon for + any shell substitution, and complain and die." This is also the + form of such substitutions used elsewhere in the script, so they + should be mutually consistent. + + [1] https://www.gnu.org/software/autoconf/manual/autoconf-2.60/\ + html_node/Shell-Substitutions.html + +2021-07-23 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Slightly refactor. Rename formerly + unused loop index variable from `i` to `arg` to leverage it in a + later diagnostic message without a separate definition. Inside + the loop, expand `arg` instead of positional parameter 1, the + meaning of which is less obvious after the parameter list is + shifted by the new `is_option_argument_pending` logic (commit + 2b955c57, 20 July). + +2021-07-23 G. Branden Robinson + + * src/roff/groff/groff.1.man (Options) <-S>: Fix error: `-S` + sets safer mode (redundantly) but is not passed to pic and troff + as was claimed. + +2021-07-21 G. Branden Robinson + + * src/roff/troff/number.cpp (parse_term): Tweak diagnostic + messages. When a left operand to a binary operator is empty, + report the operator in question (helpful for string + interpolations in complex expressions). When handling input + scaling indicators, drop word "this" from "this context", since + the parser's context might not be clear from a file name and + line number. Say "scaling indicator" instead of "scale + indicator". + (parse_expr, parse_term): Rename function parameter from + `scale_indicator` to `scaling_indicator`. + +2021-07-21 G. Branden Robinson + + * src/roff/troff/input.cpp (define_color): Tweak warning + diagnostics for clarity. Only one value is expected when + defining a color in the `gray` color space. Quote recognized + color space names when complaining of an unknown one. + +2021-07-21 G. Branden Robinson + + [nroff]: Pass a supplied `-c` option to groff. While at present + this does little more than `-P-c` already achieves, that might + not be true forever. Further, there is a distinction between + ignoring color-related requests in groff input documents and + ignoring color-related commands in device-independent output. + This distinction would make it unwise to adapt `-c` to any other + purpose in nroff in the future. + + * NEWS: Update item from commit dd725dce, 10 February 2020. + * src/roff/nroff/nroff.sh: Pass `-c` option to groff in addition + to synthesizing a `-P-c` option (for grotty) when it is seen. + * src/roff/nroff/nroff.1.man (Options): Document `-c` as an + option recognized by troff(1). + +2021-07-20 G. Branden Robinson + + [nroff]: Support space between option flags and their arguments. + + * src/roff/nroff/nroff.sh: Add new `is_option_argument_pending` + flag to add an additional state to the option parser. Set it if + an argument-requiring option is encountered with no abutting + argument. If it is set when a new argument is encountered, + absorb the argument into the groff option list and clear the + flag. Modernize script in a couple of other ways. + - Exit with status 2 upon usage errors so that this condition + is easily distinguished from a groff abort (which exits with + status 1). + - Test shell variables for non-nullity with test(1) -n + operator instead of a string comparison. + * src/roff/nroff/tests/verbose_option_works.sh: Test correct + construction of groff command using this input form. + * src/roff/nroff/nroff.1.man (Options): Add spaces between + option flags and option arguments. Sync metasyntactic variable + names with groff(1) while we're at it. + (Description): Drop sentence warning of whitespace prohibition. + (Exit status): Add new section. + + Fixes . + +2021-07-19 G. Branden Robinson + + * src/roff/troff/input.cpp (main): Emit error diagnostic if `-d` + or `-r` option is given a malformed argument. This prevents a + string or register with an empty name from being created. + + Fixes . + +2021-07-19 G. Branden Robinson + + * src/roff/nroff/nroff.sh: + * src/roff/troff/input.cpp (usage): Use "dev" as metasyntactic + variable name for -T option argument to achieve consistency with + our other documentation. + +2021-07-19 G. Branden Robinson + + [groff]: Comment out vestiges of gideal support. It would be + lovely to have, but no free (and GPL-compatible) implementation + has showed up after decades of waiting. Production of the + original was a Ph.D. thesis. Excited by de Moivre's theorem? + Take a stab at it. + + * src/roff/groff/groff.cpp (main): Comment out effect of `-J` + option. It remains recognized, but silently ignored (instead of + attempting to execute a nonexistent preprocessor). + (synopsis): Add comment reminding us to document the option if + we ever get the support. + (help): Comment out documentation of option. + +2021-07-18 G. Branden Robinson + + [[gnt]roff]: Make usage messages more accurate. + + * src/roff/groff/groff.cpp (synopsis): Drop `-h` and `-v` from + normal operation synopsis. Sort options in en_US lexicographic + order. Tighten presentation of alternate usage forms. + (help): Document longer forms of `-d` and `-r`. + * src/roff/nroff/nroff.sh: Report `$prog` instead of "nroff" + literal. Refer to `-P` option argument as "arg" instead of + "opt", for consistency with groff usage message. Use opposite + case from option letter for option argument. + * src/roff/troff/input.cpp (usage): Put brackets around options. + Sort options in en_US lexicographic order. Drop `-v` from + normal operation synopsis. Use opposite case from option letter + for option argument. Put operand name in capitals. Set valid + usage forms on one physical line each (see 89648fb4, 5 June). + Add synopsis line for alternate usage forms. + +2021-07-13 G. Branden Robinson + + [troff]: Refactor environment initialization, switching, and + copying. + + * src/roff/troff/env.cpp: Rename struct `env_list` to + `env_list_node` since it describes a node of a singly-linked + list. Remove constant `NENVIRONMENTS` and array `env_table`. + Add static symbol `default_environment_name` to replace string + literal. + (init_environments): Stop initializing `curenv` through + `env_table`. Use `default_environment_name` for that + initialization and add the default environment to + `env_dictionary`. + (environment_switch): Simplify. Shorten "dummy environment" + diagnostic message. Stop creating an integer-named + environment inside the `env_table` array, only falling through + to use the `env_dictionary` if the named environment is not a + valid integer or if the array is full. Instead use + `env_dictionary` always. Drop no longer needed `pop` + quasi-Boolean integer with extra state to suppress environment + stack underflow errors. Instead report the error if underflow + occurs, regardless of any other circumstance. + (environment_copy): Simplify. Stop searching the `env_table` + array for an environment to copy from, only falling through to + use the `env_dictionary` if the named environment is not a valid + integer or if the array is full. Instead search + `env_dictionary` always. Emit "no environment specified to copy + from" diagnostic only if the `evc` request is given no argument. + If the source environment to copy from is given but not found, + emit a new diagnostic naming the nonexistent environment. Fix + bug: stop returning early if no copying could be done; instead + fall through to the end of the function, which calls + `skip_line()` and prevents anything on the remainder of the + {invalid} control line from being interpreted. Problem dates + back to commit da3b7137, 6 March 2000 (groff 1.16). + + Fixes . + +2021-07-13 G. Branden Robinson + + * src/roff/groff/tests/evc_produces_no_output_if_invalid.sh: + Regression-test Savannah #60913. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2021-07-11 G. Branden Robinson + + Update English hyphenation patterns. + + * NEWS: Add item. + * tmac/hyphen.en: Update file using `hyph-en-us.tex` patterns + file from the TeX hyph-utf8 project. + * tmac/hyphenex.en: Remove explicit hyphenations for words that + no longer require them when using the new patterns. Add one + item scraped from an erratum comment in hyphen.en + {"dem-o-crat"}. + + The new patterns likely _will_ change the automatic hyphenation + break points of your English documents. Here is a sample of + affected words found within groff's own documentary corpus. + + OLD NEW + === === + ar‐range‐ment arrange‐ment + col‐umns columns + con‐struc‐ted con‐structed + cus‐tom‐ized cus‐tomized + def‐i‐ni‐tions de‐f‐i‐n‐i‐tions + der‐i‐va‐tions de‐riva‐tions + hy‐phen‐a‐tion hy‐phen‐ation + ma‐te‐rial ma‐te‐r‐ial + Mi‐cro‐soft Mi‐crosoft + pipe‐lines pipelines + post‐pro‐ces‐sors post‐proces‐sors + pro‐cessed processed + pro‐cesses processes + spa‐ces spaces + Wer‐ner Werner + +2021-07-10 G. Branden Robinson + + [troff]: Add unit test for `substring` request. + + * src/roff/groff/tests/substring_works.sh: Do it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2021-07-10 G. Branden Robinson + + [tmac]: Remove compatibility mode save registers after using + them. + + * tmac/an.tmac: + * tmac/andoc.tmac: + * tmac/cp1047.tmac: + * tmac/devtag.tmac: + * tmac/ec.tmac: + * tmac/fallbacks.tmac: + * tmac/latin1.tmac: + * tmac/latin2.tmac: + * tmac/latin5.tmac: + * tmac/latin9.tmac: + * tmac/papersize.tmac: + * tmac/pdfpic.tmac: + * tmac/psold.tmac: + * tmac/pspic.tmac: + * tmac/trace.tmac: + * tmac/unicode.tmac: Do it. + + * doc/groff.texi (Implementation Differences): + * man/groff_diff.7.man (Implementation Differences): Illustrate + doing so in relevant examples. + +2021-07-09 G. Branden Robinson + + * tmac/troffrc: Load the English localization file `en.tmac` by + default, instead of dealing with hyphenation language and + patterns directly in this file. (This also replaces a + localization-determination mechanism that was never part of a + groff release.) + + * src/roff/groff/tests/initialization_is_quiet.sh: + * src/roff/groff/tests/localization_works.sh: Rewrite to use + explicit macro file loading localization mechanism. + +2021-07-06 G. Branden Robinson + + Move core man(7) implementation to an.tmac. + + * tmac/an.tmac: Delete andoc-sourcing wrapper. + + * tmac/an-old.tmac: Rename... + * tmac/an.tmac: ...to this. + + * tmac/tests/an-old_AT-and-UC-footer-saved-and-restored.sh: + * tmac/tests/an-old_CS-register-off.sh: + * tmac/tests/an-old_CS-register-on.sh: + * tmac/tests/an-old_CS-register-unspecified.sh: + * tmac/tests/an-old_CT-register-off.sh: + * tmac/tests/an-old_CT-register-on.sh: + * tmac/tests/an-old_CT-register-unspecified.sh: + * tmac/tests/an-old_FT-bad-value-should-not-trash-titles.sh: + * tmac/tests/an-old_LL-init-sanely.sh: + * tmac/tests/an-old_TH-repairs-ad-damage.sh: + * tmac/tests/an-old_TH-repairs-hy-damage.sh: + * tmac/tests/an-old_TS-do-not-keep-tables-when-cR-set.sh: + * tmac/tests/an-old_X-register-works.sh: + * tmac/tests/an-old_avoid-two-font-denial-of-service.sh: + * tmac/tests/an-old_no-break-after-short-paragraph-tags.sh: + * tmac/tests/an-old_page-footers-present.sh: + * tmac/tests/an-old_page-header-has-current-data.sh: + * tmac/tests/an-old_title-abbreviation-works.sh: Rename... + + * tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh: + * tmac/tests/an_CS-register-off.sh: + * tmac/tests/an_CS-register-on.sh: + * tmac/tests/an_CS-register-unspecified.sh: + * tmac/tests/an_CT-register-off.sh: + * tmac/tests/an_CT-register-on.sh: + * tmac/tests/an_CT-register-unspecified.sh: + * tmac/tests/an_FT-bad-value-should-not-trash-titles.sh: + * tmac/tests/an_LL-init-sanely.sh: + * tmac/tests/an_TH-repairs-ad-damage.sh: + * tmac/tests/an_TH-repairs-hy-damage.sh: + * tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh: + * tmac/tests/an_X-register-works.sh: + * tmac/tests/an_avoid-two-font-denial-of-service.sh: + * tmac/tests/an_no-break-after-short-paragraph-tags.sh: + * tmac/tests/an_page-footers-present.sh: + * tmac/tests/an_page-header-has-current-data.sh: + * tmac/tests/an_title-abbreviation-works.sh: ...to these. + + * tmac/tmac.am (TMACNORMALFILES): Remove an-old.tmac. + (tmac_TESTS): Reflect renames of test files above. + (tmac/stamp-wrap): Macro-source `an.tmac` in the man wrapper. + + * tmac/andoc.tmac: Refer to (and macro-source) an.tmac. + * tmac/man.tmac: Macro-source `an.tmac`, not `andoc.tmac`. + * tmac/tests/andoc_flush-between-packages.sh: Call groff with + `-mandoc` option instead of `-man`. Henceforth, if you want the + andoc wrapper, you have to ask for it. + + * tmac/an.tmac: Drop "-old" nomenclature. + + * PROBLEMS: + * doc/groff.texi (man): + * tmac/man.local: Update documentation appropriately. + + * NEWS: Add item. + + * man/groff_tmac.5.man (Macro packages/man pages): + * src/roff/groff/groff.1.man (Usage/Macro packages): Update + discussion of an, doc, and andoc. + * tmac/groff_man.7.man.in (Files): Update descriptions of + an.tmac, andoc.tmac, man.tmac, and mandoc.tmac. + + Fixes . + +2021-07-05 G. Branden Robinson + + [troff]: Slightly refactor. Make the source code slightly more + accessible by using a `bool` type for a function's default + parameter used as a Boolean, and comment it at call sites where + the default is overridden. + + * src/roff/troff/token.h (get_name, get_long_name): Change type + of parameter from `int` to `bool` and default from 0 to `false`. + * src/roff/troff/input.cpp (do_get_long_name) + (empty_name_warning, get_name, get_long_name): Change type of + parameter from `int` to `bool` in declarations and definitions. + * src/roff/troff/column.cpp (column_justify): + * src/roff/troff/div.cpp (diversion_trap): + * src/roff/troff/env.cpp (environment_switch, environment_copy) + (do_input_trap, set_hyphenation_language) + (do_hyphenation_patterns_file): + * src/roff/troff/input.cpp (define_color, composite_request) + (do_define_string, do_define_macro, rename_macro, alias_macro) + (chop_macro, do_string_case_transform, substring_request) + (length_request, asciify_macro, unformat_macro, do_register) + (device_macro_request, do_if_request, do_source) + (ps_bbox_request, do_open, close_request, do_write_request) + (write_macro_request, define_class, copy_file, vjustify) + (transparent_file, do_macro_source): + * src/roff/troff/node.cpp (font_translate, font_position, style) + (get_fontno): + * src/roff/troff/reg.cpp (define_number_reg, inline_define_reg) + (alter_format, alias_reg, rename_reg): Update call sites. Add + (comment indicating meaning of parameter. + + Do similarly for token::delimiter() member function. + + * src/roff/troff/token.h (token::delimiter): Change type of + parameter from `int` to `bool`, name from `warn` to `err` (to + match definition and behavior in input.cpp) and default from 0 + to `false`. + * src/roff/troff/input.cpp (token::delimiter): Change type of + parameter from `int` to `bool` in definition. + * src/roff/troff/input.cpp (do_expr_test, get_delim_number) + (get_line_arg, read_size, do_register, read_draw_node): + * src/roff/troff/reg.cpp (inline_define_reg): Update call sites. + Add comment indicating meaning of parameter. + +2021-07-05 G. Branden Robinson + + * tmac/an-old.tmac (an-footer): Remove string + `an-outer-footer-text` after we're done with it. + +2021-07-05 G. Branden Robinson + + Remove the stripper script and its vestiges. + + * contrib/hdtbl/hdmisc.tmac: + * contrib/hdtbl/hdtbl.tmac: + * contrib/mom/om.tmac: + * tmac/doc.tmac: + * tmac/e.tmac: + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: + * tmac/mdoc/doc-syms: Remove `%beginstrip` comment. + + * tmac/strip.sed: Delete. + + * tmac/tmac.am (EXTRA_DIST): Stop shipping `strip.sed`. + + Fixes . + +2021-07-04 G. Branden Robinson + + Skip the stripper, part 3/3 (mdoc). + + * tmac/doc-old.tmac-u: + * tmac/doc.tmac-u: + * tmac/mdoc/doc-common-u: + * tmac/mdoc/doc-ditroff-u: + * tmac/mdoc/doc-nroff-u: + * tmac/mdoc/doc-syms-u: Rename these... + + * tmac/doc-old.tmac: + * tmac/doc.tmac: + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: + * tmac/mdoc/doc-syms: ...to these. + + * tmac/tmac.am (TMACNORMALFILES): Add `doc-old.tmac` and + `doc.tmac`. + (TMACUNSTRIPFILES, TMACSTRIPFILES): Delete variables. + (dist_tmac_DATA): Drop `$(TMACUNSTRIPFILES)`. + (nodist_tmac_DATA): Drop `$(TMACSTRIPFILES)`. + (TMACMDOCSTRIPFILES): Rename... + (TMACMDOCFILES): ...to this. + (nodist_mdoc_DATA, MOSTLYCLEANFILES): Reflect above rename. + (nodist_mdoc_DATA): Rename... + (dist_mdoc_DATA): ...to this. + (TMACMDOCUNSTRIPFILES): Delete variable. + (EXTRA_DIST): Drop `$(TMACMDOCUNSTRIPFILES)`. + ($(TMACSTRIPFILES), $(TMACMDOCSTRIPFILES)): Drop targets. + + The portions above are based on a patch by Ingo Schwarze. + + * tmac/doc.tmac: + * tmac/mdoc/doc-common: + * tmac/mdoc/doc-ditroff: + * tmac/mdoc/doc-nroff: + * tmac/mdoc/doc-syms: Bracket macro definitions tightly with + `eo` and `ec` requests since they were written under this + assumption. The files in general were also drafted under the + assumption that they'd be stripped, so `eo` was in effect for + broad swaths of the file including portions outside of any macro + definition where comments were used. But comments are expressed + using the escape character! So we got warnings about an + undefined '\"' macro, and that was just the beginning of a + wrecking ball of trouble that smashed through the + implementation. Some--but not all--string definitions (and + appendments) needed to be bracketed with `eo` and `ec` as well, + to delay interpolation of embedded string names that are not + defined until macros interpolate them later. I did what + appeared necessary to pass our tests and keep -Tutf8 and -Tps + renderings of tmac/groff_mdoc.7 from changing from their + strip-influenced output. Subtle bugs might linger, but some + won't be the fault of the unstripping process. (For instance, + try provoking a usage message on the `Hf` macro.) + +2021-07-03 G. Branden Robinson + + [man pages]: Remove compatibility save register. + + * **/*.man*: Remove page-local compatibility save register after + using it. + +2021-07-03 G. Branden Robinson + + [tmac]: Simplify `mso` requests. + + * tmac/X.tmac: + * tmac/Xps.tmac: + * tmac/dvi.tmac: + * tmac/html.tmac: + * tmac/lbp.tmac: + * tmac/lj4.tmac: + * tmac/ps.tmac: + * tmac/tty-char.tmac: + * tmac/tty.tmac: + * tmac/www.tmac.in: Move `mso` requests to be inside regions + where compatibility mode is turned off. I believe they were + placed where they were because things didn't work when the + compatibility mode register being saved was .C, rather than the + .cp register introduced in commit 6a37bb5f, 17 April 2020. Now + the logic is less mysterious. Also, remove the register used to + save compatibility mode after we're done with it, to reduce name + space clutter. + +2021-07-03 G. Branden Robinson + + * tmac/it.tmac: Drop sourcing of `latin1.tmac` and set up of + hyphenation codes; since the `hyphen.it` file is pure ASCII, we + don't need to expect Latin-1-encoded code points in it. + +2021-07-03 G. Branden Robinson + + [tmac]: Make localization files work in compatibility mode. + + * tmac/cs.tmac: + * tmac/de.tmac: + * tmac/en.tmac: + * tmac/fr.tmac: + * tmac/it.tmac: + * tmac/ja.tmac: + * tmac/sv.tmac: + * tmac/zh.tmac: Save and restore compatibility mode. + + * tmac/den.tmac: Invoke requests with `do`. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2021-07-03 G. Branden Robinson + + Add regression test for Savannah #60874. + + * src/roff/groff/tests/initialization_is_quiet.sh: Test it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2021-07-02 G. Branden Robinson + + Integrate Italian localization. + + * NEWS: Add item. Update an existing list of localization macro + files. + * doc/groff.texi (Manipulating Hyphenation): Update table of + hyphenation pattern left and right minimums and list of + available localization files to include Italian. + * man/groff_tmac.5.man: Update list of available localization + files to include Italian. + * src/roff/groff/tests/localization_works.sh: Test it. + * tmac/tmac.am (TMACNORMALFILES): Add `it.tmac` and `hyphen.it`. + + Fixes . + +2021-07-02 G. Branden Robinson + + [tmac]: Flesh out Italian localization. + + * tmac/hyphen.it: Add hyphenation patterns from TeX hyph-utf8 + project. + * tmac/it.tmac: + - Revise copyright date to just this year (it had been copied + from fr.tmac). + - Use grave accents instead of acute ones to indicate stress + on word-final vowels. Per the University of Wikipedia and a + sampling of apparently well-typeset Italian language + documents online, this appears to be correct. Yell at me if + I'm wrong. + - Source latin1.tmac instead of latin9.tmac; Italian doesn't + require any letter code points from Latin-9, unlike the + French file upon which this one was based, and Latin-1 is + less of a pain to work with. + - Set the hyphenation mode to 1 instead of 4 for congruence + with the requirements of the hyphenation patterns. + - Set up hyphenation codes. This (and sourcing latin1.tmac) + might not be necessary as the hyphenation pattern file, of a + more recent vintage than the others we're using, is pure + ASCII. However I don't understand these issues perfectly so + I am making the conservative choice. Again per the + University of Wikipedia, Italian requires only acute and + grave accents, in contrast to the rich French diacritical + bouillabaisse. + - Set the hyphenation language and load the pattern file. + - Add comments in parallel with other localization files and + to supply text editors with hints. + +2021-07-02 Edmond Orignac + + * tmac/it.tmac: Add Italian localization. + +2021-07-01 G. Branden Robinson + + Skip the stripper, part 1/3 ("me"). + + * tmac/e.tmac-u: Rename to... + * tmac/e.tmac: ...this. + + * tmac/tmac.am (TMACNORMALFILES): Add tmac/e.tmac. + (TMACUNSTRIPFILES): Remove tmac/e.tmac-u. + (TMACSTRIPFILES): Remove tmac/e.tmac. + + Fixes one third of . + +2021-07-01 G. Branden Robinson + + * src/utils/grog/grog.pl: Simplify parsing. Dave Kemper pointed + out that preprocessors like pic(1) use pretty unsophisticated + *roff parsing to determine where to perform their textual + replacements. My enhancements to support input line + continuation and cope with brace escapes were thus + overengineered. Remove them. + - Drop scalars `is_continued_line` and `logical_line`. + (do_line): Stop performing logical line concatenation and + detecting input line continuation. Perform operations on + `line` instead of `logical_line`. Stop removing brace + escapes. + * src/utils/grog/grog.1.man (Limitations): Update discussion. + + Fixes . Thanks, Dave! + +2021-06-30 G. Branden Robinson + + * src/roff/troff/reg.cpp (lookup_number_reg, alias_reg): In + diagnostic messages, say simply "register" instead of "number + register" (there is no other kind). + +2021-06-30 G. Branden Robinson + + [grog]: Refactor input parsing. + + * src/utils/grog/grog.pl: + - Add scalar `use_compatibility_mode` (see below). + - Add list `request` to store the names of all requests + recognized by groff so that they aren't confused with macro + names. + - Add scalars `have_seen_first_macro_call` (replaces + `before_first_command`, but at global scope), + `is_continued_line` and `logical_line`. The latter two + enable us to handle *roff input line continuation correctly. + (process_arguments): Set `use_compatibility_mode` if `-C` + option specified. + (process_input): Refactor to greatly simplify, to not attempt + to read the first line of an input file as a special case, and + to avoid sending `do_line` an undefined argument (when EOF is + reached). + (do_first_line): Delete. + (do_line): Rewrite the early stages of input parsing. + - Concatenate continued input lines, setting + `is_continued_line` and returning early as each one is seen, + storing the accumulating input in `logical_line`. + - Check the input line for the form of comment deposited by + Perl's Pod::Man, which uses a highly accented dialect of + man(7); if it's present, inflate `man_score` to compensate + for the page-private `IX` macro it defines but which + duplicates the name and function of a 4.2BSD-era ms(7) + extension that would otherwise deceive our scoring + mechanism, because Pod::Man produces `IX` calls to + metastatic excess. (An alternative to this kludge is + documented in comments: if a "standard" macro is redefined, + we could delete it from the relevant lists and hashes.) + - Strip *roff comments from input. + - Normalize control lines; convert the no-break control + character to the regular one and remove unnecessary + white space. + - Remove brace escapes. + - Recognize two-character macro calls when not followed by + white space in compatibility mode. + - Drop logic that erroneously attempted to infer soelim(1) use + from macro calls and request invocations. The grog(1) and + soelim(1) man pages now both explain why such an effort was + misguided. + - Recognize macro definitions created by .am and .am1 requests + {not just .de and .de1}. + - Ignore all other *roff requests. + - What remains must be a ("standard") macro call, so set + `have_seen_first_macro_call`. + + * src/utils/grog/grog.1.man (Limitations): Document a further + restriction: don't change the escape character, either. + + * src/utils/grog/tests/smoke-test.sh: Comment out pic-detection + test on soelim(1). The pic macro calls are guarded by roff + control structures and only worked previously by accident + because grog did not recognize *roff input line continuation, + now it does and the illusion is dispelled. (A reliable way to + fool grog before and after my refactoring is now documented in + its man page.) + + Fixes . + +2021-06-30 G. Branden Robinson + + Add regression test for Savannah #59622. + + * src/utils/grog/tests/recognize-perl-pod.sh: Test it. + * src/utils/grog/grog.am (grog_TESTS): Run test. + +2021-06-29 G. Branden Robinson + + * src/utils/grog/grog.1.man (Limitations): Document further + restrictions (no changing of control characters, control + structures not interpreted). + +2021-06-29 G. Branden Robinson + + [grog]: Refactor command-line argument handling. + + * src/utils/grog/grog.pl: + - Drop scalars `groff_opts`, `device`, and `with_warnings`. + - Move scalar `pdf_with_ligatures`... + (process_arguments): ...here. Recognize all groff options + that take an optionally whitespace-separated option argument + and apply the existing "delayed option" handling to them. + Push any groff option except `-m` as-is onto the constructed + groff command's argument list (`-m` handling is unchanged). + Match long option names exactly, not sloppily. Stop + recognizing `--warnings` option. Emit error diagnostic if + unrecognized long option encountered. + (infer_device): Delete subroutine and its top-level call site. + (help): Undocument `--warnings`. + + * src/utils/grog/grog.1.man: + (Synopsis): Use font style macros instead of .OP. Undocument + `--warnings`. + (Options): Note that the groff arguments produced by the grog + `--ligatures` option are supported only by the `pdf` device. + Undocument `--warnings`. Undocument groff-incompatible + restriction on whitespace before option arguments; grog is + compatible now. Simplify discussion in light of simplified + grog logic. + (Details): Undocument scenario where grog infers multiple + main/major/full-service macro packages; this no longer + happens. + (Examples): Update to no longer illustrate inclusion of `-T + ps` option; this no longer happens by default. + + * NEWS: Document removal of grog's `--warnings` option. + + Fixes ; groff options are + no longer "mangled". + +2021-06-29 G. Branden Robinson + + Add regression test for Savannah #57873. + + * src/utils/grog/tests/preserve-groff-options.sh: Test it. + * src/utils/grog/grog.am (grog_TESTS): Run test. + +2021-06-28 G. Branden Robinson + + [grog]: Refactor device (`-T` option) handling. + + * src/utils/grog/grog.pl: Redeclare `device` as a scalar instead + of a list. + (process_arguments): Generalize handling of `-T` and `-m` + options to permit optional whitespace. Rename scalar `was_T` to + `delayed_option`. + (infer_device): Stop unconditionally adding a `-T ps` argument + to the generated groff command. Remove logic that validates any + given `-T` option argument; instead, let groff fail if a bad one + is supplied (its own diagnostics in this scenario were improved + in commit 5a721a30, 27 May). This makes grog agnostic about any + differently configured default device in groff itself, and about + the GROFF_TYPESETTER environment variable. + + Fixes by getting out of + the way. + + * src/utils/grog/tests/PF-does-not-start-pic-region.sh: + * src/utils/grog/tests/smoke-test.sh: Update expected output. + +2021-06-28 G. Branden Robinson + + * src/utils/grog/grog.am (grog): Drop sed replacement of unused + configuration variables @g@, @BINDIR@, @libdir@, and @EGREP@. + * src/utils/grog/grog.pl (process_arguments, construct_command): + Tweak warning diagnostics to use a style where an empty argument + will be easy to spot. + (do_first_line): Stop emitting pseudo-diagnostic (to standard + output!) if we see a "groff options line" [it's not] of + incorrect form. The preprocessor encoding hint convention of + concern here is particular to man pages, disregarded by at least + one major implementation thereof (man-db man), and not used by + other types of roff documents; at this point, we don't yet know + if the document we're processing is a man page. + (construct_command): Correct comment and related logic error. + Clear the inferred main macro package if _any_ `-m` argument + matching any main macro package is given. Warn only if what is + specified doesn't match the inference. + +2021-06-28 G. Branden Robinson + + [grog]: Heavily refactor. + + * src/utils/grog/grog.pl: + - Drop import of unused module `Data::Dumper`. + - Drop unused scalars `Sp` and `correct_tmac`. + - Simplify determination of version number. Drop hash `at_at` + which only stored one key, `GROFF_VERSION`. Initialize + scalar `groff_version` to "DEVELOPMENT". Rename scalar + `before_make` to `in_source_tree` and initialize to zero. + Update `groff_version` with Automake-determined version + variable if it is defined (i.e., grog is not running outside + of, or in an unbuilt, groff source or binary distribution). + - Drop unused `Mparams` list. Replace it with new list + `requested_package`, which stores the arguments to any grog + `-m` options specified by the user. + - Rename many objects so that I, and others, can better + comprehend their purpose, and for consistent letter casing. + . @Command -> @command + . @devices -> @device + . $Prog -> $program_name + . %macros -> %user_macro + . $have_any_valid_args -> $have_any_valid_arguments + . &handle_args -> &process_arguments + . &handle_whole_files -> &process_input + . @preprograms -> @preprocessor + . &make_groff_device -> &infer_device + . &make_groff_preproc -> &infer_preprocessors + . &make_groff_tmac_others -> &infer_macro_packages + . &make_groff_tmac_man_ms -> &infer_man_or_ms_package + . &make_groff_line_rest -> &construct_command + - Drop many unused keys in `Groff` hash. + - Add new lists, `macro_ms`, `macro_man`, and + `macro_man_or_ms` to support new scoring technique to + disambiguate input documents between these two packages. + - Append the foregoing 3 lists to new list `standard_macro`, + and add these as keys to the `Groff` hash. + - Add new list `main_package` to keep track of full-service + package names. + - Add new scalars `man_score`, `ms_score`, and + `inside_tbl_table` to aid disambiguation of .TH macro calls + and the many macro names shared between man(7) and ms(7). + (process_arguments): Strip '-m' off of argument before storing + the remainder in `@requested_package`. + (do_line): Detect .TH macro call even if white space occurs + between the control character and the macro name. + (do_line): Inflate `$man_score` by 100 if .TH is the first + macro call seen in a document. + (do_line): Fix bug; clear `$before_first_command` in correct + scope--after any macro call, not just if we saw a .TH as the + first macro call. + (do_line): Set `$inside_tbl_table` when we see a .TS call. + (do_line): Clear `$inside_tbl_table` when we see a .TE call. + Also increment `$Groff{'tbl')' again, increasing the "score" + of tbl(1) usage evidence. + (do_line): Drop a lot of code that manually increments %Groff + keys corresponding to man and ms macros. This is now done + differently and elsewhere. + (do_line): Drop "P" from list of characteristic mm(7) macros. + (do_line): Simplify matching of mom(7) macros (match $command, + not $line). Extend list of characteristic mom(7) macros. + (do_line): Increment $Groff{$key} if $key is in + @standard_macro. + (infer_man_or_ms_package): Rewrite. Compute a score for each + package by counting occurrences of their characteristic + macros. If both have a score of zero, assume that the input + is a raw roff document. If the scores are equal + {doc/webpage.ms, startlingly, comes within 1 point of a tied + score}, infer ms(7) if 'TH' was never called, and if it was, + issue a diagnostic advising user to supply a disambiguating + `-m` option. Otherwise, the scores are unequal: infer the + package of the winner. Set scalar `inferred_main_package` + instead of pushing `-m` options onto `@m`. + (infer_macro_packages): Set scalar `inferred_main_package` + instead of pushing `-m` options onto `@m`. Explicitly return + 0 if we fall off the end of the function. + (construct_command): Rewrite handling of -m options. Add new + list `msupp` to store supplementary (non-main) macro package + arguments. If a full-service package was explicitly + requested, it had better not clash with what we inferred. If + it does, explicitly unset `inferred_main_package` so that the + -m arguments are placed in the same order that the user gave + them; caveat dictator. If `--run` option was given, just + print the command; don't preface it with __FILE__ and __LINE__ + noise. + - Remove comments documenting shared variables used by + subroutines. These are far from useless but too tedious to + keep up to date while the code is in flux. + - Note several places for further code review or refactoring + with "XXX" comments. + - Add Vim modeline. + + grog now passes all its tests and correctly infers arguments for + all in-tree groff documents (except for a known, and already + documented in grog(1), false positive detection of soelim in + soelim(1)). This refactor also obviates or resolves several + outstanding Savannah tickets. + + Fixes by obviating it; + grog no longer cares about file name extensions on man pages (or + any other input). + + Fixes ; same. The quality + of diagnostic messages has been improved as well. + + Fixes ; same. + + Fixes . The attached + patch was a less aggressive refactor of &do_line and %Groff. + Its author made the following claim for it: "With this patch, + all 'man', 'me', 'mom, and 'ms' files in the repository are + correctly identified. The only example of a 'mm'-file is + "letter.mm", which is not recognized correctly." As noted + above, the present refactor achieves correct recognition of all + of the files, including letter.mm. + +2021-06-28 G. Branden Robinson + + * src/utils/grog/tests/smoke-test.sh: Perform whole-line + matches. Apply DRY principle to expected output. In + anticipation of pending changes to grog.pl, uncomment and add + tests for several in-tree documents. + doc/meref.me + contrib/mom/examples/copyright-chapter.mom + contrib/mom/examples/copyright-default.mom + contrib/mom/examples/letter.mom + contrib/mom/examples/mom-pdf.mom + contrib/mom/examples/mon_premier_doc.mom + contrib/mom/examples/sample_docs.mom + contrib/mom/examples/slide-demo.mom + contrib/mom/examples/typesetting.mom + doc/webpage.ms + +2021-06-27 G. Branden Robinson + + [grog]: Refactor. Discard filename extension-based inference. + + * src/utils/grog/grog.pl (do_line): Stop saving the control + character in the matched scalar `command` (the request or macro + name). We don't need it, and it simplifies much later matching. + (handle_file_ext): Delete. + (top level): Drop call site. + + * src/utils/grog/grog.pl: Rename `tmac_ext` scalar to + `inferred_main_package`. + +2021-06-27 G. Branden Robinson + + * src/utils/grog/grog.pl (handle_args): Complain less noisily + and more comprehensibly when given unrecognized groff options. + +2021-06-27 G. Branden Robinson + + [grog]: Handle "--" argument as documented. + + * src/utils/grog/grog.pl (handle_args): Rename scalar + `double_minus` to `no_more_options` so it actually communicates + something. Drop openability check of operand encountered after + "--"; since it's on the operand list, it will be checked later + {in `handle_whole_files`}. Stop pushing "--" itself onto the + `filespec` list. + + Fixes . + +2021-06-27 G. Branden Robinson + + [grog]: Revise operand handling, diagnostics, and exit status. + + * src/utils/grog/grog.pl: Track more state so that we can + process the argument list more intelligently and exit with a + meaningful status. Add `had_inference_problem`, + `had_processing_problem`, and `have_any_valid_args` Boolean + scalars. + (fail): Add diagnostic subroutine for serious problems; sets + `had_processing_problem`. + (handle_args, handle_file_ext): Stop complaining here about + unopenable file operands. + (handle_whole_files): Complain only here, with `fail` if a file + operand cannot be opened. + (make_groff_line_rest): Don't exit immediately if there is a + macro package inference clash, because there might be more + operands to process. Instead, set `had_inference_problem`. + Stop exiting from this subroutine. + (top level): Only call the inference subroutines if we had a + valid operand to work with (including an implicit read from + stdin). Exit with a status corresponding to the Booleans + declared above. + + * src/utils/grog/grog.1.man (Exit status): Add section; describe + semantics of exit status values. + + Fixes . + +2021-06-27 G. Branden Robinson + + [grog]: Revise diagnostic messages. + + * src/utils/grog/grog.1.man (err): Rename from this... + (warn): ...to this. Prefix diagnostic with command name and + diagnostic severity level. The subroutine didn't change the + exit status and was not used to report serious trouble, so + "warning" seems appropriate. + (make_groff_tmac_man_ms): Update call sites. Modify diagnostic + wording to stop calling macros "requests". + +2021-06-27 G. Branden Robinson + + * src/utils/grog/grog.1.man (Limitations): Add subsection + covering the problem grog has with soelim inference. Undocument + groff's -s option as one that can be inferred, because at + present it cannot be. + + Prompted by Savannah #60421. + +2021-06-26 Dave Kemper + + [grog]: Fix erroneous detection of pic(1) usage. + + Fixes . + +2021-06-26 G. Branden Robinson + + * src/utils/grog/tests/PF-does-not-start-pic-region.sh: + Regression-test Savannah #60772. + * src/utils/grog/grog.am (grog_TESTS): Run test. + +2021-06-26 G. Branden Robinson + + [grog]: Add smoke test. + + * src/utils/grog/tests/smoke-test.sh: Add test. + * src/utils/grog/grog.am (grog_TESTS): Run it. + (TESTS): Add `grog_TESTS`. + (EXTRA_DIST): Ship test. + +2021-06-26 G. Branden Robinson + + [grog]: Relocate in source tree. + + * src/roff/grog: Move from here... + * src/utils/grog: ...to here. + + * MANIFEST: + * Makefile.am: + * src/utils/grog/grog.am: Reflect move. + + Fixes . + +2021-06-25 G. Branden Robinson + + * doc/groff.texi (Assigning Formats): Revise discussion. + Clarify that a format never causes truncation of an interpolated + magnitude. Note that non-Arabic number formats cannot be used + as operands to arithmetic expressions. Add example of how to + work around this. + +2021-06-25 G. Branden Robinson + + [troff]: Clarify diagnostics. + + * src/roff/troff/reg.cpp (reg::set_increment): Update diagnostic + to unabbreviate "auto". + (reg::alter_format): Update diagnostic to say "assign" instead + of "alter", since the documentation consistently uses the former + term. + +2021-06-25 G. Branden Robinson + + [troff]: Slightly refactor. Make the source code slightly more + accessible by using a `bool` type for a member function's + default parameter used as a Boolean, and comment it at call + sites where the default is overridden. + + * src/roff/troff/token.h (token::get_char): Change type of + parameter from `int` to `bool` and default from 0 to `false`. + * src/roff/troff/input.cpp (token::get_char): Update definition. + * src/roff/troff/env.cpp (hyphen_word): + * src/roff/troff/node.cpp (remove_font_special_character): + * src/roff/troff/input.cpp (do_overstrike, do_bracket, next) + (do_define_character, remove_character, get_line_arg) + (encode_char, do_if_request, do_translate, char_flags) + (hyphenation_code, define_class): Update call sites. Add + comment indicating meaning of parameter. + +2021-06-25 G. Branden Robinson + + * tmac/an-old.tmac (TH): When outputting HTML, write the + possibly case-transformed (but not yet abbreviated) page title + as the `title` element instead of the unaltered first argument + to `TH`. + +2021-06-25 G. Branden Robinson + + * tmac/an-old.tmac (an-abbreviate-title): Define with `de`, not + `de1`, since it is not intended for call by traps or users. + +2021-06-20 G. Branden Robinson + + * doc/groff.texi (Tab Stops): Fix erroneous claim; tab stops are + not set "every half inch across the page". This is only true in + "line tabs mode", which is not enabled by default. The default + behavior, to keep compatibility with AT&T troff, measures tab + stops relative to the current position on the input line. + +2021-06-19 G. Branden Robinson + + * tmac/mdoc/doc-nroff-u: Set the usekeeps register used by tbl + to the logical complement of the cR (continuous rendering) + register. This prevents blank lines from creeping into tables + in that mode. + +2021-06-19 G. Branden Robinson + + * tmac/an-old.tmac (an-blank-line-trap, an-leading-space-trap): + We say in a comment, "Macros ... that are called by traps of any + kind must be defined with `de1` because they might be called + from a context where compatibility mode is enabled." So do it. + +2021-06-19 G. Branden Robinson + + * tmac/an-old.tmac (an-header): Lightly refactor; tighten. + +2021-06-19 G. Branden Robinson + + * tmac/an-old.tmac (an-write-paragraph-tag): Lightly refactor + for clarity and to reduce code duplicated in both branches of an + `ie`/`el` structure. + +2021-06-19 G. Branden Robinson + + * tmac/an-old.tmac: Rename `an-HF-remap-I-style` register to + `an-remap-I-style-in-headings` for greater clarity. + +2021-06-19 G. Branden Robinson + + * tmac/mdoc/doc-common-u (doc-header, doc-end-macro): Partially + revert bf4b3dde (from 20 May); per Ingo Schwarze, continuous + rendering in mdoc(7) documents has always used only one vee + between headers, footers, and man page body text. + +2021-06-19 G. Branden Robinson + + * tmac/en.tmac: Stop using `do` request; it's unnecessary since + the file is already loaded with compatibility mode off. + +2021-06-18 G. Branden Robinson + + [ms]: Fix doc omission; .ID can take an argument. + + * doc/groff.texi (ms Document Control Settings) : + Characterize register setting as a _default_. + (ms Displays and Keeps): Add optional variable "indent" argument + to syntax summary of ".DS I" and ".ID". Note that the given + indentation is used if present, and \n[DI] otherwise. + * doc/ms.ms (Displays and keeps): Add optional variable "indent" + argument to syntax summary of ".ID". Switch fonts more + carefully and apply italic corrections. + * tmac/groff_ms.7.man (Displays and keeps): Sync with doc/ms.ms. + +2021-06-17 G. Branden Robinson + + * tmac/s.tmac: Properly situate devtag flag-related register + names in the package name space. Rename `need_eo_h` to + `s@devtag-needs-end-of-heading'. Rename `need_eo_tl` to + `s@devtag-needs-end-of-title`. + ((initialization), par@reset, @SH, par@finish, @NH): Do it. + (par@reset): Test their values more idiomatically. + + Fixes last third of . + +2021-06-17 G. Branden Robinson + + * tmac/e.tmac-u (@h): Migrate SCCS revision 2.37 to be idiomatic + for groff (and not throw warnings of type 'mac'). + +2021-06-17 G. Branden Robinson + + * doc/doc.am: Improve diagnostics during documentation + generation; none should occur normally, but when they do, seeing + troff complain about "" is disheartening. + (DOC_GROFF_ONLY): Add -b option so we get backtraces (also kill + off trailing whitespace). + (DOC_GROFF): + (doc/pic.html): + (doc/webpage.html): Add sed expression to inject `lf` request + into the stream to identify the file being processed. + +2021-06-17 G. Branden Robinson + + * doc/me-revisions: Supplement history with subsequent BSD work + from versions 2.29 (1988-04-22) to 8.1 (1993-06-05). + +2021-06-17 G. Branden Robinson + + * doc/me-revisions: Add 'me' macro package revision log, scraped + from . + * doc/doc.am (DOCFILES): Ship it. + +2021-06-17 G. Branden Robinson + + * tmac/e.tmac-u: Rename registers for clarity. Unlike other + macro packages supplied by groff, "me" mostly remains within the + AT&T 2-character name space, accessing extended names + selectively through `do` and `de1` requests. The package + therefore has no characteristic name prefix. + need_eo_h -> devtag-needs-end-of-heading + need_eo_tl -> devtag-needs-end-of-title + need_tl -> devtag-needs-title + (@html_check_need_title, sh, EQ): The foregoing registers are + effectively Booleans, so perform Boolean-style tests on their + interpolations. + + Fixes a second third of . + +2021-06-16 G. Branden Robinson + + * tmac/e.tmac-u: Work in compatibility mode. It seems this was + the intention (reasonable, since "me" originates in pre-groff + BSD Unix), but there were several problems. + (@R): Prefix register existence test with `do`. + (@html_check_need_title): Define with `do` since the macro name + is long, and also with `de1` so that we can freely use groff + extensions within. Drop many `do` requests from macro + definition. + (@check_need_title): Define with `do`, as above. Add comment + explaining why `de1` is not needed for this macro definition. + (@S): Prefix macro/string existence test with `do`. Remove + spurious space so that the argument string name is truly defined + as empty. + (nm, n1, n2): Prefix handling of long register names `_#p` and + `_#f` with `do` request. + (top level): Prefix `mso` request with `do`. + ((x-html): Define with `do` and `de1` instead of `de`. Drop + now-unnecessary `do` requests from macro body. + ()x-html): Define with `do` and `de1` instead of `de` for + symmetry. + (xp-html): Define with `do` and `de1` instead of `de`. Drop + now-unnecessary `do` requests from macro body. + + Fixes . + +2021-06-16 G. Branden Robinson + + * tmac/devtag.tmac: Work in compatibility mode; define macros + with the `de1` instead of the `de` request. + +2021-06-16 G. Branden Robinson + + * tmac/refer-me.tmac: + * tmac/refer.tmac: Add include guards. + +2021-06-16 G. Branden Robinson + + * tmac/refer-me.tmac: Handle being loaded in compatibility mode. + +2021-06-16 G. Branden Robinson + + * tmac/an-old.tmac: Properly situate devtag flag-related + register names in the package name space. Rename `need_eo_h` to + `an-devtag-needs-end-of-heading'. Rename `need_col2` to + `an-devtag-needs-second-column`. + (an-input-trap, SH, SS, HP, (initialization)): Do it. + (an-input-trap): Test their values more idiomatically. + + Fixes one third of . + +2021-06-16 G. Branden Robinson + + * src/roff/troff/input.cpp (do_if_request): Improve diagnostic + message; say "conditional operator", not just "conditional". + +2021-06-16 G. Branden Robinson + + * tmac/an-old.tmac (an-end, an-header): In continuous rendering + mode, use same spacing amount after header and before footer as + mdoc in its own continuous rendering mode. Thanks to Ingo + Schwarze for the suggestion. + + Fixes . + +2021-06-16 G. Branden Robinson + + * tmac/an-old.tmac (P): Define this as the "canonical" + paragraphing macro. + (LP, PP): Make these aliases of P. + +2021-06-16 G. Branden Robinson + + * src/roff/troff/input.cpp (spring_trap): Tighten lexical + discipline; describe macro as "trap-called" rather than + "trap-invoked". + +2021-06-15 G. Branden Robinson + + [man]: Don't spuriously break a page after a paragraph tag when + the tag is short enough to fit within the paragraph's + indentation. + + * tmac/an-old.tmac (an-write-paragraph-tag): Reserve ("need") 2 + vees plus 1 basic unit of vertical space regardless of the width + of the tag. In the short tag case, we reverse space by one vee + after outputting the diversion in which the tag is stored, but + it will always contain a break, and by the time we reverse, we + might have already hit a page location trap + {an-break-body-text}, and by then it's too late to back up. + + * tmac/tests/an-old_no-break-after-short-paragraph-tags.sh: Test + it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2021-06-15 G. Branden Robinson + + * tmac/an-old.tmac: Rename environments to be more descriptive. + an-env -> an-env-header-or-footer + an-2 -> an-env-paragraph-tag + (an-header, an-footer, an-write-paragraph-tag): Do it. + +2021-06-14 G. Branden Robinson + + * tmac/s.tmac: Add diagnostic error if .EQ used within .TS/.TE. + Introduce register `tbl@within-table` to track whether we're + inside a table. + (@EQ): Check register and issue error if it is true. + (@TS): Set register. + (@TE): Clear register. + + Prompted by Savannah #55754. + +2021-06-14 G. Branden Robinson + + * tmac/s.tmac: Permit document to start with .PS. + (cov*ab-init): Alias PS to @PS. + (PS): Call LP, then re-execute (aliased) self as TS does. + (TS): Update comment to parallel the one in PS. + +2021-06-11 Tadziu Hoffmann + + Indent an IP paragraph based on the type size of the paragraph + text, not a preceding heading. We have to delay evaluating IP's + argument until the font size has been reset, which I've + attempted to do by simply passing the argument unevaluated down + the call hierarchy, instead of saving it in a number register + right away, as appears customary in this ms implementation. + + However, par@reset is called from a great number of places, and + these usually set the indent registers beforehand. I've left + this as it is, so now two ways of setting the indents exist: via + register and optionally via argument. + + * tmac/s.tmac (par@reset): Move font-size setting stuff before + indent-setting stuff; set registers from optional arguments with + default "n" scaling indicator before setting indents. + (par*start, par@finish): Don't set registers, but instead pass + arguments to par@reset. + (@IP): Pass argument unevaluated to par*start. + + Fixes . + +2021-06-11 Tadziu Hoffmann + + * tmac/s.tmac (@QP, @XP): Be more scrupulous about using "u" + scaling indicator. + +2021-06-11 G. Branden Robinson + + Add regression test for Savannah #59604. + + * tmac/tests/s_IP-indents-using-paragraph-type-size.sh: Add it. + * tmac/tmac.am (tmac_TEST): Run it. + +2021-06-08 G. Branden Robinson + + Refactor grog even more aggressively. Make the tedious search + for subs.pl unnecessary by inlining it into grog.pl directly. + This makes the script stand alone and much more convenient to + work with, and doesn't contribute to bloat, in my + opinion--subs.pl was 10 times the size of grog.pl, and most of + the code in the latter was dedicated to trying to locate + subs.pl. + + * Makefile.am: Delete references to $(grog_dir). + * configure.ac: Delete call of `GROFF_GROGDIR_DEFAULT` macro. + * m4/groff.m4: Delete definition of same. + * src/roff/grog/grog.am (GROG, dist_grog_DATA, grogdir): Drop + variables. + (grog): Remove target's dependency on `$(GROG)`. Remove sed + expression replacing `@grog_dir@` with `$(grog_dir)` in grog.pl. + * src/roff/grog/grog.pl: Inline most of subs.pl (except for + author/license comment banner). Delete sub-hunting logic. + * src/roff/grog/subs.pl: Delete. + +2021-06-08 G. Branden Robinson + + * doc/pic.ms (Basic PIC Concepts, Decorating Objects/Filled + Objects, PIC Reference/Semi-Formal Grammar): Fix error: the + keyword "solid" sets a line style, not a fill for a closed + figure. Thanks to Dave Kemper and Wim Stockman for reporting + and researching this issue. + + Fixes . + +2021-06-06 G. Branden Robinson + + * NEWS: + * doc/webpage.ms: + * man/groff.7.man (Registers/Read-only registers) <.U>: + * man/groff_diff.7.man (Language/New number registers) <.U>: Fix + error; the sense of this Boolean variable was backwardly + documented {perhaps due to an implementation detail from 2004 + that was reversed in commit 7a0e2f15, 26 February 2008}. + +2021-06-05 G. Branden Robinson + + * src/roff/groff/groff.cpp: Revise usage message. + (synopsis): Set primary synopsis on a single output line, for + convenience of parsing and also because we have no control over + the width of the program name in character cells; it comes from + argv[0] and is under user control. There is thus no point in + trying to get pretty formatting. Also include separate synopsis + lines for short and long help options. Use opposite case from + option flags for option arguments. + (help): Collate option flags in English lexicographic order. + Include space after flag letters for options that take + arguments. Consistently use capitals for option arguments + because they are space-separated here. Illustrate longer forms + of -d and -r options. Update language (some, like "tmac.name", + was very old). Add reference to groff(1) man page at end. + (usage): Drop appendnment of notice regarding -h option; this is + now covered in `synopsis()` unconditionally. + +2021-06-05 G. Branden Robinson + + Eliminate "groff_opts_no_arg.txt" and "groff_opts_with_arg.txt" + files from distribution. They are not needed by any live code + in the tree; possibly only groffer ever used them. + + * src/roff/groff/groff.am (GROFF_OPTS_OUTPUT, groffoptsdir) + (groffopts_DATA): Delete variables. + (MOSTLYCLEANFILES): Stop adding to target. + (groff_opts.tmp, groff_opts_no_arg.txt, + groff_opts_with_arg.txt): Delete targets. + +2021-06-05 G. Branden Robinson + + * src/roff/grog/subs.pl (version): Report version information in + a format consistent with our other programs. + +2021-06-05 G. Branden Robinson + + * src/roff/grog/grog.pl: Refactor initialization so that the + program can be run from a build tree--and tested. Drop much + cruft from before Bertrand Garrigues's 2018 work to adopt + `git-version-gen`. + +2021-06-04 G. Branden Robinson + + * tmac/tests/an-old_title-abbreviation-works.sh: Log more + accurate messages in test failures. + +2021-06-03 G. Branden Robinson + + * tmac/an-old.tmac (an-abbreviate-title): Add new internal macro + to reduce the length of a man page title (i.e., the "ls" in + "ls(1)", if it is too wide to fit in the page header (and would + overwrite the center header material, usually the title of the + manual section). Since the beginning and end of the title might + be important for disambiguation, truncation at either end would + be unwise; replace the middle of the title with an ellipsis. + Define new an-pageref and an-title-abbv strings for use by other + macros and user-defined PT and BT traps. + (PT, an-footer): Use new an-pageref string for economy. + (an-header): Call an-abbreviate-title after setting the title + length. + + * tmac/tests/an-old_title-abbreviation-works.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2021-06-03 G. Branden Robinson + + * man/groff.7.man (Copy mode): Add new section. + +2021-06-03 G. Branden Robinson + + * src/roff/troff/input.cpp (else_request, while_request) + (pipe_source, open_request, opena_request, pipe_output) + (system_request): Update diagnostic messages to not presume the + identities of the control or escape characters. + +2021-06-01 G. Branden Robinson + + * doc/groff.texi (Conventions Used in This Manual): Add node. + +2021-05-31 G. Branden Robinson + + * src/roff/groff/groff.1.man: Expand to aid beginners. + (initialization): Define `TeX` string. + (Usage): Rewrite. + (Usage/Getting started): Add "Hello, world!" example using + multiple output devices (formats). + (Usage/Using groff as a REPL): Add example of likely interest to + programmers. Or so I hope. It illustrates the Turing + fundamentals; we read, store, test, and branch. + +2021-05-29 G. Branden Robinson + + * tmac/papersize.tmac: Improve diagnostic message; when + complaining about unrecognized input, report back the input we + actually received, not what it looks like after we transform it. + Also add name of macro package to diagnostic so the user knows + who is speaking, continuing the long process of fixing Savannah + #52463. + +2021-05-29 G. Branden Robinson + + * tmac/groff_ms.7.man (Usage/Paragraphs) : Fix error: .QP + paragraphs are indented by \n[QI], not \n[PI]. + +2021-05-27 G. Branden Robinson + + * src/libs/libdriver/input.cpp (do_file): Make fatal diagnostic + from output driver when the device description file "DESC" can't + be found more informative by including the name of the device + for which the input was prepared. Also makes malformed input of + intermediate format more obvious. + +2021-05-27 G. Branden Robinson + + * src/preproc/tbl/tbl.1.man (Miscellaneous): Add paragraph + cautioning users against making tbl(1) tables conditional + document content. + +2021-05-25 G. Branden Robinson + + [man]: Add style warnings for documents with input lines that + are blank or have leading spaces, since they can cause + surprising rendering; enabled if the CHECKSTYLE register is + greater than 2. + + * tmac/an-old.tmac (an-blank-line-trap, an-leading-space-trap): + Issue style warning if enabled (and only if fill mode enabled in + leading space trap); in any event, recreate the default *roff + behavior. + (TH): Install traps. + + * doc/andoc.tmac (reload-doc): Remove man(7) traps before + loading doc.tmac. + +2021-05-25 G. Branden Robinson + + * doc/andoc.tmac (reload-doc): Fix spurious blank line. + +2021-05-25 G. Branden Robinson + + * doc/groff.texi (Operators in Conditionals): + * man/groff.7.man (Control structures/Conditional expressions): + Fix omission; the conditional operators "F", "m", and "S" also + accept optional spaces and/or tabs between themselves and their + arguments. + +2021-05-25 G. Branden Robinson + + * man/groff.7.man (Requests/Request short reference) <.ta>: + Describe the request as tersely as possible without omitting its + essential syntax and semantics. (The AT&T troff "+" relative + prefix for normally absolute positions ".ta 1i +1i +1i" and + alignment-specifying suffixes "L", "R", and "C" had both been + omitted.) + +2021-05-25 G. Branden Robinson + + * man/groff.7.man (Registers/Writable registers): Fix error: + \n[nl] interpolates the current vertical position, not the + vertical position of the "last printed text baseline"; the + latter is \n[.h]. + +2021-05-25 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjustment): Update + inter-sentence space example to be more illustrative. Thanks to + Dave Kemper and Doug McIlroy for the discussion. + + Fixes . + +2021-05-23 G. Branden Robinson + + * tmac/mdoc/doc-common-u: Add comment warning source divers that + \n[doc-header-space] is re-used for a purpose for which it is + not documented. + * tmac/mdoc/doc-nroff-u: Initialize doc-{header,footer}-space + registers, which define the vertical spacing between body text + and the relevant titles (not between the titles and the page + margins) to 1v instead of 0.5i. This is what mdoc(7) has always + done in practice, per Ingo Schwarze. + +2021-05-23 G. Branden Robinson + + * src/devices/grohtml/post-html.cpp (assert_state::add): Avoid + potential deallocation of statically-allocated strings. Use + strsave() to duplicate them so that they can be safely handed to + a_delete(). Also update diagnostic message to report name of + complaining program (continuing the long process of fixing + Savannah #52463). + + Fixes . Thanks to + Petru-Florin Mihancea for the report. + +2021-05-23 G. Branden Robinson + + * tmac/troffrc-end: Fix transposition error (in commit a248aa33 + on 15 January) that broke most table image generation in HTML + output. + + Fixes . + +2021-05-23 G. Branden Robinson + + * tmac/an-ext.tmac (UE, ME): Replace calls to HTML-NS macro for + emissions of HTML 'A' tags with direct usage of \X device + control escapes. Replace .nop requests with text lines since + this file is supposed to be maximally portable to other *roffs. + +2021-05-22 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (main): Call `scanArguments()` + earlier, before trying to load a font description, so that -v, + --version, and --help work. + +2021-05-22 G. Branden Robinson + + [grohtml]: Add -C and -G options to postprocessor, to suppress + output of CreationDate and Creator HTML comments, respectively. + These can inject unwanted noise into build artifacts. + + * src/devices/grohtml/post-html.cpp: Add static globals + `do_write_creator_comment` and `do_write_date_comment`. + (html_printer::{do_file_components,~html_printer}): Write + comments per corresponding global variables. + (main): Add to `getopt_long()` call parameter and set as needed. + (usage): Document them. + + * src/preproc/html/pre-html.cpp (scanArguments): Add to + `getopt_long()` parameter, but ignore. + + * src/devices/grohtml/grohtml.1.man (Synopsis, Options): + Document them. + + * src/roff/groff/tests/output_driver_C_and_G_options_work.sh: + Test them. + * tmac/tmac.am (groff_TESTS): Run test. + + Fixes 1/3rd of . + +2021-05-22 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (usage): + * src/devices/grohtml/post-html.cpp (usage): Fix inaccuracies in + supported option summary. + +2021-05-22 G. Branden Robinson + + * src/preproc/html/pre-html.cpp (scanArguments): + * src/devices/grohtml/post-html.cpp (main): Use libgroff's + warning() instead of printf() to emit diagnostic about + unrecognized parameter to `-x` option. This sends the + diagnostic to the standard error stream and continues the long + process of fixing Savannah #52463. + +2021-05-22 G. Branden Robinson + + * tmac/groff_www.7.man: Stop using the "www" macro package. The + macros it exposes are not part of the quasi-standardized man(7) + language, and thus should not be used in man(7) documents. See + groff_man_style(7) for portability advice. Besides, the + extension macros in the permissively-licensed an-ext.tmac are + sufficient to support URL and email hyperlinks, and our SH and + SS macro implementations already support anchor placement + without requiring explicit effort from page authors. + (initialization): Stop sourcing www.tmac. Stop calling .LK and + .HR; the page-internal navigation links were being placed after + the apropos line instead of at the beginning of the page, + contradicting the comment that was there (possibly a bug). + (Requests) : Stop calling .TAG. + : Drop paragraph advising reader to format page for groff's + HTML output device to observe the navigation links at that point + in the test. + +2021-05-22 G. Branden Robinson + + * doc/groff.texi (Comments): Fix error in description of parser + operation; '.\"' is an effective whole-line comment not because + it is a call of an undefined macro named '\"' (no 'mac' warning + is emitted when that warning type is enabled), but because the + comment escape is recognized normally and what remains is + handled as the empty request. Clarify that the optional + argument to the .ig request is the name of a macro (which will + be called normally _and_ end the ignored region; this is + analogous to ".de foo bar"). + +2021-05-22 G. Branden Robinson + + * tmac/an-ext.tmac (UR, UE, MT, ME): Rename environment and + diversion for clarity; they apply to the link text, not the URL + {or email address}. The latter might not visibly appear, + depending on the output driver. + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac (TH): Remove extraneous right-brace escape. + + Fixes . Thanks to Bjarni + Ingi Gislason for catching it. + +2021-05-20 G. Branden Robinson + + * doc/groff.texi (Copy Mode): Fix omissions from list of escape + sequences interpreted even in copy mode. Add \g, \V, "\.", + '\"', \#, \a, \e and \E (with caveat), and \t. Parallels + groff(7) now. Add cross reference to "Character Translations" + node. + +2021-05-20 G. Branden Robinson + + * man/groff.7.man (Escape Sequences): Fix omission; the escape + character in an unrecognized escape sequence is not merely + ignored; the sequence produces a warning diagnostic, albeit of a + type that is disabled by default. + (Escape Sequences/Escape short reference): Fix omissions; \# and + \V are interpreted even in copy mode. + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac (an-header): Fix missing brace escape. + +2021-05-20 G. Branden Robinson + + [man]: Slightly refactor footer spacing management when + continuously rendering. + + * tmac/an-old.tmac (an-end): Increase the page length _after_ + flushing a pending output line. Do so only by the amount of + spacing we actually perform next. Make the scaling indicator on + the .sp request explicit. The amount seemed magical because it + was accounting for the one line to be consumed by output of the + footer title line. Instead, move that further increase of the + page length from here... + (an-footer): ...to here (~250 lines away), before calling BT. + +2021-05-20 G. Branden Robinson + + * tmac/mdoc/doc-common-u (doc-end-macro): When continuously + rendering and after flushing the last line of the body text of a + page, vertically space by 3 vees instead of 1, for consistency + with our man(7) implementation. Also increase page length by + same amount _after_ flushing a pending output line, for symmetry + with other spacing requests (and to prevent nasty surprises + analogous to those in Savannah #60611). + (doc-header): Put 3 vees of space after the header in continuous + rendering mode, not 1 (and increase page length accordingly). + +2021-05-20 G. Branden Robinson + + [man]: Add warnings for macros deprecated in groff_man(7), + emitted if the CHECKSTYLE register is greater than 1. + + * tmac/an-old.tmac (an-deprecation-warn): New macro emits + diagnostic. + (DT, PD): Call the foregoing, re-using arguments. + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac: Refactor to move bodies of DT and PD into + private macros. + (an-reset-tab-stops, an-reset-paragraph-spacing): New names for + the former DT and PT. + (TH): Call these new macro names. + (DT, PD): Wrap the corresponding private macros. + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac (an-bp): In continuous rendering mode, draw + a horizontal line between a page footer of one man page document + and the header of the next, but only if multiple documents are + being rendered. + (initialization): Use variable to ensure we don't draw this line + after finishing the only document we render. + + Fixes other half of . + +2021-05-20 G. Branden Robinson + + [man]: Fix stochastic vertical space loss problems in continuous + rendering mode by being more scrupulous about extending the page + length. As noted in Savannah #60611, sometimes the vertical + space between a header line and the first section heading + {"Name"} would be reduced or removed altogether, in a way that + was highly sensitive to circumstances. As far as I can tell, + the problem is that this vertical space disappeared only when we + were in double-secret probation no-space mode; this is the + special non-spacing mode {not apparent with inspection of + \n[.ns]} that happens when the stealth internal page location + trap is sprung. This trap does not appear in .ptr output but + can be disabled with ".vpt 0", which is an alternative fix for + this problem {because continuous rendering mode does not use + vertical position traps at all}. Another fix might have been to + simply call the moral equivalent of ".pl MAXINT" as soon as + continuous rendering mode was decided upon. + + * tmac/an-old.tmac (an-header): In continuous rendering mode, + extend the page length by one line before calling PT to output + the page header, and afterwards, extend the page length by 3 + vees and space by that amount (instead of half an inch). + + Fixes half of . + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac (an-header, an-footer): Drop no-op .tl + requests. + +2021-05-20 G. Branden Robinson + + * tmac/an-old.tmac (an-footer): Improve symmetry with an-header. + If rendering to HTML, don't bother setting the + an-outer-footer-text, an-extra1, and an-extra2 strings to empty + values; instead don't call BT, just as we don't call PT in + an-header. + +2021-05-19 G. Branden Robinson + + * tmac/an-old.tmac (an-end): Drop needless .nr % assignment. + Call our (wrapped) bp instead of the .pl request directly. + (an-bp): Drop needless .br and (aliased) real .bp request. + +2021-05-19 G. Branden Robinson + + * tmac/an-old.tmac (an-footer): Refactor complex conditional. + +2021-05-19 G. Branden Robinson + + * tmac/tests/an-old_X-register-works.sh: Add test for footer + creeping into page content. + +2021-05-19 G. Branden Robinson + + * tmac/an-old.tmac (initialization): Ignore P and X rendering + parameter registers if specified with continuous rendering + enabled (the default in the nroff mode used for terminals), and + emit diagnostic. + +2021-05-19 G. Branden Robinson + + * tmac/tests/an-old_X-register-works.sh: Rewrite. Increase test + coverage and stop assuming that -rcR=1 and -rX=anything is a + supported combination. (Continuous rendering is supposed to + suppress the printing of page numbers anyway.) + +2021-05-19 G. Branden Robinson + + * tmac/an-old.tmac (initialization): Refactor handling of P and + X rendering parameter register validation in preparation for + disabling them in continuous rendering mode, where they don't + make any sense. + +2021-05-19 G. Branden Robinson + + * tmac/tests/an-old_TH-repairs-ad-damage.sh: Tweak test + internals to make troubleshooting easier. + +2021-05-18 G. Branden Robinson + + * tmac/an-old.tmac (TH): Relocate some initialization logic to + be adjacent to (most of) the rest of it. + +2021-05-18 G. Branden Robinson + + * tmac/an-old.tmac (TH): Remove useless .if. Its condition is + always true now in the wake of the fix for Savannah #60609. + +2021-05-18 G. Branden Robinson + + * tmac/an-old.tmac: Rename many package macros, strings, and + registers (and the lone named environment) to be more expressive + of their function. "an-footer" is now the proper complement of + "an-header" (setting up an environment and calling a + user-redefinable trap macro). + an-first -> an-is-first-page-of-document + an-html -> an-is-output-html + an-footer -> an-break-body-text + an-p-footer -> an-footer + an-set-margin -> an-reset-margin-and-inset-level + an-level -> an-inset-level + an-tag-sep -> an-tag-separation + an-no-space-flag -> an-need-no-space-mode + an-break-flag -> an-need-break + an-div? -> an-is-in-diversion + an-page-string -> an-outer-footer-text + an-trap -> an-input-trap + an-do-tag -> an-write-paragraph-tag + an-1 -> an-env + + * tmac/andoc.tmac (reload-doc): ...as above for the exposed + parts of the interface. + an-footer -> an-break-body-text + an-p-footer -> an-footer + +2021-05-18 G. Branden Robinson + + * tmac/an-old.tmac: Rearrange alternating font macros to be in + alphabetical order (and the order documented in groff_man(7). + +2021-05-18 G. Branden Robinson + + * tmac/an-old.tmac: Refactor alternating font macros. These + macros are hard enough to understand without adding gratuitous + structural differences to the reader's burden. Make their + implementations rigidly parallel. Update comments. + (RI, IR, IB, BI, RB, BR): Always define the `an-result` string + as empty except for a dummy character '\&' for the sake of + compatibility mode. + (RI, IR, IB, BI): Defer interpolation of the first argument to + the while loop if there are at least two (like the existing RB, + BR). This way the style name arguments to the font selection + escape sequences in the appendment to `an-result` match the + order of the letters in the macro name (useful to make sense of + diffs). + (RI, IR, IB, BI, RB, BR): Always remove the `an-result` string + after interpolating it. + (RB, BR): Only do work if there are any arguments. + +2021-05-18 G. Branden Robinson + + [man]: Apply italic corrections more consistently. + + * tmac/an-old.tmac (BI, IB, IR, RI): Apply italic corrections + more consistently. Add lengthy comment rationalizing approach. + (RI, BI): An italic correction is now applied after the last + argument if it is of even parity (i.e., the 2nd, 4th, 6th, ...). + + * tmac/groff_man.7.man.in (Description/Font style macros): Note + that italic corrections are applied. + + Fixes . + + Thanks to Bjarni Ingi Gislason for the report and a suggested + patch. + +2021-05-17 G. Branden Robinson + + [man]: Ignore FT register when appropriate. + + * tmac/an-old.tmac (initialization): Validate user-specified + value of \n[FT]. Continuous rendering ignores FT (page location + traps are not used for footers in that mode). Measuring a + footer distance from the page top isn't done. A footer distance + of over half the page length is unlikely. A footer distance of + less than one line height is too. Issue diagnostics in all of + these cases. + + * tmac/tests/tmac/tests/\ + an-old_FT-bad-value-should-not-trash-titles.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2021-05-17 G. Branden Robinson + + * tmac/an-old.tmac (TH): Plant the an-footer trap (where we + schedule a break in the page text prior to spacing down to the + footer) at twice the value of \n[FT], not a hard-coded -1i. + This way, the user can't make the an-p-footer trap (planted at + \n[FT]) spring before the an-footer trap that should precede it. + + * tmac/groff_man.7.man.in (Options) <-rFT>: Document this. + +2021-05-16 G. Branden Robinson + + * m4/groff.m4 (GROFF_GHOSTSCRIPT_VERSION_CHECK): Add new + autoconf macro to check Ghostscript version. Versions 9.00 <= x + < 9.54 suffer from a rendering glitch that affects the AT&T + troff (and groff) special character \(lh; see + . Store + the result of the check. + (GROFF_GHOSTSCRIPT_VERSION_NOTICE): Add new macro to report the + problem detected by GROFF_GHOSTSCRIPT_VERSION_CHECK to the user. + + * configure.ac: Call the macros in appropriate places. + + Fixes . + +2021-05-16 G. Branden Robinson + + * tmac/andoc.tmac (reload-man): Remove removal of RI macro, made + unnecessary by commit 551f138 (15 May). + +2021-05-16 G. Branden Robinson + + * m4/groff.m4 (GROFF_HTML_PROGRAMS, GROFF_PDFDOC_PROGRAMS): + Tweak autoconf warning messages when Ghostscript (gs) command + missing to be more mutually congruent. + (GROFF_URW_FONTS_CHECK): Tweak to note that gs is only run to + locate the URW fonts if gs is available. + +2021-05-16 G. Branden Robinson + + * tmac/tests/an-old_AT-and-UC-footer-saved-and-restored.sh: + Tweak to be more helpful when troubleshooting exasperating + header/footer problems as in Savannah #60609. + +2021-05-16 G. Branden Robinson + + [man]: Fix missing page footers when continuously rendering + multiple documents. Resolving this uncovered entangled header + and footer management bugs with batch processing even when _not_ + continuously rendering. + + * tmac/an-old.tmac (an-start-new-document): New macro clears + header trap so it doesn't get called with stale information. + {The TH macro already replants a header trap with every man + page if not continuously rendering.} This macro also absorbs + the break-page and page number incrementation logic from TH. + (TH): Adapt semantics of "an-first" register to mean not "first + page rendered" (apparently) but "first page of new document". + If we are _not_ on the first page of a new document and the TH + macro is called, we must be batch processing: force the previous + man page to end (call an-end if continuously rendering, or + an-start-new-document if not). After all the header and footer + strings have been configured for the man page, call an-header if + we're on the first page of the document, not (just) if we're + continuously rendering. Zero an-first register at end of macro + here unconditionally instead of conditionally in .an-header. + (an-header): Drop conditional on continuous rendering. + + When I batch-render our 62 man pages to the terminal, I do note + one cosmetic regression: the lj4_font(5) page, when continuously + rendered in batch processing, has no space between its header + line and first section heading ("Name"). Another cosmetic issue + in this scenario is that the footers for every rendered page but + the last, which had (wrongly) been absent entirely, are set with + no space after them and the header of the next. + + * tmac/tests/an-old_page-footers-present.sh: + * tmac/tests/an-old_page-header-has-current-data.sh: Add man + page header/footer regression tests. + * tmac/tmac.am (tmac_TESTS): Run the tests. + + Fixes . + +2021-05-15 G. Branden Robinson + + * tmac/an-old.tmac (initialization): Key the reprocessing guard + {like a C language #include guard} on the existence of the TH + macro instead of RI. The latter seemed kind of random and TH + is even more guaranteed to exist; it is the macro name most + characteristic of the man(7) language and the andoc.tmac + superstructure relies on it. (TH may have been avoided because + of its use with tbl(1); however, neither man(7) nor mdoc(7) + support tbl's TH feature, and GNU tbl does not supply its own + empty fallback definition as it does for TS and TE. If we ever + want TH-like functionality in future man pages, I suggest we + pick a new, non-colliding name for it.) + (initialization): Relocate load of devtag package; we don't + need it before entering compatibility mode. Move assignment of + format of an-page-letter register from a "loose declaration" + amid macro definitions to within existence test of X register. + Stop initializing an-extra[123] strings outside of any macro; + they need to be reinitialized at every TH call when batch + rendering. + (TH): Call DT in a less surprising place. + (TH): Initialize all header/footer-related strings before + calling header macros, even those not needed for the default + header configuration. + (TH): Add style warnings for underspecified arguments. + (an-ne): Rename register from "an-need", which is pretty + confusing in context, to "an-amount", since (1) a (vertical) + amount is what it is, and (2) it's only used within this macro. + Also due to factor (2), remove the register after using it. + +2021-05-15 G. Branden Robinson + + * m4/groff.m4 (GROFF_URW_FONTS): Update configure script check + for URW fonts to recognize recent releases of the URW Base 35 + fonts from Artifex Software. Look for the AR (Arial roman + equivalent) font under all of the names recognized by + fonts/devpdf/Foundry.in. + * m4/groff.m4 (GROFF_URW_FONTS_CHECK): Update wording of notice + when URW fonts are not found. Replace dead URL with working + one. Try to hedge against the future, but the Web is an + ephemeral place, as are the file names Artifex gives to its + fonts. Thanks to T. Kurt Bond and Thomas Dupond for reporting + and investigating the problem. + + Fixes . + +2021-05-13 G. Branden Robinson + + * doc/groff.texi (ms Document Control Settings) : + * doc/ms.ms (Document control settings, Displays and keeps) + : + * tmac/groff_ms.7.man (Document control settings, Displays and + keeps) : Document this register; it had been mentioned only + in passing. + +2021-05-13 G. Branden Robinson + + * doc/groff.texi (ms Document Control Settings)
: + * doc/ms.ms (Document control settings)
: + * tmac/groff_ms.7.man (Document control settings)
: Fix + error; changes to \n[DD] take effect at the next display + boundary (including the end of the active one), not the next + "paragraph" (paragraph macros cannot be called inside a display + anyway). + +2021-05-12 G. Branden Robinson + + * tmac/andoc.tmac (reload-man): Delete no-op line that attempts + to restore compatibility mode. Individual pages have to do + this, and ".do cp \n(.C" is not effective for the reason + discussed in the 2020-04-16 ChangeLog entry. + +2021-05-08 G. Branden Robinson + + * tmac/s.tmac (@RT): Delete definition; make it an alias for + par@finish. Until commit 021ba0e7 (1 May), they had identical + definitions. I find it difficult to imagine what use it would + be to have an undocumented reset macro that resets everything + _except_ the deeply internal \n[.ev]:ai. + +2021-05-08 G. Branden Robinson + + [man]: Handle HF strings with an embedded font family when + applying italic-to-bold-italic remapping; the feature now works + on troff devices as well. + + * tmac/an-old.tmac (initialization): Do more validity checking. + Store heading family in new string \*[an-heading-family]. Clean + up after self. + (SH, SS): Include the heading family in the remapping target. + + * tmac/groff_man.7.man.in (Description/Document structure + macros) <.SH, .SS>: Document it. + +2021-05-07 G. Branden Robinson + + * man/groff_char.7.man (Glyph tables/Mathematical symbols): Fix + errors in special character descriptions; \[sqrt] is a "special" + glyph (that is, it uses mathematical metrics on typesetter + devices), and \[radicalex) is not (and is thus a "text" glyph). + See Werner Lemberg's ChangeLog entry of 2003-01-05. Problem + dates to 07a6233ad, 27 May 2014. + + The overloaded use of the word "special" really pinches here. + +2021-05-07 G. Branden Robinson + + * tmac/tty.tmac: Replace fallback glyphs for radical extension + and square root extension; use \[rn] instead, which works fine. + + Now the only glyph in the page that doesn't render on a UTF-8 + terminal (if one's font has adequate coverage) is the Bell + System logo. + +2021-05-07 G. Branden Robinson + + * tmac/tty.char: Add fallback characters for \[fm] and \[sd]. + +2021-05-06 G. Branden Robinson + + [man]: If \*[HF] is a bold style, substitute bold italics for + italics in section and subsection headings, keeping the font + weight consistent. + + * tmac/an-old.tmac (initialization): Set a flag for this based + on the interpolation of \*[HF] matching "B" as its last + character. + (SH, SS): Apply and reverse font remapping based on this flag. + +2021-05-06 G. Branden Robinson + + * tmac/an-ext.tmac (EX): Work around Savannah #59522 by changing + fonts differently on DVI output, avoiding a font warning. + +2021-05-06 G. Branden Robinson + + * tmac/an-ext.tmac: If in nroff mode, remap font CBI to BI. + * tmac/dvi.tmac: Remap font CBI to CWI. (Computer Modern + Constant Width has no bold styles.) + +2021-05-05 G. Branden Robinson + + * tmac/s.tmac (NL, SM, LG): Issue warning diagnostic if macro + called with arguments. + (par*define-font-macro): Construct font macro with diagnostic to + warn if called with excess arguments. + (UL, BX): Issue warning diagnostic if macro called with excess + arguments. + + Fixes . + +2021-05-05 G. Branden Robinson + + * doc/groff.texi: Delete redefinition of \putwordAppendix + Texinfo macro. This restores the word "Appendix" to the names + of all appendices and fixes two bad internal links to Appendix + E, the Register Index, in the DVI and PDF output formats. Per + consultation with Texinfo maintainer Gavin Smith, it's difficult + to get the behavior we want, so give up trying for now. + +2021-05-05 G. Branden Robinson + + * tmac/s.tmac (@MC): Actually diagnose and recover when user + tries to .MC inside a diversion. + +2021-05-05 G. Branden Robinson + + * doc/groff.texi (Differences from AT&T ms): + * doc/ms.ms (Differences from AT&T ms): + * tmac/groff_ms.7.man (Differences from AT&T ms): Document our + different default (empty) for the center footer in nroff mode; + this behavior appears to date back to June 1991 or earlier, + drawing few complaints. + + Fixes . + +2021-05-02 G. Branden Robinson + + * tmac/tests/*: Rename files to use consistent scheme; one + underscore to separate the package name from the test objective, + dashes to otherwise separate words. + * tmac/tmac.am (tmac_TESTS): Use new names. + +2021-05-02 G. Branden Robinson + + [ms]: Restore support for AT&T ms PN register. + + * tmac/s.tmac (pg): Make register PN an alias of %. + + * doc/groff.texi (Differences from AT&T ms): + * doc/ms.ms (Differences from AT&T ms): + * tmac/groff_ms.7.man (Differences from troff ms): We don't need + PN, and it was removed in commit 08291b40 (25 October 2020), but + since it is documented in Lesk 1978 we're stuck with it. Advise + users to stick with %. Also warn them of the hoop they must + jump through if they redefine the page trap macro PT, which Lesk + 1978 also encourages. + + * tmac/tests/s_PN-works.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2021-05-01 G. Branden Robinson + + [ms]: Restore default IP paragraph indentation after an SH call. + + * tmac/s.tmac (par@finish): Set "ai" register for the current + environment to the paragraph indent (PI) setting for the current + environment. + + * doc/groff.texi (Highlighting in ms) : + * doc/ms.ms (Highlighting) : + * tmac/groff_ms.7.man (Usage/Highlighting) : Update + documentation. + + * tmac/tests/s_SH_resets_IP_indentation_amount: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2021-05-01 G. Branden Robinson + + * tmac/s.tmac (DS): Issue diagnostic and attempt recovery if + document attempts to start a display within another display. + + Fixes . + +2021-04-30 G. Branden Robinson + + * tmac/s.tmac: Implement alternative rendering for automatic + footnote numbers in nroff mode, inspired by Heirloom Doctools + ms; since superscripting is not universally available on + terminals, surround number with square brackets instead. + (fn@init): New macro finishes initializing footnote module, + setting up aliases to par@sup-{start,end} strings in troff mode + and otherwise defining fn@sup-{start,end} as brackets. Define * + string here, using new strings. + (par): Call fn@init after par@sup-{start,end} are defined, and + prior to other footnote integration material. + (par*fp!0): Migrate from par@sup-{start,end} to + fn@sup-{start,end}. + + * doc/groff.texi (ms Document Control Settings) : + * doc/ms.ms (Footnotes) : + * tmac/groff_ms.7.man (Usage/Footnotes) : Document it. + + Fixes . + +2021-04-30 G. Branden Robinson + + * test-groff.in: Stop passing the built groff executable -b and + -ww options by default. This reverses a change from 2017. Dave + Kemper has convincingly argued that there's no way to override + -b and turn backtraces on warnings/errors back off, and that the + built groff should behave as much like a "normal" one as + possible. The latter factor is of added importance now that we + are using test-groff for generation of documents. + + * src/roff/groff/tests/regression_savannah_58153.sh: Adapt. + +2021-04-30 G. Branden Robinson + + * tmac/s.tmac (BX): Add alternative implementation for terminal + {nroff} devices. Store width of boxed text, adding .4m only on + troff devices (to make room for the vertical box lines). Break + long input line in troff implementation. If not in troff mode, + use ISO 6429 color escapes to render boxed text in black on + white. Use the \Z escape to match breaking semantics of macro + in troff mode. + + * doc/groff.texi (Highlighting in ms) : + * doc/ms.ms (Highlighting) : + * tmac/groff_ms.7.man (Usage/Highlighting) : Document it. + + Fixes . + +2021-04-30 G. Branden Robinson + + * doc/doc.am: Make $(PROCESSEDDOCFILES) depend on all the same + targets as $(PROCESSEDEXAMPLEFILES); this way the me, ms, and + pic.ms manuals are all regenerated upon changes to their + underlying macro packages. + +2021-04-22 G. Branden Robinson + + * INSTALL.extra: Update. + (Evaluation): New section updates material on "test-groff" + script. Also tell people how to preview our Texinfo manual (in + info, text, DVI, PDF, and HTML formats). + (In Case of Trouble): New section updates bug reporting URL. + + Fixes . + +2021-04-21 G. Branden Robinson + + * tmac/s.tmac: Make the FAM string work more sensibly; it now + applies to headers, footers, and footnotes only if set + before the first call of a sectioning, paragraphing, or + {non-date} document description macro. + (PT, BT): Set the font family to that saved for titles. + (fn*do-FS): Set the font family to that saved for footnotes. + (par@init): Copy the document font family to independent strings + for titles and footnotes. + (par@reset): If in a footnote environment, set the font family + to that saved for footnotes; otherwise use \*[FAM]. + + * tmac/groff_ms.7.man (Differences from troff ms/Text settings): + Describe placement-dependent effect of FAM string setting. + + * doc/groff.texi (Highlighting in ms): + * doc/ms.ms (Highlighting): As above, and suggest different + occasions in which ".ds FAM C" and "CW" are convenient. + + Fixes . + +2021-04-19 G. Branden Robinson + + * src/roff/troff/input.cpp (source, source_quietly) + (macro_source, macro_source_quietly): Use idiomatic Boolean + literals. + +2021-04-17 G. Branden Robinson + + * doc/groff.texi: Drop workarounds for Texinfo pre-5.0 versions; + our local macros produced many warnings during generation of our + Texinfo manual. + (Langlemacro): + (Ranglemacro): + (Lparenmacro): + (Rparenmacro): + (Lbrackmacro): + (Rbrackmacro): Delete. Replace call sites with literals. + (Lbracemacro): + (Rbracemacro): Delete. Replace call sites with @lbracechar{} + and @rbracechar{}. + (angles): Reimplement in terms of @guilsinglleft{} and + @guilsinglright{}. Flesh out comment. + + Fixes remainder of . + +2021-04-17 Dave Kemper + + * doc/meintro.me: + * doc/meref.me: Correct and make consistent usage of the term + "point size". + + Fixes . + +2021-04-17 G. Branden Robinson + + * tmac/an-old.tmac (SS): Add devtags support. Set a subsection + title as a second-level heading and add it to a table of + contents, if any. Prompted by a query from Hans Unzner to the + groff mailing list. Thanks, Hans! + +2021-04-17 G. Branden Robinson + + * tmac/an-old.tmac (SH): Fix apparent thinko. Pass the devtags + macro a literal "1" argument. Passing it \n[an-level] wasn't + correct (it stores the relative inset level, not a sectioning + level), and was useless anyway: SH has already called + .an-set-margin by this point, which resets \n[an-level] to 1. + man(7) does not support nesting of SH macros. Also call + .DEVTAG-NH by its alias .DEVTAG-SH since section headings are + not numbered in man(7). + +2021-04-15 G. Branden Robinson + + [tmac]: Adjust editor file encoding hints. + + * tmac/cs.tmac: Tell Vim the file is "iso-8859-2" (ISO Latin-2). + * tmac/en.tmac: Stop telling Emacs the file is "latin-1"; it's + ASCII. + * tmac/fr.tmac: Tell Vim file is "iso-8859-15" (ISO Latin-9). + + Vim users may need to use ":e ++enc=iso-8859-2", for instance, + to see correct glyphs. + +2021-04-15 G. Branden Robinson + + The first-order determinant of hyphenation points is language, + not territory. Use ISO 639 2-letter language codes for + hyphenation and exception patterns instead of ISO 3166 2-letter + territory codes. + + * tmac/*.us: Rename *.us files to *.en. + * tmac/troffrc: Change hyphenation language "us" to "en". + * tmac/en.tmac: Add English localization file. Set hyphenation + mode to 4. + * tmac/troffrc: Derive groff locale from system. + + * doc/groff.texi (Manipulating Hyphenation): + * man/groff.7.man (Hyphenation): + * man/groff_diff.7.man (Implementation differences): Refer to + "U.S. English" hyphenation patterns as simply "English"; they + will be mostly correct for Commonwealth English as well, and no + alternative English hyphenation patterns for other territories + are available. + + * doc/groff.texi (Manipulating Hyphenation): + * man/groff_diff.7.man (New requests): Note that default + hyphenation mode depends on the language used on the system. + Add concept index entry for localization. Add file index + entries for the locale macro files (cs.tmac, etc.). Update to + reflect rename of English hyphenation patterns and .hla + identifier from "us" to "en". + + * src/roff/groff/tests/localization_works.sh: Add 10 test cases. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + * tmac/LOCALIZATION: Rewrite. + + Fixes . + +2021-04-12 Dave Kemper + + * doc/meref.me: Correct various small issues. + + Fixes . + +2021-04-12 Dave Kemper + + * man/groff.7.man (Registers/Writable registers) : + Drop discussion of Y2K issues. + + Fixes . + +2021-04-11 G. Branden Robinson + + * doc/groff.texi (Setting Registers) : Fix error: the + request is not ignored if the second argument (the new name) + does not exist. Problem dates back to 52a6d12a (11 May 2000). + +2021-04-09 G. Branden Robinson + + Implement new .soquiet and .msoquiet requests. + + Needed for two planned developments: {1} the i18n patch in + Savannah #59814 can use this to quietly attempt to open a + localization file. groff only supports a few locales, so people + with LANG=es_ES, for instance, would ordinarily see warning + diagnostics on every groff startup; and {2} system- or + site-configurable support of per-user {.,}troffrc or man.local + files, gracefully failing if they don't exist. + + * src/roff/troff/input.cpp: + (do_source): Add new function, taking boolean "quietly" + parameter and absorbing function of source(), with added + conditional. + (source): Convert into a wrapper to call do_source() unquietly. + (source_quietly): Wrap do_source(), quietly. + (do_macro_source, macro_source, macro_source_quietly): Analogous + to the foregoing. + (init_requests): Hook "msoquiet" to macro_source_quietly() and + "soquiet" to "source_quietly(). + + * doc/groff.texi (I/O): + * man/groff.7.man (Requests/Request short reference): + * man/groff_diff.7.man (Language/New requests): Document them. + + * src/roff/groff/tests/msoquiet_works.sh: + * src/roff/groff/tests/soquiet_works.sh: Test them. + + * src/roff/groff/groff.am (groff_TESTS): Add tests. + + Fixes . + +2021-04-08 G. Branden Robinson + + * doc/groff.texi (ms Document Control Settings) : Update + description to cover application of footnote format to footnote + markers in general, not just numbers. Clarify different + behavior of format 1 with respect to automatic numbers and other + markers. + (ms Footnotes) <*>: Describe string operation in more detail. + : Describe more precisely how the optional argument is + handled. + + * doc/ms.ms (Footnotes): Synchronize with doc/groff.texi. Add + example using document's own text as a model. + + * tmac/groff_ms.7.man (Usage/Footnotes): Resync relevant + portions with doc/ms.ms. + + Fixes . + +2021-04-06 Dave Kemper + + * src/roff/nroff/nroff.sh: Recognize -k and -K options and pass + them through to troff. Document them in usage message. + * src/roff/nroff/nroff.1.man: Document new -k and -K options. + + Fixes . + +2021-04-06 G. Branden Robinson + + * doc/groff.texi (Manipulating Hyphenation): + Recast introductory paragraph to better distinguish the + automatic breaking of words and placement of hyphens at + user-specified hyphenation points (done with the \% escape) and + automatic determination of hyphenation points within words (what + the pattern files and most of the hyphenation mode parameters + are for). Clarify that what our manual calls "automatic + hyphenation" pertains only to the latter. + Correct over-general claim; hyphenation exceptions defined + with the .hw request _do_ honor .hy value 2 (don't break a word + at the bottom of a page), but none of the others. + <\%> Recast description of escape to emphasize independence of + its two uses (e.g., "\%pseudo\%unununium" is hyphenated only + after "pseudo-", if at all). + <\:> Clarify that escape is an input word boundary. + Clarify that the soft hyphen glyph is applied to manual as + well as automatically-determined hyphenation points. + Recharacterize as setting the _automatic_ hyphenation mode. + Note that restrictions apart from value 2 are not applied to + words with manually-assigned hyphenation points. + Note that request affects only automatic hyphenation. + + * man/groff.7.man (Requests/Request short reference) <.hy,.nh>: + Clarify that requests deal with _automatic_ hyphenation. + (Registers/Read-only registers) <.hy>: + Clarify that register applies to _automatic_ hyphenation. + (Hyphenation): Add new introductory paragraph summarizing manual + hyphenation support and features, including notice that breaking + at explicit hyphens is performed in fill mode, i.e., even if + _automatic_ hyphenation is disabled. + + Thanks to Peter Schaffter for the report. + + Fixes . + +2021-03-27 Deri James + + Changes to the ghostscript fontnames (9.53.3). + + * font/devpdf/Foundry.in: HI and HBI switch to using + Italic rather than Oblique. + +2021-03-24 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjustment): + * man/groff_diff.7.man (Language/Extended requests): Fix + incorrect claim that additional inter-sentence space is applied + only in fill mode. Drop word "parameter" from description of + unit used in .ss request arguments; it is a needlessly specific + reference to the font file format. Tighten wording. + + * man/groff.7.man (Control Characters): Fix incorrect claim that + end-of-sentence detection is attempted only in fill mode. Note + that .ss request also affects inter-word spacing. + + * man/groff_diff.7.man (Language/Extended requests): + - Drop example. + - Move discussion of AT&T vs. GNU troff difference in .ss + handling from here... + (Implementation Differences): ...to here. + + Thanks to Dave Kemper for his continued scrutiny! + +2021-03-20 G. Branden Robinson + + * doc/groff.texi (ms Cover Page Macros): + * doc/ms.ms (Cover page macros): + * tmac/groff_ms.7.man (Usage/Cover page macros): Revise and + rename (sub)sections to "Document description macros". + +2021-03-15 Dave Kemper + + * Makefile.am: Fix typos. Thanks to Bjarni Ingi Gislason for + the report. + + Fixes . + +2021-03-14 Dave Kemper + + * man/groff_tmac.5.man: Correct erroneous reference to PSPIC + where PDFPIC was intended. Fix numerous smaller style and + content problems. + + Fixes . + +2021-03-03 G. Branden Robinson + + * doc/groff.texi (Optional man extensions) : + (Highlighting in ms) : + (Additional ms macros) : Use "monospaced" to refer to font + selected, retaining "constant-width" term only where it explains + the macro mnemonic. Thanks to Dave Kemper for pointing out the + issue. Also fix error: .CW in the ms package seems to have + originated with Research Unix, not Berkeley. + + * doc/ms.ms (Highlighting) : Sync with our Texinfo manual. + * tmac/groff_ms.7.man: Sync with ms.ms, omitting FAM advice. + + Fixes . + +2021-03-02 G. Branden Robinson + + * doc/groff.texi (Identifiers, Strings, Writing Macros) + (Diversions): Improve cross-linkage of documentation regarding + shared name space of macros, strings, diversions, and boxes. + + Fixes . + +2021-03-01 G. Branden Robinson + + * tmac/s.tmac: Improve diagnostic messages. + (@diag): New macro wraps .tm request, always prefixing it with + the name of the macro package, as well as file and line + indicators only if these are set to non-empty or non-zero + values, respectively. + (@error, @warning): Call @diag instead of .tm directly. + (@fatal): Retire; it had only one call site and it would have + greatly complicated @diag to support calling .ab instead of .tm. + An ugly alternative would have been to call .ab with a redundant + message after calling @diag. + (@divert): New macro wraps .di request, remembering the name of + the current file (\n[.F]) when a diversion is started. + (@error-recover): Call .ab instead of (deleted) @fatal. + (pg@super-eject): Tell user what the last file name seen was + when recovering from an unfinished diversion when processing + ends. + + Fixes . + +2021-02-25 G. Branden Robinson + + Fix bug where having line numbering off but the output line + number register \n[ln] set to a positive value would cause + tbl(1) table rows to spontaneously become numbered. Use new + \n[.nm] register to determine whether line numbering is enabled. + + * src/preproc/tbl/table.cpp (table::init_output, table::do_row) + (table::do_bottom): Predicate all conditions on \n[ln] + additionally on \n[.nm]. + + Thanks to Olle Lögdahl for the report. Problem appears to date + back to commit b69062693d3360efce9d4d63fac337be21e07db7, 20 July + 2011. + + Fixes . + +2021-02-25 G. Branden Robinson + + Add regression test for Savannah #59812. + + * src/preproc/tbl/tests/cooperate-with-nm-request.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TEST): Run test. + +2021-02-25 G. Branden Robinson + + Implement new read-only register ".nm". It reports the + enablement status of output line numbering (caused by the .nm + request) irrespective of the temporary suspension of numbering + with the .nn request. Needed because there was no way to + introspect its state, tbl(1) needs to do so, and the writable + line number register \n[ln] is not a reliable proxy for it. + + * src/roff/troff/env.h: Add get_numbering_nodes(), returning + `int`, to public interface of `environment` class. + * src/roff/troff/env.cpp: Implement get_numbering_nodes(). + + * src/roff/groff/tests/dot-nm_register_works.sh: Test it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + * doc/groff.texi (Miscellaneous): + * man/groff_diff.7.man (Language/New number registers): + * man/groff.7.man (Registers/Read-only registers): Document it. + + * NEWS: Add item. + +2021-02-23 G. Branden Robinson + + * tmac/s.tmac: Emit warning diagnostic when using a multi-page + table with a repeating header (".TS H"). + (KS): Rename diversion from "kp*div" to "kp@div" since the name + is now referenced outside the keep module. + (KF): ...similarly for kp@fdiv. + (generally): Update diversion dereference sites and derived + names. + (@TS): When handling "H" argument, check identity of current + diversion and emit appropriately worded warning. + +2021-02-14 G. Branden Robinson + + * FOR-RELEASE: Add more procedures and information related to + incrementing groff's version number. + +2021-02-14 G. Branden Robinson + + * src/libs/libgroff/searchpath.cpp (search_path::open_file) + (search_path::open_file_cautious): Save errno before calling + free() and restore it afterwards. A future version of POSIX + will require that free() not change errno if it succeeds[1]; + some C library implementations, including recent versions of + glibc[2], lack this property. free() is called in these + libgroff functions to clean up after an unsuccessful fopen() of + a heap-allocated file name string, and because the errno from + fopen() may be passed to strerror() in a diagnostic message, it + needs to be accurate. I checked the rest of groff's codebase + and found no other instances of free() being used to clean up + after fopen() failure. + + [1] https://www.austingroupbugs.net/view.php?id=385 + [2] https://sourceware.org/bugzilla/attachment.cgi?id=13073 + +2021-02-11 G. Branden Robinson + + Address build failure on macOS. + + Follow the advice of the gnulib manual ("Changing your source + for use with gnulib") more scrupulously; include config.h in + more files. + + * src/libs/libgroff/curtime.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/device.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/fatal.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/string.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/strsave.cpp [HAVE_CONFIG_H]: + * src/preproc/eqn/other.cpp [HAVE_CONFIG_H]: + * src/preproc/eqn/text.cpp [HAVE_CONFIG_H]: + * src/preproc/pic/object.cpp [HAVE_CONFIG_H]: Do it. + + * src/libs/libgroff/assert.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/errarg.cpp [HAVE_CONFIG_H]: + * src/libs/libgroff/error.cpp [HAVE_CONFIG_H]: #include + config.h using angle brackets instead of quotation marks. + + Fixes . + +2021-02-11 G. Branden Robinson + + Add regression test for Savannah #60025. + + * tmac/tests/doc_Mt-works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2021-02-11 G. Branden Robinson + + [ms]: Demote definition of \[yogh] special character escape from + unconditional availability to be defined only if the output + device defines it or if .AM macro is called to enable support + for Berkeley-style accent marks. + + See + https://lists.gnu.org/archive/html/groff/2021-01/msg00000.html + and follow-ups for discussion. + + * tmac/s.tmac (initialization): Move definition of \[yogh] (only + if the output device doesn't already define it) from here... + (AM): ...to here. + +2021-02-08 G. Branden Robinson + + * doc/ms.ms: Use \[ps] special character instead of local + character definition using numeric code point escape, which is + less portable. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report and a suggested patch. + +2021-02-04 G. Branden Robinson + + * tmac/s.tmac (initialization): Call par*define-font-macro with + arguments "CW" and "R" in nroff mode to silence font warnings + from documents using .CW macro in nroff mode. + +2021-02-03 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::init_output): Save value of + hyphenation maximum consecutive line count register (\n[.hlm]) + more carefully to keep it from being incorrectly parsed as a + decrement, because negative values of \n[.hlm] are valid (in + fact, "-1" is the default). In documents with a large number of + tables, this can lead to a Persian chessboard problem and an + integer overflow (at the groff language level, caught and + handled by src/roff/troff/number.cpp:parse_term()). + + It is wise to wrap a non-literal second argument to the .nr + request in parentheses if assignment is desired and its value + can be negative. See section 5.6.1 ("Setting Registers") of the + groff Texinfo manual. + + Fixes . + +2021-02-03 G. Branden Robinson + + * test-groff.in: Add support for rfc1345.tmac. + +2021-02-02 G. Branden Robinson + + Integrate rfc1345.tmac into build system. + + * contrib/rfc1345/rfc1345.am: Do it. + * Makefile.am: Include contrib/rfc1345/rfc1345.am. + +2021-02-01 G. Branden Robinson + + * src/roff/troff/input.cpp (open_mac_file): Report problem when + attempting to open macro files (-m arguments) and the error is + something other than ENOENT. + (process_macro_file): Update diagnostic to be more precise; the + file couldn't be _opened_, not necessarily _found_, and clarify + that the string being reported back to the user is the argument + to the -m option, not a file name. + (macro_source): Update diagnostic to report that the file + couldn't be _opened_, not necessarily _found_, and include the + nature of the problem. + +2021-01-30 G. Branden Robinson + + [tbl]: Save and restore hyphenation parameters. + + * src/preproc/tbl/table.cpp (table::init_output): When starting + a table, save the hyphenation parameters (\n[.hy], \n[.hla], + \n[.hlm], \n[.hym], \n[.hys]). Restore them in the table reset + macro (confusingly called "3init"), which is called before + performing each diversion and before exiting a table. + + This enables people to, e.g., turn off hyphenation in a table + text block with .nh, just as they can turn off adjustment with + .na, without having to manually reset it. The next text block, + and the material after the table, will not be affected. + + Fixes . + +2021-01-30 G. Branden Robinson + + Add regression test for Savannah #59971. + + * src/preproc/tbl/tests/\ + save-and-restore-hyphenation-parameters.sh: Do it. + * src/preproc/tbl/tbl.am (tbl_TEST): Run test. + +2021-01-30 G. Branden Robinson + + * tmac/tmac.am ($(TMACSTRIPFILES)): + ($(TMACMDOCSTRIPFILES)): Remove unidiomatic for loop which + frustrated parallel make operation. + + Thanks to an anonymous contributor for the report and patch. + + Fixes . + +2021-01-29 G. Branden Robinson + + * doc/ms.ms (Document control settings): Document old FAM string + and new FR string. + +2021-01-29 T. Kurt Bond + + [ms]: Add new string FR to hold an expression for computing the + footnote length relative to the line length, consistently for + single- and multi-column modes, which \n[FL] has never done. + + * tmac/s.tmac: Initialize FR string to "11/12". + (@MC): Compute footnote column width using \*[FR] instead of a + hard-coded "11/12" expression. + (par@init): Compute default \n[FL] using \*[FR] instead of a + hard-coded "11/12" expression. + + * doc/groff.texi (Macro Packages/ms/Document control settings): + * tmac/groff_ms.7.man (Usage/Document control registers): + Document it. + + Fixes . + +2021-01-25 G. Branden Robinson + + * src/roff/troff/env.cpp: Add ADJUST_MAX enumeration constant to + record maximum valid numerical adjustment mode. + (adjust): Verify numeric argument against ADJUST_MAX instead of + a numeric literal. Ignore excessively large values instead of + setting adjustment mode to "right". Update warning diagnostic. + +2021-01-25 G. Branden Robinson + + Add regression test for .ad and .na requests. + + * src/roff/groff/tests/adjustment_works.sh: Do it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2021-01-24 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjustment): + * man/groff.7 (Requests/Request short reference): Clarify + behavior of ".na" and ".ad l". + + Thanks to Bjarni Ingi Gislason for pointing out the potential + for confusion and for his careful review of the new text. + + Fixes . + +2021-01-20 G. Branden Robinson + + * src/roff/grog/grog.pl: Report program name in fatal error + diagnostics. Also drop sentence-ending punctuation since Perl + supplies additional information. + + Continues the long process of fixing Savannah #52463. + +2021-01-19 G. Branden Robinson + + * tmac/an-old.tmac (RE): Style-warn if macro arguments are out + of range or redundant. + + Fixes . + +2021-01-15 G. Branden Robinson + + Improve style of troffrc{,-end} files. Follow established + idioms and make them consistent with each other. + + * tmac/troffrc: + * tmac/troffrc-end: + - Identify files in header comments as part of GNU troff. + + * tmac/troffrc: + - Clarify purpose of .do request. + - Identify .X (set by groff -X) as a register, not a string. + - Remove temporary registers one per line to make + synchronization with foregoing logic easier. Fixes name + space management nits: an undefined string troffrc!Xps was + being removed, and troffrc!{ascii,latin1,utf8,cp1047} were + not being removed despite being defined. + + * tmac/troffrc-end: + - Clarify that file is read after -m file arguments (not "all + macro sets", which can be loaded with .mso after this file + is processed). + - Advise usage of .do for groff extensions. + - Line-break one-off conditionals as troffrc does. + - Add empty string comment to empty string definitions. + +2021-01-14 Dave Kemper + + Commit 87edb525, from 2003, added character U+2026 (HORIZONTAL + ELLIPSIS) to most base groff fonts, but there has been no + kerning information for this character. To produce consistent + typography, it should be kerned the same way as the period, + which is in 818 kern pairs across all the devps fonts. + + Apply the following shell command to the groff description files + of the PostScript fonts. + + for file in font/devps/*[A-Z] + do sed -Ei\~ 's/(.*)(^| )\. (.*)/&\n\1\2u2026 \3/' $file + done + + * font/devps/AB: + * font/devps/ABI: + * font/devps/AI: + * font/devps/AR: + * font/devps/BMB: + * font/devps/BMBI: + * font/devps/BMI: + * font/devps/BMR: + * font/devps/HB: + * font/devps/HBI: + * font/devps/HI: + * font/devps/HNB: + * font/devps/HNBI: + * font/devps/HNI: + * font/devps/HNR: + * font/devps/HR: + * font/devps/NB: + * font/devps/NBI: + * font/devps/NI: + * font/devps/NR: + * font/devps/PB: + * font/devps/PBI: + * font/devps/PI: + * font/devps/PR: + * font/devps/TB: + * font/devps/TBI: + * font/devps/TI: + * font/devps/TR: + * font/devps/ZCMI: Apply above script. + + Fixes . However, this + will need to be done again if afmtodit is used to regenerate the + above files, or afmtodit will need to be modified to add this + kerning information itself. + +2021-01-12 G. Branden Robinson + + * src/libs/libgroff/relocate.cpp (set_current_prefix) [_WIN32]: + Move declaration of `pathextstr` to lie within preprocessor + conditional, since it is dereferenced only there. + +2021-01-10 G. Branden Robinson + + Add support for strsignal(). + + POSIX.1-2008 added strsignal() to the C library and recommended + its use over sys_siglist[], but groff's pipeline management + hadn't been updated in that respect since that time. + + * configure.ac: Check for strsignal(). + * src/roff/groff/pipeline.c (xstrsignal): Return strsignal() if + it is defined. + + Thanks to an anonymous contributor for the report and the patch. + + Fixes . + +2021-01-06 G. Branden Robinson + + * src/libs/libgroff/relocate.cpp (relocatep): Add assertion to + identify logic error if `curr_prefix` is unexpectedly a null + pointer. + (set_current_prefix) [_WIN32]: Allocate memory from heap for + `curr_prefix` only on Windows; on other systems, this file's + searchpath() is used to populate `curr_prefix`, and that + function (except on Windows) performs its own allocation. Fixes + memory leak noted by Ingo Schwarze. + (set_current_prefix) [!_WIN32]: Move logic attempting to set + `curr_prefix` by calling searchpathext() from here... + [WIN32]: ...to here. The PATHEXT environment variable has + semantics only under Windows, not POSIX systems, so the + placement of this code seemed erroneous. + + See . + +2021-01-06 Colin Watson + + * contrib/glilypond/glilypond.pl: + * contrib/gperl/gperl.pl: + * contrib/gpinyin/gpinyin.pl: + * tmac/hyphenex.pl: Avoid Perl's unsafe "<>" operator. + + The "<>" operator is implemented using the two-argument form of + "open", which interprets magic such as pipe characters, allowing + execution of arbitrary commands which is unlikely to be + expected. Perl >= 5.22 has a "<<>>" operator which avoids this, + but also forbids the use of "-" to mean the standard input, + which is a facility that the affected groff programs document. + + ARGV::readonly would probably also fix this, but I fundamentally + dislike the approach of escaping data in preparation for a + language facility to unescape it, especially when the required + escaping is as non-obvious as it is here. (For the same reason, + I prefer to use subprocess invocation facilities that allow + passing the argument list as a list rather than as a string to + be interpreted by the shell.) So I've abandoned this dubious + convenience and changed the affected programs to iterate over + command-line arguments manually using the three-argument form of + open. + + glilypond doesn't need the initial unshift since that's already + handled in contrib/glilypond/args.pl. + + Fixes . + +2021-01-06 G. Branden Robinson + + * tmac/s.tmac: Set footnote line length in multi-column + environments to 11/12ths of the text line length for consistency + with earlier change to FL register default. + + Thanks to T. Kurt Bond for bringing this issue to my attention. + +2021-01-04 John Gardner + + * tmac/strip.sed: Escape '.' wildcard when matching lines using + .as and .ds requests. + + Fixes . + +2021-01-04 G. Branden Robinson + + Document use of SOURCE_DATE_EPOCH and TZ. + + The semantics of SOURCE_DATE_EPOCH to groff were not established + with respect to time zone selection, prompting divergent + interpretations; Debian and distributions derived from it have + for several years patched groff to implicitly use UTC as the + time zone when interpreting the current time (or + SOURCE_DATE_EPOCH) as a local time. While a convenient and + defensible choice for reproducible build efforts[1], it runs + against the grain of user expectations. Systems programmers + like monotonically increasing clocks; the broader user base + usually prefers a clock that follows an applicable civil + calendar. To the latter audience, a difference between + $ date "+%Y-%M-%d %H:%m:%S" + and + $ groff <. + + [1] https://reproducible-builds.org/docs/source-date-epoch/ + +2020-12-25 G. Branden Robinson + + * doc/doc.am (.texi.dvi): Call texi2dvi with FORCE_SOURCE_DATE=1 + in the environment, avoiding an embedded timestamp in the + generated groff.dvi file, which frustrated reproducible builds. + Thanks to Werner Lemberg for the suggestion. + + * src/roff/groff/tests/string_case_xform_unicode_escape.sh: Fix + test to no longer use Bash process substitution, resulting in + nondeterministic file descriptor numbers appearing in test logs, + frustrating reproducible builds. + + * contrib/pdfmark/pdfmark.am (PDFROFF): Call pdfroff without + `--keep-temporary-files` option. Temporary directories are + created with mktemp(1) and files with an embedded process + identifier, which frustrates reproducible builds. + + See . + +2020-12-21 Dorai Sitaram + + * tmac/s.tmac (@IP): Handle inter-sentence space correctly in + paragraph tags by copying \n[.sss] from the enclosing + environment to that used to format the paragraph tag. + + Fixes . + +2020-12-21 G. Branden Robinson + + Add regression test for Savannah #59742. + + * tmac/tests/s_IP_respects_inter-sentence_space_in_tags.sh: Do + it. + * tmac/tmac.am (tmac_TESTS): Run it. + +2020-12-21 Bjarni Ingi Gislason + + * src/utils/addftinfo/addftinfo.cpp (usage): Use size_t for loop + index when iterating over a count of size_t items. Quiets + signedness mismatch compiler warning. + + Fixes . + +2020-12-20 Colin Watson + + * src/devices/gropdf/gropdf.pl: + * src/utils/afmtodit/afmtodit.pl: Sort Perl hash keys. Hash + iteration order may differ between runs, which makes builds + harder to reproduce. Sort hash keys in gropdf and afmtodit + output to avoid this. + +2020-12-20 G. Branden Robinson + + * doc/ms.ms (Basic Information): Tweak unit definitions. groff + defines a typesetter's point as precisely 1/72 inches. Also use + the correct symbol for inch units--strictly, it's the same as + that for "seconds" as in subdivisions of the degree, and not a + typographical quote of any sort. + + Fixes . + +2020-12-20 G. Branden Robinson + + [ms]: Set footnote line length to AT&T default. + + groff ms has since its initial implementation used a default + footnote line length of 5/6ths of the text line length; this may + correspond to an early AT&T ms default (perhaps documented in + the 1974 version of the M. E. Lesk paper, "Typing Documents on + the UNIX System"[1]). However, as early as V6 Unix (1975), AT&T + ms actually used a footnote line length of 11/12ths of the text + line length instead[2]. + + Heirloom Doctools and neatroff ms also use this default. + + * tmac/s.tmac: Set default footnote line length to 11/12ths of + the text line length. + + * doc/groff.texi (ms Document Control Settings): + * doc/ms.ms (Document control registers): Document new default. + + [1] https://www.troff.org/using-ms.pdf + [2] https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/lib/tmac.s + +2020-12-09 G. Branden Robinson + + Lower new unplanted trap error to 'mac' warning. + + * src/roff/troff/div.cpp (top_level_diversion::change_trap): + Change error upon invalid attempt to move an unplanted trap into + a warning of type 'mac'. + + * doc/groff.texi (Warnings): + * src/roff/troff/troff.1.man (Warnings): Recast description of + 'mac' warning type to include the above scenario. + + Thanks to Bjarni Ingi Gislason for reporting the diagnostic + arising in real life, and to Peter Schaffter for the discussion + and recommendation. Some bike sheds get painted quickly! + + Fixes . + +2020-12-05 G. Branden Robinson + + * tmac/groff_mdoc.7.man: Tweak mandatory macro explanations. + + Update descriptions and template of .Dd, .Dt, .Os usage to + reflect recent changes and recommended conventions. + + Thanks to Ingo Schwarze, Colin Watson, and Alan D. Salewski for + the discussion, and Florent Rougon and Robert Bihlmeyer (many + years ago) for the original report. + + Fixes . + +2020-12-01 G. Branden Robinson + + * src/utils/xtotroff/xtotroff.c (MapFont): Avoid writing past + the end of a static buffer. Problem found and patch supplied by + Bjarni Ingi Gislason. I tweaked it to comment it differently + {in case the buffer ever needs to grow, but the prospects of + future X11 server-side font rendering development seem dim} and + use snprintf() instead of retaining the existing sprintf(). + + Fixes . + +2020-12-01 G. Branden Robinson + + * src/utils/xtotroff/xtotroff.c (CanonicalizeFontName) + (FontNamesAmbiguous, MapFont, main): Format diagnostic messages + more consistently with GNU Coding Standards. Prefix with name + of complaining command. Put argument literals in quotation + marks. Put each message on one line only. + +2020-11-28 G. Branden Robinson + + * doc/groff.texi (Parameters): Fix error in example. Arguments + to .als were in the wrong order (.als is not ln(1)). Also mark + output to the standard error stream using the @error Texinfo + command instead of @result. + + Thanks to Dorai Sitaram for finding this error. + + Fixes . + +2020-11-28 G. Branden Robinson + + * doc/groff.texi (Debugging): Update with a more helpful + introduction, summarizing available procedures. Mention + backtracing since it is much more useful now (post-groff + 1.22.4.) + + * man/groff.7 (Debugging): Add new section summarizing + material added to our Texinfo manual. + + * man/groff_diff.7.man (Debugging): Add new section describing + groff extensions. + +2020-11-22 G. Branden Robinson + + * doc/groff.texi (Traps): Update. Organize subsubsections "Page + Location Traps" and "Diversion Traps" under new subsection node + "Vertical Position Traps" to make the conceptual organization + more clear. Define and discuss trap visibility earlier. + Document unit used for page location trap reporting. Introduce + analogy of .wh and .ch requests as queue operations. Document + what happens when the same macro is planted as a trap in + multiple locations; supply example. Supply example of .itc + usage. Consistently refer to an end-of-input macro as such, to + contrast it with the "end macro" that can be used with, e.g., + .de and .ig requests. + + * man/groff.7 (Traps): Add new section summarizing + language feature. + +2020-11-18 G. Branden Robinson + + * tmac/mdoc/doc-common-u (doc-footer): When performing + double-sided page layout, set page number on outside of _recto_ + {odd-numbered} pages, as is conventional and for consistency + with man(7). + + * tmac/groff_mdoc.7.man + (Formatting with groff, troff, and nroff): Document what + double-sided layout (not "printing") means. Also correct + description of continuous rendering, which implied that page + headers and footers were not written at all, and used an + incorrect groff driver name. + + Fixes . Also see: + https://lists.gnu.org/archive/html/groff/2019-01/msg00021.html + Thanks to Ralph Corderoy for the discussion. + + * tmac/tests/doc-D_places_page_numbers_correctly.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2020-11-18 G. Branden Robinson + + * tmac/mdoc/doc-common-u (doc-header): Fix infinite loop when + attempting to trim header string (like "FTP(1)") to fit when the + available title length won't allow even extreme shortening. + Measure the string before and after calling .substring on it, + and break out of loop if it didn't get shorter. + + Problem dates back to at least + ed63b0ae76a611b581601a1afc192f6a7367be6f (7 July 2002), possibly + as far as the Great Mdoc Rewrite of + 058f72af832fc68488d33cd09ec819e5c560fa09 (23 March 2001). + + One can never check loop invariants too many times... + + Fixes . + + * tmac/tests/\ + doc-do_not_loop_infinitely_when_shortening_headers.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + +2020-11-18 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Recognize -b and -z options and pass + them through to troff. Document them in usage message. + * src/roff/nroff/nroff.1.man: Document new -b and -z options. + +2020-11-17 G. Branden Robinson + + * src/roff/troff/div.cpp (top_level_diversion::change_trap): + Emit error diagnostic if an attempt is made to move an unplanted + macro. This could have been a warning, as it's pretty harmless + {though possibly a big surprise to anyone who was wondering why + their .ch was a no-op}, but there's no good warning category for + this kind of problem and I am not about to start a bike shed + discussion about it right now. + +2020-11-15 G. Branden Robinson + + * doc/groff.texi: Update. Add introductory material. Rewrite + the first section of the "gtroff Reference" chapter of our + Texinfo manual. It is written as an introduction for readers + who want to go straight to "raw" troff without knowing much or + anything about existing macro packages. Thanks to Dave Kemper + and John Gardner for feedback and support. + + Clarify whitespace usage. "Whitespace" is defined in this + manual as "spaces, tabs, and newlines". Say only "spaces and + tabs" when newlines should not be included. + + Rename "Font Files" to "Device and Font Files". + + Rename "Manipulating Filling and Adjusting" to "Manipulating + Filling and Adjustment". + + Update discussion of "copy mode". Rename from "copy-in mode", + which I don't think eludicdated anything; is there a "copy-out + mode"? Rename nodes accordingly. Attempt to explain more + clearly. Recast to shift emphasis to what _isn't_ merely copied + in copy mode, since that is what seems to cause confusion among + the inexperienced. + + Update "Conditionals and Loops". Add introductory paragraph. + Add nodes/subsections "if-then" and "Conditional Blocks". Add + subsection "Conditional Blocks" to explain the behavior of the + \{ and \} escapes much more precisely. I don't think this + syntactical area is well understood. Supply examples. + +2020-11-14 G. Branden Robinson + + Add style checks to man(7) macro package. + + Not otherwise documented yet; experimental--subject to change. + + * tmac/an-old.tmac: Initialize CHECKSTYLE to false if not + already set. + (an-style-warn): New macro emits diagnostic of type "style" when + called if CHECKSTYLE register is true. + (TH): Call an-style-warn if fewer than two or more than five + arguments are seen. + (RI, IR, IB, BI, RB, BR): Call an-style-warn if fewer than two + arguments are seen. + +2020-11-11 Bertrand Garrigues + + Update copyright. + + * update-copyright.sh: use gnulib's 'update-copyright' script. + Pass this script in directories 'arch', 'contrib', 'font', + 'man', 'tmac', 'src' and on a list of extra files. + + * FOR-RELEASE: mention this point. + +2020-11-11 G. Branden Robinson + + * src/preproc/preconv/preconv.1.man (Description): Fix error: + groff's -K option, not -k, specifies a character econding (and + overrides GROFF_ENCODING in the environment). Also explain how + valid encoding strings are determined. + + Thanks to Bjarni Ingi Gislason for the report. + + Fixes . + +2020-11-11 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::compute_separation_factor): + Add word "table" to diagnostic message to better cue the user + that it is produced by roff that has been injected into the + document by the tbl(1) preprocessor. The other 3 such possible + diagnostic messages already do this. Thanks to Bjarni Ingi + Gislason for bringing the inconsistency to light. + + Fixes . + +2020-11-07 G. Branden Robinson + + * tmac/groff_mdoc.7.man (Predefined strings): Ensure the table + fits even on ASCII and Latin-1 terminals. Thanks to Bjarni Ingi + Gislason for the report. + + Fixes . + +2020-11-01 G. Branden Robinson + + * tmac/groff_mdoc.7.man (General text domain/Enclosure and + Quoting Macros): Fix errors in macro descriptions. + <.Dq>: Encloses its arguments in directional double quotes where + available. + <.Eq>: Misrendered example; say "XstringY" rather than + "XXstring". + <.Sq>: Encloses its arguments in directional single quotes where + available. + +2020-10-31 G. Branden Robinson + + Add support for CS and CT registers to mdoc(7), just like in + man(7), from a year ago. + + * tmac/doc.tmac-u (doc-print-recursive): Call .stringup on each + argument if register doc-do-capitalize is true. + * tmac/mdoc/doc-common-u (Dt): Call .stringup on + doc-document-title if \n[CT] is true. + (Sh): Set doc-do-capitalize to value of \n[CS]. Set + doc-do-capitalize false before returning. + * tmac/mdoc/doc-ditroff-u: + * tmac/mdoc/doc-nroff-u: Set CS and CT registers to 0 (false) + if the user has not defined them. + + * tmac/groff_mdoc.7.man \ + (Formatting with groff, troff, and nroff): Document it. + + * tmac/tests/doc-CS_works.sh: + * tmac/tests/doc-CT_works.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run tests. + +2020-10-31 G. Branden Robinson + + * src/roff/troff/input.cpp (do_overstrike, do_bracket) + (do_name_test, do_expr_test, do_zero_width, do_width) + (do_special, do_if_request, read_color_draw_node): Improve + diagnostic messages for missing closing delimiters by describing + the incomplete structure and the problem token. + (read_rgb, read_cmy, read_cmyk, read_gray): Improve English + syntax of diagnostic message when color definition missing. + +2020-10-31 G. Branden Robinson + + * tmac/mdoc/doc-ditroff-u: + * tmac/mdoc/doc-nroff-u: Recognize but ignore the groff_man(7) + string HF and registers FT, IN, P, SN, and X (by initializing + them empty or zero if they are not set). This reserves them so + that they don't become used for divergent purposes. man(1) + programs set these and other parameters already handled (like + LL) to configure page rendering, and it would break the + macro-package agnosticism afforded by andoc.tmac to expose + different externally-programmable registers and strings. + * tmac/groff_mdoc.7.man \ + (Formatting with groff, troff, and nroff): Document this. + +2020-10-31 G. Branden Robinson + + * tmac/s.tmac: Implement \*< and \*> strings for subscripting. + groff ms has had (extension) strings for superscripting since + 1991 at the latest, and the asymmetry possessed me of a madness. + Both pairs of string names follow similar usage in Eric Allman's + "me" macros. + + * NEWS: + * doc/groff.texi: + * tmac/groff_ms.7.man: Document it. + +2020-10-31 G. Branden Robinson + + * tmac/groff_mdoc.7.man (Predefined strings): Fix error: the + \*[Lq] and \*[Rq] strings degrade to neutral double quotes (") + on "nroff" devices (-Tascii and -Tlatin1), not "``" and "''". + +2020-10-31 G. Branden Robinson + + * tmac/s.tmac (ds*end!0): Improve diagnostic to mention .RD. + +2020-10-30 G. Branden Robinson + + * tmac/s.tmac: Revise diagnostic messages. Define a common + prefix string, starting all such messages with "s.tmac". + Continues the long process of fixing Savannah #52463. Drop the + word "macro" from diagnostic since this will now be clear from + the prefix. Prefix every macro name in a diagnostic message + with a leading dot; this was already done in four cases. + (cov*first-page-init): Use temporary string to avoid multi-line + diagnostic message. + (@NH): Use temporary string to prevent overlength line. + + A further benefit of this revision is that index information + produced by ms's .IX macro (which writes to the standard error + stream) will now be trivially easy to extract even for documents + that cause diagnostic messages. One can simply filter them with + grep -v '^s\.tmac:' + or similar. + +2020-10-28 Ingo Schwarze + + * man/roff.7.man, tmac/groff_man.7.man.in: Correct man(7) + history. + +2020-10-26 G. Branden Robinson + + Fix ms .R macro to work as documented, by handling its arguments + instead of ignoring them. + + * tmac/s.tmac (R): Delete. During set up, call + par*define-font-macro for R font just as we do for B, I, and BI. + + Problem dates back at least to groff 1.02, June 1991. + + * tmac/tests/s_R-handles-its-arguments.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2020-10-25 G. Branden Robinson + + Fix ms .TC macro by allowing it to actually use lowercase Roman + numerals for the page(s) of the table of contents when a custom + title (header or footer) is defined containing '%'. + + As a side effect, eliminate the PN register, which was + apparently misused because it was undocumented and had a name + just long enough to be both suggestive and ambiguous. Another + pin goes into my Ken Thompson voodoo doll. + + * tmac/s.tmac (IX): Write out page number of index term(s) using + the % register (instead of PN), obtaining whatever format is + assigned to the register at that time. + (CH): Similarly, output %, not PN, in the center of the default + heading. + (PT): Save the format of %, set it to decimal, copy its value to + a new register, pg*page-number-in-decimal, then restore %'s + previous format. Compare the new register, not %, to 1 to + determine whether special page one behavior should be used. + (pg*end-page): Assign pg*next-format to %, not PN. + (XA): Define toc*num with the interpolation of %, not PN. + + * tmac/tests/s_TC-works-with-percent-in-custom-titles.sh: Test. + * tmac/tmac.am (tmac_TESTS): Run test. + + Problem appears to be very old; as I read it, Larry Kollar was + complaining of it in his ms.ms document over 20 years ago. + + Fixes . + +2020-10-25 G. Branden Robinson + + * man/groff.7 (Requests/Request short reference) <.af>: Fix + error; "l" is not a valid register format. Explain what the + request does, and the default format, as tersely as possible. + +2020-10-22 G. Branden Robinson + + Use only `malloc()` and `free()` to manage memory of paths + opened by the parser instead of mixing in C++ new/delete + management under some runtime-dependent circumstances. + + * src/libs/libgroff/relocate.cpp (relocatep): Use `malloc()`, + not new. + * src/roff/troff/input.cpp (process_macro_file) + (process_startup_file, macro_source): Use `free()`, not + `{a_,}delete()`. + + Thanks to an anonymous contributor for the report and patch. + + Fixes . + +2020-10-22 G. Branden Robinson + + * man/groff_char.7.man (Description/Special character escape + forms): Clarify discussion of Unicode Normalization Form D and + its applicability to code points acceptable in Unicode numeric + special character escapes. Also document that these escapes + must use uppercase hexadecimal digits. + + Attempts once again to slay the unkillable beast that is + . + +2020-10-21 Ingo Schwarze + + On systems without NAME_MAX, use FILENAME_MAX as a last resort. + + Problem reported by Eli Zaretskii + on MS Windows in https://savannah.gnu.org/bugs/?55449 + +2020-10-20 G. Branden Robinson + + * src/roff/troff/env.cpp (environment::possibly_break_line): + Emit break warning and return if the output width is not + positive. The code assumes that it will be and loops infinitely + if it isn't. I _think_ this is because we're not able to get + width data for (some?) CJK glyphs. Based on a patch by Osamu + Sayama. + + * src/roff/groff/tests/\ + do_not_loop_infinitely_when_breaking_cjk.sh: Test it. + * src/roff/groff/groff.am: Run test. + + Fixes . + +2020-10-20 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::init_output): Save the value + of \n[.tabs] when starting a table. In the reset macro, restore + the saved value. + + Based on a patch by Bjarni Ingi Gislason (tweaked to use a more + normative preprocessor symbol; "REG"s aren't "NAME"s). + + * src/preproc/tbl/tests/save-and-restore-tab-stops.sh: Test it. + * src/preproc/tbl/tbl.am (tbl_TESTS): Run test. + + Fixes . + +2020-10-20 G. Branden Robinson + + * src/roff/nroff/nroff.sh: Recognize -E option and pass it + through to troff. Document it in usage message. + * src/roff/nroff/nroff.1.man: Document new -E option. + + Based on a patch by Ingo Schwarze. + + Fixes . + +2020-10-18 G. Branden Robinson + + * tmac/an-old.tmac: Stop remapping ` and '. Our own pages now + appear to be clear of wrong-quote problems, so let's make them + visible if they recur. Those who don't want to fix bad man + pages (distributors, site admins) can restore the mappings in + their man.local files. + +2020-10-18 G. Branden Robinson + + * tmac/an-old.tmac (an-warn): New; emits warning diagnostic. + (R): Use new macro instead of .tm* requests directly. + +2020-10-18 Ingo Schwarze + + #include "config.h" before + + Required with e.g. gcc 4.2.1 because gnulib/lib/stdio.in.h + uses the "restrict" keyword since this gnulib commit: + commit 182afcba2635cbff91240656c7fb3742dd23ab6f + Author: Bruno Haible + Date: Sat Feb 22 20:57:30 2020 +0100 + + Otherwise, the build may die from the declaration of + various printf-like functions with messages like: + ./lib/stdio.h:851: error: expected ',' or '...' before 'fp' + + * src/libs/libgroff/assert.cpp, src/libs/libgroff/errarg.cpp, + src/libs/libgroff/error.cpp, src/preproc/eqn/eqn.ypp: + #include "config.h". + +2020-10-18 Bertrand Garrigues + + hpftodit: incorrect 'delete' after new[] + + * src/utils/hpftodit/hpftodit.cpp (output_font_name): use + 'delete[]'. + + Fixes bug #55331. Found by David Binderman, fixed by Ingo + Schwarze. + +2020-10-18 Bertrand Garrigues + + preconv: don't use libuchardet if input is stdin + + * src/preproc/preconv/preconv.cpp (do_file): don't call + detect_file_encoding if input file is "-" + + This fixes the failure on MS-Windows described #55334, however + this does not fix the encoding detection with uchardet if the + input is stdin (the user would have to pass with -D the correct + encoding as explained in the man page). + +2020-10-17 G. Branden Robinson + + * src/preproc/eqn/lex.cpp (troff_defs): Set the "..." token on + the baseline, not vertically centered, aligning the actual + behavior with what our eqn(1) man page has claimed since 2007. + + Fixes . + +2020-10-17 G. Branden Robinson + + * src/devices/grops/grops.1.man + (Usage/TrueType and other font formats): Remove dead URL to + ttftot42 utility. Update URL to fontforge tool. Replace much + of the discussion with an example, motivated by Jordan Torbiak's + "groff-install-font" script on GitHub Gist, of how to add the + Roboto Slab Regular font to a user-local groff font directory + {and how to test it, too}. + + Fixes . + +2020-10-17 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Report program name in warning + diagnostics. + + Continues the long process of fixing Savannah #52463. + +2020-10-17 G. Branden Robinson + + * tmac/an-old.tmac: Add fallback for lq, rq strings. + + Define \*(lq and \*(rq as '"' if the output device has no \(lq + or \(rq special character escapes defined (respectively). + + This is a bit belt-and-suspenders for groff since our output + devices all guarantee availability of these glyphs, but if this + macro file gets used with other implementations (and if they + support the 'c' conditional), it should prevent the strings from + producing empty output. + + Man page writers should simply use \(lq and \(rq unless they are + aiming for pathological levels of portability (e.g., composing + man pages today for consumption on simulators of 1980s Unix + systems). + +2020-10-16 G. Branden Robinson + + * tmac/an-old.tmac: Define an-end with .de1. We need to define + an-end with de1 (execute macro with compatibility mode off) + because, as of 37b4180a27a6eeaea429e40ec278abefcda7f3a7 (11 + October), it can now be called from a trap executing in a + context whence compatibility mode might be on (namely, + "reload-doc" in andoc.tmac). + +2020-10-16 G. Branden Robinson + + * src/preproc/eqn/main.cpp (main): + * src/preproc/pic/main.cpp (main): + * src/preproc/tbl/main.cpp (main): + * tmac/eqnrc: + * tmac/troffrc: Perform checks of register and macro definitions + with a .do request, since we might be in compatibility mode. + +2020-10-16 G. Branden Robinson + + * src/roff/troff/input.cpp (do_if_request): Emit warning of type + "syntax" if a groff conditional expression extension is used + when compatibility mode is active. + + * doc/groff.texi: + * src/roff/troff/troff.1.man: Update description of "syntax" + warning type to be more general. It was inaccurate, referring + only to "dubious syntax in numeric expressions", which was not + the case. Instead it was being used only for poor construction + of character classes with the .class request. + +2020-10-16 G. Branden Robinson + + * src/preproc/tbl/main.cpp (main): Stop ignoring -T. GNU tbl + was undocumentedly ignoring the -T option; apparently IRIX tbl + implemented it, something on the system called tbl with that + option (I'm guessing IRIX's man(1)) and its users spammed James + Clark with bug reports. We can probably weather the volume of + such spurious reports from IRIX users today. + +2020-10-16 G. Branden Robinson + + * src/preproc/tbl/main.cpp (main): Clarify fatal diagnostic in + generated document by informing the user that the program is + aborting, and also that it is groff extensions that are required + rather than GNU troff per se (since Heirloom Doctools troff + claims groff extension support via the .g register). + +2020-10-14 Ingo Schwarze + + In groff(1), fix the combination of -v with -k, -j, and -J. + + * src/roff/groff/groff.cpp: Pass the -v option through to the + preconv, chem, and ideal preprocessors, just like for all + other preprocessors, to print the version of the preprocessor + and to avoid garbage output. + + Bugfix patch from Eli Zaretskii + submitted in: https://savannah.gnu.org/bugs/?55297 + +2020-10-12 Bertrand Garrigues + + Update 'gnulib' submodule. + + * gnulib: now points on d60a35e94c4f5b8f09f15828242418f5073d46e7 + from 'gnulib' repository. + + * configure.ac: minimum autoconf version is now 2.64 due to + gnulib upgrade. + + * FOR-RELEASE: add the gnulib update to the checklist. + +2020-10-11 G. Branden Robinson + + * tmac/andoc.tmac: When switching between macro packages in + andoc and using continuous-rendering mode, flush any partially + collected output line and write page footer. + (reload-doc): Call an-end if it is defined. + (reload-man): Call doc-end-macro if it is defined. + * tmac/tests/andoc-flush-between-packages.sh: Add regression + test. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2020-10-11 G. Branden Robinson + + * tmac/andoc.tmac: Remove traps set by mdoc package by the names + they actually use. + * tmac/tests/andoc-clear-doc-traps.sh: Add regression test. + * tmac/tmac.am (tmac_TESTS): Run test. + + Fixes . + +2020-10-10 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::init_output): In the release + macro written to the output, reword the warning diagnostic that + is emitted when a table row is to be output without enough room + before the next page location trap. The former wording said + that a "text block" would not fit on the page, and that is + normally how table rows grow longer than one line in the first + place. However, there are other ways the conditional can be + satisfied, as witnessed in Savannah #57665, so simply say what + is known; that the table _row_ overruns the space to the next + trap (we say the row won't "fit on [the] page"). + + Fixes . + +2020-10-10 G. Branden Robinson + + * src/preproc/tbl/table.cpp + (double_line_entry::double_line_entry): + (double_line_entry::simple_print): Remove garbage lines + inadvertently added in previous commit. + +2020-10-09 G. Branden Robinson + + Stop tbl from injecting spurious blank lines (and emitting + spurious warnings about tables and "text blocks" not "fitting on + a page") into long tables in man pages when continuous rendering + is used (the default for nroff output devices). + + * src/preproc/tbl/table.cpp (USE_KEEPS_REG): New preprocessor + symbol stores name of groff register for dynamic determination + of keep usage. + (table::init_output): If the NOKEEP flag is not set, then in + generated groff output, see if the usekeeps register is defined; + if not, define it and enable usage of keeps. + (table::do_row): In groff output, check usekeeps register before + calling keep and release macros. + (table::do_bottom): In groff output, check usekeeps register + before calling release macro. + + * tmac/an-old.tmac (TS): Set the usekeeps register used by tbl + to the logical complement of the man(7) cR (continuous + rendering) register. + + * tmac/tests/an-old_TS_do_not_keep_tables_when_cR_set.sh: Add + regression test. + * tmac/tmac.am (tmac_TESTS): Run test. + + Problem appears to date back to the introduction of continuous + rendering in groff 1.17 (3 May 2001). + + Fixes . + +2020-10-09 G. Branden Robinson + + * src/preproc/tbl/table.cpp (simple_entry::position_vertically): + (block_entry::position_vertically): + (table::determine_row_type): + (printfs): Update assertions to indicate what actually went + wrong. + +2020-10-02 G. Branden Robinson + + * src/roff/troff/node.cpp: Make diagnostics slightly more + informative in unusual error cases. + (real_output_file::~real_output_file): If ferror() reports error + status on a stream say that, instead of "error writing". If it + does not, but fflush() fails on the stream, describe the flush + as failing, and use strerror() since fflush() sets errno. If + pclose() fails, say that we were unable to close a pipe instead + of repeating the name of the C library function to the user, who + might not be a C programmer. Report strerror() in this case and + for a failing fclose(). + (real_output_file::flush): Repeat updated fflush() logic from + previous function. + +2020-09-30 G. Branden Robinson + + * tmac/an-old.tmac (register setup): Make interaction of \n[C] + register and HTML output more clear in code and comments. + +2020-09-30 G. Branden Robinson + + * src/roff/groff/tests/regression_savannah_59202.sh: Reduce test + case. + +2020-09-29 G. Branden Robinson + + Fix SEGV arising from recursing destructor. + + * src/roff/troff/node.h (output_file): Add class member + `is_dying` to track whether destructor has already been entered; + initialize false. + * src/roff/troff/node.cpp (real_output_file::~real_output_file): + Set `is_dying` true when destructor entered. + * src/roff/troff/div.cpp (cleanup_and_exit): Only delete + `the_output` object if it is not already being destroyed. + * src/roff/groff/tests/regression_savannah_59202.sh: Add test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + Thanks to "hackerb9" for reporting the problem. Problem appears + to date back to groff 1.02 (June 1991) or earlier. + + Fixes . + +2020-09-28 G. Branden Robinson + + * tmac/an-old.tmac (register setup): Condition decisions on + \n[an-html] rather than a string comparison using \*[.T]; that + is what the register is there for. + +2020-09-28 G. Branden Robinson + + * tmac/andoc.tmac: Save alias to .ne request. + (reload-doc): Restore .ne request, which an-old.tmac meddles + with if continuous rendering is used. (The meddling ultimately + dates back to 777e2d262862621966c18d685a000cc88f432bc6, 26 + January 2002, which simply redefined .ne as empty on nroff + devices.) + +2020-09-27 G. Branden Robinson + + Ship tests in distribution archive. + + * src/preproc/preconv/preconv.am (EXTRA_DIST): + * src/roff/groff/groff.am (EXTRA_DIST): + * src/roff/nroff/nroff.am (EXTRA_DIST): + * tmac/tmac.am (EXTRA_DIST): Add + $({preconv,groff,nroff,tmac}_TESTS), as appropriate. + + * src/roff/nroff/nroff.am (MOSTLYCLEANFILES): Stop adding + $(nroff_TESTS), which can only have unhappy consequences. + +2020-09-27 G. Branden Robinson + + * tmac/tmac.am: Fix problem with recently-relocated mdoc macro + files not ending up in the right place in the distribution + archive. + (dist_tmac_DATA): Also include $(TMACUNSTRIPFILES). + (TMACMDOCSTRIPFILES): Rename from $(TMACMDOCFILES). Update + interpolation sites. + (TMACMDOCUNSTRIPFILES): New variable holds mdoc macro files in + the tmac/mdoc subdirectory. Stop adding these files to + $(TMACUNSTRIPFILES) since those reside in tmac/ directly. + (EXTRA_DIST): Add $(TMACMDOCUNSTRIPFILES). + ($(TMACSTRIPFILES)): Depend only on $(TMACUNSTRIPFILES). + ($(TMACMDOCSTRIPFILES)): Add new rule, much like the foregoing. + Depend on $(TMACMDOCUNSTRIPFILES) and copy files into tmac/mdoc. + (dist-hook, tmac-dist-hook): Remove; they no longer do any + distinct work. + + Fixes . + +2020-09-26 G. Branden Robinson + + * src/preproc/tbl/table.cpp (table::init_output): + (table::compute_expand_width): + (table::compute_separation_factor): Use consistent format for + diagnostic messages. + - Do not spread a single diagnostic across multiple lines. + - Report messages in GNU Coding Standards format, that is: + - Report the name of the file the problem is in... + - ...then the line number... + - ...then the diagnostic severity level... + - ...then the specific problem. + +2020-09-26 G. Branden Robinson + + * tmac/an-old.tmac: Emit warnings when configuration registers + are ignored when producing output for HTML. + +2020-09-25 G. Branden Robinson + + * tmac/an-old.tmac (an-p-footer): Define \*[an-page-string] if + (1) the output device is not HTML; (2) \n[X] has been defined; + and (3) the page number has not yet reached the threshold + defined by \n[X]. + + Fixes . + +2020-09-25 G. Branden Robinson + + Add regression test for Savannah #59179. + + * tmac/tests/an-old_X_register_works.sh: Do it. + * tmac/tmac.am (tmac_TESTS): Run it. + +2020-09-25 G. Branden Robinson + + * tmac/an-old.tmac: + * tmac/doc.tmac-u: Emit more informative fatal diagnostic when + installed version of groff is too old. Report the version found + and explicitly note consequent abort. + +2020-09-25 G. Branden Robinson + + * tmac/tmac.am: Regenerate stripped macro files upon changes to + any of their unstripped counterparts. This is crude, but they + weren't being regenerated at _all_. Defeating a central + function of Make is bad. + (TMACUNSTRIPFILES): New variable. Populate with -u files. + ($(TMACMDOCFILES) $(TMACSTRIPFILES)): Depend on + $(TMACUNSTRIPFILES). + +2020-09-25 G. Branden Robinson + + * tmac/an-old.tmac: + * tmac/andoc.tmac: + * tmac/doc.tmac-u: + * tmac/s.tmac: Clarify fatal diagnostics by informing the user + that the program is aborting. + +2020-09-25 G. Branden Robinson + + * tmac/www.tmac.in: Revise diagnostic message handling. + (www:fatal): New macro handles fatal macro usage errors. + (www:lenstr): Use www:fatal instead of writing to standard error + with .tm (rather than www:error) and then calling .ab without + arguments, which produces an unsightly "User Abort." message. + (www:lenstr): + (www:splitstr): + (www:url_breaks): + (www:url_breaks_split): + (LINKSTYLE): Report expected number of arguments in diagnostics. + (www:fontstyle): Shorten diagnostic message. + +2020-09-25 G. Branden Robinson + + * src/roff/troff/div.cpp + (top_level_diversion::clear_diversion_trap): Fix copy and paste + error in diagnostic, which wrongly reported that a top-level + diversion trap couldn't be "set" when "clear"ed was meant. + +2020-09-19 G. Branden Robinson + + * src/preproc/grn/main.cpp (conv): + * src/roff/troff/node.cpp (suppress_node::tprint): Remove + embedded newlines from diagnostic messages. + +2020-09-18 G. Branden Robinson + + * tmac/an-old.tmac: Move setup of remaining rendering option + parameters (registers C, D, P, and X) to end of file. + +2020-09-17 G. Branden Robinson + + * tmac/an-old.tmac (TH): Move setup of rendering parameter + registers IN and SN from here to the end of the file. Update + comments. + +2020-09-17 G. Branden Robinson + + * tmac/an-old.tmac: Drop \*[an-empty] string. This string is + documented as preventing "looping" (presumably infinitely) if + someone calls a two-font macro with an inconvenient parameter; + the example shown is ".RB ( \\ )". This string was being + interpolated at the end of each argument pair to the two-font + macros BI, BR, IB, RB, and RI. This code dates back to groff + 1.10 (dc5351364982f78f8c630f1e856d692d4a82666f, 26 November + 1995). Did you notice a two-font macro missing? It was: IR. + Using it with the proscribed input fails to cause a problem; the + others similarly operate just fine when the empty string + interpolation is removed. Presumably at some point in the past + 25 years, this workaround became unnecessary. + (BI, BR, IB, RB, RI): Remove interpolations of string. + + * tmac/tests/an-old_avoid_two-font_denial_of_service.sh: Add + regression test. + * tmac/tmac.am (tmac_TESTS): Run test. + +2020-09-16 G. Branden Robinson + + * tmac/an-old.tmac: Refactor continuous rendering handling. + Relocate set up of \n[cR] to end of file in parallel with other + rendering parameter management. Instead of conditionally + defining the an-ne and an-bp macros, define them + unconditionally. Also define them with .de instead of .de1, + since they will only be called within the contexts of macros + that are already running with compatibility mode off (i.e., the + public interface macros). Relocate definition of an-end to sit + alongside these other continuous-rendering-mode specific macros + and avoid a forward reference and scattering of \n[cR] + conditionals around the file. + (an-set-up-continuous-rendering): Define new macro to move + macros (and end macro) into place. Call it at the end of the + file only if cR eventually winds up being true. + +2020-09-16 G. Branden Robinson + + * tmac/an-old.tmac: Improve name space management. Rename .ne + request to .an-ne instead of outright clobbering it (and in + parallel with .an-bp). Rename 'an-ne' register to 'an-need' to + prevent confusion with renamed request. + +2020-09-16 G. Branden Robinson + + * tmac/an-old.tmac: Drop .ll hack for LL register. + + Drop the .ll hack for setting the line length on nroff devices. + + Once upon a time, the only way to get man pages to render on a + terminal at any width other than the nroff default of 65n was to + put an .ll request into the page--a mortal sin against + portability--or your man(1) program could sneak such a request + into nroff's input stream. + + Also, long ago, John Eaton of UT Austin wrote a man(1) program. + In a few years this implementation branched into two lines of + development, which I'll call man-db man (Wilford/Polacco/Watson) + and another, Brouwer/Lucifredi man, which as of this writing saw + its last release in 2011 (1.6g). + + The man and mdoc macros of groff 1.18 (July 2002) introduced an + LL register to configure the line length, respecting an -rLL + command-line option. The source change was made by Werner + Lemberg on 3 May 2002 and Colin Watson updated man-db man(1)--on + the same day!--to synthesize the option when calling groff. + + Later, in August 2005, Keith Marshall, a user of version 1.5m of + Brouwer/Lucifredi man(1), which did not set the LL register, + suggested that the existing .ll setting (technically, the value + of \n[.l], the only way the result of an .ll request could be + introspected) be honored in the absence of the LL register. + However, it is impossible to distinguish a user-supplied ".ll + 65n" request from nroff's default setting, which was in that + case overridden to the modern default of 78n. + + And so, in what is now git commit + f9d5df4aebd3d834b4084ffefa52a115e00dce38 (1 September 2005), it + was done. + + This led to (1) surprising behavior for users accustomed to old + methods and desirous of the nroff default and (2) lengthy + apologia in groff source code comments and the groff_man(7) man + page. + + Ironically, Brouwer/Lucifredi man(1) had already added support + for the LL register by the time of its 1.6 release two months + earlier (20 June 2005). (Curiously, it did so similarly to the + old .ll hack, by injecting an '.nr LL' request into groff's + input stream, rather than using the -r command-line option.) + Moreover, Marshall and the groff list were already aware of + this, but the change was accepted anyway because version 1.6 + was "too new"! (Distributions are slow sometimes, true...) + + Let us survey the field in 2020. man-db man(1) has supported + the LL register for eighteen years, and Brouwer/Lucifredi man(1) + for fifteen. Heirloom Doctools's man macros set the line length + to 78n on nroff devices unconditionally. mandoc(1) similarly + also always formats for 78 columns on terminals. groff's + mdoc(7) macros grew support for LL in parallel with man(7) in + 2002 and never added the \n[.l] introspection at all. + + There no longer seems to be any reason to preserve this hack. + + * tmac/an-old.tmac (initialization): Drop complex setup of LL + register. + (TH): Relocate line length reset; no behavior change. + (after .mso man.local): Initialize LL only if the user hasn't; + use device default in troff mode, and 78n in nroff mode. + + * tmac/groff_man.7.man.in (Options) <-rLL>: Stop documenting .ll + hack. + + Fixes . + +2020-09-16 G. Branden Robinson + + * tmac/tests/an-old_LL_init_sanely.sh: Add test. + * tmac/tmac.am (tmac_TESTS): Run test. + +2020-09-15 G. Branden Robinson + + * src/devices/xditview/GXditview.ad: Widen the default geometry + to accommodate the width of a page rendered using the X100-12 + device. Display devices these days have much greater horizontal + resolution than they did 20 years ago. + +2020-09-14 G. Branden Robinson + + * tmac/an-old.tmac: Use correct point size default for + X{75,100}-12 devices. + +2020-09-14 G. Branden Robinson + + * tmac/mdoc/doc-common-u (doc-prepare-section-heading): New + macro defines new string doc-sec-head to enable recognition of + mixed-case section headings in mdoc man pages. For example, + "Name" and "Description" are now recognized in addition to + "NAME" and "DESCRIPTION". + (doc-section-{name,synopsis,library,description,see-also,files, + authors}): Redefine strings to be mixed-case. Add trailing + comment guard per recommended best practice. + (Sh): Call doc-prepare-section-heading instead of + doc-first-parameter, and compare predefined section strings to + doc-sec-head instead of doc-str-dfp. + + * tmac/tests/doc-accept-mixed-case-section-headings.sh: Test it. + * tmac/tmac.am (tmac_TESTS): Run test. + * tmac/tests/doc-smoke-test.sh: Use mixed-case section headings. + +2020-09-03 G. Branden Robinson + + * makevarescape.sed: Use \[] form of special character escapes. + + The only man page we have that doesn't turn compatibility mode + off (neqn) also doesn't use any sed-substituted patterns where + characters replaced by a \[] special character escape form are + likely to be used. + + The @g@ command prefix is the main avenue for intrusion of such + escapes, but I think it improbable that many people are going to + include apostrophes, double quotes, carets, grave accents, or + tildes in the command prefix; some or all of these will pick + fights with the shell and require quoting that we don't + represent in man page text anyway. + + On top of that, neqn is largely a stub page. + + If it's a problem, a better fix than reverting this is to make + neqn switch out of compatibility mode like our other man pages. + +2020-09-03 G. Branden Robinson + + * FOR-RELEASE: Start a release checklist. We probably should + have done the afmtodit.tables update for 1.22.4. There were no + AGL changes and the Unicode decomposition changes were limited + to additions for Balinese (11), CJK compatibility ideographs + (5), and 13 code points outside the Basic Multilingual Plane. + +2020-09-02 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.tables: Regenerate using Unicode + 13.0.0. + +2020-09-02 G. Branden Robinson + + make-afmtodit-tables: Automate AGL reassignments. + + Automate the procedure done manually in + b72b91e85e80a69304e6569db535bcca0e0ecab5 (9 April 2007), so that + it doesn't regress when we regenerate afmtodit.tables. + + * src/utils/afmtodit/make-afmtodit-tables: Do it. + * src/utils/afmtodit/afmtodit.tables: Regenerate it. + +2020-09-02 G. Branden Robinson + + * src/roff/groff/groff.1.man (Options) <-E>: + * src/roff/troff/troff.1.man (Options) <-E>: Document that -E + implies -Ww. + + Fixes . + +2020-09-01 G. Branden Robinson + + * man/groff_char.7.man: Revise glyph descriptions. + + Fixes . + +2020-09-01 G. Branden Robinson + + * tmac/tty.tmac: Define fallback glyphs for Bell System logo + {non-breaking adjustable space} and radical extension and square + root extension (both dummy characters '\&') to suppress warnings + from groff_char(7). As none of these are encoded in Unicode it + seems unlikely they will become supported soon. + +2020-08-30 G. Branden Robinson + + * src/roff/troff/troff.1.man (Options) <-I>: The current working + directory is searched _last_, not first, unless the order is + altered with "-I .". + + * src/roff/groff/groff.1.man (Options) <-I>: Rearrange + description. + +2020-08-25 G. Branden Robinson + + Update mdoc package to honor HY register as man does now, per + suggestion from Colin Watson. Recognize but ignore AD string + for man package compatibility (essentially "reserving" it), + though mdoc intentionally does not permit configuration of + adjustment. + + * tmac/mdoc/doc-ditroff-u: + * tmac/mdoc/doc-nroff-u: Do it. + + * tmac/mdoc/doc-common-u: Initialize \n[doc-hyphen-flags] from + \n[HY]. + + * tmac/groff_mdoc.7.man \ + (FORMATTING WITH GROFF, TROFF, AND NROFF): Document it. + +2020-08-25 G. Branden Robinson + + * tmac/an-old.tmac (TH): Reset inter-word and inter-sentence + spacing to default with each new page rendered. + + {To observe the problem prior to this change, + $ groff -mandoc groff_mmse.7 $any_other_man_page + groff_mmse(7) loads sv.tmac, which changes the sentence + spacing.} + +2020-08-25 G. Branden Robinson + + * PROBLEMS: Undocument the problem with test-groff and mdoc. + It's resolved. + + Fixes . + +2020-08-25 G. Branden Robinson + + * tmac/tmac.am (NORMALFILES, MDOCFILES): Drop unused variables. + ($(TMACMDOCFILES) $(TMACSTRIPFILES)): Scrub trailing whitespace. + Wrap long line. + +2020-08-25 G. Branden Robinson + + mdoc: Relocate within build tree. + + The (modern) mdoc macro package has not been usable within the + build tree, unlike the others. This makes it more troublesome + to test changes, and frustrates deploying our test + infrastructure against it. Re-arrange the build tree to + resemble an installation tree closely enough for the macro + package to load. + + * tmac/doc-common-u: + * tmac/doc-ditroff-u: + * tmac/doc-nroff-u: + * tmac/doc-syms-u: Rename to... + * tmac/mdoc/doc-common-u: + * tmac/mdoc/doc-ditroff-u: + * tmac/mdoc/doc-nroff-u: + * tmac/mdoc/doc-syms-u: ...these. + + * tmac/tmac.am (TMACMDOCFILES): Look for files in tmac/mdoc. + ($(TMACMDOCFILES)): Create tmac/mdoc in build tree. + + Fixes . + +2020-08-25 G. Branden Robinson + + Add regression test for usable in-tree mdoc. + + * tmac/tests/doc-smoke-test.sh: Add test. + * tmac/tmac.am (tmac_TESTS): Run test. + +2020-08-22 G. Branden Robinson + + * tmac/tests/an-old_TH_repairs_ad_damage.sh: + * tmac/tests/an-old_TH_repairs_hy_damage.sh: Add tests. + * tmac/tmac.am (tmac_TESTS): Run tests. + +2020-08-22 G. Branden Robinson + + * tmac/an-old.tmac (TH): Set hyphenation mode to user preference + with each new page rendered, in case a hostile page meddled with + '.hy' or '.nh'. + (after .mso man.local): Relocate setting of default hyphenation + mode here (instead of just before .mso man.local). Eliminate + conditional on \n[an-html]; this doesn't matter because + grohtml(1) doesn't support hyphenation anyway. If it does learn + to hyphenate, we should treat it the same as other output + devices in any case. Add comment explaining why we fall back to + different defaults depending on \n[cR]. + +2020-08-22 G. Branden Robinson + + * tmac/an-old.tmac (TH): Set adjustment to user preference with + each new page rendered, in case a hostile page meddled with + '.ad' or '.na'. + (after .mso man.local): Set the default adjustment mode only if + a -d option or man.local did not. Also do the same for the HF + string; relocate its definition here and make it similarly + conditional. Also update comment on setting of CS and CT + registers and style their conditionals consistently with the + rest of the package. + + * tmac/groff_man.7.man.in (Strings) <\*(AD>: Document it. + (Strings) <\*(HF>: Parallelize language with new \*(AD. + (Options) Expand introductory sentence to discuss -d and -r + options. + (Options) <-dAD>: Document default and likely values. Nobody + right-justifies or centers man page text; send the curious to + groff(7) for '.ad' request documentation. + (Options) <-dHF>: Document default and steer people to groff(7) + for '.ft' request documentation. + +2020-08-21 G. Branden Robinson + + * tmac/an-old.tmac (set-an-margin): Rename... + (an-set-margin): ...to this. It was the only package-internal + register, macro, string, or diversion that wasn't named using + the "an-*" schema. + (TH, SH, SS): Update call sites. + +2020-08-16 G. Branden Robinson + + * tmac/an-ext.tmac (.ME, .UE): Restore hyphenation after + "punctuation" arguments have been output. The next token will + always be a space node, the end of the document, or similar. + + * tmac/tmac.am (tmac_XFAIL_TESTS): Mark the punctuation + hyphenation tests as expected to fail, because they now do. + +2020-08-16 G. Branden Robinson + + * tmac/ps.tmac: Define ordinary hyphen-minus as fallback + character for U+2011 (non-breaking hyphen). Prompted by + discussion with Dave Kemper in Savannah #58390. + +2020-08-15 G. Branden Robinson + + Fix hyphenation bug. The UR/UE and MT/ME macros were much too + aggressive about turning hyphenation off. Disable it only when + writing the actual URL or email address. + + * tmac/an-ext.tmac (.MT, .UR): Stop disabling hyphenation here. + (.ME, .UE): Disable hyphenation right before output of + URL/address; restore it right before output of supplementary + arguments ("punctuation"). + + * tmac/tests/an-ext_ME_punct_hyphenates.sh: + * tmac/tests/an-ext_MT_body_hyphenates.sh: + * tmac/tests/an-ext_UE_punct_hyphenates.sh: + * tmac/tests/an-ext_UR_body_hyphenates.sh: Test behavior. + + * tmac/tmac.am (tmac_TESTS): Run tests. + +2020-08-15 G. Branden Robinson + + Adapt to the fact that \: reënables hyphenation. Rename + "hyphenless [discretionary] break" to "non-printing break point" + in documentation. + + * doc/groff.texi (Manipulating Hyphenation): Rename "hyphenless + break" to "non-printing break point". Clarify that it is the + soft hyphen glyph, not necessarily a hyphen, that is ordinarily + written to the output on hyphenation breaks. Note that the + remainder of a word after \: is subject to hyphenation as + normal. Note (new) '\:\%' idiom for getting what people will + want at least some of the time. Update example to use it. + * makevarescape.sed: Insert \% after we insert \: to rewrite + slashes in filenames, to protect later portions of the filename + from hyphenation. + * man/groff.7.man (Escape Sequences/Escape short reference): + Rename "hyphenless break" to "non-printing break point". + * man/groff_diff.7.man (Language/Escape sequences): Resync with + our Texinfo manual. + * tmac/groff_man.7.man.in (Description/Hyperlink and email + macros): Rename "hyphenless break" to "non-printing break + point". + +2020-08-15 G. Branden Robinson + + documentation: Re-christen 'ESCAPE_AMPERSAND'. + + s/zero[- ]width space character/non-printing input break/ + + * doc/groff.texi (Requests): Rename. Update conceptual index + entries; retain old name (with an appended "[sic]") to aid + readers accustomed to it. + (Ligatures and kerning): Update conceptual index entries. + Supply context ("effect on kerning"). + (Drawing requests): Update conceptual index entries. Supply + context ("effect on '\l'"). + * man/groff.7.man (Description): Rename in macro-advice-writing + shorthand. + (Escape Sequences/Escape short reference): Rename. + * tmac/groff_man.7.man.in (Description/Command synopsis macros + [style]: Rename. + (Description/Portability) [style]: Rename. + * tmac/groff_mdoc.7.man (TROFF IDIOSYNCRASIES/Macro Usage): + Rename. + (TROFF IDIOSYNCRASIES/Other Possible Pitfalls): Rename. + +2020-08-14 G. Branden Robinson + + * tmac/groff_man.7.man.in (Description/{Document structure + macros <.TH>, Horizontal and vertical spacing}): Fix erroneous + use of "flush left". The current uses were introduced by me, + but the page has borne incorrect uses of it as far back as 1999 + {in the description of .TP}. Simply say "with no indentation" + instead. + +2020-08-13 G. Branden Robinson + + * tmac/groff_man.7.man.in (Description/Number registers): Inform + reader that registers can be set in man.local file and + cross-reference it. + (Files/*/man.local): [style] Supply example of man.local + customizations, prompted by recent discussions on groff, + linux-man, and man-db mailing lists. + +2020-08-12 G. Branden Robinson + + * tmac/tmac.am: Use a stamp file for m4 keyword check. + (M4CHECK): Add stamp file variable. + ($(M4CHECK)): Create stamp file if check succeeds. + +2020-08-12 G. Branden Robinson + + Split groff_man(7) into two pages; one a (relatively) terse + reference and the other a tutorial and style guide. Both are + generated from the same source, which is processed by m4 into + two man page sources. + + * tmac/groff_man.7.man: Rename... + * tmac/groff_man.7.man.in: ...to this. + + * tmac/groff_man.7.man.in: Add m4 directives and define macros. + Protect m4 keywords in English from unintended expansion (this + affected the word "include"). Add new .TH and apropos lines for + style guide. Convert marker comments into m4 macros for content + control. Uncomment material intended only for basic reference + page. + + * tmac/tmac.am (man7_MANS): Add groff_man_style.7. + (EXTRADIST) Add groff_man.7.man.in. + (MOSTLYCLEANFILES): Add m4-generated man page sources + tmac/groff_man{,_style}.7.man. + Add targets to generate those same two pages from the renamed + file. Add target to grep the page for unprotected English m4 + keywords and halt the build if they are found. Make generation + of those pages depend on this new target. + +2020-08-11 G. Branden Robinson + + * tmac/groff_man.7.man: Add material on hooks and encoding. + (Description, ./Deprecated features): Stop identifying .PT and + .BT as "deprecated"; they shouldn't ever be called in man pages, + but that has never been their intention. + (Description): Identify character encoding and line-ending + requirements (tutorial/style-guide material). + (Description/Hooks): Add new subsection to house descriptions of + .PT and .BT. Add mnemonic expansions for both. + +2020-07-31 G. Branden Robinson + + * man/groff.7.man (Control Characters): Incorrect claims were + made. Double quotes can indeed be used to enclose arguments to + string interpolations. The statement about a leading " in a + string definition (or appendment with .as) was stated too + generally. The leading quote is not necessary to include + leading tab characters, which can be input as-is, even in + compatibility mode. + +2020-07-28 G. Branden Robinson + + * man/groff.7.man (Requests/Request short reference/.ft): Fix + some outright damage in the description of the request; the + escape sequences that are synonymous with a nullary .ft had been + wrongly removed. + +2020-07-25 G. Branden Robinson + + * doc/meintro.me: + * doc/meref.me: + * tmac/e.tmac-u: Remove postal address for Eric Allman. It's + probably decades out of date. Adjust footnote symbols. Thanks + to Dave Kemper for the bug report and the patch. Fixes + . + +2020-07-23 G. Branden Robinson + + Migrate macro packages from font CW to CR. The font name "CW" + {"constant-width"} is a legacy item we can dispose of (except + for the DVI device, which also has CWI for "constant-width + italic"), and much of the groff codebase already did starting + with commit 0de1d6d79cdb959ffa7dac3af77c2a36ef31873f {October + 2017}. Courier is available in the usual four styles {roman, + bold, italic, bold+italic}. + + * tmac/an-ext.tmac (.EX): Set font to R, not CW. The existing + .ft request was somewhat redundant with the '.do fam C' + immediately before, which set the font family to Courier. + * tmac/s.tmac (.UC): Use font CR, not CW. + +2020-07-23 G. Branden Robinson + + * tmac/tty.tmac: Stop suppressing nonexistent font warning. + Prompted by a 2017 suggestion and patch from Bjarni Ingi + Gislason. Documents and macro packages that want to change the + font family should do so in awareness that this is meaningless + on terminal (nroff) devices (and -Thtml as well). + + Fixes . + +2020-07-18 G. Branden Robinson + + * tmac/groff_man.7.man (.PP, .LP, .P): Fix error: these macros + do not reset the left margin. + +2020-07-16 G. Branden Robinson + + * doc/groff.texi (Strings): Document behavior of .ds request + when only one argument is supplied. (The string is defined as + empty.) Thanks to Dave Kemper for the report and the patch. + + Fixes . + +2020-07-16 G. Branden Robinson + + * doc/groff.texi (Using Symbols): Fix error in .rfschar + description, which should refer to "font f" rather than "glyph + f". Thanks to Dave Kemper for the report and the patch. + + Fixes . + +2020-07-12 G. Branden Robinson + + * tmac/groff_man.7.man (.EE, .YS): Fix error: refer to "initial + hyphenation setting" instead of "previous hyphenation mode". + Incidentally, this fact points out why putting ".hy 0" or ".nh" + in your man page is futile. + +2020-06-28 G. Branden Robinson + + * man/groff.7.man (Requests/Request short reference): Fix error + in description of .hc; it changes the hyphenation character + rather than supplying an additional one. + +2020-06-12 G. Branden Robinson + + * doc/groff.texi (Groff Options): Remove editorial comment about + '-a' option being "useless". It isn't. Update example for + contemporary systems (like Debian) and to reflect the fact that + the GNU troff(1) man page needs to be preprocessed with tbl(1). + (Invoking grotty): Recast discussion of -c option, importing + much language from grotty(1) page rewrite from a year ago. Add + program index entries for col, more, and ul. Fix transposition + error in ISO document number. + + * src/devices/grotty/grotty.1.man (Description/Legacy output + format): Make slight wording changes prompted by content of + parallel section in our Texinfo manual. + + * src/roff/groff/groff.1.man (Options/-a): Parallelize with + first sentence of corresponding material in our Texinfo + manual. + + * src/roff/troff/troff.1.man (Options/-a): Parallelize with + our Texinfo manual. + + Fixes the rest of + . + +2020-06-12 G. Branden Robinson + + * man/groff_diff.7.man (Language/Long names): Fix error: groff + adds three new requests with short names, not two. List them in + an adjacent comment. + +2020-06-04 G. Branden Robinson + + * tmac/an-ext.tmac (.ME, .UE): Fix portability issue. While + widely supported, the \$* escape is not documented in CSTR #54. + If groff is not the typesetter, append macro arguments using + \$1, \$2, ..., \$9 instead. + +2020-05-19 G. Branden Robinson + + * man/groff.7.man (Numerical Expressions): Fix error: negative + expressions evaluate false, not true as was implied. + Parallelize descriptions with our Texinfo manual and + groff_diff(7) (in abbreviated form). + +2020-05-18 G. Branden Robinson + + * doc/groff.texi (Manipulating Filling and Adjusting): Fix error + in code sample: missing 'n' in number register interpolation. + +2020-05-14 G. Branden Robinson + + * src/preproc/preconv/tests/smoke-test.sh: Make BOM detection + override less hinky (i.e., use more normative input). Add tests + for all five detected BOMs. + +2020-05-09 G. Branden Robinson + + * src/roff/troff/env.cpp (space_size): Prevent assertion + failure. If an argument to the .ss request is negative, throw a + range warning and ignore it. + * src/roff/groff/tests/regression_savannah_58337.sh: Add test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + Fixes https://savannah.gnu.org/bugs/?58337. + +2020-05-08 G. Branden Robinson + + Update documentation of .ss request. + + * doc/groff.texi (Manipulating Filling and Adjusting): Rewrite + documentation of .ss request and \n[.ss] and \n[.sss] escapes. + Note that negative values are not permitted in either argument + to .ss. Use new terminology, "minimal inter-word spacing" and + "additional inter-sentence spacing" for clarity. Clarify that + additional inter-sentence spacing is only used when the output + line is not full when the end of a sentence occurs. Add index + nodes to help readers find discussion of details of spacing + between words and sentences. Move discussion of differences + from AT&T troff to section "Implementation Differences". Update + example to more closely resemble a real-world case, use second + argument to .ss request, and eliminate hackish use of .nop + request. + + * man/groff_diff.7.man (New number registers): Recast in + parallel with the foregoing. + + * man/groff.7.man (Read-only registers): Use new terminology and + describe \n[.ss] and \n[.sss] in meaningful terms, not by + reference to arguments to the .ss request (which wasn't even + accurate, because these registers have default values). + + Fixes https://savannah.gnu.org/bugs/?54101. + +2020-05-06 G. Branden Robinson + + Undocument plans to support end-of-file GNU Emacs coding tags. + + * src/preproc/preconv/preconv.cpp (check_coding_tag): Update + comments. + (detect_file_encoding): Alter debugging output so it's easier to + grep and verify Emacs coding tag detection. + + * src/preproc/preconv/preconv.1.man (Bugs): Delete; its sole + concern was the absence of this feature. + (Usage): Document detection algorithm in more detail. Note + which detection methods don't work on unseekable input (pipes). + Offer recommendations for those struggling with encoding + detection. + (Usage/Coding Tags): Stop manipulating line adjustment. Use + hyphen-minus (\- escape) characters in coding tag names, since + they are literals that one might copy and paste. Stop + referencing XEmacs, whose development appears moribund. + (See Also): Add cross-references to iconv(3) and locale(7) man + pages. + + * src/preproc/preconv/tests/smoke-test.sh: Test each of the + steps in the detection algorithm. + * src/preproc/preconv/preconv.am: Run test. + (preconv_TESTS): Add new variable. + (TESTS): Append $(preconv_TESTS). + +2020-05-05 G. Branden Robinson + + * src/utils/afmtodit/afmtodit.pl: Format usage message with + full capitals for parameters, and break out -v option in a + separate "synopsis". + +2020-05-05 G. Branden Robinson + + * font/devpdf/util/BuildFoundries.pl: Stop throwing away + diagnostics from afmtodit. This results in only one extra line + of build output: + + both Upsilon1 and Upsilon map to *U at .../afmtodit line + 6413. + +2020-05-05 G. Branden Robinson + + Correct documentation of .pm request. + + * man/groff.7.man (Requests/Request short reference): The .pm + request's classical behavior was described instead of groff's, + and omitted mention of strings and diversions; correct it. + + * man/groff_diff.7.man (Implementation Differences): Document + this difference between AT&T troff and groff. + + * doc/groff.texi (Debugging): Relocate description of .pm + behavioral difference... + (Implementation Differences): ...hither. + +2020-04-30 G. Branden Robinson + + * src/utils/addftinfo/addftinfo.cpp (usage): + * src/utils/tfmtodit/tfmtodit.cpp (usage): Add "usage:" prefix + to messages documenting auxiliary modes of invoking the program. + The output doesn't look right without one, and it feels + dishonest to not document the relevant options (-v, --version) + disjunctively. I'm trying to strike a balance between the + ultra-terse BSD approach and the ultra-garrulous GNU one (see, + e.g., ls(1)). Likely both camps will be unhappy. :-/ + +2020-04-30 G. Branden Robinson + + * src/utils/tfmtodit/tfmtodit.cpp (read_map): Report invalid + character code from map file in diagnostic. + (main): Report invalid skew character position in diagnostic. + Explicitly report insufficient arguments in addition to usage + message. Lift invariant computed expressions out of loops (more + to shorten long lines than because I think the compiler won't + figure it out). Give content to "impossible assertion". + (tfm::load): Capitalize TFM initialism in diagnostics. + (usage): Use full capitals for parameters as is conventional. + Document disjunction of -v/--version flag from other + invocations. + +2020-04-29 G. Branden Robinson + + * src/utils/addftinfo/addftinfo.cpp (usage): Add overloaded + version that accepts a constant string argument, which emits the + argument as a diagnostic and then calls usage(). + (main): Add diagnostics to usage message where the problem is + clear. Add comment explaining why it sometimes isn't. + (usage): Refactor main usage message (which prints the summary) + to report the actual names of the accepted option arguments + instead of just "-param", which is not literally accepted. + + Sort param_table alphabetically for use by the usage message. + +2020-04-22 G. Branden Robinson + + Delete groffer. + + Per discussion on the groff development mailing list, there is + no desire to retain the maintenance of this portion of the groff + distribution. + + See + + et seq. + + * contrib/groffer: Recursively delete. + + * Makefile.am: + * arch/mingw/mingw.am: Stop building groffer. + + * m4/groff.m4 (GROFF_GROFFERDIR_DEFAULT): + (GROFF_GROFFERDIR_OPTION): Delete; remove "--with-grofferdir" + configuration option. + * configure.ac: Stop calling these macros. + + * MANIFEST: + * NEWS: + * PROJECTS: + * TODO: + * contrib/chem/chem.1.man: + * contrib/chem/examples/122/README.txt: + * contrib/chem/examples/README.txt: + * contrib/glilypond/glilypond.1.man: + * contrib/gperl/gperl.1.man: + * contrib/gpinyin/gpinyin.1.man: + * contrib/groff_filenames/groff_filenames.5.man: + * man/groff_font.5.man: + * man/roff.7.man: + * src/roff/groff/groff.1.man: + * src/roff/grog/grog.1.man: + * src/utils/addftinfo/addftinfo.1.man: + * tmac/groff_trace.7.man: Delete references to groffer. + +2020-04-19 G. Branden Robinson + + * src/include/curtime.h: #include if we're returning + a time_t from current_time(). + + * src/libs/libgroff/curtime.cpp (current_time): Quote + $SOURCE_DATE_EPOCH variable content in diagnostics produced due + to bad input since it's under user control and could have all + kinds of bogosity in it (like whitespace). + +2020-04-19 G. Branden Robinson + + * **/*.{man,tmac}: Save compatibility mode robustly. + + Use new \n[.cp] register to save compatibility mode. + + Use register names based on the filename (at the source + maintenance level) to avoid clobbering other files' saved + compatibility modes. + + * tmac/html.tmac: Eliminate test of saved-compatibility + register by moving its body inside the block where compatibility + mode is off. This is the only part of this changeset that was + not automated. + + Fixes . + +2020-04-16 G. Branden Robinson + + Implement new read-only .cp register. + + Within a .do request, \n[.cp] holds the saved value of + compatibility mode. + + The register \n[.cp] is specialized and may require a statement + of rationale. When writing macro packages or documents that use + groff features and which may be mixed with other packages or + documents that do not—common scenarios include serial processing + of man pages or use of the .so or .mso requests—you may desire + correct operation regardless of compatibility mode in the + surrounding context. It may occur to you to save the existing + value of \n(.C into a register, say, _C, at the beginning of + your file, turn compatibility mode off with “.cp 0”, then + restore it from that register at the end with “.cp \n(_C”. At + the same time, a modular design of a document or macro package + may lead you to multiple layers of inclusion. You cannot use + the same register name everywhere or you risk “clobbering” the + value from a preceding or enclosing context. The two‐character + register namespace of AT&T troff is confining and mnemonically + challenging; you may wish to use groff's more capacious + namespace. However, attempting “.nr _my_saved_C \n(.C” will not + work in compatibility mode; the register name is too long. + “This is exactly what .do is for,” you think, “.do nr + _my_saved_C \n(.C”. The foregoing will always save zero to your + register, because .do turns compatibility mode off while it + interprets its argument list. What you need is: + .do nr _my_saved_C \n[.cp] + .cp 0 + at the beginning of your file, followed by + .cp \n[_my_saved_C] + at the end. As in the C language, we all have to share one big + namespace, so choose a register name that is unlikely to collide + with other uses. + + * src/roff/troff/input.cpp (do_request, init_input_requests): + Implement it. + + * doc/groff.texi: + * man/groff.7.man: + * man/groff_diff.7.man: Document it. + + * src/roff/groff/tests/dot-cp_register_works.sh: Test it. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + Enables a fix for + . + + Thanks to John Gardner and Ingo Schwarze for the discussion. + +2020-04-15 G. Branden Robinson + + * doc/groff.texi (Implementation Differences): + * man/groff_diff.7.man (New requests): Rewrite description of + .do request, and replace example with a more illustrative one. + + * man/groff.7.man (Request short reference): Rewrite description + of .do request briefly. + +2020-04-14 G. Branden Robinson + + * doc/groff.texi (Implementation Differences): Remove incorrect + claim. The .C register cannot be manipulated manually. + +2020-04-14 G. Branden Robinson + + * src/roff/groff/tests/smoke-test_html_device.sh: Simplify + charmap test. + +2020-04-13 G. Branden Robinson + + It's too easy for the nroff version to get desynced from the + groff version when we're running test cases, leading to spurious + results. Make it easier to see a discrepancy. + + * src/roff/nroff/nroff.sh: Call groff with -v or --version when + we are called that way. Let test cases tell us to use + test-groff as groff with an environment variable. + + * src/roff/nroff/tests/verbose_option_works.sh.in: Rename to... + * src/roff/nroff/tests/verbose_option_works.sh: ...this. Check + the nroff version being tested against the groff version being + wrapped. This exposes a bug; the system groff rather than the + build tree groff was being invoked. Refactor. Stop messing + with @GROFF_BIN_PATH_SETUP@ (enabling the rename); instead, let + test-groff handle that for us. Locate it and export the + variable GROFF_TEST_GROFF so nroff can find it. Because we + manipulate $PATH to run the tests, the $PATH of an installed + groff system will _always_ differ from that used by a build + tree; ignore it in the test cases. Dispose of bashisms and set + shebang to /bin/sh. + + * src/roff/nroff/nroff.am: Stop generating the above test + script. It can now be run as it ships. + +2020-04-13 G. Branden Robinson + + Make our assert() C99-conformant. + + groff has its own implementation of the standard C library's + assert() macro. It hasn't been updated since C89. C99 requires + that the diagnostic emitted by assert() contain the failing + expression and name of the function in scope. + + * src/include/assert.h: Add additional pointer to const char + arguments to do_assert() and assertion_failed() for function + name and stringified expression. + (assertion_failed): Update prototype. + (do_assert): Accept 'func' and 'msg' parameters and pass them to + assertion_failed(). + (assert): Update macro to collect '__func__' and stringify the + expr parameter (as 'msg') and pass them do do_assert(). + * src/libs/libgroff/assert.cpp (assertion_failed): Rewrite + diagnostic to more closely match GNU Coding Style format and + also report function and failing expression. + + Example output: + troff: ../src/roff/troff/input.cpp:2644: do_request(): + assertion failed: '0 == "But first, here's a rotten old + BBC programme."' + + We have no excuse to assert(0) ever again. Express the + invariant that has been violated. + +2020-04-13 G. Branden Robinson + + * src/roff/groff/tests/smoke-test_html_device.sh: Set + LC_CTYPE=C.UTF-8 so that byte sequences in the pipelines are + handled correctly. Skip the test if the environment doesn't + support UTF-8. Thanks to Bjarni Ingi Gislason for the trouble + report. + + Fixes . + +2020-04-13 G. Branden Robinson + + * tmac/html.tmac: Use .do so we correctly load unicode.tmac in + compatibility mode. + + Fixes the following problem (wrapped, filenames abbreviated): + + $ echo | ./build/test-groff -C -Thtml >/dev/null + troff: backtrace: file '.../groff/build/../tmac/html.tmac':546 + troff: backtrace: file '.../groff/build/../tmac/troffrc':30 + troff: .../groff/build/../tmac/html.tmac:546: warning: macro + 'ms' not defined + +2020-04-13 G. Branden Robinson + + * src/roff/groff/tests/smoke-test_html_device.sh: Add test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2020-04-12 G. Branden Robinson + + * src/roff/groff/tests/regression_savannah_58153.sh: + * src/roff/groff/tests/\ + use_point_size_escape_with_single_digit_arg.sh: Use "set -e" to + ensure that multi-test script files don't hide problems. There + are arguments against "set -e" (and you can ask Greg Wooledge + for all of them), but I'm so used to it from years of writing + Debian package maintainer scripts that I feel comfortable with + it. It is less verbose than several alternatives (especially + having one test script per case). + + * src/roff/groff/tests/string_case_xform_unicode_escape.sh: + Update with respect to new failure output (in a comment only, + since this is an XFAIL test). + + * tmac/tests/an-old_AT_and_UC_footer_saved_and_restored.sh: + Drop unnecessary "|| exit 1" from end of script. Incidentally, + this script illustrates an alternative to "set -e". + +2020-04-11 G. Branden Robinson + + Rework documentation of .spreadwarn. + + * doc/groff.texi (Debugging): + * man/groff.7.man (Request short reference): + * man/groff_diff.7.man (New requests): Recast description of + .spreadwarn request, some based on suggestions from Dave Kemper. + Make more prominent the fact that spreading only applies to + adjustment mode 'b'. Document warning type used. + + Fixes half of Savannah #58035. + +2020-04-11 G. Branden Robinson + + Require Texinfo 5.0 (February 2013) at a minimum. + + * m4/groff.m4 (GROFF_MAKEINFO): Check for version 5.0 (increased + from 4.8). Update diagnostics and comments. + + * INSTALL.extra: + * README: + * doc/groff.texi: + * doc/webpage.ms: Document updated requirement. + + * doc/fixinfo.sh: Delete; it is no longer necessary to work + around Texinfo 4.x bugs. + + * doc/doc.am (EXTRA_DIST): Stop shipping fixinfo.sh. + (.texi.html): Remove makeinfo < 5.0 version check and consequent + execution of fixinfo.sh. Update comment. + +2020-04-11 G. Branden Robinson + + Enable backtracing across process/file boundaries when errors or + non-ignored warnings are encountered. + + Experimentation reveals that .so, .mso, and .pso requests acted + as barriers to backtracing except when explicitly requested with + the .backtrace request. Judging by the git history, this + behavior dates back to June 1991 or earlier. The intention, + according to a source comment, was only to suppress the + backtrace output for the line corresponding to the outermost + level of the input stack (commonly, a file argument to groff). + Unfortunately, that wasn't its only effect. + + This change does result in one additional line of output for + each error or (non-ignored) warning when -b is given. However, + I regard this as unobjectionable because {1} a backtrace was in + fact explicitly requested; and {2} it seems a poor tradeoff to + suppress most of the backtrace in some complicated and + frustrating cases for the sake of one fewer line of backtrace + output in a trivial one. + + Now, backtracing behaves the same no matter what triggers it. + + Fixes Savannah #58153. + + * src/roff/troff/input.cpp (file_iterator::backtrace): Call + get_location() for its side effect of rewriting a filename of + "-" to "", for consistency with other diagnostic + messages. (In this class, this member function always returns + 1, so ignore the return value. This fact is an essential part + of what led to the bug; the conditional + p && !p->get_location(0, &f, &n) + which appeared in the for loop of input_stack::backtrace() prior + to this change would always evaluate to false when a node of the + file_iterator class was encountered.) + (input_stack::backtrace): Replace member function body with that + of input_stack::backtrace_all(). + (input_stack::backtrace_all): Delete. + (backtrace_request): Update the only call site of the above. + + * src/roff/groff/tests/regression_savannah_58153.sh: Add test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + + * src/roff/groff/tests/string_case_xform_errors.sh: Update + regression test to not be confounded by additional line of + backtrace output. Remove bashism along the way. + + * doc/groff.texi: + * man/groff.7.man: + * man/groff_diff.7.man: Update documentation. + +2020-04-10 G. Branden Robinson + + Reorganize backtrace output. + + * src/roff/troff/input.cpp (string_iterator::backtrace): + Prefix the output with the program name if it is known. In a + deviation from the GNU Coding Standards, put the string + "backtrace:" immediately next instead of the file and line + number; this is because, particularly in cases where the + backtrace is most interesting or needed, it will produce + multiple lines of output and the common prefix aids visual + understanding. + (file_iterator::backtrace): As above; also, change prefix for + popened nodes in the iterator from "process" to "pipe". This + seemed preferable to omitting the information entirely or using + an inscrutable sigil like 'f' or 'p'. The advantage is that the + output is better aligned--better ergonomics for those who have + to cope with a lot of it. Furthermore, output the filename only + once. + + Example of old and new output: + + /tmp/inner:2: backtrace: file '/tmp/inner' + echo .so /tmp/inner:1: backtrace: process 'echo .so /tmp/inner' + /tmp/outer:1: backtrace: file '/tmp/outer' + + troff: backtrace: file '/tmp/inner':2 + troff: backtrace: pipe 'echo .so /tmp/inner':1 + troff: backtrace: file '/tmp/outer':1 + +2020-04-10 G. Branden Robinson + + * src/roff/troff/input.cpp (read_size): Add units to diagnostic. + This function works only with device-specific basic units + internally; users likely think in terms of point size, so add + the basic unit suffix "u" to offer a hint about what's going on. + + Example: + $ groff -ww >/dev/null + \s[10]A\s[-12]B + troff: :1: warning: point-size escape results in + non-positive size -2000u; set to 1u + + On a PostScript device with 1000 basic units to the point, the + difference is important and would be confusing without the unit + indication. + +2020-04-08 G. Branden Robinson + + Correct and clarify point size documentation. + + Our Texinfo manual has long documented the request '.ps 0' as + restoring the previous point size (just as '\s0' or '.ps' with + no argument does), but this is incorrect; since groff 1.02 or + earlier (June 1991), the request has not actually worked this + way. Instead, '.ps 0' sets the point size to 1 basic unit + {though output drivers may clamp this to a higher value}. This + behavior is consistent with AT&T troff, Hierloom Doctools troff + and, per Ingo Schwarze, Plan 9 troff. (It is, however, not + consistent with neatroff.) + + * doc/groff.texi (Changing Type Sizes): Stop claiming that '.ps + 0' works like '\s0'. Note that the resulting (computed) point + size, not the argument, is clamped. Note that it is + non-positive, not negative, point sizes that are clamped to 1u. + Add (forward) cross-reference to section where \n[.ps] is + defined since it is mentioned here. Move explanation of special + handling of zero argument to \s escape description. + + * man/groff.7.man (Request short reference): Explain .ps N + independently of \s. Note clamping behavior. + +2020-04-06 G. Branden Robinson + + * src/roff/troff/input.cpp (read_size): Correctly brace 'else' + block. + + * src/roff/groff/tests/\ + use_point_size_escape_with_single_digit_arg.sh: + Check that we get a diagnostic when relying on ambiguous form. + +2020-04-04 G. Branden Robinson + + * src/roff/troff/input.cpp (read_size): Move special-case + interpretation of the '\sN' form of point-size escapes when 'N' + is 1, 2, or 3 to compatibility mode (groff -C) only, and throw + error diagnostic with suggestion for remedy if encountered. + + Traditionally, '\s36A' is interpreted as "set point size to 36, + then emit 'A'". However, only values in the range 10-39 are + handled specially; '\s40A' is interpreted as a four-point "0A". + This is unlike anything else in *roff grammar; see \*, \$, \f, + \F, \g, \k, \m, \M, \n, \V, \Y, and \z. + + To anticipate objections: Why not throw only a warning? Because + there isn't a warning category for supported but ambiguous + syntax (this behavior of AT&T troff dates back to the mid-1970s + but was not documented in the Troff User's Manual until 1992). + Why not throw the error outside of compatibility mode too? + Because outside of compatibility mode we (now) have an + unambiguous parse. + + Background: The Graphic Systems C/A/T phototypesetter (the + original device target for AT&T troff) only supported a few + discrete point sizes in the range 6..36, so Ossanna + special-cased the parser to do what the user must have meant. + Kernighan warned of this in the 1992 revision of CSTR #54 + {§2.3}, and more recently, McIlroy referred to it as a "living + fossil". + + See: + https://lists.gnu.org/archive/html/groff/2020-03/msg00054.html + https://lists.gnu.org/archive/html/groff/2020-04/msg00002.html + https://lists.gnu.org/archive/html/groff/2020-04/msg00015.html + and follow-ups for discussion. + + * NEWS: Advise users of behavior change and offer guidance. + + * doc/groff.texi: + * man/groff.7.man: Document the restriction of special handling + of point-size arguments to '\s' to compatibility mode. + + * src/roff/groff/tests/\ + use_point_size_escape_with_single_digit_arg.sh: Add regression + test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2020-04-04 G. Branden Robinson + + Improve point-size escape diagnostics. + + * src/roff/troff/input.cpp (read_size): Disclose context + {point-size escape interpretation} in diagnostic messages. When + a "bad digit" is encountered, describe it if possible. When a + relative adjustment results in a negative point size, report the + computed value. Also rename a variable for slightly more + clarity ("bad" does not refer to all bad parses, just some cases + of bad digits), and update an insufficiently generalized comment + {"\s(00" is also an acceptable expression for point-size zero}. + + Based on suggestions by Ingo Schwarze and Bjarni Ingi Gislason. + +2020-04-01 G. Branden Robinson + + Align diagnostic message format. + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + * src/roff/troff/input.cpp (do_error): + Display the diagnostic level when it is "error", instead of + leaving it implicit. + + * src/roff/troff/input.cpp (error_with_file_and_line): Include + the program name in the diagnostic message if it is known. + + * src/roff/groff/tests/string_case_xform_errors.sh: Update + diagnostic message expectation. + +2020-02-10 G. Branden Robinson + + * doc/groff.texi (Page Motions): + * man/groff.7.man (Single-character escapes): Document + non-breaking spaces as such. + + Report and patch by Dave Kemper . + Fixes . + +2020-02-10 G. Branden Robinson + + nroff: Implement -P and -V options. + + * src/roff/nroff/nroff.sh: Recognize -P option (with argument) + and pass it through to groff. Recognize -V option; if given, + display constructed groff command instead of executing it. + Update usage message to document new options. Tidy up shell + style and indentation. Add comments. + * src/roff/nroff/nroff.1.man: Document new -P and -V options. + * src/roff/nroff/tests/verbose_option_works.sh.in: Test -V + option. + * src/roff/nroff/nroff.am: Generate test and run it. + +2020-02-06 G. Branden Robinson + + Stop ms macro package from manipulating warnings. + + * tmac/s.tmac: Remove code block that attempted to enable all + warnings "only if none are given on the command line". It did + this by simply comparing the value of the warn register + {\n[.warn]} against the default value; but of course, a user + could specify -w options that exactly matched the default and + the test would not be able to tell, causing puzzling and + undesired behavior. Furthermore, the hard-coded default was out + of date and did not correspond to recent releases of groff. If + you want all warnings on, use the ".warn" request with no + arguments in your ms document or pass "-w w" to groff (see + troff(1) or our Texinfo manual for more on warnings). + + Thanks to Bjarni Ingi Gislason for bringing this issue to our + attention. + + Resolves . + +2020-01-21 George HELFFRICH + + [me]: Fix regression of '.nm' (#57638). + + * tmac/e.tmac-u (nm): Use saved point size and font position + for line numbering only if those registers exist. + + Fixes . + +2020-01-18 Ingo Schwarze + + Accept any number of arguments for .Dd in the groff_mdoc(7) + macros. + + * tmac/doc-common-u: The .Dd macro behaved in a weird way: + Without arguments, it printed the string "Epoch". + With one, two, four, or more arguments, it ignored all arguments + and used the current date instead. + Only for exactly three arguments, it printed the arguments. + None of this made sense. Giving the date as "Epoch" is + absurd, and printing the current date is just misleading: + why should a document be considered up-to-date when the author + did not even bother to state the date of the last change? + Admittedly, the behaviour for 0 and 4 or more arguments + already appeared 4.3BSD-Reno, and the behaviour for 2 or 3 + arguments in 4.4BSD. But it was already wrong even in those + days: several manual pages in 4.4BSD gave .Dd a single, quoted + argument, e.g. .Dd "June 9, 1993": cap_mkdb(1), id(1), sed(1), + err(3), getcap(3), sysctl(3), amd(8), disklabel(8), and others. + Consequently, simply print all the arguments, no matter how + many there are. + + This bug was found by Jonathan Gray + while he looked at 4.xBSD manual pages. + +2020-01-18 G. Branden Robinson + + * doc/groff.texi: Document initial empty set membership of + characters with cflags values of 128, 256, or 512 in parallel + with preceding paragraphs regarding smaller powers of two. + + Report and patch by Dave Kemper . + Fixes . + +2020-01-18 G. Branden Robinson + + * src/roff/groff/tests/*.sh: Rename some tests so their + filenames are more self-descriptive. + * src/roff/groff/groff.am (groff_TESTS): Update. + +2020-01-18 G. Branden Robinson + + * src/roff/groff/tests/transparent_end-of-sentence_chars.sh: Add + test for end-of-sentence recognition. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2020-01-18 G. Branden Robinson + + * src/roff/troff/input.cpp: Mark \[dd] character (double dagger) + as transparent for purposes of end-of-sentence recognition. + + * doc/groff.texi (Sentences): + * man/groff_diff.7.man (New requests/.cflags): Document this. + + Report and patch by Dave Kemper . + Fixes . + +2020-01-17 G. Branden Robinson + + * src/preproc/refer/refer.1.man (See Also): + * src/utils/indxbib/indxbib.1.man (See Also): + * src/utils/lkbib/lkbib.1.man (See Also): + * src/utils/lookbib/lookbib.1.man (See Also): Add bibliographic + reference to the original Bell Labs "refer" paper by Mike Lesk. + +2020-01-17 G. Branden Robinson + + * tmac/tests/an-old_AT_and_UC_footer_saved_and_restored.sh: Add + regression test for Ingo's change below. + +2020-01-16 Ingo Schwarze + + Repair .AT and .UC in the groff_man(7) macros. + + * tmac/an-old.tmac: Setting user-defined strings in a macro that + will later be called indirectly from page location traps is + excessively complicated. Besides, the implementation doesn't + work: when the trap is finally sprung, the defaults from the + an-init macro clobber what the author specified with .AT or .UC. + Instead, all that is needed is setting the strings for the + header before triggering the page break, such that they appear + right away, while setting the strings for the footer after the + page break, such that they don't appear on the previous page. + + This bug was found by Jonathan Gray while he + looked at 4.xBSD manual pages. + +2020-01-16 G. Branden Robinson + + * tmac/groff_man.7.man (Document structure macros/.SH): Fix + errors in footer description. + +2020-01-12 G. Branden Robinson + + * tmac/tests/an-old_CS_register_on.sh: Tweak flags; all the + other tests in this group pass "-Tascii -P-cbou" instead of + "-Tutf8". (This is so that output is easy to grep from a shell + script.) Bring this test into line. Does not regress anything. + +2019-12-30 Deri James + + Certain pdfmark destination names caused gropdf to fail. + + * src/devices/gropdf/gropdf.pl: Look for pdfmark types, (i.e. + DEST, OUT, ANN), only preceding 'pdfmark' at end of line, not + anywhere else. + +2019-12-30 Ingo Schwarze + + Correct output of sprintf("%%") in pic(1). + + * src/preproc/pic/pic.ypp: Print "%" rather than "%%". + + Bug reported by Doug McIlroy . + Patch using feedback from Larry McVoy . + +2019-12-29 Deri James + + Update man page of gropdf to document \X calls. + + * src/devices/gropdf/gropdf.1.man: The calls 'pagename' and + 'switchtopage' (used by mom to relocate TOC) are documented, + together with their convenience commands '.pdfpagename' and + '.pdfswitchtopage'. + +2019-12-29 Ingo Schwarze + + Improve documentation of pic(1) regarding printf. + + * src/preproc/pic/pic.1.man: + Document which conversion specifications are supported. + * doc/pic.ms: + Correct the list of supported conversion specifications. + +2019-12-21 Ingo Schwarze + + Update NetBSD, OpenBSD, FreeBSD, Darwin, and DragonFly version + strings. + + * tmac/doc-common-u: Update. + * tmac/groff_mdoc.7.man: Synchronize. + + Based on a patch from Guillem Jover + via Colin Watson , tweaked by me. + Fixes: https://bugs.debian.org/867123 + +2019-09-22 G. Branden Robinson + + Use a vertical spacing of 1v between paragraphs in man page + examples. This looks better (on typesetter devices like + PostScript and PDF) with the Courier font family also used in + examples. Typewriter devices (like the terminal) already used + an inter-paragraph spacing of 1v. + + * tmac/an-ext.tmac (EX): Save the value of the PD number + register (inter-paragraph distance), and set it to 1v. + (EE): Restore previous value of the PD register. + +2019-09-21 Deri James + + Changes to allow configure to check for URW fonts + + * font/devpdf/util/BuildFoundries.pl: Call the program with + --dirURW with path provided to ./configure, and --check to do + a dry-run just checking if the fonts are available. (bug #56748) + +2019-09-21 Deri James + + Add new ghostscript font names (bug #56748) + + * font/devpdf/Foundry.in: Add changed font names + +2019-09-21 Deri James + + Prevent gropdf executing arbitrary commands + + * src/devices/gropdf/gropdf.pl: See bug #55557 + +2019-09-15 G. Branden Robinson + + * tmac/an-old.tmac: Move test for definitions of CS and CT + registers to after man.local is sourced; this way we can both + respect any setting of those registers in that file (which is + intended for customization by the site administrator) and ensure + that the registers are defined when dereferenced later. + +2019-09-15 G. Branden Robinson + + * **/*.man: Put section headings in title case. + +2019-09-13 G. Branden Robinson + + * src/roff/troff/input.cpp: Lift invariant out of loop. + +2019-09-11 G. Branden Robinson + + * src/preproc/refer/refer.1.man: Add mention of man and mm + packages as supporting the "refer" preprocessor (GNU mm grew + this support back in groff 1.22.1). + +2019-09-10 G. Branden Robinson + + Mark expected-to-fail test as XFAIL. + + Automake supports XFAIL and XPASS, so actually use the + infrastructure as intended. + + * Makefile.am: Declare XFAIL_TESTS variable. + * src/roff/groff/groff.am (groff_XFAIL_TESTS): Add + string_case_xform_unicode_escape.sh. + * src/roff/groff/tests/string_case_xform_unicode_escape.sh: Set + the expected output to what it would be if string case + transforms worked on groff Unicode escapes. + +2019-09-10 G. Branden Robinson + + Retire '@G@' build system macro. + + It existed only for forcibly-capitalized man page titles; it was + the uppercase-transformed counterpart of @g@. + + * Makefile.am: Delete sed transformation of @G@. + * src/preproc/tbl/tbl.1.man: Replace '@G@EQN' in section heading + with '@g@eqn'. + +2019-09-10 G. Branden Robinson + + * **/*.man: Downcase man page titles, except for glilypond and + roff2*, which did not require it. + + Here's a sed script for the aid of those who have a corpus of + man pages to migrate. + + # Downcase man page titles. + # + # Use the first line to skip any .TH lines that require + # special handling, perhaps because the name of the + # command gets externally macro-expanded. In groff, the + # "roff2.1.man" page is an example. + # + # This script operates _only_ on .TH lines. + # + # usage: sed -i -f this_script.sed your_man_page.1 ... + /@ROFF2MODE@/b + /^\.\s*TH/{ + h + s/^\.\s*TH \+\([^ ]\+\) .*/\1/ + y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + G + s/\([^ ]\+\)\n\(^\.\s*TH \+\)[^ ]\+\( .*\)/\2\1\3/ + } + +2019-09-09 G. Branden Robinson + + The an (man) macro package supports new CS and CT number + registers to control rendering of man page section headings and + titles, respectively, in full capitals. These default off (with + no visible effect on pages which already fully capitalize these + strings in man page sources). The rationale is to encourage man + page authors to preserve case distinction information in (or + restore it to) their titles and section headings, while giving + users (including system administrators, distributors, + integrators, and maintainers of man(1) implementations) a way to + view the rendered page elements in full capitals if desired. + + * tmac/an-old.tmac (TH/an-init): If number register CT is + defined and nonzero, call .stringup on \*[an-title]. + (SH): Store macro argument list to \*[an-section-heading]. If + number register CS is defined and nonzero, call .stringup on it. + * tmac/groff_man.7.man (OPTIONS): Document the CS and CT number + registers. + * tmac/tests/an-old_CS_register_off.sh: + * tmac/tests/an-old_CS_register_on.sh: + * tmac/tests/an-old_CS_register_unspecified.sh: + * tmac/tests/an-old_CT_register_off.sh: + * tmac/tests/an-old_CT_register_on.sh: + * tmac/tests/an-old_CT_register_unspecified.sh: Add tests. + * tmac/tmac.am (tmac_TESTS): Run tests. + +2019-09-09 G. Branden Robinson + + Add regression test to check behavior of case transformation + request on a string containing a Unicode character escape. + Right now, this is not supported, so it is an XFAIL test in the + parlance of DejaGNU/POSIX 1003.3. + + * src/roff/groff/tests/string_case_xform_unicode_escape.sh: New + test. + * src/roff/groff/groff.am (groff_TESTS): Run test. + +2019-09-09 G. Branden Robinson + + Implement .stringdown and .stringup requests. + + * src/roff/troff/input.cpp: Add .stringdown and .stringup + requests. + * doc/groff.texi: Document them, including example. + * man/groff_diff.7.man: Same. + * man/groff.7.man: Document them briefly. -2011-01-22 Werner LEMBERG +2019-09-09 G. Branden Robinson - Update `grog'. + Regression-test string case transform feature. - * src/roff/grog/{groff.sh,groff.pl}: `groff' now calls `pic' - automatically if `grap' or `chem' is used. - `chem' has been folded into `groff'. - * src/roff/grog/grog.man: Updated. + * src/roff/groff/tests/string_case_xform_errors.sh: New test. + * src/roff/groff/tests/string_case_xform_requests.sh: New test. + * src/roff/groff/groff.am (groff_TESTS): Run tests. -2011-01-22 Werner LEMBERG +2019-06-30 G. Branden Robinson - Make `groff -G' imply `-p'. + * src/devices/grotty/grotty.1.man (Options/-i): Note support of + recent versions of xterm for italic (oblique) styles. - * src/roff/groff/groff.cpp (main): Implement it. - * src/roff/groff/groff.man: Updated. + Fixes part of . -2011-01-22 Werner LEMBERG +2019-06-28 G. Branden Robinson - Integrate `chem' into `groff' (new option -j). + devlatin1: Map \(oq to ' on output. - * src/roff/groff/groff.cpp (CHEM_INDEX): New constant. - (main) ['j']: Add `chem'. - (synopsis, help): Updated. - * src/roff/troff/pipeline.h (MAX_COMMANDS): Increase to 14. + * font/devlatin1/R.proto: Render the output glyph \[oq] + {opening quote} as 0x27 (apostrophe) instead of 0x60 (grave + accent). A grave accent is just flat wrong for the Latin-1 + character set, a.k.a. ISO 8859-1. The defining document ECMA-94 + {June 1986} is freely available for perusal. The ECMA-94 Latin + character sets do not define any glyphs for directional + {"typographer's"} quotation marks, but the apostrophe is + depicted as a neutral (vertical) glyph, whereas the grave accent + 0x60 and acute accent 0xB4 are mirror-symmetric diacritical + marks. - * src/roff/groff/groff.man: Document new command line option. - * NEWS: Updated. + Note that this change has no effect on _input_ conventions for + roff source documents. You can still get directional single + quotes on UTF-8, PostScript, PDF, and other output devices + supporting them by typing sequences like `this' in the input + {character remapping with ".char" requests and similar + notwithstanding}. -2011-01-22 Werner LEMBERG + Patch and idea from Ingo Schwarze, who originally proposed it + for ASCII as well, and included Latin-1 for parallelism. + The groff developers could reach no consensus about the wisdom + of such a change for ASCII (which was designed to support + ambiguity for some code points, requiring the development of + supplementary interpretation conventions between parties). + ECMA-94/ISO-8859 is more strongly prescriptive. - * doc/groff.texinfo: `chem' is now part of groff. + See https://savannah.gnu.org/bugs/?55616 and the groff mailing + list archives for 31 January to 23 February 2019 at + https://lists.gnu.org/archive/html/groff for lengthy discussion. -2011-01-22 Werner LEMBERG + * src/roff/groff/tests/on-latin1-device-oq-is-0x27.sh: Check for + correct output glyph. - * doc/groff.texinfo: Improve description of `.de'. + * src/roff/groff/groff.am: Add test. - Based on suggestions by Ted Harding and Deri James. +2019-06-28 G. Branden Robinson -2011-01-20 Colin Watson + * tmac/unicode.tmac: Save and restore compatibility mode since + the script uses a GNU extension (.char). - Fix handling of wide characters in no-SGR mode. +2019-06-27 G. Branden Robinson - * src/devices/grotty/tty.cpp (tty_printer::make_underline): Only - emit a single backspace in no-SGR mode. less (at least) - backspaces over a character at a time. - (tty_printer::make_bold): Likewise. + libdriver: Fix SEGV (Savannah #56555). -2011-01-19 Werner LEMBERG + * src/libs/libdriver/printer.cpp: Check result of + set_char_and_width() for error condition before relying on it. - * src/preproc/pic/pic.man: Add pic manual to `SEE ALSO' section. + * src/roff/groff/tests/regression-56555.sh: Provoke segfault + with five bytes of input using transparent line indicator. -2011-01-14 Werner LEMBERG + * src/roff/groff/groff.am: Add test. - Split ChangeLog. + Fixes . - * ChangeLog: Split off older entries into... - * ChangeLog.119, ChangeLog.120: these new files. +2019-01-12 Ingo Schwarze -2011-01-15 Colin Watson + Correctly handle groff_mdoc(7) .Lk arguments starting with a + dot. - * Makefile.comm (INCLUDES): Fix typo. + * tmac/doc.tmac-u: Each argument to the .Lk macro is printed + on its own roff input line. If it happens to start with a dot + or apostroph, it was misinterpreted as a request or macro. + Force it to be treated as text by adding "\&" in front of it. -2011-01-05 Werner LEMBERG +2018-12-31 Ingo Schwarze - * doc/webpage.ms: Fix rendering of title image. + * man/groff_diff.7.man: remove two stray .RE macros ________________________________________________________________________ ##### License -Copyright 2011-2018 Free Software Foundation, Inc. +Copyright 2018-2021 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: change-log version-control: never End: -vim:set autoindent: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.115 b/ChangeLog.115 index dcb7c52..6f8b17b 100644 --- a/ChangeLog.115 +++ b/ChangeLog.115 @@ -889,7 +889,7 @@ Fri Feb 11 11:45:40 1994 James Clark (jjc@jclark.com) popen/pclose on POPEN_MISSING. * troff/node.h: Conditionalize pipe_command on POPEN_MISSING. * troff/input.cc (pipe_command): Give an error if POPEN_MISSING. - (pipe_source): Similarily. + (pipe_source): Similarly. * acgroff.m4 (GROFF_PROG_CCC): Update message about libg++. @@ -1643,7 +1643,7 @@ Wed Oct 28 08:30:57 1992 James Clark (jjc at jclark) Mon Oct 26 11:33:47 1992 James Clark (jjc at jclark) * tmac/tmac.e ((f): Set up the environment even when there's a - current diversion. Transperently throughput a call to @N. + current diversion. Transparently throughput a call to @N. (@N): New macro. Thu Oct 22 05:05:59 1992 James Clark (jjc at jclark) @@ -1746,7 +1746,7 @@ Mon Sep 21 10:59:16 1992 James Clark (jjc at jclark) (hyphen_trie::do_delete): New function. (trie::~trie): New function. (hyphen_trie::~hyphen_trie): New function. - (trie::clear): No need to chcek that tp is not 0. + (trie::clear): No need to check that tp is not 0. (current_language, language_dictionary): New variables. (hyphen_word): Give an error if no current language. Use exceptions dictionary in current language. @@ -1809,7 +1809,7 @@ Sun Sep 20 09:33:02 1992 James Clark (jjc at jclark) font::paperlength. Don't compute columns_per_page from font::paperwidth. (tty_printer::add_char): Don't check horizontal position against - columns_per_page. Grow glyphs vector if neccessary. + columns_per_page. Grow glyphs vector if necessary. (tty_printer::end_page): Add argument giving page_length in units. Discard lines past end of page. @@ -1941,7 +1941,7 @@ Mon Aug 24 11:11:11 1992 James Clark (jjc at jclark) (O_RDONLY): Define if necessary. (make_index_search_item, index_search_item_iterator::get_tag, index_search_item::check_files): Use O_RDONLY. - * libbib/seach.cc: Include , , . + * libbib/search.cc: Include , , . (O_RDONLY): Define if necessary. (search_list::add_file): Use O_RDONLY. * indxbib/indxbib.cc: Include , , @@ -2475,7 +2475,7 @@ Thu Jul 2 10:59:15 1992 James Clark (jjc at jclark) Wed Jul 1 10:17:25 1992 James Clark (jjc at jclark) * dvi/tmac.dvi: Change the definitions of \(ul and _ so that they - produce a real _ charater when the current font is CW and _ + produce a real _ character when the current font is CW and _ otherwise. * lib/errarg.c (errarg::errarg(const char *)): Invert conditional @@ -3055,7 +3055,7 @@ Sat Feb 15 09:55:20 1992 James Clark (jjc at jclark) environment::get_half_narrow_space_width): Make inline. (environment::get_space_width): Make inline. Just call env_space_width. - * troff/env.c: Delete definitions for funtions made inline. + * troff/env.c: Delete definitions for functions made inline. (environment::space_newline, environment::space): Use env_sentence_space_width(). Don't scale by space_size. * troff/node.h: Move declarations of env*space_width() functions @@ -3231,7 +3231,7 @@ Sun Sep 29 08:40:57 1991 James Clark (jjc at jclark) * pic/lex.c (input_stack::bol): Move definition out of class body. - * pic/main.c: On MSDOS munge argv[0]. + * pic/main.c: On MS-DOS munge argv[0]. * lib/ptable.h: Define name2 as _Paste2 for Borland C++. @@ -3591,7 +3591,7 @@ Thu May 23 12:30:49 1991 James Clark (jjc at jclark) * macros/tmac.e: Define \*(lq and \*(rq to be \(lq and \(rq. * pic/object.c (position_rectangle): When checking radius - cope with possiblity that width or height is negative. + cope with possibility that width or height is negative. (box_object::box_object): Have separate xrad and yrad with signs matching signs of dim components. (box_object::{north,south}_{east,west}): Use xrad and yrad. @@ -3730,7 +3730,7 @@ Mon Apr 15 11:20:23 1991 James Clark (jjc at jclark) TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, TOKEN_FONT_POSITION, and TOKEN_SIZE. - * man/Makefile: Add definiton of BROKEN_SPOOLER_FLAGS. + * man/Makefile: Add definition of BROKEN_SPOOLER_FLAGS. (.man.n): sed out @BROKEN_SPOOLER_FLAGS@. Sun Apr 14 12:57:00 1991 James Clark (jjc at jclark) @@ -3971,8 +3971,9 @@ Mon Mar 11 12:01:20 1991 James Clark (jjc at jclark) * macros/tmac.e: Remove check that groff is being used. * macros/tmac.e (@C): Change families only if using groff; turn - compatibility mode off while changing familes. Save compatibility - mode before changing families and restore it afterwards. + compatibility mode off while changing families. Save + compatibility mode before changing families and restore it + afterwards. * macros/tmac.e (@h): Remove test for offset + line length. @@ -4503,7 +4504,7 @@ Wed Nov 28 10:09:57 1990 James Clark (jjc at jclark) * macros/tmac.s: New file. * man/groff_ms.man: New file. * Makefile: Add definition of TMAC_S. Pass TMAC_S in SUBFLAGS. - * Makefile.bd: Similarily. + * Makefile.bd: Similarly. * man/Makefile: Add groff_ms.n to MAN7PAGES. Replace @TMAC_S@. Add definition of TMAC_S. * macros/Makefile: Add definition of TMAC_S. Install tmac.s. @@ -4587,7 +4588,7 @@ Fri Nov 16 06:34:27 1990 James Clark (jjc at jclark) * troff/node.c (lookup_family): Supply second argument to lookup. - * troff/dictionary.c (dictionary::lookup): After an unsuccesful + * troff/dictionary.c (dictionary::lookup): After an unsuccessful search, return immediately if v is 0. * pic/troff.c: Define EQN_NO_EXTRA_SPACE_REG. @@ -4836,7 +4837,7 @@ Wed Oct 10 09:59:13 1990 James Clark (jjc at jclark) Tue Oct 9 08:34:02 1990 James Clark (jjc at jclark) * eqn/lex.c: In defaults_table, make definition of `dot' call - `dot_def'. Don't explicitly make it roman. Similarily for other + `dot_def'. Don't explicitly make it roman. Similarly for other accents. * pic/lex.c (for_input::for_input): Add by_is_multiplicative @@ -5190,7 +5191,7 @@ Thu Sep 13 06:21:45 1990 James Clark (jjc at jclark) * troff/node.c (class glyph_node): Make operator new and operator delete public. - (class ligature_node): Similarily. + (class ligature_node): Similarly. * troff/input.c (operator==(const macro &, const macro &)): New function. @@ -5246,7 +5247,7 @@ Mon Sep 10 11:06:27 1990 James Clark (jjc at jclark) * troff/input.c (read_long_escape_name): The test for whether to expand buffer was off by 1. - (read_string): Similarily. + (read_string): Similarly. Fri Sep 7 11:45:50 1990 James Clark (jjc at jclark) @@ -5345,7 +5346,7 @@ Tue Sep 4 00:48:04 1990 James Clark (jjc at jclark) * groff.c: New file. * Makefile: Build groff from groff.c. Make it possible to use either groff.sh or groff.c as groff. - * Makefile.bd: Similarily. + * Makefile.bd: Similarly. Mon Sep 3 09:39:49 1990 James Clark (jjc at jclark) @@ -5357,14 +5358,14 @@ Sun Sep 2 09:56:59 1990 James Clark (jjc at jclark) * all Makefiles: Simplify and rearrange. * Makefile: Handle fmod like malloc. - * lib/Makefile: Similarily. + * lib/Makefile: Similarly. * lib/fmod.c: Remove #ifdef NEED_FMOD. * Makefile: Rename OPTIMISE to OPTIMIZE. * groff.sh: Remove assignment to PATH. * Makefile: Remove SHPATH variable. - * Makefile.bd: Similarily. + * Makefile.bd: Similarly. * groff.sh: Add -V option to print the pipeline instead of executing it. @@ -5380,7 +5381,7 @@ Thu Aug 30 13:13:55 1990 James Clark (jjc at jclark) * tbl/table.c (table::do_hspan): Delete assertion that e != 0. Also change misleading comment. - (table::do_vspan): Change similarily misleading comment. + (table::do_vspan): Change similarly misleading comment. * tbl/main.c (process_data): A format row with an explicit `s' uses up a data line, even if all the other columns are `_' or `='. @@ -5656,7 +5657,7 @@ Mon Aug 13 10:11:16 1990 James Clark (jjc at yquem) * eqn/other.c (overline_box::output): Use \Z. If draw_flag use \D rather than \l. - (underline_box::output): Similarily. + (underline_box::output): Similarly. (accent_box::output): Use \Z. * xditview/tmac.X: Add definitions of ~ and ^ (so that they are a @@ -5693,7 +5694,7 @@ Sat Aug 11 09:02:21 1990 James Clark (jjc at yquem) * troff/env.c (tab_character): Don't change the tab character if we get an invalid argument. - (hyphen_char): Similarily. + (hyphen_char): Similarly. * troff/reg.c (alter_format): Check that nm is not null. @@ -5805,7 +5806,7 @@ Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) * troff/env.c (environment_switch): Pop if we get an invalid symbol or numeric expression. - * troff/input.c (do_define_macro): If EOF is encoutered while + * troff/input.c (do_define_macro): If EOF is encountered while defining the macro, do tok.next() before returning. * troff/token.h (has_arg): Move definition from here, to ... @@ -5839,7 +5840,7 @@ Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) * eqn/main.c (main): Add -C option. (do_file): Don't recognize EQ, EN or lf if followed by character other than space or newline unless -C option given. - * eqn/lex.c (file_input::read_line): Similarily. + * eqn/lex.c (file_input::read_line): Similarly. * eqn/eqn.h: Declare compatible_flag. * etc/soelim.c (main): Add -C option. @@ -5850,7 +5851,7 @@ Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) (top_input::get), (top_input::peek): If -C option not given, do not recognize .PS/.PE/.PF/.lf if followed by a character other than space or newline. - * pic/lex.c (file_input::read_line): Similarily. + * pic/lex.c (file_input::read_line): Similarly. * pic/pic.h: Add declaration of compatible_flag. Thu Aug 2 11:11:27 1990 James Clark (jjc at yquem) @@ -6148,6 +6149,8 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: +fill-column: 72 +mode: change-log version-control: never -coding: latin-1 End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.116 b/ChangeLog.116 index b625c8e..85f26b7 100644 --- a/ChangeLog.116 +++ b/ChangeLog.116 @@ -209,7 +209,7 @@ Version 1.16.1 released 2000-06-07 Paco Andrés Verdú - * src/devides/grolbp/lbp.h: Removed unused variables. + * src/devices/grolbp/lbp.h: Removed unused variables. 2000-05-31 Keith Thompson @@ -960,7 +960,7 @@ Version 1.16 released * src/roff/groff/groff.man: Formatting fix. * src/preproc/grn/grn.man: Ditto. - * src/roff/grog/grog.pl: Fixing two embarassing bugs. + * src/roff/grog/grog.pl: Fixing two embarrassing bugs. * doc/groff.texinfo: Further checking/updating. @@ -1389,6 +1389,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.117 b/ChangeLog.117 index 57df33f..5724952 100644 --- a/ChangeLog.117 +++ b/ChangeLog.117 @@ -718,7 +718,7 @@ Version 1.17 released (special_node::same, special_node::copy): Updated. (special_node::ends_sentence): New method. (troff_output_file::start_special): Add parameter to include - inititialization of special conditionally. + initialization of special conditionally. * src/roff/troff/env.h (environment): New member `underline_spaces'. * src/roff/troff/env.cc (do_underline_special): New function. @@ -2191,6 +2191,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.118 b/ChangeLog.118 index f3ec061..a87d02c 100644 --- a/ChangeLog.118 +++ b/ChangeLog.118 @@ -1623,7 +1623,7 @@ Version 1.18.0 released 2002-03-23 Phil Lobbes * Makefile.comm (.y.o): New rule for make on Solaris 2.5.1 -- the - internal .y.o rule took precendence over the .y.cc rule, compiling + internal .y.o rule took precedence over the .y.cc rule, compiling the yacc files with gcc instead of g++. 2002-03-23 Werner LEMBERG @@ -3308,7 +3308,7 @@ Version 1.18.0 released (html_text): New member functions `do_color' and `done_color'. Use `void *' for second parameter of `push_para' member function. New `push_para' member function with a single parameter. - Use `char *' for parameter of `issue_table_begin' member funtion. + Use `char *' for parameter of `issue_table_begin' member function. New `issue_color_begin' member function. * src/devices/grohtml/html-text.cc (html_text::end_tag): Handle COLOR_TAG. @@ -3795,6 +3795,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.119 b/ChangeLog.119 index 9245154..2840368 100644 --- a/ChangeLog.119 +++ b/ChangeLog.119 @@ -132,7 +132,7 @@ Version 1.19.2 released 2005-06-20 Denis M. Wilson - * font/devps/prologue.ps (EP): Dont' use `bind'. Reason: Using + * font/devps/prologue.ps (EP): Don't use `bind'. Reason: Using `bind' to define a procedure which contains `showpage' means that an invocation of `showpage' may execute wrongly (the exact effect depending on the interpreter). Not usually a problem except under @@ -695,7 +695,7 @@ Version 1.19.2 released (html_text::flush_text): Don't set `start_space'. (html_text::push_para): Don't set `p->really_issued'. (html_text::do_emittext): Updated. - (html_text::do_para): Add paremeter to handle space. + (html_text::do_para): Add parameter to handle space. Update all callers. (html_text::retrieve_para_space): New function. @@ -837,7 +837,7 @@ Version 1.19.2 released 2004-12-17 Werner LEMBERG * tmac/devtag.tmac: Protect against loading twice. - Protect agains compatibility mode. + Protect against compatibility mode. * tmac/www.tmac: Protect against loading twice. Load `devtag.tmac' before switching off compatibility mode. * tmac/an-old.tmac, tmac/s.tmac: Load `devtag.tmac'. @@ -3077,7 +3077,7 @@ Version 1.19.1 released * src/preproc/refer/ref.cpp (reference::compute_sort_key): Always insert SORT_SEP. With certain combinations of sort specifications, refer sorted entries in the wrong order. In particular, entries - with a missing field should be be sorted before all entries that + with a missing field should be sorted before all entries that have that field, before refer looks to the next field. 2003-08-23 Werner LEMBERG @@ -3957,7 +3957,7 @@ Version 1.19 released * NEWS, MANIFEST, tmac/groff_man.man, man/groff_tmac.man, doc/groff.texinfo: Updated. - * src/libs/libgroff/paper.cc (add_iso_paper): Fix very embarassing + * src/libs/libgroff/paper.cc (add_iso_paper): Fix very embarrassing bug which caused all odd iso papers to have wrong dimensions. * src/devices/grops/ps.cc (user_paper_width): New global variable. @@ -4846,10 +4846,10 @@ Version 1.19 released * font/devps/generate/Makefile (freeeuro.afm freeeuro.pfa): Fix typo. * font/devps/generate/sfdtopfa.pe: Generate PFA in current - direcory. + directory. * tmac/europs.tmac: Updated to new glyph indices. - Use Euro.symbol for font familiy `A'. + Use Euro.symbol for font family `A'. * doc/groff.texinfo: Minor improvements. @@ -5232,6 +5232,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.120 b/ChangeLog.120 index 7d2f043..0451689 100644 --- a/ChangeLog.120 +++ b/ChangeLog.120 @@ -3045,6 +3045,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.121 b/ChangeLog.121 index d0b652a..80f4197 100644 --- a/ChangeLog.121 +++ b/ChangeLog.121 @@ -416,7 +416,7 @@ Version 1.21 released in Savannah bug #29895. * src/devices/grotty/tty.cpp (tty_printer): Remove `is_utf8' member. - Replace all ocurrences with `font::is_unicode'. + Replace all occurrences with `font::is_unicode'. (tty_printer::tty_printer): Remove argument. * src/devices/grotty/grotty.man: Document `unicode' keyword. @@ -780,6 +780,9 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never coding: utf-8 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/ChangeLog.122 b/ChangeLog.122 new file mode 100644 index 0000000..b33249b --- /dev/null +++ b/ChangeLog.122 @@ -0,0 +1,5331 @@ +Version 1.22.4 released +======================= + +2018-12-18 Bertrand Garrigues + + Fix 'dvi' and 'pdf' texinfo doc generation. + + GNU make has a built-in variable 'TEXI2DVI' but it is not the case + of all 'make' implementations, which causes 'make doc' to fail + with an unclear message although 'texi2dvi' is available. Also, + 'texi2dvi' is invoked inconditionnally. + + * m4/groff.m4 (GROFF_TEXI2DVI): new macro to detect properly the + presence of 'texi2dvi'. + + * configure.ac: use 'GROFF_TEXI2DVI' and define automake conditional + 'HAVE_TEXI2DVI'. + + * doc/doc.am: + - Define TEXI2DVI to 'texi2dvi'. + - Print an error message if 'texi2dvi' is not available. + +2018-12-14 G. Branden Robinson + + * doc/groff.texi: Drop documentation of "man" macro package from + our Texinfo manual. The mdoc, me, mm, and mom packages all + maintain their documentation externally to this manual as + well. Exception: portions not about man proper--which are not + duplicated from groff_man(7)--on use of man.local (including + examples of Ultrix-compatible macros) are retained. + +2018-12-08 Bertrand Garrigues + + Install texinfo doc on 'make install-pdf' and 'make install-html' + + * doc/doc.am: + - Use automake 'install-pdf-local' and 'install-html-local' rules + to install groff.pdf and groff.html + - New rules 'uninstall_pdf' and 'uninstall_html'. + - Use $(RM) instead of 'rm'. + - Don't try to build doc if 'BUILD_INFODOC' is not set. + * INSTALL.REPO: document texinfo build and installation. + +2018-12-10 Ingo Schwarze + + * Makefile.am: Remove the unused variables PREFIXMAN5 and PREFIXMAN7. + + They caused installation failures on Solaris 9. + +2018-12-08 Bertrand Garrigues + + Remove gnulib's hypot module. + + The removal of 'GROFF_NEED_DECLARATION([hypot])' in 'configure.ac' + was correct as the test was buggy, but there is no need to use + gnulib's hypot module as previously we did not need to provide a + replacement function. + + * bootstrap.conf: do it. + +2018-12-08 Deri James + + Problem running gropdf on big endian (Sparc) + + * src/devices/gropdf/gropdf.pl: Prior to perl v5.9 the 'L<' + template for 'unpack' was unavailable. Solaris 10 uses v5.8.4 + so safer to use the template 'V' rather than 'L<'. + +2018-12-08 Bertrand Garrigues + + Use gnulib's 'hypot' module. + + In 'configure.ac', the macro call + 'GROFF_NEED_DECLARATION([hypot])' checks whether the function + 'hypot' is correctly declared in 'math.h', but the test is buggy + and may yields false results. + + * bootstrap.conf: add 'hypot' module. + + * configure.ac: Remove GROFF_NEED_DECLARATION([hypot]). + + * src/libs/libgroff/hypot.cpp: remove declaration of hypot. + +2018-12-07 Deri James + + Problem running gropdf on big endian (Sparc) + + * src/devices/gropdf/gropdf.pl: When loading a binary (.pfb) + font for embedding always use little endian to unpack chunk + headers. + +2018-12-05 Bertrand Garrigues + + Skip mom tests if needed config is missing. + + * contrib/mom/examples/test-mom.sh.in: exit 77 if URW fonts are + not available. + + * contrib/mom/mom.am: distribute inconditionnally test-mom.in. + + * m4/groff.m4 (GROFF_URW_FONTS): check if 'awk' and 'gs' are + available, and replace non-portable 'grep' command by awk script. + +2018-12-01 Colin Watson + + Fix error handling in tests of mom examples + + * contrib/mom/examples/test-mom.sh.in (check_number_pages): Correct + error message. + (check_has_images): Correct shell syntax error. + +2018-11-26 Bertrand Garrigues + + Document .sp behaviour in -me doc -- French translation + + * doc/meintro_fr.me: translation of commit + 7a83f7f5003e24f020306f09f4d497e04e82cb14. + + Fixes bug https://savannah.gnu.org/bugs/?54958. + +2018-11-24 Bertrand Garrigues + + Fix tarball generation: script 'makevarescape.sed' was missing. + + * Makefile.am (EXTRA_DIST): add it. + +2018-11-24 Bertrand Garrigues + + Add automatic tests on mom examples + + * m4/groff.m4 (GROFF_PDFTOOLS): check presence of some pdf tools. + * configure.ac: use 'GROFF_PDFTOOLS', add new AM conditional. + * contrib/mom/examples/test-mom.sh.in: new file that use 'pdfinfo' + and 'pdfimages' to make some basic checks on mom examples. + +2018-11-21 G. Branden Robinson + + tmac/sv.tmac: Set Swedish hyphenation flags to 32. + + This permits hyphenation after the first character but continues + prohibiting it before the last character of a word, in + congruence with the TeX-based hyphenation patterns we use. + + Fixes . + +2018-11-19 Bertrand Garrigues + + Fix build on environment where /etc/papersize contains comments + + Issue introduced on commit efea81c75f831ddc6717c2ef25556e0f49d1f679. + + * m4/groff.m4 (GROFF_PAGE): remove comments and get the 1st string + of '/etc/papersize'. + +2018-11-12 G. Branden Robinson + + * m4/groff.m4 (GROFF_PAGE): Try /etc/papersize first. + + Fixes . + +2018-11-12 G. Branden Robinson + + * bootstrap.conf: Bump Autoconf dependency to 2.68. We need it + to support our bug-reporting URL, which contains a "?". + Strictly, Autoconf 2.65 is fine, but 2.66 and 2.67 broke this. + Even 2.69 is over 6 years old now. + + See . + +2018-11-12 G. Branden Robinson + + * m4/groff.m4 (GROFF_PAGE): Quote shell variables that are under + external control and may contain embedded whitespace. A test + shows that our configure script is now robust in this way, but + our Automake files are not, starting with + src/utils/afmtodit/afmtodit.am. + +2018-11-12 G. Branden Robinson + + * makevarescape.sed: + - Escape plain spaces and double-quotes (ASCII 32 and 34) so + that bad things don't happen if they are embedded in a Make + variable expanded in a man page @THUS@ _and_ given as an + argument to a macro that distinguishes its parameters, such + as .IR. + - Add discretionary breaks after groups of slashes not + preceded by a space; e.g., transform "/usr/bin/groff" into + "/usr/\:bin/\:groff". Will also work on URLs + {"https://\:example.com/\:page.html"} in case we need that. + +2018-11-11 G. Branden Robinson + + Undocument Werner and Ted as groff maintainers. + + * README: + * doc/pic.ms: + * src/roff/grog/grog.pl: + * src/roff/nroff/nroff.sh: Werner (and Ted) retired from the + role some time ago and Bertrand Garrigues has stepped up; see + https://lists.gnu.org/archive/html/groff/2017-09/msg00048.html. + I'll let him document his maintainer status as and where he + prefers. + +2018-11-11 G. Branden Robinson + + Stop spelling "Unix" as "UNIX". + + Per AT&T Bell Labs veterans Doug McIlroy and Meg McRoberts, + spelling "Unix" in full caps was a contrivance insisted upon by + AT&T lawyers, and not a practice used in the Unix manuals + themselves or the Bell Labs Technical Journal. See + https://lists.gnu.org/archive/html/groff/2015-01/msg00026.html + and + https://lists.gnu.org/archive/html/groff/2015-01/msg00029.html + for support. + + There are instances I did _not_ change; they may require further + review. + ChangeLog.* + NEWS + One reference relevant to mdoc; see below. + doc/meintro{,_fr}.me + These documents also give the small caps + treatment to groff, troff, and nroff, suggesting + a separate changeset. + src/preproc/pic/pic.ypp + Contains a comment referring to "Compaq Tru64 + UNIX"; not worth the candle IMO. + tmac/s.tmac: + {ms macro package} Leaving UX macro definition + alone until/unless it can be established that + this doesn't change the rendering of historical + documents in an objectionable way. + tmac/doc-syms-u: + tmac/doc-old.tmac-u: + tmac/doc-common-u: + tmac/groff_mdoc.7.man: + {mdoc macro package} Similar; mdoc defines many + strings that spit out "UNIX" (albeit not with a + font size change). + + * MORE.STUFF: + * NEWS: + * README.MinGW: + * contrib/groffer/README: + * contrib/pdfmark/pdfmark.ms: + * contrib/pdfmark/pdfroff.1.man: + * doc/groff.texi: + * doc/webpage.ms: + * m4/groff.m4: + * man/groff_diff.7.man: + * man/groff_tmac.5.man: + * man/roff.7.man: + * src/preproc/html/pre-html.cpp: + * src/roff/troff/troff.1.man: Change "UNIX" to "Unix", + discarding markup as necessary. + +2018-11-10 G. Branden Robinson + + man pages: Escape interpolated Make variables. + + * makevarescape.sed: Transform - to \-, ~ to \(ti, and so forth, + {with an extra layer of backslashes--see below} so that Makefile + variables containing ASCII characters that do not represent + themselves literally in *roff (see groff_char(7)) are correctly + interpolated into man page text. + + * Makefile.am (.man): Transform Makefile variables with the + above script when interpolating them into man page text. + + Note that while the script, combined with this target, will + transform ` to \(ga, including grave accents in Makefile + variables is likely to fail when the shell lexes the argument to + echo within the old-style command substitution ``. Testing + shows that grave accents should work[1] if POSIX-style command + substitution $() is done instead. However, $() is less + portable. (Triple-escaping grave accents \\\` inside the + interpolated Makefile variable will work, but is not attempted + at present.) + + Note also that the amount of backslash-escaping in the sed + script is excessive (and incorrect) for normal purposes, but + required here because a command substitution is being nested + inside yet another invocation of sed. + + {1} For this target; no assurances about the good behavior of + unusual characters in Makefile variables in other aspects of the + groff build are offered. + + Fixes . + +2018-11-06 G. Branden Robinson + + * src/utils/lookbib/lookbib.cpp: Doesn't make much sense to mark + Version_string as a C extern if you're just going to hide it in + a throwaway scope again. Remove braces, exposing it. + + "lookbib -v" now reports a version number, instead of "(null)". + + Fixes . + +2018-11-06 G. Branden Robinson + + * src/libs/libgroff/error.cpp (do_error_with_file_and_line): + If: + a program name is known; + but + no file is being processed or the line number is negative, + then there was no space between the program name (with colon), + and the succeeding diagnostic message. + + Example: lookbib:fatal error: no databases + + Fixes . + +2018-11-05 G. Branden Robinson + + Make strip.sed operate only if given permission. + + * tmac/strip.sed: Do nothing whatsoever to any input file that + lacks a line matching "%beginstrip%". This implements a + contract between the macro file writer and the stripper script + {roff input is not parseable with crude weaponry like regular + expressions}. In practice, most of the changes performed by the + script were already in a block enforcing this. My changes: + - Stop unconditionally inserting a roff comment noting the + reader of stripping at line 2. Instead, replace the line + matching "%beginstrip%" with this comment if and only if it + is present. + - Stop deleting lines containing only the empty request if + they occur before "%beginstrip%". + - Tweak the wording of the roff comment. + - Remove comment within the sed script; see + https://lists.gnu.org/archive/html/groff/2017-11/msg00057.html + and the sed section of "Limitations of Usual Tools" in the + GNU Autoconf Manual. + + Invalidates . + +2018-11-04 G. Branden Robinson + + * tmac/an-old.tmac: When emitting diagnostics, report the name + of the macro file complaining, and the name and line number of + the input file at the time of trouble. Thanks to Bjarni Ingi + Gislason for part of the patch. + + Fixes and continues the + long process of fixing . + +2018-11-04 G. Branden Robinson + + * doc/meintro_fr.me: Add encoding hint to top of file so preconv + works correctly even if the build environment's encoding is not + UTF-8. Adapted from Bjarni Ingi Gislason's patch. Also add + long-form Emacs coding declaration at end of file. Vim's + auto-detection seems to be fine, so did not update its modeline. + + Fixes . + +2018-11-04 G. Branden Robinson + + * tmac/groff_man.7.man: Reorganize and largely rewrite to more + precisely document the macro package's behavior and to be more + helpful and accessible to man page writers who may never read + any other groff documentation. + +2018-10-25 G. Branden Robinson + + Clarify meaning of \p escape. Also make more explicit that line + adjustment for the .brp request and \p escape depends on the + current adjustment mode. + + * doc/groff.texi: Clarify that \p has effect at the next word + boundary. Thanks to Dave for pointing out the issue and + providing elucidating language. + + * man/groff.7.man: Similar, but terser. + + Fixes https://savannah.gnu.org/bugs/index.php?54894. + +2018-10-04 Deri James + + Savannah bug # 54812 + + * font/devpdf/util/BuildFoundries.pl: If a font is not found + report list of paths searched. + + Fix https://savannah.gnu.org/bugs/?54812 + +2018-10-10 Bertrand Garrigues + + Update 'gnulib' submodule. + + * gnulib: now points on dce8759f0f0236a860a3e68b63c5e99cc6f168f9 + from 'gnulib' repository. This fixes build error with glibc 2.28 + (see https://bugzilla.redhat.com/show_bug.cgi?id=1595702). + +2018-10-04 Deri James + + Savannah bug # 54779 + + * font/devpdf/Foundry.in: Recent ghostscript changed name + used for embedding groff font HNBI + + Fix https://savannah.gnu.org/bugs/?54779 + +2018-08-27 Ingo Schwarze + + * tmac/groff_www.7.man: Do not use .URL, .MTO, .FTP. + +2018-08-21 Ingo Schwarze + + Improve terminal rendering for a few special characters: + + * tmac/tty.tmac: add \[.j] (dotless j) + * tmac/tty-char.tmac: for \[a.], fall back to "." + * tmac/tty-char.tmac: add playing card suits + +2018-08-16 Ingo Schwarze + + * src/preproc/preconv/preconv.1.man: add -D to the SYNOPSIS + +2018-08-09 Ingo Schwarze + + * Makefile.am: correctly calculate MAJOR_VERSION etc. + +2018-06-19 Deri James + + Fixes to gropdf + + * src/devices/gropdf/gropdf.pl: Make default line width 0.4pt + to match grops. Use 'S' operator (stroke) rather than 's' (close + and stroke) when Dl command received. Improve switching between + text and graphic modes. + +2018-07-01 Bertrand Garrigues + + [me] paragraph with umlaut incorrectly rendered + + * tmac/e.tmac-u: workaround done by Werner LEMBERG . + + Fix https://savannah.gnu.org/bugs/?42191 + +2018-06-19 Deri James + + Add gropdf new features to NEWS file. + + * NEWS: new features. + +2018-05-29 Werner LEMBERG + + [dvi] Fix glyph map for `cmitt10'. + + Problem reported by Pali Rohár . + + http://lists.gnu.org/archive/html/groff/2018-05/msg00088.html + + * font/devdvi/texitt.map: New file. This is identical to + `textt.map' except the dollar glyph, which gets replaced by the + pound glyph. + + * font/devdvi/generate/Makefile (CWI): Use `texitt.map'. + + * font/devdvi/CWI: Regenerated. + +2018-05-07 G. Branden Robinson + + Improve diagnostics on bad hyphenation requests. + + * src/roff/troff/env.cpp: Add new HYPHEN_* symbols to anonymous + enum. + + * src/roff/troff/env.cpp (hyphenate_request): + - Warn about hyphenation request values that are completely + out of range. + - Report bad hyphenation request value in diagnostic messages. + +2018-04-28 G. Branden Robinson + + grap2graph: Parallelize changes with pic2graph. + + * contrib/grap2graph/grap2graph.sh: + - Refactor temp directory handling. + - Handle embedded whitespace in temp dir. + - Adapt to old convert(1) programs. + + * contrib/grap2graph/grap2graph.1.man: Make editorial/style + changes and minor corrections. + +2018-04-26 G. Branden Robinson + + eqn2graph: Remove -unsafe option. + + * contrib/eqn2graph/eqn2graph.sh: Unrecognize "-unsafe" option + and eliminate $groff_opts variable. As far as I can tell, this + option had no effect because (1) pic is not run on the input + stream (no -p argument to groff); (2) eqn doesn't support + "shelling out" as pic does; and (3) there is no way to embed + *roff requests inside a sequence of eqn commands. If I'm wrong, + let me know. + + * contrib/eqn2graph/eqn2graph.1.man: Undocument "-unsafe" + option. + +2018-04-26 G. Branden Robinson + + eqn2graph: Parallelize changes with pic2graph. + + * contrib/eqn2graph/eqn2graph.sh: + - Refactor temp directory handling. + - Handle embedded whitespace in temp dir. + - Adapt to old convert(1) programs. + + * contrib/eqn2graph/eqn2graph.1.man: Make editorial/style + changes and minor corrections. + +2018-04-25 G. Branden Robinson + + pic2graph: Refactor temp directory handling. + + * contrib/pic2graph/pic2graph.sh: Issue a diagnostic and give up + if the user's desired temporary directory does not exist. Also + document the Bashism $RANDOM and work around its absence. + +2018-04-25 G. Branden Robinson + + pic2graph: Handle embedded whitespace in temp dir. + + * contrib/pic2graph/pic2graph.sh: Quote shell variables having + to do with the temporary directory's location; without + quotation, temporary directory names with embedded whitespace + are wrongly handled. + +2018-04-24 G. Branden Robinson + + * doc/groff.texi: Bump end of copyright range to 2018. Werner + added substantial text this year about hyphenation. + +2018-04-24 G. Branden Robinson + + Set version to 1.22.4 in the few places that hard-code it. + + * arch/mingw/grap2graph.cmd: + * contrib/groffer/version.sh: + * doc/groff.texi: + * doc/webpage.ms: Bump from 1.22.3 to 1.22.4. + +2018-04-24 Deri James + + Restrict scaling factors to 3dp and better handle CR/LF in import. + + * src/devices/gropdf/gropdf.pl: Restrict scaling factors to 3dp + rounded. If pdf imported with pdfpic uses CR/LF line termination + ibclude XObject Image, length of stream out by 1. + +2018-04-23 G. Branden Robinson + + man pages: Shorten version footer. + + * **/*.man: Replace "Groff Version" with "groff" in the fourth + argument to .TH in all man pages. This suffices to keep that + part of the footer from overrunning the date, even in dirty + trees on 80-column terminals. + + Fixes https://savannah.gnu.org/bugs/index.php?53721. + +2018-04-23 G. Branden Robinson + + pic2graph(1): Make editorial/style changes and minor + corrections. + +2018-04-23 G. Branden Robinson + + pic2graph: Adapt to old convert(1) programs. + + * contrib/pic2graph/pic2graph.sh: Grep convert's -help output + for the string "-trim". If it is not found, the old method for + image trimming documented in pic2graph's man page, "-crop 0x0", + is used. I am motivated by the fact that the warning about this + in our man page is very old (10 years or more), and I wanted to + get rid of it. + + pic2graph emits a warning when performing this fallback, in the + event the ImageMagick and/or GraphicsMagick teams surprise the + world again. + + * contrib/pic2graph/pic2graph.1.man: Remove BUGS section, the + entire contents of which was dedicated to convert's change in + behavior. + +2018-04-22 G. Branden Robinson + + groff_man(7): Expand command synopsis section. + + This section now explains in detail how to write (and read) a + command synopsis. + +2018-04-12 Deri James + + Make PDFPIC behave the same whether -Tps or -Tpdf used. + + Previously the -Tpdf version did not cause a break nor position + to the line beneath the imported picture, whilst the -Tps + version did. + + * tmac/pdfpic.tmac: Corrected behavior. + + * NEWS: Explain the change of behaviour and how to reinstate + the previous behaviour using register PDFPIC_NOSPACE or the + environment variable GROFF_PDFPIC_NOSPACE. + +2018-03-27 Bertrand Garrigues + + Define a short version for data installation dir name. + + This is the full version stripped of any characters after the + third digit. Used for installation of font, macro and various + data (by default in /usr/local/share/groff). The various programs + and scripts still use the full version from gnulib script + 'git-version-gen' . + + * configure.ac (SHORT_VERSION): short version definition. + + * Makefile.am: use 'SHORT_VERSION' for 'docdir' and 'datasubdir' + definitions. + +2018-03-11 Bertrand Garrigues + + Remove doc/automake_migration_tests.txt + + Automake migration was completed long time ago and this file is no + longer needed. + +2018-03-11 Colin Watson + + Switch to Gnulib implementation of snprintf + + This is more actively maintained, straightforward to integrate now + that we have Gnulib integration, and simplifies groff's overall + licensing. + + * bootstrap.conf (gnulib_modules): Add `snprintf' and `vsnprintf'. + * configure.ac: Remove local checks for `snprintf' and `vsnprintf'. + * Makefile.am: Remove various comments related to local checks for + `snprintf' and `vsnprintf'. + * src/include/lib.h: Remove declarations of `snprintf' and + `vsnprintf'. + * src/libs/libgroff/libgroff.am (EXTRA_DIST): Remove + `src/libs/snprintf/snprintf.c'. + * src/libs/snprintf/snprintf.c: Remove. + + * LICENSES: Remove section about `src/libs/snprintf/snprintf.c'. + * MANIFEST: Remove entry for `src/libs/libxutil'. + +2018-03-09 Deri James + + PDF must not open in presentation mode. + + * src/devices/gropdf/gropdf.pl: When GROPDF_NOSLIDE=1 + passed do not set pdf to presentation mode. + +2018-03-09 Deri James + + Allow a "." to signify a missing parameter in .pdftransition + + * src/devices/gropdf/gropdf.1.man: Explain the .pdftransition + macro (and underlying '\X' command) accepts a "." to specify + a parameter retains its current value. + +2018-03-09 Colin Watson + + man pages: fix incorrect cross-referenced section + + * man/roff.7.man (FILE NAME EXTENSIONS): Correct reference to + groff_filenames(5). + +2018-03-09 Colin Watson + + mdate.sh: rewrite in Perl + + groff already requires perl to build. This version is much shorter + and easier to understand than the shell/awk version: we don't have + to worry about convincing ls to produce output that we can parse, + and we don't have to play games with the way that the same field may + contain either the year or the time depending on how old the file + is. + + While I'm at it, this version also adds `SOURCE_DATE_EPOCH' support + for reproducible builds: when `SOURCE_DATE_EPOCH' is set, files are + considered to have been last modified at that time. + + * mdate.sh: Rewrite in Perl, moving to ... + * mdate.pl: ... this new file. + * Makefile.am (EXTRA_DIST, .man): Update references. + +2018-03-09 Colin Watson + + Remove #! lines from non-executable files + + These are always invoked by the build system (either in-tree or via + the installed Makefiles) using the necessary program, so the #! + lines were unnecessary. They were harmless except that they caused + Debian's `lintian` tool to complain about installed non-executable + scripts. + + * font/devlj4/generate/special.awk: Remove #! line. + * font/devps/generate/symbol.sed: Likewise. + +2018-03-09 Colin Watson + + doc: stop generating W3C validation icons + + Debian's `lintian' tool says: + + These badges may be displayed to tell readers that care has been + taken to make a page compliant with W3C standards. Unfortunately, + downloading the image from www.w3.org might expose the reader's IP + address to potential tracking. + + I think the risk is a small one, but I also don't think the badges + are especially valuable, so it doesn't seem like much to ask to just + drop them at least for groff's own documentation. + + * doc/doc.am (.ms.html, doc/pic.html): Remove `-P-V' option. + +2018-03-01 Deri James + + Place pdf in presentation mode if new commands used. + + * src/devices/gropdf/gropdf: The new commands which + control page transitions should result in the pdf being + opened in presentation mode. + +2018-03-02 Werner LEMBERG + + Hyphenation exceptions in pattern files now obey `.hy' (#53196). + + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Mark + `\hyphenation' entries with a trailing space. + (hyphen_trie::insert_hyphenation): Updated. + (hyphenate): Make `\hyphenation' entries obey `.hy' restrictions. + + * doc/groff.texi (.hy): Updated. + +2018-03-01 Werner LEMBERG + + Adjust `.hy' values. + + In most cases hyphenation constraints were too strict. The now + selected values reflect the parameters used for the generation of + the (TeX) hyphenation patterns. + + * tmac/an-old.tmac, tmac/cs.tmac, tmac/de.tmac, tmac/doc-common-u, + tmac/e.tmac-u, tmac/fr.tmac, tmac/s.tmac, tmac/sv.tmac: Fix `.hy', + `\n[HY]', and `\n[doc-hyphen-flags]' values. + + * doc/groff.texi, tmac/groff_man.7.man, tmac/groff_ms.7.man, NEWS: + Updated. + +2018-03-01 Werner LEMBERG + + Fix some problems related to hyphenation. + + Introduce values 16 (allow hyphenation before last character) and 32 + (allow hyphenation after first character) to the `hy' request + (#48904). + + Really fix problem reported in issue #48904. + + Fix #53243, which is a regression introduced in 2016-09-09. + + * src/roff/troff/env.cpp (HYPHEN_LAST_CHAR, HYPHEN_FIRST_CHAR): New + enumeration values. + (hyphenate_request): Check for contradicting values. + (environment::hyphenate_line): Fix minimum word length considered + for hyphenation. + (environment::print_env): Updated. + (hyphenate): Fix and extend logic. The original patch to handle + #48904 was bad. + + * doc/groff.texi, man/groff_diff.7.man, NEWS: Updated. + +2018-03-01 Deri James + + Add page transitions to pdfs created with gropdf. + + * src/devices/gropdf.pl: Handle new '\X' commands to support page + transitions in presentation mode pdfs. These commands are a subset + of the commands used in present.tmac allowing slideshows to be + directly produced from -Tpdf without using postscript -> gpresent.pl + -> ghostscript. + + * tmac/pdf.tmac: New macros '.pdfpause' and '.pdftransition' to + support page transitions. + + * src/devices/gropdf.1.man: Document the '\X' commands supported. + +2018-03-01 Werner LEMBERG + + Use $(AM_V_GEN) and $(AM_V_P) to silence even more file generation. + + * font/devpdf/devpdf.am (BuildFoundries, DESC, Foundry, + build_font_files): Do it. + +2018-02-28 Werner LEMBERG + + Use $(GROFF_V) to silence documentation creation. + + * Makefile.am (GROFF_V): Define. + + * doc/doc.am (.me.txt, .me.ps, .ms.html, .ms.txt, .ms.ps, pic.html, + webpage.html): Use $(GROFF_V). + +2018-02-28 Werner LEMBERG + + Use $(AM_V_GEN) to silence file generation. + + * Makefile.am (.man), contrib/eqn2graph/eqn2graph.am (eqn2graph), + contrib/grap2graph/grap2graph.am (grap2graph), contrib/pic2graph.am + (pic2graph), src/devices/gropdf/gropdf.am (gropdf, pdfmom), + src/preproc/eqn/eqn.am (neqn), src/roff/grog/grog.am (grog), + src/roff/nroff/nroff.am (nroff), src/utils/afmtodit/afmtodit.am + (afmtodit), font/devascii/devascii.am (DEVASCIIFONTSFILES, DESC), + font/devcp1047/devcp1047.am (DEVCP1047FONTSFILES, DESC), + font/devhtml/devhtml.am (DEVHTMLFONTSFILES, DESC), + font/devlatin1/devlatin1.am (DEVLATIN1FONTSFILES, DESC), + font/devutf8/devutf8.am (DEVUTF8FONTSFILES, DESC), + font/devps/devps.am (DESC, prologue, zapfdr.pfa, symbolsl.pfa), + font/devdvi/devdvi.am (DESC), font/devlbp/devlbp.am (DESC), + font/devlj4/devlj4.am (DESC): Do it. + +2018-02-28 Werner LEMBERG + + * configure.ac: Activate silent Makefile rules. + +2018-02-28 Werner LEMBERG + + Minor compilation warnings. + + * src/devices/xditview/draw.c: Don't declare `MaxFontPosition'. + + * src/roff/troff/input.cpp (psbb_locator::context_args): Avoid + shadowing of `buf'. + +2018-02-28 Werner LEMBERG + + * src/roff/troff/env.cpp: s/HYPHEN_/HYPHEN_NOT/ for clarification. + +2018-02-26 Bertrand Garrigues + + Update installation doc. + + * INSTALL.REPO: mention that 'pkg-config' is a dependency. + + * INSTALL.extra: add dependency 'makeinfo' and optional + dependencies 'pkg-config' and 'uchardet'. + + * TESTS: move to doc/automake_migration_tests.txt + + * INSTALL.gen: remove, this file is redundant with the 'INSTALL' + file from gnulib. + +2018-02-02 Bertrand Garrigues + + Update 'gnulib' submodule. + + * gnulib: now points on cf56f8f618c48cfadd2499ced58574633d12f129 + from 'gnulib' repository. + +2018-02-02 Bertrand Garrigues + + Use gnulib script 'git-version-gen' to define groff's version + + * bootstrap.conf: add 'git-version-gen' script. + + * configure.ac: suppress 'GROFF_VERSION_STRING' and replace it by + the script. If the current commit corresponds to a tag, then the + version is simply the tag name. Otherwise the version has the + format: --. The + version is now stored in '.version'. + + * REVISION: removed. + + * VERSION: removed. + + * Makefile.am: define 'MAJOR_VERSION', 'MINOR_VERSION' and + 'REVISION'. + + * src/libs/libgroff/libgroff.am: use 'MAJOR_VERSION', + 'MINOR_VERSION' and 'REVISION', add dependency on '.version'. + + * src/roff/troff/troff.am: ditto. + + * contrib/mom/om.tmac-u (short_revision): new string that extracts + the first digit of the revision, to be used when checking groff + version. + +2018-01-18 Deri James + + On reflection using an array for Filter is not optimal. + + * src/devices/gropdf.pl: revert single line from commit + 18fd1fd0bf05eb9a5ba0d2be1a655a044662a8bf. + +2018-01-17 Deri James + + All values should be 3 decimals + + * src/devices/gropdf.pl: for values approaching zero values + in the for 0.nnnnnnE-nn could be written, not valid syntax for + PDF. Make all values rounded to 3 decimals, becomes 0.000. + + Also changed stream Filter dictionary entry to an array. + +2018-01-14 Bertrand Garrigues + + Fix tarball generation ('make distcheck' failed) + + * src/devices/xditview/xditview.am: add .h created by commit + 382ab4af269a1dea422c8f9bb5c67a065d026deb to EXTRA_DIST + + * contrib/mm/mm.am: restore distribution of files removed by + commit 445bf58765b759546e238a235651eb0bf5b34325. + +2018-01-13 Ingo Schwarze + + Makefile.am: Re-add -F and -M flags needed to build out of src. + +2018-01-13 Ingo Schwarze + + [mdoc]: rewrite the implementation of the .Lk macro + + * tmac/doc.tmac-u (Lk): Rewrite. + + The old implementation was written before the big mdoc + rewrite for groff-1.17. In contrast to most other macros, + it was never updated to use the new techniques. + This new implementation makes .Lk callable, makes trailing + punctuation work in the normal way, and makes the style of + the implementation consistent with other macros. + + It also removes the feature of automatically switching + between in-line and displayed rendering depending on the + length of the link because that was inconsistent across + output modes and counter-intuitive, resulting in ugly + output for many existing real-world manual pages. + It now always renders in-line. Use .D1 Lk where desired. + + Merging http://savannah.gnu.org/bugs/?52849 + OK wl@gnu, jmc@openbsd, bentley@openbsd + +2017-12-14 G. Branden Robinson + + man pages: Comment compatibility-mode switching. + + The '.do' and '.cp' requests (both groffisms) are some of the + more obscure features of groff's own man page corpus. + Consequently, they get cargo-culted around, within and outside + groff. Thanks to Werner Lemberg for the discussion, which + revealed (to me) that groff ships with compatibility mode on by + default on Solaris 10 and 11. + + Fix bug https://savannah.gnu.org/bugs/?52444. + +2017-11-30 G. Branden Robinson + + * src/roff/troff/input.cpp: + Make writers to stderr identify themselves. + + * font/devpdf/util/BuildFoundries.pl: + Same; also refactor all diagnostics into Notice(), Warn(), and + Die() functions, which delegate their common message-printing to + Msg(). + + Fix part of bug https://savannah.gnu.org/bugs/?52463. + +2017-11-21 G. Branden Robinson + + man pages: Fix compatibility-mode problems. + + * contrib/gperl/gperl.1.man: Use idiomatic .BI macro instead of + leading an input line with a font escape followed by a dot, + the interpretation of which differs based on compatibility + mode. + + * src/preproc/soelim/soelim.1.man: Make .mso request only after + compatibility mode is turned off. + +2017-11-19 G. Branden Robinson + + * Makefile.am: Protect arguments to "tr" from globbing. + + Prevents errors from tr during man page generation and possible + incorrect program prefixing in those pages if, for example, some + doofus has directories called "A", "B", ... hanging around in + the build tree. + +2017-11-18 G. Branden Robinson + + * tmac/groff_mdoc.7.man: Use unstripped symbol names. + + Fix bug https://savannah.gnu.org/bugs/?52442. + +2017-11-18 G. Branden Robinson + + * src/include/.gitignore: Ignore config.hin~ files. + +2017-11-18 Bjarni Ingi Gislason + + test-groff.in: Enable backtraces and all warnings by default. + + Fix bug https://savannah.gnu.org/bugs/?51482. + +2017-11-18 G. Branden Robinson + + * tmac/**: Migrate macro package diagnostics away from `quotes'. + +2017-11-15 G. Branden Robinson + + * src/libs/libgroff/new.cpp: Quieten compiler warning. + + Define sized version of overloaded delete operator. Duplicate + code from unsized delete operator because simply calling through + to it provokes another warning, -Wdelete-incomplete. + + Fix rest of https://savannah.gnu.org/bugs/?52335. + +2017-11-12 Deri James + + Better handle glyphs in font positions > 255 + + * src/devices/gropdf/gropdf.pl: Improve handling + when glyphs above 255 are used. + +2017-11-12 Deri James + + gropdf should load ALL 'download' files + + * src/devices/gropdf/gropdf.pl: only the first 'download' file + found was loaded, it should load all found. + +2017-11-12 G. Branden Robinson + + * src/libs/libxutil/DviChar.c: Initialize "buckets" field of + structs. + + Resolves missing-field-initializers warnings. + +2017-11-12 G. Branden Robinson + + * tmac/strip.sed: Stop rewriting symbol names. A substitution + originally intended to strip the "doc-" prefix off of mdoc macro + and string names unintentionally caught some mom stuff. + Harmlessly in this instance, but with potentially surprising + future effects. Remove (only) this substitution per discussion + in + https://lists.gnu.org/archive/html/groff/2017-11/msg00055.html + et sequentia. + +2017-11-11 Bjarni Ingi Gislason + + * src/devices/grolbp/lbp.cpp (lbp_printer::setfillmode): Address + misleading indentation warning. + + * src/roff/troff/mtsm.cpp (mtsm::push_state, mtsm::pop_state): + Same. Only flush standard error if we just wrote to it, + instead of unconditionally. + + Fix bug https://savannah.gnu.org/bugs/?51483. + +2017-11-11 G. Branden Robinson + + * src/utils/xtotroff/xtotroff.c: Mark private function static. + +2017-11-11 G. Branden Robinson + + * src/libs/libxutil/xmalloc.c: Quieten gcc warning. Mollify + -Wmissing-prototypes for xmalloc() in single-function file. + +2017-11-11 G. Branden Robinson + + gxditview: Migrate extern declarations to headers. + + Also mark some private functions as static. + +2017-11-11 Bjarni Ingi Gislason + + src: Declare function protypes where necessary. + + Fix bug https://savannah.gnu.org/bugs/?51513. + +2017-11-10 Bjarni Ingi Gislason + + mom: Abort early with diagnostic in compatibility mode. + + Fix bug https://savannah.gnu.org/bugs/?52333. + +2017-11-10 G. Branden Robinson + + * contrib/**: Migrate diagnostics away from `quotes'. + +2017-11-09 G. Branden Robinson + + * src/**: Migrate diagnostics away from `these quotes'. + + Fix bug https://savannah.gnu.org/bugs/?52374. + +2017-11-07 G. Branden Robinson + + * tmac/strip.sed: Remove nilpotent capture from address. + +2017-11-05 Bertrand Garrigues + + `preconv': fix usage of lib `uchardet'. + + * src/preproc/preconv/preconv.cpp (detect_file_encoding): Fix + usage of uchardet 0.0.1, which may fail but return an empty string + instead of a null pointer, and fix some incorrect error + managements that might cause memory leaks. + +2017-11-05 G. Branden Robinson + + * font/devpdf/devpdf.am: Silence warning from grep during clean. + +2017-11-04 G. Branden Robinson + + * Makefile.am: Drop unnecessary -F and -M flags from pdfmom + call. + +2017-11-02 Bjarni Ingi Gislason + + man/groff_diff.7.man: Correct the explanation of the request + ".itc"--it was backwards. + + Fix bug https://savannah.gnu.org/bugs/?51502. + +2017-11-02 Bjarni Ingi Gislason + + test-groff.in: Recognize additional contrib tmacs. + + Fix bug https://savannah.gnu.org/bugs/?51598. + +2017-11-02 G. Branden Robinson + + * Makefile.am: Force build to generate test-groff script. + +2017-11-02 G. Branden Robinson + + * font/devpdf/devpdf.am: Silence warning from grep during build. + +2017-11-02 G. Branden Robinson + + * doc/doc.am: Fix build of pic.html from clean tree. + +2017-11-02 G. Branden Robinson + + * m4/groff.m4: Kill whitespace in macro diagnostic. + +2017-11-01 Bjarni Ingi Gislason + + src/roff/grog/subs.pl: Fix typo in usage message. + + Fix bug https://savannah.gnu.org/bugs/?51540. + +2017-10-28 Bjarni Ingi Gislason + + m.tmac: Fix some formatting and textual issues. + * Protect full stops in strings \*[Letns!{1,2,10,11}]. + * Remove extraneous whitespace from string \*[Pg_type!1]. + + Fix bug https://savannah.gnu.org/bugs/?51610. + +2017-10-22 Bjarni Ingi Gislason + + refer-mm.tmac: Protect full stop in abbreviation of "ed.". + + Fix bug https://savannah.gnu.org/bugs/?51611. + +2017-10-22 G. Branden Robinson + + * src/preproc/html/pre-html.cpp: Fix grammar in usage message. + When used attributively, e.g. as an adjectival phrase, + "command-line" should be hyphenated. + +2017-10-22 Bjarni Ingi Gislason + + pdfpic: Suppress warning if in compatibility mode. + + Fix bug https://savannah.gnu.org/bugs/?51945. + +2017-10-22 Bjarni Ingi Gislason + + www.tmac: Rename font 'C' to 'CR'; define 'CR'. + + The font name 'C' ('CW') is not a part of groff's fonts. + + Fix bug https://savannah.gnu.org/bugs/?51417. + Also see https://savannah.gnu.org/bugs/?51426. + +2017-10-04 Bertrand Garrigues + + Fix build on MacOS X + + See https://savannah.gnu.org/bugs/?49651 + +2017-09-11 Bertrand Garrigues + + Build from git: Make `configure' fail if `yacc' is not found. + + * m4/groff.m4 (GROFF_PROG_YACC): look for (in this order) `byacc', + `bison -y', `yacc'. Set `YACC' to `missing' is nothing is found + and generate an error. Don't generate an error if build is not + done from git as tarball already distribute files generated by + `yacc'. + +2017-09-02 Bertrand Garrigues + + Update `gnulib' submodule with latest version. + + * gnulib: now points on 07a187be7f66d3ced66587405f18205971c762e9 + from `gnulib' repository. + +2017-09-02 Bertrand Garrigues + + Fix .gitignore files for in-source build. + + Fix bug https://savannah.gnu.org/bugs/?51415. + +2017-09-01 Bertrand Garrigues + + Fix build on MacOS X + + * Makefile.am: define `SED' command with LANG and LC_ALL set to C. + * contrib/mm/mm.am: use it. + * doc/doc.am: Ditto. + + Fix bug https://savannah.gnu.org/bugs/?49649 + +2017-08-30 Colin Watson + + `BuildFoundries' should not be installed. + + * font/devpdf/devpdf.am: remove installation of generated script + `BuildFoundries'. + +2017-08-30 Bjarni Ingi Gislason + + pic2graph.1.man: Fix wrong macro for e-mail addresses. + + Fix bug https://savannah.gnu.org/bugs/?51110. + +2017-08-30 Bjarni Ingi Gislason + + groff_diff(7): Remove a repeated word. + + Fix bug https://savannah.gnu.org/bugs/?51077. + +2017-08-30 Bjarni Ingi Gislason + + groff_tmac(5): Fix double dot before request. + + Fix bug https://savannah.gnu.org/bugs/?51070. + +2017-08-28 Bjarni Ingi Gislason + + groff.texi: remove repeated words. + + Fix bug https://savannah.gnu.org/bugs/?51046. + +2017-08-28 Bjarni Ingi Gislason + + groff_man(7) manual page: Fix explanation of the ".itc" request. + + See bug at https://savannah.gnu.org/bugs/?51043. + +2017-08-28 Ingo Schwarze + + groff_man(7) manual page: recommendations for escape sequences. + + See bug at https://savannah.gnu.org/bugs/?51021. + +2017-08-28 Ingo Schwarze + + groff_char(7) manual: fix table "7-bit Character Codes" + + See bug at https://savannah.gnu.org/bugs/?51020. + +2017-08-28 Bertrand Garrigues + + Fix troff.1 misleading definition of -w all. + + See bug at https://savannah.gnu.org/bugs/?47784. Suggested by Kaz + Kylheku . + +2017-08-25 Bjarni Ingi Gislason + + `preconv --version' crashes. + + See bug at: https://savannah.gnu.org/bugs/?51587. + + * src/preproc/preconv/preconv.cpp: Add a missing comma in the + argument list of "printf". + +2017-08-25 Bjarni Ingi Gislason + + Fix bug: `.itc' request breaks subsequent `.it' requests. + + See bug at: https://savannah.gnu.org/bugs/?51376. Using `.itc' + lets all later uses of `.it' behave like `.itc', that is, + interrupted text line ending with \c is not counted as a separate + line. + + * env.cpp: Restore input_trap state to normal when '.it' is + called. + +2017-08-25 Bjarni Ingi Gislason + + Fix a part of a virtual (pseudo) structure in "tty.tmac". + + * tmac/tty.tmac: Fix warning: ".../git/groff/tmac/tty.tmac:19: + warning: unbalanced .el request" + +2017-08-25 Ingo Schwarze + + `tty-char.tmac': focus on meaning rather than graphical shape + + * tmac/tty-char.tmac: add ASCII renderings for six missing + mathematical symbols + +2017-08-22 Ingo Schwarze + + `tty-char.tmac': focus on meaning rather than graphical shape + + * tmac/tty-char.tmac: Switch the policy from trying to imitate the + characters' graphical shapes, which resulted in unintelligible + renderings in many cases, to transliterations conveying the + characters' meanings. One benefit is making these characters + usable for portable manual pages. + +2017-08-21 Deri James + + 'gropdf' does not correctly load new ghostscript fonts + + See bug at: https://savannah.gnu.org/bugs/?50989. Since ghostscript + 9.21 the fonts supplied have changed from .pfb to .pfa type (with a + raw binary section). These failed to be properly loaded. + + * src/devices/gropdf/gropdf: Changes to handle raw binary section in + a .pfa type font. + +2017-08-18 Bertrand Garrigues + + `pdfmom' man page incorrectly displayed. + + * src/devices/gropdf/pdfmom.1.man: Remove `]' character mistakenly + added at the beginning of the file. + +2017-08-18 Bertrand Garrigues + + Incorrect font name for CBI in Foundry.in. + +2017-08-15 Ingo Schwarze + + Fix build if `configure' check for `fprintf-posix' fails. + + See bug at: https://savannah.gnu.org/bugs/?51554. If tests for + posix compliance of fprintf from `gnulib_m4/fprintf-posix.m4' + fail, a replacement function of `fprintf' is used. Consequently, + all executables that use this function must link against the + gnulib (`libgnu.a'). The bug was introduced by commit + fa41eeba06987a12bc0434f8b51896d4618a3997. + + * src/devices/xditview/xditview.am + * src/preproc/eqn/eqn.am + * src/preproc/pic/pic.am + * src/preproc/preconv/preconv.am + * src/preproc/refer/refer.am + * src/preproc/soelim/soelim.am + * src/preproc/tbl/tbl.am + * src/utils/addftinfo/addftinfo.am + * src/utils/hpftodit/hpftodit.am + * src/utils/indxbib/indxbib.am + * src/utils/lkbib/lkbib.am + * src/utils/lookbib/lookbib.am + * src/utils/pfbtops/pfbtops.am + * src/utils/tfmtodit/tfmtodit.am + * src/utils/xtotroff/xtotroff.am: link against libgnu.a + + * INSTALL.REPO: recommend the autoconf and automake versions used + during automake migration rather than the minimum versions. + +2017-08-04 Deri James + + See bug at: https://savannah.gnu.org/bugs/?51568 + + * src/devices/gropdf/gropdf: Further 'fix' to handle those octal + characters. See comment #5 - thank you Bjarni. + +2017-07-31 Deri James + + See bug at: https://savannah.gnu.org/bugs/?51568 + + * src/devices/gropdf/gropdf: previous 'fix' was too narrow, all + '\' characters should be escaped. Also there was an unwanted + interaction with code in routine 'do_t'. Sometimes, do_C, when + the named glyph is mapped to a chr < 32, this is encoded as octal + \nnn, so in this case the '\' must not be escaped. + +2017-07-25 Deri James + + If input text contained string which could be interpreted as + escaped octal (\ddd) a pdf viewer would interpret as an octal + character. See bug at: https://savannah.gnu.org/bugs/?51568 + + * src/devices/gropdf/gropdf: protect text which resembles \ddd + by escaping with extra '\'. + +2017-07-12 Bertrand Garrigues + + Use uchardet library in `preconv' to detect input file encoding + + * m4/groff.m4 (GROFF_UCHARDET): new macro that use pkg-config to + check if uchardet library is available and define new option + `--with-uchardet': + - If `yes' is passed and uchardet is not found, configure fails. + - If `no' is passed we don't use uchardet and don't display any + warning. + - If `auto' (or any other option) is passed of if --with-uchardet + is not passed, we use uchardet if available, otherwise the build + goes on but a warning is displayed at the end of the configuration + phase. + + * configure.ac: use pkg-config and `GROFF_UCHARDET' to detect the + presence of uchardet library. + + * src/preproc/preconv/preconv.am: link against uchardet library if + available. + + * src/preproc/preconv/preconv.cpp (detect_file_encoding): new + function that uses uchardet library to detect input file encoding. + (do_file): `detect_file_encoding'. + + * src/preproc/preconv/preconv.1.man: update `preconv' + documentation. + + See https://savannah.gnu.org/bugs/?51330 + +2017-07-12 Bertrand Garrigues + + Add gnulib module fprintf-posix + + * bootstrap.conf: do it. + + * Fix compilation in some files that needed inclusion of + `config.h'. + + See https://savannah.gnu.org/bugs/?51330 + +2017-05-09 Bertrand Garrigues + + Package `ghostscript' 9.21 renamed some fonts installed in + `/usr/share/ghostscript/9.21/Resource/Font', e.g. URWGothicL-Demi + renamed to URWGothic-Demi, and dropped the installation of URW + fonts in `/usr/share/fonts/type1/gsfonts/', breaking font + generation in `font/devpdf/util/BuildFoundries.pl'. + + * m4/groff.m4 (GROFF_URW_FONTS_PATH): New option + `--with-urw-fonts-dir' to pass a custom path to URW fonts. + (GROFF_URW_FONTS): search the presence of URW fonts by checking if + file `a010013l.pfb' exists in the paths given by `gs -h', in the + default paths used in `Foundry.in' and in the path given with + option `--with-urw-fonts-dir'. + (GROFF_URW_FONTS_CHECK): print a warning at the end of the + configuration phase if no URW fonts were found. + + * configure.ac: call new macros `GROFF_URW_FONTS_PATH', + `GROFF_URW_FONTS' and `GROFF_URW_FONTS_CHECK'. + + * font/devpdf/Foundry.in: add new basic fonts names and pass + custom URW fonts path `urwfontsdir'. + + * font/devpdf/devpdf.am: substitute `urwfontsdir' in `Foundry' + generation. + + Fixes https://savannah.gnu.org/bugs/?50786 + +2017-05-04 Deri James + + Fixes for gropdf + + * src/devices/gropdf/gropdf.pl: Escape '(' and ')' if + used in a bookmark, and ignore relative move 'h' if + followed by absolute move 'H' in groff intermediate output. + +2017-04-29 Ingo Schwarze + + groff_char(7): improve description of ASCII characters + + * man/groff_char.7.man: improve description of ASCII + characters that do not render as themselves + + See https://savannah.gnu.org/bugs/?50898 + +2017-04-28 Osamu Sayama + + lkbib with empty file dumps core + + * src/libs/libbib/index.cpp: Test if argument to malloc(3) + is zero. + + See https://savannah.gnu.org/bugs/?48433 + +2017-04-28 David Gilman + + Typo in groff.texi + + * doc/groff.texi: Dp instead of DP used + + https://savannah.gnu.org/bugs/index.php?42251 + +2017-04-28 Rich Burridge + + "grops -c a" dumps core + + * src/devices/grops/ps.cpp: conversion specifier %s changed + to %1 (errprint() uses special syntax different from + printf(3)) + + https://savannah.gnu.org/bugs/?42190 + +2017-04-28 Bjarni Ingi Gislason + + Macro "itc" is needed to make escape "\c" useful + + * tmac/an-old.tmac: .it changed to .itc + + https://savannah.gnu.org/bugs/?42907 + +2017-04-28 Bjarni Ingi Gislason + + First italic correction (\,) is absent in macros IR and IB + + * tmac/an-old.tmac: Italic correction added + + https://savannah.gnu.org/bugs/?42906 + +2017-04-13 Ingo Schwarze + + * tmac/doc.tmac-u: Make .Lk with more than two arguments + mdoc(7) conform + + Use the second and following arguments as the link text. + + Do not mark up the following colon with \fI. + + Handle any number of trailing delimiters. + + Problem reported by Anthony Bentley , + fixed by Ingo Schwarze . + + https://savannah.gnu.org/bugs/?50789 + +2017-04-12 Werner LEMBERG + + Update German hyphenation patterns. + + * tmac/de.tmac: Add more hcode values. + No longer use `hyphenex.det'. + * tmac/hyphen.den, tmac/hyphen.det: Updated to `dehyph-exptl-0.41'. + * tmac/hyphenex.det: Removed, no longer needed. + * tmac/tmac.am (TMACNORMALFILES): Updated. + +2017-04-10 Ingo Schwarze + + * tmac/doc.tmac-u: Punctuation handling of .Lk fixed + + The implementation of the groff_mdoc(7) .Lk (hyperlink) macro + contains code to make sure that the second argument is not + punctuation before treating it as a link text, but the test + can never lead to the result "punctuation" because the + initialization of the global variable doc-width was missing + before the call to doc-get-arg-type. Consequently, even "." + was not recognized as punctuation. + + Problem reported by Anthony Bentley , + fixed by Ingo Schwarze . + + https://savannah.gnu.org/bugs/?50771 + +2017-04-07 Werner LEMBERG + + * tmac/hyphenex.us: Updated to current release from TeXLive. + +2017-02-23 Bertrand Garrigues + + * bootstrap: update with latest version from gnulib. + * gnulib: update the git submodule with latest version (commit + 4084b3a1094372b960ce4a97634e08f4538c8bdd from gnulib). + +2017-02-18 Colin Watson + + * src/preproc/eqn/main.cpp: Define EQ and EN if they are not already + defined, to appease "groff -wmac". + * src/preproc/pic/main.cpp: Likewise for PS and PE. + + Fixes: http://bugs.debian.org/495713 + +2017-02-16 Ingo Schwarze + + mdoc %T: use typographic quotes + + * tmac/doc.tmac-u: Changed \*[q] to \*[Lq] and \*[Rq] + + Citing Anthony J. Bentley: + + The below patch causes -mdoc to generate typographic quotes + around a %T (reference title) instead of straight quotes. + + I also submitted similar diffs to mandoc and heirloom troff + (which haven't been committed yet). It would be nice for + the major implementations not to differ here, and the change + is trivial. + + It's worth noting that groff's refer(1) already uses typographic + quotes around %T with my -ms documents. + + https://savannah.gnu.org/bugs/?43553 + http://comments.gmane.org/gmane.comp.tools.mdocml.devel/723 + https://github.com/n-t-roff/heirloom-doctools/pull/6 + +2017-02-16 Ingo Schwarze + + mdoc \*[Lq], \*[Rq]: map to \[lq], \[rq] for all terminal + devices + + * tmac/doc-nroff-u: .ds Lq \[lq], .ds Rq \[rq] + + If you use \[lq] and \[rq] directly in your document, the + quotes already render nicely for all terminal devices: + as U+201C and U+201D for devutf8 and as ASCII 0x22 (") for + devascii and devlatin1. + So it is not quite clear why doc-nroff should avoid + \[lq] and \[rq] when resolving \[Lq] and \[Rq] for devascii + and devlatin1. Quite to the contrary, many people seem to + consider "``" and "''" ugly renderings because they look + unbalanced. + + See + + https://savannah.gnu.org/bugs/?43554 + +2017-02-16 Bjarni Ingi Gislason + + Use the traditional (portable) method of using a backslash + after '\{' + + * contrib/mm/m.tmac, tmac/e.tmac-u, + tmac/s.tmac: Add '\' after "\{" + + See + + https://savannah.gnu.org/bugs/?49917 + +2017-02-16 Bjarni Ingi Gislason + + Use explicit \s±n after a variable string instead of \s0 + + * tmac/e.tmac-u: Change \s0 to \s+3 + + See + + https://savannah.gnu.org/bugs/?49915 + +2016-12-29 Deri James + + Remove duplicate '-e' from gropdf manual. + + * src/devices/gropdf/gropdf.1.man: Remove first '-e'. + +2016-11-25 Deri James + + Remove incorrect info from gropdf manual. + + * src/devices/gropdf/gropdf.1.man: Remove references + to postscript. + +2016-11-22 George HELFFRICH + + [me]: Fix alignment of `(c' macro (#43306). + + * tmac/e.tmac-u ((c): Properly initialize environment. + +2016-11-20 George HELFFRICH + + [me] Fix vertical spacing of `(b' macro (#42217). + + * tmac/e.tmac-u (@k): Apply pre-spacing conditionally. + ()b): Updated. + +2016-11-19 George HELFFRICH + + [me] Fix remaining bugs with line numbering (#49650). + + * tmac/e.tmac-u (nm): Redefine. + (.n1, .n2): Update so all environments affected. + (.ip): Fix double numbering. + (.)c, .)l): Restore numbering after diversion included. + +2016-11-01 Deri James + + gropdf remaps characters to position 13 (#48986). + + * src/devices/gropdf/gropdf: Do not remap anything to chr(13). + +2016-11-01 Deri James + + pdfmom was not including $preconv in the initial groff run. + + * src/devices/gropdf/pdfmom.pl: Include $preconv in first + groff run which resolves forward pdf references. + +2016-10-05 Ingo Schwarze + + * tmac/doc.tmac-u: Simplify behaviour of .Bl -tag + * tmac/groff_mdoc.7.man: Update documentation to the new + behaviour of .Bl -tag + + If an mdoc(7) .Bl -tag macro lacks the -width argument, the + body indentation is calculated separately for each child .It + macro. Neither the Heirloom nor the mandoc(1) implementation + of the mdoc(7) language show such behaviour; both use a + constant default width for the whole list in that case. + + Apart from doubts whether lists with variable indentation are + typographically sound in the first place, support for variable + widths in groff is so restricted that it's practically + useless. For each .It, the width will be the default width of + whatever happens to be the leading macro after the .It, or of + .No if .It is not followed by a macro. + + See + + https://savannah.gnu.org/bugs/index.php?49272 + + and + + http://lists.gnu.org/archive/html/groff/2016-10/msg00006.html + + +2016-09-09 Werner LEMBERG + + * tmac/sv.tmac: Fix `.hy' settings (#48904). + + The Swedish patterns allow hyphenation after the first character and + before the last two characters, not vice versa. + +2016-09-09 Werner LEMBERG + + troff: Fix hyphenation (#48904). + + This commit fixes two bugs present from the very beginning: troff + (a) didn't allow to hyphenate words shorter than 4 characters + (ignoring `.hy' settings), and (b) never tried to hyphenate after + the first character due to wrong handling of the `.hy' settings. + + * src/roff/troff/env.cpp (environment::hyphenate_line): Use + hyphenation flags to determine the minimum word length considered + for hyphenation. + (hyphenate): Fix handling of `HYPHEN_FIRST_CHARS'. + +2016-07-29 Colin Watson + + Implement `SOURCE_DATE_EPOCH' for reproducible builds. + + * src/include/curtime.h: New file. + * src/libs/libgroff/curtime.cpp: New file. + * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Add + src/libs/libgroff/curtime.cpp. + + * src/roff/troff/input.cpp (init_registers): Use `current_time' + instead of `time(0)'. + * src/devices/grohtml/post-html.cpp + (html_printer::do_file_components): Likewise. + (html_printer::~html_printer): Likewise. + * src/devices/grops/ps.cpp (ps_printer::~ps_printer): Likewise. + * src/devices/gropdf/gropdf.pl: Use `$ENV{SOURCE_DATE_EPOCH}` if + available in preference to `time`. + + * doc/groff.texi (Environment): Document `SOURCE_DATE_EPOCH'. + * src/devices/grohtml/grohtml.1.man (ENVIRONMENT): Likewise. + * src/devices/gropdf/gropdf.1.man (ENVIRONMENT): Likewise. + * src/devices/grops/grops.1.man (ENVIRONMENT): Likewise. + +2016-04-19 Carsten Kunze + + eqn: Fix problem with explicit spacing before unary operator + + * src/preproc/eqn/list.cpp (list_box::compute_metrics): Change + item spacing type from BINARY to ORDINARY also when previous + type is SUPPRESS_TYPE. + + As reported in + + http://lists.gnu.org/archive/html/groff/2016-04/msg00024.html + + by Douglas McIlroy + + an implicit space is added between an unary operator and its + operand when an explicit space is put before the unary + operator. Unary operators are initially set up as binary. + Depending on the preceding element their type can be changed + to unary. This did not happen when an explicit space ('~' or + '^') had been before that operator. + +2016-02-16 Bálint Réczey + + Fix many malloc/new vs. free/delete/delete[] mismatches (#47164) + + * src/devices/grops/ps.cpp (ps_font::~ps_font, + ps_printer::define_encoding): Use `free'. + * src/devices/grops/psrm.cpp (resource::~resource, + resource_manager::output_prolog, resource_manager::supply_resource, + resource_manager::read_download_file): Ditto. + + * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Ditto. + + * src/libs/libgroff/searchpath.cpp + (search_path::open_file_cautious): Ditto. + + * src/libs/libgroff/string.cpp: Include `stdlib.h'. + (string::extract): Use `malloc'. + + * src/preproc/eqn/box.cpp (quoted_text_box::~quoted_text_box): Use + `free'. + + * src/preproc/eqn/lex.cpp (definition::~definition, + macro_input::~macro_input, top_input::~top_input, do_definition): + Ditto. + + * src/preproc/eqn/main.cpp (main): Ditto. + + * src/preproc/eqn/other.cpp: Include `stdlib.h'. + (size_box::~size_box, font_box::~font_box): Use `free'. + + * src/preproc/eqn/text.cpp: Include `stdlib.h'. + (box::set_spacing_type, special_char_box::~special_char_box, + split_text): Use `free'. + + * src/preproc/grn/main.cpp (conv): Use `free'. + + * src/preproc/html/pre-html.cpp (get_resolution): Ditto. + + * src/preproc/pic/lex.cpp (macro_input::~macro_input, + argument_macro_input::~argument_macro_input, for_input::~for_input): + Ditto. + + * src/preproc/pic/main.cpp (do_picture): Ditto. + + * src/preproc/pic/object.cpp: Include `stdlib.h'. + (text_piece::~text_piece, string_list::~string_list): Use `free'. + + * src/preproc/pic/pic.ypp (placeless_element, element, text, label, + expr_not_lower_than): Ditto. + + * src/preproc/pic/troff.cpp (troff_output::reset_color): Ditto. + + * src/preproc/preconv/preconv.cpp (check_coding_tag): Ditto. + + * src/preproc/soelim/soelim.cpp (do_file): Ditto. + + * src/preproc/tbl/table.cpp (text_entry::~text_entry): Ditto. + + * src/roff/groff/groff.cpp (possible_command::~possible_command, + possible_command::set_name): Ditto. + + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Ditto. + + * src/roff/troff/node.cpp (suppress_node::tprint): Ditto. + +2016-02-16 Bálint Réczey + + Use `malloc' in `strsave'; use `free' for returned pointers (#47164). + + * src/libs/libgroff/font.cpp (text_file::~text_file): Use `free'. + + * src/libs/libgroff/searchpath.cpp (search_path::open_file): Use + `free'. + + * src/libs/libgroff/strsave.cpp: Include `stdlib.h'. + (strsave): Use `malloc'. + +2016-02-16 Bálint Réczey + + Simplify memory allocation (#47162). + + Many invalid memory accesses were caught by UBSAN (e.g., invalid + memory access in `small_temp_iterator::operator new') while + bootstrapping hardened1-linux-amd64 Debian port in the `free_list' + handling because it doesn't properly handle the padding between + array elements. + + Some places were already #if 0-d out anyway. + + * src/roff/troff/input.cpp (small_temp_iterator): Remove class. + (make_temp_iterator): Use `temp_iterator' only. + + * src/devices/grotty/tty.cpp (tty_glyph): Remove `free_list', `new', + and `delete'. + + * src/include/color.h, src/include/color.cpp (color): Ditto. + + * src/roff/troff/env.cpp (tab): Ditto. + + * src/roff/troff/node.cpp (glyph_node): Ditto. + +2016-02-15 Bálint Réczey + + [pre-grohtml] Fix out-of-bounds array access (#47161). + + * src/preproc/html/pre-html.cpp (char_buffer::write_upto_newline): + Implement it. + +2016-02-15 Bálint Réczey + + Don't use `memcpy' with NULL input or output argument (#47160). + + * src/libs/libgroff/string.cpp (string::string, string::operator=): + Implement it. + + * src/roff/troff/input.cpp (temp_iterator::temp_iterator): Implement + it. + +2016-02-04 Carsten Kunze + + * tmac/s.tmac: Bugfix of previous commit simplified (and + introduced redundancy removed) by use of .par*start for .QS and + .QE. This is consistent since any other paragraph macro is + using .par*start. + +2016-02-02 Carsten Kunze + + * tmac/s.tmac: Macros .QS and .QE changed to insert vertical + inter-paragraph space. A paragraph bracketed with .QS/.QE + should appear identical to a .QP paragraph followed by .LP. + + * tmac/groff_ms.7.man, doc/groff.texi: Documentation of macros + .QS and .QE added and .QP information improved (effect of + registers QI and PD). + + See also discussion at groff@gnu.org, thread starting at + + http://lists.gnu.org/archive/html/groff/2016-01/msg00033.html + + Issue reported by Douglas McIlroy + +2015-12-26 Carsten Kunze + + * contrib/mm/m.tmac: Disable macro misc@tag in case output + type is not HTML. + + This macro did cause unwanted space in case a MM macros .H + had been followed immediately by .DS. + + (See also discussion at groff@gnu.org, thread starting at + http://lists.gnu.org/archive/html/groff/2015-12/msg00033.html) + + Bug reported by Damian McGuckin . + +2015-12-14 Werner LEMBERG + + * src/preproc/eqn/text.cpp (entity_table): s/lamda/lambda/. + + Bug reported by Brian McGuinness . + +2015-10-27 Deri James + + gropdf was choking on -I flag passed by groff, now uses + these directories to search for included pdfs. + + * src/devices/gropdf/gropdf.pl: Handle -I flag, avoid + unitialised values. + + * src/roff/groff/groff.1.man: Include 'X pdf: pdfpic' + + * src/devices/gropdf/gropdf.1.man: Document -I flag + +2015-09-10 Bernd Warken + + * src/roff/grog/subs.pl: fix comments + +2015-09-03 Bernd Warken + + * tmac/troffrc: Add .mso for file `pdfpic.tmac'. + +2015-08-28 Bertrand Garrigues + + * Makefile.am: + - Use only the naming `.section.man' for all man.pages. + - Replace `.man.n' by `.man' only, such that no `.n' is + generated. + - For example, the source `groff.7.man' is transformed into + `groff.7' in the same directory and then is by installing just + copied into one of the suitable installed man directory. + +2015-08-27 Bernd Warken + + * tmac/pfdpic.tmac: Add tmac file for macro `PDFPIC'. + + * tmac/tmac.am: Add new `pdfpic.tmac' file. + + * man/groff_tmac.5.man: Add definition for the new tmac. + +2015-08-22 Bernd Warken + + * all man-pages *.man: Rename man-pages such that the man section + number before the final `.man'. + + * all *.am: Include renaming. + + * Makefile.am: Reset `.man.n' by `.[157].man.n' with SUFFIXES + `.[157].man .n'. + +2015-08-20 Bernd Warken + + * Makefile.am: Fix definition of man[157]_MANS. + +2015-08-13 Bernd Warken + + * all *.am: Correct Emacs mode `End:' instead of `End.'. + +2015-08-09 Werner LEMBERG + + Revert previous commit, since it doesn't work correctly yet. + +2015-08-07 Bernd Warken + + Add section name to all man-page names. + + * Makefile.am: In `install-prefix-man' and `uninstall-prefix-man' + change `sed' commands. Correct saving in man[157]_MANS. + + * all *.man in source tree: Rename `manpage.man' to + `manpage.[157].man'. + + * all makefile.am in source tree: Add new man-page file name. + +2015-08-05 Bernd Warken + + * Makefile.am, arch/mingw/mingw.am, arch/misc/misc.am, + * contrib/eqn2graph/eqn2graph.am, contrib/grap2graph/grap2graph, + * contrib/pic2graph/pic2graph.am, doc/doc.am, + * font/devX100/devX100.am, font/devX100-12/devX100-12.am, + * font/devX75/devX75.am, font/devX75-12/devX75-12.am, + * font/devascii/devascii.am, font/devcp1047/devcp1047.am, + * font/devdvi/devdvi.am, font/devhtml/devhtml.am, + * font/devlatin1/devlatin1.am, font/devlbp/devlbp.am, + * font/devlj4/devlj4.am, font/devpdf/devpdf.am, + * font/devps/devps.am, font/devutf8/devutf8.am, + * font/scripts/scripts.am, man/man.am, + * src/devices/grodvi/grodvi.am, src/devices/grohtml/grohtml.am, + * src/devices/grolbp/grolbp.am, src/devices/grolj4/grolj4.am, + * src/devices/gropdf/gropdf.am, src/devices/grops/grops.am, + * src/devices/grotty/grotty.am, + * src/include/include.am, src/libs/libbib/libbib.am, + * src/libs/libdriver/libdriver.am, src/libs/libgroff/libgroff.am, + * src/libs/libxutil/libxutil.am, src/preproc/grn/grn.am, + * src/preproc/html/html.am, src/preproc/pic/pic.am, + * src/preproc/preconv/preconv.am, src/preproc/tbl/tbl.am + * src/preproc/refer/refer.am, src/preproc/soelim/soelim.am, + * src/roff/groff/groff.am, src/roff/grog/grog.am, + * src/roff/nroff/nroff.am, src/roff/troff/troff.am, + * src/utils/addftinfo/addftinfo.am, + * src/utils/afmtodit/afmtodit.am, src/utils/hpftodit/hpftodit.am, + * src/utils/indxbib/indxbib.am, src/utils/lkbib/lkbib.am, + * src/utils/lookbib/lookbib.am, src/utils/pfbtops/pfbtops.am, + * src/utils/tfmtodit/tfmtodit.am, src/utils/xtotroff/xtotroff.am, + * tmac/tmac.am: + Add `Last update'. Setup Emacs mode. + +2015-07-29 Bernd Warken + + * src/roff/grog/subs.pl: Add -T for all `grog' output, also using + -Tps when no option -T is given in the arguments. + + * src/roff/grog/grog.man: Add information about -T output. + +2015-07-23 Bernd Warken + + * man/groff.man: Add last update. Add link on Wikipedia on groff. + Add link of groff tutorial by Laha. + +2015-07-19 Bernd Warken + + * src/roff/grog/*.pl: Add last update. + + * src/roff/grog/subs.pl: Remove call to Perl INC::System::Simple, + use backticks instead. + Define &err(). + Reorder some extensions. + Distinguish between .TH at first command for man and later on for + ms. + +2015-07-01 Peter Bray + + Fix Savannah bug #44784. + + Compatibility Mode rendering of groff manual pages + + * m4/groff.m4 (GROFF_WITH_COMPATIBILITY_WRAPPERS): New macro to + implement 'configure' option + '--with-compatibility-wrappers='. With this option the + user can control how groff compatibility wrappers for + vendor-provided non-GNU macro sets are installed. + + * configure.ac: Use new macro GROFF_WITH_COMPATIBILITY_WRAPPERS. + + * Makefile.am: Define tmac_*_prefix if 'compatibility_wrappers' is + set to 'yes'. + + * tmac/tmac.am: Use 'compatibility_wrappers' to control the + installation: + + - If set to `no', the groff-provided macro set are installed in + /share/groff//tmac/ with the original macro set + name. + + - If set to `yes', the groff-provided macro set are installed in + /share/groff//tmac/ with a prefix of + $(tmac_prefix) (which is usually `g') and the generated + compatibility wrappers are installed in + /lib/groff/site-tmac, with the original macro set name. + + - If set to `manual', the groff-provided macro set are installed + in /share/groff//tmac/ with the original macro + set name and the generated compatibility wrappers are installed in + /lib/groff/site-tmac, with a name of + (which is usually `-os'). + +2015-06-17 Werner LEMBERG + + * tmac/tty.tmac: Fix mapping of \[bu] character for -Tutf8. + + Problem reported by carsten.kunze@arcor.de. + +2015-06-15 Deri James + + pdfmom should use $RT_SEP as path separator. + + * src/devices/gropdf/gropdf.am: Use @RT_SEP@ as path separator. + + * src/devices/gropdf/pdfmom.pl: As above but also fix typo in regex + for grep. + +2015-05-08 Eli Zaretskii + + [groff] Make relocation really work. + + See + + https://lists.gnu.org/archive/html/groff/2015-05/msg00000.html + + * src/roff/groff/groff.cpp: Include `relocate.h'. + (main): Use `relocatep'. + +2015-05-03 Bertrand Garrigues + + Fix Savannah bug #44768 (Solaris 10 compatibility issues). + + * m4/groff.m4 (GROFF_DIFF_D): new macro to check if `diff' has + option -D, and search for `gdiff' if not (new variable DIFF_PROG + will contain the `diff' program to be used). + + * m4/groff.m4 (GROFF_HAVE_TEST_EF_OPTION): new macro to check if + `test' supports the option -ef (created new variable + HAVE_TEST_EF_OPTION). + + * m4/groff.m4 (GROFF_BASH): new macro to search for `bash' (new + variable BASH_PROG will contain the full path to `bash' or + `/bin/sh' if `bash' was not found). + + * configure.ac: use the 3 new macros defined in m4/groff.m4. + + * contrib/gdiffmk/gdiffmk.am: set HAVE_TEST_EF_OPTION, BASH_PROG, + DIFF_PROG in the generated script `gdiffmk'. + + * contrib/gdiffmk/gdiffmk.sh: + - Fix incorrect space after '!' in sed script regex. + - `test -ef' is not portable: If `bash' is not available and the + shell does not support `test -ef', the option to pass a third + argument as the output file is disabled. + - Report an error if `diff' does not support -D option. + - GNU diff and Solaris diff support -D, but #ifndef / #endif are + treated differently (GNU adds a '!' in the #endif): modify the + regexs in the sed script accordingly. + +2015-05-01 Werner LEMBERG + + * tmac/tmac.am (TMACNORMALFILES): Add `zh.tmac'. + +2015-04-30 Darcy SHEN + + Fix Savannah bug #44941. + + * tmac/zh.tmac: New file to support basic Chinese (both simplified + and traditional). + +2015-04-22 Deri James + + Fix Savannah bug #44891. + + * src/devices/gropdf/gropdf.pl: If module Compress::Zlib is not + available fall back to producing uncompressed PDF and output a + warning. + +2015-04-22 Bjarni Ingi Gislason + + Fix Savannah bug #44894. + + * tmac/strip.sed: Add a `generated file' warning. + +2015-04-21 Deri James + + Fix Savannah bug #44890. + Patch by Peter Bray. + + * font/devpdf/devpdf.am: Don't use 'find -maxdepth'. + +2015-03-07 Ingo Schwarze + + [mdoc] Fix Savannah bug #44733. + + Prevent mdoc(7) Bl with trailing -width or -offset from picking up + old args. + + * tmac/doc.tmac-u (doc-do-Bl-args): When checking whether there is + another argument to a Bl macro, do not inspect the argument list + because it is never cleaned and may contain arguments from previous + macro invocations. Instead, inspect the argument count which is + always up to date. + +2015-04-10 Daiki Ueno + + Fix link error on NetBSD 6. + + Reported by carsten.kunze@arcor.de in: + . + The problem can also be reproduced if gl_cv_func_wcwidth_works=no + is passed to configure. + + * src/preproc/grn/grn.am (grn_LDADD): Change the link order of + libgroff.a and lib/libgnu.a according to dependency. + * src/roff/troff/troff.am (troff_LDADD): Likewise. + +2015-04-08 Werner LEMBERG + + Fix Savannah bug #44767. + Patch by Peter Bray. + + * src/roff/grog/grog.am (grog): Correctly substitute `grog_dir'. + +2015-04-03 Werner LEMBERG + + Fix Savannah bug #44708 (2/2). + + Make man pages work in compatibility mode. + Also fix some minor typos. + + * contrib/pic2graph/pic2graph.man, man/ditroff.man, man/groff.man, + man/groff_diff.man, man/groff_out.man, man/groff_tmac.man, + man/roff.man, src/devices/grodvi/grodvi.man, + src/devices/grohtml/grohtml.man, src/devices/grolbp/grolbp.man, + src/devices/grolj4/grolj4.man, src/devices/grolj4/lj4_font.man, + src/devices/gropdf/gropdf.man, src/devices/gropdf/pdfmom.man, + src/devices/grops/grops.man, src/devices/grotty/grotty.man, + src/devices/xditview/xditview.man, src/preproc/eqn/eqn.man, + src/preproc/eqn/neqn.man, src/preproc/grn/grn.man, + src/preproc/pic/pic.man, src/preproc/preconv/preconv.man, + src/preproc/refer/refer.man, src/preproc/soelim/soelim.man, + src/preproc/tbl/tbl.man, src/roff/groff/groff.man, + src/roff/grog/grog.man, src/roff/nroff/nroff.man, + src/roff/troff/troff.man, src/utils/addftinto/addftinfo.man, + src/utils/afmtodit/afmtodit.man, src/utils/hpftodit/hpftodit.man, + src/utils/indxbib/indxbib.man, src/utils/lkbib/lkbib.man, + src/utils/lookbib/lookbib.man, src/utils/pfbtops/pfbtops.man, + src/utils/tfmtodit/tfmtodit.man, src/utils/xtotroff/xtotroff.man, + tmac/groff_man.man, tmac/groff_trace.man: Do it. + +2015-04-03 Werner LEMBERG + + Fix Savannah bug #44708 (1/2). + + * tmac/andoc.tmac (reload_doc, reload_man): Don't use `de1', + otherwise we can't manipulate the compatibility flag within the + macro. + + * tmac/doc-common-u (Dt): Remove invalid leading whitespace. + +2015-03-11 Deri James + + * src/devices/gropdf/gropdf.pl: Was not handling the final glyph + correctly in the "standard" fonts which are not embedded. They + actually have 257 glyphs (0-256) not 256 as I'd assumed, so the + remappiing code needs to be applied for them as well as the + embedded downloadable fonts. + +2015-03-11 Deri James + + * src/devices/gropdf/gropdf.pl: Fix problem remappiing + ellipsis (affects all glyphs > 255). + +2015-03-07 Werner LEMBERG + + * tmac/tmac.am (TMACSPECIALFILES): Removed. No longer used. + +2015-03-07 Ingo Schwarze + + * tmac/doc-common-u (Dd): Avoid warning `unbalanced .el request'. + +2015-02-12 Werner LEMBERG + + Minor fixes due to renaming `groff.texinfo' to `groff.texi'. + + * doc/doc.am (SUFFIXES): Update. + * m4/groff.m4 (GROFF_MAKEINFO): Update. + +2015-01-30 Bertrand Garrigues + + Automake migration and Gnulib integration. + + Gnulib: + - Added gnulib as a git submodule. + - Integrated bootstrap scripts from gnulib. + - Gnulib m4 directory is now in `gnulib_m4', while Gnulib's .c + files are located in `lib'. `gnulib_m4' and `lib' are generated + and distributed. + + Automake: + - Removed Makefiles from the old build system. + - Converted Makefile.in into Makefile.am. + - Converted Makefile.sub files in all directories to a .am file. + - Removed configure, src/include/config.hin (now generated). + - Removed various helper scripts (config.guess, config.rpath...), + now installed by bootstrap in `build-aux'. + - Moved aclocal.m4 to acinclude.m4 (aclocal.m4 is now generated). + - Makefile in non-recursive style. + - Updated INSTALL.REPO (INSTALL is now a symlink to + gnulib/doc/INSTALL, original INSTALL file moved to INSTALL.extra) + - Added (empty) THANKS, AUTHORS files. + - Added a document on the usage of automake in groff in + doc/automake.pdf. + + Additional features: + - Out-of-source build is supported. + - Parallel build is possible (make -j). + - Automatic targets from Automake: `make dist', `make distcheck'. + - 'make check' is available for automatic testing, gdiffmk's test + was plugged to this target. + - Auto-detect if make has builtin variable `RM'. + +2015-01-14 Ingo Schwarze + + Fix Savannah bug #43905. + + * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), + * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Remove + double entries for `rk', `lk', `lt', `rt', `rb', and `lb'. + +2014-12-16 Werner LEMBERG + + Update Unicode-to-Unicode mapping to version 7.0.0. + + * src/libs/libgroff/make-uniuni: Update emitted copyright. + + * src/libs/libgroff/uniuni.cpp: Regenerated. + +2014-11-29 Werner LEMBERG + + Fix previous commit. + + We forgot to test whether the patch works if compiling from + scratch... + + Problem reported by Bertrand Garrigues + . + + * src/include/lib.h (interpret_lf_args, normalize_for_lf): Move + declarations to... + * src/include/lf.h: This new file. + + * src/libs/libgroff/lf.cpp, src/preproc/pic/pic.h, + src/preproc/preconv/preconv.cpp, src/preproc/refer/refer.h, + src/preproc/soelim/soelim.cpp, src/preproc/tbl/table.h: Include + `lf.h'. + Make `lib.h' the first included header file. + + * src/preproc/eqn/eqn.h: Don't include `stringclass.h'. + * src/preproc/eqn/main.cpp: Include `stringclass.h' and `lf.h'. + + * src/roff/groff/groff.cpp: Make `lib.h' the first included header + file. + +2014-11-10 Eli Zaretskii + + Improve native Windows port. + + This patch fixes two issues. + + . Handle backslashes in `.lf' arguments for MS-DOS and Windows. + . Fix file name quoting for the groff pipeline. + + * src/preproc/soelim/soelim.cpp (do_file): + * src/preproc/refer/refer.cpp (do_file): + * src/preproc/preconv/preconv.cpp (do_file): + * src/preproc/pic/main.cpp (do_file): + * src/preproc/eqn/main.cpp (do_file): Call `normalize_for_lf' to + convert backslashes in the file name being processed to forward + slashes. + + * src/include/lib.h (normalize_for_lf): Add prototype. + + * src/preproc/eqn/eqn.h: + * src/preproc/pic/pic.h: + * src/preproc/refer/refer.h: + * src/preproc/tbl/table.h: Include stringclass.h before lib.h. + + * src/libs/libgroff/lf.cpp (normalize_for_lf): New function. + + * src/roff/groff/groff.cpp: Include stringclass.h before lib.h. + (append_arg_to_string) [_WIN32 && !__CYGWIN__]: Use only "..." for + quoting in native Windows builds. + +2014-11-18 Deri James + + My commit '3fe78135c9fe666dadffde2a822b0535d8db6feb' introduced + problem in subroutine `TextWid'. Octal char `\nnn' returns width of + 4 char string rather than width of single character. + + * src/devices/gropdf/gropdf.pl: Change `TextWid' to recognise octal + escaped characters (\nnn). + +2014-11-07 Deri James + + See bug #43555. + + * src/devices/gropdf/gropdf.pl: Correct Date Format. + +2014-11-04 Werner LEMBERG + + * src/libs/gnulib/*: Regenerate autotool files. + +2014-11-04 Werner LEMBERG + +Version 1.22.3 released +======================= + + * NEWS, README, doc/webpage.ms: Updated. + + * doc/texinfo.tex: Updated from `texinfo' repository. + +2014-10-29 Bertrand Garrigues + + * Makefile.in (OTHERDIRS): Mention `afmtodit' first. + + Otherwise, some fonts in `devpdf' (`U-*') are not built. + +2014-10-26 Eli Zaretskii + Werner LEMBERG + + Add Windows `.cmd' wrapper files. + + * arch/mingw/*: New files, provided by Eli. + + * Makefile.in (make_winscripts, make_install_winscripts, + make_uninstall_winscripts): New target variables. + (MDEFINES): Add them. + (OTHERDIRS): Add `arch/mingw'. + + * m4/groff.m4 (GROFF_CMD_FILES): New macro + * configure.ac: Call it. + * configure: Regenerated. + +2014-10-23 Bertrand Garrigues + + Fix `install' and `uninstall' issues. + + * contrib/chem/Makefile.sub (install_data): Fix build with option + --with-doc=no passed to configure (target `install_examples' + should not be executed). + + * contrib/chem/Makefile.sub (uninstall_sub): `uninstall' failed + if directories to be removed were not present. + + * contrib/gpinyin/Makefile.sub (uninstall_sub): Ditto. + + * contrib/hdtbl/Makefile.sub (GENFILES): generated files should + depend on the creation of the `examples' directory. + +2014-10-23 Daiki Ueno + + * m4/iconv.m4: Really avoid false detection of non-working iconv. + +2014-10-21 Daiki Ueno + + iconv: avoid false detection of non-working iconv + + The INBUF/OUTBUF arguments of iconv can be either 'const char **' + or 'char **'. If CC is g++, the difference causes a compile error + and thus leads to a false detection of non-working iconv. + Reported by Eli Zaretskii and Werner LEMBERG in: + . + + * m4/iconv.m4 (AM_ICONV_LINK): Try all possible argument types of + iconv. Bump serial number. + +2014-10-20 Werner LEMBERG + + * src/libs/gnulib/lib/wctype.in.h: Include `config.h'. + + Problem reported by Eli Zaretskii . + + This is a temporary hack to make groff compile with MinGW. After + the switch to an automake infrastructure, together with proper use + of `gnulib', we can safely replace the patched file with a standard + version. + +2014-10-19 Doug McIlroy + + Fix Savannah bug #42151. + + * src/preproc/eqn/lex.cpp (file_input::read_line): Handle CR/LF. + * src/preproc/pic/pic.cpp (file_input::read_line): Ditto. + +2014-10-18 Werner LEMBERG + + [mdoc] Add Darwin version string for OS X 10.10. + + * tmac/doc-common (doc-operating-system-Darwin-14.0.0): New string. + + * tmac/groff_mdoc.man: Updated. + +2014-10-15 Werner LEMBERG + + * doc/webpage.ms: Remove obsolete references to tarballs and diffs. + + Reported by Dave Kemper . + +2014-10-15 Colin Watson + + Always distribute the parts of groff that require X11. + + * Makefile.in (ALLLIBDIRS): Clone from `LIBDIRS', but include + src/devices/libxutil unconditionally. + (ALLPROGDIRS): Clone from `PROGDIRS', but include + src/devices/xditview and src/utils/xtotroff unconditionally. + (DISTDIRS): Use `ALLLIBDIRS' and `ALLPROGDIRS' rather than `LIBDIRS' + and `PROGDIRS'. + +2014-10-14 Keith Marshall + + Minor update to NEWS for pdfroff. + + * NEWS (pdfroff): Note use of PHASE register, and not pdf:href.map, + to choose when to emit toc_relocation control record. + +2014-10-13 Keith Marshall + + For pdfroff, deduce "--no-toc-relocation" from input stream. + + * NEWS: Add notification; document the effect of changes, as recorded + in contrib/pdfmark/ChangeLog. + +2014-10-12 Ingo Schwarze + + [mdoc] Support `Mdocdate' CVS keyword substitution. + This fixes Savannah bug #42968. + + This feature is used for OpenBSD manuals. + + * tmac/doc-common (Dd): Handle `$Mdocdate:' argument. + + * tmac/groff_mdoc.man: Document it. + +2014-10-12 Ingo Schwarze + + [mdoc] Add `.At III' and `.St -iso8601'. + This fixes Savannah bug #42971. + + * tmac/doc-syms: Add corresponding version strings. + + * tmac/groff_mdoc.man: Synchronize. + +2014-10-12 Ingo Schwarze + + [mdoc] Update operating system release numbers. + This fixes Savannah bug #42969. + + * tmac/doc-common: Update NetBSD, OpenBSD, FreeBSD, and DragonFly + version strings. + + * tmac/groff_mdoc.man: Synchronize. + +2014-10-12 Werner LEMBERG + + * doc/Makefile.in: Use `LC_ALL' in addition to `LANG'. + Suggested by Steffen. + +2014-10-12 Werner LEMBERG + + * doc/groff.texinfo: Make PDF version compilable with makeinfo 5.x. + + makeinfo 5.x handles macro expansion better, which changes the way + how an \LE macro (for a less-than sign) has to be defined. However, + since we can't be sure that the latest version of `texinfo.tex' gets + used with makeinfo 5.x only, we would have to support both 4.x and + 5.x. No idea whether this is possible at all... For this reason, + we now simply use @value directly instead of wrapping it into a + macro, avoiding any issues. + +2014-10-12 Werner LEMBERG + + [doc] Protect against picky `sed' programs. + Problem reported by Axel Kielhorn . + + * doc/Makefile.in (GROFF_BIN_PATH, GROFF): Add `LANG=' to avoid + interpretation of non-ASCII characters by sed. + +2014-10-12 Michail Vidiassov + + * tmac/doc-common: Add new Darwin versions. + +2014-10-12 Werner LEMBERG + + * doc/groff.texinfo: s/which/that/ where appropriate. + +2014-10-12 Werner LEMBERG + + * doc/groff.texinfo: Various minor fixes. + + Most of those glitches have been found by comparing the info output + from makeinfo 4.13 and the current SVN development version (of + makeinfo). + +2014-10-12 Werner LEMBERG + + * doc/groff.texinfo: Improve indexing. + + Change @DefXXXItem and @DefXXXListEnd macros to not insert an index + entry. New macro variants with a trailing `x' (like `@DefreqItemx') + can override this. + + Update macro calls where necessary. + +2014-10-12 Werner LEMBERG + + [doc] Improve call to generation of `groff.pdf'. + Problem reported by Axel Kielhorn . + + Since `groff.texinfo' contains latin-1 characters, some sed + implementations (like the one used on Mac OS 10.8) fail if called + with the wrong locale. Basically, this is a `texi2dvi' bug, but we + can set `LANG' by ourselves to improve the situation. + + * doc/Makefile.in (.texinfo.dvi, .texinfo.pdf): Set `LANG' + environment variable to empty string. + +2014-10-12 Werner LEMBERG + + [doc] Correctly handle `MAKEINFO' environment variable. + Bug introduced in commit from 2014-03-29. + + * m4/groff.m4 (GROFF_MAKEINFO): Don't set MAKEINFO to empty string + before actually testing it. + + * configure: Regenerated. + +2014-10-11 Bertrand Garrigues + + Fix an issue on `make dist'. + + In order to make the tarball, `make dist' copies src/libs/gnulib + directories into the `tmp' directory without the `.deps' + directories, causing the failure of `make distclean' in + tmp/src/libs/gnulib. Forcing a call to `config.status' recreates + the `.deps' directories. + + * Makefile.in (dist): For gnulib, call `config.status' before `make + distclean'. + +2014-10-11 Bernd Warken + + * src/roff/grog/*.pl: Remove call from `IPC', use normal system + `instead'. + +2014-10-11 Guillem Jover + + Add support for various BSD versions. + + * tmac/doc-common: Add new FreeBSD and DragonFly versions. + +2014-10-11 Keith Marshall + + Refactor .psbb request handling code. + + * src/roff/troff/input.cpp (do_ps_file): Reimplement it, using... + (psbb_locator): ...this new locally declared and implemented class; + its constructor replaces all `do_ps_file()' capability, delegating + to other class methods, as appropriate. + (assign_registers): Encapsulate it, as a `psbb_locator' method. + (ps_get_line): Likewise, also renaming it to become... + (get_line): ...this class method; its internally defined `lastc' + static variable also becomes a non-static class member variable. + (PSBB_RANGE_IS_BAD, PSBB_RANGE_IS_SET, PSBB_RANGE_AT_END): New + manifest constants; define them. They are now used by... + (parse_bounding_box): ...this function, now also encapsulated as + a `psbb_locator' class method, to convey parsing status. + (bounding_box): Struct obsoleted by `psbb_locator'; delete it. + (ps_bbox_request): Delegate to `psbb_locator'. + +2014-10-11 Werner LEMBERG + + Various clean-ups. + + * NEWS: More updates. + + * REVISION: Set to 3. + + * doc/groff.texinfo: Update version and year. + + * configure: Regenerated. + + * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. + +2014-10-11 Werner LEMBERG + + Update generic GNU files to recent versions. + + * INSTALL.gen, config.guess, config.rpath, config.sub, + contrib/groff_filenames/Makefile.sub, doc/fdl.texi, doc/texinfo.tex, + doc/txi-en.tex, install-sh, m4/ax_prog_perl_version.m4, + m4/codeset.m4, m4/fcntl-o.m4, m4/glibc21.m4, m4/iconv.m4, + m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4, m4/localcharset.m4, + src/include/localcharset.h, src/libs/gnulib/Makefile.in, + src/libs/gnulib/aclocal.m4, src/libs/gnulib/build-aux/compile, + src/libs/gnulib/build-aux/config.guess, + src/libs/gnulib/build-aux/config.sub, + src/libs/gnulib/build-aux/depcomp, + src/libs/gnulib/build-aux/install-sh, + src/libs/gnulib/build-aux/snippet/arg-nonnull.h, + src/libs/gnulib/build-aux/snippet/c++defs.h, + src/libs/gnulib/build-aux/snippet/warn-on-use.h, + src/libs/gnulib/configure, src/libs/gnulib/lib/Makefile.in, + src/libs/gnulib/lib/config.charset, src/libs/gnulib/lib/intprops.h, + src/libs/gnulib/lib/localcharset.c, + src/libs/gnulib/lib/localcharset.h, src/libs/gnulib/lib/ref-add.sin, + src/libs/gnulib/lib/ref-del.sin, src/libs/gnulib/lib/stdbool.in.h, + src/libs/gnulib/lib/stddef.in.h, src/libs/gnulib/lib/streq.h, + src/libs/gnulib/lib/unitypes.in.h, + src/libs/gnulib/lib/uniwidth.in.h, + src/libs/gnulib/lib/uniwidth/cjk.h, + src/libs/gnulib/lib/uniwidth/width.c, src/libs/gnulib/lib/verify.h, + src/libs/gnulib/lib/wchar.in.h, src/libs/gnulib/lib/wctype-h.c, + src/libs/gnulib/lib/wctype.in.h, src/libs/gnulib/lib/wcwidth.c, + src/libs/gnulib/m4/00gnulib.m4, src/libs/gnulib/m4/Makefile.in, + src/libs/gnulib/m4/codeset.m4, src/libs/gnulib/m4/configmake.m4, + src/libs/gnulib/m4/extensions.m4, src/libs/gnulib/m4/fcntl-o.m4, + src/libs/gnulib/m4/glibc21.m4, src/libs/gnulib/m4/gnulib-tool.m4, + src/libs/gnulib/m4/inttypes-pri.m4, + src/libs/gnulib/m4/localcharset.m4, src/libs/gnulib/m4/longlong.m4, + src/libs/gnulib/m4/onceonly.m4, src/libs/gnulib/m4/wchar_t.m4, + src/libs/gnulib/m4/wint_t.m4, src/libs/libgroff/config.charset, + src/libs/libgroff/localcharset.c, src/libs/libgroff/ref-add.sin, + src/libs/libgroff/ref-del.sin, src/preproc/refer/refer.man: Do it. + +2014-10-11 Werner LEMBERG + + * NEWS, MANIFEST: Updated. + +2014-10-11 Werner LEMBERG + + * Makefile.in (OTHERDIRS, NOMAKEDIRS): Remove `ideal' references. + +2014-10-10 Bernd Warken + + * contrib/gideal: Temporarily remove this directory, because the + documentation and the preprocessor are not yet finished for + groff-1.2.23. + +2014-10-10 Werner LEMBERG + + * Makefile.in (dist): Clean up `src/libs/gnulib'. + +2014-10-10 Werner LEMBERG + + * doc/webpage.ms: Updates. + + The README and NEWS sections are not yet synchronized, though. + +2014-10-09 Ingo Schwarze + + * Makefile.in: Let `clean' and `distclean' descend into gnulib. + + This fixes Savannah bug #42970. + +2014-10-02 Bertrand Garrigues + + Set default X11 resources dir to `$prefix/lib/X11/app-defaults'. + + Previously, X11 resources for gxditview were installed in + `/usr/X11/lib/X11/app-defaults', no matter which prefix was set. + + Now, gxditview resources are installed in + `appresdir=$prefix/lib/X11/app-defaults'. If `appresdir' is not a + standard X11 resource directory, the environment variable + `XFILESEARCHPATH' should be set to this path. + + The behaviour of `--with-appresdir' is unchanged: This option can + still be used to set `appresdir', and its value will not be modified + by the prefix. + + * m4/groff.m4 (GROFF_APPRESDIR_DEFAULT): Implement new behaviour. + Fix detection app-defaults location on the system. + (GROFF_APPRESDIR_CHECK): Updated. + + * configure.ac: Improve output of configuration. + * configure: Regenerated. + + * NEWS: Mention it. + +2014-09-27 Werner LEMBERG + + Set `transparent' flag for `\[cq]. + Problem reported by Dave Kemper . + + * src/roff/troff/input.cpp (init_charset_table): Do it. + + * doc/groff.texinfo (Sentences, Using Symbols), man/groff_diff.man: + Document it. + +2014-09-25 Bernd Warken + + * src/roff/grog/*.pl: Program more reasonable subs (functions). + Repair details in many places. + +2014-09-24 Keith Marshall + + Refactor psbb line input function; avoid a buffer overrun. + + * src/roff/troff/input.cpp (ps_get_line): Declare it as `static'. + Refactor, to avoid the overhead of character look-ahead and push-back + on CR stream input. Add new `dscopt' parameter, in place of internal + `err' variable; update all call references, passing value of... + (DSC_LINE_MAX_ENFORCE): ...this new manifest constant; define it. + (DSC_LINE_MAX_IGNORED): Likewise; currently unused, but intended for + future use as an alternative to `DSC_LINE_MAX_ENFORCE'. + (DSC_LINE_MAX_CHECKED): New manifest constant; used internally only. + (PS_LINE_MAX): Manifest constant, renamed for notional consistency... + (DSC_LINE_MAX): ...to this; defined value remains as 255. + (do_ps_file): Increase stack allocation for `buf' char array; former + allocation of PS_LINE_MAX (now DSC_LINE_MAX) bytes exposed a potential + buffer overrun, after reading DSC_LINE_MAX bytes; two additional bytes + are required, to accommodate a terminating LF and NUL. Add `dscopt' + parameter, with value `DSC_LINE_MAX_ENFORCE', in each of three calls + to `ps_get_line()'. + +2014-09-20 Bernd Warken + + * src/roff/groff/Makefile.sub: Remove too much deleting while + running `make'. + +2014-09-20 Bernd Warken + + * `Makefile.sub' in the whole groff source tree: Add $(RM) and + change all `rm -f'. Add directory test before `rmdir'. + +2014-09-20 Bernd Warken + + * Man-pages (*.man) in the whole groff source tree: Improve + documents by adding \[co], \[cq], \[aq] instead of ` or ' and use + also \[co] as long as it makes sense. Remove \[en] in the years + date in order to allow the automatic license year increasing. + +2014-09-18 Bernd Warken + + * /*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * tmac/*: Improve the license information and Emacs setup. + +2014-09-18 Bernd Warken + + * src/utils/xtotroff/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/tfmtodit/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/pfbtops/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/lookbib/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/lkbib/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/indxbib/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/hpftodit/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/afmtodit/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/utils/addftinfo/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/roff/troff/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/roff/nroff/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/roff/grog/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/roff/groff/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/preproc/tbl/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/preproc/soelim/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/preproc/refer/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/preproc/preconv/*: Improve the license information and Emacs + setup. + +2014-09-18 Bernd Warken + + * src/preproc/pic/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/preproc/html/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/preproc/grn/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/preproc/eqn/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/libs/libxutil/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/libs/libgroff/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/libs/libdriver/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/libs/libbib/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/libs/gnulib/*: Improve the license information and Emacs + setup. The former run of that was not yet complete. + +2014-09-17 Bernd Warken + + * src/libs/gnulib/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/include/*: Improve the license information and Emacs setup. + +2014-09-17 Bernd Warken + + * src/devices/grotty/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/grops/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/gropdf/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/grolj4/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/grolbp/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/grohtml/*: Improve the license information and Emacs + setup. + +2014-09-17 Bernd Warken + + * src/devices/grodvi/*: Improve the license information and Emacs + setup. + +2014-09-15 Bernd Warken + + * man/*.man: Improve the license information (definition of .co + and .au). + +2014-09-15 Bernd Warken + + * m4/*.m4: Improve the license information without changing the + related information. + +2014-09-06 Werner LEMBERG + + Fix build issues. + + * m4/groff.m4: Fix typo. + s/refer_dir/referdir/ for consistency. + + * configure: Regenerated. + + * Makefile.in: s/refer_dir/referdir/ for consistency. + + * src/preproc/refer/Makefile.sub (install_data, uninstall_sub): + Don't handle binaries or manpages; this is handled elsewhere + already. Right now, only install and uninstall the `refer' data + directory. + +2014-09-04 Bernd Warken + + * configure: When I change the `configure' file manually, the + refer data dir is created. But when running aclocal/autoreconf, + the dir is again not created. + +2014-09-04 Bernd Warken + + * m4/groff.m4, configure.ac, Makefile.in, + src/preproc/refer/Makefile.sub: Add information to create a refer + data directory by installing. That dir is not yet generated + anyway. + +2014-09-05 Werner LEMBERG + + Regenerate configure files with correct parameters. + + * configure.ac: Comment out m4 macros still missing. + + * aclocal.m4, config.hin, configure: Regenerated. + +2014-09-04 Bernd Warken + + * some files in doc: Change the copying years to package form. + But many files have strange or no copying information. + +2014-09-04 Bernd Warken + + * contrib/pic2graph/Makefile.sub: Change the copying years to + package form. + +2014-09-04 Bernd Warken + + * FDL: Replace the changed actual file by the original `fdl.txt' + from . + +2014-09-03 Bernd Warken + + * contrib/grap2graph/Makefile.sub: Remove `Last updates' from all + files. Add and repair copyright. Write Emacs setup. + +2014-09-03 Bernd Warken + + * src/preproc/refer/refer.man: Include more distances for better + reading of the source file. Add `%' for documentation of + bibliographic database lines. + +2014-09-03 Bernd Warken + + * tree contrib/eqn2graph: Remove `Last updates' from all files. + Add and repair copyright. Write Emacs setup. + +2014-09-03 Bernd Warken + + * tree `arch': Remove `Last updates' from all files. Add + and repair copyright. Write Emacs seetup. + +2014-09-03 Bernd Warken + + * : Remove `Last updates' from all + files. Only `timestamp' values are left. + +2014-09-03 Bernd Warken + + * : Repair copyright years from + starting year to actual year for almost all files. + +2014-09-03 Bernd Warken + + * autom4te.cache: Remove that tree after running + `autoconf' or `autoreconf'. + + * .gitignore: Add all files within `autom4te.cache' to get rid of + them automatically. Not sure so far, if this works. + +2014-09-03 Bernd Warken + + * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS, + PROJECTS, README*: Remove Emacs settings for coding style. Change + copyright years from 1989-2014 and 1993-2014 into 2014 only. + +2014-09-03 Bernd Warken + + * configure.ac, Makefile.in: Try to use /usr/local/share directory + for `refer'. Does not work so far. + +2014-09-02 Bernd Warken + + * All Makefile*: Add Emacs settings and lacking licenses. + +2014-09-02 Bernd Warken + + * BUG-REPORT, FDL, INSTALL*, MANIFEST, MORE.STUFF, NEWS, PROBLEMS, + PROJECTS, README*: Add Emacs settings. + +2014-09-02 Bernd Warken + + * PROJECTS: Add TODO for `refer'. + +2014-08-31 Bernd Warken + + * man/roff.man (roff.7): Replace Heirloom links to more actual + places. Create macro definitions for authors (.au) and copying + (.co). + +2014-08-30 Bernd Warken + + * man/groff_font.man (groff_font.7): Restructure + file format, but keep content. + +2014-08-30 Bernd Warken + + * src/utils/addftinfo/addftinfo.man (addftinfo.1): Restructure + file format, but keep content. + +2014-08-30 Bernd Warken + + * man/roff.man (roff.7): Repair documentation of heirloom. + +2014-08-28 Bernd Warken + + * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add `gpinyin'. + + * src/roff/grog/grog.man: Restructure `SEE ALSO'. + +2014-08-28 Bernd Warken + + * contrib/gpinyin: Make it runnable, version 1.0.0. + +2014-08-20 Bernd Warken + + * groff.7 (man/groff.man): Add further preprocessor regions. + Repair documentation for Unicode. + +2014-08-08 Bernd Warken + + * configure.ac, configure, Makefile.in, m4/groff.m4: Install paths + for implementing contrib/gpinyin's sub.pl. + +2014-08-06 Bernd Warken + + * man/groff_char.man: Add description for displaying `uxxxx' as + `\[uxxxx]'. + +2014-08-05 Bernd Warken + + * man/groff.man (groff.7): Replace \[rs] to \e as far as useful. + +2014-08-05 Bernd Warken + + * man/groff.man (groff.7): Add documentation for the Unicode + escapes \[u....] and \[u.....]. + +2014-08-02 Bernd Warken + + * src/roff/groff/groff.man: Improve documentation for `utf8'. + +2014-08-01 Bernd Warken + + * contrib/gpinyin: New preprocessor for having the European-style + writing `pinyin' for the Chinese language. + +2014-07-22 Bernd Warken + + * groff.7 (man/groff.man): Add some useful special characters. + +2014-07-21 Bernd Warken + + * tbl.1 (src/preproc/tbl/tbl.man): Add simple examples. + +2014-07-12 Bernd Warken + + * groff.7 (man/groff.man): Add section about underlining. + +2014-07-07 Bernd Warken + + * man/groff.man (groff.7): Add some basic special characters + `\(xy'. + +2014-07-06 Bernd Warken + + * grog, groffer: Minor repairing. + +2014-07-06 Bernd Warken + + * src/roff/grog/subs.pl: Repair ligatures handling. + +2014-07-06 Bernd Warken + + * src/roff/grog/subs.pl: Correct handling of standard input. + +2014-07-06 Bernd Warken + + * src/roff/groff/groff.man: Minor correction. + +2014-07-06 Bernd Warken + + * src/roff/grog/*: Minor corrections. + +2014-07-05 Bernd Warken + + * src/roff/groff/groff.cpp: In `usage()' and `help()' order + alphabetically. + +2014-07-05 Bernd Warken + + * grog.pl, subs.pl: Heavily improve argument handling and `groff' + command line creation. + +2014-07-05 Bernd Warken + + * grog.man: Make file runnable for `doclifter'. + +2014-07-05 Bernd Warken + + * grog.man: Replace all .de by copying. Restrict all .char names + to length 2 only. + +2014-07-04 Bernd Warken + + * grog.man: Minor optimization. + +2014-07-04 Bernd Warken + + * grog.man: Transform in classical man-page style. + +2014-07-04 Bernd Warken + + * grog.pl, subs.pl: Add option `--warnings'. Rename + `--with_ligatures' to `--ligatures', but keep `--with_ligatures' + for compatibility. + +2014-07-03 Bernd Warken + + * Makefile.in: Remove directories `groffer/perl' and + `groffer.shell', which don't exist any more. + +2014-07-03 Bernd Warken + + * PROJECTS: Mention the start of the `ideal' project. + +2014-06-21 Ingo Schwarze + + * Makefile.in: Unbreak make install: + Add missing gideal dirs to the dist tarball. + +2014-06-19 Bernd Warken + + * src/roff/groff/groff.man: Correct the collection of the + installation directories. + +2014-06-19 Bernd Warken + + * src/roff/groff/groff.man: Add the installation file and + directory positions of the whole package with @...@. + +2014-06-19 Bernd Warken + + * man/groff.man, src/roff/groff/groff.man: Add file position + before and after installation and the latest update. + +2014-06-18 Bernd Warken + + * src/roff/grog/grog.pl: Corrections about `require' and `our' + definitions. + + * src/roff/grog/subs.pl: In the `groff' output command line, split + the single character options collections into different + 1-character options, each with a leading minus `-'.. +2014-06-20 Bernd Warken + + * src/roff/grog/subs.pl: Repair call of `push'. + +2014-06-18 Bernd Warken + + * src/roff/grog/subs.pl: Minor correction at `do_first_line'. + +2014-06-18 Bernd Warken + + * src/roff/grog/subs.pl: Adjust for first lines with non-preproc + and not-tmac names to be ignored. + +2014-06-18 Bernd Warken + + * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add new first line + of roff files with the names of the needed preprocessors and the + actual tmac, see 2014-06-17 Ulrich Lauther. Replace the + word `ideal' by `gideal', when the preprocessor is meant. + +2014-06-18 Bernd Warken + + * src/roff/grog/Makefile.sub: Add $(RM). + + * src/roff/grog/grog.pl: Remove call to perl_test.pl. `require + 5.6;' is enough as Perl test. + + * src/roff/grog/perl_test.pl: Remove this file. + +2014-06-18 Bernd Warken + + * ChangeLog: Add Emacs-mode and a separator for the license. + +2014-06-17 Ulrich Lauther + + * grog: Invent new first comment line of roff files with long + names of needed preprocessors and the tmac. + +2014-06-17 Bernd Warken + + * src/roff/grog/subs.pl: Correct handling of option `-J' for + ideal. + +2014-06-17 Bernd Warken + + * src/roff/groff/groff.cpp, src/roff/groff/pipeline.h, + * src/roff/grog/subs.pl: Add `groff' option `-J' for `gideal'. + +2014-06-16 Bernd Warken + + * src/roff/grog/subs.pl: Remove too early listing of 3 `groff' + preprocessors options: gideal, glilypond, gperl. + +2014-06-16 Bernd Warken + + * contrib/gideal: New project for installing `ideal' for `groff'. + + * Makefile.in: Add `gideal' for `OTHERDIRS'. + +2014-06-15 Bernd Warken + + * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Repair argument + handling for output `groff' line. + +2014-06-15 Bernd Warken + + * src/roff/grog/grog.pl, src/roff/grog/grog.man: Correct and add + the documentation for filespec options. + +2014-06-14 Bernd Warken + + * src/roff/grog/subs.pl: Activate handling of `--run', such that + now the generated `groff' command line can run. + +2014-06-14 Bernd Warken + + * src/roff/grog/subs.pl: Repair handling of filespec arguments. + +2014-06-12 Bernd Warken + + * src/roff/grog/grog.pl, src/roff/grog/subs.pl: Add testing + methods of Ralph Corderoy's `grog.sh' of 2006. Add primary usage + of file name extensions. + +2014-06-10 Bernd Warken + + * src/roff/grog/grog.pl: Totally rewrite the `grog' version, + starting at the last stable version. Write many parts as `sub' + functions. + + * src/roff/grog/subs.pl: New file by splitting the src file + `grog.pl', such that all functions get into the new file + `subs.pl'. + + * src/roff/grog/Makefile.sub: Add file `subs.pl', which goes into + the `grog' libdir. + +2014-06-03 James Cloos + + * src/roff/grog/grog.pl: The errors with `ligatures' come also + from `TeX GYRE' fonts. Print this information, when `grog' should + work with the `pdf' device. + +2014-06-02 Bernd Warken + + * src/roff/grog/grog.pl: The `grog' version of yesterday has many + bugs. So reinstall an old version of `grog'. + +2014-06-01 Bernd Warken + + * src/roff/grog/Makefile.sub: Remove changing of first line + `#! ...'. + +2014-06-01 Bernd Warken + + * src/roff/grog/grog.pl: Remove `$Sp' mostly. Reorder script. + Check and repair requests. Add final character `$' to many + checked requests. + +2014-06-01 Bernd Warken + + * man/roff.man: Move .TH at the beginning. + +2014-05-29 Bernd Warken + + * man/groff.man: In special characters, add the mentioning of the + `groff' writing `\[xy]'. + +2014-05-27 Bernd Warken + + * man/groff_char.man: Finish notes in all tables. + +2014-05-26 Bernd Warken + + * man/groff_char.man: Add notes in some tables, more will come. + +2014-05-26 Bernd Warken + + * src/roff/grog/grog.pl: Add further first line characters for + single character `groff' options. + + * src/roff/grog/grog.man: make generated options more readable. + +2014-05-26 Bernd Warken + + * src/roff/grog/grog.pl: Add detection of `.\" [eprt]' as first + line to `grog'. Change usage of `$Sp' to reasonable efforts in + `groff'. + + * src/roff/grog/grog.man, man/groff_char.man: Add website for + license text, not only the postal address. + +2014-04-03 Steffen Nurpmeso + + * */Makefile.*: Path quoting fixes, whitespace, formatting. + + Remove many quotes (and introduce a few as additional guards) + since groff's build system is generally not set up to properly + handle paths that need quoting. + +2014-04-03 Steffen Nurpmeso + + * Makefile.comm (extraclean): Don't delete `old'. + + The rule calling `rm -f' was originally thought to remove private, + temporary files. However, we now have a subdirectory called `old' + in `fonts/devps' that may not be removed, and trying so now causes + an error because we no longer ignore the returned error code of + `rm'. + +2014-04-03 Steffen Nurpmeso + + * Makefile.in (OTHERDIRS): Fix directory order. + + This has been accidentally broken in commit 51476bee from + 2014-02-25. + +2014-04-03 Steffen Nurpmeso + + * src/devices/gropdf/pdfmom.pl: Fix perl(1) warning. + +2014-03-30 Werner LEMBERG + + * configure: Regenerated. + +2014-03-30 Steffen Nurpmeso + + * */Makefile.*: Put straight error-prevention prefixes for `rm'. + +2014-03-30 Steffen Nurpmeso + + `uninstall' target: Avoid spurious and misleading error messages. + + * Makefile.comm (uninstall_dev): Improve. + + * font/devpdf/Makefile.sub (install_data): Remove superfluous `rm'. + (uninstall_sub): Improve. + + * src/roff/groff/Makefile.sub (uninstall_sub): Fix. + +2014-03-30 Steffen Nurpmeso + + Fixes for `uninstall' target. + + * Makefile.in (uninstall_dirs): Use `DESTDIR'. + + * src/libs/libgroff/Makefile.sub (uninstall_charset_data): Typo. + + * src/roff/groff/Makefile.sub (uninstall_sub): Typo. + + * src/roff/grog/Makefile.sub (uninstall_sub): Minor. + +2014-03-30 Steffen Nurpmeso + + * src/roff/grog/Makefile.sub (install_data): Typo. + +2014-03-29 Steffen Nurpmeso + + Add fine-tuning of doc generation to `configure'. + + * m4/groff.m4 (GROFF_DOC_CHECK): New macro, handling option + `--with-doc' and its new arguments. It sets + `docadd_{html,info,other,pdf,examples}' and exports + `make{_,_install_,_uninstall_}{otherdoc,examples}'. + (GROFF_MAKEINFO): Extended to export + `make{_,_install_,_uninstall_}infodoc'. + (GROFF_HTML_PROGRAMS): Extended to export + `make{_,_install_,_uninstall_}{htmldoc,htmlexamples}'. + (GROFF_PDFDOC_PROGRAMS): Extended to export + `make{_,_install_,_uninstall_}{pdfdoc,pdfexamples}'. + (GROFF_INSTALL_INFO): Guard test with `docadd_info'. + + * configure.ac: Use GROFF_DOC_CHECK. + * Makefile.in: Updated. + + * doc/Makefile.sub: Handle examples separately, controlled by + $(make{_,_install_,_uninstall_}examples). + +2014-03-27 Bjarni Ingi Gislason + + * tmac/www.tmac (TAG): Define register `PN'. + +2014-03-27 Bjarni Ingi Gislason + + * tmac/an-ext.tmac (EX, EE): Preserve font family. + +2014-03-17 Werner LEMBERG + + * src/preproc/eqn/box.cpp (set_script_size): Fix minimum test. + + Problem reported by Ted Harding in a + thread starting with + + http://lists.gnu.org/archive/html/groff/2014-03/msg00181.html + +2014-03-16 Werner LEMBERG + + Fix previous commit. + + Problem reported (with a patch) by Ingo Schwarze + . + + * doc/Makefile.sub (groff_bin_dirs): Add `preconv'. + + * doc/Makefile.in (groff_bin_dirs): Add `preconv'. + (.me.txt): Call preconv. Use UTF8 as output encoding. + (.me.ps): Call preconv. + +2014-03-14 Werner LEMBERG + + [me] Add translation of `meintro.me' to French. + + Contributed by Grégoire Babey . + + * doc/meintro_fr.me: New file. + * LICENSES, doc/Makefile.sub: Updated. + +2014-03-13 Ingo Schwarze (tiny change) + + man: Correctly reset margins. + + See + + http://lists.gnu.org/archive/html/groff/2013-11/msg00026.html + + for more. + + * tmac/an-old.tmac (set-an-margin): Whenever (re)setting + `\n[an-level]' to 1 (which happens when encountering `.TH', `.SH', + and `.SS') make sure to also (re)set `\n[an-saved-margin1]' and + `\n[an-saved-prevailing-indent1]' to a sane value such that an + immediate `.RE' cannot wreak havoc. + (TH, SH, SS): Updated. + +2014-03-11 Ingo Schwarze (tiny change) + + * Makefile.in: Do not forget to install gropdf manuals. + + This got broken in 290eaaac6cfc33856cd683838accc72ccf3e5a84: + src/devices/gropdf was split out of OTHERDIRS into SHPROGDIRS, and + consequently, Makefile.man was no longer used there. Note that + Makefile.dev is *not* needed, even though it's below /devices/. + +2014-03-11 Ingo Schwarze (tiny change) + + * src/roff/groff/Makefile.sub: POSIX conformance. + + - POSIX says that the meaning of the make(1) `$<' macro shall be + unspecified except in inference rules. Consequently, use `$?' + for portability. + + That's safe because the rules have only one prerequisite and + are not `.PHONY', so `$?' will always expand to one item. + + - While here, clean up two instances of superfluous use of cat(1). + +2014-03-11 Ingo Schwarze (tiny change) + + * Makefile.in (dist): Improve. + + - Bugfix: Do not error out if one of the DISTDIRS + contains a subdirectory. + - Make debugging easier by splitting the huge "cd tmp; ...; ..." + command sequence into several independent shell commands, + such that one can see which command actually fails. + +2014-03-06 Deri James + + Missing RE escape in grep. + + * src/devices/gropdf/pdfmom.pl: Escape '\' dot in grep RE. + +2014-02-26 Bernd Warken + + * src/roff/grog/grog.pl: Add detection of `gperl' to `grog'. + +2014-02-25 Bernd Warken + + * contrib/gperl: New preprocessor for Perl parts in groff files. + +2014-02-15 Ingo Schwarze + + * tmac/groff_mdoc.man: Improve the manual page template. + + - Add the EXIT STATUS section. It is widely used in at least + NetBSD, FreeBSD, OpenBSD, and DragonFly manuals. + - Recommend the DIAGNOSTICS section for section 4 manuals. Such + usage is very widespread, in particular for kernel printf + messages emitted by device drivers. + - Do not recommend the DIAGNOSTICS section for command return + values to the shell any longer. While such usage historically + existed, it does not seem common nowadays, and in any case, using + the now well-established EXIT STATUS section seems preferable to + me. + - Mention the possibility to use ERRORS for section 4 manuals. + While most section 4 manuals have a DIAGNOSTICS section, only + some will need an ERRORS section, but these cases aren't exactly + rare, either. Quite some device driver manuals explain how to + use the device using system calls like ioctl(2), open(2), read(2) + or write(2), in which case the ERRORS section is the natural + place to explain which errno values the driver may set during + such system calls. + - Mentioning signal handling as a content of the ERRORS section + seems redundant, it is already covered by talking about the + errno. The case of errno == EINTR should be handled just like + all other errno cases. For an example showing that there is no + need to single out error handling in any way, please look at a + typical read(2) manual page. + - Mention the CAVEATS section. It first appeared in the 4.2BSD + execve(2) manual in 1983, was already used by several manuals by + the time of 4.4BSD-Lite2 in 1995, and is in whidespread use + today, not just in BSD base system manuals, but for example in + Perl manuals as well. + +2014-02-14 Bernd Warken + + * src/roff/grog/grog.pl: Add detection of glilypond-parts in groff + files. For example `grog example.groff' from the glilypond source + gets `glilypond example.groff | groff'. + +2014-02-12 Bernd Warken + + * src/roff/grog/grog.pl: With the former bugfix of 2014-02-12, + it's now possible to run `grog meref.me' etc., which wasn't + possible before. That addition of the macro handling was + necessary for the automatic for `groffer'. + +2014-02-12 Bernd Warken + + * src/roff/grog/grog.pl: Add handling of macro definition and fix + problems with @VERSION@. + +2014-02-12 Rich Burridge + + [grn] Prevent crash if more than 50 command line arguments. + + * src/preproc/grn/main.cpp (INIT_FILE_SIZE, FILE_SIZE_INCR): New + macros. + (add_file): New function. + (main): Use it to add file arguments. + +2014-01-29 Ulrich Spörlein + + * tmac/doc-common: Add even more DragonFlyBSD releases. + +2014-01-28 Ulrich Spörlein + + * tmac/doc-common: Add some new *BSD version strings. + +2014-01-06 Bernd Warken + + * man/roff.man: Add information of new archives for RUNOFF and + roff_classical. + + * Makefile.in: Replace `contrib/RUNOFF' by + `contrib/groff_filenames'. + +2014-01-05 Bernd Warken + Werner LEMBERG + + * groff/tmac/groff_man.man: Minor typos, formatting, reordering. + +2014-01-05 Werner LEMBERG + + Revert recent changes to `an-ext.tmac' and `groff_man.man'. + + * groff/tmac/an-ext.tmac (.FONT): Remove. This doesn't belong into + this file. + + * groff/tmac/groff_man.man: Reset to state previous to 2014-01-04. + Useful changes will be re-committed in smaller, logical chunks. + +2014-01-05 Bernd Warken + + * groff/tmac/an-ext.tmac: in .FONT change variable name `result' + to `an_ext_FONT_result'. + +2014-01-04 Bernd Warken + + * groff/tmac/an-ext.tmac: add new request .FONT for using + different font names on a single line. + + * groff/tmac/groff_man.man: put under GPL2, reordered and enhanced. + +2014-01-02 Deri James + + * src/devices/gropdf/gropdf.pl: gropdf use to fail when handling + output from preconv, now works. + + * src/devices/gropdf/pdfmom.pl: can now be used as a pipeline, and + improvements made to its switch handling and use with preconv. + + * tmac/pdf.tmac: changes to support preconv. + +2014-01-02 Colin Watson + + * font/devascii/Makefile.sub ($(FONTS)): Convert extended regex + syntax to basic for sed. + * font/devcp1047/Makefile.sub ($(FONTS)): Likewise. + * font/devhtml/Makefile.sub ($(FONTS)): Likewise. + * font/devlatin1/Makefile.sub ($(FONTS)): Likewise. + * font/devutf8/Makefile.sub ($(FONTS)): Likewise. + +2013-12-23 Bernd Warken + + * groff/src/roff/groff/groff.cpp: add groff option `-G' to the + documentation in `synopsis()'. + +2013-12-06 Mike Frysinger + + Fix parallel build with gropdf and mom examples. + + The `contrib/mom/examples/' directory uses the helper script from + `src/devices/gropdf/'. Currently though, parallel builds might fail + like so: + + ... + make[2]: Entering directory `.../groff-1.22.2/contrib/mom' + examples/letter.mom >examples/letter.pdf + examples/mom-pdf.mom >examples/mom-pdf.pdf + /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory + make[2]: *** [examples/letter.pdf] Error 127 + /bin/sh: .../groff-1.22.2/src/devices/gropdf/pdfmom: No such file or directory + make[2]: *** [examples/mom-pdf.pdf] Error 127 + make[2]: Leaving directory `.../groff-1.22.2/contrib/mom' + make[1]: *** [contrib/mom] Error 2 + ... + make[2]: Entering directory `.../groff-1.22.2/src/devices/gropdf' + sed -f .../groff-1.22.2/arch/misc/shdeps.sed \ + -e "s|@VERSION@|1.22.2|" \ + -e "s|@PERLPATH@|/usr/bin/perl|" ./pdfmom.pl >pdfmom + + The top level makefile tries to account for this in general with + OTHERDIRS, but looks like `src/devices/gropdf/' was added to this + variable (which holds `contrib/mom/' too) because gropdf installs a + shell script, and the other prog vars require it to be a dir of + things to compile. + + URL: http://crbug.com/324116 + URL: https://bugs.gentoo.org/487276 + + * Makefile.in (SHPROGDIRS): Declare. + (PROGDIRS): Add $(SHPROGDIRS). + (OTHERDIRS): Delete src/devices/gropdf. + ($(SHPROGDIRS):): Add to existing rule. + ($(OTHERDIRS):): Depend on $(SHPROGDIRS). + +2013-12-08 Eric S. Raymond + + Repository fully converted to git. + +2013-11-21 Werner LEMBERG + + * config.guess, config.sub: Updated from `config' repository. + +2013-11-06 Werner LEMBERG + + * src/libs/libgroff/tmpname.cpp (gen_tempname): Use O_BINARY. + + Problem reported by Charlie Van Dien ; see + + http://lists.gnu.org/archive/html/groff/2013-10/msg00006.html + +2013-11-06 Werner LEMBERG + + * Makefile.comm (.man.n): Use C locale. + + Problem reported by Petr Man ; fix suggested by + Ralph Corderoy . + +2013-07-24 Ingo Schwarze + + [mdoc] Implement `.%C'. + + * tmac/doc.tmac, tmac/doc-common: Do it. + * tmac/groff_mdoc.man: Updated. + +2013-07-31 Deri James + + Fix overprinting issue with Acrobat reader. + + Problem reported by Heinz-Jürgen Oertel . + + * src/devices/gropdf/gropdf.pl (do_t, FindChar): Use ascii octal + notation (i.e., \015) when outputting characters with value < 32. + This fixes a bug which affected acroread when control-M (cr) was + embedded in a text string. + +2013-07-16 Werner LEMBERG + + * tmac/fallbacks.tmac: Make it work in compatibility mode. + + Problem reported by Y T . + +2013-07-16 Werner LEMBERG + + * src/roff/grog/Makefile.sub (install_data, uninstall_sub): Typos. + +2013-07-16 Werner LEMBERG + + * Makefile.in (GREP, MDEFINES): Define and use plain grep. + + Necessary for Bernd's code to extract groff options. + +2013-07-16 Ingo Schwarze + + * tmac/an-old.tmac (TP): Do not clobber line length after double + call to `.TP'. + +2013-07-02 Colin Watson + + * doc/groff.texinfo: Fix syntax error in documentation of `\z'. + +2013-07-02 Colin Watson + + * src/devices/grolbp/lbp.cpp (main): Don't write trailer if no + printer was created. + +2013-06-19 Eric S. Raymond + + * src/utils/lkbib/lbib.man: Move running text out of synopsis. + +2013-05-06 Bernd Warken + + * src/roff/groff/Makefile.sub: Replace `cpp' by `groff.cpp'. + +2013-05-06 Bernd Warken + + * Makefile.in: Add new `contrib' directory `RUNOFF'. + +2013-05-01 Bernd Warken + + * src/roff/groff/Makefile.sub: Remove all `.PHONY:' lines. + +2013-04-30 Bernd Warken + + * src/roff/groff/Makefile.sub: Replace `egrep' by `$(GREP)'. + commands. Don't use $(CCSRCS) any more. + +2013-04-30 Bernd Warken + + * Makefile.in, m4/groff.m4: Add `@libprogramdir@' and + `$libprogramdir' (usually `/usr/local/lib/groff'). Change + `$libdir/groff' into $libprogramdir for several `groff' programs. + Run `autoreconf -I m4'. + + * src/roff/groff/MAkefile.sub: Add $(DESTDIR) and $(srcdir) in + order to support installation outside of source code. + + * contrib/glilypond/Makefile.sub, contrib/glilypond/glilypond.pl: + Correct the install directories. + +2013-04-29 Bernd Warken + + * src/roff/groff/Makefile.sub: Replace some variables by shell + commands. Improve the output for the `make' runs. + +2013-04-28 Bernd Warken + + * src/roff/groff/Makefile.sub: Make this Makefile compatible. + +2013-04-28 Bernd Warken +2013-04-28 Werner LEMBERG + + * src/roff/groff/Makefile.sub: Use `make' variables to get + `groff' options from `getopt' in `groff.cpp'. Create 2 files + `groff_opts_no_arg.txt' and `groff_opts_with_arg.txt'. + +2013-04-26 Bernd Warken + + * src/roff/groff/read_groff_options.pl: Remove this file. It's + no longer needed. + + * src/roff/groff/Makefile.sub: Get the `groff' options from the + use of `getopt...' in `groff.cpp' using `$(EGREP)' and `sed'. + Store this information in a new file `groff_options.txt', which + is copied to `groff libdir' during the installation. + +2013-04-26 Werner LEMBERG + + Various minor fixes. + + * INSTALL.gen: Take the newest version from the `gnulib' + repository. + + * configure: Regenerated. + +2013-04-26 Bernd Warken + + * INSTALL.gen: Restore an older version from `2006' in + `groff-1.21'. + + * FOR-RELEASE: New file which describes how to prepare `groff' + for a new release. + +2013-04-26 Bernd Warken + + * src/roff/groff/read_groff_options.pl: Reads `groff' options + from `groff.cpp' and writes them into the file `groff_options.info'. + + * src/roff/groff/Makefile.sub: Have the generated file + `groff_options.info' be installed into the `groff libdir'. + +2013-04-16 Bernd Warken + + * INSTALL.gen: Replace this file by the daily `git' version of + `automake' `INSTALL' file. + + * INSTALL.autotools: Remove file. + + * INSTALL.CVS: New file, moved from `INSTALL.autotools'. + + * m4/ax_prog_perl_version.m4: New file, taken from package + `autoconf-archive-2013.04.06'. + + * m4/groff.m4: Remove unnecessary blank line. + + * Makefile.in: Add `$(PERLVERSION)'. + + * aclocal.m4: Run `autoreconf -I m4' (this includes + `aclocal -I m4'). This creates a suitable `aclocal.m4'. Remove + generated subdirectory `autom4te.cache'. + + * src/roff/grog/Makefile.sub: Correct `sed' command. Use `tabs' + that are needed by `GNU make'. + +2013-04-16 Bernd Warken + + * Makefile.sub: Add `m4/ax_compare_version.m4'. + + * aclocal.m4: Run the latest `aclocal -I m4' which generates a + suitable content in that file. + + * INSTALL.autotools: Information of the usage of `GNU autotools' + with `groff'. + + * INSTALL.gen: Move `autotool' parts to file `INSTALL.autotools'. + +2013-04-15 Bernd Warken + + * m4/groff.m4: Replace tabs by spaces. Use a double line between + AC_DEFUNs. + +2013-04-15 Bernd Warken + + In the whole `groff' system, rename autoconf variable `$PERLPATH' + to `$PERL', which has the same content. But `$PERL' suits to + `AX_PROG_PERL_VERSION' in m4 macro `GROFF_PERL' in `m4/groff.m4'. + + * src/utils/afmtodit/Makefile.sub, + * src/devices/gropdf/gropdf.pl, + * src/devices/gropdf/Makefile.sub, + * src/devices/gropdf/pdfmom.pl, + * arch/djgpp/config.site, + * font/devpdf/Makefile.sub, + * contrib/mm/Makefile.sub, + * m4/groff.m4, + * Makefile.in: Replace `$PERLPATH' by `$PERL'. + + * m4/ax_compare_version.m4: New file, copied from daily version of + `GNU autoconf-archive'. + + `autoconf' was not yet run, a newer version is needed. + +2013-04-15 Bernd Warken + + * README, INSTALL, INSTALL.gen, MANIFEST: Add documentation in the + top directory about some parts of `autotools' and `glilypond'. + +2013-04-15 Bernd Warken + + * configure.ac: Add information of the macro `GROFF_PERL'. + + * Makefile.in: Add definitions of the macro variables and their + `@...@' counterparts. + + Run `autoreconf -I m4'. + +2013-04-15 Bernd Warken +2013-04-15 Werner LEMBERG +2013-04-15 Ralph Corderoy + + Add Perl test to configuration. During the run of `configure' the + program is broken with error when there is no `Perl' or the `perl' + program is too old. + + * m4/groff.m4: Add macro `GROFF_PERL' that tests the availability + of the `perl' program and tests whether this has a version of at + most `v5.6.1'. Define variables $PERL and $PERLPATH for the full + name of the `perl' program and $PERLVERSION as the lest version. + +2013-04-13 Keith Marshall + + Avoid consideration of autotool cache for CVS inclusion. + + * .cvsignore (autom4te.cache): Add reference. + +2013-04-13 Bernd Warken + + * `autotools': During the run of `autoconf' and `autoreconf' a + subdirectory `autom4te.cache' was created. I first added this to + groff CVS and removed it again after an email-discussion. + +2013-04-12 Bernd Warken + + * `grog': Remove the shell version of `grog'. Now there is only + Perl version. + + * src/roff/grog/perl.sh: Remove this file. + + * src/roff/grog/Makefile.sub: This file handles the removement of + the shell version. + + * src/roff/grog/perl_test.pl: New file for testing the available + Perl version in the system to be installed into. This file will + be installed into the grog lib-directory. + +2013-04-12 Bernd Warken + + * `grog': In the following, the file `grog.pl' will be split. For + the coming files, a lib-directory is needed for storage. + + * m4/groff.m4, configure.ac: Add libdir information for `grog'. + + * Makefile.in: Add @grog_dir@. + + Run `autoconf'. + + `grog' has now a lib-directory at `$prefix/lib/groff/grog'. + +2013-04-11 Bernd Warken + + * contrib/groffer/: There is a free `git' package containing all + old `groffer' versions `v0.*' and `v1.*'. The new versions + `groffer 2.*' will actually not be included. This package can be + got at: + + $ git clone git@github.com:RUNOFF/groffer.git + +2013-04-11 Bernd Warken + + * contrib/glilypond/: There is a free `git' package containing all + old versions of the former name `groff_lilypond v0.*'. They work + with `lilypond' parts in `roff' files, but were not installed. + This package can be got at: + + $ git clone git@github.com:RUNOFF/groff_lilypond.git + + The new versions `glilypond v1.*' are not included there. + +2013-04-11 Bernd Warken + + * man/roff.man: For roff(7), add information about the free git + package RUNOFF.git with documentation about historical RUNOFF and + the available files written in the classical RUNOFF language.. + +2013-03-29 Bernd Warken + + Rename `groff_lilypond' to `glilypond'. So remove the former + source directory `/contrib/lilypond' and newly + install `/contrib/glilypond', which now has many + files. The new version starts at `v1.0'. + + * m4/groff.m4, configure.ac: Add libdir information for + `glilypond'. + + * Makefile.in: Add `/contrib/glilypond'. + + Run `autoconf'. + + `glilypond' can now be installed to the system. + +2013-03-17 Ingo Schwarze + + * font/devpdf/Makefile.sub: Build system fixes. + + (GROFF_FONT_FILES): Avoid installing Makefile.sub.orig when it's + around. + (install): Create $(DESTDIR)$(fontsubdir)/util when missing. + +2013-03-05 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `\s'. + + Reported by Jim Avera . + +2013-02-16 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `.substring'. + + Reported by Jim Avera . + +2013-02-13 Werner LEMBERG + + * doc/groff.texinfo: Fix if-else example. + + Reported by Jim Avera . + +2013-02-10 Werner LEMBERG + + [grops] Make binary `%%BeginData' work; support `fontset' resource. + + * src/devices/grops/psrm.cpp (resource_table): Add `fontset'. + + (resource_manager::read_resource_arg): Do a case insensitive + comparison. The PostScript Reference Manual gives the following + example for a CFF resource (example 5.7): + + %!PS-Adobe-3.0 Resource-FontSet + %%DocumentNeedResources: ProcSet (FontSetInit) + %%Title: (FontSet/CFFRoman27) + %%Version: 1.000 + %%EndComments + %%IncludeResource: ProcSet (FontSetInit) + %%BeginResource: FontSet (CFFRoman27) + /FontSetInit /ProcSet findresource begin + %%BeginData: 622532 Binary Bytes + /CFFRoman27 622503 StartData + ... 622,503 bytes of binary data ... + %%EndData + %%EndResource + %%EOF + + Note the `ProcSet' and `FontSet' keywords. While the old DSC + (Document Structure Convention) documentation doesn't cover + `FontSet' at all (the DSC documentation predates the invention of + CFF), it describes only `procset' (all letters downcase), and it + also says that the DSC parser works in a case sensitive manner. + + In other words, `ProcSet' is not valid according to the DSC + documentation, only `procset' is. So much about today's validity + of DSC... This patch adapts grops's code to the PostScript + reality. + + (resource_manager::do_begin_data): Fix typo (present since the + beginning) which prevented correct handling of binary data. + + * src/devices/grops/ps.h (resource_type): Add RESOURCE_FONTSET. + +2013-02-10 Bernd Warken + + * contrib/lilypond: New files for adding lilypond parts into groff + files. + +2013-02-07 Werner LEMBERG + +Version 1.22.2 released +======================= + + * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated. + + * configure: Regenerated. + + * doc/texinfo.tex: Updated from `texinfo' repository. + + * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. + +2013-02-07 Werner LEMBERG + + * src/libs/gnulib/*: Update `gnulib' files. + +2013-02-02 Gilles Espinasse + + [grohtml] Don't ignore return value of `dup'. + + * src/preproc/html/pushback.cpp (pushBackBuffer::pushBackBuffer, + pushBackBuffer::~pushBackBuffer): Abort if `dup' fails. + +2013-01-30 Bernd Warken + + * tmac/groff_man.man: Fix wrong connection for tbl(1). + +2013-01-29 Werner LEMBERG + + * doc/groff.texinfo: Fix documentation of .LP macro in ms. + Problem reported by Omari Norman . + +2013-01-29 Werner LEMBERG + + * doc/Makefile.sub (uninstall_sub): Handle `gnu.eps'. + +2013-01-29 Werner LEMBERG + + Building clean-ups. + + * Makefile.in: Use $(top_srcdir) where appropriate. + * Makefile.sub (M4MACROS): Add `fcntl-o.m4' and `localcharset.m4'. + + * font/devpdf/Makefile.sub (UTILFILES): Removed, unused. + (MOSTLYCLEANADD): Add `BuildFoundries'. + * src/devices/gropdf/Makefile.sub (MOSTLYCLEANADD): Add `pdfmom'. + +2013-01-24 Bernd Warken + + * Add a shell command to 'MANIFEST' that displays all man source + files and their section. + +2013-01-22 Bernd Warken + + * Add email address in all files having the name. + +2013-01-14 Deri James + + * src/devices/gropdf/gropdf.pl (do_x, do_p, do_s, Set_LWidth): The + grops driver defaults to round linecaps and linejoins, gropdf + incorrectly used butt caps and miter joins. + + (Since the MOM package expects to use butt caps and miter joins + (emitting the necessary postscript code to change the caps and + joins), gropdf now parses the same postscript commands.) + + * src/devices/gropdf/gropdf.man: Document the handling of linecaps + and linejoins. + + * tmac/pdf.tmac (pdfbookmark): Fix bug where the current + PDFOUTLINE.FOLDLEVEL may not be honoured if warnings of the type + + macro warning: adjusted level n bookmark; should be <= n + + Added copyright and mention debt owed to Keith Marshall for + original `pdfmark.tmac', upon which `pdf.tmac' is largely based. + + * font/devpdf/Foundry.in, font/devpdf/util/BuildFoundries.pl + (LocateFile): The font for EURO had the wrong entry in the + `download' file (it pointed to The font in the build directory, + which is wrong). It has always been permissible to include a + path along with the font name in the Foundry file, but until now + the font had to exist to be valid. It is now permitted to start + the path with an asterisk which tells BuildFoundry to use the + path/filename in the download file without checking if the font + exists. This allows the font to be found in `../devps' even + though it is not there during the build (if source and build are + different), but will be there after the install. + +2013-01-13 Werner LEMBERG + + [eqn] Fix display of matrices in nroff output. + + Problem reported by Andy Spencer . + + * src/preproc/eqn/pile.cpp (pile_box::compute_metrics, + matrix_box::compute_metrics): Fix rounding. + +2013-01-07 Deri James + + * tmac/europs.tmac: Protect against missing fonts. + +2013-01-07 Deri James + + * font/devpdf/util/BuildFoundries.pl (LoadFoundry): Improve + warning. + +2013-01-07 Werner LEMBERG + + [tbl] Allow characters #, `, and ' as eqn delimiters. + + While problems ` and ' have been unintentionally introduced rather + recently, the limitation regarding # was there from the beginning. + + At the same time, fix a small bug causing `.lf' requests not + starting a line. + + * src/preproc/tbl/table.cpp (table::init_output) + (table::compute_expand_width, table::compute_separation_factor) + (table::define_bottom_macro, table::do_bottom): Temporarily switch + off eqn delimiters, wrapping the code into a `.ig' block. This + uses the new functionality just added to eqn. + + * src/preproc/eqn/eqn.man, src/preproc/tbl/tbl.man: Updated. + +2013-01-06 Werner LEMBERG + + [eqn] Add `delim on'. + + * src/preproc/eqn/lex.cpp (start_delim_saved, end_delim_saved): + New global variables. + (do_delim): Handle `delim on' to restore previous start and end + delimiters. + + * src/preproc/eqn/eqn.man, NEWS: Document it. + +2013-01-02 Deri James + + [gropdf] Various minor fixes. + + * src/devices/gropdf/gropdf (do_x) <'X'> <'pdfpic'>: Using + + \X'pdf: pdfpic' + + with a zero width now works correctly. + + (LoadPDF): Scale width in proportion to given height. + + (do_s): In some circumstances a font size change is emitted before + current font is established. Fix handles this situation. + +2012-12-30 Werner LEMBERG + +Version 1.22.1 released +======================= + + Due to CVE-2012-3386, ftp.gnu.org rejected uploading of version + 1.22 -- in other words, 1.22 has never been released. + + * NEWS, REVISION, doc/groff.texinfo, doc/webpage.ms: Updated. + + * Makefile.in (NOMAKEDIRS): Updated. + +2012-12-30 Werner LEMBERG + + * src/libs/gnulib/*: Update `gnulib' files. + + Because we currently don't support `gnulib-tool' directly but add + everything to the CVS repository, and many internal details of the + gnulib setup has changed, it is necessary to do redo the import. + + . Temporarily rename `src/libs/gnulib' to `src/libs/gnulib.old'. + + . Call + + gnulib-tool --create-testdir \ + --dir=src/libs/gnulib \ + wcwidth + + . Manually move directories `src/libs/gnulib/gl{lib,m4}' to + `src/libs/gnulib/{lib,m4}', and do `s/gllib/lib/' and `s/glm4/m4/' + in all files to `convert' the gnulib testbed to a standard gnulib + configuration as maintained by gnulib-tool. Additionally, remove + the directory `src/libs/gnulib/gltests' and the references to + `gltests' in all files. + + (All of this could be done with a script, but I hope that this is + eventually replaced with migrating groff as a whole to gnulib and + its setup). + + . Call + + gnulib-tool --add-import \ + --dir=src/libs/gnulib \ + wcwidth + + to update everything. + + . Merge the changed, new, and deleted files into `gnulib.old', + delete `gnulib', rename `gnulib.old' to `gnulib', then commit. + +2012-12-28 Werner LEMBERG + + [doc] More documentation generation rules. + + * doc/Makefile.in (.texinfo.txt): New rule. + (.texinfo.html): Use `LANG='. + (split-html): New target. + +2012-12-28 Werner LEMBERG + + * doc/fixinfo.sh: Make it work with makinfo 4.13 also. + +2012-12-28 Werner LEMBERG + + Split ChangeLog. + + * ChangeLog: Split off older entries into... + * ChangeLog.121: this new file. + +2012-12-28 Werner LEMBERG + +Version 1.22 released +===================== + + * NEWS, VERSION, doc/groff.texinfo, doc/webpage.ms: Updated. + + * config.guess, config.sub: Updated from `config' repository. + + * INSTALL.gen: Updated from `gnulib' repository (file `INSTALL'). + + * aclocal.m4, configure: Regenerated. + + * doc/texinfo.tex: Updated from `texinfo' repository. + + * src/roff/groff/groff.cpp (main) <'v'>: Update copyright year. + +2012-12-27 Bjarni Ingi Gislason + + * man/groff_font.man: Typographical improvements and typos. + +2012-12-27 Bjarni Ingi Gislason + + * man/ditroff.man: Typographical improvements and typos. + +2012-12-18 Bjarni Ingi Gislason + + * man/groff_diff.man: Typographical improvements and typos. + +2012-12-16 Bjarni Ingi Gislason + + * man/groff.man: Typographical improvements (and one typo). + * man/groff_char.man: Typographical improvements. + +2012-10-17 Deri James + + * src/devices/gropdf/gropdf.pl (do_D): The command \D't N' moves + horizontal position by 'N'. gropdf now obeys this rule. + (do_t): Fixed kerning issue where width of non-kerned text could + be wrongly calculated using previous kern factor. + +2012-09-21 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `.ad'. + +2012-09-20 Werner LEMBERG + + * doc/Makefile.sub (uninstall_sub): Fix removal of info files. + +2012-09-20 Werner LEMBERG + + Simplify environment handling. + + Suggested by Ivan Shmakov . + + * doc/Makefile.in, doc/Makefile.sub (GROFF): Don't use export. + +2012-09-20 Deri James + + [gropdf] Various minor fixes. + + * font/devpdf/Foundry.in: Add font path to debian `gsfonts' + package. + + * font/devpdf/util/BuildFoundries.pl: Handle missing fonts in a + more sane way, do NOT abort the complete make run! + + * src/devices/gropdf/gropdf: Accept papersize names (i.e. A4) as + either upper or lower case. The -p (papersize) option should be + length,width (currently reversed - width,length) + + * src/devices/gropdf/pdfmom.pl: Support use of GROFF_BIN_PATH. + +2012-09-11 Ralph Corderoy + Werner LEMBERG + + * src/preproc/tbl/tbl.man: Better document `d' column specifier. + +2012-08-31 Deri James + + Add `pdfmom' to handle mom documents with gropdf. + + * Makefile.in (OTHERDIRS): Move contrib/mom to be run after + devices/gropdf. + + * src/devices/gropdf/gropdf.pl: Various fixes: + + . Correct image scaling issue. + . Handle relative horizontal movement 'h' followed by absolute + vertical movement 'V'. + . Correct handling of track kerning. + + * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom) + using gropdf or grops driver. + * src/devices/gropdf/pdfmom.man: New man page. + * src/devices/gropdf/Makefile.sub: Updated to handle new files. + +2012-08-31 Deri James + + * Makefile.in (OTHERDIRS): Move contrib/mom to be run after + devices/gropdf. + + * src/devices/gropdf/gropdf.pl: Various fixes: + + . Correct image scaling issue. + . Handle relative horizontal movement 'h' followed by absolute + vertical movement 'V'. + . Correct handling of track kerning. + + * src/devices/gropdf/pdfmom.pl: New wrapper for mom (pdfmom) + using gropdf or grops driver. + * src/devices/gropdf/pdfmom.man: New man page. + * src/devices/gropdf/Makefile.sub: Updated to handle new files. + +2012-08-31 Julien Moutinho + + * tmac/www.tmac (www-push-li): Fix indentation. + + See + + http://lists.gnu.org/archive/html/bug-groff/2012-08/msg00009.html + + for the full report. + +2012-08-08 Eric S. Raymond + + TBLization, as discussed on the list. There's a rewrite of + this file in planning, but this gets the content clean for now. + + * tmac/groff_mdoc.man: In this file. + +2012-08-09 Werner LEMBERG + + Provide proper Unicode mapping from and to dotless j. + + * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), + src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Add it. + +2012-08-08 Eric S. Raymond + + Added Unicode code point for dotless j. + + * man/groff_char.man: In this file. + +2012-08-08 Werner LEMBERG + + * man/groff_char.man: Clean-ups. + +2012-08-08 Eric S. Raymond + + Elimination of nasty presentation-level macro tangles makes + structural translation to XML possible. + + * man/groff_char.man: Clean up the mess, use real TBL tables. + +2012-07-23 Eric S. Raymond + + More elimination of low-level troff hackery in the documentation + so it can be lifted to structural markup. + + * tmac/groff_me.man: Use TBL rather than wacky diversions and .ti + requests. + +2012-07-24 Werner LEMBERG + + Fix appearance of groff.texinfo's HTML output. + + Cartouches within an `example' environment don't work. + + * doc/groff.texinfo (CartoucheExample, endCartoucheExample): New + macros. Use them where appropriate. + +2012-07-17 Ingo Schwarze + + [mdoc] Make `Fl' correctly restore fonts. + + * tmac/doc.tmac (doc-flag-recursion): Do it. + +2012-07-07 Eric S. Raymond + + * src/preproc/eqn/eqn.man, src/preproc/grn/grnn.man, + src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man, + src/devices/grops/grops.man, src/utils/lkbib/lkbib.man, + src/utils/indxbib/indxbib.man, src/utils/tfmtodit/tfmtodit.man, + src/utils/xtotroff/xtotroff.man: + Remove running text in the synopses of various manual pages, + as it badly screws up attempts to mechanically parse them. + + * contrib/mom/groff_mom.man: Use .URL rather than .UR/.UE, as this + is now preferred for manual pages. + +2012-07-03 Werner LEMBERG + + Fix Unicode mapping of Greek stroked and curly phi. + + Problem reported by Alkis Georgopoulos ; + see + + https://bugs.launchpad.net/ubuntu/+source/groff/+bug/1008115 + + * src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list): Flip + values of U+03C6 and U+03D5. + +2012-06-13 Deri James + + * src/devices/gropdf/gropdf.pl: When using variable page + sizes (with \X'papersize ...') ensure final page is correct + size. + +2012-05-24 Werner LEMBERG + + * src/roff/grog/grog.pl (process): Fix .so handling. + + This does the same as the previous commit. + +2012-05-24 Denis M. Wilson + + * src/roff/grog/grog.sh: Fix .so handling. + + See + + http://lists.gnu.org/archive/html/bug-groff/2012-05/msg00000.html + + for the report and the bug fix. + +2012-05-24 Ivan Shmakov + + Add some generic fallback characters. + + * tmac/fallbacks.tmac: New file. + * tmac/troffrc: Include it. + * tmac/Makefile.sub (NORMALFILES): Include it. + +2012-05-20 Deri James + + * doc/groff.texinfo: Add extra info about `.asciify'. + Document new gropdf options -u and -s. + + * src/devices/gropdf/gropdf.man: Remove references to Type 42 + fonts, they do not work in PDFs. + + Document new option -s which adds `statistics' line to end of PDF + file showing number of pages in document. This has always been + the default behaviour (to add this line), all other software seems + to ignore it as intended, but `gs' sometimes complains, so the + default is now to omit the statistics. + + Document new option -u[cmapfilename] to allow a user ToUnicode + CMap instead of gropdf's default. If no `cmapfilename' given then + do not include any ToUnicode CMap. + + * src/devices/gropdf/gropdf.pl : Allow `bundled' flags on + command line (i.e. -de = -d -e). + + Use $RT_SEP as multi path separator, not hard coded `:'. Update + all users. + + New flags -u and -s. Once a custom papersize has been set as + \X'papersize x,y' make it sticky so all following pages use custom + size. When importing pdf with \X'pdf: pdfpic ...' do not compress + objects which are already compressed! This caused problems with + PDFs created with ImageMagick, now fixed. + + (IsText, PutLine, do_t): The troff `u' command can contain a + kerning adjustment number, this was not being handled, now fixed. + + (do_c): The troff `c' command was not being handled correctly, now + fixed. + (FindChar, RemapChr, do_N): Handle fonts with more than 255 glyphs. + ($ucmap): Define CMap ToUnicode to convert ligatures + (fl,fi,ff,ffl,ffi) back to individual characters, useful for + cut'n'paste and text searching. + (LoadFont): Handle it. + (ToPoints, GetPoints): Handle `z' unit. + (do_x, FixPDFColour, PutHotSpot): Allow Annotation colour to be + groff colour, i.e. 0-65535 *3, or #rrggbb, or #rrrrbbbbgggg. + (do_p):The papersize width/length in switch -p were reversed, + corrected. + + * src/devices/gropdf/Makefile.sub (gropdf): Use $RT_SEP. + Use $fontpath rather than $fontdir (this ensures site-font is + included in searches). + + * tmac/pdf.tmac (PDFBOOKMARK.VIEW, PDFHREF.VIEW, PDFPAGE.Y): Fix + strings. + (pdfbookmark): Correct handling of bookmark levels. + Convert \[em] to hyphen in bookmarks + + Rather use -N than -T for "named" bookmarks (-T already used for + "tag" in pdfmark.tmac) + + (.pdfclean): New macro which attempts to asciify bookmark text. + (.pdfpagename): New wrapper macro for \X'pdf: pagename'. + (.pdfswitchtopage): New wrapper macro for \X'pdf: switchtopage'. + +2012-03-10 Werner LEMBERG + + Fix compiler warnings. + + * src/preproc/html/pre-html.cpp (alterDeviceTo): Avoid ambiguous + if-else clause. + + * src/preproc/grn/main.cpp (sccsid): Comment out. + + * src/roff/troff/number.cpp (parse_expr) : Add cast. + + * src/devices/xditview/Makefile.sub (EXTRA_CFLAGS): Add `-Dlint' + so that unused static ID arrays don't cause a warning. + + (Some) problems reported by Bjarni Ingi Gislason + . + +2012-03-05 Werner LEMBERG + + * tmac/an-ext.tmac (SY): Handle argument with spaces correctly. + + Problem reported by Bjarni Ingi Gislason . + +2012-03-01 Bjarni Ingi Gislason + + [an-old] Fix warnings. + + * tmac/an-old.tmac (an-init): Insert missing braces. + +2012-02-26 Werner LEMBERG + + Update configuration files from `gnulib' and `config' repositories. + + This also fixes a problem with `iconv' on Solaris 10, as reported + in + + http://lists.gnu.org/archive/html/bug-groff/2012-02/msg00007.html + + * configure.ac: Call `gl_LOCALCHARSET. + Call `AM_ICONV' as C++. + + * config.guess, config.rpath, config.sub, install-sh, mkinstalldir: + Updated. + + * m4/codeset.m4, m4/glib21.m4, m4/iconv.m4, m4/lib-ld.m4, + m4/lib-link.m4, m4/lib-prefix.m4: Updated. + * m4/fcntl-o.m4, m4/localcharset.m4: New files. + + * Makefile.in: Updated. + + * src/include/localcharset.h, src/libs/libgroff/config.charset, + src/libs/libgroff/localcharset.c: Updated. + + * aclocal.m4, configure, src/include/config.hin: Regenerated. + +2012-02-20 Werner LEMBERG + + Update `gnulib' files. + + The invocation was + + gnulib-tool --add-import \ + --dir=src/libs/gnulib \ + wcwidth + + Additionally, src/libs/gnulib/configure.ac was adjusted from a + `test' run as described in the change from 2010-12-13. + + * src/libs/gnulib/*: Updated. + +2012-02-15 Deri James + + [gropdf] Fixes and omissions. + + * src/devices/gropdf/gropdf.pl (, do_u): Add facility to + handle track kerning (.tkf). + + (do_x, do_p, do_t): If pages are reordered using `pagename' and + `switchtopage' keep track of outline bookmarks. + (do_x): Handle multiple files on gropdf command line, stitch + multiple groff_out files together. In the main read loop any argc + values not consumed by options are taken as input files and + processed in order. What prevented it working properly before is + the way an `x i' (initialize) record has been handled. It now + processes the initialization code only in the first file. + + (PutHotSpot): Allow user to control size of hotspot bounding box + on clickable links by setting PDFHREF.LEADING + + * tmac/pdf.tmac (PDFHREF.LEADING): Adjust value. + (pdf*href): Pass value of PDFHREF.LEADING to gropdf. + +2012-02-10 Deri James + + [gropdf] Fix compatibility issues with pdfmark. + + * tmac/pdf.tmac (PDFHREF.VIEW.LEADING): Fix value. + (pdf:href.opt-X): Add check for -X option for .pdfhref. + +2012-02-08 Werner LEMBERG + + * src/preproc/pic/main.cpp (do_file): Check for invalid characters. + + Problem reported by Doug McIlroy . + +2012-01-25 Ingo Schwarze + + [mdoc] * tmac/doc-syms: Fix meaning of XBD acronym. + +2012-01-25 Tadziu Hoffmann + + * tmac/e.tmac (bl): Make it work inside blocks. + + See threads starting with + + http://lists.gnu.org/archive/html/groff/2011-12/msg00055.html + http://lists.gnu.org/archive/html/groff/2012-01/msg00000.html + +2012-01-10 Bruno Haible + + Fix handling of MAKEFLAGS variable. + + * Makefile.in (MAKE_K_FLAGS): Improved definition, + as explained and discussed in + + http://lists.gnu.org/archive/html/groff/2012-01/msg00039.html + +2012-01-03 Ingo Schwarze + + Improve parallel builds. + + Some hdtbl and mom examples want PostScript formatting which + requires the `DESC' file to be ready; however, the top-level + `Makefile.in' doesn't currently enforce the proper order of + building of `font/dev' before `contrib/hdtbl', `contrib/mom', and + so on. + + Given that `font/dev' and the contrib examples are in different + child processes of the recursive make system, it doesn't seem + possible to solve this using clean Makefile dependencies. We now + enforce the order by splitting the shell command invoking + recursive make in the top level `Makefile.in'. + + * Makefile.in (ALLDIRS): Remove `OTHERDIRS'. + (dodirs): Updated. + (`$(TARGETS)'): Handle `OTHERDIRS' separately. + +2012-01-03 Kristaps Dzonsons + + [mdoc] Add `-isoC-2011'. + + * tmac/doc-syms (doc-str-St--isoC-2011): Add it. + * tmac/groff_mdoc.man: Document it. + +2011-12-26 Deri James + + * font/devpdf/Makefile.sub: Only build fonts on first `make'. + +2011-12-08 Werner LEMBERG + + * doc/groff.texinfo (.tl): Improve documentation. + Wording suggested by Keith Marshall + . + +2011-12-01 Werner LEMBERG + + [me] Fix behaviour of centered block. + Problem and possible fix reported in thread starting at + + http://lists.gnu.org/archive/html/groff/2011-11/msg00002.html + + * tmac/e.tmac (`(c'): Always start with a new line. + +2011-12-01 Ingo Schwarze + + [man] Print volume headers like mdoc. + + * tmac/an-old.tmac (an-init): Add default volume name if fifth + argument to `.TH' is missing. + +2011-11-22 Werner LEMBERG + + * tmac/groff_man.man: Minor documentation improvements. + Suggested by Jeff Conrad . + +2011-11-14 Werner LEMBERG + + * doc/groff.texinfo: Improve doc for calling undefined identifiers. + +2011-11-14 Werner LEMBERG + + * src/preproc/tbl/tbl.man: Improve documentation of `_' and + friends. + +2011-10-31 Werner LEMBERG + + Fix compiler warnings. + + * src/preproc/eqn/main.cpp (do_file), src/roff/troff/env.cpp + (environment::print_env), src/roff/troff/mtsm.cpp + (statem::display_state): Add syntactical sugar. + + * src/utils/tfmtodit/tfmtodit.cpp (char_info_word): Use `unsigned + char' for all members. + + * src/devices/grohtml/html-text.cpp (html_text::remove_def): + Remove unused variable `q'. + + * src/devices/grohtml/post-html.cpp + (html_printer::lookahead_for_tables): Remove unused variable `left' + and `seen_text'. + +2011-10-23 Ingo Schwarze + + [mdoc] Synchronize string tables with the mandoc(1) utility. + + * tmac/doc-common: Add many architecture names used in NetBSD and + OpenBSD (and "arm" from FreeBSD) and remove the duplicate OS + version entry for Darwin-10.6.0. + + * tmac/doc-syms: Add many library names used in NetBSD and FreeBSD. + + * tmac/groff_mdoc.man: Document all supported architecture names) + (OS versions, and library names. + +2011-09-11 Joseph Koshy + + [mdoc] Add some library strings. + + * tmac/doc-syms: Add `libdwarf' and `libelf'. + * tmac/groff_mdoc.man: Document them. + +2011-08-14 Deri James + + [gropdf] More minor fixes. + + * font/devpdf/Makefile.sub (MOSTLYCLEANADD): Don't attempt to + install 'util/BuildFoundries', only used in 'make'. + + * src/devices/gropdf/gropdf.pl (, GetType1): Make STDOUT and + any font files read to be accessed in binary rather than text mode. + Prevents errors when running on systems set up for UTF-8. + +2011-08-10 Deri James + + [gropdf] Minor updates and fixes. + + * src/devices/gropdf/gropdf.pl: Change command line option `-fy' + to `-y' for consistency. + + Better support for Windows platform. + (do_x): Handle keywords `pagename' and `switchtopage'. + + * doc/groff.texinfo, src/devices/gropdf/gropdf.man: Updated. + + * font/devpdf/Foundry: Renamed to... + * font/devpdf/Foundry.in: This. + Add default alias font names. + + * font/devpdf/util/BuildFoundries.pl: This is now an installation + helper script and gets not longer installed. + Support alternative font file names (separated with `!'). + + * font/devpdf/Makefile.sub: Fixes to work with a separate build + directory. + Font files are now build at `make' time; this makes `test-groff' + work with -Tpdf. + + * font/devpdf/util/Makefile.sub: Removed. + + * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Handle devpdf + specially. + +2011-07-29 Daiki Ueno + + Fix cross building. Problem reported by Christophe Jarry + . + + * Makefile.in ($GNULIBDIRS): Pass original config arguments to + src/libs/gnulib/configure. + +2011-06-25 Deri James + + Add new output device `gropdf'. + + * font/devpdf/*: New device files for gropdf. + * src/devices/gropdf/*: New device. + + * Makefile.comm (install_dev, uninstall_dev): Handle more + subdirectories. + * Makefile.in (DEVDIRS, OTHERDIRS, EXTRADIRS): Add directories + related to gropdf. + * MANIFEST: Updated. + * test-groff.in (GROFF_BIN_PATH): Updated. + + * tmac/Makefile.sub (NORMALFILES): Updated. + * tmac/pdf.tmac: New file. + * tmac/troffrc: Updated. + + * doc/groff.texinfo: Document it. + * doc/Makefile.in, doc/Makefile.sub (groff_bin_dirs): Updated. + * doc/pic.ms: Updated. + + * man/groff_out.man, src/devices/grops/grops.man, + src/preproc/pic/pic.man, src/roff/groff/groff.man, + src/utils/afmtodit/afmtodit.man, src/utils/pfbtops/pfbtops.man: + Updated. + + * contrib/pdfmark/pdfmark.ms: Updated. + +2011-07-20 George HELFFRICH + + Improve line numbering support in tbl and with me macros. + + * tmac/e.tmac (n1, n2, TH, PS): Implement it. + (@h, @n, @o, @t, @k, )b, (c, (q, )q, (l, )l, (f, @q, PE): Updated. + * doc/meref.me: Document changes. + + * src/preproc/tbl/table.cpp (ROW_START_LINE_REG) + (ROW_SAVE_LINE_REG, ROW_MAX_LINE_REG, REPEATED_NM_SET_MACRO) + (REPEATED_NM_SUS_MACRO): New macros. + + (table::init_output): Define REPEATED_NM_SET_MACRO and + REPEATED_NM_SUS_MACRO. + (table::print_single_hline, table::print_double_hline, + table::define_bottom_macro, table::do_row, table::do_top, + table::do_bottom): Updated. + + * doc/webpage.ms: Updated. + +2011-07-12 Ted Harding + Werner LEMBERG + + * src/preproc/tbl/tbl.man: Mention trick to get abutting rules. + +2011-07-03 Ben Laurie + + Fix clang warnings. + + * src/libs/libdriver/input.cpp (odd): Use parentheses. + + * src/roff/troff/mtsm.cpp (state_set::is_in): Fix parentheses; + previous code always tested for bit 0. + +2011-07-03 Guillem Jover + + mdoc: Update more OS versions strings. + + * tmac/doc-common: Add versions strings for NetBSD, OpenBSD, + FreeBSD, and DragonFly. + +2011-04-08 Michail Vidiassov + + mdoc: Update various strings related to Mac OS X and FreeBSD. + + * tmac/doc-common: Add strings for FreeBSD 8.2 and Darwin 9.7-11.0. + * tmac/doc-syms: Add strings -lbsm and -lSystem. + +2011-03-29 Christian Weisgerber + + Fix compilation issues with gcc 2.95. + + * src/roff/troff/input.cpp (my_input_iterator): Define as an alias + for `input_iterator' which is predefined by an old libstdc++. + +2011-03-29 Ingo Schwarze + + Add another POSIX standard. + + * tmac/doc-syms: Add POSIX 1003.1b. + +2011-03-29 Christian Weisgerber + + Fix build with non-GNU make. + + * Makefile.in ($TARGETS): We must not pass `$MDEFINES' recursively + down to the sub-makes started in src/libs/gnulib, because that + directory has its own values for `$top_srcdir' etc., and + overriding those from the command line will cause the build to + fail. Currently, `$MAKEOVERRIDES' will prevent the recursive + passing of those overrides with GNU make, but not with other + make(1) implementations. It looks like all targets that require + `$MDEFINES' set them explicitly anyway, so we shouldn't need to + set `$MDEFINES' on the top level. + +2011-03-21 Jan Vcelak + Bernd Warken + + [groffer] Remove hardcoded path to 'libdir/groff/groffer' + directory. + + * configure.ac: add GROFFERDIR variables. + + * Makefile.in: add and handle variable groffer_dir + + * m4/groff.m4: set up the --with-grofferdir command line option. + +2011-03-18 Werner LEMBERG + + [troff] Improve error message. + + * src/roff/troff/input.cc (token::delimiter): Improve error + message. Suggested by Doug McIlroy . + +2011-03-04 Werner LEMBERG + + [mdoc] Within .An, .Aq, .Ao, and .Ac now use `<' and `>'. + Problem reported by Ulrich Spörlein + + * tmac/doc.tmac (Aq, Ao, Ac): Implement it to follow RFC 822 and + RFC 2822. + +2011-02-14 Werner LEMBERG + + * doc/groff.texinfo: Add another example for .em request + Based on a patch from Anton Shepelev . + +2011-01-31 Werner LEMBERG + + More fixes for Savannah bug #32301. + + * src/devices/grops/Makefile.sub (XLIBS), + src/devices/grodvi/Makefile.sub, src/devices/grolj4/Makefile.sub, + src/devices/grohtml/Makefile.sub, src/devices/grolbp/Makefile.sub: + Add $(LIBGNU). + +2011-01-31 Werner LEMBERG + + Fix Savannah bug #32301. + + * src/roff/groff/Makefile.sub (XLIBS), + src/preproc/grn/Makefile.sub, src/preproc/html/Makefile.sub: Add + $(LIBGNU). + +2011-01-29 Krzysztof Å»elechowski + + * doc/groff.texinfo: Complete documentation on output devices. + +2011-01-28 Werner LEMBERG + + Handle `refer*.tmac'. + + * tmac/Makefile.sub (NORMALFILES): Add `refer*.tmac'. + * tmac/refer-mm.tmac: Moved to contrib/mm. + +2011-01-28 Werner LEMBERG + + Improve `refer' support of -me. + + * tmac/refer.tmac, tmac/refer-me.tmac, tmac/refer-ms.tmac, + tmac/refer-mm.tmac: New files. The code in refer.tmac is + based on the old code from `s.tmac'. + + * tmac/s.tmac: Remove direct refer support and include + `refer-ms.tmac' instead. + * tmac/e.tmac: Remove direct refer support and include + `refer-me.tmac' instead. + + * NEWS: Updated. + +2011-01-22 Werner LEMBERG + + [groff.texinfo]: Updates. + + * doc/groff.texinfo: Document groff's `-j' option. + Add dummy section for `chem' preprocessor. + +2011-01-22 Werner LEMBERG + + Update `grog'. + + * src/roff/grog/{groff.sh,groff.pl}: `groff' now calls `pic' + automatically if `grap' or `chem' is used. + `chem' has been folded into `groff'. + * src/roff/grog/grog.man: Updated. + +2011-01-22 Werner LEMBERG + + Make `groff -G' imply `-p'. + + * src/roff/groff/groff.cpp (main): Implement it. + * src/roff/groff/groff.man: Updated. + +2011-01-22 Werner LEMBERG + + Integrate `chem' into `groff' (new option -j). + + * src/roff/groff/groff.cpp (CHEM_INDEX): New constant. + (main) ['j']: Add `chem'. + (synopsis, help): Updated. + * src/roff/troff/pipeline.h (MAX_COMMANDS): Increase to 14. + + * src/roff/groff/groff.man: Document new command line option. + * NEWS: Updated. + +2011-01-22 Werner LEMBERG + + * doc/groff.texinfo: `chem' is now part of groff. + +2011-01-22 Werner LEMBERG + + * doc/groff.texinfo: Improve description of `.de'. + + Based on suggestions by Ted Harding and Deri James. + +2011-01-20 Colin Watson + + Fix handling of wide characters in no-SGR mode. + + * src/devices/grotty/tty.cpp (tty_printer::make_underline): Only + emit a single backspace in no-SGR mode. less (at least) + backspaces over a character at a time. + (tty_printer::make_bold): Likewise. + +2011-01-19 Werner LEMBERG + + * src/preproc/pic/pic.man: Add pic manual to `SEE ALSO' section. + +2011-01-14 Werner LEMBERG + + Split ChangeLog. + + * ChangeLog: Split off older entries into... + * ChangeLog.119, ChangeLog.120: these new files. + +2011-01-15 Colin Watson + + * Makefile.comm (INCLUDES): Fix typo. + +2011-01-05 Werner LEMBERG + + * doc/webpage.ms: Fix rendering of title image. + + +________________________________________________________________________ + +##### License + +Copyright 2011-2018 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + + +##### Editor settings +Local Variables: +fill-column: 72 +mode: change-log +version-control: never +End: +vim:set autoindent textwidth=72: diff --git a/FOR-RELEASE b/FOR-RELEASE index 1d9ae0b..592a48f 100644 --- a/FOR-RELEASE +++ b/FOR-RELEASE @@ -1,13 +1,58 @@ - Copyright 2013-2018 Free Software Foundation, Inc. + Copyright 2013-2022 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This file describes how to prepare `groff' for a new release. +This file describes how to prepare 'groff' for a new release. ######################################################################## -The file `INSTALL.gen' shall *never* be changed manually! It is a -generic file provided from GNU (normally called `INSTALL'). +* Update font description files that we generate from external data and + provide with our source distribution. + + Directory Format Tool + --------- ------ ---- + devX* X11 core/server font xtotroff + + The make(1) target "maintainer-font-descriptions" produces these font + descriptions. + +* Retrieve current versions of UnicodeData.txt[1] and the Adobe Glyph + List (AGL)[2], and use them with + src/utils/afmtodit/make-afmtodit-tables to update + src/utils/afmtodit/afmtodit.tables. + + [1] E.g., . + Check for the latest _released_ version of Unicode at the time. + Data for the forthcoming release may be available. + [2] + + ( may be more convenient.) + +* Update the 'gnulib' sub-module to the latest version and the + corresponding required commit hash identifier in 'INSTALL.REPO'. + +* Update the release version number where it is hard-coded. + + NEWS + + BUG-REPORT + + arch/mingw/grap2graph.cmd + + doc/groff.texi (multiple occurrences) + + doc/webpage.ms + +* If the major or minor version number is being incremented, split off + a historical ChangeLog file and add it to `EXTRA_DIST` in Makefile.am. + +* Update in 'src/roff/groff/groff.cpp' the 'printf' that displays the + copyright. + +* Update the copyright year with 'update-copyright.sh'. + +* Increment the version number by tagging the release, beta, or release + candidate. groff requires an explicit three-part version, + major.minor.revision, due to the .Y register. + + $ git tag 1.23.0.rc1 diff --git a/HACKING b/HACKING new file mode 100644 index 0000000..6b6c449 --- /dev/null +++ b/HACKING @@ -0,0 +1,178 @@ + Copyright 2022-2023 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without + modification, are permitted in any medium without royalty provided + the copyright notice and this notice are preserved. + +This file contains advice on developing and contributing to groff. It +assumes that developers will install the 'git' revision control +system and build groff using the instructions in 'INSTALL.repo'. +Familiarize yourself with the structure of the source tree by studying +its 'MANIFEST' file at the top level. + +Implementation languages +------------------------ + +Beyond what is said under "Dependencies" in 'INSTALL.extra', +contributors should note that due to the age of the code base, much of +the C++ dialect employed by groff components, while standard, is older +than C++98--closer to Annotated Reference Manual C++ (Ellis, Stroustrup; +Addison-Wesley, 1990). groff implements its own string class and the +Standard Template Library is little used. A modest effort is underway +to update the code to more idiomatic C++98. Where a C++11 feature +promises to be advantageous, it may be annotated in a code comment. + + +Automake +-------- + +A document explaining the basics of GNU Automake and its usage in groff +is available in 'doc/automake.mom'; peruse a PDF rendering in +'doc/automake.pdf' in your build tree. + + +Testing +------- + +Running the test suite with 'make check' after building any substantive +change to groff logic is encouraged. You should certainly do so, and +confirm that the tests pass, before submitting patches to the groff +mailing list or Savannah issue tracker. + +If you find a defect in a test script, that can be reported via Savannah +like any other bug. + + +Documenting changes +------------------- + +The groff project has a long history and a large, varied audience. +Changes may need to be documented in up to three places depending on +their impact. + +1. Changes should of course be documented in the Git commit message. + If a change alters only comments or formatting of source code, or + makes editorial changes to documentation, and does not resolve a + Savannah ticket, you can stop at that. + +2. The 'ChangeLog' file follows the format and practices documented in + the GNU Coding Standards. + https://www.gnu.org/prep/standards/html_node/Change-Logs.html + + The sub-projects in the 'contrib' directory each have their own + dedicated ChangeLog files. The file specifications documented there + are relative to the sub-project, not the root of the groff source + tree. When converted to a commit message, add 'contrib/$SUBPROJECT' + to the entries. + + Apart from 'contrib', groff uses a single (current) 'ChangeLog' file + for the rest of its source tree. + + It is convenient to write the ChangeLog entry or entries first, then + construct a commit message from it (or them). + +3. The 'NEWS' file documents changes to groff that a user, not just a + developer, would notice, not including the resolution of defects. + + As a hypothetical example, correcting a rendering error in tbl(1) + such that any table with more than 20 rows no longer had the text + "FOOBAR" spuriously added to some entries would not be a 'NEWS' + item, because the appearance of such text in the first place is a + surprising deviation from tbl's ideal and historical behavior. In + contrast, adding a command-line option to tbl, or changing the + meaning of its "expand" region option such that it no longer + horizontally compresses tables as well, _would_ be 'NEWS'-worthy. + + +Writing Tests +------------- + +Here are some portability notes on writing automated tests. + +* Write to the POSIX standard for the shell and utilities where + possible. Issue 4 from 1994 is old enough that no contemporary system + has a good reason for not conforming. A copy of the standard is + available at the Open Group's web site. + https://pubs.opengroup.org/onlinepubs/009656399/toc.pdf + +* The GNU coreutils "seq" command is handy but not standardized by + POSIX. Replace it with a while loop. + + # emulate "seq 53" + n=1; while [ $n -le 53 ]; do echo $n; n=$(( n + 1 )); done; unset n + +* The "od" command on macOS can put extra space characters (i.e., spaces + that don't correspond to the input) at the ends of lines when using + the "od -t c" format; GNU od does not. + + So a regex like this that works with GNU od: + grep -Eqx '0000000 +A +\\b +B +\\b +C D +\\n' + might need to be weakened to the following on macOS. + grep -Eqx '0000000 +A +\\b +B +\\b +C D +\\n *' + +* The "od" command on macOS does not respect the environment variable + assignment "LC_ALL=C" when processing byte values 127' header file. The option '-nodtk' can be used as a +parse its ‘’ header file. The option ‘-nodtk’ can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" -and if that doesn't work, try +and if that doesn’t work, try ./configure CC="cc -nodtk" - On Solaris, don't put '/usr/ucb' early in your 'PATH'. This + On Solaris, don’t put ‘/usr/ucb’ early in your ‘PATH’. This directory contains several dysfunctional programs; working variants of -these programs are available in '/usr/bin'. So, if you need '/usr/ucb' -in your 'PATH', put it _after_ '/usr/bin'. +these programs are available in ‘/usr/bin’. So, if you need ‘/usr/ucb’ +in your ‘PATH’, put it _after_ ‘/usr/bin’. - On Haiku, software installed for all users goes in '/boot/common', -not '/usr/local'. It is recommended to use the following options: + On Haiku, software installed for all users goes in ‘/boot/common’, +not ‘/usr/local’. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== - There may be some features 'configure' cannot figure out + There may be some features ‘configure’ cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the -_same_ architectures, 'configure' can figure that out, but if it prints +_same_ architectures, ‘configure’ can figure that out, but if it prints a message saying it cannot guess the machine type, give it the -'--build=TYPE' option. TYPE can either be a short name for the system -type, such as 'sun4', or a canonical name which has the form: +‘--build=TYPE’ option. TYPE can either be a short name for the system +type, such as ‘sun4’, or a canonical name which has the form: CPU-COMPANY-SYSTEM @@ -268,101 +268,101 @@ where SYSTEM can have one of these forms: OS KERNEL-OS - See the file 'config.sub' for the possible values of each field. If -'config.sub' isn't included in this package, then this package doesn't + See the file ‘config.sub’ for the possible values of each field. If +‘config.sub’ isn’t included in this package, then this package doesn’t need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should -use the option '--target=TYPE' to select the type of system they will +use the option ‘--target=TYPE’ to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with '--host=TYPE'. +“host” platform (i.e., that on which the generated programs will +eventually be run) with ‘--host=TYPE’. Sharing Defaults ================ - If you want to set default values for 'configure' scripts to share, -you can create a site shell script called 'config.site' that gives -default values for variables like 'CC', 'cache_file', and 'prefix'. -'configure' looks for 'PREFIX/share/config.site' if it exists, then -'PREFIX/etc/config.site' if it exists. Or, you can set the -'CONFIG_SITE' environment variable to the location of the site script. -A warning: not all 'configure' scripts look for a site script. + If you want to set default values for ‘configure’ scripts to share, +you can create a site shell script called ‘config.site’ that gives +default values for variables like ‘CC’, ‘cache_file’, and ‘prefix’. +‘configure’ looks for ‘PREFIX/share/config.site’ if it exists, then +‘PREFIX/etc/config.site’ if it exists. Or, you can set the +‘CONFIG_SITE’ environment variable to the location of the site script. +A warning: not all ‘configure’ scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the -environment passed to 'configure'. However, some packages may run +environment passed to ‘configure’. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set -them in the 'configure' command line, using 'VAR=value'. For example: +them in the ‘configure’ command line, using ‘VAR=value’. For example: ./configure CC=/usr/local2/bin/gcc -causes the specified 'gcc' to be used as the C compiler (unless it is +causes the specified ‘gcc’ to be used as the C compiler (unless it is overridden in the site shell script). -Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Unfortunately, this technique does not work for ‘CONFIG_SHELL’ due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash -'configure' Invocation +‘configure’ Invocation ====================== - 'configure' recognizes the following options to control how it + ‘configure’ recognizes the following options to control how it operates. -'--help' -'-h' - Print a summary of all of the options to 'configure', and exit. +‘--help’ +‘-h’ + Print a summary of all of the options to ‘configure’, and exit. -'--help=short' -'--help=recursive' - Print a summary of the options unique to this package's - 'configure', and exit. The 'short' variant lists options used only - in the top level, while the 'recursive' variant lists options also +‘--help=short’ +‘--help=recursive’ + Print a summary of the options unique to this package’s + ‘configure’, and exit. The ‘short’ variant lists options used only + in the top level, while the ‘recursive’ variant lists options also present in any nested packages. -'--version' -'-V' - Print the version of Autoconf used to generate the 'configure' +‘--version’ +‘-V’ + Print the version of Autoconf used to generate the ‘configure’ script, and exit. -'--cache-file=FILE' +‘--cache-file=FILE’ Enable the cache: use and save the results of the tests in FILE, - traditionally 'config.cache'. FILE defaults to '/dev/null' to + traditionally ‘config.cache’. FILE defaults to ‘/dev/null’ to disable caching. -'--config-cache' -'-C' - Alias for '--cache-file=config.cache'. +‘--config-cache’ +‘-C’ + Alias for ‘--cache-file=config.cache’. -'--quiet' -'--silent' -'-q' +‘--quiet’ +‘--silent’ +‘-q’ Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to '/dev/null' (any error + suppress all normal output, redirect it to ‘/dev/null’ (any error messages will still be shown). -'--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - 'configure' can determine that directory automatically. +‘--srcdir=DIR’ + Look for the package’s source code in directory DIR. Usually + ‘configure’ can determine that directory automatically. -'--prefix=DIR' +‘--prefix=DIR’ Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. -'--no-create' -'-n' +‘--no-create’ +‘-n’ Run the configure checks, but stop before creating any output files. -'configure' also accepts some other, not widely useful, options. Run -'configure --help' for more details. +‘configure’ also accepts some other, not widely useful, options. Run +‘configure --help’ for more details. diff --git a/INSTALL.REPO b/INSTALL.REPO index 490f9d7..c078359 100644 --- a/INSTALL.REPO +++ b/INSTALL.REPO @@ -1,141 +1,136 @@ - Copyright 2013-2018 Free Software Foundation, Inc. + Copyright 2013-2022 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This file contains information that supplements the generic -installation instructions in file `INSTALL'. It is meant for -people building directly from the development repository, rather than -a release or snapshot tarball. +This information supplements the generic installation instructions in +the file 'INSTALL'. It is meant for people building from the +development repository, rather than a distribution archive. +Distribution archives include a 'configure' script, among other files; +the repository does not. If you want to start building the 'groff' +system using an existing 'configure' script, you don't need the +information in this file. -If you want to start compiling the `groff' system with an existing -script `configure' you won't need the information in this file. You -need them only if you want to build groff from the git repository. +Dependencies +------------ -1. Initial build ----------------- +The dependencies documented in the 'INSTALL.extra' file are required, as +are several others. -You will need autoconf version and 2.65 or higher and automake version -1.12.2 or higher. These minimal versions are set in the bootstrap.conf -file. +* You will need Autoconf version 2.68 or higher and Automake version + 1.12.2 or higher. These requirements are asserted in the + 'bootstrap.conf' file. -On operating systems supporting concurrent installation of multiple -versions of the autotools, set the following environment variables: + On operating systems supporting concurrent installation of multiple + versions of the GNU Autotools, set environment variables as in the + following example, adjusting the version numbers as required. - export AUTOMAKE_VERSION=1.14 - export AUTOCONF_VERSION=2.69 + $ export AUTOMAKE_VERSION=1.14 + $ export AUTOCONF_VERSION=2.69 -You will also need to have `pkg-config' installed on your system. +* You will need a 'yacc' program. We recommend Berkeley yacc ('byacc') + or GNU Bison ('bison'). -First invoke the bootstrap script: +* groff's Texinfo manual is generated in several formats: GNU Info, + HTML, plain text, TeX DVI, and PDF. The former three require + 'makeinfo' from GNU Texinfo 5.0 or later. The latter two additionally + require a TeX installation, such as TeX Live. If TeX is not + installed, the DVI and PDF formats of the manual cannot be generated. + This will cause a build failure only if the Texinfo source file + "groff.texi" is updated and the make(1) "dist" or relevant file + targets are manually specified. + +* You will need the 'xpmtoppm', 'pnmdepth', and 'pnmtops' programs from + the Netpbm distribution. + + +Bootstrapping from a Git checkout +--------------------------------- + +Invoke the bootstrap script. $ ./bootstrap -This will: - - - clone the gnulib repository as a git submodule in 'gnulib', add - the needed gnulib sources files in 'lib', add the needed gnulib m4 - macros in 'gnulib_m4' - - Invoke autoreconf that will call all the `GNU autotools' - (`aclocal', `autoconf', `automake') in the right order for - creating the following files: +What bootstrapping does +----------------------- + +The foregoing procedure will do two things: + + - clone the gnulib repository as a Git submodule in 'gnulib', add the + needed gnulib source files in 'lib' as well as required gnulib m4 + macros in 'gnulib_m4'; and + + - invoke 'autoreconf', which will call the GNU Autotools ('aclocal', + 'autoconf', 'automake') in the right order to create the following + files. -- INSTALL (a symlink to gnulib's INSTALL file) -- Makefile.in -- aclocal.m4 -- autom4te.cache/ - -- build-aux/ (that contains all the helper scripts) + -- build-aux/ (which contains all the helper scripts) -- configure -- src/include/config.hin -Note that aclocal.m4 is generated and the groff m4 macros are included -via the acinclude.m4 file. - -At this point you can invoke the `configure' script (that generates -the `config.status' script; it is the `config.status' script generates -the Makefile) and call 'make' to build the groff project. You can do -it in the source tree: +'aclocal.m4' is a generated file; groff's m4 macros are included via the +'acinclude.m4' file. + + +Building +-------- + +You can now invoke the 'configure' script. It produces the +'config.status' script, which generates the Makefile. Then call 'make' +to build the groff project. You can do these from the source tree. $ ./configure - $ make + $ make # run with -j option if desired -You can also build groff in an out of source build tree, which is cleaner: +You can alternatively build groff outside of its source tree, which is +cleaner, leaving fewer files to confuse 'git status' if you aim to +undertake development. $ mkdir build $ cd build $ ../configure - $ make - -Note that parallel build is also supported and make can be invoked -with the -j option, which will greatly speed up the build. - -When the build is finished you can install the whole groff -installation with: - - $ make install - -Notes: - -If you use an old `autoreconf' version < 2.69, there might be an error -warning like: - - /usr/share/aclocal/gtkglextmm-1.2.m4:225: - warning: underquoted definition of AC_GTKGLEXTMM_SUPPORTS_MULTIHEAD - /usr/share/aclocal/gtkglextmm-1.2.m4:225: - run info '(automake)Extending aclocal' - /usr/share/aclocal/gtkglextmm-1.2.m4:225: - or see http://www.gnu.org/software/automake/manual/automake.html#Extending-aclocal - -Just ignore this. It doesn't occur in the actual versions of -`autoreconf'. - -Troff errors of the types - - can't transparently output node at top level - and - can't translate character code n to special character 'c' in transparent throughput + $ make # run with -j option if desired -may safely be ignored. +A separate build tree need not be a subdirectory of the source. -A few sanity checks can be done with the command: - $ make check +Evaluation +---------- -This will perform some tests on the generated examples. However, -these checks are for the moment quite limited. +Several dozen sanity checks can be performed within the build tree. -The groff texinfo manual can be generated in pdf and html formats -with: + $ make check # run with -j option if desired - $ make doc -and installed with: +Installation +------------ - $ make install-doc +When the build is finished you can install the groff build artifacts. + $ make install install-doc # run with 'sudo' if necessary -2. Modification of autotools files ----------------------------------- -Previously, when groff used `autoconf' only and not `automake', you -had to invoke manually the autotools, depending on what you -modified. For example, to change the file `aclocal.m4', you had to run -the shell command 'aclocal -I m4', to recreate the files `configure' -and `Makefile', you had to use the command 'autoreconf -I m4'. +Uninstalling +------------ -Now, as groff uses `automake', you don't need to run `autoreconf'. If -you make some changes in Makefile.am or configure.ac, all the files -that need to be updated will be regenerated when you execute `make'. +See "Uninstalling" in the 'INSTALL.extra' file. +Rebuilding +---------- -3. Quick start on the usage of `automake' in groff --------------------------------------------------- +Start over from "Building" above. -A little document explaining the basics of automake and its usage in -groff is available in doc/automake.mom. It is currently not -automatically generated, to build it: -pdfmom automake.mom > automake.pdf +##### Editor settings +Local Variables: +fill-column: 72 +mode: text +End: +# vim: set autoindent textwidth=72: diff --git a/INSTALL.extra b/INSTALL.extra index d7bb2fd..78d4139 100644 --- a/INSTALL.extra +++ b/INSTALL.extra @@ -1,73 +1,100 @@ - Copyright 1997-2018 Free Software Foundation, Inc. + Copyright 1997-2022 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file contains information that supplements the generic -installation instructions in file `INSTALL'. +installation instructions in file 'INSTALL'. -Normal Installation -=================== +Building and Installing from within the Source Tree +=================================================== + +A simple method of building and installing groff is as follows. -The simplest way to compile groff is: + 1. 'cd' to the directory containing groff's source code and type + './configure' to configure groff for your system. If you are + using 'csh' on an old version of AT&T Unix System V, you might need + to type 'sh ./configure' instead to prevent 'csh' from trying to + execute 'configure' itself. - 1. `cd' to the directory containing groff's source code and type - `./configure' to configure groff for your system. If you are - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. + While 'configure' runs, it reports properties of the host system + that determine how the build is to be performed. - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. + 2. Type 'make' to compile groff. You may wish to add the '-j' option + to accelerate the build on multicore systems. - 2. Type `make' to compile groff. + 3. Optionally, check the build for sound operation as described under + "Evaluation" below. - 3. Type `sudo make install' to install the groff programs and any - data files and documentation. `make install' is the only step for - which you need `root' access; this is done by `sudo'. + 4. Type 'sudo make install install-doc' to install groff's programs, + data files, and documentation. This is the only step for which you + need 'root' access; 'sudo' obtains this access. - 4. You can remove the groff binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile groff for - a different kind of computer), type `make distclean'. + 5. You can remove the groff executables and other generated files from + the source code directory by typing 'make clean'. To also remove + the files that 'configure' created (so you can compile groff for a + different kind of computer or with different options to + 'configure'), type 'make distclean'. -External Installation -===================== +Building and Installing from outside the Source Tree +==================================================== -It is also possible to perform the whole installation process outside -of the source code directory. In this case a whole external build +It is also possible to perform the build and installation procedure +outside the source code directory. In this case an external build directory structure is created without changing any parts of the source -code tree. This is useful if the source code is read-only or if +tree. This practice is useful if the source code is read-only or if several different installations, such as for multiple architectures, should be constructed. -As an example we assume that the source code of the `groff' code is in -`/usr/local/src/groff', and that the build process should be done -within the directory `/home/my/groff.compile'. +As an example, we will imagine that groff's source code is in +'/usr/local/src/groff' and that the build should happen within the +directory '/home/my/groff-build'. These directory names can be anything +valid on the operating system. + + 0. Create '/home/my/groff-build' and 'cd' to that directory. + + 1. Type '/usr/local/src/groff/configure' to configure groff for your + system. If you are using 'csh' on an old version of AT&T System V + Unix, you might need to type 'sh /usr/local/src/groff/configure' + instead. + + 2. Type 'make' to compile groff. You may wish to add the '-j' option + to accelerate the build on multicore systems. - 0. Create `/home/my/groff.compile' and change to that directory. + 3. Optionally, check the build for sound operation as described under + "Evaluation" below. - 1. Call `/usr/local/src/groff/configure' in that directory to - configure groff for your system. If you are using `csh' on an old - version of System V, you might need to type `sh - /usr/local/src/groff/configure' instead. + 4. Type 'sudo make install install-doc' to install groff's programs, + data files, and documentation. This is the only step for which you + need 'root' access; 'sudo' obtains this access. - 2. Type `make' to compile groff in that directory. + 5. You can remove the groff executables and other generated files from + the source code directory by typing 'make clean'. To also remove + the files that 'configure' created (so you can compile groff for a + different kind of computer or with different options to + 'configure'), type 'make distclean'. - 3. Type `sudo make install' to install the groff programs and any - data files and documentation. - 4. You can remove the groff binaries and object files from the - build directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. +Unprivileged Installation +========================= +The use of 'sudo' is necessary only if one or more destination +directories used by the 'make install' command are in locations that +require administrative access for writing. You can 'configure' groff +with options like '--prefix' that select an alternative directory that +is writable by the user conducting the build. Type './configure --help' +from the groff source tree for documentation of relevant options. +Running groff commands from such a directory may require you to set the +'GROFF_BIN_PATH', 'GROFF_FONT_PATH', and 'GROFF_TMAC_PATH' environment +variables. See the groff(1) man page. See "Evaluation" below for +instructions on viewing this man page without having groff installed. -Special Platforms -================= + +Non-POSIX Platforms +=================== For instructions how to build groff with DJGPP tools for MS-DOS and MS-Windows, see the file arch/djgpp/README. @@ -79,72 +106,168 @@ MS-Windows, see the file README.MinGW. Dependencies ============ -groff is written in C++, so you need a C++ compiler. The C++ source -files use a suffix of `.cpp', so your C++ compiler must be able to -handle this. If you don't already have a C++ compiler, we suggest gcc -2.7.1 or later (gcc version 2 includes GNU C++ as well as GNU C). From -gcc 2.5, it is no longer necessary to install libg++: the C++ header -files needed by groff are created by the gcc installation process. To -override configure's choice of C++ compiler, you can set the CXX -environment variable. +groff is predominantly written in ISO C++98, so you need a C++ compiler +capable of handling this standardized version of the language. The C++ +source files use a suffix of '.cpp'; your C++ compiler must be able to +handle this. A C/C++ preprocessor that conforms to ISO C90 is also +required. If you don't already have a C++ compiler, we suggest GCC 9.4 +or later. To override the 'configure' script's choice of C++ compiler, +you can set the CXX environment variable to the name of its executable. + +A few components of groff are written in ISO C99. Features later made +optional by ISO C11 (the 'complex' primitive data type and +variable-length arrays) are not used. + +Several programs distributed with GNU roff are written in the Perl +language. Version 5.6.1 (1 April 2001) or later is required. + +The 'uchardet' library is an optional dependency of the 'preconv' +program: if this library is found by 'configure', it will be +automatically used by 'preconv'. Discovery of the 'uchardet' library +requires the 'pkg-config' program to be installed on your system, as +well as the library's C header files--on a package-based host system, +this can mean installing uchardet's '-dev' or '-devel' package. + +URW fonts +--------- + +The 'configure' script searches for PostScript Type 1 fonts originating +with the URW foundry; these are metrically compatible replacements for +the Adobe PostScript Level 2 base 35 fonts required by that standard. +These URW fonts are packaged with Ghostscript and in various derivative +versions. The Adobe fonts are not free software, but the replacements, +often named "Nimbus Roman", "Nimbus Sans", and "Nimbus Mono", and so +forth, are. The PostScript and early PDF standards assumed that these +base fonts would be supplied by the rendering device (a printer or PDF +viewer). Nowadays the PDF standard expects all fonts to be embedded in +the document; if groff's gropdf(1) output driver knows where to find +these fonts, you can use its "-e" option for this purpose. + +The build process populates "Foundry" and "download" files that tell +gropdf where to find their groff font descriptions and the font files +themselves, respectively. If you have multiple versions of the URW +fonts available on your system, or the 'configure' script cannot locate +them on its own, use its "--with-urw-fonts-dir" option to tell the +script where to find them. If you never use groff to generate +PostScript or PDF documents, you can ignore any output from the +'configure' script about URW fonts. -If you have a library that provides a faster malloc than your system's -usual malloc, it is good idea to include it in LIBS. For example, -using the malloc that comes with GNU Emacs version 20 can give a -worthwhile (and sometimes spectacular) performance improvement. -Many programs within the `groff' system are written in the Perl -language. So you need a `perl' program with the least version of -`v5.6.1'. +Miscellaneous +============= -In order to build the documentation you would need `makeinfo' from the -'texinfo' package, in fact `configure' will fail if this program is -not found unless you pass the option `with-doc=no'. +If you want A4 or U.S. letter paper format and the 'configure' script +produces an incorrect guess, say -The `uchardet' library is an optional dependency of the `preconv' -program: if this library is found by `configure' it will be -automatically used by `preconv'. In order to discover the presence of -the `uchardet' library you would also need to have the `pkg-config' -program installed on your system. + PAGE=xxx ./configure +where 'xxx' should be either 'A4' or 'letter'. This affects only the +media size used by some groff output drivers, like grops (which can +still be overridden on the command line). For compatibility with AT&T +troff, GNU troff's default page length is always 11 inches. The page +length can be changed with the 'pl' request or with the "papersize" +macro package; see section "Paper format" in groff(1). -Miscellaneous + +Evaluation +========== + +Once groff is built, you can check it for correct operation without +having to install it. groff comes with a test suite; use 'make check' +to run it. + +You can also try it out from the directory you used to build it. A +script called 'test-groff' is supplied for this purpose. It sets up +environment variables to allow groff to run without being installed. +For example, from the directory where you built groff, the command + + ./test-groff -t -man -Tascii src/roff/groff/groff.1 | less -R + +displays the groff(1) man page with the 'less' pager. (You might prefer +either the '-Tlatin1' or '-Tutf8' option to '-Tascii' depending on the +character set you're using.) + + +Documentation ============= -If you want A4 or letter paper format and the configure script produces -an incorrect guess, say +The groff Texinfo manual can be viewed in several formats. Versions +corresponding to the source document 'doc/groff.texi' are supplied with +the source distribution archive. You can browse it in GNU info format. - PAGE=xxx ./configure + info doc/groff.info + +It can be viewed as text encoded in ISO Latin-1 as well. + + iconv -f latin1 -t utf8 doc/groff.txt | less # for UTF-8 users + less doc/groff.txt # for Latin-1 users + +Renderings in HTML, TeX DVI, and PDF are also available. + + lynx doc/groff.html + xdvi doc/groff.dvi + evince doc/groff.pdf + +A compilation of groff's man pages is available in text (with ISO 6429 +escape sequences) and PDF. + + less -R doc/groff-man-pages.utf8.txt + evince doc/groff-man-pages.pdf -where `xxx' should be either `A4' or `letter'. Note that this only -affects the paper selection of some device drivers like grops (which -can be still overridden on the command line). For compatibility with -ditroff, the default page length in gtroff is always 11 inches. The -page length can be changed with the `pl' request. -When you have built groff but not installed yet, you can use the -test-groff script to try groff out on one of the man pages. (Use the -.n files not the .man files.) The test-groff script sets up environment -variables to allow groff to run without being installed. For example, -you could do +In Case of Trouble +================== - ./test-groff -man -Tascii src/roff/groff/groff.n | less +If a test fails, gather its log file from the build directory. For +instance, the test "tmac/tests/localization-works.sh" (in the source +directory) will have a log file called +"tmac/tests/localization-works.sh.log" in the build directory. -to display the groff(1) man page with the `less' pager. +To re-run a test, change to the top of the build directory (if +necessary) and run the test by name from the shell prompt. -To get a DVI, PDF, or HTML version of the groff texinfo manual, say -`make groff.dvi', `make groff.pdf', or `make groff.html', respectively, -in the `doc' subdirectory (after configuring the groff package). Note -that you need texinfo version 4.8 as a prerequisite. +For example, to rerun the test mentioned above from a "build" directory +I created as a subdirectory in the source tree, I would do this. -If you have problems, read the PROBLEMS file. If this doesn't help -and you need support, please contact the `groff' mailing list. If you -think that you have found a bug, please submit a report in our bug -tracker at + (cd build && ../tmac/tests/localization-works.sh) - https://savannah.gnu.org/projects/groff +I can view the test log as follows. + + cat build/tmac/tests/localization-works.sh.log + +Many known issues are documented in the 'PROBLEMS' file; some apply to +historical systems. You can also browse groff bug reports via the GNU +Savannah issue tracker to see if your issue has already been reported. + + https://savannah.gnu.org/bugs/?group=groff + +If that doesn't help and you need support, please contact the groff +mailing list at groff@gnu.org. If you think that you have found a bug, +please submit a ticket using the 'BUG-REPORT' file as a template. + + https://savannah.gnu.org/bugs/?group=groff&func=additem + + +Uninstalling +============ -##### Emacs settings +If you are dissatisfied with groff, or to prepare for a new installation +from source, you can uninstall it to ensure that no stale files persist +on the system. Run the command 'sudo make uninstall'. (If you +successfully used 'make install', simply run 'make uninstall'.) At a +minimum, some directories not particular to groff, like 'bin' and +(depending on configuration) an X11 'app-defaults' directory will +remain, as will one plain file called 'dir', created by GNU Texinfo's +'install-info' command. (As of this writing, 'install-info' offers no +provision for removing an effectively empty 'dir' file, and groff does +not attempt to parse this file to determine whether it can be safely +removed.) All other groff artifacts will be deleted from the +installation hierarchy. + + +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set autoindent textwidth=72: diff --git a/LICENSES b/LICENSES index 8512b9e..160cf5f 100644 --- a/LICENSES +++ b/LICENSES @@ -1,4 +1,4 @@ - Copyright 2003-2018 Free Software Foundation, Inc. + Copyright 2003-2022 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -7,158 +7,213 @@ LICENSES -------- -The groff program is a free software project. It is licensed under the GNU -General Public License (GNU GPL), version 3 or later. - -The file COPYING in the top directory of the groff source package contains a -copy of the GPL that was downloaded from the GNU web site -http://www.gnu.org/copyleft/gpl.txt at 3 jan 2009. - -All files part of groff are licensed under this version of the GPL (or -licenses which are compatible with the GPL). You are free to choose -version 3 or any subsequent version of the GPL. - -The GPL names an address where you can get the actual version by normal -post. Further information is found in the internet at -http://www.gnu.org/copyleft. - -The groff program is a GNU package, and the copyright of all files of the -groff source package which are under the GPL has been assigned to the Free -Sofware Foundation (FSF). Information on GNU and FSF is found at -http://www.fsf.org/. - +groff is a free software project. It is licensed under the GNU General +Public License (GPL), version 3 or later. + +The file COPYING in the top directory of the groff source distribution +contains a copy of the GPL that was downloaded from the GNU web site + on 3 January 2009. + +All files in the groff source distribution are distributed under the +terms of this version of the GPL. You are free to choose version 3 or +any subsequent version of the GPL. Some are distributed under +alternative terms as well. + +The text of the GPL contains a postal address from which you can obtain +the current version of the license. Further information is available on +the Web at . + +groff is an effort of the GNU Project of the Free Software Foundation +(FSF); with the exceptions noted below, the copyrights of all files +comprising it have been assigned to the FSF. Information on GNU and the +FSF may be found at . + +Files in the contrib/ subdirectory of the source distribution are not +strictly part of groff. That is, they are distributed with it and are +Free Software , but they +are not considered essential parts of the distribution. Further, they +may bear licenses other than the GPL or the FSF does not administer +their copyrights. To determine their copyright status and licensing, +see the "COPYRIGHT" file in the appropriate subdirectory of contrib/. + +Some files are part of groff but bear licenses in addition to the GPL, +or have been placed into the public domain. This is because they +originated elsewhere; often, the groff project has modified them, +sometimes extensively. These multi-licensed groff components are as +follows. Their file names are not always identical to those in their +original distributions, but we have kept them similar. + +grn preprocessor +================ + +grn, written by Barry Roitblat and David +Slattengren , was part of the Berkeley +device-independent troff distribution. The files contain no AT&T code +and are in the public domain. Historically, the original package could +be found at . + + src/preproc/grn/gprint.h + src/preproc/grn/hdb.cpp + src/preproc/grn/hgraph.cpp + src/preproc/grn/hpoint.cpp + src/preproc/grn/main.cpp + +gxditview output driver +======================= + +gxditview is based on the X Window System (Version 11)'s "xditview" +program, and is licensed under the same terms as the rest of X11R5. + + src/devices/xditview/DESC.in + src/devices/xditview/Dvi.c + src/devices/xditview/Dvi.h + src/devices/xditview/DviP.h + src/devices/xditview/FontMap-X11 + src/devices/xditview/GXditview.ad + src/devices/xditview/Menu.h + src/devices/xditview/ad2c + src/devices/xditview/device.c + src/devices/xditview/device.h + src/devices/xditview/draw.c + src/devices/xditview/font.c + src/devices/xditview/gray1.bm + src/devices/xditview/gray2.bm + src/devices/xditview/gray3.bm + src/devices/xditview/gray4.bm + src/devices/xditview/gray5.bm + src/devices/xditview/gray6.bm + src/devices/xditview/gray7.bm + src/devices/xditview/gray8.bm + src/devices/xditview/gxditview.man + src/devices/xditview/lex.c + src/devices/xditview/page.c + src/devices/xditview/parse.c + src/devices/xditview/xdit.bm + src/devices/xditview/xdit_mask.bm + src/devices/xditview/xditview.c + + src/include/DviChar.h + src/include/XFontName.h + + src/libs/libxutil/DviChar.c + src/libs/libxutil/XFontName.c + +mdoc macro package +================== + +mdoc uses the BSD "three-clause" license; that is, it is subject to the +advertising clause rescission. + + tmac/doc.tmac + tmac/doc-old.tmac + tmac/mdoc/doc-common + tmac/mdoc/doc-ditroff + tmac/mdoc/doc-nroff + tmac/mdoc/doc-syms + tmac/groff_mdoc.7.man + +me macro package +================ + +"me" uses the BSD "three-clause" license; that is, it is subject to the +advertising clause rescission. + + tmac/e.tmac + tmac/groff_me.man + doc/meintro.me + doc/meintro_fr.me + doc/meref.me + +Hyphenation patterns +==================== + +groff's hyphenation pattern files are adapted from those used by various +TeX-related projects. + +* "tmac/hyphen.cs" is renamed from "czhyphen.tex", and obtained from + . + + It is under the GNU General Public License, version 2 or later. + +* "tmac/hyphen.den" and "tmac/hyphen.det" are renamed from + "dehyphn-x-2017-03-31.pat" and "dehypht-x-2017-03-31.pat", + respectively, in the "dehyph-exptl-0.41" package. + + Copyright (c) 2013-2017 + Stephan Hennig, Werner Lemberg, Guenter Milde, Sander van Geloven, + Georg Pfeiffer, Gisbert W. Selke, Tobias Wendorf + + Licensed under the MIT license. Full license text available from + + http://opensource.org/licenses/mit-license.php + +* "tmac/hyphen.en" is renamed from "hyph-en-us.tex" in the "hyph-utf8" + CTAN package. + + Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken + + Copying and distribution of this file, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. + +* "tmac/hyphen.fr" is renamed from "frhyph.tex", obtained from + . + + It identifies no copyright holder but bears a license statement. + + This file is available for free and can used and redistributed + asis for free. Modified versions should have another name. + +* "tmac/hyphen.it" is renamed from "hyph-it.tex" in the "hyph-utf8" CTAN + package. + + Copyright (C) 2008-2011 Claudio Beccari + + This file is available under any of the following licences: + + name: LPPL + version: 1.3 + or_later: true + url: http://www.latex-project.org/lppl.txt + status: maintained + maintainer: Claudio Beccari, e-mail claudio dot beccari at gmail dot + com + + name: MIT + url: https://opensource.org/licenses/MIT + text: > + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: -Here a list of files which are distributed with groff but which aren't -part of it (this is, they either have a non-GPL license, or the copyright -hasn't been assigned to the FSF). + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. - Source Files - ------------ +* "tmac/hyphen.sv" is renamed from "svhyph.tex", obtained from + . - . The `grn' preprocessor, written by Barry Roitblat - and David Slattengren . These files have been part - of the original Berkeley ditroff distribution, without AT&T code, and - are in the public domain. + Copyright 1994 by Jan Michael Rynning. All rights reserved. - The original package can be found at - http://ftp.cs.wisc.edu/pub/misc/grn.tar.Z . + This program may be distributed and/or modified under the conditions + of the LaTeX Project Public License, either version 1.2 of this + license or (at your option) any later version. The latest version of + this license is in http://www.latex-project.org/lppl.txt and version + 1.2 or later is part of all distributions of LaTeX version 1999/12/01 + or later. - src/preproc/grn/gprint.h - src/preproc/grn/hdb.cpp - src/preproc/grn/hgraph.cpp - src/preproc/grn/hpoint.cpp - src/preproc/grn/main.cpp - - . The `gxditview' output device. It is based on X11's `xditview' program - and thus has the X license. - - src/devices/xditview/DESC.in - src/devices/xditview/Dvi.c - src/devices/xditview/Dvi.h - src/devices/xditview/DviP.h - src/devices/xditview/FontMap - src/devices/xditview/GXditview.ad - src/devices/xditview/Menu.h - src/devices/xditview/ad2c - src/devices/xditview/device.c - src/devices/xditview/device.h - src/devices/xditview/draw.c - src/devices/xditview/font.c - src/devices/xditview/gray1.bm - src/devices/xditview/gray2.bm - src/devices/xditview/gray3.bm - src/devices/xditview/gray4.bm - src/devices/xditview/gray5.bm - src/devices/xditview/gray6.bm - src/devices/xditview/gray7.bm - src/devices/xditview/gray8.bm - src/devices/xditview/gxditview.man - src/devices/xditview/lex.c - src/devices/xditview/page.c - src/devices/xditview/parse.c - src/devices/xditview/xdit.bm - src/devices/xditview/xdit_mask.bm - src/devices/xditview/xditview.c - - src/include/DviChar.h - src/include/XFontName.h - - src/libs/libxutil/DviChar.c - src/libs/libxutil/XFontName.c - - - Macro Packages - -------------- - - . The -mdoc macro set, using the BSD license. - - tmac/doc.tmac - tmac/doc-old.tmac - tmac/doc-common - tmac/doc-ditroff - tmac/doc-nroff - tmac/doc-syms - tmac/groff_mdoc.man - - . The -me macro set, using the BSD license. - - tmac/e.tmac - tmac/groff_me.man - doc/meintro.me - doc/meintro_fr.me - doc/meref.me - - - Hyphenation Patterns - -------------------- - - . The file `tmac/hyphen.us' is identical to the file `hyphen.tex', part of - the TeX system written by Donald E. Knuth; the master file can be found - at - - ftp://labrea.stanford.edu/pub/tex/dist/lib/hyphen.tex . - - It has been renamed for consistency, i.e., to make patterns available - under the filenames `hyphen.', e.g. `hyphen.de' or - `hyphen.uk'. - - See the file itself for a copyright notice. - - . The file `tmac/hyphen.fr' contains the same patterns as the file - `frhyph.tex' (for TeX), which can be found at - - http://dante.ctan.org/CTAN/language/hyphenation/frhyph.tex . - - The patterns have been converted to a format groff can understand. - - See the file itself for a copyright notice. - - . The file `tmac/hyphen.sv' is identical to the file `svhyph.tex', which - can be found at - - http://dante.ctan.org/CTAN/language/hyphenation/svhyph.tex . - - See the file itself for a copyright notice. - - . The files `tmac/hyphen.det' and `tmac/hyphen.den' contain the same - patterns as the files `dehypht-x-2017-03-31.pat' and - `dehyphn-x-2017-03-31.pat' (for TeX), respectively, which can be found - at - - http://ctan.org/tex-archive/language/hyphenation/dehyph-exptl - - The patterns have been converted to latin-1. - - See the files themselves for a copyright notice. - - . The file `tmac/hyphen.cs' contains the same patterns as the file - `czhyphen.tex' (for TeX), which can be found in the archive - - http://dante.ctan.org/CTAN/macros/cstex/base/csplain.tar.gz . - - The patterns have been converted to a format groff can understand. - - See the file itself for a copyright notice. - -EOF +Any omissions from the above list are unintentional; please contact the +groff development mailing list at groff@gnu.org to point them out. diff --git a/MANIFEST b/MANIFEST index 7ca4fc8..736b211 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,182 +1,191 @@ - Copyright 2001-2018 Free Software Foundation, Inc. + Copyright 2001-2022 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This file gives an overview of the directories and the main files of -the groff source distribution. +This file summarizes the structure of the groff source distribution. -1) The top directory. +1) Top-level directory contents - BUG-REPORT A template for bug-reports. - ChangeLog Log of the changes in the different groff versions. + BUG-REPORT A template for bug reports. + ChangeLog Log of changes since last groff minor version release. + ChangeLog.* Logs of changes in past groff versions. COPYING The GNU General Public License (GPL). - FDL The Free Documentation License (FDL). - INSTALL Information on compiling and installing groff. - INSTALL.gen Generic information on configuration and compiling. - LICENSES Licensing information. + FDL The GNU Free Documentation License (FDL). + FOR-RELEASE Release procedures for groff maintainer(s) to follow. + HACKING Advice for contributors to groff. + INSTALL Generic information on configuration and compiling. + INSTALL.extra How to install groff from a distribution archive. + INSTALL.REPO How to install groff from a Git repository checkout. + LICENSES Copyright and licensing information. MANIFEST The file you are reading. MORE.STUFF Useful stuff in other packages. - NEWS Recent user-visible changes in groff. - PROBLEMS Tips to handle known critical situations. + NEWS Log of feature changes in groff. + PROBLEMS Tips to handle known situations of concern. PROJECTS Long-term additions to groff. - README Availability and contact information for groff. + README Introduction to and contact information for groff. README.MinGW Build information for MinGW. TODO Things planned for future groff versions. - All other files in the top directory are related to the configuration, - compilation, and install processes. + All other files in the top-level directory are related to + configuration, compilation, and installation procedures. -2) The directory structure +2) Directory structure -./arch Data that is special for different architectures. - djgpp Data special for the 32-bit DOS compiler djgpp. - misc Data needed for various platforms. +./arch Resources to facilitate building on non-POSIX systems. + djgpp Resources for the 32-bit MS-DOS compiler djgpp. + mingw Resources for the MinGW environment. + misc Resources for various other platforms. -./contrib Part of groff, but maintained by other people. - chem A preprocessor (for pic) to produce chemical structure - diagrams. - eqn2graph Convert equations created with EQN into different - graphical formats. +./contrib Resources provided with groff, but maintained by others. + chem Embed chemical structure diagrams in groff documents. + eqn2graph Convert eqn(1) equations into graphical images. gdiffmk An improved implementation of the diffmk command to mark differences between groff/nroff/troff files. - glilypond A preprocessor that handles `lilypond' parts in a `roff' - file. - gperl A preprocessor that handles `perl' parts in a `roff' - file. - gpinyin A preprocessor providing simpler Pinyin input. - grap2graph Convert grap diagraps into different graphical formats. - groffer A wrapper to conveniently view roff files. + glilypond Embed LilyPond sheet music in groff documents. + gperl Populate groff registers and strings using perl(1). + gpinyin Use Hanyu Pinyin input to compose groff documents. + grap2graph Convert grap(1) diagrams into graphical images. hdtbl A sophisticated table macro package. - mm The groff mm macro package. - mom The groff mom macro package. - pdfmark A package to add PDF marks to groff documents, together - with a shell script (pdfroff) for easy creation of PDF - documents. - pic2graph Convert PIC diagrams into different graphical formats. - -./doc Manuals and tutorials to groff aspects. - -./font Device information and fonts. - devX100 100dpi device for X Window System. - devX100-12 100dpi device with narrower font (for 12pt base font). - devX75 75dpi device for X Window System. - devX75-12 75dpi device with narrower font (for 12pt base font). - devascii Text device for ASCII output. - devcp1047 EBCDIC device. + mm The groff memorandum macro package. + mom Peter Schaffter's "mom", a friendly groff macro package. + pdfmark Add PDF marks to groff documents; includes "pdfroff", + which eases creation of PDF documents. + pic2graph Convert pic(1) diagrams into graphical images. + rfc1345 Use RFC 1345 mnemonics as groff special characters. + sboxes Use bordered, shaded background boxes with ms and PDF. + +./doc Manuals for various components of groff. + +./font Device and font description files. + devX100 100dpi X11 device (10 point base type size). + devX100-12 100dpi X11 device (12 point base type size). + devX75 75dpi X11 device (10 point base type size). + devX75-12 75dpi X11 device (12 point base type size). + devascii Terminal device with ASCII (ISO 646) encoding. + devcp1047 Terminal device with EBCDIC (code page 1047) encoding. devdvi TeX DVI device. devhtml HTML device. - devlatin1 Text device for latin-1 (ISO 8859-1) output. - devlbp Device for Canon CAPSL laser printers. - devlj4 Device for HP Laserjet 4, PCL 5, and compatible printers. + devlatin1 Terminal device with ISO Latin-1 (8859-1) encoding. + devlbp Canon CaPSL laser printers. + devlj4 HP LaserJet 4/PCL 5 and compatible printers. devps PostScript device. devpdf PDF device. - devutf8 Text device for Unicode output. - util Utility programs. + devutf8 Terminal device with UTF-8 encoding. + scripts Scripts used in generation of device/font descriptions. + util Tools to aid groff developers with new device support. -./m4 M4 macro files used creating the configure script. +./m4 M4 macro files used to create the "configure" script. -./man Some groff manual pages of more general character. +./man groff manual pages of general applicability. -./src Everything written in programming languages. +./src groff programs and libraries. -./src/devices The postprocessors. - grodvi TeX DVI output. - grohtml HTML output. - grolbp Canon printers. - grolj4 HP Laserjet 4, PCL 5, and compatible printers. - grops PostScript output. - gropdf PDF output. - grotty Text output. - xditview A groff (pre)viewer for the X Window system. +./src/devices Output drivers for devices and file formats. + grodvi TeX DVI. + grohtml HTML. + grolbp Canon CaPSL laser printers. + grolj4 HP LaserJet 4/PCL 5 and compatible printers. + grops PostScript. + gropdf PDF. + grotty Terminal output. + xditview A troff output (pre)viewer for the X Window System. -./src/include The *.h C/C++ include files. +./src/include C/C++ header files. -./src/libs C++ code common to several parts of the groff sources. - gnulib Auxiliary functions copied from the `gnulib' repository. - libbib Library of bibliographic functions. - libdriver Parser for intermediate output and postprocessor code. - libgroff Library for general support functions used everywhere. - libxutil Utility functions for xditview and xtotroff. +./src/libs C++ code shared among several groff components. + libbib Manage bibliographic database. + libdriver Parse troff output; also output utility functions. + libgroff General support functions used everywhere. + libxutil Utility functions for gxditview and xtotroff. ./src/preproc Preprocessors. - eqn Mathematical formulae. - grn Gremlin pictures. - html The preprocessor part of grohtml. - pic Diagram drawer. - preconv Input encoding conversion. - refer Bibliographic references. - soelim File inclusion using tmac path. - tbl Tables. - -./src/roff Front-end programs. - groff Wrapper around troff. This is the main user program. - grog Guess groff command line options. - nroff Emulate classical nroff text formatter. - troff Main roff formatter program. - -./src/utils Utility programs around groff. - addftinfo Add information to old troff font files for use with groff. + eqn Typeset mathematical formulae. + grn Draw Gremlin pictures. + html Prepare tbl and eqn input for grohtml. + pic Draw diagrams. + preconv Convert document input encoding for input to troff. + refer Generate bibliographic references. + soelim Expose 'so' (sourced) documents to preprocessing. + tbl Lay out tables. + +./src/roff Programs that run the formatter. + groff troff wrapper. This is the main user program. + nroff groff wrapper convenient for terminal users. + troff Formatter. + +./src/utils Utility programs relevant to groff. + addftinfo Supplement AT&T troff font descriptions with metrics + groff requires. afmtodit Create font description files for the PostScript device. - hpftodit Create font description files for the LJ4 device. + grog Guess groff command-line options required by a document. + hpftodit Create font description files for the 'lj4' device. indxbib Make inverted index for bibliographic databases. lkbib Search bibliographic databases. lookbib Interactively search bibliographic databases. - pfbtops Translate a PostScript font in PFB format to PFA. + pfbtops Translate a PostScript Type 1 font in PFB format to PFA. tfmtodit Create font description files for TeX DVI device. - xtotroff Create font description files for xditview. + xtotroff Create font description files for gxditview. ./tmac Macro files. + mdoc Modules for the mdoc package. + +Various directories contain a "tests" subdirectory. These are automated +tests performed when groff's Makefile is run with the "check" target. 3) Documentation -The groff documentation is scattered upon several places. +groff documentation is spread throughout the tree; where possible, it is +close to the source code it describes. -- The main directory contains documents related to the groff source. - The README file contains the information needed to get the groff - package, report bugs, and contact the developers. +- The top-level directory contains text files presenting groff as a + software project, with its focus on organization of the code, + development procedures, and project administration. -- The man-page of each program (section 1) is kept in the source - directory of the program. + If you don't know where to begin, start with "README"; it contains the + information you will require to obtain the groff distribution archive, + report bugs, and contact the developers. -- The man-pages for the other sections are found in `src/man'. +- A man page for each program (for section 1 of the manual) is + maintained in the source directory of the program itself. -- Documentation in other formats are located in the `doc' directory, - including the groff info file, tutorials, and manuals. +- Extensive man pages documenting GNU roff's input language, special + character repertoire, differences from AT&T troff, device and font + description file formats, macro files, and historical and conceptual + background are maintained in the "man" directory. -Man-pages have source files ending in `.man'. Running `make' processes -the files and uses `.n' as the new file extension. In both cases it is -difficult to quickly decide into which section the man-page shall go. -Here is a shell command (to be called from the top directory of the -groff source tree) that finds all man-pages and writes the section -number after each file name: +- Documentation in other formats is located in the "doc" directory, + including groff's Texinfo manual, and tutorial and/or reference + manuals written using groff macro packages. - find -type f \ - | grep '[.]man$' \ - | sort \ - | xargs grep -e '^[.]TH ' \ - | sed -e 's/^\(.\+\): *\.TH.*@MAN\(.*\)EXT@.*$/\1 \2/' +- Documentation for contributed components is kept in the relevant + subdirectory of "contrib". -4) The roff parser +4) groff language parser -The parsing of the roff language is done by troff. The input is converted -to tokens in `src/roff/troff/input.cpp' and transformed into `nodes' by -`src/roff/troff/env.cpp' and `src/roff/troff/node.cpp'. From these, the -intermediate output is generated (also in `node.cpp'). +The "troff" program in "src/roff/troff" parses the groff input language. +There, "input.cpp" implements the main loop and tokenizes input. Input +tokens are transformed into nodes (a GNU troff internal data structure) +by "env.cpp" and "node.cpp". Routines in the latter file generate the +page description language from lists of nodes. -5) Postprocessing +5) page description language parser -The parser for the intermediate output and the postprocessing is in -`src/libs/libdriver/input.cpp'. This is used by all postprocessors. +The parser for the page description language produced by troff is +implemented in "src/libs/libdriver/input.cpp". This is used by all +groff output drivers written in C++. ("gropdf", written in Perl, +performs its own parsing.) -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set expandtab textwidth=72: diff --git a/MORE.STUFF b/MORE.STUFF index 506dd0a..9b978fc 100644 --- a/MORE.STUFF +++ b/MORE.STUFF @@ -1,174 +1,104 @@ - Copyright 2000-2018 Free Software Foundation, Inc. + Copyright 2000-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -More stuff for groff -==================== +Ports of groff to non-POSIX environments +======================================== -Windows 32 ----------- +Microsoft Windows +----------------- -Here are two ports using the gcc compiler and other GNU tools: +Cygwin makes a groff package available. -. Cygwin: + https://cygwin.com/ - http://sources.redhat.com/cygwin/ +Look for a convenient mirror site at the followung URL. - Look for a convenient mirror site in + https://cygwin.com/mirrors.html - http://sources.redhat.com/cygwin/mirrors.html +Cygwin maintains a port status page. - At any of those mirrors, groff can be found in the directory - latest/groff. + https://cygwin.com/packages/summary/groff.html -. Kees Zeelenberg : +Cygwin, like most GNU/Linux distributions, separates groff build +artifacts into multiple components, largely for dependency management. +You may find the source package page of interest. - http://gnuwin32.sourceforge.net/packages/groffl.htm + https://cygwin.com/packages/summary/groff-src.html - This port includes recent versions of grap and deroff. +The port is maintained in a Git repository. - -dos ---- - -Binaries for Eli Zaretskii's port using the djgpp compiler are available -from - - ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/gro*b.zip - -and its mirrors; for installation details please read `arch/djgpp/README'. -This port also runs on Windows 32 systems, except Windows 2000. + https://cygwin.com/git-cygwin-packages/?p=git/cygwin-packages/groff.git grap ---- -An implementation of Kernighan & Bentley's grap language for typesetting -graphs. Written by Ted Faber . The actual version -can be found at +Ted Faber has written an implementation of Kernighan & Bentley's grap +language for typesetting graphs. http://www.lunabase.org/~faber/Vault/software/grap/ -A djgpp port which runs on dos and most Windows 32 systems (Windows 95, -Windows 98, Windows NT) done by Kees Zeelenberg -is available from - - ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/ - -It is intended to be used with the djgpp port of groff. - -A Windows 32 port is included in the groff package available from - - http://gnuwin32.sourceforge.net/ - - -plot2dev --------- - -This utility program can convert plot graphics to either pic or gremlin -files. It has been written by Richard Murphey -and Daniel Senderowicz (who has added the gremlin -driver). The actual version can be found as - - ftp://ftp.ffii.org/pub/groff/plot2dev-x.x.tar.gz - troffcvt -------- -From the web page: +Per its web page, - troffcvt is a translator that turns troff input into a form that can be - more easily processed. The troffcvt distribution comes with - postprocessors that turn troffcvt into various destination formats such - as HTML (Hypertext Markup Language), RTF (Rich Text Format) or plain - text. + troffcvt is a translator that turns troff input into a form that can + be more easily processed. The troffcvt distribution comes with + postprocessors that turn troffcvt into various destination formats + such as HTML (Hypertext Markup Language), RTF (Rich Text Format) or + plain text. -Note that you need a lot of additional packages to compile troffcvt; -everything is available from - - http://www.primate.wisc.edu/software/troffcvt/ + http://www.snake.net/software/troffcvt/ unroff ------ -From the README file: - - Unroff is a Scheme-based, programmable, extensible troff translator with - a back-end for the Hypertext Markup Language. Unroff is free software - and is distributed both as source and as precompiled binaries. +Per its README file, - http://www.informatik.uni-bremen.de/~net/unroff/unroff.html + Unroff is a Scheme-based, programmable, extensible troff translator + with a back-end for the Hypertext Markup Language. Unroff is free + software and is distributed both as source and as precompiled + binaries. -You need als Elk, the Scheme based Extension Language Kit, which is -available from + https://www-rn.informatik.uni-bremen.de/software/unroff/ - http://www.informatik.uni-bremen.de/~net/elk +Haart deroff +------------ -deroff ------- - -Deroff removes roff constructs from documents for the purpose of indexing, -spell checking etc. +Per its ReadMe.txt file, -Michael Haardt's implementation is a little smarter -than traditional implementations, because it knows about certain -man and --mm macros. It is able to generate a word list for spell checking tools -or omit headers for sentence analysis tools. It can further generate -cpp-style #line lines. + Deroff removes roff constructs from documents for the purpose of + indexing, spell checking etc. My own implementation is a little + smarter than traditional implementations, because it knows about + certain -man and -mm macros. It is able to generate a word list for + spell checking tools or omit headers for sentence analysis tools. - http://www.moria.de/~michael/deroff/ - -Version 1.6 compiled with DJGPP (for MS-DOS and all Windows 32 systems, -i.e. Windows 95, Windows 98, Windows NT) is available from - - ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/ - -and its mirrors. - -A Windows 32 port of version 1.8 is available from - - http://gnuwin32.sourceforge.net/ - -David Frey has also written a deroff implementation -for Debian; it is available from - - ftp://ftp.debian.org/debian/pool/main/d/deroff/ - - -texi2html ---------- - -This package contains beta support for a backend to convert files from -texinfo format to a troff input file (using the -me macros): - - texi2html --init roff.init ... - -URL: - - http://savannah.nongnu.org/download/texi2html/ + https://caio.ueberalles.net/deroff/ doclifter --------- -doclifter lifts troff macro markup to XML-Docbook. It doesn't do raw troff -at all well (raw troff has insufficient structural information) but it -handles manual pages, ms, mm, and me markup, producing clean lifts -to valid XML more than 96% of the time. pic markup is translated to SVG, -eqn markup to Presentation MathML. +Per its web page, -doclifter with the -w option behaves as a portability checker and validator, -warning about constructs that aren't portable across *roff implementations -and viewers. + [doclifter lifts] documents in nroff markups to XML-DocBook. -It is available from + Lifting documents from presentation level to semantic level is hard, + and a really good job requires human polishing. This tool aims to do + everything that can be mechanized, and to preserve any troff-level + information that might have structural implications in XML comments. + This tool does the hard parts. TBL tables are translated into DocBook + table markup, PIC into SVG, and EQN into MathML (relying on pic2svg + and GNU eqn for the last two). - http://catb.org/~esr/doclifter + http://catb.org/~esr/doclifter pic2plot @@ -180,7 +110,7 @@ The plotutils package is available at http://www.gnu.org/software/plotutils/ -miscellaneous +Miscellaneous ------------- . Ralph Corderoy's excellent page on troff: @@ -198,7 +128,8 @@ miscellaneous o creating business cards o using groff to make large format posters for presentations -. Robert Marks's collection of useful macros and scripts is available from +. Robert Marks's collection of useful macros and scripts is available + from http://www.agsm.edu.au/~bobm/odds+ends/scripts.html @@ -207,56 +138,52 @@ miscellaneous o `polish': Is a sed (= the Unix stream editor) script that does many things to ASCII text. Amongst other things, it breaks lines at new sentences, reduces upper-case acronyms by one point size, adds - diacriticals, changes simple quotes into smart quotes, and makes a few - simple grammar checks. The best way to see what it does is to run it - as a sed script file (or files) on a text file and then compare the - output file with the original. + diacriticals, changes simple quotes into smart quotes, and makes a + few simple grammar checks. The best way to see what it does is to + run it as a sed script file (or files) on a text file and then + compare the output file with the original. o `DropCaps' is a troff script which replaces the initial letters of - paragraphs immediately after H1 and H2 headings with drop-capitals of - specified point size, and automatically flows the text around the new - drop cap. + paragraphs immediately after H1 and H2 headings with drop-capitals + of specified point size, and automatically flows the text around the + new drop cap. o `AJM Header' is a set of troff macros used in production of the - Australian Journal of Management. They use the Memorandum Macros (mm) - of AT&T, and so should be invoked with the Unix troff -mm flag; they - should also work with the GNU troff -mm flag. - -. Various contributed stuff like additional font files, macro packages, and - documentation can be found at + Australian Journal of Management. They use the Memorandum Macros + (mm) of AT&T, and so should be invoked with the Unix troff -mm flag; + they should also work with the GNU troff -mm flag. - http://groff.ffii.org/groff/contrib/ - -. Thomas Baruchel has developed Meta-tbl, a tbl - postprocessor to manipulate table cells (like adding gray shades). The - latest version can be found at +. Thomas Baruchel has developed Meta-tbl, a + tbl postprocessor to manipulate table cells (like adding gray shades). + The latest version can be found at http://perso.libertysurf.fr/baruchel/ -. gpresent, written by Bob Diertens . From the README - file: +. gpresent, written by Bob Diertens . From the + README file: + + gpresent is a package for making presentation with groff and + acroread. It consist of a set of macros to be used with groff and a + post-processor for manipulating the PostScript output of groff. + Without the use of the PAUSE macro, it can also be used for making + slides. - gpresent is a package for making presentation with groff and acroread. - It consist of a set of macros to be used with groff and a post-processor - for manipulating the PostScript output of groff. Without the use of the - PAUSE macro, it can also be used for making slides. - It is available from www.science.uva.nl/~bobd/useful/gpresent/ -documentation +Documentation ------------- -Many documents related to the original versions of troff, ditroff, pic, -and others can be accessed from the following web pages: +Documentation of the AT&T implementations of the troff, tbl, pic, eqn, +and refer programs can be found at the following site. - http://www.cs.bell-labs.com/cm/cs/cstr.html - http://www.cs.bell-labs.com/cm/cs/papers.html - http://troff.org + https://www.troff.org/papers.html -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/Makefile.am b/Makefile.am index d18c49b..f7ab410 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,7 @@ -# Copyright (C) 1989-2018 Free Software Foundation, Inc. +# Copyright (C) 1989-2023 Free Software Foundation, Inc. # Original Makefile.in written by James Clark (jjc@jclark.com) # Migrated to Automake by Bertrand Garrigues # -# Last update: 2017-11-02 -# # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under @@ -11,8 +9,8 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -182,7 +180,7 @@ oldfontdir=$(datasubdir)/oldfont # `localfontdir' says where local fonts will be installed (as dev*/*). localfontdir=$(dataprogramdir)/site-font -# `legacyfontdir' is for compatibility with non-GNU troff. +# `legacyfontdir' is for compatibility with AT&T/DWB troff. legacyfontdir=/usr/lib/font # `fontpath' says where to look for dev*/*. @@ -197,13 +195,11 @@ systemtmacdir=$(libprogramdir)/site-tmac # `localtmacdir' says where local files will be installed. localtmacdir=$(dataprogramdir)/site-tmac -# appresdir -# `appresdir' says where to install the application resource file for +# appdefdir +# `appdefdir' says where to install the application defaults file for # gxditview. -# groffer_dir # glilypond_dir -# grog_dir # gpinyin_dir # `tmacpath' says where to look for macro files. @@ -280,7 +276,7 @@ tmac_an_prefix=\ fi` # Extension to be used for refer index files. Index files are not -# sharable between different architectures, so you might want to use +# shareable between different architectures, so you might want to use # different suffixes for different architectures. Choose an extension # that doesn't conflict with refer or any other indexing program. indexext=.i @@ -312,47 +308,18 @@ man5dir=$(manroot)/man$(man5ext) man7ext=7 man7dir=$(manroot)/man$(man7ext) -# doc_dist_target_ok -# `dist' target is disallowed in some `configure' combinations. - -# The configure script checks whether the user wants the info documentation. -# For the repo version this mechanism also suppresses building via `makeinfo'. -# make_infodoc -# make_install_infodoc -# make_uninstall_infodoc - # The configure script checks whether all necessary utility programs for -# grohtml are available -- only then we can build the HTML documentation. +# grohtml are available -- only then can we build the HTML documentation. # make_htmldoc # make_install_htmldoc # make_uninstall_htmldoc -# make_htmlexamples -# make_install_htmlexamples -# make_uninstall_htmlexamples - # The configure script also checks whether all necessary utility programs -# for pdfroff are available -- only then we can build PDF documentation. +# for pdfroff are available -- only then can we build PDF documentation. # make_pdfdoc # make_install_pdfdoc # make_uninstall_pdfdoc -# make_pdfexamples -# make_install_pdfexamples -# make_uninstall_pdfexamples - -# `other' documentation, e.g., `meref.me' and `pic.ms', as well as their -# generated counterparts.. -# make_otherdoc -# make_install_otherdoc -# make_uninstall_otherdoc - -# `examples' -- a generic switch, but the generated examples are furtherly -# subdivided to catch HTML and PDF production availability. -# make_examples -# make_install_examples -# make_uninstall_examples - # Windows `.cmd' files # make_winscripts # make_install_winscripts @@ -445,10 +412,6 @@ man7dir=$(manroot)/man$(man7ext) # uintmax_t= define to `unsigned long' or `unsigned long # long' if does not exist # -# TRADITIONAL_CPP if your C++ compiler uses a traditional -# (Reiser) preprocessor -# ARRAY_DELETE_NEEDS_SIZE if your C++ doesn't understand `delete []' -# # PAGE=A4 if the printer's page size is A4 # GHOSTSCRIPT=gs the name (and directory if required) of the # ghostscript program @@ -486,6 +449,7 @@ CCC=@CXX@ # LIBS # LIBM # LIBICONV +# AR # RANLIB # INSTALL # INSTALL_PROGRAM @@ -494,7 +458,6 @@ CCC=@CXX@ # INSTALL_INFO # LN_S -AR=ar ETAGS=etags ETAGSFLAGS= # Flag that tells etags to assume C++. @@ -537,14 +500,15 @@ GROFF_V = $(GROFF_V_@AM_V@) GROFF_V_ = $(GROFF_V_@AM_DEFAULT_V@) GROFF_V_0 = @echo " GROFF " $@; -# The following Automake variables will be overloaded by the various -# .am files +# The following Automake variables will be supplemented by the various +# .am files. bin_PROGRAMS = nobase_bin_PROGRAMS = bin_SCRIPTS = dist_bin_SCRIPTS = +# stuff that should be in distribution archives but not in source repo +MAINTAINERCLEANFILES = MOSTLYCLEANFILES = -MOSTLYCLEANADD = noinst_LIBRARIES = BUILT_SOURCES = CLEANFILES = @@ -565,6 +529,7 @@ SUFFIXES = check_SCRIPTS = check_PROGRAMS = TESTS = +XFAIL_TESTS = AM_TESTS_ENVIRONMENT = \ abs_top_srcdir=$(abs_top_srcdir) \ abs_top_builddir=$(abs_top_builddir) \ @@ -578,7 +543,7 @@ AM_TESTS_ENVIRONMENT = \ # This is done by the m4 macro GROFF_G that checks for the presence of # GNU Troff built-in \n[.g] macro. If a Unix Troff binary was # detected, the following programs and scripts names will have a 'g' -# prefix: chem, tbl, eqn, neqn, pic, soleimm grn, refer, lookbib, +# prefix: chem, tbl, eqn, neqn, pic, soelim, grn, refer, lookbib, # troff, nroff. Also, PROG_PREFIX will be set to 'g' in the generated # header defs.h so that these programs could be called correctly. # @@ -589,9 +554,9 @@ NAMEPREFIX=$(g) prefixexecbin_PROGRAMS = prefixexecbin_SCRIPTS = if USEPROGRAMPREFIX -# We use datadir because the uninstall rule for the PROGRAMS attempt +# We use datadir because the uninstall rule for the PROGRAMS attempts # to cd into prefixexecbindir, and thus if prefixexecbindir is removed -# two consecutive uninstall would fail +# two consecutive uninstalls would fail prefixexecbindir = $(datadir) else prefixexecbindir = $(bindir) @@ -602,13 +567,13 @@ endif GROFFBIN = $(abs_top_builddir)/groff GROFF_BIN_PATH = $(abs_top_builddir) PDFMOMBIN = $(abs_top_builddir)/pdfmom -# The second directories are needed for the case "cd build; ../configure". +# Search for macro files and device/font description directories in +# source _and_ build trees; some of each are generated. FFLAG=-F$(abs_top_builddir)/font -F$(abs_top_srcdir)/font -TFLAG=-M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac +MFLAG=-M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac -# make builtin variable RM -if MAKE_DONT_HAVE_RM -RM = rm -f +if !MAKE_DEFINES_RM +RM=rm -f endif # 'VERSION' is generated by gnulib script git-version-gen, using the @@ -654,13 +619,13 @@ include $(top_srcdir)/contrib/glilypond/glilypond.am include $(top_srcdir)/contrib/gperl/gperl.am include $(top_srcdir)/contrib/gpinyin/gpinyin.am include $(top_srcdir)/contrib/grap2graph/grap2graph.am -include $(top_srcdir)/contrib/groff_filenames/groff_filenames.am -include $(top_srcdir)/contrib/groffer/groffer.am include $(top_srcdir)/contrib/hdtbl/hdtbl.am include $(top_srcdir)/contrib/mm/mm.am include $(top_srcdir)/contrib/mom/mom.am include $(top_srcdir)/contrib/pdfmark/pdfmark.am include $(top_srcdir)/contrib/pic2graph/pic2graph.am +include $(top_srcdir)/contrib/rfc1345/rfc1345.am +include $(top_srcdir)/contrib/sboxes/sboxes.am include $(top_srcdir)/doc/doc.am include $(top_srcdir)/font/devX100/devX100.am include $(top_srcdir)/font/devX100-12/devX100-12.am @@ -700,11 +665,11 @@ include $(top_srcdir)/src/preproc/refer/refer.am include $(top_srcdir)/src/preproc/soelim/soelim.am include $(top_srcdir)/src/preproc/tbl/tbl.am include $(top_srcdir)/src/roff/groff/groff.am -include $(top_srcdir)/src/roff/grog/grog.am include $(top_srcdir)/src/roff/nroff/nroff.am include $(top_srcdir)/src/roff/troff/troff.am include $(top_srcdir)/src/utils/addftinfo/addftinfo.am include $(top_srcdir)/src/utils/afmtodit/afmtodit.am +include $(top_srcdir)/src/utils/grog/grog.am include $(top_srcdir)/src/utils/hpftodit/hpftodit.am include $(top_srcdir)/src/utils/indxbib/indxbib.am include $(top_srcdir)/src/utils/lkbib/lkbib.am @@ -718,13 +683,13 @@ include $(top_srcdir)/tmac/tmac.am # make all or make check before all other targets. However, if another # target is built from a clean build tree, (for example make groff) # the files in BUILT_SOURCES will not be built first. That is why -# additional dependencies where added in the .am files that lists -# objects that use defs (for exmaple in groff.am: +# additional dependencies were added in the .am files that list +# objects that use defs (for example in groff.am: # src/roff/groff/groff.$(OBJEXT): defs.h) BUILT_SOURCES += defs.h -# Force generation of test-groff even though we don't ship it. -BUILT_SOURCES += test-groff +.DELETE_ON_ERROR: +.PRECIOUS: $(TEST_SUITE_LOG) # if there is a name prefix we install the man pages by hand all: generate_man_files @@ -797,9 +762,6 @@ uninstall_groffdirs: fi; \ rmdir $(DESTDIR)$(dataprogramdir); \ fi - if test -d $(DESTDIR)$(grog_dir); then \ - rmdir $(DESTDIR)$(grog_dir); \ - fi if test -d $(DESTDIR)$(libprogramdir); then \ if test -d $(DESTDIR)$(systemtmacdir); then \ rm -f $(DESTDIR)$(systemtmacdir)/*; \ @@ -812,6 +774,12 @@ uninstall_groffdirs: rmdir $(DESTDIR)$(exampledir); \ fi; \ if test -d $(DESTDIR)$(htmldocdir); then \ + if test -d $(DESTDIR)$(htmldocdir)/groff.html.mono; then \ + rmdir $(DESTDIR)$(htmldocdir)/groff.html.mono; \ + fi; \ + if test -d $(DESTDIR)$(htmldocdir)/groff.html.node; then \ + rmdir $(DESTDIR)$(htmldocdir)/groff.html.node; \ + fi; \ rmdir $(DESTDIR)$(htmldocdir); \ fi; \ rmdir $(DESTDIR)$(docdir); \ @@ -838,9 +806,11 @@ EXTRA_DIST += \ ChangeLog.119 \ ChangeLog.120 \ ChangeLog.121 \ + ChangeLog.122 \ FDL \ FOR-RELEASE \ gendef.sh \ + HACKING \ INSTALL.REPO \ INSTALL.extra \ LICENSES \ @@ -856,8 +826,7 @@ EXTRA_DIST += \ MOSTLYCLEANFILES += $(prefixexecbin_SCRIPTS) $(bin_SCRIPTS) \ $(man1_MANS) $(man5_MANS) $(man7_MANS) \ - $(PREFIXMAN1) \ - test-groff + $(PREFIXMAN1) # Suffix rule to build .1, .5 and .7 files from .1.man, .5.man and # .7.man files. The brackets around the @ are used to prevent the @@ -883,30 +852,33 @@ MOSTLYCLEANFILES += $(prefixexecbin_SCRIPTS) $(bin_SCRIPTS) \ # because a command substitution is being nested inside yet another # invocation of sed. # -# * For this target; no assurances about the good behavior of unusual +# * For this target, no assurances about the good behavior of unusual # characters in Makefile variables in other aspects of the groff build # are offered. +# +# COMPATIBILITY_WRAPPERS is intended only for use in conditional +# expressions in man pages (to see if the legacy macro package wrappers +# feature is enabled) and not for expansion as formatted text. makevarescape=$(top_srcdir)/makevarescape.sed SUFFIXES += .man .man: - $(AM_V_GEN)rm -f $@ \ - && $(MKDIR_P) `dirname $@` \ + $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && LC_ALL=C \ - sed -e "s|[@]APPRESDIR[@]|`echo $(appresdir) | sed -f $(makevarescape)`|g" \ + sed -e "s|[@]APPDEFDIR[@]|`echo $(appdefdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]BINDIR[@]|`echo $(bindir) | sed -f $(makevarescape)`|g" \ -e "s|[@]COMMON_WORDS_FILE[@]|`echo $(common_words_file) | sed -f $(makevarescape)`|g" \ + -e "s|[@]COMPATIBILITY_WRAPPERS[@]|$(compatibility_wrappers)|g" \ -e "s|[@]DATASUBDIR[@]|`echo $(datasubdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]DEFAULT_INDEX[@]|`echo $(indexdir)/$(indexname) | sed -f $(makevarescape)`|g" \ -e "s|[@]DEFAULT_INDEX_NAME[@]|`echo $(indexname) | sed -f $(makevarescape)`|g" \ - -e "s|[@]DEVICE[@]|$(DEVICE)|g" \ + -e "s|[@]DEVICE[@]|\\\\%$(DEVICE)|g" \ -e "s|[@]DOCDIR[@]|`echo $(docdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]EXAMPLEDIR[@]|`echo $(exampledir) | sed -f $(makevarescape)`|g" \ -e "s|[@]FONTDIR[@]|`echo $(fontdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]g[@]|$(g)|g" \ - -e "s![@]G[@]!`echo $(g) | tr '[a-z]' '[A-Z]'`!g" \ + -e "s|[@]g[@]|\\\\%$(g)|g" \ -e "s|[@]HTMLDOCDIR[@]|`echo $(htmldocdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]INDEX_SUFFIX[@]|$(indexext)|g" \ + -e "s|[@]INDEX_SUFFIX[@]|\\\\%$(indexext)|g" \ -e "s|[@]LEGACYFONTDIR[@]|`echo $(legacyfontdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]LOCALFONTDIR[@]|`echo $(localfontdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]LOCALMACRODIR[@]|`echo $(localtmacdir) | sed -f $(makevarescape)`|g" \ @@ -916,17 +888,19 @@ SUFFIXES += .man -e "s|[@]MAN7EXT[@]|$(man7ext)|g" \ -e "s|[@]MDATE[@]|`$(PERL) $(top_srcdir)/mdate.pl $<`|g" \ -e "s|[@]OLDFONTDIR[@]|`echo $(oldfontdir) | sed -f $(makevarescape)`|g" \ + -e "s|[@]PAGE[@]|\\\\%$(PAGE)|g" \ -e "s|[@]PDFDOCDIR[@]|`echo $(pdfdocdir) | sed -f $(makevarescape)`|g" \ + -e "s|[@]PSPRINT[@]|`echo $(PSPRINT) | sed -f $(makevarescape)`|g" \ -e "s|[@]SYSTEMMACRODIR[@]|`echo $(systemtmacdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]TMAC_AN_PREFIX[@]|$(tmac_an_prefix)|g" \ - -e "s|[@]TMAC_M_PREFIX[@]|$(tmac_m_prefix)|g" \ - -e "s|[@]TMAC_MDIR[@]|$(tmacdir)/mm|g" \ - -e "s|[@]TMAC_S_PREFIX[@]|$(tmac_s_prefix)|g" \ + -e "s|[@]TMAC_AN_PREFIX[@]|\\\\%$(tmac_an_prefix)|g" \ + -e "s|[@]TMAC_M_PREFIX[@]|\\\\%$(tmac_m_prefix)|g" \ + -e "s|[@]TMAC_MDIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`/mm|g" \ + -e "s|[@]TMAC_S_PREFIX[@]|\\\\%$(tmac_s_prefix)|g" \ -e "s|[@]VERSION[@]|$(VERSION)|g" \ $< \ >$@ -# Version files - see script 'build-aux/git-gen-version' +# Version files - see script 'build-aux/git-version-gen' EXTRA_DIST += $(top_srcdir)/.version BUILT_SOURCES += $(top_srcdir)/.version $(top_srcdir)/.version: @@ -934,8 +908,8 @@ $(top_srcdir)/.version: dist-hook: echo $(VERSION) > $(distdir)/.tarball-version -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/Makefile.in b/Makefile.in index 505e9c3..a47df30 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,12 +14,10 @@ @SET_MAKE@ -# Copyright (C) 1989-2018 Free Software Foundation, Inc. +# Copyright (C) 1989-2023 Free Software Foundation, Inc. # Original Makefile.in written by James Clark (jjc@jclark.com) # Migrated to Automake by Bertrand Garrigues # -# Last update: 2017-11-02 -# # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under @@ -27,8 +25,8 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -59,11 +57,11 @@ # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2023 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, @@ -89,27 +87,46 @@ # --tests-base=tests \ # --aux-dir=build-aux \ # --makefile-name=gnulib.mk \ +# --automake-subdir \ # --no-conditional-dependencies \ # --no-libtool \ # --macro-prefix=gl \ # fprintf-posix \ # git-version-gen \ # havelib \ -# non-recursive-gnulib-prefix-hack \ # snprintf \ +# stdbool-c99 \ +# stdint \ # vsnprintf \ # wcwidth -# Automake rules for 'chem' +# Copyright (C) 2004-2023 Free Software Foundation, Inc. +# Original Makefile.sub written by Keith Marshall +# . +# Adapted to Automake by Bertrand Garrigues +# . +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . -# File position: /contrib/chem/chem.am +# Automake rules for 'chem' -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Moved to automake by Bertrand Garrigues # -# Last update: 22 Aug 2015 -# # This file is part of 'chem' which is part of 'groff'. # # 'groff' is free software; you can redistribute it and/or modify it @@ -126,9 +143,7 @@ ######################################################################## -# Copyright (C) 2002-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -150,14 +165,10 @@ # Automake rules for 'gdiffmk' (integration into the groff source tree) # -# File position: /contrib/gdiffmk/gdiffmk.am -# -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # Written by Mike Bianchi > # Automake migration by Bertrand Garrigues # -# Last update: 20 Aug 2015 -# # This file is part of the gdiffmk utility, which is part of groff. # # groff is free software; you can redistribute it and/or modify it @@ -175,15 +186,11 @@ # Automake rules for 'glilypond' -# File position: /contrib/lilypond/glilypond.am - -# Copyright (C) 2013-2018 Free Software Foundation, Inc. +# Copyright (C) 2013-2020 Free Software Foundation, Inc. # Written by Werner Lemberg and # Bernd Warken . # Automake migration by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'glilypond' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -201,14 +208,10 @@ # Automake rules for 'gperl' (preprocessor for added Perl parts) -# File position: /contrib/gperl/gperl.am - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Automake migration by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'gperl' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -229,14 +232,10 @@ # Automake rules for 'gpinyin' (preprocessor for added Perl parts) -# File position: /contrib/gpinyin/gpinyin.am - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Moved to automake by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'gpinyin' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -255,9 +254,7 @@ ######################################################################## -# Copyright (C) 2003-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2003-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -277,86 +274,27 @@ # grap2graph.am # -# Automake rules for 'groff_filenames' - -# File position: /contrib/groff_filenames/groff_filenames.am - -# Copyright (C) 2013-2018 Free Software Foundation, Inc. - -# Last update: 22 Aug 2015 - -# Written by Bernd Warken . -# Automake migration by Bertrand Garrigues - -# This file is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -######################################################################## - -# Automake rules for 'groffer' - -# File position: /contrib/groffer/groffer.am - -# Copyright (C) 2001-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg and -# Bernd Warken . -# Automake migration by Bertrand Garrigues - -# Last update: 22 Aug 2015 - -# This file is part of 'groffer' which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg (wl@gnu.org) +# Copyright (C) 2006-2020 Free Software Foundation, Inc. +# Written by Werner Lemberg # Automake migration by Bertrand Garrigues -# +# # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright 1991-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright 1991-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -376,32 +314,30 @@ # mm.am # -# Copyright (C) 2002-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg (wl@gnu.org) +# Copyright (C) 2002-2020 Free Software Foundation, Inc. +# Written by Werner Lemberg # Automake migration by Bertrand Garrigues -# +# # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2005-2018 Free Software Foundation, Inc. +# Copyright (C) 2005-2021 Free Software Foundation, Inc. # Written by Keith Marshall (keith.d.marshall@ntlworld.com) # Automake migration by Bertrand Garrigues # -# Last update: 22 Aug 2015 -# # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under @@ -417,9 +353,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2001-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -439,11 +373,25 @@ # pic2graph.am # -# Copyright (C) 2002-2018 Free Software Foundation, Inc. -# Original Makefile.sub written by Werner Lemberg -# Automake migration by -# Bertrand Garrigues +# Copyright 2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. # +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Copyright (C) 2021 Free Software Foundation, Inc. +# Written by Bertrand Garrigues # # This file is part of groff. # @@ -452,17 +400,35 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2022 Free Software Foundation, Inc. +# Original Makefile.sub written by Werner Lemberg . +# Adapted to Automake by Bertrand Garrigues +# (bertrand.garrigues@laposte.net). +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. # -# Last update: 13 Aug 2015 +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Copyright (C) 2014-2022 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -479,9 +445,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2022 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -498,9 +462,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2022 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -517,9 +479,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2022 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -536,9 +496,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -555,9 +513,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -574,9 +530,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -593,9 +547,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -612,9 +564,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -631,9 +581,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -650,9 +598,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -669,12 +615,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2011-2018 Free Software Foundation, Inc. -# Original Makefile.sub written -# by Deri James +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# Written by Deri James # Automake migration by Bertrand Garrigues -# -# Last update: 2017-11-02 +# # # This file is part of groff. # @@ -691,9 +635,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2022 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -710,9 +652,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -729,9 +669,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2015-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2015-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -748,9 +686,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of 'groff'. # @@ -769,11 +705,7 @@ # Automake rules for 'include' # -# File position: /src/include/include.am -# -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -793,11 +725,7 @@ # Automake rules for 'libbib' # -# File position: /src/libs/libbib/libbib.am -# -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -817,11 +745,7 @@ # Automake rules for 'libdriver' # -# File position: /src/libs/libdriver/libdriver.am -# -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -839,19 +763,17 @@ # ######################################################################## -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -860,11 +782,7 @@ # Automake rules for 'libxutil' # -# File position: /src/libs/libxutil/libxutil.am -# -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -882,9 +800,7 @@ # ######################################################################## -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -901,9 +817,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -920,9 +834,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -939,9 +851,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -958,12 +868,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2011-2018 Free Software Foundation, Inc. -# Original Makefile.sub written by Deri James . +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# Written by Deri James # Automake migration by Bertrand Garrigues # -# Last update: 22 Aug 2015 -# # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under @@ -979,9 +887,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -998,9 +904,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2021 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1017,47 +921,41 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1066,17 +964,15 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1093,9 +989,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1112,9 +1006,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1123,17 +1015,15 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1142,17 +1032,15 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1169,9 +1057,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1180,31 +1066,31 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 1993-2018 Free Software Foundation, Inc. +# Copyright (C) 1993-2020 Free Software Foundation, Inc. # -# Original Makefile.sub rewritten by +# Original Makefile.sub rewritten by # Bernd Warken # and Werner LEMBERG # -# Automake migration by +# Automake migration by # Bertrand Garrigues # -# Latest update: 22 Aug 2015 +# This file is part of groff. # -# 'groff' is free software; you can redistribute it and/or modify it +# groff is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# 'groff' is distributed in the hope that it will be useful, but +# groff is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. @@ -1212,76 +1098,43 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -######################################################################## - -# grog.am for 'grog' +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # -# File position: /src/roff/grog/grog.am -# -# Copyright (C) 1993-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 -# -# This file is part of 'grog' which is part of 'groff'. +# This file is part of groff. # -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Automake rules for 'src utils addftinfo' # -# This file is part of groff. -# -# groff is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Automake rules for 'src utils addftinfo' -# -# File position: /src/utils/addftinfo/addftinfo.am -# -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -1301,11 +1154,7 @@ # Automake rules for 'src utils afmtodit' # -# File position: /src/utils/afmtodit/afmtdodit.am -# -# Copyright (C) 2013-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2013-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1324,13 +1173,26 @@ # ######################################################################## -# Automake rules for 'src utils hpftodit' +# Copyright (C) 1993-2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# File position: /src/utils/hpftodit/hpftodit.am +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. # -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Automake rules for 'src utils hpftodit' # -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -1348,9 +1210,7 @@ # ######################################################################## -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1367,9 +1227,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1386,9 +1244,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1405,9 +1261,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1424,9 +1278,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1443,9 +1295,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Latest update: 22 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -1462,6 +1312,26 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +# Copyright (C) 1989-2020 Free Software Foundation, Inc. +# Written by James Clark +# Automake migration by Bertrand Garrigues +# +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -1550,37 +1420,38 @@ check_PROGRAMS = prefixexecbin_PROGRAMS = eqn$(EXEEXT) grn$(EXEEXT) pic$(EXEEXT) \ refer$(EXEEXT) soelim$(EXEEXT) tbl$(EXEEXT) troff$(EXEEXT) \ indxbib$(EXEEXT) lookbib$(EXEEXT) -@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_1 = lib/uniwidth/width.c -@BUILD_WINSCRIPTS_TRUE@am__append_2 = $(WINSCRIPTS) -@BUILD_WINSCRIPTS_FALSE@am__append_3 = $(WINSCRIPTS) -@BUILD_EXAMPLES_FALSE@am__append_4 = $(HDTBLEXAMPLEFILES) -@BUILD_EXAMPLES_TRUE@am__append_5 = $(hdtbl_TESTS) -@BUILD_EXAMPLES_TRUE@am__append_6 = $(hdtbl_TESTS) -@BUILD_EXAMPLES_FALSE@am__append_7 = $(MOMEXAMPLEFILES) -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@am__append_8 = $(mom_TESTS) -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@am__append_9 = $(mom_TESTS) -@BUILD_PDFDOC_TRUE@am__append_10 = $(PDFDOCFILES) -@BUILD_PDFDOC_FALSE@am__append_11 = $(PDFDOCFILES) -@BUILD_OTHERDOC_TRUE@am__append_12 = $(PROCESSEDDOCFILES) -@BUILD_OTHERDOC_FALSE@am__append_13 = $(DOCFILES) -@BUILD_PDFDOC_TRUE@am__append_14 = doc/automake.pdf -@BUILD_EXAMPLES_TRUE@am__append_15 = $(PROCESSEDEXAMPLEFILES) -@BUILD_EXAMPLES_FALSE@am__append_16 = $(EXAMPLEFILES) -@BUILD_INFODOC_TRUE@am__append_17 = doc/groff.info doc/groff.info-2 doc/groff.info-2 -@WITHOUT_X11_FALSE@am__append_18 = libxutil.a -@WITHOUT_X11_TRUE@am__append_19 = $(GXDITVIEWSOURCES) -@WITHOUT_X11_FALSE@am__append_20 = gxditview -@WITHOUT_X11_FALSE@am__append_21 = $(XDITVIEW_GENHDRS) -@WITHOUT_X11_FALSE@am__append_22 = src/devices/xditview/gxditview.1 -@WITHOUT_X11_FALSE@am__append_23 = xtotroff -@WITHOUT_X11_FALSE@am__append_24 = src/utils/xtotroff/xtotroff.1 -@USEPROGRAMPREFIX_FALSE@am__append_25 = $(PREFIXMAN1) +@GL_COND_OBJ_FLOAT_TRUE@am__append_1 = lib/float.c +@GL_COND_OBJ_ITOLD_TRUE@am__append_2 = lib/itold.c +@GL_COND_OBJ_FREE_TRUE@am__append_3 = lib/free.c +@GL_COND_OBJ_FSETERR_TRUE@am__append_4 = lib/fseterr.c +@GL_COND_OBJ_MEMCHR_TRUE@am__append_5 = lib/memchr.c +@GL_COND_OBJ_SIGNBIT3_TRUE@am__append_6 = lib/signbitf.c lib/signbitd.c lib/signbitl.c +@GL_COND_OBJ_STDIO_READ_TRUE@am__append_7 = lib/stdio-read.c +@GL_COND_OBJ_STDIO_WRITE_TRUE@am__append_8 = lib/stdio-write.c +@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_9 = lib/uniwidth/width.c +@GL_COND_OBJ_WCWIDTH_TRUE@am__append_10 = lib/wcwidth.c +@BUILD_WINSCRIPTS_TRUE@am__append_11 = $(WINSCRIPTS) +@BUILD_WINSCRIPTS_FALSE@am__append_12 = $(WINSCRIPTS) +@HAVE_URW_FONTS_TRUE@@USE_GROPDF_TRUE@am__append_13 = contrib/mom/examples/typesetting.pdf +@USE_PDFROFF_TRUE@am__append_14 = $(PDFDOCFILES) +@USE_PDFROFF_FALSE@am__append_15 = $(PDFDOCFILES) +@USE_GROFF_ALLOCATOR_TRUE@am__append_16 = \ +@USE_GROFF_ALLOCATOR_TRUE@ src/libs/libgroff/new.cpp + +@WITHOUT_X11_FALSE@am__append_17 = libxutil.a +@WITHOUT_X11_TRUE@am__append_18 = $(GXDITVIEWSOURCES) +@WITHOUT_X11_FALSE@am__append_19 = gxditview +@WITHOUT_X11_FALSE@am__append_20 = $(XDITVIEW_GENHDRS) +@WITHOUT_X11_FALSE@am__append_21 = $(GXDITVIEW_MAN1) +@WITHOUT_X11_FALSE@am__append_22 = xtotroff +@WITHOUT_X11_FALSE@am__append_23 = $(XTOTROFF_MAN1) +@USEPROGRAMPREFIX_FALSE@am__append_24 = $(PREFIXMAN1) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \ $(top_srcdir)/gnulib_m4/absolute-header.m4 \ $(top_srcdir)/gnulib_m4/alloca.m4 \ - $(top_srcdir)/gnulib_m4/asm-underscore.m4 \ + $(top_srcdir)/gnulib_m4/assert_h.m4 \ $(top_srcdir)/gnulib_m4/errno_h.m4 \ $(top_srcdir)/gnulib_m4/exponentd.m4 \ $(top_srcdir)/gnulib_m4/exponentf.m4 \ @@ -1590,14 +1461,15 @@ am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \ $(top_srcdir)/gnulib_m4/float_h.m4 \ $(top_srcdir)/gnulib_m4/fpieee.m4 \ $(top_srcdir)/gnulib_m4/fprintf-posix.m4 \ + $(top_srcdir)/gnulib_m4/free.m4 \ $(top_srcdir)/gnulib_m4/frexp.m4 \ $(top_srcdir)/gnulib_m4/frexpl.m4 \ $(top_srcdir)/gnulib_m4/fseterr.m4 \ $(top_srcdir)/gnulib_m4/gnulib-common.m4 \ $(top_srcdir)/gnulib_m4/gnulib-comp.m4 \ - $(top_srcdir)/gnulib_m4/host-cpu-c-abi.m4 \ $(top_srcdir)/gnulib_m4/include_next.m4 \ $(top_srcdir)/gnulib_m4/intmax_t.m4 \ + $(top_srcdir)/gnulib_m4/inttypes.m4 \ $(top_srcdir)/gnulib_m4/inttypes_h.m4 \ $(top_srcdir)/gnulib_m4/isnand.m4 \ $(top_srcdir)/gnulib_m4/isnanf.m4 \ @@ -1605,13 +1477,11 @@ am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \ $(top_srcdir)/gnulib_m4/ldexpl.m4 \ $(top_srcdir)/gnulib_m4/libunistring-base.m4 \ $(top_srcdir)/gnulib_m4/limits-h.m4 \ - $(top_srcdir)/gnulib_m4/longlong.m4 \ $(top_srcdir)/gnulib_m4/math_h.m4 \ $(top_srcdir)/gnulib_m4/memchr.m4 \ $(top_srcdir)/gnulib_m4/mmap-anon.m4 \ $(top_srcdir)/gnulib_m4/multiarch.m4 \ $(top_srcdir)/gnulib_m4/nocrash.m4 \ - $(top_srcdir)/gnulib_m4/non-recursive-gnulib-prefix-hack.m4 \ $(top_srcdir)/gnulib_m4/off_t.m4 \ $(top_srcdir)/gnulib_m4/printf-frexp.m4 \ $(top_srcdir)/gnulib_m4/printf-frexpl.m4 \ @@ -1620,12 +1490,15 @@ am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \ $(top_srcdir)/gnulib_m4/size_max.m4 \ $(top_srcdir)/gnulib_m4/snprintf.m4 \ $(top_srcdir)/gnulib_m4/ssize_t.m4 \ + $(top_srcdir)/gnulib_m4/stdbool.m4 \ $(top_srcdir)/gnulib_m4/stddef_h.m4 \ $(top_srcdir)/gnulib_m4/stdint.m4 \ $(top_srcdir)/gnulib_m4/stdint_h.m4 \ $(top_srcdir)/gnulib_m4/stdio_h.m4 \ + $(top_srcdir)/gnulib_m4/stdlib_h.m4 \ $(top_srcdir)/gnulib_m4/string_h.m4 \ $(top_srcdir)/gnulib_m4/sys_types_h.m4 \ + $(top_srcdir)/gnulib_m4/unistd_h.m4 \ $(top_srcdir)/gnulib_m4/vasnprintf.m4 \ $(top_srcdir)/gnulib_m4/vsnprintf.m4 \ $(top_srcdir)/gnulib_m4/warn-on-use.m4 \ @@ -1634,7 +1507,8 @@ am__aclocal_m4_deps = $(top_srcdir)/gnulib_m4/00gnulib.m4 \ $(top_srcdir)/gnulib_m4/wctype_h.m4 \ $(top_srcdir)/gnulib_m4/wcwidth.m4 \ $(top_srcdir)/gnulib_m4/wint_t.m4 \ - $(top_srcdir)/gnulib_m4/xsize.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/gnulib_m4/xsize.m4 \ + $(top_srcdir)/gnulib_m4/zzgnulib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/ax_prog_perl_version.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ @@ -1646,16 +1520,16 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(dist_bin_SCRIPTS) \ - $(am__dist_chemexample_DATA_DIST) $(dist_chempic_DATA) \ + $(dist_chemexample_DATA) $(dist_chempic_DATA) \ $(dist_devlj4font_DATA) $(dist_devlj4fontgen_DATA) \ $(dist_devpsfont_DATA) $(dist_devpsgen_DATA) \ - $(am__dist_docexamples_DATA_DIST) $(dist_glilypond_DATA) \ - $(dist_gpinyin_DATA) $(dist_grog_DATA) \ - $(am__dist_hdtblexample_DATA_DIST) $(dist_localtmac_DATA) \ - $(dist_mm_DATA) $(dist_mmexample_DATA) \ - $(am__dist_momexample_DATA_DIST) $(dist_momtmac_DATA) \ - $(dist_olddevpsfont_DATA) $(am__dist_otherdoc_DATA_DIST) \ - $(dist_pdfmarktmac_DATA) $(dist_tmac_DATA) $(dist_tmacmm_DATA) \ + $(dist_docexamples_DATA) $(dist_hdtblexample_DATA) \ + $(dist_hdtbltmac_DATA) $(dist_localtmac_DATA) \ + $(dist_mdoc_DATA) $(dist_mm_DATA) $(dist_mmexample_DATA) \ + $(dist_momexample_DATA) $(dist_momtmac_DATA) \ + $(dist_olddevpsfont_DATA) $(dist_otherdoc_DATA) \ + $(dist_pdfmarktmac_DATA) $(dist_rfc1345tmac_DATA) \ + $(dist_sboxestmac_DATA) $(dist_tmac_DATA) $(dist_tmacmm_DATA) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno @@ -1669,34 +1543,35 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \ - "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX10012fontdir)" \ - "$(DESTDIR)$(devX100fontdir)" "$(DESTDIR)$(devX7512fontdir)" \ - "$(DESTDIR)$(devX75fontdir)" "$(DESTDIR)$(devasciifontdir)" \ - "$(DESTDIR)$(devcp1047fontdir)" "$(DESTDIR)$(devdvifontdir)" \ - "$(DESTDIR)$(devdvigendir)" "$(DESTDIR)$(devhtmlfontdir)" \ - "$(DESTDIR)$(devlatin1fontdir)" "$(DESTDIR)$(devlbpfontdir)" \ - "$(DESTDIR)$(devpdffontdir)" "$(DESTDIR)$(devpdffontencdir)" \ + "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX100_12_fontdir)" \ + "$(DESTDIR)$(devX100_fontdir)" \ + "$(DESTDIR)$(devX75_12_fontdir)" "$(DESTDIR)$(devX75_fontdir)" \ + "$(DESTDIR)$(devasciifontdir)" "$(DESTDIR)$(devcp1047fontdir)" \ + "$(DESTDIR)$(devdvifontdir)" "$(DESTDIR)$(devdvigendir)" \ + "$(DESTDIR)$(devhtmlfontdir)" "$(DESTDIR)$(devlatin1fontdir)" \ + "$(DESTDIR)$(devlbpfontdir)" "$(DESTDIR)$(devpdffontdir)" \ + "$(DESTDIR)$(devpdffontencdir)" \ "$(DESTDIR)$(devpdffontmapdir)" "$(DESTDIR)$(devutf8fontdir)" \ "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chempicdir)" \ "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devlj4fontgendir)" \ "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(devpsgendir)" \ - "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(glilyponddir)" \ - "$(DESTDIR)$(gpinyindir)" "$(DESTDIR)$(grogdir)" \ - "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(localtmacdir)" \ - "$(DESTDIR)$(mmdir)" "$(DESTDIR)$(mmexampledir)" \ - "$(DESTDIR)$(momexampledir)" "$(DESTDIR)$(momtmacdir)" \ - "$(DESTDIR)$(olddevpsfontdir)" "$(DESTDIR)$(otherdocdir)" \ - "$(DESTDIR)$(pdfmarktmacdir)" "$(DESTDIR)$(tmacdir)" \ - "$(DESTDIR)$(tmacmmdir)" "$(DESTDIR)$(grofferdir)" \ - "$(DESTDIR)$(groffoptsdir)" "$(DESTDIR)$(hdtbltmacdir)" \ + "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(hdtblexampledir)" \ + "$(DESTDIR)$(hdtbltmacdir)" "$(DESTDIR)$(localtmacdir)" \ + "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(mmdir)" \ + "$(DESTDIR)$(mmexampledir)" "$(DESTDIR)$(momexampledir)" \ + "$(DESTDIR)$(momtmacdir)" "$(DESTDIR)$(olddevpsfontdir)" \ + "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarktmacdir)" \ + "$(DESTDIR)$(rfc1345tmacdir)" "$(DESTDIR)$(sboxestmacdir)" \ + "$(DESTDIR)$(tmacdir)" "$(DESTDIR)$(tmacmmdir)" \ "$(DESTDIR)$(htmlpicdir)" "$(DESTDIR)$(momhtmldir)" \ "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chemexample122dir)" \ "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devpsfontdir)" \ "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(docpdfdocdir)" \ - "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(htmlexamplesdir)" \ - "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(momprocessedexampledir)" \ + "$(DESTDIR)$(hdtblexampledir)" \ + "$(DESTDIR)$(momprocessedexampledir)" \ "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarkpdfdocdir)" \ - "$(DESTDIR)$(tmacdir)" + "$(DESTDIR)$(sboxesotherdocdir)" \ + "$(DESTDIR)$(sboxespdfdocdir)" "$(DESTDIR)$(tmacdir)" PROGRAMS = $(bin_PROGRAMS) $(nobase_bin_PROGRAMS) \ $(prefixexecbin_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) @@ -1706,15 +1581,39 @@ am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = lib_libgnu_a_AR = $(AR) $(ARFLAGS) am__DEPENDENCIES_1 = -am__lib_libgnu_a_SOURCES_DIST = lib/localcharset.c lib/math.c \ - lib/printf-frexp.c lib/printf-frexpl.c lib/size_max.h \ - lib/uniwidth/width.c lib/wctype-h.c lib/xsize.h lib/xsize.c +am__lib_libgnu_a_SOURCES_DIST = lib/float.c lib/itold.c lib/free.c \ + lib/fseterr.c lib/localcharset.c lib/math.c lib/memchr.c \ + lib/printf-frexp.c lib/printf-frexpl.c lib/signbitf.c \ + lib/signbitd.c lib/signbitl.c lib/size_max.h lib/stdio-read.c \ + lib/stdio-write.c lib/unistd.c lib/uniwidth/width.c \ + lib/wctype-h.c lib/wcwidth.c lib/xsize.h lib/xsize.c am__dirstamp = $(am__leading_dot)dirstamp -@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_1 = lib/uniwidth/width.$(OBJEXT) -am_lib_libgnu_a_OBJECTS = lib/localcharset.$(OBJEXT) \ - lib/math.$(OBJEXT) lib/printf-frexp.$(OBJEXT) \ - lib/printf-frexpl.$(OBJEXT) $(am__objects_1) \ - lib/wctype-h.$(OBJEXT) lib/xsize.$(OBJEXT) +@GL_COND_OBJ_FLOAT_TRUE@am__objects_1 = lib/libgnu_a-float.$(OBJEXT) +@GL_COND_OBJ_ITOLD_TRUE@am__objects_2 = lib/libgnu_a-itold.$(OBJEXT) +@GL_COND_OBJ_FREE_TRUE@am__objects_3 = lib/libgnu_a-free.$(OBJEXT) +@GL_COND_OBJ_FSETERR_TRUE@am__objects_4 = \ +@GL_COND_OBJ_FSETERR_TRUE@ lib/libgnu_a-fseterr.$(OBJEXT) +@GL_COND_OBJ_MEMCHR_TRUE@am__objects_5 = \ +@GL_COND_OBJ_MEMCHR_TRUE@ lib/libgnu_a-memchr.$(OBJEXT) +@GL_COND_OBJ_SIGNBIT3_TRUE@am__objects_6 = \ +@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitf.$(OBJEXT) \ +@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitd.$(OBJEXT) \ +@GL_COND_OBJ_SIGNBIT3_TRUE@ lib/libgnu_a-signbitl.$(OBJEXT) +@GL_COND_OBJ_STDIO_READ_TRUE@am__objects_7 = lib/libgnu_a-stdio-read.$(OBJEXT) +@GL_COND_OBJ_STDIO_WRITE_TRUE@am__objects_8 = lib/libgnu_a-stdio-write.$(OBJEXT) +@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_9 = lib/uniwidth/libgnu_a-width.$(OBJEXT) +@GL_COND_OBJ_WCWIDTH_TRUE@am__objects_10 = \ +@GL_COND_OBJ_WCWIDTH_TRUE@ lib/libgnu_a-wcwidth.$(OBJEXT) +am_lib_libgnu_a_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) \ + lib/libgnu_a-localcharset.$(OBJEXT) \ + lib/libgnu_a-math.$(OBJEXT) $(am__objects_5) \ + lib/libgnu_a-printf-frexp.$(OBJEXT) \ + lib/libgnu_a-printf-frexpl.$(OBJEXT) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) \ + lib/libgnu_a-unistd.$(OBJEXT) $(am__objects_9) \ + lib/libgnu_a-wctype-h.$(OBJEXT) $(am__objects_10) \ + lib/libgnu_a-xsize.$(OBJEXT) lib_libgnu_a_OBJECTS = $(am_lib_libgnu_a_OBJECTS) libbib_a_AR = $(AR) $(ARFLAGS) libbib_a_LIBADD = @@ -1730,6 +1629,33 @@ am_libdriver_a_OBJECTS = src/libs/libdriver/input.$(OBJEXT) \ libdriver_a_OBJECTS = $(am_libdriver_a_OBJECTS) libgroff_a_AR = $(AR) $(ARFLAGS) libgroff_a_LIBADD = +am__libgroff_a_SOURCES_DIST = src/libs/libgroff/assert.cpp \ + src/libs/libgroff/change_lf.cpp src/libs/libgroff/cmap.cpp \ + src/libs/libgroff/color.cpp src/libs/libgroff/cset.cpp \ + src/libs/libgroff/curtime.cpp src/libs/libgroff/device.cpp \ + src/libs/libgroff/errarg.cpp src/libs/libgroff/error.cpp \ + src/libs/libgroff/fatal.cpp src/libs/libgroff/filename.cpp \ + src/libs/libgroff/font.cpp src/libs/libgroff/fontfile.cpp \ + src/libs/libgroff/geometry.cpp src/libs/libgroff/getopt.c \ + src/libs/libgroff/getopt1.c src/libs/libgroff/glyphuni.cpp \ + src/libs/libgroff/htmlhint.cpp src/libs/libgroff/hypot.cpp \ + src/libs/libgroff/iftoa.c src/libs/libgroff/invalid.cpp \ + src/libs/libgroff/itoa.c src/libs/libgroff/lf.cpp \ + src/libs/libgroff/lineno.cpp src/libs/libgroff/localcharset.c \ + src/libs/libgroff/macropath.cpp src/libs/libgroff/matherr.c \ + src/libs/libgroff/maxfilename.cpp \ + src/libs/libgroff/maxpathname.cpp src/libs/libgroff/mksdir.cpp \ + src/libs/libgroff/nametoindex.cpp src/libs/libgroff/paper.cpp \ + src/libs/libgroff/prime.cpp src/libs/libgroff/progname.c \ + src/libs/libgroff/ptable.cpp src/libs/libgroff/quotearg.c \ + src/libs/libgroff/relocate.cpp \ + src/libs/libgroff/searchpath.cpp src/libs/libgroff/spawnvp.c \ + src/libs/libgroff/string.cpp src/libs/libgroff/strsave.cpp \ + src/libs/libgroff/symbol.cpp src/libs/libgroff/tmpfile.cpp \ + src/libs/libgroff/tmpname.cpp src/libs/libgroff/unicode.cpp \ + src/libs/libgroff/uniglyph.cpp src/libs/libgroff/uniuni.cpp \ + src/libs/libgroff/relocatable.h src/libs/libgroff/new.cpp +@USE_GROFF_ALLOCATOR_TRUE@am__objects_11 = src/libs/libgroff/libgroff_a-new.$(OBJEXT) am_libgroff_a_OBJECTS = src/libs/libgroff/libgroff_a-assert.$(OBJEXT) \ src/libs/libgroff/libgroff_a-change_lf.$(OBJEXT) \ src/libs/libgroff/libgroff_a-cmap.$(OBJEXT) \ @@ -1761,7 +1687,6 @@ am_libgroff_a_OBJECTS = src/libs/libgroff/libgroff_a-assert.$(OBJEXT) \ src/libs/libgroff/libgroff_a-maxpathname.$(OBJEXT) \ src/libs/libgroff/libgroff_a-mksdir.$(OBJEXT) \ src/libs/libgroff/libgroff_a-nametoindex.$(OBJEXT) \ - src/libs/libgroff/libgroff_a-new.$(OBJEXT) \ src/libs/libgroff/libgroff_a-paper.$(OBJEXT) \ src/libs/libgroff/libgroff_a-prime.$(OBJEXT) \ src/libs/libgroff/libgroff_a-progname.$(OBJEXT) \ @@ -1777,7 +1702,8 @@ am_libgroff_a_OBJECTS = src/libs/libgroff/libgroff_a-assert.$(OBJEXT) \ src/libs/libgroff/libgroff_a-tmpname.$(OBJEXT) \ src/libs/libgroff/libgroff_a-unicode.$(OBJEXT) \ src/libs/libgroff/libgroff_a-uniglyph.$(OBJEXT) \ - src/libs/libgroff/libgroff_a-uniuni.$(OBJEXT) + src/libs/libgroff/libgroff_a-uniuni.$(OBJEXT) \ + $(am__objects_11) nodist_libgroff_a_OBJECTS = \ src/libs/libgroff/libgroff_a-version.$(OBJEXT) libgroff_a_OBJECTS = $(am_libgroff_a_OBJECTS) \ @@ -1851,7 +1777,7 @@ am__gxditview_SOURCES_DIST = src/devices/xditview/device.c \ src/devices/xditview/parse.h src/devices/xditview/xditview.c \ src/devices/xditview/device.h src/devices/xditview/DviP.h \ src/devices/xditview/Menu.h src/devices/xditview/Dvi.h -am__objects_2 = src/devices/xditview/gxditview-device.$(OBJEXT) \ +am__objects_12 = src/devices/xditview/gxditview-device.$(OBJEXT) \ src/devices/xditview/gxditview-draw.$(OBJEXT) \ src/devices/xditview/gxditview-Dvi.$(OBJEXT) \ src/devices/xditview/gxditview-font.$(OBJEXT) \ @@ -1859,9 +1785,10 @@ am__objects_2 = src/devices/xditview/gxditview-device.$(OBJEXT) \ src/devices/xditview/gxditview-page.$(OBJEXT) \ src/devices/xditview/gxditview-parse.$(OBJEXT) \ src/devices/xditview/gxditview-xditview.$(OBJEXT) -@WITHOUT_X11_FALSE@am_gxditview_OBJECTS = $(am__objects_2) -am__objects_3 = -@WITHOUT_X11_FALSE@nodist_gxditview_OBJECTS = $(am__objects_3) +@WITHOUT_X11_FALSE@am_gxditview_OBJECTS = $(am__objects_12) +am__objects_13 = +@WITHOUT_X11_FALSE@am__objects_14 = $(am__objects_13) +@WITHOUT_X11_FALSE@nodist_gxditview_OBJECTS = $(am__objects_14) gxditview_OBJECTS = $(am_gxditview_OBJECTS) \ $(nodist_gxditview_OBJECTS) @WITHOUT_X11_FALSE@gxditview_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @@ -1989,21 +1916,37 @@ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = lib/$(DEPDIR)/asnprintf.Po \ - lib/$(DEPDIR)/float.Po lib/$(DEPDIR)/fprintf.Po \ - lib/$(DEPDIR)/frexp.Po lib/$(DEPDIR)/frexpl.Po \ - lib/$(DEPDIR)/fseterr.Po lib/$(DEPDIR)/isnan.Po \ - lib/$(DEPDIR)/isnand.Po lib/$(DEPDIR)/isnanf.Po \ - lib/$(DEPDIR)/isnanl.Po lib/$(DEPDIR)/itold.Po \ - lib/$(DEPDIR)/localcharset.Po lib/$(DEPDIR)/math.Po \ - lib/$(DEPDIR)/memchr.Po lib/$(DEPDIR)/printf-args.Po \ - lib/$(DEPDIR)/printf-frexp.Po lib/$(DEPDIR)/printf-frexpl.Po \ - lib/$(DEPDIR)/printf-parse.Po lib/$(DEPDIR)/signbitd.Po \ - lib/$(DEPDIR)/signbitf.Po lib/$(DEPDIR)/signbitl.Po \ - lib/$(DEPDIR)/snprintf.Po lib/$(DEPDIR)/vasnprintf.Po \ - lib/$(DEPDIR)/vsnprintf.Po lib/$(DEPDIR)/wctype-h.Po \ - lib/$(DEPDIR)/wcwidth.Po lib/$(DEPDIR)/xsize.Po \ - lib/uniwidth/$(DEPDIR)/width.Po \ +am__depfiles_remade = lib/$(DEPDIR)/libgnu_a-asnprintf.Po \ + lib/$(DEPDIR)/libgnu_a-float.Po \ + lib/$(DEPDIR)/libgnu_a-fprintf.Po \ + lib/$(DEPDIR)/libgnu_a-free.Po lib/$(DEPDIR)/libgnu_a-frexp.Po \ + lib/$(DEPDIR)/libgnu_a-frexpl.Po \ + lib/$(DEPDIR)/libgnu_a-fseterr.Po \ + lib/$(DEPDIR)/libgnu_a-isnan.Po \ + lib/$(DEPDIR)/libgnu_a-isnand.Po \ + lib/$(DEPDIR)/libgnu_a-isnanf.Po \ + lib/$(DEPDIR)/libgnu_a-isnanl.Po \ + lib/$(DEPDIR)/libgnu_a-itold.Po \ + lib/$(DEPDIR)/libgnu_a-localcharset.Po \ + lib/$(DEPDIR)/libgnu_a-math.Po \ + lib/$(DEPDIR)/libgnu_a-memchr.Po \ + lib/$(DEPDIR)/libgnu_a-printf-args.Po \ + lib/$(DEPDIR)/libgnu_a-printf-frexp.Po \ + lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po \ + lib/$(DEPDIR)/libgnu_a-printf-parse.Po \ + lib/$(DEPDIR)/libgnu_a-signbitd.Po \ + lib/$(DEPDIR)/libgnu_a-signbitf.Po \ + lib/$(DEPDIR)/libgnu_a-signbitl.Po \ + lib/$(DEPDIR)/libgnu_a-snprintf.Po \ + lib/$(DEPDIR)/libgnu_a-stdio-read.Po \ + lib/$(DEPDIR)/libgnu_a-stdio-write.Po \ + lib/$(DEPDIR)/libgnu_a-unistd.Po \ + lib/$(DEPDIR)/libgnu_a-vasnprintf.Po \ + lib/$(DEPDIR)/libgnu_a-vsnprintf.Po \ + lib/$(DEPDIR)/libgnu_a-wctype-h.Po \ + lib/$(DEPDIR)/libgnu_a-wcwidth.Po \ + lib/$(DEPDIR)/libgnu_a-xsize.Po \ + lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po \ src/devices/grodvi/$(DEPDIR)/dvi.Po \ src/devices/grohtml/$(DEPDIR)/html-table.Po \ src/devices/grohtml/$(DEPDIR)/html-text.Po \ @@ -2195,7 +2138,7 @@ SOURCES = $(lib_libgnu_a_SOURCES) $(EXTRA_lib_libgnu_a_SOURCES) \ $(nodist_troff_SOURCES) $(xtotroff_SOURCES) DIST_SOURCES = $(am__lib_libgnu_a_SOURCES_DIST) \ $(EXTRA_lib_libgnu_a_SOURCES) $(libbib_a_SOURCES) \ - $(libdriver_a_SOURCES) $(libgroff_a_SOURCES) \ + $(libdriver_a_SOURCES) $(am__libgroff_a_SOURCES_DIST) \ $(am__libxutil_a_SOURCES_DIST) $(addftinfo_SOURCES) \ $(eqn_SOURCES) $(grn_SOURCES) $(grodvi_SOURCES) \ $(groff_SOURCES) $(grolbp_SOURCES) $(grolj4_SOURCES) \ @@ -2213,62 +2156,29 @@ am__can_run_installinfo = \ esac NROFF = nroff MANS = $(man1_MANS) $(man5_MANS) $(man7_MANS) -am__dist_chemexample_DATA_DIST = contrib/chem/examples/atp.chem \ - contrib/chem/examples/cholesterin.chem \ - contrib/chem/examples/ethamivan.chem \ - contrib/chem/examples/lsd.chem \ - contrib/chem/examples/morphine.chem \ - contrib/chem/examples/penicillin.chem \ - contrib/chem/examples/reserpine.chem -am__dist_docexamples_DATA_DIST = doc/webpage.ms doc/groff.css \ - doc/grnexmpl.g doc/grnexmpl.me -am__dist_hdtblexample_DATA_DIST = contrib/hdtbl/examples/common.roff \ - contrib/hdtbl/examples/chess_board.roff \ - contrib/hdtbl/examples/color_boxes.roff \ - contrib/hdtbl/examples/color_nested_tables.roff \ - contrib/hdtbl/examples/color_table_cells.roff \ - contrib/hdtbl/examples/color_transitions.roff \ - contrib/hdtbl/examples/col_rowspan_colors.roff \ - contrib/hdtbl/examples/mixed_pickles.roff \ - contrib/hdtbl/examples/rainbow.roff \ - contrib/hdtbl/examples/short_reference.roff -am__dist_momexample_DATA_DIST = contrib/mom/examples/letter.mom \ - contrib/mom/examples/mom-pdf.mom \ - contrib/mom/examples/mon_premier_doc.mom \ - contrib/mom/examples/sample_docs.mom \ - contrib/mom/examples/typesetting.mom \ - contrib/mom/examples/README.txt \ - contrib/mom/examples/README-fr.txt \ - contrib/mom/examples/elvis_syntax \ - contrib/mom/examples/elvis_syntax.new \ - contrib/mom/examples/penguin.ps \ - contrib/mom/examples/penguin.pdf contrib/mom/examples/mom.vim \ - contrib/mom/examples/slide-demo.mom -am__dist_otherdoc_DATA_DIST = doc/meref.me doc/meintro.me \ - doc/meintro_fr.me doc/pic.ms -DATA = $(devX10012font_DATA) $(devX100font_DATA) $(devX7512font_DATA) \ - $(devX75font_DATA) $(devasciifont_DATA) $(devcp1047font_DATA) \ - $(devdvifont_DATA) $(devdvigen_DATA) $(devhtmlfont_DATA) \ - $(devlatin1font_DATA) $(devlbpfont_DATA) $(devpdffont_DATA) \ - $(devpdffontenc_DATA) $(devpdffontmap_DATA) \ - $(devutf8font_DATA) $(dist_chemexample_DATA) \ - $(dist_chempic_DATA) $(dist_devlj4font_DATA) \ - $(dist_devlj4fontgen_DATA) $(dist_devpsfont_DATA) \ - $(dist_devpsgen_DATA) $(dist_docexamples_DATA) \ - $(dist_glilypond_DATA) $(dist_gpinyin_DATA) $(dist_grog_DATA) \ - $(dist_hdtblexample_DATA) $(dist_localtmac_DATA) \ - $(dist_mm_DATA) $(dist_mmexample_DATA) $(dist_momexample_DATA) \ - $(dist_momtmac_DATA) $(dist_olddevpsfont_DATA) \ - $(dist_otherdoc_DATA) $(dist_pdfmarktmac_DATA) \ - $(dist_tmac_DATA) $(dist_tmacmm_DATA) $(groffer_DATA) \ - $(groffopts_DATA) $(hdtbltmac_DATA) $(htmlpic_DATA) \ - $(momhtml_DATA) $(nodist_chemexample_DATA) \ +DATA = $(devX100_12_font_DATA) $(devX100_font_DATA) \ + $(devX75_12_font_DATA) $(devX75_font_DATA) \ + $(devasciifont_DATA) $(devcp1047font_DATA) $(devdvifont_DATA) \ + $(devdvigen_DATA) $(devhtmlfont_DATA) $(devlatin1font_DATA) \ + $(devlbpfont_DATA) $(devpdffont_DATA) $(devpdffontenc_DATA) \ + $(devpdffontmap_DATA) $(devutf8font_DATA) \ + $(dist_chemexample_DATA) $(dist_chempic_DATA) \ + $(dist_devlj4font_DATA) $(dist_devlj4fontgen_DATA) \ + $(dist_devpsfont_DATA) $(dist_devpsgen_DATA) \ + $(dist_docexamples_DATA) $(dist_hdtblexample_DATA) \ + $(dist_hdtbltmac_DATA) $(dist_localtmac_DATA) \ + $(dist_mdoc_DATA) $(dist_mm_DATA) $(dist_mmexample_DATA) \ + $(dist_momexample_DATA) $(dist_momtmac_DATA) \ + $(dist_olddevpsfont_DATA) $(dist_otherdoc_DATA) \ + $(dist_pdfmarktmac_DATA) $(dist_rfc1345tmac_DATA) \ + $(dist_sboxestmac_DATA) $(dist_tmac_DATA) $(dist_tmacmm_DATA) \ + $(htmlpic_DATA) $(momhtml_DATA) $(nodist_chemexample_DATA) \ $(nodist_chemexample122_DATA) $(nodist_devlj4font_DATA) \ $(nodist_devpsfont_DATA) $(nodist_docexamples_DATA) \ $(nodist_docpdfdoc_DATA) $(nodist_hdtblexample_DATA) \ - $(nodist_htmlexamples_DATA) $(nodist_mdoc_DATA) \ $(nodist_momprocessedexample_DATA) $(nodist_otherdoc_DATA) \ - $(nodist_pdfmarkpdfdoc_DATA) $(nodist_tmac_DATA) + $(nodist_pdfmarkpdfdoc_DATA) $(nodist_sboxesotherdoc_DATA) \ + $(nodist_sboxespdfdoc_DATA) $(nodist_tmac_DATA) HEADERS = $(nodist_noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, @@ -2287,8 +2197,6 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -CTAGS = ctags -CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope check recheck am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ @@ -2445,6 +2353,7 @@ am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test @@ -2485,13 +2394,13 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/test-groff.in \ $(top_srcdir)/contrib/gperl/gperl.am \ $(top_srcdir)/contrib/gpinyin/gpinyin.am \ $(top_srcdir)/contrib/grap2graph/grap2graph.am \ - $(top_srcdir)/contrib/groff_filenames/groff_filenames.am \ - $(top_srcdir)/contrib/groffer/groffer.am \ $(top_srcdir)/contrib/hdtbl/hdtbl.am \ $(top_srcdir)/contrib/mm/mm.am \ $(top_srcdir)/contrib/mom/mom.am \ $(top_srcdir)/contrib/pdfmark/pdfmark.am \ $(top_srcdir)/contrib/pic2graph/pic2graph.am \ + $(top_srcdir)/contrib/rfc1345/rfc1345.am \ + $(top_srcdir)/contrib/sboxes/sboxes.am \ $(top_srcdir)/doc/doc.am \ $(top_srcdir)/font/devX100-12/devX100-12.am \ $(top_srcdir)/font/devX100/devX100.am \ @@ -2532,11 +2441,11 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/test-groff.in \ $(top_srcdir)/src/preproc/soelim/soelim.am \ $(top_srcdir)/src/preproc/tbl/tbl.am \ $(top_srcdir)/src/roff/groff/groff.am \ - $(top_srcdir)/src/roff/grog/grog.am \ $(top_srcdir)/src/roff/nroff/nroff.am \ $(top_srcdir)/src/roff/troff/troff.am \ $(top_srcdir)/src/utils/addftinfo/addftinfo.am \ $(top_srcdir)/src/utils/afmtodit/afmtodit.am \ + $(top_srcdir)/src/utils/grog/grog.am \ $(top_srcdir)/src/utils/hpftodit/hpftodit.am \ $(top_srcdir)/src/utils/indxbib/indxbib.am \ $(top_srcdir)/src/utils/lkbib/lkbib.am \ @@ -2565,6 +2474,8 @@ am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -2577,38 +2488,9 @@ ALT_GHOSTSCRIPT_PROGS = @ALT_GHOSTSCRIPT_PROGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ -# CC -# CFLAGS -# CPPFLAGS -# LDFLAGS - -# X_CFLAGS -# X_LIBS -# X_EXTRA_LIBS -# X_PRE_LIBS - -# YACC - -# GREP -# EGREP - -# MAKEINFO - -# EXEEXT -# OBJEXT -# LIBEXT -# LIBS -# LIBM -# LIBICONV -# RANLIB -# INSTALL -# INSTALL_PROGRAM -# INSTALL_SCRIPT -# INSTALL_DATA -# INSTALL_INFO -# LN_S -AR = ar +AR = @AR@ ARFLAGS = @ARFLAGS@ +ASSERT_H = @ASSERT_H@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -2625,6 +2507,8 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ @@ -2645,259 +2529,459 @@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ +# CC +# CFLAGS +# CPPFLAGS +# LDFLAGS + +# X_CFLAGS +# X_LIBS +# X_EXTRA_LIBS +# X_PRE_LIBS + +# YACC + +# GREP +# EGREP + +# MAKEINFO + +# EXEEXT +# OBJEXT +# LIBEXT +# LIBS +# LIBM +# LIBICONV +# AR +# RANLIB +# INSTALL +# INSTALL_PROGRAM +# INSTALL_SCRIPT +# INSTALL_DATA +# INSTALL_INFO +# LN_S +ETAGS = etags EXEEXT = @EXEEXT@ FLOAT_H = @FLOAT_H@ GDIFF = @GDIFF@ GHOSTSCRIPT = @GHOSTSCRIPT@ GLIBC21 = @GLIBC21@ -GNULIB_ACOSF = @GNULIB_ACOSF@ -GNULIB_ACOSL = @GNULIB_ACOSL@ -GNULIB_ASINF = @GNULIB_ASINF@ -GNULIB_ASINL = @GNULIB_ASINL@ -GNULIB_ATAN2F = @GNULIB_ATAN2F@ -GNULIB_ATANF = @GNULIB_ATANF@ -GNULIB_ATANL = @GNULIB_ATANL@ -GNULIB_BTOWC = @GNULIB_BTOWC@ -GNULIB_CBRT = @GNULIB_CBRT@ -GNULIB_CBRTF = @GNULIB_CBRTF@ -GNULIB_CBRTL = @GNULIB_CBRTL@ -GNULIB_CEIL = @GNULIB_CEIL@ -GNULIB_CEILF = @GNULIB_CEILF@ -GNULIB_CEILL = @GNULIB_CEILL@ -GNULIB_COPYSIGN = @GNULIB_COPYSIGN@ -GNULIB_COPYSIGNF = @GNULIB_COPYSIGNF@ -GNULIB_COPYSIGNL = @GNULIB_COPYSIGNL@ -GNULIB_COSF = @GNULIB_COSF@ -GNULIB_COSHF = @GNULIB_COSHF@ -GNULIB_COSL = @GNULIB_COSL@ -GNULIB_DPRINTF = @GNULIB_DPRINTF@ -GNULIB_EXP2 = @GNULIB_EXP2@ -GNULIB_EXP2F = @GNULIB_EXP2F@ -GNULIB_EXP2L = @GNULIB_EXP2L@ -GNULIB_EXPF = @GNULIB_EXPF@ -GNULIB_EXPL = @GNULIB_EXPL@ -GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@ -GNULIB_EXPM1 = @GNULIB_EXPM1@ -GNULIB_EXPM1F = @GNULIB_EXPM1F@ -GNULIB_EXPM1L = @GNULIB_EXPM1L@ -GNULIB_FABSF = @GNULIB_FABSF@ -GNULIB_FABSL = @GNULIB_FABSL@ -GNULIB_FCLOSE = @GNULIB_FCLOSE@ -GNULIB_FDOPEN = @GNULIB_FDOPEN@ -GNULIB_FFLUSH = @GNULIB_FFLUSH@ -GNULIB_FFSL = @GNULIB_FFSL@ -GNULIB_FFSLL = @GNULIB_FFSLL@ -GNULIB_FGETC = @GNULIB_FGETC@ -GNULIB_FGETS = @GNULIB_FGETS@ -GNULIB_FLOOR = @GNULIB_FLOOR@ -GNULIB_FLOORF = @GNULIB_FLOORF@ -GNULIB_FLOORL = @GNULIB_FLOORL@ -GNULIB_FMA = @GNULIB_FMA@ -GNULIB_FMAF = @GNULIB_FMAF@ -GNULIB_FMAL = @GNULIB_FMAL@ -GNULIB_FMOD = @GNULIB_FMOD@ -GNULIB_FMODF = @GNULIB_FMODF@ -GNULIB_FMODL = @GNULIB_FMODL@ -GNULIB_FOPEN = @GNULIB_FOPEN@ -GNULIB_FPRINTF = @GNULIB_FPRINTF@ -GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ -GNULIB_FPURGE = @GNULIB_FPURGE@ -GNULIB_FPUTC = @GNULIB_FPUTC@ -GNULIB_FPUTS = @GNULIB_FPUTS@ -GNULIB_FREAD = @GNULIB_FREAD@ -GNULIB_FREOPEN = @GNULIB_FREOPEN@ -GNULIB_FREXP = @GNULIB_FREXP@ -GNULIB_FREXPF = @GNULIB_FREXPF@ -GNULIB_FREXPL = @GNULIB_FREXPL@ -GNULIB_FSCANF = @GNULIB_FSCANF@ -GNULIB_FSEEK = @GNULIB_FSEEK@ -GNULIB_FSEEKO = @GNULIB_FSEEKO@ -GNULIB_FTELL = @GNULIB_FTELL@ -GNULIB_FTELLO = @GNULIB_FTELLO@ -GNULIB_FWRITE = @GNULIB_FWRITE@ -GNULIB_GETC = @GNULIB_GETC@ -GNULIB_GETCHAR = @GNULIB_GETCHAR@ -GNULIB_GETDELIM = @GNULIB_GETDELIM@ -GNULIB_GETLINE = @GNULIB_GETLINE@ -GNULIB_HYPOT = @GNULIB_HYPOT@ -GNULIB_HYPOTF = @GNULIB_HYPOTF@ -GNULIB_HYPOTL = @GNULIB_HYPOTL@ -GNULIB_ILOGB = @GNULIB_ILOGB@ -GNULIB_ILOGBF = @GNULIB_ILOGBF@ -GNULIB_ILOGBL = @GNULIB_ILOGBL@ -GNULIB_ISFINITE = @GNULIB_ISFINITE@ -GNULIB_ISINF = @GNULIB_ISINF@ -GNULIB_ISNAN = @GNULIB_ISNAN@ -GNULIB_ISNAND = @GNULIB_ISNAND@ -GNULIB_ISNANF = @GNULIB_ISNANF@ -GNULIB_ISNANL = @GNULIB_ISNANL@ -GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ -GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ -GNULIB_LDEXPF = @GNULIB_LDEXPF@ -GNULIB_LDEXPL = @GNULIB_LDEXPL@ -GNULIB_LOG = @GNULIB_LOG@ -GNULIB_LOG10 = @GNULIB_LOG10@ -GNULIB_LOG10F = @GNULIB_LOG10F@ -GNULIB_LOG10L = @GNULIB_LOG10L@ -GNULIB_LOG1P = @GNULIB_LOG1P@ -GNULIB_LOG1PF = @GNULIB_LOG1PF@ -GNULIB_LOG1PL = @GNULIB_LOG1PL@ -GNULIB_LOG2 = @GNULIB_LOG2@ -GNULIB_LOG2F = @GNULIB_LOG2F@ -GNULIB_LOG2L = @GNULIB_LOG2L@ -GNULIB_LOGB = @GNULIB_LOGB@ -GNULIB_LOGBF = @GNULIB_LOGBF@ -GNULIB_LOGBL = @GNULIB_LOGBL@ -GNULIB_LOGF = @GNULIB_LOGF@ -GNULIB_LOGL = @GNULIB_LOGL@ -GNULIB_MBRLEN = @GNULIB_MBRLEN@ -GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ -GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ -GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ -GNULIB_MBSCHR = @GNULIB_MBSCHR@ -GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ -GNULIB_MBSINIT = @GNULIB_MBSINIT@ -GNULIB_MBSLEN = @GNULIB_MBSLEN@ -GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ -GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ -GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ -GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ -GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ -GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ -GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ -GNULIB_MBSSEP = @GNULIB_MBSSEP@ -GNULIB_MBSSPN = @GNULIB_MBSSPN@ -GNULIB_MBSSTR = @GNULIB_MBSSTR@ -GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ -GNULIB_MEMCHR = @GNULIB_MEMCHR@ -GNULIB_MEMMEM = @GNULIB_MEMMEM@ -GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ -GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ -GNULIB_MODF = @GNULIB_MODF@ -GNULIB_MODFF = @GNULIB_MODFF@ -GNULIB_MODFL = @GNULIB_MODFL@ -GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ -GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ -GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@ -GNULIB_PCLOSE = @GNULIB_PCLOSE@ -GNULIB_PERROR = @GNULIB_PERROR@ -GNULIB_POPEN = @GNULIB_POPEN@ -GNULIB_POWF = @GNULIB_POWF@ -GNULIB_PRINTF = @GNULIB_PRINTF@ -GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ -GNULIB_PUTC = @GNULIB_PUTC@ -GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ -GNULIB_PUTS = @GNULIB_PUTS@ -GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ -GNULIB_REMAINDER = @GNULIB_REMAINDER@ -GNULIB_REMAINDERF = @GNULIB_REMAINDERF@ -GNULIB_REMAINDERL = @GNULIB_REMAINDERL@ -GNULIB_REMOVE = @GNULIB_REMOVE@ -GNULIB_RENAME = @GNULIB_RENAME@ -GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ -GNULIB_RINT = @GNULIB_RINT@ -GNULIB_RINTF = @GNULIB_RINTF@ -GNULIB_RINTL = @GNULIB_RINTL@ -GNULIB_ROUND = @GNULIB_ROUND@ -GNULIB_ROUNDF = @GNULIB_ROUNDF@ -GNULIB_ROUNDL = @GNULIB_ROUNDL@ -GNULIB_SCANF = @GNULIB_SCANF@ -GNULIB_SIGNBIT = @GNULIB_SIGNBIT@ -GNULIB_SINF = @GNULIB_SINF@ -GNULIB_SINHF = @GNULIB_SINHF@ -GNULIB_SINL = @GNULIB_SINL@ -GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ -GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ -GNULIB_SQRTF = @GNULIB_SQRTF@ -GNULIB_SQRTL = @GNULIB_SQRTL@ -GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ -GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ -GNULIB_STPCPY = @GNULIB_STPCPY@ -GNULIB_STPNCPY = @GNULIB_STPNCPY@ -GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ -GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ -GNULIB_STRDUP = @GNULIB_STRDUP@ -GNULIB_STRERROR = @GNULIB_STRERROR@ -GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ -GNULIB_STRNCAT = @GNULIB_STRNCAT@ -GNULIB_STRNDUP = @GNULIB_STRNDUP@ -GNULIB_STRNLEN = @GNULIB_STRNLEN@ -GNULIB_STRPBRK = @GNULIB_STRPBRK@ -GNULIB_STRSEP = @GNULIB_STRSEP@ -GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ -GNULIB_STRSTR = @GNULIB_STRSTR@ -GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ -GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ -GNULIB_TANF = @GNULIB_TANF@ -GNULIB_TANHF = @GNULIB_TANHF@ -GNULIB_TANL = @GNULIB_TANL@ -GNULIB_TMPFILE = @GNULIB_TMPFILE@ -GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ -GNULIB_TRUNC = @GNULIB_TRUNC@ -GNULIB_TRUNCF = @GNULIB_TRUNCF@ -GNULIB_TRUNCL = @GNULIB_TRUNCL@ -GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ -GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ -GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ -GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ -GNULIB_VFSCANF = @GNULIB_VFSCANF@ -GNULIB_VPRINTF = @GNULIB_VPRINTF@ -GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ -GNULIB_VSCANF = @GNULIB_VSCANF@ -GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ -GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ -GNULIB_WCPCPY = @GNULIB_WCPCPY@ -GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ -GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ -GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ -GNULIB_WCSCAT = @GNULIB_WCSCAT@ -GNULIB_WCSCHR = @GNULIB_WCSCHR@ -GNULIB_WCSCMP = @GNULIB_WCSCMP@ -GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ -GNULIB_WCSCPY = @GNULIB_WCSCPY@ -GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ -GNULIB_WCSDUP = @GNULIB_WCSDUP@ -GNULIB_WCSFTIME = @GNULIB_WCSFTIME@ -GNULIB_WCSLEN = @GNULIB_WCSLEN@ -GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ -GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ -GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ -GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ -GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ -GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ -GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ -GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ -GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ -GNULIB_WCSSPN = @GNULIB_WCSSPN@ -GNULIB_WCSSTR = @GNULIB_WCSSTR@ -GNULIB_WCSTOK = @GNULIB_WCSTOK@ -GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ -GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ -GNULIB_WCTOB = @GNULIB_WCTOB@ -GNULIB_WCTRANS = @GNULIB_WCTRANS@ -GNULIB_WCTYPE = @GNULIB_WCTYPE@ -GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ -GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ -GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ -GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ -GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ -GNULIB_WMEMSET = @GNULIB_WMEMSET@ +GL_CFLAG_ALLOW_WARNINGS = @GL_CFLAG_ALLOW_WARNINGS@ +GL_CFLAG_GNULIB_WARNINGS = @GL_CFLAG_GNULIB_WARNINGS@ +GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@ +GL_GNULIB_ACOSF = @GL_GNULIB_ACOSF@ +GL_GNULIB_ACOSL = @GL_GNULIB_ACOSL@ +GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@ +GL_GNULIB_ASINF = @GL_GNULIB_ASINF@ +GL_GNULIB_ASINL = @GL_GNULIB_ASINL@ +GL_GNULIB_ATAN2F = @GL_GNULIB_ATAN2F@ +GL_GNULIB_ATANF = @GL_GNULIB_ATANF@ +GL_GNULIB_ATANL = @GL_GNULIB_ATANL@ +GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@ +GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@ +GL_GNULIB_CALLOC_GNU = @GL_GNULIB_CALLOC_GNU@ +GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@ +GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@ +GL_GNULIB_CBRT = @GL_GNULIB_CBRT@ +GL_GNULIB_CBRTF = @GL_GNULIB_CBRTF@ +GL_GNULIB_CBRTL = @GL_GNULIB_CBRTL@ +GL_GNULIB_CEIL = @GL_GNULIB_CEIL@ +GL_GNULIB_CEILF = @GL_GNULIB_CEILF@ +GL_GNULIB_CEILL = @GL_GNULIB_CEILL@ +GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@ +GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@ +GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@ +GL_GNULIB_COPYSIGN = @GL_GNULIB_COPYSIGN@ +GL_GNULIB_COPYSIGNF = @GL_GNULIB_COPYSIGNF@ +GL_GNULIB_COPYSIGNL = @GL_GNULIB_COPYSIGNL@ +GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@ +GL_GNULIB_COSF = @GL_GNULIB_COSF@ +GL_GNULIB_COSHF = @GL_GNULIB_COSHF@ +GL_GNULIB_COSL = @GL_GNULIB_COSL@ +GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@ +GL_GNULIB_DUP = @GL_GNULIB_DUP@ +GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@ +GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@ +GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@ +GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@ +GL_GNULIB_EXECL = @GL_GNULIB_EXECL@ +GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@ +GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@ +GL_GNULIB_EXECV = @GL_GNULIB_EXECV@ +GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@ +GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@ +GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@ +GL_GNULIB_EXP2 = @GL_GNULIB_EXP2@ +GL_GNULIB_EXP2F = @GL_GNULIB_EXP2F@ +GL_GNULIB_EXP2L = @GL_GNULIB_EXP2L@ +GL_GNULIB_EXPF = @GL_GNULIB_EXPF@ +GL_GNULIB_EXPL = @GL_GNULIB_EXPL@ +GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@ +GL_GNULIB_EXPM1 = @GL_GNULIB_EXPM1@ +GL_GNULIB_EXPM1F = @GL_GNULIB_EXPM1F@ +GL_GNULIB_EXPM1L = @GL_GNULIB_EXPM1L@ +GL_GNULIB_FABSF = @GL_GNULIB_FABSF@ +GL_GNULIB_FABSL = @GL_GNULIB_FABSL@ +GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@ +GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@ +GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@ +GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@ +GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@ +GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@ +GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@ +GL_GNULIB_FFSL = @GL_GNULIB_FFSL@ +GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@ +GL_GNULIB_FGETC = @GL_GNULIB_FGETC@ +GL_GNULIB_FGETS = @GL_GNULIB_FGETS@ +GL_GNULIB_FLOOR = @GL_GNULIB_FLOOR@ +GL_GNULIB_FLOORF = @GL_GNULIB_FLOORF@ +GL_GNULIB_FLOORL = @GL_GNULIB_FLOORL@ +GL_GNULIB_FMA = @GL_GNULIB_FMA@ +GL_GNULIB_FMAF = @GL_GNULIB_FMAF@ +GL_GNULIB_FMAL = @GL_GNULIB_FMAL@ +GL_GNULIB_FMOD = @GL_GNULIB_FMOD@ +GL_GNULIB_FMODF = @GL_GNULIB_FMODF@ +GL_GNULIB_FMODL = @GL_GNULIB_FMODL@ +GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@ +GL_GNULIB_FOPEN_GNU = @GL_GNULIB_FOPEN_GNU@ +GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@ +GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@ +GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@ +GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@ +GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@ +GL_GNULIB_FREAD = @GL_GNULIB_FREAD@ +GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@ +GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@ +GL_GNULIB_FREXP = @GL_GNULIB_FREXP@ +GL_GNULIB_FREXPF = @GL_GNULIB_FREXPF@ +GL_GNULIB_FREXPL = @GL_GNULIB_FREXPL@ +GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@ +GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@ +GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@ +GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@ +GL_GNULIB_FTELL = @GL_GNULIB_FTELL@ +GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@ +GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@ +GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@ +GL_GNULIB_GETC = @GL_GNULIB_GETC@ +GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@ +GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@ +GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@ +GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@ +GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@ +GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@ +GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@ +GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@ +GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@ +GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@ +GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@ +GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@ +GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@ +GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@ +GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@ +GL_GNULIB_GETPASS_GNU = @GL_GNULIB_GETPASS_GNU@ +GL_GNULIB_GETPROGNAME = @GL_GNULIB_GETPROGNAME@ +GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@ +GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@ +GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@ +GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@ +GL_GNULIB_HYPOT = @GL_GNULIB_HYPOT@ +GL_GNULIB_HYPOTF = @GL_GNULIB_HYPOTF@ +GL_GNULIB_HYPOTL = @GL_GNULIB_HYPOTL@ +GL_GNULIB_ILOGB = @GL_GNULIB_ILOGB@ +GL_GNULIB_ILOGBF = @GL_GNULIB_ILOGBF@ +GL_GNULIB_ILOGBL = @GL_GNULIB_ILOGBL@ +GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@ +GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@ +GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@ +GL_GNULIB_ISFINITE = @GL_GNULIB_ISFINITE@ +GL_GNULIB_ISINF = @GL_GNULIB_ISINF@ +GL_GNULIB_ISNAN = @GL_GNULIB_ISNAN@ +GL_GNULIB_ISNAND = @GL_GNULIB_ISNAND@ +GL_GNULIB_ISNANF = @GL_GNULIB_ISNANF@ +GL_GNULIB_ISNANL = @GL_GNULIB_ISNANL@ +GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@ +GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@ +GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@ +GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@ +GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@ +GL_GNULIB_LDEXPF = @GL_GNULIB_LDEXPF@ +GL_GNULIB_LDEXPL = @GL_GNULIB_LDEXPL@ +GL_GNULIB_LINK = @GL_GNULIB_LINK@ +GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@ +GL_GNULIB_LOG = @GL_GNULIB_LOG@ +GL_GNULIB_LOG10 = @GL_GNULIB_LOG10@ +GL_GNULIB_LOG10F = @GL_GNULIB_LOG10F@ +GL_GNULIB_LOG10L = @GL_GNULIB_LOG10L@ +GL_GNULIB_LOG1P = @GL_GNULIB_LOG1P@ +GL_GNULIB_LOG1PF = @GL_GNULIB_LOG1PF@ +GL_GNULIB_LOG1PL = @GL_GNULIB_LOG1PL@ +GL_GNULIB_LOG2 = @GL_GNULIB_LOG2@ +GL_GNULIB_LOG2F = @GL_GNULIB_LOG2F@ +GL_GNULIB_LOG2L = @GL_GNULIB_LOG2L@ +GL_GNULIB_LOGB = @GL_GNULIB_LOGB@ +GL_GNULIB_LOGBF = @GL_GNULIB_LOGBF@ +GL_GNULIB_LOGBL = @GL_GNULIB_LOGBL@ +GL_GNULIB_LOGF = @GL_GNULIB_LOGF@ +GL_GNULIB_LOGL = @GL_GNULIB_LOGL@ +GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@ +GL_GNULIB_MALLOC_GNU = @GL_GNULIB_MALLOC_GNU@ +GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@ +GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@ +GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@ +GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@ +GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@ +GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@ +GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@ +GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@ +GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@ +GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@ +GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@ +GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@ +GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@ +GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@ +GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@ +GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@ +GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@ +GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@ +GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@ +GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@ +GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@ +GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@ +GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@ +GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@ +GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@ +GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@ +GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@ +GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@ +GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@ +GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@ +GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@ +GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@ +GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@ +GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@ +GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@ +GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@ +GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@ +GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@ +GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@ +GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@ +GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@ +GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@ +GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@ +GL_GNULIB_MDA_J0 = @GL_GNULIB_MDA_J0@ +GL_GNULIB_MDA_J1 = @GL_GNULIB_MDA_J1@ +GL_GNULIB_MDA_JN = @GL_GNULIB_MDA_JN@ +GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@ +GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@ +GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@ +GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@ +GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@ +GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@ +GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@ +GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@ +GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@ +GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@ +GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@ +GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@ +GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@ +GL_GNULIB_MDA_Y0 = @GL_GNULIB_MDA_Y0@ +GL_GNULIB_MDA_Y1 = @GL_GNULIB_MDA_Y1@ +GL_GNULIB_MDA_YN = @GL_GNULIB_MDA_YN@ +GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@ +GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@ +GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@ +GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@ +GL_GNULIB_MEMSET_EXPLICIT = @GL_GNULIB_MEMSET_EXPLICIT@ +GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@ +GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@ +GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@ +GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@ +GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@ +GL_GNULIB_MODF = @GL_GNULIB_MODF@ +GL_GNULIB_MODFF = @GL_GNULIB_MODFF@ +GL_GNULIB_MODFL = @GL_GNULIB_MODFL@ +GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@ +GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@ +GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@ +GL_GNULIB_PERROR = @GL_GNULIB_PERROR@ +GL_GNULIB_PIPE = @GL_GNULIB_PIPE@ +GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@ +GL_GNULIB_POPEN = @GL_GNULIB_POPEN@ +GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@ +GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@ +GL_GNULIB_POWF = @GL_GNULIB_POWF@ +GL_GNULIB_PREAD = @GL_GNULIB_PREAD@ +GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@ +GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@ +GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@ +GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@ +GL_GNULIB_PUTC = @GL_GNULIB_PUTC@ +GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@ +GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@ +GL_GNULIB_PUTS = @GL_GNULIB_PUTS@ +GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@ +GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@ +GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@ +GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@ +GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@ +GL_GNULIB_READ = @GL_GNULIB_READ@ +GL_GNULIB_READLINK = @GL_GNULIB_READLINK@ +GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@ +GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@ +GL_GNULIB_REALLOC_GNU = @GL_GNULIB_REALLOC_GNU@ +GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@ +GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@ +GL_GNULIB_REMAINDER = @GL_GNULIB_REMAINDER@ +GL_GNULIB_REMAINDERF = @GL_GNULIB_REMAINDERF@ +GL_GNULIB_REMAINDERL = @GL_GNULIB_REMAINDERL@ +GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@ +GL_GNULIB_RENAME = @GL_GNULIB_RENAME@ +GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@ +GL_GNULIB_RINT = @GL_GNULIB_RINT@ +GL_GNULIB_RINTF = @GL_GNULIB_RINTF@ +GL_GNULIB_RINTL = @GL_GNULIB_RINTL@ +GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@ +GL_GNULIB_ROUND = @GL_GNULIB_ROUND@ +GL_GNULIB_ROUNDF = @GL_GNULIB_ROUNDF@ +GL_GNULIB_ROUNDL = @GL_GNULIB_ROUNDL@ +GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@ +GL_GNULIB_SCANF = @GL_GNULIB_SCANF@ +GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@ +GL_GNULIB_SETENV = @GL_GNULIB_SETENV@ +GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@ +GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@ +GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@ +GL_GNULIB_SIGNBIT = @GL_GNULIB_SIGNBIT@ +GL_GNULIB_SINF = @GL_GNULIB_SINF@ +GL_GNULIB_SINHF = @GL_GNULIB_SINHF@ +GL_GNULIB_SINL = @GL_GNULIB_SINL@ +GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@ +GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@ +GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@ +GL_GNULIB_SQRTF = @GL_GNULIB_SQRTF@ +GL_GNULIB_SQRTL = @GL_GNULIB_SQRTL@ +GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@ +GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@ +GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@ +GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@ +GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@ +GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@ +GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@ +GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@ +GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@ +GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@ +GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@ +GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@ +GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@ +GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@ +GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@ +GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@ +GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@ +GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@ +GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@ +GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@ +GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@ +GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@ +GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@ +GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@ +GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@ +GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@ +GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@ +GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@ +GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@ +GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@ +GL_GNULIB_TANF = @GL_GNULIB_TANF@ +GL_GNULIB_TANHF = @GL_GNULIB_TANHF@ +GL_GNULIB_TANL = @GL_GNULIB_TANL@ +GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@ +GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@ +GL_GNULIB_TRUNC = @GL_GNULIB_TRUNC@ +GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@ +GL_GNULIB_TRUNCF = @GL_GNULIB_TRUNCF@ +GL_GNULIB_TRUNCL = @GL_GNULIB_TRUNCL@ +GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@ +GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@ +GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@ +GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@ +GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@ +GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@ +GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@ +GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@ +GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@ +GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@ +GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@ +GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@ +GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@ +GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@ +GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@ +GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@ +GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@ +GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@ +GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@ +GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@ +GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@ +GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@ +GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@ +GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@ +GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@ +GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@ +GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@ +GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@ +GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@ +GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@ +GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@ +GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@ +GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@ +GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@ +GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@ +GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@ +GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@ +GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@ +GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@ +GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@ +GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@ +GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@ +GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@ +GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@ +GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@ +GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@ +GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@ +GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@ +GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@ +GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@ +GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@ +GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@ +GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@ +GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@ +GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@ +GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@ +GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@ +GL_GNULIB_WRITE = @GL_GNULIB_WRITE@ +GL_GNULIB__EXIT = @GL_GNULIB__EXIT@ +GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@ GREP = @GREP@ GROFF_PATH_SEPARATOR = @GROFF_PATH_SEPARATOR@ HAVE_ACOSF = @HAVE_ACOSF@ HAVE_ACOSL = @HAVE_ACOSL@ +HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@ +HAVE_ALLOCA_H = @HAVE_ALLOCA_H@ HAVE_ASINF = @HAVE_ASINF@ HAVE_ASINL = @HAVE_ASINL@ HAVE_ATAN2F = @HAVE_ATAN2F@ HAVE_ATANF = @HAVE_ATANF@ HAVE_ATANL = @HAVE_ATANL@ +HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@ +HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CBRT = @HAVE_CBRT@ HAVE_CBRTF = @HAVE_CBRTF@ HAVE_CBRTL = @HAVE_CBRTL@ +HAVE_CHOWN = @HAVE_CHOWN@ HAVE_COPYSIGN = @HAVE_COPYSIGN@ HAVE_COPYSIGNL = @HAVE_COPYSIGNL@ +HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@ HAVE_COSF = @HAVE_COSF@ HAVE_COSHF = @HAVE_COSHF@ HAVE_COSL = @HAVE_COSL@ @@ -2911,19 +2995,37 @@ HAVE_DECL_CEILF = @HAVE_DECL_CEILF@ HAVE_DECL_CEILL = @HAVE_DECL_CEILL@ HAVE_DECL_COPYSIGNF = @HAVE_DECL_COPYSIGNF@ HAVE_DECL_COSL = @HAVE_DECL_COSL@ +HAVE_DECL_ECVT = @HAVE_DECL_ECVT@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@ HAVE_DECL_EXP2 = @HAVE_DECL_EXP2@ HAVE_DECL_EXP2F = @HAVE_DECL_EXP2F@ HAVE_DECL_EXP2L = @HAVE_DECL_EXP2L@ HAVE_DECL_EXPL = @HAVE_DECL_EXPL@ HAVE_DECL_EXPM1L = @HAVE_DECL_EXPM1L@ +HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ +HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@ +HAVE_DECL_FCVT = @HAVE_DECL_FCVT@ +HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FLOORF = @HAVE_DECL_FLOORF@ HAVE_DECL_FLOORL = @HAVE_DECL_FLOORL@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ +HAVE_DECL_GCVT = @HAVE_DECL_GCVT@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ +HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@ +HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ +HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ +HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ +HAVE_DECL_GETW = @HAVE_DECL_GETW@ +HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ +HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ +HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@ HAVE_DECL_LDEXPL = @HAVE_DECL_LDEXPL@ HAVE_DECL_LOG10L = @HAVE_DECL_LOG10L@ HAVE_DECL_LOG2 = @HAVE_DECL_LOG2@ @@ -2934,12 +3036,16 @@ HAVE_DECL_LOGL = @HAVE_DECL_LOGL@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ +HAVE_DECL_PUTW = @HAVE_DECL_PUTW@ HAVE_DECL_REMAINDER = @HAVE_DECL_REMAINDER@ HAVE_DECL_REMAINDERL = @HAVE_DECL_REMAINDERL@ HAVE_DECL_RINTF = @HAVE_DECL_RINTF@ HAVE_DECL_ROUND = @HAVE_DECL_ROUND@ HAVE_DECL_ROUNDF = @HAVE_DECL_ROUNDF@ HAVE_DECL_ROUNDL = @HAVE_DECL_ROUNDL@ +HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ +HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ +HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@ HAVE_DECL_SINL = @HAVE_DECL_SINL@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@ @@ -2948,15 +3054,24 @@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ HAVE_DECL_TANL = @HAVE_DECL_TANL@ HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@ +HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@ HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@ HAVE_DECL_TRUNCL = @HAVE_DECL_TRUNCL@ +HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ +HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ +HAVE_DUP3 = @HAVE_DUP3@ +HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ +HAVE_EXECVPE = @HAVE_EXECVPE@ HAVE_EXPF = @HAVE_EXPF@ HAVE_EXPL = @HAVE_EXPL@ HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ @@ -2964,6 +3079,10 @@ HAVE_EXPM1 = @HAVE_EXPM1@ HAVE_EXPM1F = @HAVE_EXPM1F@ HAVE_FABSF = @HAVE_FABSF@ HAVE_FABSL = @HAVE_FABSL@ +HAVE_FACCESSAT = @HAVE_FACCESSAT@ +HAVE_FCHDIR = @HAVE_FCHDIR@ +HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ +HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ @@ -2974,19 +3093,39 @@ HAVE_FMODF = @HAVE_FMODF@ HAVE_FMODL = @HAVE_FMODL@ HAVE_FREXPF = @HAVE_FREXPF@ HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ +HAVE_GETENTROPY = @HAVE_GETENTROPY@ +HAVE_GETGROUPS = @HAVE_GETGROUPS@ +HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ +HAVE_GETLOGIN = @HAVE_GETLOGIN@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +HAVE_GETPASS = @HAVE_GETPASS@ +HAVE_GETPROGNAME = @HAVE_GETPROGNAME@ +HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ +HAVE_GRANTPT = @HAVE_GRANTPT@ +HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_HYPOTF = @HAVE_HYPOTF@ HAVE_HYPOTL = @HAVE_HYPOTL@ HAVE_ILOGB = @HAVE_ILOGB@ HAVE_ILOGBF = @HAVE_ILOGBF@ HAVE_ILOGBL = @HAVE_ILOGBL@ +HAVE_IMAXABS = @HAVE_IMAXABS@ +HAVE_IMAXDIV = @HAVE_IMAXDIV@ +HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@ +HAVE_INITSTATE = @HAVE_INITSTATE@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISNAND = @HAVE_ISNAND@ HAVE_ISNANF = @HAVE_ISNANF@ HAVE_ISNANL = @HAVE_ISNANL@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ +HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LDEXPF = @HAVE_LDEXPF@ +HAVE_LINK = @HAVE_LINK@ +HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LOG10F = @HAVE_LOG10F@ HAVE_LOG10L = @HAVE_LOG10L@ HAVE_LOG1P = @HAVE_LOG1P@ @@ -2996,7 +3135,6 @@ HAVE_LOGBF = @HAVE_LOGBF@ HAVE_LOGBL = @HAVE_LOGBL@ HAVE_LOGF = @HAVE_LOGF@ HAVE_LOGL = @HAVE_LOGL@ -HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ @@ -3004,26 +3142,57 @@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ -HAVE_MEMCHR = @HAVE_MEMCHR@ +HAVE_MBTOWC = @HAVE_MBTOWC@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MEMSET_EXPLICIT = @HAVE_MEMSET_EXPLICIT@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ +HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ +HAVE_MKSTEMP = @HAVE_MKSTEMP@ +HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MODFF = @HAVE_MODFF@ HAVE_MODFL = @HAVE_MODFL@ +HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ +HAVE_PIPE = @HAVE_PIPE@ +HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ +HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@ +HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_POWF = @HAVE_POWF@ +HAVE_PREAD = @HAVE_PREAD@ +HAVE_PTSNAME = @HAVE_PTSNAME@ +HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ +HAVE_PWRITE = @HAVE_PWRITE@ +HAVE_QSORT_R = @HAVE_QSORT_R@ +HAVE_RANDOM = @HAVE_RANDOM@ +HAVE_RANDOM_H = @HAVE_RANDOM_H@ +HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_READLINKAT = @HAVE_READLINKAT@ +HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@ +HAVE_REALPATH = @HAVE_REALPATH@ HAVE_REMAINDER = @HAVE_REMAINDER@ HAVE_REMAINDERF = @HAVE_REMAINDERF@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RINT = @HAVE_RINT@ HAVE_RINTL = @HAVE_RINTL@ +HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = @HAVE_SAME_LONG_DOUBLE_AS_DOUBLE@ +HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ +HAVE_SETENV = @HAVE_SETENV@ +HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ +HAVE_SETSTATE = @HAVE_SETSTATE@ +HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@ +HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SINF = @HAVE_SINF@ HAVE_SINHF = @HAVE_SINHF@ HAVE_SINL = @HAVE_SINL@ +HAVE_SLEEP = @HAVE_SLEEP@ HAVE_SQRTF = @HAVE_SQRTF@ HAVE_SQRTL = @HAVE_SQRTL@ HAVE_STDINT_H = @HAVE_STDINT_H@ @@ -3031,17 +3200,32 @@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ +HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRSEP = @HAVE_STRSEP@ +HAVE_STRTOD = @HAVE_STRTOD@ +HAVE_STRTOL = @HAVE_STRTOL@ +HAVE_STRTOLD = @HAVE_STRTOLD@ +HAVE_STRTOLL = @HAVE_STRTOLL@ +HAVE_STRTOUL = @HAVE_STRTOUL@ +HAVE_STRTOULL = @HAVE_STRTOULL@ +HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ +HAVE_SYMLINK = @HAVE_SYMLINK@ +HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ +HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ +HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_TANF = @HAVE_TANF@ HAVE_TANHF = @HAVE_TANHF@ HAVE_TANL = @HAVE_TANL@ HAVE_TEST_EF_OPTION = @HAVE_TEST_EF_OPTION@ -HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNLINKAT = @HAVE_UNLINKAT@ +HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ +HAVE_USLEEP = @HAVE_USLEEP@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ @@ -3081,9 +3265,10 @@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ +HAVE_WMEMPCPY = @HAVE_WMEMPCPY@ HAVE_WMEMSET = @HAVE_WMEMSET@ -HOST_CPU = @HOST_CPU@ -HOST_CPU_C_ABI = @HOST_CPU_C_ABI@ +HAVE__BOOL = @HAVE__BOOL@ +HAVE__EXIT = @HAVE__EXIT@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ @@ -3092,6 +3277,8 @@ INSTALL_INFO = @INSTALL_INFO@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ LDFLAGS = @LDFLAGS@ LIBC = @LIBC@ LIBEXT = @LIBEXT@ @@ -3111,28 +3298,37 @@ LPQ = @LPQ@ LPR = @LPR@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ +NEXT_ASSERT_H = @NEXT_ASSERT_H@ +NEXT_AS_FIRST_DIRECTIVE_ASSERT_H = @NEXT_AS_FIRST_DIRECTIVE_ASSERT_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ +NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@ NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ +NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ +NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ NEXT_LIMITS_H = @NEXT_LIMITS_H@ NEXT_MATH_H = @NEXT_MATH_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ OBJEXT = @OBJEXT@ @@ -3146,9 +3342,6 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAGE = @PAGE@ PATH_SEPARATOR = @PATH_SEPARATOR@ -PDFFONTS = @PDFFONTS@ -PDFIMAGES = @PDFIMAGES@ -PDFINFO = @PDFINFO@ PERL = @PERL@ PERL_VERSION = @PERL_VERSION@ PKG_CONFIG = @PKG_CONFIG@ @@ -3156,32 +3349,58 @@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ +PRIPTR_PREFIX = @PRIPTR_PREFIX@ +PROG_TEX = @PROG_TEX@ PROG_TEXI2DVI = @PROG_TEXI2DVI@ PSPRINT = @PSPRINT@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ +REPLACE_ACCESS = @REPLACE_ACCESS@ REPLACE_ACOSF = @REPLACE_ACOSF@ +REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@ REPLACE_ASINF = @REPLACE_ASINF@ REPLACE_ATAN2F = @REPLACE_ATAN2F@ REPLACE_ATANF = @REPLACE_ATANF@ REPLACE_BTOWC = @REPLACE_BTOWC@ +REPLACE_CALLOC_FOR_CALLOC_GNU = @REPLACE_CALLOC_FOR_CALLOC_GNU@ +REPLACE_CALLOC_FOR_CALLOC_POSIX = @REPLACE_CALLOC_FOR_CALLOC_POSIX@ +REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CBRTF = @REPLACE_CBRTF@ REPLACE_CBRTL = @REPLACE_CBRTL@ REPLACE_CEIL = @REPLACE_CEIL@ REPLACE_CEILF = @REPLACE_CEILF@ REPLACE_CEILL = @REPLACE_CEILL@ +REPLACE_CHOWN = @REPLACE_CHOWN@ +REPLACE_CLOSE = @REPLACE_CLOSE@ +REPLACE_COPY_FILE_RANGE = @REPLACE_COPY_FILE_RANGE@ REPLACE_COSF = @REPLACE_COSF@ REPLACE_COSHF = @REPLACE_COSHF@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ +REPLACE_DUP = @REPLACE_DUP@ +REPLACE_DUP2 = @REPLACE_DUP2@ +REPLACE_DUP3 = @REPLACE_DUP3@ +REPLACE_EXECL = @REPLACE_EXECL@ +REPLACE_EXECLE = @REPLACE_EXECLE@ +REPLACE_EXECLP = @REPLACE_EXECLP@ +REPLACE_EXECV = @REPLACE_EXECV@ +REPLACE_EXECVE = @REPLACE_EXECVE@ +REPLACE_EXECVP = @REPLACE_EXECVP@ +REPLACE_EXECVPE = @REPLACE_EXECVPE@ REPLACE_EXP2 = @REPLACE_EXP2@ REPLACE_EXP2L = @REPLACE_EXP2L@ REPLACE_EXPF = @REPLACE_EXPF@ +REPLACE_EXPL = @REPLACE_EXPL@ REPLACE_EXPM1 = @REPLACE_EXPM1@ REPLACE_EXPM1F = @REPLACE_EXPM1F@ +REPLACE_EXPM1L = @REPLACE_EXPM1L@ REPLACE_FABSL = @REPLACE_FABSL@ +REPLACE_FACCESSAT = @REPLACE_FACCESSAT@ +REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ +REPLACE_FDATASYNC = @REPLACE_FDATASYNC@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ +REPLACE_FFSLL = @REPLACE_FFSLL@ REPLACE_FLOOR = @REPLACE_FLOOR@ REPLACE_FLOORF = @REPLACE_FLOORF@ REPLACE_FLOORL = @REPLACE_FLOORL@ @@ -3192,8 +3411,10 @@ REPLACE_FMOD = @REPLACE_FMOD@ REPLACE_FMODF = @REPLACE_FMODF@ REPLACE_FMODL = @REPLACE_FMODL@ REPLACE_FOPEN = @REPLACE_FOPEN@ +REPLACE_FOPEN_FOR_FOPEN_GNU = @REPLACE_FOPEN_FOR_FOPEN_GNU@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ +REPLACE_FREE = @REPLACE_FREE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FREXP = @REPLACE_FREXP@ REPLACE_FREXPF = @REPLACE_FREXPF@ @@ -3202,8 +3423,21 @@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ +REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ +REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ +REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ +REPLACE_GETENTROPY = @REPLACE_GETENTROPY@ +REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETLOADAVG = @REPLACE_GETLOADAVG@ +REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETPASS = @REPLACE_GETPASS@ +REPLACE_GETPASS_FOR_GETPASS_GNU = @REPLACE_GETPASS_FOR_GETPASS_GNU@ +REPLACE_GETPROGNAME = @REPLACE_GETPROGNAME@ +REPLACE_GETSUBOPT = @REPLACE_GETSUBOPT@ REPLACE_HUGE_VAL = @REPLACE_HUGE_VAL@ REPLACE_HYPOT = @REPLACE_HYPOT@ REPLACE_HYPOTF = @REPLACE_HYPOTF@ @@ -3211,13 +3445,22 @@ REPLACE_HYPOTL = @REPLACE_HYPOTL@ REPLACE_ILOGB = @REPLACE_ILOGB@ REPLACE_ILOGBF = @REPLACE_ILOGBF@ REPLACE_ILOGBL = @REPLACE_ILOGBL@ +REPLACE_IMAXABS = @REPLACE_IMAXABS@ +REPLACE_IMAXDIV = @REPLACE_IMAXDIV@ +REPLACE_INITSTATE = @REPLACE_INITSTATE@ +REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISFINITE = @REPLACE_ISFINITE@ REPLACE_ISINF = @REPLACE_ISINF@ REPLACE_ISNAN = @REPLACE_ISNAN@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ +REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@ +REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@ REPLACE_ITOLD = @REPLACE_ITOLD@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LDEXPL = @REPLACE_LDEXPL@ +REPLACE_LINK = @REPLACE_LINK@ +REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOG = @REPLACE_LOG@ REPLACE_LOG10 = @REPLACE_LOG10@ REPLACE_LOG10F = @REPLACE_LOG10F@ @@ -3233,14 +3476,22 @@ REPLACE_LOGBF = @REPLACE_LOGBF@ REPLACE_LOGBL = @REPLACE_LOGBL@ REPLACE_LOGF = @REPLACE_LOGF@ REPLACE_LOGL = @REPLACE_LOGL@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MALLOC_FOR_MALLOC_GNU = @REPLACE_MALLOC_FOR_MALLOC_GNU@ +REPLACE_MALLOC_FOR_MALLOC_POSIX = @REPLACE_MALLOC_FOR_MALLOC_POSIX@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ +REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MEMPCPY = @REPLACE_MEMPCPY@ +REPLACE_MKOSTEMP = @REPLACE_MKOSTEMP@ +REPLACE_MKOSTEMPS = @REPLACE_MKOSTEMPS@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MODF = @REPLACE_MODF@ REPLACE_MODFF = @REPLACE_MODFF@ REPLACE_MODFL = @REPLACE_MODFL@ @@ -3248,46 +3499,88 @@ REPLACE_NAN = @REPLACE_NAN@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_PERROR = @REPLACE_PERROR@ +REPLACE_PIPE2 = @REPLACE_PIPE2@ REPLACE_POPEN = @REPLACE_POPEN@ +REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@ +REPLACE_POSIX_OPENPT = @REPLACE_POSIX_OPENPT@ +REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PTSNAME = @REPLACE_PTSNAME@ +REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_PWRITE = @REPLACE_PWRITE@ +REPLACE_QSORT_R = @REPLACE_QSORT_R@ +REPLACE_RANDOM = @REPLACE_RANDOM@ +REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ +REPLACE_READ = @REPLACE_READ@ +REPLACE_READLINK = @REPLACE_READLINK@ +REPLACE_READLINKAT = @REPLACE_READLINKAT@ +REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@ +REPLACE_REALLOC_FOR_REALLOC_GNU = @REPLACE_REALLOC_FOR_REALLOC_GNU@ +REPLACE_REALLOC_FOR_REALLOC_POSIX = @REPLACE_REALLOC_FOR_REALLOC_POSIX@ +REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMAINDER = @REPLACE_REMAINDER@ REPLACE_REMAINDERF = @REPLACE_REMAINDERF@ REPLACE_REMAINDERL = @REPLACE_REMAINDERL@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ +REPLACE_RINTL = @REPLACE_RINTL@ +REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_ROUND = @REPLACE_ROUND@ REPLACE_ROUNDF = @REPLACE_ROUNDF@ REPLACE_ROUNDL = @REPLACE_ROUNDL@ +REPLACE_SETENV = @REPLACE_SETENV@ +REPLACE_SETHOSTNAME = @REPLACE_SETHOSTNAME@ +REPLACE_SETSTATE = @REPLACE_SETSTATE@ REPLACE_SIGNBIT = @REPLACE_SIGNBIT@ -REPLACE_SIGNBIT_USING_GCC = @REPLACE_SIGNBIT_USING_GCC@ +REPLACE_SIGNBIT_USING_BUILTINS = @REPLACE_SIGNBIT_USING_BUILTINS@ REPLACE_SINF = @REPLACE_SINF@ REPLACE_SINHF = @REPLACE_SINHF@ +REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_SQRTF = @REPLACE_SQRTF@ REPLACE_SQRTL = @REPLACE_SQRTL@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ +REPLACE_STPCPY = @REPLACE_STPCPY@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ +REPLACE_STRTOL = @REPLACE_STRTOL@ +REPLACE_STRTOLD = @REPLACE_STRTOLD@ +REPLACE_STRTOLL = @REPLACE_STRTOLL@ +REPLACE_STRTOUL = @REPLACE_STRTOUL@ +REPLACE_STRTOULL = @REPLACE_STRTOULL@ +REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@ +REPLACE_SYMLINK = @REPLACE_SYMLINK@ +REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TANF = @REPLACE_TANF@ REPLACE_TANHF = @REPLACE_TANHF@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TRUNC = @REPLACE_TRUNC@ +REPLACE_TRUNCATE = @REPLACE_TRUNCATE@ REPLACE_TRUNCF = @REPLACE_TRUNCF@ REPLACE_TRUNCL = @REPLACE_TRUNCL@ +REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ +REPLACE_UNLINK = @REPLACE_UNLINK@ +REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ +REPLACE_UNSETENV = @REPLACE_UNSETENV@ +REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ @@ -3298,9 +3591,14 @@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSFTIME = @REPLACE_WCSFTIME@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ +REPLACE_WCSTOK = @REPLACE_WCSTOK@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ +REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +REPLACE_WMEMPCPY = @REPLACE_WMEMPCPY@ +REPLACE_WRITE = @REPLACE_WRITE@ +REPLACE__EXIT = @REPLACE__EXIT@ # On some platforms we need to set LANG and LC_ALL to C for sed SED = \ @@ -3314,6 +3612,7 @@ SHORT_VERSION = @SHORT_VERSION@ SH_SCRIPT_SED_CMD = @SH_SCRIPT_SED_CMD@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ @@ -3332,7 +3631,12 @@ STRIP = @STRIP@ TTYDEVDIRS = @TTYDEVDIRS@ font/devutf8 UCHARDET_CFLAGS = @UCHARDET_CFLAGS@ UCHARDET_LIBS = @UCHARDET_LIBS@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ +UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@ +UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ +UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ VERSION = @VERSION@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ @@ -3361,7 +3665,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ -appresdir = @appresdir@ +appdefdir = @appdefdir@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -3372,7 +3676,6 @@ builddir = @builddir@ compatibility_wrappers = @compatibility_wrappers@ datadir = @datadir@ datarootdir = @datarootdir@ -doc_dist_target_ok = @doc_dist_target_ok@ # infodir # `infodir' says where to install info files. @@ -3384,16 +3687,16 @@ docdir = $(datarootdir)/doc/${PACKAGE}-$(SHORT_VERSION) dvidir = @dvidir@ exec_prefix = @exec_prefix@ g = @g@ +gl_LIBOBJDEPS = @gl_LIBOBJDEPS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ glilypond_dir = @glilypond_dir@ +gltests_LIBOBJDEPS = @gltests_LIBOBJDEPS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ gpinyin_dir = @gpinyin_dir@ groff_have_urw_fonts = @groff_have_urw_fonts@ -groffer_dir = @groffer_dir@ -grog_dir = @grog_dir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ @@ -3408,37 +3711,15 @@ libexecdir = @libexecdir@ libprogramdir = @libprogramdir@ localedir = @localedir@ localstatedir = @localstatedir@ -make_examples = @make_examples@ make_htmldoc = @make_htmldoc@ -make_htmlexamples = @make_htmlexamples@ -make_infodoc = @make_infodoc@ -make_install_examples = @make_install_examples@ -make_install_htmldoc = @make_install_htmldoc@ -make_install_htmlexamples = @make_install_htmlexamples@ -make_install_infodoc = @make_install_infodoc@ -make_install_otherdoc = @make_install_otherdoc@ -make_install_pdfdoc = @make_install_pdfdoc@ -make_install_pdfexamples = @make_install_pdfexamples@ -make_install_shipped_htmldoc = @make_install_shipped_htmldoc@ -make_otherdoc = @make_otherdoc@ -make_pdfdoc = @make_pdfdoc@ -make_pdfexamples = @make_pdfexamples@ -make_uninstall_examples = @make_uninstall_examples@ -make_uninstall_htmldoc = @make_uninstall_htmldoc@ -make_uninstall_htmlexamples = @make_uninstall_htmlexamples@ -make_uninstall_infodoc = @make_uninstall_infodoc@ -make_uninstall_otherdoc = @make_uninstall_otherdoc@ -make_uninstall_pdfdoc = @make_uninstall_pdfdoc@ -make_uninstall_pdfexamples = @make_uninstall_pdfexamples@ -make_uninstall_shipped_htmldoc = @make_uninstall_shipped_htmldoc@ make_winscripts = @make_winscripts@ -makeinfo_version_numeric = @makeinfo_version_numeric@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pnmcrop = @pnmcrop@ pnmcut = @pnmcut@ +pnmtools_quiet = @pnmtools_quiet@ pnmtopng = @pnmtopng@ pnmtops = @pnmtops@ pnmtops_nosetpage = @pnmtops_nosetpage@ @@ -3447,6 +3728,7 @@ program_transform_name = @program_transform_name@ psdir = @psdir@ psselect = @psselect@ referdir = @referdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -3458,6 +3740,8 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ urwfontsdir = @urwfontsdir@ +use_gropdf = @use_gropdf@ +use_pdfroff = @use_pdfroff@ # `RT_SEP' is the operating system's native PATH SEPARATOR CHAR, which # is to be used in runtime PATHs compiled into groff executables. @@ -3575,7 +3859,7 @@ oldfontdir = $(datasubdir)/oldfont # `localfontdir' says where local fonts will be installed (as dev*/*). localfontdir = $(dataprogramdir)/site-font -# `legacyfontdir' is for compatibility with non-GNU troff. +# `legacyfontdir' is for compatibility with AT&T/DWB troff. legacyfontdir = /usr/lib/font # `fontpath' says where to look for dev*/*. @@ -3590,13 +3874,11 @@ systemtmacdir = $(libprogramdir)/site-tmac # `localtmacdir' says where local files will be installed. localtmacdir = $(dataprogramdir)/site-tmac -# appresdir -# `appresdir' says where to install the application resource file for +# appdefdir +# `appdefdir' says where to install the application defaults file for # gxditview. -# groffer_dir # glilypond_dir -# grog_dir # gpinyin_dir # `tmacpath' says where to look for macro files. @@ -3675,7 +3957,7 @@ tmac_an_prefix = \ # Extension to be used for refer index files. Index files are not -# sharable between different architectures, so you might want to use +# shareable between different architectures, so you might want to use # different suffixes for different architectures. Choose an extension # that doesn't conflict with refer or any other indexing program. indexext = .i @@ -3707,47 +3989,18 @@ man5dir = $(manroot)/man$(man5ext) man7ext = 7 man7dir = $(manroot)/man$(man7ext) -# doc_dist_target_ok -# `dist' target is disallowed in some `configure' combinations. - -# The configure script checks whether the user wants the info documentation. -# For the repo version this mechanism also suppresses building via `makeinfo'. -# make_infodoc -# make_install_infodoc -# make_uninstall_infodoc - # The configure script checks whether all necessary utility programs for -# grohtml are available -- only then we can build the HTML documentation. +# grohtml are available -- only then can we build the HTML documentation. # make_htmldoc # make_install_htmldoc # make_uninstall_htmldoc -# make_htmlexamples -# make_install_htmlexamples -# make_uninstall_htmlexamples - # The configure script also checks whether all necessary utility programs -# for pdfroff are available -- only then we can build PDF documentation. +# for pdfroff are available -- only then can we build PDF documentation. # make_pdfdoc # make_install_pdfdoc # make_uninstall_pdfdoc -# make_pdfexamples -# make_install_pdfexamples -# make_uninstall_pdfexamples - -# `other' documentation, e.g., `meref.me' and `pic.ms', as well as their -# generated counterparts.. -# make_otherdoc -# make_install_otherdoc -# make_uninstall_otherdoc - -# `examples' -- a generic switch, but the generated examples are furtherly -# subdivided to catch HTML and PDF production availability. -# make_examples -# make_install_examples -# make_uninstall_examples - # Windows `.cmd' files # make_winscripts # make_install_winscripts @@ -3840,10 +4093,6 @@ man7dir = $(manroot)/man$(man7ext) # uintmax_t= define to `unsigned long' or `unsigned long # long' if does not exist # -# TRADITIONAL_CPP if your C++ compiler uses a traditional -# (Reiser) preprocessor -# ARRAY_DELETE_NEEDS_SIZE if your C++ doesn't understand `delete []' -# # PAGE=A4 if the printer's page size is A4 # GHOSTSCRIPT=gs the name (and directory if required) of the # ghostscript program @@ -3858,7 +4107,6 @@ man7dir = $(manroot)/man$(man7ext) # `CCC' is the compiler for C++ (.cpp) files. CCC = @CXX@ -ETAGS = etags ETAGSFLAGS = # Flag that tells etags to assume C++. ETAGSCCFLAG = -C @@ -3893,41 +4141,67 @@ AM_CPPFLAGS = \ GROFF_V = $(GROFF_V_@AM_V@) GROFF_V_ = $(GROFF_V_@AM_DEFAULT_V@) GROFF_V_0 = @echo " GROFF " $@; -bin_SCRIPTS = $(am__append_2) eqn2graph gdiffmk glilypond gperl \ - gpinyin grap2graph groffer $(ROFF2PROGS) mmroff pdfroff \ - pic2graph gropdf pdfmom grog afmtodit +bin_SCRIPTS = $(am__append_11) eqn2graph gdiffmk glilypond gperl \ + gpinyin grap2graph mmroff pdfroff pic2graph gropdf pdfmom \ + afmtodit grog dist_bin_SCRIPTS = +# stuff that should be in distribution archives but not in source repo +MAINTAINERCLEANFILES = doc/groff.info doc/groff.txt doc/groff.html \ + doc/groff.html.node src/preproc/eqn/eqn.hpp \ + src/preproc/eqn/eqn.cpp src/preproc/eqn/eqn.output \ + src/preproc/pic/pic.cpp src/preproc/pic/pic.hpp \ + src/preproc/pic/pic.output src/preproc/refer/label.cpp \ + src/preproc/refer/label.hpp src/preproc/refer/label.output + +# HTML documents to be produced by troff should depend on this stamp +# file to ensure that (post-)grohtml's device and font description files +# are available. + +# PDFs to be produced by troff should depend on this stamp file to +# ensure that gropdf's device and font description files are available. + +# PostScript documents to be produced by troff should depend on this +# stamp file to ensure that grops's device and font description files +# are available. + +# (UTF-8-encoded) text documents to be produced by troff should depend +# on this stamp file to ensure that grotty's device and font description +# files are available. MOSTLYCLEANFILES = lib/core lib/*.stackdump lib/alloca.h \ - lib/alloca.h-t lib/errno.h lib/errno.h-t lib/float.h \ - lib/float.h-t lib/limits.h lib/limits.h-t lib/math.h \ - lib/math.h-t lib/stddef.h lib/stddef.h-t lib/stdint.h \ - lib/stdint.h-t lib/stdio.h lib/stdio.h-t lib/string.h \ - lib/string.h-t lib/sys/types.h lib/sys/types.h-t \ - lib/unitypes.h lib/unitypes.h-t lib/uniwidth.h \ + lib/alloca.h-t lib/assert.h lib/assert.h-t lib/errno.h \ + lib/errno.h-t lib/float.h lib/float.h-t lib/inttypes.h \ + lib/inttypes.h-t lib/limits.h lib/limits.h-t lib/math.h \ + lib/math.h-t lib/stdbool.h lib/stdbool.h-t lib/stddef.h \ + lib/stddef.h-t lib/stdint.h lib/stdint.h-t lib/stdio.h \ + lib/stdio.h-t lib/stdlib.h lib/stdlib.h-t lib/string.h \ + lib/string.h-t lib/sys/types.h lib/sys/types.h-t lib/unistd.h \ + lib/unistd.h-t lib/unitypes.h lib/unitypes.h-t lib/uniwidth.h \ lib/uniwidth.h-t lib/wchar.h lib/wchar.h-t lib/wctype.h \ lib/wctype.h-t shdeps.sed $(CHEM_GENEXAMPLES) \ - $(nodist_chemexample122_DATA) contrib/chem/README $(ROFF2MAN) \ - $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES) \ - $(HDTBLSTRIPFILES) $(am__append_6) $(am__append_9) \ - $(MOMPROCESSEDEXAMPLEFILES) penguin.ps penguin.pdf \ - $(am__append_10) $(am__append_12) $(am__append_14) \ - $(am__append_15) doc/examples.stamp $(am__append_17) gnu.eps \ - $(DEVASCIIFONTSFILES) font/devascii/DESC \ - $(DEVCP1047FONTSFILES) font/devcp1047/DESC font/devdvi/DESC \ - $(DEVHTMLFONTSFILES) font/devhtml/DESC $(DEVLATIN1FONTSFILES) \ - font/devlatin1/DESC font/devlbp/DESC font/devlj4/DESC \ - font/devpdf/download font/devpdf/DESC font/devpdf/Foundry \ - font/devpdf/build_font_files font/devpdf/util/BuildFoundries \ - $(DEVPSFONTFILES_GENERATED) $(DEVUTF8FONTSFILES) \ - font/devutf8/DESC groff_opts.tmp $(GROFF_OPTS_OUTPUT) \ - $(TMACMDOCFILES) tmac/www.tmac $(TMACSTRIPFILES) \ - tmac/stamp-wrap tmac/*-wrap $(prefixexecbin_SCRIPTS) \ - $(bin_SCRIPTS) $(man1_MANS) $(man5_MANS) $(man7_MANS) \ - $(PREFIXMAN1) test-groff -MOSTLYCLEANADD = + $(nodist_chemexample122_DATA) contrib/chem/README \ + $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES) $(hdtbl_TESTS) \ + $(mom_TESTS) $(MOMPROCESSEDEXAMPLEFILES) penguin.ps \ + penguin.pdf $(am__append_14) msboxes.ms \ + $(nodist_sboxesotherdoc_DATA) $(nodist_sboxespdfdoc_DATA) \ + $(GENERATEDDOCFILES) $(PROCESSEDDOCFILES) \ + $(PROCESSEDEXAMPLEFILES) $(DEVASCIIFONTSFILES) \ + font/devascii/DESC $(DEVCP1047FONTSFILES) font/devcp1047/DESC \ + font/devdvi/DESC $(DEVHTMLFONTSFILES) font/devhtml/DESC \ + font/devhtml/stamp $(DEVLATIN1FONTSFILES) font/devlatin1/DESC \ + font/devlbp/DESC font/devlj4/DESC font/devpdf/download \ + font/devpdf/DESC font/devpdf/Foundry \ + font/devpdf/util/BuildFoundries \ + font/devpdf/util/BuildFoundries font/devpdf/DESC \ + font/devpdf/download font/devpdf/stamp $(font_devpdf_TESTS) \ + $(DEVPSFONTFILES_GENERATED) font/devps/stamp \ + $(DEVUTF8FONTSFILES) font/devutf8/DESC font/devutf8/stamp \ + tmac/groff_man.7.man tmac/groff_man_style.7.man tmac/www.tmac \ + tmac/*-stamp tmac/stamp-wrap tmac/*-wrap \ + $(prefixexecbin_SCRIPTS) $(bin_SCRIPTS) $(man1_MANS) \ + $(man5_MANS) $(man7_MANS) $(PREFIXMAN1) # No GNU Make output. noinst_LIBRARIES = lib/libgnu.a libbib.a libdriver.a libgroff.a \ - $(am__append_18) + $(am__append_17) # Case of out-of-source build: we must create the 'man' directory. @@ -3941,90 +4215,71 @@ noinst_LIBRARIES = lib/libgnu.a libbib.a libdriver.a libgroff.a \ # make all or make check before all other targets. However, if another # target is built from a clean build tree, (for example make groff) # the files in BUILT_SOURCES will not be built first. That is why -# additional dependencies where added in the .am files that lists -# objects that use defs (for exmaple in groff.am: +# additional dependencies were added in the .am files that list +# objects that use defs (for example in groff.am: # src/roff/groff/groff.$(OBJEXT): defs.h) - -# Force generation of test-groff even though we don't ship it. -BUILT_SOURCES = $(ALLOCA_H) $(ERRNO_H) $(FLOAT_H) $(LIMITS_H) \ - lib/math.h $(STDDEF_H) $(STDINT_H) lib/stdio.h lib/string.h \ - lib/sys/types.h $(LIBUNISTRING_UNITYPES_H) \ +BUILT_SOURCES = $(ALLOCA_H) $(ASSERT_H) $(ERRNO_H) $(FLOAT_H) \ + lib/inttypes.h $(LIMITS_H) lib/math.h $(STDBOOL_H) $(STDDEF_H) \ + $(STDINT_H) lib/stdio.h lib/stdlib.h lib/string.h \ + lib/sys/types.h lib/unistd.h $(LIBUNISTRING_UNITYPES_H) \ $(LIBUNISTRING_UNIWIDTH_H) lib/wchar.h lib/wctype.h man defs.h \ - test-groff $(top_srcdir)/.version + $(top_srcdir)/.version CLEANFILES = defs.h src/libs/libgroff/version.cpp charset.alias \ - ref-add.sed ref-del.sed $(am__append_21) \ - src/preproc/eqn/eqn.hpp src/preproc/eqn/eqn.cpp \ - src/preproc/eqn/eqn.output src/preproc/pic/pic.cpp \ - src/preproc/pic/pic.hpp src/preproc/pic/pic.output \ - src/preproc/refer/label.cpp src/preproc/refer/label.hpp \ - src/preproc/refer/label.output src/roff/troff/majorminor.cpp + ref-add.sed ref-del.sed $(am__append_20) \ + src/roff/troff/majorminor.cpp # gnulib asks to include this file -# Copyright (C) 2004-2018 Free Software Foundation, Inc. -# Original Makefile.sub written by Keith Marshall -# (keith.d.marshall@ntlworld.com). -# Adapted to Automake by Bertrand Garrigues (bertrand.garrigues@laposte.net). -# -# Last update: 13 Aug 2015 -# -# This file is part of groff. -# -# groff is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - # pdf doc, written in mom and therefore using contrib/mom/mom.am # definitions -# File used by contrib/hdtbl and contrib/pdfmark. It is distributed in -# doc.eps. We try in priority to use the file in 'doc'. +# Distribute the manual in source form as well. + +# Generate HTML, both split into several files, and as a single file. +# 'html' and its installation counterpart 'install-html' are standard +# Automake targets. + +# An image of a gnu in enscapsulated PostScript is generated during the +# build process if necessary. Our configure script assumes pnmdepth is +# available if xpmtoppm is (see macro "GROFF_PROG_XPMTOPPM"). # TODO: these .c files could be removed (use gnulib instead). +# required test artifacts + # Other files that should be present in the distribution tarball. -# Version files - see script 'build-aux/git-gen-version' -EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/errno.in.h \ - lib/float.c lib/float.in.h lib/itold.c lib/fprintf.c \ - lib/fpucw.h lib/frexp.c lib/frexp.c lib/frexpl.c lib/fseterr.c \ +# Version files - see script 'build-aux/git-version-gen' +EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/assert.in.h \ + lib/verify.h lib/attribute.h lib/errno.in.h lib/float.in.h \ + lib/fprintf.c lib/fpucw.h lib/frexp.c lib/frexp.c lib/frexpl.c \ lib/fseterr.h lib/stdio-impl.h \ $(top_srcdir)/build-aux/git-version-gen \ - $(top_srcdir)/build-aux/config.rpath lib/float+.h lib/isnan.c \ - lib/isnand-nolibm.h lib/isnand.c lib/float+.h lib/isnan.c \ - lib/isnanf-nolibm.h lib/isnanf.c lib/float+.h lib/isnan.c \ - lib/isnanl-nolibm.h lib/isnanl.c lib/limits.in.h \ - lib/localcharset.h lib/math.in.h lib/memchr.c \ - lib/memchr.valgrind $(top_srcdir)/build-aux/prefix-gnulib-mk \ - lib/printf-frexp.h lib/printf-frexp.c lib/printf-frexpl.h \ - lib/float+.h lib/signbitd.c lib/signbitf.c lib/signbitl.c \ + $(top_srcdir)/build-aux/config.rpath lib/inttypes.in.h \ + lib/float+.h lib/isnan.c lib/isnand-nolibm.h lib/isnand.c \ + lib/float+.h lib/isnan.c lib/isnanf-nolibm.h lib/isnanf.c \ + lib/float+.h lib/isnan.c lib/isnanl-nolibm.h lib/isnanl.c \ + lib/limits.in.h lib/localcharset.h lib/math.in.h \ + lib/memchr.valgrind lib/printf-frexp.h lib/printf-frexp.c \ + lib/printf-frexpl.h lib/float+.h lib/_Noreturn.h \ lib/arg-nonnull.h lib/c++defs.h lib/warn-on-use.h \ - lib/snprintf.c lib/stddef.in.h lib/stdint.in.h lib/stdio.in.h \ - lib/streq.h lib/string.in.h lib/sys_types.in.h \ + lib/snprintf.c lib/stdbool.in.h lib/stddef.in.h \ + lib/stdint.in.h lib/stdio.in.h lib/stdlib.in.h lib/streq.h \ + lib/string.in.h lib/sys_types.in.h lib/unistd.in.h \ lib/unitypes.in.h lib/localcharset.h lib/uniwidth.in.h \ - lib/uniwidth/cjk.h lib/asnprintf.c lib/float+.h \ + lib/unictype/bitmap.h lib/uniwidth/cjk.h lib/uniwidth/width0.h \ + lib/uniwidth/width2.h lib/asnprintf.c lib/float+.h \ lib/printf-args.c lib/printf-args.h lib/printf-parse.c \ lib/printf-parse.h lib/vasnprintf.c lib/vasnprintf.h \ - lib/verify.h lib/vsnprintf.c lib/wchar.in.h lib/wctype.in.h \ - lib/wcwidth.c $(am__append_3) arch/misc/shdeps.sh \ - contrib/chem/ChangeLog contrib/chem/chem.1.man \ - contrib/chem/chem.pic contrib/chem/chem.pl \ - contrib/chem/README.txt contrib/chem/examples/README.txt \ + lib/vsnprintf.c lib/wchar.in.h lib/wctype.in.h \ + $(am__append_12) $(arch_shdeps_sh) contrib/chem/ChangeLog \ + contrib/chem/chem.1.man contrib/chem/chem.pic \ + contrib/chem/chem.pl contrib/chem/README.txt \ + contrib/chem/examples/README.txt \ contrib/chem/examples/122/README.txt \ contrib/eqn2graph/eqn2graph.1.man \ contrib/eqn2graph/eqn2graph.sh contrib/gdiffmk/gdiffmk.1.man \ contrib/gdiffmk/ChangeLog contrib/gdiffmk/README \ - contrib/gdiffmk/gdiffmk.sh \ - contrib/gdiffmk/tests/gdiffmk_tests.sh \ - contrib/gdiffmk/tests/runtests.sh \ + contrib/gdiffmk/gdiffmk.sh contrib/gdiffmk/tests/runtests.sh \ contrib/gdiffmk/tests/baseline \ contrib/gdiffmk/tests/baseline.6 \ contrib/gdiffmk/tests/baseline.6a \ @@ -4043,33 +4298,31 @@ EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/errno.in.h \ contrib/gpinyin/gpinyin.1.man contrib/gpinyin/gpinyin.pl \ $(grap2graph_srcdir)/grap2graph.sh \ $(grap2graph_srcdir)/grap2graph.1.man \ - contrib/groff_filenames/ChangeLog \ - contrib/groff_filenames/groff_filenames.5.man $(GROFFER_PERL) \ - $(GROFFER_REST) contrib/groffer/ChangeLog \ - contrib/groffer/README contrib/groffer/README_PERL \ contrib/hdtbl/examples/fonts_n.in \ - contrib/hdtbl/examples/fonts_x.in \ - contrib/hdtbl/examples/test-hdtbl.sh.in $(am__append_4) \ + contrib/hdtbl/examples/fonts_x.in $(hdtbl_test_template) \ contrib/hdtbl/ChangeLog contrib/hdtbl/TODO \ - contrib/hdtbl/groff_hdtbl.7.man contrib/hdtbl/hdtbl.tmac-u \ - contrib/hdtbl/hdmisc.tmac-u contrib/mm/ChangeLog \ + contrib/hdtbl/groff_hdtbl.7.man contrib/mm/ChangeLog \ contrib/mm/examples contrib/mm/Makefile.sim contrib/mm/mm \ contrib/mm/NOTES contrib/mm/README contrib/mm/groff_mm.7.man \ contrib/mm/groff_mmse.7.man contrib/mm/mmroff.1.man \ - contrib/mm/mmroff.pl $(am__append_7) \ - contrib/mom/examples/test-mom.sh.in $(MOMHTMLDOCFILES) \ - $(MOMEXAMPLEFILES) contrib/mom/BUGS contrib/mom/ChangeLog \ - contrib/mom/NEWS contrib/mom/TODO contrib/mom/copyright \ - contrib/mom/groff_mom.7.man $(am__append_11) \ - contrib/pdfmark/cover.ms contrib/pdfmark/pdfmark.ms \ - contrib/pdfmark/ChangeLog contrib/pdfmark/README \ - contrib/pdfmark/PROBLEMS contrib/pdfmark/TODO \ - contrib/pdfmark/pdfroff.1.man contrib/pdfmark/pdfroff.sh \ - contrib/pic2graph/pic2graph.sh \ - contrib/pic2graph/pic2graph.1.man $(am__append_13) \ - doc/automake.mom $(am__append_16) doc/gnu.xpm doc/fixinfo.sh \ - doc/txi-en.tex doc/groff.texi doc/fdl.texi doc/gnu.xpm \ - $(DEVX100FONTS) $(DEVX10012FONTS) $(DEVX75FONTS) \ + contrib/mm/mmroff.pl $(mm_TESTS) \ + contrib/mm/tests/artifacts/60657.ref $(mom_test_template) \ + $(MOMHTMLDOCFILES) $(MOMEXAMPLEFILES) contrib/mom/BUGS \ + contrib/mom/ChangeLog contrib/mom/NEWS contrib/mom/TODO \ + contrib/mom/copyright contrib/mom/groff_mom.7.man \ + $(am__append_15) contrib/pdfmark/cover.ms \ + contrib/pdfmark/pdfmark.ms contrib/pdfmark/ChangeLog \ + contrib/pdfmark/README contrib/pdfmark/PROBLEMS \ + contrib/pdfmark/TODO contrib/pdfmark/pdfroff.1.man \ + contrib/pdfmark/pdfroff.sh contrib/pic2graph/pic2graph.sh \ + contrib/pic2graph/pic2graph.1.man $(rfc1345_TESTS) \ + contrib/rfc1345/groff_rfc1345.7.man contrib/rfc1345/COPYRIGHT \ + contrib/sboxes/ChangeLog contrib/sboxes/msboxes.ms.in \ + contrib/sboxes/notquine.sed $(DOCFILES_NOINST) \ + doc/automake.mom doc/txi-en.tex doc/groff.texi doc/fdl.texi \ + doc/groff.info doc/groff.txt doc/groff.html \ + doc/groff.html.node doc/groff.dvi doc/groff.pdf $(DOC_GNU_EPS) \ + doc/gnu.xpm $(DEVX100FONTS) $(DEVX10012FONTS) $(DEVX75FONTS) \ $(DEVX7512FONTS) font/devascii/R.proto \ font/devascii/DESC.proto font/devcp1047/R.proto \ font/devcp1047/DESC.proto $(DEVDVIFONTFILES) $(DEVDVIGENFILES) \ @@ -4078,38 +4331,38 @@ EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/errno.in.h \ font/devlatin1/R.proto font/devlatin1/DESC.proto \ $(DEVLBPFONTFILES) font/devlbp/DESC.in font/devlj4/DESC.in \ font/devpdf/DESC.in font/devpdf/Foundry.in \ - font/devpdf/util/BuildFoundries.pl font/devps/symbolmap \ - font/devps/DESC.in font/devps/prologue.ps \ - font/devps/psstrip.sed font/devps/symbol.afm \ - font/devps/symbolsl.ps font/devps/zapfdr.afm \ - font/devps/zapfdr.ps font/devps/generate/freeeuro.sfd \ + font/devpdf/util/BuildFoundries.pl $(font_devpdf_default_test) \ + $(font_devpdf_urw_test) font/devps/DESC.in \ + font/devps/prologue.ps font/devps/psstrip.sed \ + font/devps/freeeuro.ps font/devps/symbol.afm \ + font/devps/symbolsl.afm font/devps/symbolsl.ps \ + font/devps/zapfdr.afm font/devps/zapfdr.ps \ + font/devps/generate/freeeuro.sfd \ font/devps/generate/make-zapfdr \ font/devps/generate/symbolsl.awk \ font/devps/generate/sfdtopfa.pe font/devps/generate/zapfdr.sed \ font/devutf8/R.proto font/devutf8/DESC.proto \ font/devutf8/NOTES font/devutf8/R.in $(GENFONTSSH) \ $(GENDESCSH) man/groff_font.5.man man/groff_out.5.man \ - man/groff_tmac.5.man man/ditroff.7.man man/groff_char.7.man \ - man/groff_diff.7.man man/groff.7.man man/roff.7.man \ - src/libs/libgroff/mkstemp.cpp src/libs/libgroff/fmod.c \ - src/libs/libgroff/getcwd.c src/libs/libgroff/putenv.c \ - src/libs/libgroff/strcasecmp.c src/libs/libgroff/strerror.c \ - src/libs/libgroff/strncasecmp.c src/libs/libgroff/strtol.c \ - src/libs/libgroff/config.charset src/libs/libgroff/ref-add.sin \ - src/libs/libgroff/ref-del.sin src/libs/libgroff/make-uniuni \ - src/devices/grodvi/grodvi.1.man \ + man/groff_tmac.5.man man/groff_char.7.man man/groff_diff.7.man \ + man/groff.7.man man/roff.7.man src/libs/libgroff/mkstemp.cpp \ + src/libs/libgroff/fmod.c src/libs/libgroff/getcwd.c \ + src/libs/libgroff/putenv.c src/libs/libgroff/strcasecmp.c \ + src/libs/libgroff/strerror.c src/libs/libgroff/strncasecmp.c \ + src/libs/libgroff/strtol.c src/libs/libgroff/config.charset \ + src/libs/libgroff/ref-add.sin src/libs/libgroff/ref-del.sin \ + src/libs/libgroff/make-uniuni src/devices/grodvi/grodvi.1.man \ src/devices/grohtml/grohtml.1.man \ src/devices/grolbp/grolbp.1.man \ - src/devices/grolj4/grolj4.1.man \ - src/devices/grolj4/lj4_font.5.man src/devices/gropdf/TODO \ + src/devices/grolj4/grolj4.1.man src/devices/gropdf/TODO \ src/devices/gropdf/gropdf.pl src/devices/gropdf/pdfmom.pl \ src/devices/gropdf/gropdf.1.man \ src/devices/gropdf/pdfmom.1.man src/devices/grops/grops.1.man \ src/devices/grops/psfig.diff src/devices/grops/TODO \ src/devices/grotty/grotty.1.man src/devices/grotty/TODO \ - $(am__append_19) src/devices/xditview/ad2c \ + $(grotty_TESTS) $(am__append_18) src/devices/xditview/ad2c \ src/devices/xditview/ChangeLog src/devices/xditview/DESC.in \ - src/devices/xditview/FontMap \ + src/devices/xditview/FontMap-X11 \ src/devices/xditview/GXditview-color.ad \ src/devices/xditview/GXditview.ad src/devices/xditview/README \ src/devices/xditview/TODO src/devices/xditview/gray1.bm \ @@ -4119,36 +4372,44 @@ EXTRA_DIST = gnulib_m4/gnulib-cache.m4 lib/alloca.in.h lib/errno.in.h \ src/devices/xditview/gray8.bm src/devices/xditview/xdit.bm \ src/devices/xditview/xdit_mask.bm \ src/devices/xditview/gxditview.1.man src/preproc/eqn/TODO \ - src/preproc/eqn/neqn.sh src/preproc/eqn/eqn.1.man \ - src/preproc/eqn/neqn.1.man src/preproc/grn/README \ - src/preproc/grn/grn.1.man src/preproc/pic/pic.1.man \ - src/preproc/pic/TODO src/preproc/preconv/preconv.1.man \ - src/preproc/refer/TODO src/preproc/refer/refer.1.man \ + src/preproc/eqn/eqn.1.man src/preproc/eqn/neqn.1.man \ + src/preproc/eqn/neqn.sh $(eqn_TESTS) src/preproc/grn/README \ + src/preproc/grn/grn.1.man src/preproc/pic/TODO \ + src/preproc/pic/pic.1.man src/preproc/preconv/preconv.1.man \ + $(preconv_TESTS) src/preproc/refer/TODO \ + src/preproc/refer/refer.1.man $(refer_TESTS) \ + src/preproc/refer/tests/artifacts/62124.bib \ src/preproc/soelim/TODO src/preproc/soelim/soelim.1.man \ - src/preproc/tbl/tbl.1.man src/roff/groff/groff.1.man \ - src/roff/grog/grog.1.man src/roff/grog/grog.pl \ + src/preproc/tbl/tbl.1.man $(tbl_TESTS) \ + src/roff/groff/groff.1.man $(groff_TESTS) \ + src/roff/groff/tests/artifacts/HONEYPOT \ + src/roff/groff/tests/artifacts/devascii/README \ src/roff/nroff/nroff.1.man src/roff/nroff/nroff.sh \ - src/roff/troff/column.cpp src/roff/troff/troff.1.man \ - src/roff/troff/TODO src/utils/addftinfo/addftinfo.1.man \ + $(nroff_TESTS) src/roff/troff/column.cpp \ + src/roff/troff/troff.1.man src/roff/troff/TODO \ + src/utils/addftinfo/addftinfo.1.man \ src/utils/afmtodit/afmtodit.1.man \ src/utils/afmtodit/afmtodit.pl \ src/utils/afmtodit/afmtodit.tables \ src/utils/afmtodit/make-afmtodit-tables \ + src/utils/grog/grog.1.man src/utils/grog/grog.pl \ + src/utils/grog/tests/foo.man $(grog_TESTS) \ src/utils/hpftodit/hpftodit.1.man \ src/utils/indxbib/indxbib.1.man src/utils/indxbib/eign \ src/utils/lkbib/lkbib.1.man src/utils/lookbib/lookbib.1.man \ src/utils/pfbtops/pfbtops.1.man \ src/utils/tfmtodit/tfmtodit.1.man \ src/utils/xtotroff/xtotroff.1.man tmac/fixmacros.sed \ - tmac/groff_ms.7.man tmac/groff_man.7.man tmac/groff_me.7.man \ - tmac/groff_mdoc.7.man tmac/groff_trace.7.man \ - tmac/groff_www.7.man tmac/hyphenex.pl tmac/LOCALIZATION \ - tmac/man.ultrix tmac/psfig.tmac tmac/ptx.tmac tmac/strip.sed \ - tmac/TESTING-HINTS tmac/TODO tmac/www.tmac.in BUG-REPORT \ - ChangeLog.115 ChangeLog.116 ChangeLog.117 ChangeLog.118 \ - ChangeLog.119 ChangeLog.120 ChangeLog.121 FDL FOR-RELEASE \ - gendef.sh INSTALL.REPO INSTALL.extra LICENSES MANIFEST \ - mdate.pl MORE.STUFF PROBLEMS PROJECTS README.MinGW arch/djgpp \ + tmac/groff_ms.7.man tmac/groff_man.7.man.in \ + tmac/groff_me.7.man tmac/groff_mdoc.7.man \ + tmac/groff_trace.7.man tmac/groff_www.7.man tmac/hyphenex.pl \ + tmac/LOCALIZATION tmac/man.ultrix tmac/psfig.tmac \ + tmac/ptx.tmac tmac/TESTING-HINTS tmac/TODO tmac/www.tmac.in \ + $(tmac_TESTS) BUG-REPORT ChangeLog.115 ChangeLog.116 \ + ChangeLog.117 ChangeLog.118 ChangeLog.119 ChangeLog.120 \ + ChangeLog.121 ChangeLog.122 FDL FOR-RELEASE gendef.sh HACKING \ + INSTALL.REPO INSTALL.extra LICENSES MANIFEST mdate.pl \ + MORE.STUFF PROBLEMS PROJECTS README.MinGW arch/djgpp \ font/util/make-Rproto makevarescape.sed $(top_srcdir)/.version FONTFILES = PREFIXMAN1 = src/preproc/eqn/eqn.1 src/preproc/eqn/neqn.1 \ @@ -4160,28 +4421,24 @@ PREFIXMAN1 = src/preproc/eqn/eqn.1 src/preproc/eqn/neqn.1 \ man1_MANS = contrib/chem/chem.1 contrib/eqn2graph/eqn2graph.1 \ contrib/gdiffmk/gdiffmk.1 contrib/glilypond/glilypond.1 \ contrib/gperl/gperl.1 contrib/gpinyin/gpinyin.1 \ - contrib/grap2graph/grap2graph.1 contrib/groffer/groffer.1 \ - contrib/groffer/roff2dvi.1 contrib/groffer/roff2html.1 \ - contrib/groffer/roff2pdf.1 contrib/groffer/roff2ps.1 \ - contrib/groffer/roff2text.1 contrib/groffer/roff2x.1 \ - contrib/mm/mmroff.1 contrib/pdfmark/pdfroff.1 \ - contrib/pic2graph/pic2graph.1 src/devices/grodvi/grodvi.1 \ - src/devices/grohtml/grohtml.1 src/devices/grolbp/grolbp.1 \ - src/devices/grolj4/grolj4.1 src/devices/gropdf/gropdf.1 \ - src/devices/gropdf/pdfmom.1 src/devices/grops/grops.1 \ - src/devices/grotty/grotty.1 $(am__append_22) \ - src/preproc/preconv/preconv.1 src/roff/groff/groff.1 \ - src/roff/grog/grog.1 src/utils/addftinfo/addftinfo.1 \ - src/utils/afmtodit/afmtodit.1 src/utils/hpftodit/hpftodit.1 \ - src/utils/lkbib/lkbib.1 src/utils/pfbtops/pfbtops.1 \ - src/utils/tfmtodit/tfmtodit.1 $(am__append_24) \ - $(am__append_25) -man5_MANS = contrib/groff_filenames/groff_filenames.5 man/groff_font.5 \ - man/groff_out.5 man/groff_tmac.5 src/devices/grolj4/lj4_font.5 + contrib/grap2graph/grap2graph.1 contrib/mm/mmroff.1 \ + contrib/pdfmark/pdfroff.1 contrib/pic2graph/pic2graph.1 \ + src/devices/grodvi/grodvi.1 src/devices/grohtml/grohtml.1 \ + src/devices/grolbp/grolbp.1 src/devices/grolj4/grolj4.1 \ + src/devices/gropdf/gropdf.1 src/devices/gropdf/pdfmom.1 \ + src/devices/grops/grops.1 src/devices/grotty/grotty.1 \ + $(am__append_21) src/preproc/preconv/preconv.1 \ + src/roff/groff/groff.1 src/utils/addftinfo/addftinfo.1 \ + src/utils/afmtodit/afmtodit.1 src/utils/grog/grog.1 \ + src/utils/hpftodit/hpftodit.1 src/utils/lkbib/lkbib.1 \ + src/utils/pfbtops/pfbtops.1 src/utils/tfmtodit/tfmtodit.1 \ + $(am__append_23) $(am__append_24) +man5_MANS = man/groff_font.5 man/groff_out.5 man/groff_tmac.5 man7_MANS = contrib/hdtbl/groff_hdtbl.7 contrib/mm/groff_mm.7 \ - contrib/mm/groff_mmse.7 contrib/mom/groff_mom.7 man/ditroff.7 \ - man/groff_char.7 man/groff_diff.7 man/groff.7 man/roff.7 \ - tmac/groff_ms.7 tmac/groff_man.7 tmac/groff_me.7 \ + contrib/mm/groff_mmse.7 contrib/mom/groff_mom.7 \ + contrib/rfc1345/groff_rfc1345.7 man/groff_char.7 \ + man/groff_diff.7 man/groff.7 man/roff.7 tmac/groff_ms.7 \ + tmac/groff_man.7 tmac/groff_man_style.7 tmac/groff_me.7 \ tmac/groff_mdoc.7 tmac/groff_trace.7 tmac/groff_www.7 # for lex/yacc @@ -4189,14 +4446,17 @@ AM_YFLAGS = -d -v # Rule to generate ps and roff files -# Rule to generated .pdf files from .mom files -SUFFIXES = .roff .in .ps .mom .pdf .me .ms .ps .html .txt .texi .dvi \ - .pdf .xhtml .man +# rule to generate .pdf files from .mom files +SUFFIXES = .roff .in .ps .mom .pdf .me.in .me .man # tests launched by make check check_SCRIPTS = -TESTS = contrib/gdiffmk/tests/gdiffmk_tests.sh $(am__append_5) \ - $(am__append_8) +TESTS = contrib/gdiffmk/tests/runtests.sh $(hdtbl_TESTS) $(mm_TESTS) \ + $(mom_TESTS) $(rfc1345_TESTS) $(font_devpdf_TESTS) \ + $(grotty_TESTS) $(eqn_TESTS) $(preconv_TESTS) $(refer_TESTS) \ + $(tbl_TESTS) $(groff_TESTS) $(nroff_TESTS) $(grog_TESTS) \ + $(tmac_TESTS) +XFAIL_TESTS = $(groff_XFAIL_TESTS) $(tmac_XFAIL_TESTS) AM_TESTS_ENVIRONMENT = \ abs_top_srcdir=$(abs_top_srcdir) \ abs_top_builddir=$(abs_top_builddir) \ @@ -4211,7 +4471,7 @@ AM_TESTS_ENVIRONMENT = \ # This is done by the m4 macro GROFF_G that checks for the presence of # GNU Troff built-in \n[.g] macro. If a Unix Troff binary was # detected, the following programs and scripts names will have a 'g' -# prefix: chem, tbl, eqn, neqn, pic, soleimm grn, refer, lookbib, +# prefix: chem, tbl, eqn, neqn, pic, soelim, grn, refer, lookbib, # troff, nroff. Also, PROG_PREFIX will be set to 'g' in the generated # header defs.h so that these programs could be called correctly. # @@ -4221,9 +4481,9 @@ AM_TESTS_ENVIRONMENT = \ NAMEPREFIX = $(g) prefixexecbin_SCRIPTS = chem neqn nroff @USEPROGRAMPREFIX_FALSE@prefixexecbindir = $(bindir) -# We use datadir because the uninstall rule for the PROGRAMS attempt +# We use datadir because the uninstall rule for the PROGRAMS attempts # to cd into prefixexecbindir, and thus if prefixexecbindir is removed -# two consecutive uninstall would fail +# two consecutive uninstalls would fail @USEPROGRAMPREFIX_TRUE@prefixexecbindir = $(datadir) # Path to binaries and flags used by contribs and doc to generated doc. @@ -4231,12 +4491,11 @@ prefixexecbin_SCRIPTS = chem neqn nroff GROFFBIN = $(abs_top_builddir)/groff GROFF_BIN_PATH = $(abs_top_builddir) PDFMOMBIN = $(abs_top_builddir)/pdfmom -# The second directories are needed for the case "cd build; ../configure". +# Search for macro files and device/font description directories in +# source _and_ build trees; some of each are generated. FFLAG = -F$(abs_top_builddir)/font -F$(abs_top_srcdir)/font -TFLAG = -M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac - -# make builtin variable RM -@MAKE_DONT_HAVE_RM_TRUE@RM = rm -f +MFLAG = -M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac +@MAKE_DEFINES_RM_FALSE@RM = rm -f # 'VERSION' is generated by gnulib script git-version-gen, using the # command 'git describe': @@ -4263,23 +4522,46 @@ TFLAG = -M$(abs_top_builddir)/tmac -M$(abs_top_srcdir)/tmac MAJOR_VERSION = `echo $(VERSION) | cut -d . -f 1` MINOR_VERSION = `echo $(VERSION) | cut -d . -f 2` REVISION = `echo $(VERSION) | cut -d . -f 3` -lib_libgnu_a_SOURCES = lib/localcharset.c lib/math.c \ - lib/printf-frexp.c lib/printf-frexpl.c lib/size_max.h \ - $(am__append_1) lib/wctype-h.c lib/xsize.h lib/xsize.c +lib_libgnu_a_SOURCES = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) lib/localcharset.c lib/math.c $(am__append_5) \ + lib/printf-frexp.c lib/printf-frexpl.c $(am__append_6) \ + lib/size_max.h $(am__append_7) $(am__append_8) lib/unistd.c \ + $(am__append_9) lib/wctype-h.c $(am__append_10) lib/xsize.h \ + lib/xsize.c +lib_libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS) lib_libgnu_a_LIBADD = $(gl_LIBOBJS) lib_libgnu_a_DEPENDENCIES = $(gl_LIBOBJS) -EXTRA_lib_libgnu_a_SOURCES = lib/float.c lib/itold.c lib/fprintf.c \ - lib/frexp.c lib/frexp.c lib/frexpl.c lib/fseterr.c lib/isnan.c \ - lib/isnand.c lib/isnan.c lib/isnanf.c lib/isnan.c lib/isnanl.c \ - lib/memchr.c lib/printf-frexp.c lib/signbitd.c lib/signbitf.c \ - lib/signbitl.c lib/snprintf.c lib/asnprintf.c \ - lib/printf-args.c lib/printf-parse.c lib/vasnprintf.c \ - lib/vsnprintf.c lib/wcwidth.c +EXTRA_lib_libgnu_a_SOURCES = lib/fprintf.c lib/frexp.c lib/frexp.c \ + lib/frexpl.c lib/isnan.c lib/isnand.c lib/isnan.c lib/isnanf.c \ + lib/isnan.c lib/isnanl.c lib/printf-frexp.c lib/snprintf.c \ + lib/asnprintf.c lib/printf-args.c lib/printf-parse.c \ + lib/vasnprintf.c lib/vsnprintf.c # Use this preprocessor expression to decide whether #include_next works. # Do not rely on a 'configure'-time test for this, since the expression # might appear in an installed header, which is used by some other compiler. -HAVE_INCLUDE_NEXT = lib/(__GNUC__ lib/|| lib/60000000 lib/<= lib/__DECC_VER) +HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER) + +# In 'sed', replace the pattern space with a "DO NOT EDIT" comment. +SED_HEADER_NOEDIT = s,.*,/* DO NOT EDIT! GENERATED AUTOMATICALLY! */, + +# '$(SED_HEADER_STDOUT) -e "..."' runs 'sed' but first outputs "DO NOT EDIT". +SED_HEADER_STDOUT = sed -e 1h -e '1$(SED_HEADER_NOEDIT)' -e 1G + +# '$(SED_HEADER_TO_AT_t) FILE' copies FILE to $@-t, prepending a leading +# "DO_NOT_EDIT". Although this could be done more simply via: +# SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) > $@-t +# the -n and 'w' avoid a fork+exec, at least when GNU Make is used. +SED_HEADER_TO_AT_t = $(SED_HEADER_STDOUT) -n -e 'w $@-t' + +# Use $(gl_V_at) instead of $(AM_V_GEN) or $(AM_V_at) on a line that +# is its recipe's first line if and only if lines are absent. +gl_V_at = $(AM_V_at) + +# Because this Makefile snippet defines a variable used by other +# gnulib Makefile snippets, it must be present in all makefiles that +# need it. This is ensured by the applicability 'all' defined above. +_NORETURN_H = $(top_srcdir)/lib/_Noreturn.h # Because this Makefile snippet defines a variable used by other # gnulib Makefile snippets, it must be present in all makefiles that @@ -4296,9 +4578,7 @@ CXXDEFS_H = $(top_srcdir)/lib/c++defs.h # need it. This is ensured by the applicability 'all' defined above. WARN_ON_USE_H = $(top_srcdir)/lib/warn-on-use.h -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -4323,7 +4603,6 @@ WINSCRIPTS = \ arch/mingw/gperl.cmd \ arch/mingw/gpinyin.cmd \ arch/mingw/grap2graph.cmd \ - arch/mingw/groffer.cmd \ arch/mingw/grog.cmd \ arch/mingw/gropdf.cmd \ arch/mingw/mmroff.cmd \ @@ -4336,6 +4615,7 @@ WINSCRIPTS = \ arch/mingw/roff2text.cmd \ arch/mingw/roff2x.cmd +arch_shdeps_sh = arch/misc/shdeps.sh chem_srcdir = $(top_srcdir)/contrib/chem # Files installed in $(datasubdir)/pic @@ -4353,14 +4633,14 @@ CHEM_EXAMPLES = \ # Files installed in $(exampledir)/chem -@BUILD_EXAMPLES_TRUE@chemexampledir = $(exampledir)/chem -@BUILD_EXAMPLES_TRUE@nodist_chemexample_DATA = $(CHEM_GENEXAMPLES) -@BUILD_EXAMPLES_TRUE@dist_chemexample_DATA = $(CHEM_EXAMPLES) +chemexampledir = $(exampledir)/chem +nodist_chemexample_DATA = $(CHEM_GENEXAMPLES) +dist_chemexample_DATA = $(CHEM_EXAMPLES) # Files installed in $(exampledir)/chem/122. All the .chem files in 122 are # lazily installed by the local install target -@BUILD_EXAMPLES_TRUE@chemexample122dir = $(chemexampledir)/122 -@BUILD_EXAMPLES_TRUE@nodist_chemexample122_DATA = contrib/chem/examples/122/README +chemexample122dir = $(chemexampledir)/122 +nodist_chemexample122_DATA = contrib/chem/examples/122/README eqn2graph_srcdir = $(top_srcdir)/contrib/eqn2graph ######################################################################## @@ -4372,73 +4652,24 @@ glilypond_srcdir = $(top_srcdir)/contrib/glilypond # files going to lib directory '$(glilypond_dir)' # TODO glilypond_dir is subsitued by configure.ac, check if this could be removed glilyponddir = $(glilypond_dir) -dist_glilypond_DATA = \ - contrib/glilypond/subs.pl \ - contrib/glilypond/oop_fh.pl \ - contrib/glilypond/args.pl - gpinyin_srcdir = $(top_srcdir)/contrib/gpinyin gpinyindir = $(gpinyin_dir) -dist_gpinyin_DATA = contrib/gpinyin/subs.pl grap2graph_srcdir = $(top_srcdir)/contrib/grap2graph -groffer_srcdir = $(top_srcdir)/contrib/groffer -# generated programs -ROFF2PROGS = \ - roff2dvi \ - roff2html \ - roff2pdf \ - roff2ps \ - roff2text \ - roff2x - - -# Generated man templates -ROFF2MAN = \ - contrib/groffer/roff2dvi.1.man \ - contrib/groffer/roff2html.1.man \ - contrib/groffer/roff2pdf.1.man \ - contrib/groffer/roff2ps.1.man \ - contrib/groffer/roff2text.1.man \ - contrib/groffer/roff2x.1.man - -GROFFER_PERL = \ - contrib/groffer/main_subs.pl \ - contrib/groffer/man.pl \ - contrib/groffer/split_env.sh \ - contrib/groffer/subs.pl - -GROFFER_REST = \ - contrib/groffer/roff2.1.man \ - contrib/groffer/version.sh \ - contrib/groffer/groffer.1.man \ - contrib/groffer/groffer.pl \ - contrib/groffer/roff2.pl - - -# groffer_dir is set by a m4 macro -grofferdir = $(groffer_dir) -groffer_DATA = $(GROFFER_PERL) contrib/groffer/version.sh hdtbl_srcdir = $(top_srcdir)/contrib/hdtbl -hdtbl_builddir = $(top_builddir)/contrib/hdtbl # Groff command used to generate .ps files -HDTBL_TFLAG = -M$(hdtbl_srcdir) -M$(hdtbl_builddir) -HDTBL_PFLAG = -t -p -e -U HDTBLGROFF = \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ - $(GROFFBIN) $(FFLAG) $(TFLAG) $(HDTBL_TFLAG) $(HDTBL_PFLAG) + $(GROFFBIN) $(FFLAG) $(MFLAG) -M$(hdtbl_srcdir) -t -p -e -U - -# Files installed in $(tmacdir). -# These files are generated with 'strip.sed' from their unstripped source file -# equivalent (e.g. hdtbl.tmac is generated from hdtbl.tmac-u) -HDTBLSTRIPFILES = \ +HDTBLTMACFILES = \ contrib/hdtbl/hdtbl.tmac \ contrib/hdtbl/hdmisc.tmac hdtbltmacdir = $(tmacdir) -hdtbltmac_DATA = $(HDTBLSTRIPFILES) +dist_hdtbltmac_DATA = $(HDTBLTMACFILES) +hdtbl_test_template = contrib/hdtbl/examples/test-hdtbl.sh.in # Files installed in $(exampledir)/hdtbl. HDTBLEXAMPLEFILES are # located in the source tree, while HDTBLPROCESSEDEXAMPLEFILES are @@ -4475,13 +4706,13 @@ HDTBLPROCESSEDEXAMPLEFILES = \ contrib/hdtbl/examples/short_reference.ps hdtblexampledir = $(exampledir)/hdtbl -@BUILD_EXAMPLES_TRUE@dist_hdtblexample_DATA = $(HDTBLEXAMPLEFILES) -@BUILD_EXAMPLES_TRUE@nodist_hdtblexample_DATA = \ -@BUILD_EXAMPLES_TRUE@ $(HDTBLGENFILES) \ -@BUILD_EXAMPLES_TRUE@ $(HDTBLPROCESSEDEXAMPLEFILES) \ -@BUILD_EXAMPLES_TRUE@ gnu.eps +dist_hdtblexample_DATA = $(HDTBLEXAMPLEFILES) +nodist_hdtblexample_DATA = \ + $(HDTBLGENFILES) \ + $(HDTBLPROCESSEDEXAMPLEFILES) \ + $(DOC_GNU_EPS) -@BUILD_EXAMPLES_TRUE@hdtbl_TESTS = contrib/hdtbl/examples/test-hdtbl.sh +hdtbl_TESTS = contrib/hdtbl/examples/test-hdtbl.sh mm_srcdir = $(top_srcdir)/contrib/mm mm_builddir = $(top_builddir)/contrib/mm @@ -4504,22 +4735,28 @@ MMEXAMPLEFILES = \ mmexampledir = $(exampledir)/mm dist_mmexample_DATA = $(MMEXAMPLEFILES) - -# Local configuration files with default values. -MMLOCALE = \ - locale \ - se_locale +mm_TESTS = \ + contrib/mm/tests/LT_SP_AU_without_AT_works.sh \ + contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh \ + contrib/mm/tests/MT-1-reports-all-TM-numbers.sh \ + contrib/mm/tests/MT_5_includes_AT_in_SG.sh \ + contrib/mm/tests/P-indentation-works.sh \ + contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh \ + contrib/mm/tests/mse_has-sufficient-footnote-space.sh \ + contrib/mm/tests/place-equation-labels-correctly-in-displays.sh \ + contrib/mm/tests/remove-stale-bib-entry-data.sh \ + contrib/mm/tests/short-pages-do-not-overflow-stack.sh mom_srcdir = $(top_srcdir)/contrib/mom -# pdfmom command used to generated .pdf -MOM_TFLAG = -M$(mom_srcdir) -MOM_KFLAG = -k -p -e -t +# pdfmom command used to generate .pdf +# +# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet. MOMPDFMOM = \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ PDFMOM_BIN_PATH="$(top_builddir)" \ - $(PDFMOMBIN) $(FFLAG) $(TFLAG) $(MOM_TFLAG) $(MOM_KFLAG) + $(PDFMOMBIN) $(FFLAG) $(MFLAG) -M$(mom_srcdir) -K utf8 -p -e -t # Files installed in $(tmacdir). @@ -4532,33 +4769,33 @@ momtmacdir = $(tmacdir) dist_momtmac_DATA = $(MOMNORMALFILES) # Files installed in htmldocdir/mom -@INSTALL_SHIPPED_HTML_TRUE@MOMHTMLDOCFILES = \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/stylesheet.css \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/appendices.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/color.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/cover.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/definitions.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/docelement.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/docprocessing.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/goodies.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/graphical.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/headfootpage.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/images.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/inlines.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/intro.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/letters.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/macrolist.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/rectoverso.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/refer.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/reserved.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/tables-of-contents.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/toc.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/typesetting.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/using.html \ -@INSTALL_SHIPPED_HTML_TRUE@ contrib/mom/momdoc/version-2.html - -@INSTALL_SHIPPED_HTML_TRUE@momhtmldir = $(htmldocdir)/mom -@INSTALL_SHIPPED_HTML_TRUE@momhtml_DATA = $(MOMHTMLDOCFILES) +MOMHTMLDOCFILES = \ + contrib/mom/momdoc/stylesheet.css \ + contrib/mom/momdoc/appendices.html \ + contrib/mom/momdoc/color.html \ + contrib/mom/momdoc/cover.html \ + contrib/mom/momdoc/definitions.html \ + contrib/mom/momdoc/docelement.html \ + contrib/mom/momdoc/docprocessing.html \ + contrib/mom/momdoc/goodies.html \ + contrib/mom/momdoc/graphical.html \ + contrib/mom/momdoc/headfootpage.html \ + contrib/mom/momdoc/images.html \ + contrib/mom/momdoc/inlines.html \ + contrib/mom/momdoc/intro.html \ + contrib/mom/momdoc/letters.html \ + contrib/mom/momdoc/macrolist.html \ + contrib/mom/momdoc/rectoverso.html \ + contrib/mom/momdoc/refer.html \ + contrib/mom/momdoc/reserved.html \ + contrib/mom/momdoc/tables-of-contents.html \ + contrib/mom/momdoc/toc.html \ + contrib/mom/momdoc/typesetting.html \ + contrib/mom/momdoc/using.html \ + contrib/mom/momdoc/version-2.html + +momhtmldir = $(htmldocdir)/mom +momhtml_DATA = $(MOMHTMLDOCFILES) # Files installed in $(examplesdir)/mom. MOMEXAMPLEFILES are located # in the source tree, while MOMPROCESSEDEXAMPLEFILES are generated in @@ -4576,23 +4813,27 @@ MOMEXAMPLEFILES = \ contrib/mom/examples/penguin.ps \ contrib/mom/examples/penguin.pdf \ contrib/mom/examples/mom.vim \ - contrib/mom/examples/slide-demo.mom - -@BUILD_EXAMPLES_TRUE@momexampledir = $(exampledir)/mom -@BUILD_EXAMPLES_TRUE@dist_momexample_DATA = $(MOMEXAMPLEFILES) -@BUILD_PDFEXAMPLES_TRUE@MOMPROCESSEDEXAMPLEFILES = \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/letter.pdf \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/mom-pdf.pdf \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/mon_premier_doc.pdf \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/sample_docs.pdf \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/typesetting.pdf \ -@BUILD_PDFEXAMPLES_TRUE@ contrib/mom/examples/slide-demo.pdf - -@BUILD_PDFEXAMPLES_TRUE@momprocessedexampledir = $(exampledir)/mom -@BUILD_PDFEXAMPLES_TRUE@nodist_momprocessedexample_DATA = $(MOMPROCESSEDEXAMPLEFILES) + contrib/mom/examples/slide-demo.mom \ + contrib/mom/examples/copyright-default.mom \ + contrib/mom/examples/copyright-chapter.mom + +momexampledir = $(exampledir)/mom +dist_momexample_DATA = $(MOMEXAMPLEFILES) +@USE_GROPDF_TRUE@MOMPROCESSEDEXAMPLEFILES = \ +@USE_GROPDF_TRUE@ contrib/mom/examples/letter.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/mom-pdf.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/mon_premier_doc.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/sample_docs.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/slide-demo.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/copyright-default.pdf \ +@USE_GROPDF_TRUE@ contrib/mom/examples/copyright-chapter.pdf \ +@USE_GROPDF_TRUE@ $(am__append_13) +@USE_GROPDF_TRUE@momprocessedexampledir = $(exampledir)/mom +@USE_GROPDF_TRUE@nodist_momprocessedexample_DATA = $(MOMPROCESSEDEXAMPLEFILES) +mom_test_template = contrib/mom/examples/test-mom.sh.in # Small test suite on mom examples -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@mom_TESTS = contrib/mom/examples/tests-mom.sh +mom_TESTS = contrib/mom/examples/tests-mom.sh # For this list of files we add a symlink from $(exampledir)/mom to $(pdfdocdir) PDFDOCFILE = mom-pdf.pdf @@ -4602,6 +4843,7 @@ pdfmark_builddir = $(top_builddir)/contrib/pdfmark # Files installed in $(tmacdir) TMACFILES = \ contrib/pdfmark/pdfmark.tmac \ + contrib/pdfmark/sanitize.tmac \ contrib/pdfmark/spdf.tmac pdfmarktmacdir = $(tmacdir) @@ -4611,60 +4853,123 @@ dist_pdfmarktmac_DATA = $(TMACFILES) PDFDOCFILES = \ contrib/pdfmark/pdfmark.pdf -@BUILD_PDFDOC_TRUE@pdfmarkpdfdocdir = $(pdfdocdir) -@BUILD_PDFDOC_TRUE@nodist_pdfmarkpdfdoc_DATA = $(PDFDOCFILES) -PDFMARK_PFLAG = -dpaper=$(PAGE) -P-p$(PAGE) -PDFMARK_TFLAG = -M$(pdfmark_srcdir) +@USE_PDFROFF_TRUE@pdfmarkpdfdocdir = $(pdfdocdir) +@USE_PDFROFF_TRUE@nodist_pdfmarkpdfdoc_DATA = $(PDFDOCFILES) PDFROFF = \ GROFF_TMPDIR=. \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_DIR="$(GROFF_BIN_DIR)" \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ - ./pdfroff --keep-temporary-files \ - $(FFLAG) $(TFLAG) $(PDFMARK_TFLAG) $(PDFMARK_PFLAG) + ./pdfroff \ + $(FFLAG) $(MFLAG) -dpaper=$(PAGE) -P-p$(PAGE) -M$(pdfmark_srcdir) pic2graph_srcdir = $(top_srcdir)/contrib/pic2graph +rfc1345_srcdir = $(top_srcdir)/contrib/rfc1345 +rfc1345_builddir = $(top_builddir)/contrib/rfc1345 + +# files installed in $(tmacdir) +rfc1345tmacdir = $(tmacdir) +dist_rfc1345tmac_DATA = contrib/rfc1345/rfc1345.tmac +rfc1345_TESTS = \ + contrib/rfc1345/tests/rfc1345-smoke-test.sh + +sboxes_srcdir = $(top_srcdir)/contrib/sboxes +sboxes_builddir = $(top_builddir)/contrib/sboxes +sboxesnotquine = $(sboxes_srcdir)/notquine.sed +sboxestmacdir = $(tmacdir) +dist_sboxestmac_DATA = contrib/sboxes/sboxes.tmac +SBOXES_EXAMPLEFILES = $(sboxes_srcdir)/msboxes.ms.in +sboxesotherdocdir = $(docdir) +nodist_sboxesotherdoc_DATA = $(sboxes_builddir)/msboxes.ms +@USE_GROPDF_TRUE@sboxespdfdocdir = $(pdfdocdir) +@USE_GROPDF_TRUE@nodist_sboxespdfdoc_DATA = $(sboxes_builddir)/msboxes.pdf doc_srcdir = $(abs_top_srcdir)/doc doc_builddir = $(abs_top_builddir)/doc -DOC_SED = $(SED) -e "s;[@]VERSION[@];$(VERSION);" -DOC_GROFF_ONLY = \ + +# Some document sources are parameterized in configuration options like +# the groff version number and the command prefix. Use this in target +# rules to prepare formattable versions of them from .in files. +DOC_SED = $(SED) \ + -e "s;[@]VERSION[@];$(VERSION);" \ + -e "s;[@]g[@];$(g);g;" + + +# Use this in target rules to run the build tree's groff. +# +# It includes flags to locate its tmac and device/font description +# directories and to produce verbose diagnostics in the event of syntax +# or formatting problems. +DOC_GROFF = \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ - $(GROFFBIN) -I$(abs_top_builddir) -M $(doc_srcdir) \ - $(TFLAG) $(FFLAG) -Upet -ww + $(GROFFBIN) -M $(doc_srcdir) $(MFLAG) $(FFLAG) -ww -b -DOC_GROFF = $(DOC_SED) $< | $(DOC_GROFF_ONLY) + +# This image file is used by several documents in the groff source tree. +DOC_GNU_EPS = doc/gnu.eps # Other doc, installed in $(docdir) # Files located in the source tree -@BUILD_OTHERDOC_TRUE@DOCFILES = \ -@BUILD_OTHERDOC_TRUE@ doc/meref.me \ -@BUILD_OTHERDOC_TRUE@ doc/meintro.me \ -@BUILD_OTHERDOC_TRUE@ doc/meintro_fr.me \ -@BUILD_OTHERDOC_TRUE@ doc/pic.ms +DOCFILES_INST = \ + doc/me-revisions \ + doc/ms.ms \ + doc/pic.ms + +DOCFILES_NOINST = \ + doc/meintro.me.in \ + doc/meintro_fr.me.in \ + doc/meref.me.in + +# Files that undergo a transformation prior to groff processing +GENERATEDDOCFILES = \ + doc/meintro.me \ + doc/meintro_fr.me \ + doc/meref.me # Files generated in the build tree -@BUILD_OTHERDOC_TRUE@PROCESSEDDOCFILES = \ -@BUILD_OTHERDOC_TRUE@ doc/meref.ps \ -@BUILD_OTHERDOC_TRUE@ doc/meintro.ps \ -@BUILD_OTHERDOC_TRUE@ doc/meintro_fr.ps \ -@BUILD_OTHERDOC_TRUE@ doc/pic.ps - -@BUILD_OTHERDOC_TRUE@otherdocdir = $(docdir) -@BUILD_OTHERDOC_TRUE@dist_otherdoc_DATA = $(DOCFILES) -@BUILD_OTHERDOC_TRUE@nodist_otherdoc_DATA = $(PROCESSEDDOCFILES) -@BUILD_PDFDOC_TRUE@docpdfdocdir = $(pdfdocdir) -@BUILD_PDFDOC_TRUE@nodist_docpdfdoc_DATA = doc/automake.pdf +@USE_GROHTML_TRUE@PROCESSEDDOCFILES_HTML = \ +@USE_GROHTML_TRUE@ doc/pic.html + +@USE_GROPDF_TRUE@PROCESSEDDOCFILES_PDF = \ +@USE_GROPDF_TRUE@ doc/automake.pdf \ +@USE_GROPDF_TRUE@ doc/groff-man-pages.pdf + +PROCESSEDDOCFILES_PS = \ + doc/meref.ps \ + doc/meintro.ps \ + doc/meintro_fr.ps \ + doc/ms.ps \ + doc/pic.ps + +PROCESSEDDOCFILES_TXT = \ + doc/groff-man-pages.utf8.txt + +PROCESSEDDOCFILES = \ + $(PROCESSEDDOCFILES_HTML) \ + $(PROCESSEDDOCFILES_PS) \ + $(PROCESSEDDOCFILES_PDF) \ + $(PROCESSEDDOCFILES_TXT) + + +# Declare minimal dependencies for documents by output driver. +PROCESSEDFILES_DEPS_HTML = pre-grohtml groff troff post-grohtml \ + font/devhtml/stamp font/devps/stamp + +PROCESSEDFILES_DEPS_PS = groff troff grops font/devps/stamp +PROCESSEDFILES_DEPS_PDF = groff troff gropdf font/devpdf/stamp +PROCESSEDFILES_DEPS_TXT = groff troff grotty font/devutf8/stamp +otherdocdir = $(docdir) +dist_otherdoc_DATA = $(DOCFILES_INST) +nodist_otherdoc_DATA = $(PROCESSEDDOCFILES) $(GENERATEDDOCFILES) +@USE_GROPDF_TRUE@docpdfdocdir = $(pdfdocdir) +@USE_GROPDF_TRUE@nodist_docpdfdoc_DATA = doc/automake.pdf # GNU PIC html documentation, installed in $(htmldocdir) # Other pic*.html files are installed by the local rule -@BUILD_HTML_TRUE@HTMLDOCFILES = \ -@BUILD_HTML_TRUE@ doc/pic.html - -@BUILD_HTML_TRUE@htmlpicdir = $(htmldocdir) -@BUILD_HTML_TRUE@htmlpic_DATA = $(HTMLDOCFILES) -@BUILD_HTML_TRUE@HTMLDOCFILESALL = pic*.html -@BUILD_HTML_TRUE@HTMLDOCIMAGEFILES = pic* +@USE_GROHTML_TRUE@htmlpicdir = $(htmldocdir) +@USE_GROHTML_TRUE@htmlpic_DATA = $(PROCESSEDDOCFILES_HTML) +@USE_GROHTML_TRUE@HTMLDOCFILESALL = pic*.html +@USE_GROHTML_TRUE@HTMLDOCIMAGEFILES = pic* # Examples files, installed in $(exampledir) @@ -4675,33 +4980,129 @@ EXAMPLEFILES = \ doc/grnexmpl.g \ doc/grnexmpl.me +@USE_GROHTML_FALSE@PROCESSEDEXAMPLEFILES_HTML = # Generated in the build tree -@BUILD_EXAMPLES_TRUE@PROCESSEDEXAMPLEFILES = \ -@BUILD_EXAMPLES_TRUE@ doc/webpage.ps \ -@BUILD_EXAMPLES_TRUE@ doc/grnexmpl.ps - -@BUILD_EXAMPLES_TRUE@docexamplesdir = $(exampledir) -@BUILD_EXAMPLES_TRUE@dist_docexamples_DATA = $(EXAMPLEFILES) -@BUILD_EXAMPLES_TRUE@nodist_docexamples_DATA = $(PROCESSEDEXAMPLEFILES) - -# webpage.html is generated, webpage*.html files are installed by the local rule. -@BUILD_HTMLEXAMPLES_TRUE@HTMLEXAMPLEFILES = doc/webpage.html -@BUILD_HTMLEXAMPLES_TRUE@HTMLEXAMPLEFILESALL = webpage*.html -@BUILD_HTMLEXAMPLES_TRUE@HTMLEXAMPLEIMAGEFILES = webpage* -@BUILD_HTMLEXAMPLES_TRUE@htmlexamplesdir = $(exampledir) -@BUILD_HTMLEXAMPLES_TRUE@nodist_htmlexamples_DATA = $(HTMLEXAMPLEFILES) +@USE_GROHTML_TRUE@PROCESSEDEXAMPLEFILES_HTML = doc/webpage.html +PROCESSEDEXAMPLEFILES_PS = \ + doc/webpage.ps \ + doc/grnexmpl.ps + +PROCESSEDEXAMPLEFILES = \ + $(PROCESSEDEXAMPLEFILES_HTML) \ + $(PROCESSEDEXAMPLEFILES_PS) + +docexamplesdir = $(exampledir) +dist_docexamples_DATA = $(EXAMPLEFILES) +nodist_docexamples_DATA = $(PROCESSEDEXAMPLEFILES) + +# webpage.html is generated; webpage*.html files are installed by the +# local rule. +@USE_GROHTML_TRUE@HTMLEXAMPLEFILESALL = webpage*.html +@USE_GROHTML_TRUE@HTMLEXAMPLEIMAGEFILES = webpage* +@USE_GROHTML_TRUE@htmlexamplesdir = $(exampledir) + +# Locate image subdirectory for HTML documents relative to an +# installation directory such as `htmldocdir` or `exampledir`. Do _not_ +# use for locating files within the source or build trees. imagedir = img -htmldocimagedir = $(htmldocdir)/img -exampleimagedir = $(exampledir)/img -@BUILD_INFODOC_TRUE@groffinfodir = $(infodir) -@BUILD_INFODOC_TRUE@groffpdfdir = $(infodir) - -# GNU Make has a built-in variable TEXI2DVI but it is not the case of -# all 'make' implementation. As it default to 'texi2dvi' we simply -# redefine it here. -TEXI2DVI = texi2dvi -texi2dvi_missing = no + +# Introduce variables to house the groff man pages. We break the list +# of page sources into multiple chunks because we have to load Swedish +# localization before formatting groff_mmse.7 and then reload English +# localization afterward. This also serves as a test of groff locale +# switching; being lazy and shunting groff_mmse.7 off to the end of the +# document would not achieve this goal (and not loading Swedish +# localization at all to format it would be gauche). +GROFF_MAN_PAGES1 = \ + src/utils/addftinfo/addftinfo.1 \ + src/utils/afmtodit/afmtodit.1 \ + contrib/chem/chem.1 \ + src/preproc/eqn/eqn.1 \ + contrib/eqn2graph/eqn2graph.1 \ + contrib/gdiffmk/gdiffmk.1 \ + contrib/glilypond/glilypond.1 \ + contrib/gperl/gperl.1 \ + contrib/gpinyin/gpinyin.1 \ + contrib/grap2graph/grap2graph.1 \ + src/preproc/grn/grn.1 \ + src/devices/grodvi/grodvi.1 \ + src/roff/groff/groff.1 \ + src/utils/grog/grog.1 \ + src/devices/grohtml/grohtml.1 \ + src/devices/grolbp/grolbp.1 \ + src/devices/grolj4/grolj4.1 \ + src/devices/gropdf/gropdf.1 \ + src/devices/grops/grops.1 \ + src/devices/grotty/grotty.1 \ + $(GXDITVIEW_MAN1) \ + src/utils/hpftodit/hpftodit.1 \ + src/utils/indxbib/indxbib.1 \ + src/utils/lkbib/lkbib.1 \ + src/utils/lookbib/lookbib.1 \ + contrib/mm/mmroff.1 \ + src/preproc/eqn/neqn.1 \ + src/roff/nroff/nroff.1 \ + src/devices/gropdf/pdfmom.1 \ + contrib/pdfmark/pdfroff.1 \ + src/utils/pfbtops/pfbtops.1 \ + src/preproc/pic/pic.1 \ + contrib/pic2graph/pic2graph.1 \ + src/preproc/preconv/preconv.1 \ + src/preproc/refer/refer.1 \ + src/preproc/soelim/soelim.1 \ + src/preproc/tbl/tbl.1 \ + src/utils/tfmtodit/tfmtodit.1 \ + src/roff/troff/troff.1 \ + $(XTOTROFF_MAN1) \ + man/groff_font.5 \ + man/groff_out.5 \ + man/groff_tmac.5 \ + man/groff.7 \ + man/groff_char.7 \ + man/groff_diff.7 \ + contrib/hdtbl/groff_hdtbl.7 \ + tmac/groff_man.7 \ + tmac/groff_man_style.7 \ + tmac/groff_mdoc.7 \ + tmac/groff_me.7 \ + contrib/mm/groff_mm.7 + +GROFF_MAN_PAGES2 = \ + contrib/mm/groff_mmse.7 + +GROFF_MAN_PAGES3 = \ + contrib/mom/groff_mom.7 \ + tmac/groff_ms.7 \ + contrib/rfc1345/groff_rfc1345.7 \ + tmac/groff_trace.7 \ + tmac/groff_www.7 \ + man/roff.7 + +GROFF_MAN_PAGES_ALL = $(GROFF_MAN_PAGES1) $(GROFF_MAN_PAGES2) \ + $(GROFF_MAN_PAGES3) + + +# groff Texinfo manual +# +# We produce all possible formats by by default and ship them in the +# distribution archive ('make dist') so that people don't need to have +# 'makeinfo' or TeX available. +# +# The GNU info, plain text, and HTML formats require only 'makeinfo'. +# +# DVI and PDF require a working TeX installation. We can't use +# Automake's facilities for PDF production because its 'dist' target +# attempts to generate 'groff.pdf' by invoking 'texi2dvi' without the +# '-E' option (use 'makeinfo' to expand macros), which is needed to +# build this file. 'texi2dvi' honors the 'MAKEINFO' environment +# variable. +# +# Were the foregoing not true, we would simply say this: +#info_TEXINFOS = doc/groff.texi +#doc_groff_TEXINFOS = doc/fdl.texi +@USE_TEX_TRUE@GROFF_DVI = doc/groff.dvi +@USE_TEX_TRUE@GROFF_PDF = doc/groff.pdf DEVX100FONTS = \ font/devX100/DESC \ font/devX100/TR \ @@ -4722,8 +5123,9 @@ DEVX100FONTS = \ font/devX100/NBI \ font/devX100/S -@WITHOUT_X11_FALSE@devX100fontdir = $(fontdir)/devX100 -@WITHOUT_X11_FALSE@devX100font_DATA = $(DEVX100FONTS) +@WITHOUT_X11_FALSE@devX100_fontdir = $(fontdir)/devX100 +@WITHOUT_X11_FALSE@devX100_font_DATA = $(DEVX100FONTS) +devX100_fontsrcdir = $(top_srcdir)/font/devX100 DEVX10012FONTS = \ font/devX100-12/DESC \ font/devX100-12/TR \ @@ -4744,8 +5146,9 @@ DEVX10012FONTS = \ font/devX100-12/NBI \ font/devX100-12/S -@WITHOUT_X11_FALSE@devX10012fontdir = $(fontdir)/devX100-12 -@WITHOUT_X11_FALSE@devX10012font_DATA = $(DEVX10012FONTS) +@WITHOUT_X11_FALSE@devX100_12_fontdir = $(fontdir)/devX100-12 +@WITHOUT_X11_FALSE@devX100_12_font_DATA = $(DEVX10012FONTS) +devX100_12_fontsrcdir = $(top_srcdir)/font/devX100-12 DEVX75FONTS = \ font/devX75/DESC \ font/devX75/TR \ @@ -4766,8 +5169,9 @@ DEVX75FONTS = \ font/devX75/NBI \ font/devX75/S -@WITHOUT_X11_FALSE@devX75fontdir = $(fontdir)/devX75 -@WITHOUT_X11_FALSE@devX75font_DATA = $(DEVX75FONTS) +@WITHOUT_X11_FALSE@devX75_fontdir = $(fontdir)/devX75 +@WITHOUT_X11_FALSE@devX75_font_DATA = $(DEVX75FONTS) +devX75_fontsrcdir = $(top_srcdir)/font/devX75 DEVX7512FONTS = \ font/devX75-12/DESC \ font/devX75-12/TR \ @@ -4788,8 +5192,9 @@ DEVX7512FONTS = \ font/devX75-12/NBI \ font/devX75-12/S -@WITHOUT_X11_FALSE@devX7512fontdir = $(fontdir)/devX75-12 -@WITHOUT_X11_FALSE@devX7512font_DATA = $(DEVX7512FONTS) +@WITHOUT_X11_FALSE@devX75_12_fontdir = $(fontdir)/devX75-12 +@WITHOUT_X11_FALSE@devX75_12_font_DATA = $(DEVX7512FONTS) +devX75_12_fontsrcdir = $(top_srcdir)/font/devX75-12 devascii_srcdir = $(top_srcdir)/font/devascii DEVASCIIFONTS = R I B BI DEVASCIIFONTSFILES = \ @@ -4999,13 +5404,21 @@ devpdffont_DATA = \ devpdffontencdir = $(devpdffontdir)/enc devpdffontenc_DATA = font/devpdf/enc/text.enc devpdffontmapdir = $(devpdffontdir)/map -DEVPDFFONTMAP_1 = \ +devpdffontmapdata = \ font/devpdf/map/dingbats.map \ + font/devpdf/map/symbol.map \ font/devpdf/map/symbolchars \ - font/devpdf/map/textmap + font/devpdf/map/text.map + +devpdffontmap_DATA = $(devpdffontmapdata) +font_devpdf_default_test = \ + $(devpdf_srcdir)/tests/check-default-foundry.sh.in + +font_devpdf_urw_test = $(devpdf_srcdir)/tests/check-urw-foundry.sh.in +font_devpdf_TESTS = \ + font/devpdf/tests/check-default-foundry.sh \ + font/devpdf/tests/check-urw-foundry.sh -DEVPDFFONTMAP_2 = font/devpdf/map/symbolmap -devpdffontmap_DATA = $(DEVPDFFONTMAP_1) $(DEVPDFFONTMAP_2) devps_srcdir = $(top_srcdir)/font/devps devps_builddir = $(top_builddir)/font/devps DEVPSFONTFILES = \ @@ -5047,19 +5460,21 @@ DEVPSFONTFILES = \ font/devps/TI \ font/devps/TR \ font/devps/EURO \ - font/devps/freeeuro.pfa \ font/devps/freeeuro.afm \ + font/devps/symbolsl.afm \ font/devps/text.enc \ + font/devps/zapfdr.afm \ font/devps/download DEVPSFONTFILES_GENERATED = \ font/devps/DESC \ font/devps/prologue \ + font/devps/freeeuro.pfa \ font/devps/zapfdr.pfa \ font/devps/symbolsl.pfa devpsfontdir = $(fontdir)/devps -dist_devpsfont_DATA = $(DEVPSFONTFILES) +dist_devpsfont_DATA = $(DEVPSFONTFILES) nodist_devpsfont_DATA = $(DEVPSFONTFILES_GENERATED) # these files will be installed in oldfontdir @@ -5102,11 +5517,11 @@ dist_olddevpsfont_DATA = $(OLDDEVPSFONTFILES) DEVPSGENFILES = \ font/devps/generate/Makefile \ font/devps/generate/dingbats.map \ - font/devps/generate/dingbats.rmap \ - font/devps/generate/lgreekmap \ + font/devps/generate/dingbats-reversed.map \ + font/devps/generate/slanted-symbol.map \ + font/devps/generate/symbol.map \ font/devps/generate/symbolchars \ - font/devps/generate/symbolsl.afm \ - font/devps/generate/textmap + font/devps/generate/text.map DEVPSGENSCRIPTS = \ font/devps/generate/afmname \ @@ -5149,57 +5564,32 @@ libgroff_a_CPPFLAGS = \ # Build from OBJS -libgroff_a_SOURCES = \ - src/libs/libgroff/assert.cpp \ - src/libs/libgroff/change_lf.cpp \ - src/libs/libgroff/cmap.cpp \ - src/libs/libgroff/color.cpp \ - src/libs/libgroff/cset.cpp\ - src/libs/libgroff/curtime.cpp \ - src/libs/libgroff/device.cpp \ - src/libs/libgroff/errarg.cpp \ - src/libs/libgroff/error.cpp \ - src/libs/libgroff/fatal.cpp \ - src/libs/libgroff/filename.cpp \ - src/libs/libgroff/font.cpp \ - src/libs/libgroff/fontfile.cpp \ - src/libs/libgroff/geometry.cpp \ - src/libs/libgroff/getopt.c \ - src/libs/libgroff/getopt1.c \ - src/libs/libgroff/glyphuni.cpp \ - src/libs/libgroff/htmlhint.cpp \ - src/libs/libgroff/hypot.cpp \ - src/libs/libgroff/iftoa.c \ - src/libs/libgroff/invalid.cpp \ - src/libs/libgroff/itoa.c \ - src/libs/libgroff/lf.cpp \ - src/libs/libgroff/lineno.cpp \ - src/libs/libgroff/localcharset.c \ - src/libs/libgroff/macropath.cpp \ - src/libs/libgroff/matherr.c \ - src/libs/libgroff/maxfilename.cpp \ - src/libs/libgroff/maxpathname.cpp \ - src/libs/libgroff/mksdir.cpp \ - src/libs/libgroff/nametoindex.cpp \ - src/libs/libgroff/new.cpp \ - src/libs/libgroff/paper.cpp \ - src/libs/libgroff/prime.cpp \ - src/libs/libgroff/progname.c \ - src/libs/libgroff/ptable.cpp \ - src/libs/libgroff/quotearg.c \ - src/libs/libgroff/relocate.cpp \ - src/libs/libgroff/searchpath.cpp \ - src/libs/libgroff/spawnvp.c \ - src/libs/libgroff/string.cpp \ - src/libs/libgroff/strsave.cpp \ - src/libs/libgroff/symbol.cpp \ - src/libs/libgroff/tmpfile.cpp \ - src/libs/libgroff/tmpname.cpp \ - src/libs/libgroff/unicode.cpp \ - src/libs/libgroff/uniglyph.cpp \ - src/libs/libgroff/uniuni.cpp \ - src/libs/libgroff/relocatable.h - +libgroff_a_SOURCES = src/libs/libgroff/assert.cpp \ + src/libs/libgroff/change_lf.cpp src/libs/libgroff/cmap.cpp \ + src/libs/libgroff/color.cpp src/libs/libgroff/cset.cpp \ + src/libs/libgroff/curtime.cpp src/libs/libgroff/device.cpp \ + src/libs/libgroff/errarg.cpp src/libs/libgroff/error.cpp \ + src/libs/libgroff/fatal.cpp src/libs/libgroff/filename.cpp \ + src/libs/libgroff/font.cpp src/libs/libgroff/fontfile.cpp \ + src/libs/libgroff/geometry.cpp src/libs/libgroff/getopt.c \ + src/libs/libgroff/getopt1.c src/libs/libgroff/glyphuni.cpp \ + src/libs/libgroff/htmlhint.cpp src/libs/libgroff/hypot.cpp \ + src/libs/libgroff/iftoa.c src/libs/libgroff/invalid.cpp \ + src/libs/libgroff/itoa.c src/libs/libgroff/lf.cpp \ + src/libs/libgroff/lineno.cpp src/libs/libgroff/localcharset.c \ + src/libs/libgroff/macropath.cpp src/libs/libgroff/matherr.c \ + src/libs/libgroff/maxfilename.cpp \ + src/libs/libgroff/maxpathname.cpp src/libs/libgroff/mksdir.cpp \ + src/libs/libgroff/nametoindex.cpp src/libs/libgroff/paper.cpp \ + src/libs/libgroff/prime.cpp src/libs/libgroff/progname.c \ + src/libs/libgroff/ptable.cpp src/libs/libgroff/quotearg.c \ + src/libs/libgroff/relocate.cpp \ + src/libs/libgroff/searchpath.cpp src/libs/libgroff/spawnvp.c \ + src/libs/libgroff/string.cpp src/libs/libgroff/strsave.cpp \ + src/libs/libgroff/symbol.cpp src/libs/libgroff/tmpfile.cpp \ + src/libs/libgroff/tmpname.cpp src/libs/libgroff/unicode.cpp \ + src/libs/libgroff/uniglyph.cpp src/libs/libgroff/uniuni.cpp \ + src/libs/libgroff/relocatable.h $(am__append_16) nodist_libgroff_a_SOURCES = src/libs/libgroff/version.cpp # Data for localcharset.c. Taken from libiconv/libcharset. @@ -5263,6 +5653,10 @@ grotty_LDADD = $(LIBM) \ libgroff.a \ lib/libgnu.a +grotty_TESTS = \ + src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh \ + src/devices/grotty/tests/osc8_works.sh + GXDITVIEWSOURCES = \ src/devices/xditview/device.c \ src/devices/xditview/draw.c \ @@ -5282,6 +5676,9 @@ GXDITVIEWSOURCES = \ src/devices/xditview/Menu.h \ src/devices/xditview/Dvi.h +GXDITVIEW_GROFF_VERSION_H = src/devices/xditview/groff_version.h +@WITHOUT_X11_FALSE@GXDITVIEW_MAN1 = src/devices/xditview/gxditview.1 +@WITHOUT_X11_TRUE@GXDITVIEW_MAN1 = @WITHOUT_X11_FALSE@xditview_srcdir = $(top_srcdir)/src/devices/xditview @WITHOUT_X11_FALSE@gxditview_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS) -Dlint \ @WITHOUT_X11_FALSE@ -I$(top_builddir)/src/devices/xditview @@ -5289,7 +5686,10 @@ GXDITVIEWSOURCES = \ @WITHOUT_X11_FALSE@gxditview_LDADD = $(X_LIBS) $(X_PRE_LIBS) -lXaw -lXmu -lXt -lX11 \ @WITHOUT_X11_FALSE@ $(X_EXTRA_LIBS) $(LIBM) libxutil.a lib/libgnu.a -@WITHOUT_X11_FALSE@XDITVIEW_GENHDRS = src/devices/xditview/GXditview-ad.h +@WITHOUT_X11_FALSE@XDITVIEW_GENHDRS = \ +@WITHOUT_X11_FALSE@ src/devices/xditview/GXditview-ad.h \ +@WITHOUT_X11_FALSE@ $(GXDITVIEW_GROFF_VERSION_H) + @WITHOUT_X11_FALSE@gxditview_SOURCES = $(GXDITVIEWSOURCES) @WITHOUT_X11_FALSE@nodist_gxditview_SOURCES = $(XDITVIEW_GENHDRS) eqn_CPPFLAGS = \ @@ -5318,6 +5718,9 @@ eqn_SOURCES = \ src/preproc/eqn/pbox.h \ src/preproc/eqn/eqn.h +eqn_TESTS = \ + src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh + grn_SOURCES = \ src/preproc/grn/hdb.cpp \ src/preproc/grn/hpoint.cpp \ @@ -5333,6 +5736,10 @@ pre_grohtml_SOURCES = \ src/preproc/html/pre-html.h \ src/preproc/html/pushback.h +pic_CPPFLAGS = $(AM_CPPFLAGS) \ + -I $(top_srcdir)/src/preproc/pic \ + -I $(top_builddir)/src/preproc/pic + pic_LDADD = libgroff.a $(LIBM) lib/libgnu.a pic_SOURCES = \ src/preproc/pic/pic.ypp \ @@ -5349,13 +5756,15 @@ pic_SOURCES = \ src/preproc/pic/output.h \ src/preproc/pic/object.h -pic_CPPFLAGS = $(AM_CPPFLAGS) \ - -I $(top_srcdir)/src/preproc/pic \ - -I $(top_builddir)/src/preproc/pic +preconv_LDADD = libgroff.a $(LIBM) $(LIBICONV) $(UCHARDET_LIBS) \ + lib/libgnu.a -preconv_LDADD = libgroff.a $(LIBM) $(LIBICONV) $(UCHARDET_LIBS) lib/libgnu.a preconv_SOURCES = src/preproc/preconv/preconv.cpp preconv_CPPFLAGS = $(AM_CPPFLAGS) $(UCHARDET_CFLAGS) +preconv_TESTS = \ + src/preproc/preconv/tests/do-not-seek-the-unseekable.sh \ + src/preproc/preconv/tests/smoke-test.sh + refer_CPPFLAGS = $(AM_CPPFLAGS) -I $(top_srcdir)/src/preproc/refer refer_LDADD = libbib.a libgroff.a $(LIBM) lib/libgnu.a refer_SOURCES = \ @@ -5369,6 +5778,9 @@ refer_SOURCES = \ src/preproc/refer/token.h \ src/preproc/refer/command.h +refer_TESTS = \ + src/preproc/refer/tests/report-correct-line-numbers.sh + soelim_LDADD = libgroff.a $(LIBM) lib/libgnu.a soelim_SOURCES = src/preproc/soelim/soelim.cpp tbl_LDADD = libgroff.a $(LIBM) lib/libgnu.a @@ -5377,6 +5789,26 @@ tbl_SOURCES = \ src/preproc/tbl/table.cpp \ src/preproc/tbl/table.h +tbl_TESTS = \ + src/preproc/tbl/tests/boxes-and-vertical-rules.sh \ + src/preproc/tbl/tests/check-horizontal-line-length.sh \ + src/preproc/tbl/tests/check-line-intersections.sh \ + src/preproc/tbl/tests/check-vertical-line-length.sh \ + src/preproc/tbl/tests/cooperate-with-nm-request.sh \ + src/preproc/tbl/tests/count-continued-input-lines.sh \ + src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh \ + src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh \ + src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh \ + src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh \ + src/preproc/tbl/tests/expand-region-option-works.sh \ + src/preproc/tbl/tests/format-time-diagnostics-work.sh \ + src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh \ + src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh \ + src/preproc/tbl/tests/save-and-restore-line-numbering.sh \ + src/preproc/tbl/tests/save-and-restore-tab-stops.sh \ + src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh \ + src/preproc/tbl/tests/x-column-modifier-works.sh + groff_LDADD = \ libgroff.a \ lib/libgnu.a \ @@ -5387,19 +5819,46 @@ groff_SOURCES = \ src/roff/groff/pipeline.c \ src/roff/groff/pipeline.h -GROFF_OPTS_OUTPUT = \ - groff_opts_no_arg.txt \ - groff_opts_with_arg.txt +groff_TESTS = \ + src/roff/groff/tests/ab_works.sh \ + src/roff/groff/tests/adjustment_works.sh \ + src/roff/groff/tests/break_zero-length_output_line_sanely.sh \ + src/roff/groff/tests/device_control_escapes_express_basic_latin.sh \ + src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh \ + src/roff/groff/tests/dot-cp_register_works.sh \ + src/roff/groff/tests/dot-nm_register_works.sh \ + src/roff/groff/tests/dot-nn_register_works.sh \ + src/roff/groff/tests/evc_produces_no_output_if_invalid.sh \ + src/roff/groff/tests/fp_should_not_traverse_directories.sh \ + src/roff/groff/tests/handle_special_input_code_points.sh \ + src/roff/groff/tests/html_works_with_grn_and_eqn.sh \ + src/roff/groff/tests/initialization_is_quiet.sh \ + src/roff/groff/tests/localization_works.sh \ + src/roff/groff/tests/msoquiet_works.sh \ + src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh \ + src/roff/groff/tests/output_driver_C_and_G_options_work.sh \ + src/roff/groff/tests/recognize_end_of_sentence.sh \ + src/roff/groff/tests/regression_savannah_56555.sh \ + src/roff/groff/tests/regression_savannah_58153.sh \ + src/roff/groff/tests/regression_savannah_58162.sh \ + src/roff/groff/tests/regression_savannah_58337.sh \ + src/roff/groff/tests/regression_savannah_59202.sh \ + src/roff/groff/tests/smoke-test_html_device.sh \ + src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh \ + src/roff/groff/tests/soquiet_works.sh \ + src/roff/groff/tests/string_case_xform_errors.sh \ + src/roff/groff/tests/string_case_xform_requests.sh \ + src/roff/groff/tests/string_case_xform_unicode_escape.sh \ + src/roff/groff/tests/substring_works.sh \ + src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh + +groff_XFAIL_TESTS = \ + src/roff/groff/tests/string_case_xform_unicode_escape.sh -groffoptsdir = $(libprogramdir) -groffopts_DATA = $(GROFF_OPTS_OUTPUT) -grog_srcdir = $(top_srcdir)/src/roff/grog -GROG = src/roff/grog/subs.pl - -# grog_dir is defined by a m4 macro -grogdir = $(grog_dir) -dist_grog_DATA = $(GROG) nroff_srcdir = $(top_srcdir)/src/roff/nroff +nroff_TESTS = \ + src/roff/nroff/tests/verbose_option_works.sh + troff_LDADD = libgroff.a lib/libgnu.a $(LIBM) troff_SOURCES = \ src/roff/troff/dictionary.cpp \ @@ -5431,6 +5890,14 @@ addftinfo_SOURCES = \ src/utils/addftinfo/guess.h afmtodit_srcdir = $(top_srcdir)/src/utils/afmtodit +grog_srcdir = $(top_srcdir)/src/utils/grog +grog_TESTS = \ + src/utils/grog/tests/PF-does-not-start-pic-region.sh \ + src/utils/grog/tests/avoid-refer-fakeout.sh \ + src/utils/grog/tests/preserve-groff-options.sh \ + src/utils/grog/tests/recognize-perl-pod.sh \ + src/utils/grog/tests/smoke-test.sh + hpftodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a hpftodit_SOURCES = \ src/utils/hpftodit/hpftodit.cpp \ @@ -5453,6 +5920,8 @@ pfbtops_LDADD = libgroff.a $(LIBM) lib/libgnu.a nodist_EXTRA_pfbtops_SOURCES = src/utils/pfbtops/dummy.cpp tfmtodit_SOURCES = src/utils/tfmtodit/tfmtodit.cpp tfmtodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a +@WITHOUT_X11_FALSE@XTOTROFF_MAN1 = src/utils/xtotroff/xtotroff.1 +@WITHOUT_X11_TRUE@XTOTROFF_MAN1 = @WITHOUT_X11_FALSE@xtotroff_SOURCES = src/utils/xtotroff/xtotroff.c @WITHOUT_X11_FALSE@XLIBS = $(LIBXUTIL) $(LIBGROFF) @WITHOUT_X11_FALSE@xtotroff_LDADD = libxutil.a libgroff.a $(X_LIBS) $(X_PRE_LIBS) \ @@ -5460,49 +5929,33 @@ tfmtodit_LDADD = libgroff.a $(LIBM) lib/libgnu.a @WITHOUT_X11_FALSE@xtotroff_CPPFLAGS = $(AM_CPPFLAGS) $(X_CFLAGS) -# Copyright (C) 1989-2018 Free Software Foundation, Inc. -# Written by James Clark (jjc@jclark.com) -# Automake migration by Bertrand Garrigues -# -# Latest update: 22 Aug 2015 -# -# This file is part of groff. -# -# groff is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# groff is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# Define variable needed only for the targets that regenerate +# descriptions of X11 core fonts (used in "maintainer mode"). +xtotroff = $(top_builddir)/xtotroff tmac_srcdir = $(top_srcdir)/tmac tmac_builddir = $(top_builddir)/tmac TMACNORMALFILES = \ tmac/man.tmac \ tmac/mandoc.tmac \ tmac/andoc.tmac \ - tmac/an-old.tmac \ tmac/an-ext.tmac \ tmac/ms.tmac \ + tmac/e.tmac \ tmac/me.tmac \ + tmac/doc-old.tmac \ + tmac/doc.tmac \ tmac/mdoc.tmac \ tmac/pic.tmac \ - tmac/a4.tmac \ tmac/papersize.tmac \ tmac/62bit.tmac \ tmac/ec.tmac \ - tmac/safer.tmac \ tmac/trace.tmac \ tmac/ps.tmac \ tmac/psold.tmac \ tmac/pdfpic.tmac \ tmac/pspic.tmac \ tmac/psatk.tmac \ + tmac/ptx.tmac \ tmac/pdf.tmac \ tmac/dvi.tmac \ tmac/tty.tmac \ @@ -5512,7 +5965,6 @@ TMACNORMALFILES = \ tmac/latin5.tmac \ tmac/latin9.tmac \ tmac/cp1047.tmac \ - tmac/unicode.tmac \ tmac/X.tmac \ tmac/Xps.tmac \ tmac/lj4.tmac \ @@ -5530,10 +5982,13 @@ TMACNORMALFILES = \ tmac/troffrc \ tmac/troffrc-end \ tmac/trans.tmac \ - tmac/hyphen.us \ - tmac/hyphenex.us \ + tmac/en.tmac \ + tmac/hyphen.en \ + tmac/hyphenex.en \ tmac/fr.tmac \ tmac/hyphen.fr \ + tmac/it.tmac \ + tmac/hyphen.it \ tmac/sv.tmac \ tmac/hyphen.sv \ tmac/de.tmac \ @@ -5546,27 +6001,135 @@ TMACNORMALFILES = \ tmac/ja.tmac \ tmac/zh.tmac -NORMALFILES = `echo $(TMACNORMALFILES) | sed -e "s|tmac/||g"` -# TMACSTRIPFILES are built from their unstripped version (-u) -TMACSTRIPFILES = tmac/e.tmac tmac/doc.tmac tmac/doc-old.tmac +# files installed in tmacdir +# +# "s" and "an" are not "NORMAL" because they may use compatibility +# wrappers; see install_tmac_wrap_hook. +dist_tmac_DATA = \ + $(TMACNORMALFILES) \ + tmac/an.tmac \ + tmac/s.tmac -# Files installed in tmacdir -dist_tmac_DATA = $(TMACNORMALFILES) tmac/an.tmac tmac/s.tmac -nodist_tmac_DATA = $(TMACSTRIPFILES) tmac/www.tmac +nodist_tmac_DATA = tmac/www.tmac TMACMDOCFILES = \ - tmac/doc-common \ - tmac/doc-ditroff \ - tmac/doc-nroff \ - tmac/doc-syms + tmac/mdoc/doc-common \ + tmac/mdoc/doc-ditroff \ + tmac/mdoc/doc-nroff \ + tmac/mdoc/doc-syms -MDOCFILES = `echo $(TMACMDOCFILES) | sed -e "s|tmac/||g"` mdocdir = $(tmacdir)/mdoc # Files installed in mdocdir -nodist_mdoc_DATA = $(TMACMDOCFILES) +dist_mdoc_DATA = $(TMACMDOCFILES) # Installed in localtmacdir dist_localtmac_DATA = tmac/man.local tmac/mdoc.local +tmac_TESTS = \ + tmac/tests/an-ext_MR-works.sh \ + tmac/tests/an-ext_MT-works.sh \ + tmac/tests/an-ext_UR-works.sh \ + tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh \ + tmac/tests/an_CS-register-off.sh \ + tmac/tests/an_CS-register-on.sh \ + tmac/tests/an_CS-register-unspecified.sh \ + tmac/tests/an_CT-register-off.sh \ + tmac/tests/an_CT-register-on.sh \ + tmac/tests/an_CT-register-unspecified.sh \ + tmac/tests/an_FT-bad-value-should-not-trash-titles.sh \ + tmac/tests/an_HY-register-works.sh \ + tmac/tests/an_LL-init-sanely.sh \ + tmac/tests/an_ME-punct-hyphenates.sh \ + tmac/tests/an_MR-works.sh \ + tmac/tests/an_MT-body-hyphenates.sh \ + tmac/tests/an_MT-works.sh \ + tmac/tests/an_P-register-works.sh \ + tmac/tests/an_TH-repairs-ad-damage.sh \ + tmac/tests/an_TH-repairs-hy-damage.sh \ + tmac/tests/an_TS-adds-no-vertical-space.sh \ + tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh \ + tmac/tests/an_UE-breaks-before-long-URIs.sh \ + tmac/tests/an_UE-punct-hyphenates.sh \ + tmac/tests/an_UR-body-hyphenates.sh \ + tmac/tests/an_UR-works.sh \ + tmac/tests/an_X-register-works.sh \ + tmac/tests/an_adjust-link-text-correctly.sh \ + tmac/tests/an_avoid-two-font-denial-of-service.sh \ + tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh \ + tmac/tests/an_font-remapping-does-not-affect-titles.sh \ + tmac/tests/an_handle-degenerate-input-quietly.sh \ + tmac/tests/an_inner-footer-abbreviation-works.sh \ + tmac/tests/an_link-macros-work-in-paragraph-tags.sh \ + tmac/tests/an_link-trailing-text-hugs-previous.sh \ + tmac/tests/an_no-break-after-short-paragraph-tags.sh \ + tmac/tests/an_output-footer-when-continuously-rendering.sh \ + tmac/tests/an_page-footers-present.sh \ + tmac/tests/an_page-header-has-current-data.sh \ + tmac/tests/an_reset-hyphenation-correctly.sh \ + tmac/tests/an_title-abbreviation-works.sh \ + tmac/tests/an_use-input-traps-correctly.sh \ + tmac/tests/an_works-with-ec.sh \ + tmac/tests/andoc_P-register-works.sh \ + tmac/tests/andoc_check-an-to-doc-transition.sh \ + tmac/tests/andoc_clear-doc-traps.sh \ + tmac/tests/andoc_flush-between-packages.sh \ + tmac/tests/doc_CS-works.sh \ + tmac/tests/doc_CT-works.sh \ + tmac/tests/doc_D-places-page-numbers-correctly.sh \ + tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh \ + tmac/tests/doc_Mt-works.sh \ + tmac/tests/doc_Nm-works.sh \ + tmac/tests/doc_P-register-works.sh \ + tmac/tests/doc_X-register-works.sh \ + tmac/tests/doc_accept-mixed-case-section-headings.sh \ + tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh \ + tmac/tests/doc_heading-font-remapping-works.sh \ + tmac/tests/doc_indents-correctly.sh \ + tmac/tests/doc_output-footer-when-continuously-rendering.sh \ + tmac/tests/doc_smoke-test.sh \ + tmac/tests/e_chapter-titles-work.sh \ + tmac/tests/e_columns-work-on-long-pages.sh \ + tmac/tests/e_delayed-text-marks-work.sh \ + tmac/tests/e_footnote-marks-work.sh \ + tmac/tests/e_footnotes-work-with-columns.sh \ + tmac/tests/e_ld-works.sh \ + tmac/tests/e_line-numbering-works.sh \ + tmac/tests/e_rejects-too-short-page-lengths.sh \ + tmac/tests/ec_works.sh \ + tmac/tests/latin2_works.sh \ + tmac/tests/latin5_works.sh \ + tmac/tests/latin9_works.sh \ + tmac/tests/localization-works.sh \ + tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh \ + tmac/tests/pdfpic_falls-back-to-PSPIC.sh \ + tmac/tests/s_IP-indents-using-paragraph-type-size.sh \ + tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh \ + tmac/tests/s_PN-works.sh \ + tmac/tests/s_R-handles-its-arguments.sh \ + tmac/tests/s_SH-resets-IP-indentation-amount.sh \ + tmac/tests/s_TC-works-with-percent-in-custom-titles.sh \ + tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh \ + tmac/tests/s_honor-MINGW-when-two-columns.sh \ + tmac/tests/s_mark-column-start-correctly.sh \ + tmac/tests/s_no-excess-space-around-displays.sh \ + tmac/tests/s_rejects-too-short-page-lengths.sh + +tmac_XFAIL_TESTS = \ + tmac/tests/an-ext_ME-punct-hyphenates.sh \ + tmac/tests/an-ext_UE-punct-hyphenates.sh \ + tmac/tests/an-ext_UE-breaks-before-long-URIs.sh \ + tmac/tests/e_footnotes-work-with-columns.sh + + +# Check input file for bare m4 keywords. +M4WORDS = define|divert|include|index|shift|undefine|undivert +M4CHECK = tmac/groff_man-passed-check-for-m4-keywords-stamp + +# Define convenience macros for in-tree documents to depend on. Don't +# use these above. +TMAC_PACKAGE_MAN = tmac/an.tmac tmac/an-ext.tmac +TMAC_PACKAGE_MDOC = tmac/doc.tmac tmac/mdoc/doc-common \ + tmac/mdoc/doc-ditroff tmac/mdoc/doc-nroff tmac/mdoc/doc-syms + # Suffix rule to build .1, .5 and .7 files from .1.man, .5.man and # .7.man files. The brackets around the @ are used to prevent the @@ -5592,18 +6155,22 @@ dist_localtmac_DATA = tmac/man.local tmac/mdoc.local # because a command substitution is being nested inside yet another # invocation of sed. # -# * For this target; no assurances about the good behavior of unusual +# * For this target, no assurances about the good behavior of unusual # characters in Makefile variables in other aspects of the groff build # are offered. +# +# COMPATIBILITY_WRAPPERS is intended only for use in conditional +# expressions in man pages (to see if the legacy macro package wrappers +# feature is enabled) and not for expansion as formatted text. makevarescape = $(top_srcdir)/makevarescape.sed all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .roff .in .ps .mom .pdf .me .ms .ps .html .txt .texi .dvi .pdf .xhtml .man .c .cpp .log .o .obj .test .test$(EXEEXT) .trs .ypp +.SUFFIXES: .roff .in .ps .mom .pdf .me.in .me .man .c .cpp .dvi .html .log .o .obj .pfa .test .test$(EXEEXT) .texi .trs .txt .ypp am--refresh: Makefile @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/groff_filenames/groff_filenames.am $(top_srcdir)/contrib/groffer/groffer.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/grog/grog.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__configure_deps) +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/contrib/rfc1345/rfc1345.am $(top_srcdir)/contrib/sboxes/sboxes.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/grog/grog.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -5625,7 +6192,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; -$(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/groff_filenames/groff_filenames.am $(top_srcdir)/contrib/groffer/groffer.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/grog/grog.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__empty): +$(top_srcdir)/lib/gnulib.mk $(top_srcdir)/arch/mingw/mingw.am $(top_srcdir)/arch/misc/misc.am $(top_srcdir)/contrib/chem/chem.am $(top_srcdir)/contrib/eqn2graph/eqn2graph.am $(top_srcdir)/contrib/gdiffmk/gdiffmk.am $(top_srcdir)/contrib/glilypond/glilypond.am $(top_srcdir)/contrib/gperl/gperl.am $(top_srcdir)/contrib/gpinyin/gpinyin.am $(top_srcdir)/contrib/grap2graph/grap2graph.am $(top_srcdir)/contrib/hdtbl/hdtbl.am $(top_srcdir)/contrib/mm/mm.am $(top_srcdir)/contrib/mom/mom.am $(top_srcdir)/contrib/pdfmark/pdfmark.am $(top_srcdir)/contrib/pic2graph/pic2graph.am $(top_srcdir)/contrib/rfc1345/rfc1345.am $(top_srcdir)/contrib/sboxes/sboxes.am $(top_srcdir)/doc/doc.am $(top_srcdir)/font/devX100/devX100.am $(top_srcdir)/font/devX100-12/devX100-12.am $(top_srcdir)/font/devX75/devX75.am $(top_srcdir)/font/devX75-12/devX75-12.am $(top_srcdir)/font/devascii/devascii.am $(top_srcdir)/font/devcp1047/devcp1047.am $(top_srcdir)/font/devdvi/devdvi.am $(top_srcdir)/font/devhtml/devhtml.am $(top_srcdir)/font/devlatin1/devlatin1.am $(top_srcdir)/font/devlbp/devlbp.am $(top_srcdir)/font/devlj4/devlj4.am $(top_srcdir)/font/devpdf/devpdf.am $(top_srcdir)/font/devps/devps.am $(top_srcdir)/font/devutf8/devutf8.am $(top_srcdir)/font/scripts/scripts.am $(top_srcdir)/man/man.am $(top_srcdir)/src/include/include.am $(top_srcdir)/src/libs/libbib/libbib.am $(top_srcdir)/src/libs/libdriver/libdriver.am $(top_srcdir)/src/libs/libgroff/libgroff.am $(top_srcdir)/src/libs/libxutil/libxutil.am $(top_srcdir)/src/devices/grodvi/grodvi.am $(top_srcdir)/src/devices/grohtml/grohtml.am $(top_srcdir)/src/devices/grolbp/grolbp.am $(top_srcdir)/src/devices/grolj4/grolj4.am $(top_srcdir)/src/devices/gropdf/gropdf.am $(top_srcdir)/src/devices/grops/grops.am $(top_srcdir)/src/devices/grotty/grotty.am $(top_srcdir)/src/devices/xditview/xditview.am $(top_srcdir)/src/preproc/eqn/eqn.am $(top_srcdir)/src/preproc/grn/grn.am $(top_srcdir)/src/preproc/html/html.am $(top_srcdir)/src/preproc/pic/pic.am $(top_srcdir)/src/preproc/preconv/preconv.am $(top_srcdir)/src/preproc/refer/refer.am $(top_srcdir)/src/preproc/soelim/soelim.am $(top_srcdir)/src/preproc/tbl/tbl.am $(top_srcdir)/src/roff/groff/groff.am $(top_srcdir)/src/roff/nroff/nroff.am $(top_srcdir)/src/roff/troff/troff.am $(top_srcdir)/src/utils/addftinfo/addftinfo.am $(top_srcdir)/src/utils/afmtodit/afmtodit.am $(top_srcdir)/src/utils/grog/grog.am $(top_srcdir)/src/utils/hpftodit/hpftodit.am $(top_srcdir)/src/utils/indxbib/indxbib.am $(top_srcdir)/src/utils/lkbib/lkbib.am $(top_srcdir)/src/utils/lookbib/lookbib.am $(top_srcdir)/src/utils/pfbtops/pfbtops.am $(top_srcdir)/src/utils/tfmtodit/tfmtodit.am $(top_srcdir)/src/utils/xtotroff/xtotroff.am $(top_srcdir)/tmac/tmac.am $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -5796,12 +6363,35 @@ lib/$(am__dirstamp): lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) lib/$(DEPDIR) @: > lib/$(DEPDIR)/$(am__dirstamp) -lib/localcharset.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-float.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-itold.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-free.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-fseterr.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-localcharset.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-math.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/math.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/printf-frexp.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-memchr.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/printf-frexpl.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-printf-frexp.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-printf-frexpl.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-signbitf.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-signbitd.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-signbitl.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-stdio-read.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-stdio-write.$(OBJEXT): lib/$(am__dirstamp) \ + lib/$(DEPDIR)/$(am__dirstamp) +lib/libgnu_a-unistd.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) lib/uniwidth/$(am__dirstamp): @$(MKDIR_P) lib/uniwidth @@ -5809,48 +6399,39 @@ lib/uniwidth/$(am__dirstamp): lib/uniwidth/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) lib/uniwidth/$(DEPDIR) @: > lib/uniwidth/$(DEPDIR)/$(am__dirstamp) -lib/uniwidth/width.$(OBJEXT): lib/uniwidth/$(am__dirstamp) \ +lib/uniwidth/libgnu_a-width.$(OBJEXT): lib/uniwidth/$(am__dirstamp) \ lib/uniwidth/$(DEPDIR)/$(am__dirstamp) -lib/wctype-h.$(OBJEXT): lib/$(am__dirstamp) \ - lib/$(DEPDIR)/$(am__dirstamp) -lib/xsize.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/float.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/itold.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/fprintf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-wctype-h.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/frexp.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/frexpl.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-wcwidth.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/fseterr.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-xsize.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/isnan.$(OBJEXT): lib/$(am__dirstamp) lib/$(DEPDIR)/$(am__dirstamp) -lib/isnand.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-fprintf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/isnanf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-frexp.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/isnanl.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-frexpl.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/memchr.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-isnan.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/signbitd.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-isnand.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/signbitf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-isnanf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/signbitl.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-isnanl.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/snprintf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-snprintf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/asnprintf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-asnprintf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/printf-args.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-printf-args.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/printf-parse.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-printf-parse.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/vasnprintf.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-vasnprintf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) -lib/vsnprintf.$(OBJEXT): lib/$(am__dirstamp) \ - lib/$(DEPDIR)/$(am__dirstamp) -lib/wcwidth.$(OBJEXT): lib/$(am__dirstamp) \ +lib/libgnu_a-vsnprintf.$(OBJEXT): lib/$(am__dirstamp) \ lib/$(DEPDIR)/$(am__dirstamp) lib/libgnu.a: $(lib_libgnu_a_OBJECTS) $(lib_libgnu_a_DEPENDENCIES) $(EXTRA_lib_libgnu_a_DEPENDENCIES) lib/$(am__dirstamp) @@ -5994,9 +6575,6 @@ src/libs/libgroff/libgroff_a-mksdir.$(OBJEXT): \ src/libs/libgroff/libgroff_a-nametoindex.$(OBJEXT): \ src/libs/libgroff/$(am__dirstamp) \ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) -src/libs/libgroff/libgroff_a-new.$(OBJEXT): \ - src/libs/libgroff/$(am__dirstamp) \ - src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) src/libs/libgroff/libgroff_a-paper.$(OBJEXT): \ src/libs/libgroff/$(am__dirstamp) \ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) @@ -6045,6 +6623,9 @@ src/libs/libgroff/libgroff_a-uniglyph.$(OBJEXT): \ src/libs/libgroff/libgroff_a-uniuni.$(OBJEXT): \ src/libs/libgroff/$(am__dirstamp) \ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) +src/libs/libgroff/libgroff_a-new.$(OBJEXT): \ + src/libs/libgroff/$(am__dirstamp) \ + src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) src/libs/libgroff/libgroff_a-version.$(OBJEXT): \ src/libs/libgroff/$(am__dirstamp) \ src/libs/libgroff/$(DEPDIR)/$(am__dirstamp) @@ -6660,34 +7241,38 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/asnprintf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/float.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/fprintf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/frexp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/frexpl.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/fseterr.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/isnan.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/isnand.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/isnanf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/isnanl.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/itold.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/localcharset.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/math.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/memchr.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/printf-args.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/printf-frexp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/printf-frexpl.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/printf-parse.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/signbitd.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/signbitf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/signbitl.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/snprintf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/vasnprintf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/vsnprintf.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/wctype-h.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/wcwidth.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/xsize.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@lib/uniwidth/$(DEPDIR)/width.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-asnprintf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-float.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-fprintf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-free.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-frexp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-frexpl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-fseterr.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnan.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnand.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnanf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-isnanl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-itold.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-localcharset.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-math.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-memchr.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-args.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-frexp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-printf-parse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitd.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-signbitl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-snprintf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-stdio-read.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-stdio-write.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-unistd.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-vasnprintf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-vsnprintf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-wctype-h.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-wcwidth.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libgnu_a-xsize.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/devices/grodvi/$(DEPDIR)/dvi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/html-table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/devices/grohtml/$(DEPDIR)/html-text.Po@am__quote@ # am--include-marker @@ -6848,29 +7433,477 @@ am--depfiles: $(am__depfiles_remade) @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` -src/libs/libgroff/libgroff_a-getopt.o: src/libs/libgroff/getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.o' libtool=no @AMDEPBACKSLASH@ +lib/libgnu_a-float.o: lib/float.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-float.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-float.Tpo -c -o lib/libgnu_a-float.o `test -f 'lib/float.c' || echo '$(srcdir)/'`lib/float.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-float.Tpo lib/$(DEPDIR)/libgnu_a-float.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/float.c' object='lib/libgnu_a-float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-float.o `test -f 'lib/float.c' || echo '$(srcdir)/'`lib/float.c -src/libs/libgroff/libgroff_a-getopt.obj: src/libs/libgroff/getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.obj' libtool=no @AMDEPBACKSLASH@ +lib/libgnu_a-float.obj: lib/float.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-float.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-float.Tpo -c -o lib/libgnu_a-float.obj `if test -f 'lib/float.c'; then $(CYGPATH_W) 'lib/float.c'; else $(CYGPATH_W) '$(srcdir)/lib/float.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-float.Tpo lib/$(DEPDIR)/libgnu_a-float.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/float.c' object='lib/libgnu_a-float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-float.obj `if test -f 'lib/float.c'; then $(CYGPATH_W) 'lib/float.c'; else $(CYGPATH_W) '$(srcdir)/lib/float.c'; fi` -src/libs/libgroff/libgroff_a-getopt1.o: src/libs/libgroff/getopt1.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt1.c' object='src/libs/libgroff/libgroff_a-getopt1.o' libtool=no @AMDEPBACKSLASH@ +lib/libgnu_a-itold.o: lib/itold.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-itold.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-itold.Tpo -c -o lib/libgnu_a-itold.o `test -f 'lib/itold.c' || echo '$(srcdir)/'`lib/itold.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-itold.Tpo lib/$(DEPDIR)/libgnu_a-itold.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/itold.c' object='lib/libgnu_a-itold.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-itold.o `test -f 'lib/itold.c' || echo '$(srcdir)/'`lib/itold.c -src/libs/libgroff/libgroff_a-getopt1.obj: src/libs/libgroff/getopt1.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.obj `if test -f 'src/libs/libgroff/getopt1.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt1.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt1.c'; fi` +lib/libgnu_a-itold.obj: lib/itold.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-itold.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-itold.Tpo -c -o lib/libgnu_a-itold.obj `if test -f 'lib/itold.c'; then $(CYGPATH_W) 'lib/itold.c'; else $(CYGPATH_W) '$(srcdir)/lib/itold.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-itold.Tpo lib/$(DEPDIR)/libgnu_a-itold.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/itold.c' object='lib/libgnu_a-itold.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-itold.obj `if test -f 'lib/itold.c'; then $(CYGPATH_W) 'lib/itold.c'; else $(CYGPATH_W) '$(srcdir)/lib/itold.c'; fi` + +lib/libgnu_a-free.o: lib/free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-free.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-free.Tpo -c -o lib/libgnu_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-free.Tpo lib/$(DEPDIR)/libgnu_a-free.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/free.c' object='lib/libgnu_a-free.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c + +lib/libgnu_a-free.obj: lib/free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-free.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-free.Tpo -c -o lib/libgnu_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-free.Tpo lib/$(DEPDIR)/libgnu_a-free.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/free.c' object='lib/libgnu_a-free.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi` + +lib/libgnu_a-fseterr.o: lib/fseterr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fseterr.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fseterr.Tpo -c -o lib/libgnu_a-fseterr.o `test -f 'lib/fseterr.c' || echo '$(srcdir)/'`lib/fseterr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fseterr.Tpo lib/$(DEPDIR)/libgnu_a-fseterr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fseterr.c' object='lib/libgnu_a-fseterr.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fseterr.o `test -f 'lib/fseterr.c' || echo '$(srcdir)/'`lib/fseterr.c + +lib/libgnu_a-fseterr.obj: lib/fseterr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fseterr.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fseterr.Tpo -c -o lib/libgnu_a-fseterr.obj `if test -f 'lib/fseterr.c'; then $(CYGPATH_W) 'lib/fseterr.c'; else $(CYGPATH_W) '$(srcdir)/lib/fseterr.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fseterr.Tpo lib/$(DEPDIR)/libgnu_a-fseterr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fseterr.c' object='lib/libgnu_a-fseterr.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fseterr.obj `if test -f 'lib/fseterr.c'; then $(CYGPATH_W) 'lib/fseterr.c'; else $(CYGPATH_W) '$(srcdir)/lib/fseterr.c'; fi` + +lib/libgnu_a-localcharset.o: lib/localcharset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-localcharset.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-localcharset.Tpo -c -o lib/libgnu_a-localcharset.o `test -f 'lib/localcharset.c' || echo '$(srcdir)/'`lib/localcharset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-localcharset.Tpo lib/$(DEPDIR)/libgnu_a-localcharset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/localcharset.c' object='lib/libgnu_a-localcharset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-localcharset.o `test -f 'lib/localcharset.c' || echo '$(srcdir)/'`lib/localcharset.c + +lib/libgnu_a-localcharset.obj: lib/localcharset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-localcharset.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-localcharset.Tpo -c -o lib/libgnu_a-localcharset.obj `if test -f 'lib/localcharset.c'; then $(CYGPATH_W) 'lib/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/lib/localcharset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-localcharset.Tpo lib/$(DEPDIR)/libgnu_a-localcharset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/localcharset.c' object='lib/libgnu_a-localcharset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-localcharset.obj `if test -f 'lib/localcharset.c'; then $(CYGPATH_W) 'lib/localcharset.c'; else $(CYGPATH_W) '$(srcdir)/lib/localcharset.c'; fi` + +lib/libgnu_a-math.o: lib/math.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-math.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-math.Tpo -c -o lib/libgnu_a-math.o `test -f 'lib/math.c' || echo '$(srcdir)/'`lib/math.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-math.Tpo lib/$(DEPDIR)/libgnu_a-math.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/math.c' object='lib/libgnu_a-math.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-math.o `test -f 'lib/math.c' || echo '$(srcdir)/'`lib/math.c + +lib/libgnu_a-math.obj: lib/math.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-math.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-math.Tpo -c -o lib/libgnu_a-math.obj `if test -f 'lib/math.c'; then $(CYGPATH_W) 'lib/math.c'; else $(CYGPATH_W) '$(srcdir)/lib/math.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-math.Tpo lib/$(DEPDIR)/libgnu_a-math.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/math.c' object='lib/libgnu_a-math.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-math.obj `if test -f 'lib/math.c'; then $(CYGPATH_W) 'lib/math.c'; else $(CYGPATH_W) '$(srcdir)/lib/math.c'; fi` + +lib/libgnu_a-memchr.o: lib/memchr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-memchr.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-memchr.Tpo -c -o lib/libgnu_a-memchr.o `test -f 'lib/memchr.c' || echo '$(srcdir)/'`lib/memchr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-memchr.Tpo lib/$(DEPDIR)/libgnu_a-memchr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/memchr.c' object='lib/libgnu_a-memchr.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-memchr.o `test -f 'lib/memchr.c' || echo '$(srcdir)/'`lib/memchr.c + +lib/libgnu_a-memchr.obj: lib/memchr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-memchr.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-memchr.Tpo -c -o lib/libgnu_a-memchr.obj `if test -f 'lib/memchr.c'; then $(CYGPATH_W) 'lib/memchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memchr.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-memchr.Tpo lib/$(DEPDIR)/libgnu_a-memchr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/memchr.c' object='lib/libgnu_a-memchr.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-memchr.obj `if test -f 'lib/memchr.c'; then $(CYGPATH_W) 'lib/memchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memchr.c'; fi` + +lib/libgnu_a-printf-frexp.o: lib/printf-frexp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexp.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo -c -o lib/libgnu_a-printf-frexp.o `test -f 'lib/printf-frexp.c' || echo '$(srcdir)/'`lib/printf-frexp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexp.c' object='lib/libgnu_a-printf-frexp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexp.o `test -f 'lib/printf-frexp.c' || echo '$(srcdir)/'`lib/printf-frexp.c + +lib/libgnu_a-printf-frexp.obj: lib/printf-frexp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexp.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo -c -o lib/libgnu_a-printf-frexp.obj `if test -f 'lib/printf-frexp.c'; then $(CYGPATH_W) 'lib/printf-frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexp.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexp.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexp.c' object='lib/libgnu_a-printf-frexp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexp.obj `if test -f 'lib/printf-frexp.c'; then $(CYGPATH_W) 'lib/printf-frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexp.c'; fi` + +lib/libgnu_a-printf-frexpl.o: lib/printf-frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexpl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo -c -o lib/libgnu_a-printf-frexpl.o `test -f 'lib/printf-frexpl.c' || echo '$(srcdir)/'`lib/printf-frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexpl.c' object='lib/libgnu_a-printf-frexpl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexpl.o `test -f 'lib/printf-frexpl.c' || echo '$(srcdir)/'`lib/printf-frexpl.c + +lib/libgnu_a-printf-frexpl.obj: lib/printf-frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-frexpl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo -c -o lib/libgnu_a-printf-frexpl.obj `if test -f 'lib/printf-frexpl.c'; then $(CYGPATH_W) 'lib/printf-frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexpl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-frexpl.c' object='lib/libgnu_a-printf-frexpl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-frexpl.obj `if test -f 'lib/printf-frexpl.c'; then $(CYGPATH_W) 'lib/printf-frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-frexpl.c'; fi` + +lib/libgnu_a-signbitf.o: lib/signbitf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitf.Tpo -c -o lib/libgnu_a-signbitf.o `test -f 'lib/signbitf.c' || echo '$(srcdir)/'`lib/signbitf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitf.Tpo lib/$(DEPDIR)/libgnu_a-signbitf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitf.c' object='lib/libgnu_a-signbitf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitf.o `test -f 'lib/signbitf.c' || echo '$(srcdir)/'`lib/signbitf.c + +lib/libgnu_a-signbitf.obj: lib/signbitf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitf.Tpo -c -o lib/libgnu_a-signbitf.obj `if test -f 'lib/signbitf.c'; then $(CYGPATH_W) 'lib/signbitf.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitf.Tpo lib/$(DEPDIR)/libgnu_a-signbitf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitf.c' object='lib/libgnu_a-signbitf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitf.obj `if test -f 'lib/signbitf.c'; then $(CYGPATH_W) 'lib/signbitf.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitf.c'; fi` + +lib/libgnu_a-signbitd.o: lib/signbitd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitd.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitd.Tpo -c -o lib/libgnu_a-signbitd.o `test -f 'lib/signbitd.c' || echo '$(srcdir)/'`lib/signbitd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitd.Tpo lib/$(DEPDIR)/libgnu_a-signbitd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitd.c' object='lib/libgnu_a-signbitd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitd.o `test -f 'lib/signbitd.c' || echo '$(srcdir)/'`lib/signbitd.c + +lib/libgnu_a-signbitd.obj: lib/signbitd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitd.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitd.Tpo -c -o lib/libgnu_a-signbitd.obj `if test -f 'lib/signbitd.c'; then $(CYGPATH_W) 'lib/signbitd.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitd.Tpo lib/$(DEPDIR)/libgnu_a-signbitd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitd.c' object='lib/libgnu_a-signbitd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitd.obj `if test -f 'lib/signbitd.c'; then $(CYGPATH_W) 'lib/signbitd.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitd.c'; fi` + +lib/libgnu_a-signbitl.o: lib/signbitl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitl.Tpo -c -o lib/libgnu_a-signbitl.o `test -f 'lib/signbitl.c' || echo '$(srcdir)/'`lib/signbitl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitl.Tpo lib/$(DEPDIR)/libgnu_a-signbitl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitl.c' object='lib/libgnu_a-signbitl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitl.o `test -f 'lib/signbitl.c' || echo '$(srcdir)/'`lib/signbitl.c + +lib/libgnu_a-signbitl.obj: lib/signbitl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-signbitl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-signbitl.Tpo -c -o lib/libgnu_a-signbitl.obj `if test -f 'lib/signbitl.c'; then $(CYGPATH_W) 'lib/signbitl.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-signbitl.Tpo lib/$(DEPDIR)/libgnu_a-signbitl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/signbitl.c' object='lib/libgnu_a-signbitl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-signbitl.obj `if test -f 'lib/signbitl.c'; then $(CYGPATH_W) 'lib/signbitl.c'; else $(CYGPATH_W) '$(srcdir)/lib/signbitl.c'; fi` + +lib/libgnu_a-stdio-read.o: lib/stdio-read.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-read.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo -c -o lib/libgnu_a-stdio-read.o `test -f 'lib/stdio-read.c' || echo '$(srcdir)/'`lib/stdio-read.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo lib/$(DEPDIR)/libgnu_a-stdio-read.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-read.c' object='lib/libgnu_a-stdio-read.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-read.o `test -f 'lib/stdio-read.c' || echo '$(srcdir)/'`lib/stdio-read.c + +lib/libgnu_a-stdio-read.obj: lib/stdio-read.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-read.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo -c -o lib/libgnu_a-stdio-read.obj `if test -f 'lib/stdio-read.c'; then $(CYGPATH_W) 'lib/stdio-read.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-read.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-read.Tpo lib/$(DEPDIR)/libgnu_a-stdio-read.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-read.c' object='lib/libgnu_a-stdio-read.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-read.obj `if test -f 'lib/stdio-read.c'; then $(CYGPATH_W) 'lib/stdio-read.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-read.c'; fi` + +lib/libgnu_a-stdio-write.o: lib/stdio-write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-write.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo -c -o lib/libgnu_a-stdio-write.o `test -f 'lib/stdio-write.c' || echo '$(srcdir)/'`lib/stdio-write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo lib/$(DEPDIR)/libgnu_a-stdio-write.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-write.c' object='lib/libgnu_a-stdio-write.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-write.o `test -f 'lib/stdio-write.c' || echo '$(srcdir)/'`lib/stdio-write.c + +lib/libgnu_a-stdio-write.obj: lib/stdio-write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-stdio-write.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo -c -o lib/libgnu_a-stdio-write.obj `if test -f 'lib/stdio-write.c'; then $(CYGPATH_W) 'lib/stdio-write.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-write.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-stdio-write.Tpo lib/$(DEPDIR)/libgnu_a-stdio-write.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/stdio-write.c' object='lib/libgnu_a-stdio-write.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-stdio-write.obj `if test -f 'lib/stdio-write.c'; then $(CYGPATH_W) 'lib/stdio-write.c'; else $(CYGPATH_W) '$(srcdir)/lib/stdio-write.c'; fi` + +lib/libgnu_a-unistd.o: lib/unistd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-unistd.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-unistd.Tpo -c -o lib/libgnu_a-unistd.o `test -f 'lib/unistd.c' || echo '$(srcdir)/'`lib/unistd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-unistd.Tpo lib/$(DEPDIR)/libgnu_a-unistd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/unistd.c' object='lib/libgnu_a-unistd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-unistd.o `test -f 'lib/unistd.c' || echo '$(srcdir)/'`lib/unistd.c + +lib/libgnu_a-unistd.obj: lib/unistd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-unistd.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-unistd.Tpo -c -o lib/libgnu_a-unistd.obj `if test -f 'lib/unistd.c'; then $(CYGPATH_W) 'lib/unistd.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-unistd.Tpo lib/$(DEPDIR)/libgnu_a-unistd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/unistd.c' object='lib/libgnu_a-unistd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-unistd.obj `if test -f 'lib/unistd.c'; then $(CYGPATH_W) 'lib/unistd.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistd.c'; fi` + +lib/uniwidth/libgnu_a-width.o: lib/uniwidth/width.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/uniwidth/libgnu_a-width.o -MD -MP -MF lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo -c -o lib/uniwidth/libgnu_a-width.o `test -f 'lib/uniwidth/width.c' || echo '$(srcdir)/'`lib/uniwidth/width.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/uniwidth/width.c' object='lib/uniwidth/libgnu_a-width.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/uniwidth/libgnu_a-width.o `test -f 'lib/uniwidth/width.c' || echo '$(srcdir)/'`lib/uniwidth/width.c + +lib/uniwidth/libgnu_a-width.obj: lib/uniwidth/width.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/uniwidth/libgnu_a-width.obj -MD -MP -MF lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo -c -o lib/uniwidth/libgnu_a-width.obj `if test -f 'lib/uniwidth/width.c'; then $(CYGPATH_W) 'lib/uniwidth/width.c'; else $(CYGPATH_W) '$(srcdir)/lib/uniwidth/width.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/uniwidth/$(DEPDIR)/libgnu_a-width.Tpo lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/uniwidth/width.c' object='lib/uniwidth/libgnu_a-width.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/uniwidth/libgnu_a-width.obj `if test -f 'lib/uniwidth/width.c'; then $(CYGPATH_W) 'lib/uniwidth/width.c'; else $(CYGPATH_W) '$(srcdir)/lib/uniwidth/width.c'; fi` + +lib/libgnu_a-wctype-h.o: lib/wctype-h.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wctype-h.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo -c -o lib/libgnu_a-wctype-h.o `test -f 'lib/wctype-h.c' || echo '$(srcdir)/'`lib/wctype-h.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo lib/$(DEPDIR)/libgnu_a-wctype-h.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wctype-h.c' object='lib/libgnu_a-wctype-h.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wctype-h.o `test -f 'lib/wctype-h.c' || echo '$(srcdir)/'`lib/wctype-h.c + +lib/libgnu_a-wctype-h.obj: lib/wctype-h.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wctype-h.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo -c -o lib/libgnu_a-wctype-h.obj `if test -f 'lib/wctype-h.c'; then $(CYGPATH_W) 'lib/wctype-h.c'; else $(CYGPATH_W) '$(srcdir)/lib/wctype-h.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wctype-h.Tpo lib/$(DEPDIR)/libgnu_a-wctype-h.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wctype-h.c' object='lib/libgnu_a-wctype-h.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wctype-h.obj `if test -f 'lib/wctype-h.c'; then $(CYGPATH_W) 'lib/wctype-h.c'; else $(CYGPATH_W) '$(srcdir)/lib/wctype-h.c'; fi` + +lib/libgnu_a-wcwidth.o: lib/wcwidth.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wcwidth.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo -c -o lib/libgnu_a-wcwidth.o `test -f 'lib/wcwidth.c' || echo '$(srcdir)/'`lib/wcwidth.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo lib/$(DEPDIR)/libgnu_a-wcwidth.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wcwidth.c' object='lib/libgnu_a-wcwidth.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wcwidth.o `test -f 'lib/wcwidth.c' || echo '$(srcdir)/'`lib/wcwidth.c + +lib/libgnu_a-wcwidth.obj: lib/wcwidth.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-wcwidth.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo -c -o lib/libgnu_a-wcwidth.obj `if test -f 'lib/wcwidth.c'; then $(CYGPATH_W) 'lib/wcwidth.c'; else $(CYGPATH_W) '$(srcdir)/lib/wcwidth.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-wcwidth.Tpo lib/$(DEPDIR)/libgnu_a-wcwidth.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/wcwidth.c' object='lib/libgnu_a-wcwidth.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-wcwidth.obj `if test -f 'lib/wcwidth.c'; then $(CYGPATH_W) 'lib/wcwidth.c'; else $(CYGPATH_W) '$(srcdir)/lib/wcwidth.c'; fi` + +lib/libgnu_a-xsize.o: lib/xsize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-xsize.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-xsize.Tpo -c -o lib/libgnu_a-xsize.o `test -f 'lib/xsize.c' || echo '$(srcdir)/'`lib/xsize.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-xsize.Tpo lib/$(DEPDIR)/libgnu_a-xsize.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/xsize.c' object='lib/libgnu_a-xsize.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-xsize.o `test -f 'lib/xsize.c' || echo '$(srcdir)/'`lib/xsize.c + +lib/libgnu_a-xsize.obj: lib/xsize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-xsize.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-xsize.Tpo -c -o lib/libgnu_a-xsize.obj `if test -f 'lib/xsize.c'; then $(CYGPATH_W) 'lib/xsize.c'; else $(CYGPATH_W) '$(srcdir)/lib/xsize.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-xsize.Tpo lib/$(DEPDIR)/libgnu_a-xsize.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/xsize.c' object='lib/libgnu_a-xsize.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-xsize.obj `if test -f 'lib/xsize.c'; then $(CYGPATH_W) 'lib/xsize.c'; else $(CYGPATH_W) '$(srcdir)/lib/xsize.c'; fi` + +lib/libgnu_a-fprintf.o: lib/fprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fprintf.Tpo -c -o lib/libgnu_a-fprintf.o `test -f 'lib/fprintf.c' || echo '$(srcdir)/'`lib/fprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fprintf.Tpo lib/$(DEPDIR)/libgnu_a-fprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fprintf.c' object='lib/libgnu_a-fprintf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fprintf.o `test -f 'lib/fprintf.c' || echo '$(srcdir)/'`lib/fprintf.c + +lib/libgnu_a-fprintf.obj: lib/fprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-fprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-fprintf.Tpo -c -o lib/libgnu_a-fprintf.obj `if test -f 'lib/fprintf.c'; then $(CYGPATH_W) 'lib/fprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/fprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-fprintf.Tpo lib/$(DEPDIR)/libgnu_a-fprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/fprintf.c' object='lib/libgnu_a-fprintf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-fprintf.obj `if test -f 'lib/fprintf.c'; then $(CYGPATH_W) 'lib/fprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/fprintf.c'; fi` + +lib/libgnu_a-frexp.o: lib/frexp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexp.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexp.Tpo -c -o lib/libgnu_a-frexp.o `test -f 'lib/frexp.c' || echo '$(srcdir)/'`lib/frexp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexp.Tpo lib/$(DEPDIR)/libgnu_a-frexp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexp.c' object='lib/libgnu_a-frexp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexp.o `test -f 'lib/frexp.c' || echo '$(srcdir)/'`lib/frexp.c + +lib/libgnu_a-frexp.obj: lib/frexp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexp.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexp.Tpo -c -o lib/libgnu_a-frexp.obj `if test -f 'lib/frexp.c'; then $(CYGPATH_W) 'lib/frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexp.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexp.Tpo lib/$(DEPDIR)/libgnu_a-frexp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexp.c' object='lib/libgnu_a-frexp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexp.obj `if test -f 'lib/frexp.c'; then $(CYGPATH_W) 'lib/frexp.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexp.c'; fi` + +lib/libgnu_a-frexpl.o: lib/frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexpl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexpl.Tpo -c -o lib/libgnu_a-frexpl.o `test -f 'lib/frexpl.c' || echo '$(srcdir)/'`lib/frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-frexpl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexpl.c' object='lib/libgnu_a-frexpl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexpl.o `test -f 'lib/frexpl.c' || echo '$(srcdir)/'`lib/frexpl.c + +lib/libgnu_a-frexpl.obj: lib/frexpl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-frexpl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-frexpl.Tpo -c -o lib/libgnu_a-frexpl.obj `if test -f 'lib/frexpl.c'; then $(CYGPATH_W) 'lib/frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexpl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-frexpl.Tpo lib/$(DEPDIR)/libgnu_a-frexpl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/frexpl.c' object='lib/libgnu_a-frexpl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-frexpl.obj `if test -f 'lib/frexpl.c'; then $(CYGPATH_W) 'lib/frexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/frexpl.c'; fi` + +lib/libgnu_a-isnan.o: lib/isnan.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnan.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnan.Tpo -c -o lib/libgnu_a-isnan.o `test -f 'lib/isnan.c' || echo '$(srcdir)/'`lib/isnan.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnan.Tpo lib/$(DEPDIR)/libgnu_a-isnan.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnan.c' object='lib/libgnu_a-isnan.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnan.o `test -f 'lib/isnan.c' || echo '$(srcdir)/'`lib/isnan.c + +lib/libgnu_a-isnan.obj: lib/isnan.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnan.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnan.Tpo -c -o lib/libgnu_a-isnan.obj `if test -f 'lib/isnan.c'; then $(CYGPATH_W) 'lib/isnan.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnan.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnan.Tpo lib/$(DEPDIR)/libgnu_a-isnan.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnan.c' object='lib/libgnu_a-isnan.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnan.obj `if test -f 'lib/isnan.c'; then $(CYGPATH_W) 'lib/isnan.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnan.c'; fi` + +lib/libgnu_a-isnand.o: lib/isnand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnand.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnand.Tpo -c -o lib/libgnu_a-isnand.o `test -f 'lib/isnand.c' || echo '$(srcdir)/'`lib/isnand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnand.Tpo lib/$(DEPDIR)/libgnu_a-isnand.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnand.c' object='lib/libgnu_a-isnand.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnand.o `test -f 'lib/isnand.c' || echo '$(srcdir)/'`lib/isnand.c + +lib/libgnu_a-isnand.obj: lib/isnand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnand.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnand.Tpo -c -o lib/libgnu_a-isnand.obj `if test -f 'lib/isnand.c'; then $(CYGPATH_W) 'lib/isnand.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnand.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnand.Tpo lib/$(DEPDIR)/libgnu_a-isnand.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnand.c' object='lib/libgnu_a-isnand.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnand.obj `if test -f 'lib/isnand.c'; then $(CYGPATH_W) 'lib/isnand.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnand.c'; fi` + +lib/libgnu_a-isnanf.o: lib/isnanf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanf.Tpo -c -o lib/libgnu_a-isnanf.o `test -f 'lib/isnanf.c' || echo '$(srcdir)/'`lib/isnanf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanf.Tpo lib/$(DEPDIR)/libgnu_a-isnanf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanf.c' object='lib/libgnu_a-isnanf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanf.o `test -f 'lib/isnanf.c' || echo '$(srcdir)/'`lib/isnanf.c + +lib/libgnu_a-isnanf.obj: lib/isnanf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanf.Tpo -c -o lib/libgnu_a-isnanf.obj `if test -f 'lib/isnanf.c'; then $(CYGPATH_W) 'lib/isnanf.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanf.Tpo lib/$(DEPDIR)/libgnu_a-isnanf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanf.c' object='lib/libgnu_a-isnanf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanf.obj `if test -f 'lib/isnanf.c'; then $(CYGPATH_W) 'lib/isnanf.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanf.c'; fi` + +lib/libgnu_a-isnanl.o: lib/isnanl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanl.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanl.Tpo -c -o lib/libgnu_a-isnanl.o `test -f 'lib/isnanl.c' || echo '$(srcdir)/'`lib/isnanl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanl.Tpo lib/$(DEPDIR)/libgnu_a-isnanl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanl.c' object='lib/libgnu_a-isnanl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanl.o `test -f 'lib/isnanl.c' || echo '$(srcdir)/'`lib/isnanl.c + +lib/libgnu_a-isnanl.obj: lib/isnanl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-isnanl.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-isnanl.Tpo -c -o lib/libgnu_a-isnanl.obj `if test -f 'lib/isnanl.c'; then $(CYGPATH_W) 'lib/isnanl.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-isnanl.Tpo lib/$(DEPDIR)/libgnu_a-isnanl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/isnanl.c' object='lib/libgnu_a-isnanl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-isnanl.obj `if test -f 'lib/isnanl.c'; then $(CYGPATH_W) 'lib/isnanl.c'; else $(CYGPATH_W) '$(srcdir)/lib/isnanl.c'; fi` + +lib/libgnu_a-snprintf.o: lib/snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-snprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-snprintf.Tpo -c -o lib/libgnu_a-snprintf.o `test -f 'lib/snprintf.c' || echo '$(srcdir)/'`lib/snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-snprintf.Tpo lib/$(DEPDIR)/libgnu_a-snprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/snprintf.c' object='lib/libgnu_a-snprintf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-snprintf.o `test -f 'lib/snprintf.c' || echo '$(srcdir)/'`lib/snprintf.c + +lib/libgnu_a-snprintf.obj: lib/snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-snprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-snprintf.Tpo -c -o lib/libgnu_a-snprintf.obj `if test -f 'lib/snprintf.c'; then $(CYGPATH_W) 'lib/snprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/snprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-snprintf.Tpo lib/$(DEPDIR)/libgnu_a-snprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/snprintf.c' object='lib/libgnu_a-snprintf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-snprintf.obj `if test -f 'lib/snprintf.c'; then $(CYGPATH_W) 'lib/snprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/snprintf.c'; fi` + +lib/libgnu_a-asnprintf.o: lib/asnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-asnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo -c -o lib/libgnu_a-asnprintf.o `test -f 'lib/asnprintf.c' || echo '$(srcdir)/'`lib/asnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo lib/$(DEPDIR)/libgnu_a-asnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/asnprintf.c' object='lib/libgnu_a-asnprintf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-asnprintf.o `test -f 'lib/asnprintf.c' || echo '$(srcdir)/'`lib/asnprintf.c + +lib/libgnu_a-asnprintf.obj: lib/asnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-asnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo -c -o lib/libgnu_a-asnprintf.obj `if test -f 'lib/asnprintf.c'; then $(CYGPATH_W) 'lib/asnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/asnprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-asnprintf.Tpo lib/$(DEPDIR)/libgnu_a-asnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/asnprintf.c' object='lib/libgnu_a-asnprintf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-asnprintf.obj `if test -f 'lib/asnprintf.c'; then $(CYGPATH_W) 'lib/asnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/asnprintf.c'; fi` + +lib/libgnu_a-printf-args.o: lib/printf-args.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-args.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-args.Tpo -c -o lib/libgnu_a-printf-args.o `test -f 'lib/printf-args.c' || echo '$(srcdir)/'`lib/printf-args.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-args.Tpo lib/$(DEPDIR)/libgnu_a-printf-args.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-args.c' object='lib/libgnu_a-printf-args.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-args.o `test -f 'lib/printf-args.c' || echo '$(srcdir)/'`lib/printf-args.c + +lib/libgnu_a-printf-args.obj: lib/printf-args.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-args.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-args.Tpo -c -o lib/libgnu_a-printf-args.obj `if test -f 'lib/printf-args.c'; then $(CYGPATH_W) 'lib/printf-args.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-args.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-args.Tpo lib/$(DEPDIR)/libgnu_a-printf-args.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-args.c' object='lib/libgnu_a-printf-args.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-args.obj `if test -f 'lib/printf-args.c'; then $(CYGPATH_W) 'lib/printf-args.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-args.c'; fi` + +lib/libgnu_a-printf-parse.o: lib/printf-parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-parse.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo -c -o lib/libgnu_a-printf-parse.o `test -f 'lib/printf-parse.c' || echo '$(srcdir)/'`lib/printf-parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo lib/$(DEPDIR)/libgnu_a-printf-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-parse.c' object='lib/libgnu_a-printf-parse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-parse.o `test -f 'lib/printf-parse.c' || echo '$(srcdir)/'`lib/printf-parse.c + +lib/libgnu_a-printf-parse.obj: lib/printf-parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-printf-parse.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo -c -o lib/libgnu_a-printf-parse.obj `if test -f 'lib/printf-parse.c'; then $(CYGPATH_W) 'lib/printf-parse.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-parse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-printf-parse.Tpo lib/$(DEPDIR)/libgnu_a-printf-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/printf-parse.c' object='lib/libgnu_a-printf-parse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-printf-parse.obj `if test -f 'lib/printf-parse.c'; then $(CYGPATH_W) 'lib/printf-parse.c'; else $(CYGPATH_W) '$(srcdir)/lib/printf-parse.c'; fi` + +lib/libgnu_a-vasnprintf.o: lib/vasnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vasnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo -c -o lib/libgnu_a-vasnprintf.o `test -f 'lib/vasnprintf.c' || echo '$(srcdir)/'`lib/vasnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vasnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vasnprintf.c' object='lib/libgnu_a-vasnprintf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vasnprintf.o `test -f 'lib/vasnprintf.c' || echo '$(srcdir)/'`lib/vasnprintf.c + +lib/libgnu_a-vasnprintf.obj: lib/vasnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vasnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo -c -o lib/libgnu_a-vasnprintf.obj `if test -f 'lib/vasnprintf.c'; then $(CYGPATH_W) 'lib/vasnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vasnprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vasnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vasnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vasnprintf.c' object='lib/libgnu_a-vasnprintf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vasnprintf.obj `if test -f 'lib/vasnprintf.c'; then $(CYGPATH_W) 'lib/vasnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vasnprintf.c'; fi` + +lib/libgnu_a-vsnprintf.o: lib/vsnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vsnprintf.o -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo -c -o lib/libgnu_a-vsnprintf.o `test -f 'lib/vsnprintf.c' || echo '$(srcdir)/'`lib/vsnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vsnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vsnprintf.c' object='lib/libgnu_a-vsnprintf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vsnprintf.o `test -f 'lib/vsnprintf.c' || echo '$(srcdir)/'`lib/vsnprintf.c + +lib/libgnu_a-vsnprintf.obj: lib/vsnprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -MT lib/libgnu_a-vsnprintf.obj -MD -MP -MF lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo -c -o lib/libgnu_a-vsnprintf.obj `if test -f 'lib/vsnprintf.c'; then $(CYGPATH_W) 'lib/vsnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vsnprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) lib/$(DEPDIR)/libgnu_a-vsnprintf.Tpo lib/$(DEPDIR)/libgnu_a-vsnprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib/vsnprintf.c' object='lib/libgnu_a-vsnprintf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_libgnu_a_CFLAGS) $(CFLAGS) -c -o lib/libgnu_a-vsnprintf.obj `if test -f 'lib/vsnprintf.c'; then $(CYGPATH_W) 'lib/vsnprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/vsnprintf.c'; fi` + +src/libs/libgroff/libgroff_a-getopt.o: src/libs/libgroff/getopt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.o `test -f 'src/libs/libgroff/getopt.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt.c + +src/libs/libgroff/libgroff_a-getopt.obj: src/libs/libgroff/getopt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt.c' object='src/libs/libgroff/libgroff_a-getopt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt.obj `if test -f 'src/libs/libgroff/getopt.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt.c'; fi` + +src/libs/libgroff/libgroff_a-getopt1.o: src/libs/libgroff/getopt1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt1.c' object='src/libs/libgroff/libgroff_a-getopt1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libs/libgroff/libgroff_a-getopt1.o `test -f 'src/libs/libgroff/getopt1.c' || echo '$(srcdir)/'`src/libs/libgroff/getopt1.c + +src/libs/libgroff/libgroff_a-getopt1.obj: src/libs/libgroff/getopt1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libs/libgroff/libgroff_a-getopt1.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo -c -o src/libs/libgroff/libgroff_a-getopt1.obj `if test -f 'src/libs/libgroff/getopt1.c'; then $(CYGPATH_W) 'src/libs/libgroff/getopt1.c'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/getopt1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-getopt1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/libs/libgroff/getopt1.c' object='src/libs/libgroff/libgroff_a-getopt1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @@ -7508,20 +8541,6 @@ src/libs/libgroff/libgroff_a-nametoindex.obj: src/libs/libgroff/nametoindex.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-nametoindex.obj `if test -f 'src/libs/libgroff/nametoindex.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/nametoindex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/nametoindex.cpp'; fi` -src/libs/libgroff/libgroff_a-new.o: src/libs/libgroff/new.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp - -src/libs/libgroff/libgroff_a-new.obj: src/libs/libgroff/new.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi` - src/libs/libgroff/libgroff_a-paper.o: src/libs/libgroff/paper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-paper.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo -c -o src/libs/libgroff/libgroff_a-paper.o `test -f 'src/libs/libgroff/paper.cpp' || echo '$(srcdir)/'`src/libs/libgroff/paper.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-paper.Po @@ -7704,6 +8723,20 @@ src/libs/libgroff/libgroff_a-uniuni.obj: src/libs/libgroff/uniuni.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-uniuni.obj `if test -f 'src/libs/libgroff/uniuni.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/uniuni.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/uniuni.cpp'; fi` +src/libs/libgroff/libgroff_a-new.o: src/libs/libgroff/new.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.o `test -f 'src/libs/libgroff/new.cpp' || echo '$(srcdir)/'`src/libs/libgroff/new.cpp + +src/libs/libgroff/libgroff_a-new.obj: src/libs/libgroff/new.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-new.obj -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-new.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/libs/libgroff/new.cpp' object='src/libs/libgroff/libgroff_a-new.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libs/libgroff/libgroff_a-new.obj `if test -f 'src/libs/libgroff/new.cpp'; then $(CYGPATH_W) 'src/libs/libgroff/new.cpp'; else $(CYGPATH_W) '$(srcdir)/src/libs/libgroff/new.cpp'; fi` + src/libs/libgroff/libgroff_a-version.o: src/libs/libgroff/version.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgroff_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libs/libgroff/libgroff_a-version.o -MD -MP -MF src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo -c -o src/libs/libgroff/libgroff_a-version.o `test -f 'src/libs/libgroff/version.cpp' || echo '$(srcdir)/'`src/libs/libgroff/version.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Tpo src/libs/libgroff/$(DEPDIR)/libgroff_a-version.Po @@ -8235,90 +9268,90 @@ uninstall-man7: } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir) -install-devX10012fontDATA: $(devX10012font_DATA) +install-devX100_12_fontDATA: $(devX100_12_font_DATA) @$(NORMAL_INSTALL) - @list='$(devX10012font_DATA)'; test -n "$(devX10012fontdir)" || list=; \ + @list='$(devX100_12_font_DATA)'; test -n "$(devX100_12_fontdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(devX10012fontdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(devX10012fontdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(devX100_12_fontdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devX100_12_fontdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX10012fontdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(devX10012fontdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX100_12_fontdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devX100_12_fontdir)" || exit $$?; \ done -uninstall-devX10012fontDATA: +uninstall-devX100_12_fontDATA: @$(NORMAL_UNINSTALL) - @list='$(devX10012font_DATA)'; test -n "$(devX10012fontdir)" || list=; \ + @list='$(devX100_12_font_DATA)'; test -n "$(devX100_12_fontdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(devX10012fontdir)'; $(am__uninstall_files_from_dir) -install-devX100fontDATA: $(devX100font_DATA) + dir='$(DESTDIR)$(devX100_12_fontdir)'; $(am__uninstall_files_from_dir) +install-devX100_fontDATA: $(devX100_font_DATA) @$(NORMAL_INSTALL) - @list='$(devX100font_DATA)'; test -n "$(devX100fontdir)" || list=; \ + @list='$(devX100_font_DATA)'; test -n "$(devX100_fontdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(devX100fontdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(devX100fontdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(devX100_fontdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devX100_fontdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX100fontdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(devX100fontdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX100_fontdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devX100_fontdir)" || exit $$?; \ done -uninstall-devX100fontDATA: +uninstall-devX100_fontDATA: @$(NORMAL_UNINSTALL) - @list='$(devX100font_DATA)'; test -n "$(devX100fontdir)" || list=; \ + @list='$(devX100_font_DATA)'; test -n "$(devX100_fontdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(devX100fontdir)'; $(am__uninstall_files_from_dir) -install-devX7512fontDATA: $(devX7512font_DATA) + dir='$(DESTDIR)$(devX100_fontdir)'; $(am__uninstall_files_from_dir) +install-devX75_12_fontDATA: $(devX75_12_font_DATA) @$(NORMAL_INSTALL) - @list='$(devX7512font_DATA)'; test -n "$(devX7512fontdir)" || list=; \ + @list='$(devX75_12_font_DATA)'; test -n "$(devX75_12_fontdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(devX7512fontdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(devX7512fontdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(devX75_12_fontdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devX75_12_fontdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX7512fontdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(devX7512fontdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX75_12_fontdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devX75_12_fontdir)" || exit $$?; \ done -uninstall-devX7512fontDATA: +uninstall-devX75_12_fontDATA: @$(NORMAL_UNINSTALL) - @list='$(devX7512font_DATA)'; test -n "$(devX7512fontdir)" || list=; \ + @list='$(devX75_12_font_DATA)'; test -n "$(devX75_12_fontdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(devX7512fontdir)'; $(am__uninstall_files_from_dir) -install-devX75fontDATA: $(devX75font_DATA) + dir='$(DESTDIR)$(devX75_12_fontdir)'; $(am__uninstall_files_from_dir) +install-devX75_fontDATA: $(devX75_font_DATA) @$(NORMAL_INSTALL) - @list='$(devX75font_DATA)'; test -n "$(devX75fontdir)" || list=; \ + @list='$(devX75_font_DATA)'; test -n "$(devX75_fontdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(devX75fontdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(devX75fontdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(devX75_fontdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devX75_fontdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX75fontdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(devX75fontdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devX75_fontdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devX75_fontdir)" || exit $$?; \ done -uninstall-devX75fontDATA: +uninstall-devX75_fontDATA: @$(NORMAL_UNINSTALL) - @list='$(devX75font_DATA)'; test -n "$(devX75fontdir)" || list=; \ + @list='$(devX75_font_DATA)'; test -n "$(devX75_fontdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(devX75fontdir)'; $(am__uninstall_files_from_dir) + dir='$(DESTDIR)$(devX75_fontdir)'; $(am__uninstall_files_from_dir) install-devasciifontDATA: $(devasciifont_DATA) @$(NORMAL_INSTALL) @list='$(devasciifont_DATA)'; test -n "$(devasciifontdir)" || list=; \ @@ -8697,111 +9730,90 @@ uninstall-dist_docexamplesDATA: @list='$(dist_docexamples_DATA)'; test -n "$(docexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docexamplesdir)'; $(am__uninstall_files_from_dir) -install-dist_glilypondDATA: $(dist_glilypond_DATA) - @$(NORMAL_INSTALL) - @list='$(dist_glilypond_DATA)'; test -n "$(glilyponddir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(glilyponddir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(glilyponddir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(glilyponddir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(glilyponddir)" || exit $$?; \ - done - -uninstall-dist_glilypondDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_glilypond_DATA)'; test -n "$(glilyponddir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(glilyponddir)'; $(am__uninstall_files_from_dir) -install-dist_gpinyinDATA: $(dist_gpinyin_DATA) +install-dist_hdtblexampleDATA: $(dist_hdtblexample_DATA) @$(NORMAL_INSTALL) - @list='$(dist_gpinyin_DATA)'; test -n "$(gpinyindir)" || list=; \ + @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(gpinyindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(gpinyindir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(hdtblexampledir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(hdtblexampledir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gpinyindir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(gpinyindir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtblexampledir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtblexampledir)" || exit $$?; \ done -uninstall-dist_gpinyinDATA: +uninstall-dist_hdtblexampleDATA: @$(NORMAL_UNINSTALL) - @list='$(dist_gpinyin_DATA)'; test -n "$(gpinyindir)" || list=; \ + @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(gpinyindir)'; $(am__uninstall_files_from_dir) -install-dist_grogDATA: $(dist_grog_DATA) + dir='$(DESTDIR)$(hdtblexampledir)'; $(am__uninstall_files_from_dir) +install-dist_hdtbltmacDATA: $(dist_hdtbltmac_DATA) @$(NORMAL_INSTALL) - @list='$(dist_grog_DATA)'; test -n "$(grogdir)" || list=; \ + @list='$(dist_hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(grogdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(grogdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(hdtbltmacdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(hdtbltmacdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(grogdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(grogdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtbltmacdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtbltmacdir)" || exit $$?; \ done -uninstall-dist_grogDATA: +uninstall-dist_hdtbltmacDATA: @$(NORMAL_UNINSTALL) - @list='$(dist_grog_DATA)'; test -n "$(grogdir)" || list=; \ + @list='$(dist_hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(grogdir)'; $(am__uninstall_files_from_dir) -install-dist_hdtblexampleDATA: $(dist_hdtblexample_DATA) + dir='$(DESTDIR)$(hdtbltmacdir)'; $(am__uninstall_files_from_dir) +install-dist_localtmacDATA: $(dist_localtmac_DATA) @$(NORMAL_INSTALL) - @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \ + @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(hdtblexampledir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(hdtblexampledir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(localtmacdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(localtmacdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtblexampledir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtblexampledir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(localtmacdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(localtmacdir)" || exit $$?; \ done -uninstall-dist_hdtblexampleDATA: +uninstall-dist_localtmacDATA: @$(NORMAL_UNINSTALL) - @list='$(dist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \ + @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(hdtblexampledir)'; $(am__uninstall_files_from_dir) -install-dist_localtmacDATA: $(dist_localtmac_DATA) + dir='$(DESTDIR)$(localtmacdir)'; $(am__uninstall_files_from_dir) +install-dist_mdocDATA: $(dist_mdoc_DATA) @$(NORMAL_INSTALL) - @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \ + @list='$(dist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(localtmacdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(localtmacdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(mdocdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mdocdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(localtmacdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(localtmacdir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mdocdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mdocdir)" || exit $$?; \ done -uninstall-dist_localtmacDATA: +uninstall-dist_mdocDATA: @$(NORMAL_UNINSTALL) - @list='$(dist_localtmac_DATA)'; test -n "$(localtmacdir)" || list=; \ + @list='$(dist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(localtmacdir)'; $(am__uninstall_files_from_dir) + dir='$(DESTDIR)$(mdocdir)'; $(am__uninstall_files_from_dir) install-dist_mmDATA: $(dist_mm_DATA) @$(NORMAL_INSTALL) @list='$(dist_mm_DATA)'; test -n "$(mmdir)" || list=; \ @@ -8949,6 +9961,48 @@ uninstall-dist_pdfmarktmacDATA: @list='$(dist_pdfmarktmac_DATA)'; test -n "$(pdfmarktmacdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pdfmarktmacdir)'; $(am__uninstall_files_from_dir) +install-dist_rfc1345tmacDATA: $(dist_rfc1345tmac_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_rfc1345tmac_DATA)'; test -n "$(rfc1345tmacdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(rfc1345tmacdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(rfc1345tmacdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(rfc1345tmacdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(rfc1345tmacdir)" || exit $$?; \ + done + +uninstall-dist_rfc1345tmacDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_rfc1345tmac_DATA)'; test -n "$(rfc1345tmacdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(rfc1345tmacdir)'; $(am__uninstall_files_from_dir) +install-dist_sboxestmacDATA: $(dist_sboxestmac_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_sboxestmac_DATA)'; test -n "$(sboxestmacdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sboxestmacdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sboxestmacdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxestmacdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxestmacdir)" || exit $$?; \ + done + +uninstall-dist_sboxestmacDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_sboxestmac_DATA)'; test -n "$(sboxestmacdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(sboxestmacdir)'; $(am__uninstall_files_from_dir) install-dist_tmacDATA: $(dist_tmac_DATA) @$(NORMAL_INSTALL) @list='$(dist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \ @@ -8991,70 +10045,7 @@ uninstall-dist_tmacmmDATA: @list='$(dist_tmacmm_DATA)'; test -n "$(tmacmmdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tmacmmdir)'; $(am__uninstall_files_from_dir) -install-grofferDATA: $(groffer_DATA) - @$(NORMAL_INSTALL) - @list='$(groffer_DATA)'; test -n "$(grofferdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(grofferdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(grofferdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(grofferdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(grofferdir)" || exit $$?; \ - done - -uninstall-grofferDATA: - @$(NORMAL_UNINSTALL) - @list='$(groffer_DATA)'; test -n "$(grofferdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(grofferdir)'; $(am__uninstall_files_from_dir) -install-groffoptsDATA: $(groffopts_DATA) - @$(NORMAL_INSTALL) - @list='$(groffopts_DATA)'; test -n "$(groffoptsdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(groffoptsdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(groffoptsdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(groffoptsdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(groffoptsdir)" || exit $$?; \ - done - -uninstall-groffoptsDATA: - @$(NORMAL_UNINSTALL) - @list='$(groffopts_DATA)'; test -n "$(groffoptsdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(groffoptsdir)'; $(am__uninstall_files_from_dir) -install-hdtbltmacDATA: $(hdtbltmac_DATA) - @$(NORMAL_INSTALL) - @list='$(hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(hdtbltmacdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(hdtbltmacdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hdtbltmacdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(hdtbltmacdir)" || exit $$?; \ - done - -uninstall-hdtbltmacDATA: - @$(NORMAL_UNINSTALL) - @list='$(hdtbltmac_DATA)'; test -n "$(hdtbltmacdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(hdtbltmacdir)'; $(am__uninstall_files_from_dir) -install-htmlpicDATA: $(htmlpic_DATA) +install-htmlpicDATA: $(htmlpic_DATA) @$(NORMAL_INSTALL) @list='$(htmlpic_DATA)'; test -n "$(htmlpicdir)" || list=; \ if test -n "$$list"; then \ @@ -9243,48 +10234,6 @@ uninstall-nodist_hdtblexampleDATA: @list='$(nodist_hdtblexample_DATA)'; test -n "$(hdtblexampledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(hdtblexampledir)'; $(am__uninstall_files_from_dir) -install-nodist_htmlexamplesDATA: $(nodist_htmlexamples_DATA) - @$(NORMAL_INSTALL) - @list='$(nodist_htmlexamples_DATA)'; test -n "$(htmlexamplesdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(htmlexamplesdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(htmlexamplesdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmlexamplesdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(htmlexamplesdir)" || exit $$?; \ - done - -uninstall-nodist_htmlexamplesDATA: - @$(NORMAL_UNINSTALL) - @list='$(nodist_htmlexamples_DATA)'; test -n "$(htmlexamplesdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(htmlexamplesdir)'; $(am__uninstall_files_from_dir) -install-nodist_mdocDATA: $(nodist_mdoc_DATA) - @$(NORMAL_INSTALL) - @list='$(nodist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(mdocdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(mdocdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mdocdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(mdocdir)" || exit $$?; \ - done - -uninstall-nodist_mdocDATA: - @$(NORMAL_UNINSTALL) - @list='$(nodist_mdoc_DATA)'; test -n "$(mdocdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(mdocdir)'; $(am__uninstall_files_from_dir) install-nodist_momprocessedexampleDATA: $(nodist_momprocessedexample_DATA) @$(NORMAL_INSTALL) @list='$(nodist_momprocessedexample_DATA)'; test -n "$(momprocessedexampledir)" || list=; \ @@ -9348,6 +10297,48 @@ uninstall-nodist_pdfmarkpdfdocDATA: @list='$(nodist_pdfmarkpdfdoc_DATA)'; test -n "$(pdfmarkpdfdocdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pdfmarkpdfdocdir)'; $(am__uninstall_files_from_dir) +install-nodist_sboxesotherdocDATA: $(nodist_sboxesotherdoc_DATA) + @$(NORMAL_INSTALL) + @list='$(nodist_sboxesotherdoc_DATA)'; test -n "$(sboxesotherdocdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sboxesotherdocdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sboxesotherdocdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxesotherdocdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxesotherdocdir)" || exit $$?; \ + done + +uninstall-nodist_sboxesotherdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(nodist_sboxesotherdoc_DATA)'; test -n "$(sboxesotherdocdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(sboxesotherdocdir)'; $(am__uninstall_files_from_dir) +install-nodist_sboxespdfdocDATA: $(nodist_sboxespdfdoc_DATA) + @$(NORMAL_INSTALL) + @list='$(nodist_sboxespdfdoc_DATA)'; test -n "$(sboxespdfdocdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sboxespdfdocdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sboxespdfdocdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sboxespdfdocdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(sboxespdfdocdir)" || exit $$?; \ + done + +uninstall-nodist_sboxespdfdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(nodist_sboxespdfdoc_DATA)'; test -n "$(sboxespdfdocdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(sboxespdfdocdir)'; $(am__uninstall_files_from_dir) install-nodist_tmacDATA: $(nodist_tmac_DATA) @$(NORMAL_INSTALL) @list='$(nodist_tmac_DATA)'; test -n "$(tmacdir)" || list=; \ @@ -9536,7 +10527,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ @@ -9570,23 +10561,1150 @@ recheck: all $(check_PROGRAMS) $(check_SCRIPTS) am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? -contrib/gdiffmk/tests/gdiffmk_tests.sh.log: contrib/gdiffmk/tests/gdiffmk_tests.sh - @p='contrib/gdiffmk/tests/gdiffmk_tests.sh'; \ - b='contrib/gdiffmk/tests/gdiffmk_tests.sh'; \ +contrib/gdiffmk/tests/runtests.sh.log: contrib/gdiffmk/tests/runtests.sh + @p='contrib/gdiffmk/tests/runtests.sh'; \ + b='contrib/gdiffmk/tests/runtests.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/hdtbl/examples/test-hdtbl.sh.log: contrib/hdtbl/examples/test-hdtbl.sh + @p='contrib/hdtbl/examples/test-hdtbl.sh'; \ + b='contrib/hdtbl/examples/test-hdtbl.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/LT_SP_AU_without_AT_works.sh.log: contrib/mm/tests/LT_SP_AU_without_AT_works.sh + @p='contrib/mm/tests/LT_SP_AU_without_AT_works.sh'; \ + b='contrib/mm/tests/LT_SP_AU_without_AT_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh.log: contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh + @p='contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh'; \ + b='contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/MT-1-reports-all-TM-numbers.sh.log: contrib/mm/tests/MT-1-reports-all-TM-numbers.sh + @p='contrib/mm/tests/MT-1-reports-all-TM-numbers.sh'; \ + b='contrib/mm/tests/MT-1-reports-all-TM-numbers.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/MT_5_includes_AT_in_SG.sh.log: contrib/mm/tests/MT_5_includes_AT_in_SG.sh + @p='contrib/mm/tests/MT_5_includes_AT_in_SG.sh'; \ + b='contrib/mm/tests/MT_5_includes_AT_in_SG.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/P-indentation-works.sh.log: contrib/mm/tests/P-indentation-works.sh + @p='contrib/mm/tests/P-indentation-works.sh'; \ + b='contrib/mm/tests/P-indentation-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh.log: contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh + @p='contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh'; \ + b='contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/mse_has-sufficient-footnote-space.sh.log: contrib/mm/tests/mse_has-sufficient-footnote-space.sh + @p='contrib/mm/tests/mse_has-sufficient-footnote-space.sh'; \ + b='contrib/mm/tests/mse_has-sufficient-footnote-space.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/place-equation-labels-correctly-in-displays.sh.log: contrib/mm/tests/place-equation-labels-correctly-in-displays.sh + @p='contrib/mm/tests/place-equation-labels-correctly-in-displays.sh'; \ + b='contrib/mm/tests/place-equation-labels-correctly-in-displays.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/remove-stale-bib-entry-data.sh.log: contrib/mm/tests/remove-stale-bib-entry-data.sh + @p='contrib/mm/tests/remove-stale-bib-entry-data.sh'; \ + b='contrib/mm/tests/remove-stale-bib-entry-data.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mm/tests/short-pages-do-not-overflow-stack.sh.log: contrib/mm/tests/short-pages-do-not-overflow-stack.sh + @p='contrib/mm/tests/short-pages-do-not-overflow-stack.sh'; \ + b='contrib/mm/tests/short-pages-do-not-overflow-stack.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/mom/examples/tests-mom.sh.log: contrib/mom/examples/tests-mom.sh + @p='contrib/mom/examples/tests-mom.sh'; \ + b='contrib/mom/examples/tests-mom.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +contrib/rfc1345/tests/rfc1345-smoke-test.sh.log: contrib/rfc1345/tests/rfc1345-smoke-test.sh + @p='contrib/rfc1345/tests/rfc1345-smoke-test.sh'; \ + b='contrib/rfc1345/tests/rfc1345-smoke-test.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +font/devpdf/tests/check-default-foundry.sh.log: font/devpdf/tests/check-default-foundry.sh + @p='font/devpdf/tests/check-default-foundry.sh'; \ + b='font/devpdf/tests/check-default-foundry.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +font/devpdf/tests/check-urw-foundry.sh.log: font/devpdf/tests/check-urw-foundry.sh + @p='font/devpdf/tests/check-urw-foundry.sh'; \ + b='font/devpdf/tests/check-urw-foundry.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh.log: src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh + @p='src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh'; \ + b='src/devices/grotty/tests/basic_latin_glyphs_map_correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/devices/grotty/tests/osc8_works.sh.log: src/devices/grotty/tests/osc8_works.sh + @p='src/devices/grotty/tests/osc8_works.sh'; \ + b='src/devices/grotty/tests/osc8_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh.log: src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh + @p='src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh'; \ + b='src/preproc/eqn/tests/diagnostics-report-correct-line-numbers.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/preconv/tests/do-not-seek-the-unseekable.sh.log: src/preproc/preconv/tests/do-not-seek-the-unseekable.sh + @p='src/preproc/preconv/tests/do-not-seek-the-unseekable.sh'; \ + b='src/preproc/preconv/tests/do-not-seek-the-unseekable.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/preconv/tests/smoke-test.sh.log: src/preproc/preconv/tests/smoke-test.sh + @p='src/preproc/preconv/tests/smoke-test.sh'; \ + b='src/preproc/preconv/tests/smoke-test.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/refer/tests/report-correct-line-numbers.sh.log: src/preproc/refer/tests/report-correct-line-numbers.sh + @p='src/preproc/refer/tests/report-correct-line-numbers.sh'; \ + b='src/preproc/refer/tests/report-correct-line-numbers.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/boxes-and-vertical-rules.sh.log: src/preproc/tbl/tests/boxes-and-vertical-rules.sh + @p='src/preproc/tbl/tests/boxes-and-vertical-rules.sh'; \ + b='src/preproc/tbl/tests/boxes-and-vertical-rules.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/check-horizontal-line-length.sh.log: src/preproc/tbl/tests/check-horizontal-line-length.sh + @p='src/preproc/tbl/tests/check-horizontal-line-length.sh'; \ + b='src/preproc/tbl/tests/check-horizontal-line-length.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/check-line-intersections.sh.log: src/preproc/tbl/tests/check-line-intersections.sh + @p='src/preproc/tbl/tests/check-line-intersections.sh'; \ + b='src/preproc/tbl/tests/check-line-intersections.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/check-vertical-line-length.sh.log: src/preproc/tbl/tests/check-vertical-line-length.sh + @p='src/preproc/tbl/tests/check-vertical-line-length.sh'; \ + b='src/preproc/tbl/tests/check-vertical-line-length.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/cooperate-with-nm-request.sh.log: src/preproc/tbl/tests/cooperate-with-nm-request.sh + @p='src/preproc/tbl/tests/cooperate-with-nm-request.sh'; \ + b='src/preproc/tbl/tests/cooperate-with-nm-request.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/count-continued-input-lines.sh.log: src/preproc/tbl/tests/count-continued-input-lines.sh + @p='src/preproc/tbl/tests/count-continued-input-lines.sh'; \ + b='src/preproc/tbl/tests/count-continued-input-lines.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh.log: src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh + @p='src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh'; \ + b='src/preproc/tbl/tests/do-not-overdraw-page-top-in-nroff-mode.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh.log: src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh + @p='src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh'; \ + b='src/preproc/tbl/tests/do-not-overlap-bottom-border-in-nroff.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh.log: src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh + @p='src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh'; \ + b='src/preproc/tbl/tests/do-not-segv-on-invalid-vertical-span-entry.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh.log: src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh + @p='src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh'; \ + b='src/preproc/tbl/tests/do-not-segv-when-backslash-R-in-text-block.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/expand-region-option-works.sh.log: src/preproc/tbl/tests/expand-region-option-works.sh + @p='src/preproc/tbl/tests/expand-region-option-works.sh'; \ + b='src/preproc/tbl/tests/expand-region-option-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/format-time-diagnostics-work.sh.log: src/preproc/tbl/tests/format-time-diagnostics-work.sh + @p='src/preproc/tbl/tests/format-time-diagnostics-work.sh'; \ + b='src/preproc/tbl/tests/format-time-diagnostics-work.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh.log: src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh + @p='src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh'; \ + b='src/preproc/tbl/tests/save-and-restore-hyphenation-parameters.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh.log: src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh + @p='src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh'; \ + b='src/preproc/tbl/tests/save-and-restore-inter-sentence-space.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/save-and-restore-line-numbering.sh.log: src/preproc/tbl/tests/save-and-restore-line-numbering.sh + @p='src/preproc/tbl/tests/save-and-restore-line-numbering.sh'; \ + b='src/preproc/tbl/tests/save-and-restore-line-numbering.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/save-and-restore-tab-stops.sh.log: src/preproc/tbl/tests/save-and-restore-tab-stops.sh + @p='src/preproc/tbl/tests/save-and-restore-tab-stops.sh'; \ + b='src/preproc/tbl/tests/save-and-restore-tab-stops.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh.log: src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh + @p='src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh'; \ + b='src/preproc/tbl/tests/warn-on-long-boxed-unkept-table.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/preproc/tbl/tests/x-column-modifier-works.sh.log: src/preproc/tbl/tests/x-column-modifier-works.sh + @p='src/preproc/tbl/tests/x-column-modifier-works.sh'; \ + b='src/preproc/tbl/tests/x-column-modifier-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/ab_works.sh.log: src/roff/groff/tests/ab_works.sh + @p='src/roff/groff/tests/ab_works.sh'; \ + b='src/roff/groff/tests/ab_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/adjustment_works.sh.log: src/roff/groff/tests/adjustment_works.sh + @p='src/roff/groff/tests/adjustment_works.sh'; \ + b='src/roff/groff/tests/adjustment_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/break_zero-length_output_line_sanely.sh.log: src/roff/groff/tests/break_zero-length_output_line_sanely.sh + @p='src/roff/groff/tests/break_zero-length_output_line_sanely.sh'; \ + b='src/roff/groff/tests/break_zero-length_output_line_sanely.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/device_control_escapes_express_basic_latin.sh.log: src/roff/groff/tests/device_control_escapes_express_basic_latin.sh + @p='src/roff/groff/tests/device_control_escapes_express_basic_latin.sh'; \ + b='src/roff/groff/tests/device_control_escapes_express_basic_latin.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh.log: src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh + @p='src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh'; \ + b='src/roff/groff/tests/do_not_loop_infinitely_when_breaking_cjk.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/dot-cp_register_works.sh.log: src/roff/groff/tests/dot-cp_register_works.sh + @p='src/roff/groff/tests/dot-cp_register_works.sh'; \ + b='src/roff/groff/tests/dot-cp_register_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/dot-nm_register_works.sh.log: src/roff/groff/tests/dot-nm_register_works.sh + @p='src/roff/groff/tests/dot-nm_register_works.sh'; \ + b='src/roff/groff/tests/dot-nm_register_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/dot-nn_register_works.sh.log: src/roff/groff/tests/dot-nn_register_works.sh + @p='src/roff/groff/tests/dot-nn_register_works.sh'; \ + b='src/roff/groff/tests/dot-nn_register_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/evc_produces_no_output_if_invalid.sh.log: src/roff/groff/tests/evc_produces_no_output_if_invalid.sh + @p='src/roff/groff/tests/evc_produces_no_output_if_invalid.sh'; \ + b='src/roff/groff/tests/evc_produces_no_output_if_invalid.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/fp_should_not_traverse_directories.sh.log: src/roff/groff/tests/fp_should_not_traverse_directories.sh + @p='src/roff/groff/tests/fp_should_not_traverse_directories.sh'; \ + b='src/roff/groff/tests/fp_should_not_traverse_directories.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/handle_special_input_code_points.sh.log: src/roff/groff/tests/handle_special_input_code_points.sh + @p='src/roff/groff/tests/handle_special_input_code_points.sh'; \ + b='src/roff/groff/tests/handle_special_input_code_points.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/html_works_with_grn_and_eqn.sh.log: src/roff/groff/tests/html_works_with_grn_and_eqn.sh + @p='src/roff/groff/tests/html_works_with_grn_and_eqn.sh'; \ + b='src/roff/groff/tests/html_works_with_grn_and_eqn.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/initialization_is_quiet.sh.log: src/roff/groff/tests/initialization_is_quiet.sh + @p='src/roff/groff/tests/initialization_is_quiet.sh'; \ + b='src/roff/groff/tests/initialization_is_quiet.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/localization_works.sh.log: src/roff/groff/tests/localization_works.sh + @p='src/roff/groff/tests/localization_works.sh'; \ + b='src/roff/groff/tests/localization_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/msoquiet_works.sh.log: src/roff/groff/tests/msoquiet_works.sh + @p='src/roff/groff/tests/msoquiet_works.sh'; \ + b='src/roff/groff/tests/msoquiet_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh.log: src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh + @p='src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh'; \ + b='src/roff/groff/tests/on_latin1_device_oq_is_0x27.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/output_driver_C_and_G_options_work.sh.log: src/roff/groff/tests/output_driver_C_and_G_options_work.sh + @p='src/roff/groff/tests/output_driver_C_and_G_options_work.sh'; \ + b='src/roff/groff/tests/output_driver_C_and_G_options_work.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/recognize_end_of_sentence.sh.log: src/roff/groff/tests/recognize_end_of_sentence.sh + @p='src/roff/groff/tests/recognize_end_of_sentence.sh'; \ + b='src/roff/groff/tests/recognize_end_of_sentence.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/regression_savannah_56555.sh.log: src/roff/groff/tests/regression_savannah_56555.sh + @p='src/roff/groff/tests/regression_savannah_56555.sh'; \ + b='src/roff/groff/tests/regression_savannah_56555.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/regression_savannah_58153.sh.log: src/roff/groff/tests/regression_savannah_58153.sh + @p='src/roff/groff/tests/regression_savannah_58153.sh'; \ + b='src/roff/groff/tests/regression_savannah_58153.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/regression_savannah_58162.sh.log: src/roff/groff/tests/regression_savannah_58162.sh + @p='src/roff/groff/tests/regression_savannah_58162.sh'; \ + b='src/roff/groff/tests/regression_savannah_58162.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/regression_savannah_58337.sh.log: src/roff/groff/tests/regression_savannah_58337.sh + @p='src/roff/groff/tests/regression_savannah_58337.sh'; \ + b='src/roff/groff/tests/regression_savannah_58337.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/regression_savannah_59202.sh.log: src/roff/groff/tests/regression_savannah_59202.sh + @p='src/roff/groff/tests/regression_savannah_59202.sh'; \ + b='src/roff/groff/tests/regression_savannah_59202.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/smoke-test_html_device.sh.log: src/roff/groff/tests/smoke-test_html_device.sh + @p='src/roff/groff/tests/smoke-test_html_device.sh'; \ + b='src/roff/groff/tests/smoke-test_html_device.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh.log: src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh + @p='src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh'; \ + b='src/roff/groff/tests/some_escapes_accept_newline_delimiters.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/soquiet_works.sh.log: src/roff/groff/tests/soquiet_works.sh + @p='src/roff/groff/tests/soquiet_works.sh'; \ + b='src/roff/groff/tests/soquiet_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/string_case_xform_errors.sh.log: src/roff/groff/tests/string_case_xform_errors.sh + @p='src/roff/groff/tests/string_case_xform_errors.sh'; \ + b='src/roff/groff/tests/string_case_xform_errors.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/string_case_xform_requests.sh.log: src/roff/groff/tests/string_case_xform_requests.sh + @p='src/roff/groff/tests/string_case_xform_requests.sh'; \ + b='src/roff/groff/tests/string_case_xform_requests.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/string_case_xform_unicode_escape.sh.log: src/roff/groff/tests/string_case_xform_unicode_escape.sh + @p='src/roff/groff/tests/string_case_xform_unicode_escape.sh'; \ + b='src/roff/groff/tests/string_case_xform_unicode_escape.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/substring_works.sh.log: src/roff/groff/tests/substring_works.sh + @p='src/roff/groff/tests/substring_works.sh'; \ + b='src/roff/groff/tests/substring_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh.log: src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh + @p='src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh'; \ + b='src/roff/groff/tests/use_point_size_escape_with_single_digit_arg.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/roff/nroff/tests/verbose_option_works.sh.log: src/roff/nroff/tests/verbose_option_works.sh + @p='src/roff/nroff/tests/verbose_option_works.sh'; \ + b='src/roff/nroff/tests/verbose_option_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/utils/grog/tests/PF-does-not-start-pic-region.sh.log: src/utils/grog/tests/PF-does-not-start-pic-region.sh + @p='src/utils/grog/tests/PF-does-not-start-pic-region.sh'; \ + b='src/utils/grog/tests/PF-does-not-start-pic-region.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/utils/grog/tests/avoid-refer-fakeout.sh.log: src/utils/grog/tests/avoid-refer-fakeout.sh + @p='src/utils/grog/tests/avoid-refer-fakeout.sh'; \ + b='src/utils/grog/tests/avoid-refer-fakeout.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/utils/grog/tests/preserve-groff-options.sh.log: src/utils/grog/tests/preserve-groff-options.sh + @p='src/utils/grog/tests/preserve-groff-options.sh'; \ + b='src/utils/grog/tests/preserve-groff-options.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/utils/grog/tests/recognize-perl-pod.sh.log: src/utils/grog/tests/recognize-perl-pod.sh + @p='src/utils/grog/tests/recognize-perl-pod.sh'; \ + b='src/utils/grog/tests/recognize-perl-pod.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/utils/grog/tests/smoke-test.sh.log: src/utils/grog/tests/smoke-test.sh + @p='src/utils/grog/tests/smoke-test.sh'; \ + b='src/utils/grog/tests/smoke-test.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an-ext_MR-works.sh.log: tmac/tests/an-ext_MR-works.sh + @p='tmac/tests/an-ext_MR-works.sh'; \ + b='tmac/tests/an-ext_MR-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an-ext_MT-works.sh.log: tmac/tests/an-ext_MT-works.sh + @p='tmac/tests/an-ext_MT-works.sh'; \ + b='tmac/tests/an-ext_MT-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an-ext_UR-works.sh.log: tmac/tests/an-ext_UR-works.sh + @p='tmac/tests/an-ext_UR-works.sh'; \ + b='tmac/tests/an-ext_UR-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh.log: tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh + @p='tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh'; \ + b='tmac/tests/an_AT-and-UC-footer-saved-and-restored.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CS-register-off.sh.log: tmac/tests/an_CS-register-off.sh + @p='tmac/tests/an_CS-register-off.sh'; \ + b='tmac/tests/an_CS-register-off.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CS-register-on.sh.log: tmac/tests/an_CS-register-on.sh + @p='tmac/tests/an_CS-register-on.sh'; \ + b='tmac/tests/an_CS-register-on.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CS-register-unspecified.sh.log: tmac/tests/an_CS-register-unspecified.sh + @p='tmac/tests/an_CS-register-unspecified.sh'; \ + b='tmac/tests/an_CS-register-unspecified.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CT-register-off.sh.log: tmac/tests/an_CT-register-off.sh + @p='tmac/tests/an_CT-register-off.sh'; \ + b='tmac/tests/an_CT-register-off.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CT-register-on.sh.log: tmac/tests/an_CT-register-on.sh + @p='tmac/tests/an_CT-register-on.sh'; \ + b='tmac/tests/an_CT-register-on.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_CT-register-unspecified.sh.log: tmac/tests/an_CT-register-unspecified.sh + @p='tmac/tests/an_CT-register-unspecified.sh'; \ + b='tmac/tests/an_CT-register-unspecified.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_FT-bad-value-should-not-trash-titles.sh.log: tmac/tests/an_FT-bad-value-should-not-trash-titles.sh + @p='tmac/tests/an_FT-bad-value-should-not-trash-titles.sh'; \ + b='tmac/tests/an_FT-bad-value-should-not-trash-titles.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_HY-register-works.sh.log: tmac/tests/an_HY-register-works.sh + @p='tmac/tests/an_HY-register-works.sh'; \ + b='tmac/tests/an_HY-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_LL-init-sanely.sh.log: tmac/tests/an_LL-init-sanely.sh + @p='tmac/tests/an_LL-init-sanely.sh'; \ + b='tmac/tests/an_LL-init-sanely.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_ME-punct-hyphenates.sh.log: tmac/tests/an_ME-punct-hyphenates.sh + @p='tmac/tests/an_ME-punct-hyphenates.sh'; \ + b='tmac/tests/an_ME-punct-hyphenates.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_MR-works.sh.log: tmac/tests/an_MR-works.sh + @p='tmac/tests/an_MR-works.sh'; \ + b='tmac/tests/an_MR-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_MT-body-hyphenates.sh.log: tmac/tests/an_MT-body-hyphenates.sh + @p='tmac/tests/an_MT-body-hyphenates.sh'; \ + b='tmac/tests/an_MT-body-hyphenates.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_MT-works.sh.log: tmac/tests/an_MT-works.sh + @p='tmac/tests/an_MT-works.sh'; \ + b='tmac/tests/an_MT-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_P-register-works.sh.log: tmac/tests/an_P-register-works.sh + @p='tmac/tests/an_P-register-works.sh'; \ + b='tmac/tests/an_P-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_TH-repairs-ad-damage.sh.log: tmac/tests/an_TH-repairs-ad-damage.sh + @p='tmac/tests/an_TH-repairs-ad-damage.sh'; \ + b='tmac/tests/an_TH-repairs-ad-damage.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_TH-repairs-hy-damage.sh.log: tmac/tests/an_TH-repairs-hy-damage.sh + @p='tmac/tests/an_TH-repairs-hy-damage.sh'; \ + b='tmac/tests/an_TH-repairs-hy-damage.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_TS-adds-no-vertical-space.sh.log: tmac/tests/an_TS-adds-no-vertical-space.sh + @p='tmac/tests/an_TS-adds-no-vertical-space.sh'; \ + b='tmac/tests/an_TS-adds-no-vertical-space.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh.log: tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh + @p='tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh'; \ + b='tmac/tests/an_TS-do-not-keep-tables-when-cR-set.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_UE-breaks-before-long-URIs.sh.log: tmac/tests/an_UE-breaks-before-long-URIs.sh + @p='tmac/tests/an_UE-breaks-before-long-URIs.sh'; \ + b='tmac/tests/an_UE-breaks-before-long-URIs.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_UE-punct-hyphenates.sh.log: tmac/tests/an_UE-punct-hyphenates.sh + @p='tmac/tests/an_UE-punct-hyphenates.sh'; \ + b='tmac/tests/an_UE-punct-hyphenates.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_UR-body-hyphenates.sh.log: tmac/tests/an_UR-body-hyphenates.sh + @p='tmac/tests/an_UR-body-hyphenates.sh'; \ + b='tmac/tests/an_UR-body-hyphenates.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_UR-works.sh.log: tmac/tests/an_UR-works.sh + @p='tmac/tests/an_UR-works.sh'; \ + b='tmac/tests/an_UR-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_X-register-works.sh.log: tmac/tests/an_X-register-works.sh + @p='tmac/tests/an_X-register-works.sh'; \ + b='tmac/tests/an_X-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_adjust-link-text-correctly.sh.log: tmac/tests/an_adjust-link-text-correctly.sh + @p='tmac/tests/an_adjust-link-text-correctly.sh'; \ + b='tmac/tests/an_adjust-link-text-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_avoid-two-font-denial-of-service.sh.log: tmac/tests/an_avoid-two-font-denial-of-service.sh + @p='tmac/tests/an_avoid-two-font-denial-of-service.sh'; \ + b='tmac/tests/an_avoid-two-font-denial-of-service.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh.log: tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh + @p='tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh'; \ + b='tmac/tests/an_do-not-abbreviate-escape-using-TH-arguments.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_font-remapping-does-not-affect-titles.sh.log: tmac/tests/an_font-remapping-does-not-affect-titles.sh + @p='tmac/tests/an_font-remapping-does-not-affect-titles.sh'; \ + b='tmac/tests/an_font-remapping-does-not-affect-titles.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_handle-degenerate-input-quietly.sh.log: tmac/tests/an_handle-degenerate-input-quietly.sh + @p='tmac/tests/an_handle-degenerate-input-quietly.sh'; \ + b='tmac/tests/an_handle-degenerate-input-quietly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_inner-footer-abbreviation-works.sh.log: tmac/tests/an_inner-footer-abbreviation-works.sh + @p='tmac/tests/an_inner-footer-abbreviation-works.sh'; \ + b='tmac/tests/an_inner-footer-abbreviation-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_link-macros-work-in-paragraph-tags.sh.log: tmac/tests/an_link-macros-work-in-paragraph-tags.sh + @p='tmac/tests/an_link-macros-work-in-paragraph-tags.sh'; \ + b='tmac/tests/an_link-macros-work-in-paragraph-tags.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_link-trailing-text-hugs-previous.sh.log: tmac/tests/an_link-trailing-text-hugs-previous.sh + @p='tmac/tests/an_link-trailing-text-hugs-previous.sh'; \ + b='tmac/tests/an_link-trailing-text-hugs-previous.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_no-break-after-short-paragraph-tags.sh.log: tmac/tests/an_no-break-after-short-paragraph-tags.sh + @p='tmac/tests/an_no-break-after-short-paragraph-tags.sh'; \ + b='tmac/tests/an_no-break-after-short-paragraph-tags.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_output-footer-when-continuously-rendering.sh.log: tmac/tests/an_output-footer-when-continuously-rendering.sh + @p='tmac/tests/an_output-footer-when-continuously-rendering.sh'; \ + b='tmac/tests/an_output-footer-when-continuously-rendering.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_page-footers-present.sh.log: tmac/tests/an_page-footers-present.sh + @p='tmac/tests/an_page-footers-present.sh'; \ + b='tmac/tests/an_page-footers-present.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_page-header-has-current-data.sh.log: tmac/tests/an_page-header-has-current-data.sh + @p='tmac/tests/an_page-header-has-current-data.sh'; \ + b='tmac/tests/an_page-header-has-current-data.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_reset-hyphenation-correctly.sh.log: tmac/tests/an_reset-hyphenation-correctly.sh + @p='tmac/tests/an_reset-hyphenation-correctly.sh'; \ + b='tmac/tests/an_reset-hyphenation-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_title-abbreviation-works.sh.log: tmac/tests/an_title-abbreviation-works.sh + @p='tmac/tests/an_title-abbreviation-works.sh'; \ + b='tmac/tests/an_title-abbreviation-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_use-input-traps-correctly.sh.log: tmac/tests/an_use-input-traps-correctly.sh + @p='tmac/tests/an_use-input-traps-correctly.sh'; \ + b='tmac/tests/an_use-input-traps-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/an_works-with-ec.sh.log: tmac/tests/an_works-with-ec.sh + @p='tmac/tests/an_works-with-ec.sh'; \ + b='tmac/tests/an_works-with-ec.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/andoc_P-register-works.sh.log: tmac/tests/andoc_P-register-works.sh + @p='tmac/tests/andoc_P-register-works.sh'; \ + b='tmac/tests/andoc_P-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/andoc_check-an-to-doc-transition.sh.log: tmac/tests/andoc_check-an-to-doc-transition.sh + @p='tmac/tests/andoc_check-an-to-doc-transition.sh'; \ + b='tmac/tests/andoc_check-an-to-doc-transition.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/andoc_clear-doc-traps.sh.log: tmac/tests/andoc_clear-doc-traps.sh + @p='tmac/tests/andoc_clear-doc-traps.sh'; \ + b='tmac/tests/andoc_clear-doc-traps.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/andoc_flush-between-packages.sh.log: tmac/tests/andoc_flush-between-packages.sh + @p='tmac/tests/andoc_flush-between-packages.sh'; \ + b='tmac/tests/andoc_flush-between-packages.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_CS-works.sh.log: tmac/tests/doc_CS-works.sh + @p='tmac/tests/doc_CS-works.sh'; \ + b='tmac/tests/doc_CS-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_CT-works.sh.log: tmac/tests/doc_CT-works.sh + @p='tmac/tests/doc_CT-works.sh'; \ + b='tmac/tests/doc_CT-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_D-places-page-numbers-correctly.sh.log: tmac/tests/doc_D-places-page-numbers-correctly.sh + @p='tmac/tests/doc_D-places-page-numbers-correctly.sh'; \ + b='tmac/tests/doc_D-places-page-numbers-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh.log: tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh + @p='tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh'; \ + b='tmac/tests/doc_Lk-respect-sentence-ending-punctuation.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_Mt-works.sh.log: tmac/tests/doc_Mt-works.sh + @p='tmac/tests/doc_Mt-works.sh'; \ + b='tmac/tests/doc_Mt-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_Nm-works.sh.log: tmac/tests/doc_Nm-works.sh + @p='tmac/tests/doc_Nm-works.sh'; \ + b='tmac/tests/doc_Nm-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_P-register-works.sh.log: tmac/tests/doc_P-register-works.sh + @p='tmac/tests/doc_P-register-works.sh'; \ + b='tmac/tests/doc_P-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_X-register-works.sh.log: tmac/tests/doc_X-register-works.sh + @p='tmac/tests/doc_X-register-works.sh'; \ + b='tmac/tests/doc_X-register-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_accept-mixed-case-section-headings.sh.log: tmac/tests/doc_accept-mixed-case-section-headings.sh + @p='tmac/tests/doc_accept-mixed-case-section-headings.sh'; \ + b='tmac/tests/doc_accept-mixed-case-section-headings.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) -contrib/hdtbl/examples/test-hdtbl.sh.log: contrib/hdtbl/examples/test-hdtbl.sh - @p='contrib/hdtbl/examples/test-hdtbl.sh'; \ - b='contrib/hdtbl/examples/test-hdtbl.sh'; \ +tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh.log: tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh + @p='tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh'; \ + b='tmac/tests/doc_do-not-loop-infinitely-when-shortening-headers.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) -contrib/mom/examples/tests-mom.sh.log: contrib/mom/examples/tests-mom.sh - @p='contrib/mom/examples/tests-mom.sh'; \ - b='contrib/mom/examples/tests-mom.sh'; \ +tmac/tests/doc_heading-font-remapping-works.sh.log: tmac/tests/doc_heading-font-remapping-works.sh + @p='tmac/tests/doc_heading-font-remapping-works.sh'; \ + b='tmac/tests/doc_heading-font-remapping-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_indents-correctly.sh.log: tmac/tests/doc_indents-correctly.sh + @p='tmac/tests/doc_indents-correctly.sh'; \ + b='tmac/tests/doc_indents-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_output-footer-when-continuously-rendering.sh.log: tmac/tests/doc_output-footer-when-continuously-rendering.sh + @p='tmac/tests/doc_output-footer-when-continuously-rendering.sh'; \ + b='tmac/tests/doc_output-footer-when-continuously-rendering.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/doc_smoke-test.sh.log: tmac/tests/doc_smoke-test.sh + @p='tmac/tests/doc_smoke-test.sh'; \ + b='tmac/tests/doc_smoke-test.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_chapter-titles-work.sh.log: tmac/tests/e_chapter-titles-work.sh + @p='tmac/tests/e_chapter-titles-work.sh'; \ + b='tmac/tests/e_chapter-titles-work.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_columns-work-on-long-pages.sh.log: tmac/tests/e_columns-work-on-long-pages.sh + @p='tmac/tests/e_columns-work-on-long-pages.sh'; \ + b='tmac/tests/e_columns-work-on-long-pages.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_delayed-text-marks-work.sh.log: tmac/tests/e_delayed-text-marks-work.sh + @p='tmac/tests/e_delayed-text-marks-work.sh'; \ + b='tmac/tests/e_delayed-text-marks-work.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_footnote-marks-work.sh.log: tmac/tests/e_footnote-marks-work.sh + @p='tmac/tests/e_footnote-marks-work.sh'; \ + b='tmac/tests/e_footnote-marks-work.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_footnotes-work-with-columns.sh.log: tmac/tests/e_footnotes-work-with-columns.sh + @p='tmac/tests/e_footnotes-work-with-columns.sh'; \ + b='tmac/tests/e_footnotes-work-with-columns.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_ld-works.sh.log: tmac/tests/e_ld-works.sh + @p='tmac/tests/e_ld-works.sh'; \ + b='tmac/tests/e_ld-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_line-numbering-works.sh.log: tmac/tests/e_line-numbering-works.sh + @p='tmac/tests/e_line-numbering-works.sh'; \ + b='tmac/tests/e_line-numbering-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/e_rejects-too-short-page-lengths.sh.log: tmac/tests/e_rejects-too-short-page-lengths.sh + @p='tmac/tests/e_rejects-too-short-page-lengths.sh'; \ + b='tmac/tests/e_rejects-too-short-page-lengths.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/ec_works.sh.log: tmac/tests/ec_works.sh + @p='tmac/tests/ec_works.sh'; \ + b='tmac/tests/ec_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/latin2_works.sh.log: tmac/tests/latin2_works.sh + @p='tmac/tests/latin2_works.sh'; \ + b='tmac/tests/latin2_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/latin5_works.sh.log: tmac/tests/latin5_works.sh + @p='tmac/tests/latin5_works.sh'; \ + b='tmac/tests/latin5_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/latin9_works.sh.log: tmac/tests/latin9_works.sh + @p='tmac/tests/latin9_works.sh'; \ + b='tmac/tests/latin9_works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/localization-works.sh.log: tmac/tests/localization-works.sh + @p='tmac/tests/localization-works.sh'; \ + b='tmac/tests/localization-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh.log: tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh + @p='tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh'; \ + b='tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/pdfpic_falls-back-to-PSPIC.sh.log: tmac/tests/pdfpic_falls-back-to-PSPIC.sh + @p='tmac/tests/pdfpic_falls-back-to-PSPIC.sh'; \ + b='tmac/tests/pdfpic_falls-back-to-PSPIC.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_IP-indents-using-paragraph-type-size.sh.log: tmac/tests/s_IP-indents-using-paragraph-type-size.sh + @p='tmac/tests/s_IP-indents-using-paragraph-type-size.sh'; \ + b='tmac/tests/s_IP-indents-using-paragraph-type-size.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh.log: tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh + @p='tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh'; \ + b='tmac/tests/s_IP-respects-inter-sentence-space-in-tags.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_PN-works.sh.log: tmac/tests/s_PN-works.sh + @p='tmac/tests/s_PN-works.sh'; \ + b='tmac/tests/s_PN-works.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_R-handles-its-arguments.sh.log: tmac/tests/s_R-handles-its-arguments.sh + @p='tmac/tests/s_R-handles-its-arguments.sh'; \ + b='tmac/tests/s_R-handles-its-arguments.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_SH-resets-IP-indentation-amount.sh.log: tmac/tests/s_SH-resets-IP-indentation-amount.sh + @p='tmac/tests/s_SH-resets-IP-indentation-amount.sh'; \ + b='tmac/tests/s_SH-resets-IP-indentation-amount.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_TC-works-with-percent-in-custom-titles.sh.log: tmac/tests/s_TC-works-with-percent-in-custom-titles.sh + @p='tmac/tests/s_TC-works-with-percent-in-custom-titles.sh'; \ + b='tmac/tests/s_TC-works-with-percent-in-custom-titles.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh.log: tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh + @p='tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh'; \ + b='tmac/tests/s_XA-literal-no-argument-suppresses-leader.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_honor-MINGW-when-two-columns.sh.log: tmac/tests/s_honor-MINGW-when-two-columns.sh + @p='tmac/tests/s_honor-MINGW-when-two-columns.sh'; \ + b='tmac/tests/s_honor-MINGW-when-two-columns.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_mark-column-start-correctly.sh.log: tmac/tests/s_mark-column-start-correctly.sh + @p='tmac/tests/s_mark-column-start-correctly.sh'; \ + b='tmac/tests/s_mark-column-start-correctly.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_no-excess-space-around-displays.sh.log: tmac/tests/s_no-excess-space-around-displays.sh + @p='tmac/tests/s_no-excess-space-around-displays.sh'; \ + b='tmac/tests/s_no-excess-space-around-displays.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tmac/tests/s_rejects-too-short-page-lengths.sh.log: tmac/tests/s_rejects-too-short-page-lengths.sh + @p='tmac/tests/s_rejects-too-short-page-lengths.sh'; \ + b='tmac/tests/s_rejects-too-short-page-lengths.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ @@ -9605,7 +11723,6 @@ contrib/mom/examples/tests-mom.sh.log: contrib/mom/examples/tests-mom.sh @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -9667,6 +11784,10 @@ dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @@ -9709,6 +11830,8 @@ distcheck: dist eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) @@ -9724,7 +11847,7 @@ distcheck: dist $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -9783,12 +11906,13 @@ check: $(BUILT_SOURCES) all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \ $(HEADERS) installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX10012fontdir)" "$(DESTDIR)$(devX100fontdir)" "$(DESTDIR)$(devX7512fontdir)" "$(DESTDIR)$(devX75fontdir)" "$(DESTDIR)$(devasciifontdir)" "$(DESTDIR)$(devcp1047fontdir)" "$(DESTDIR)$(devdvifontdir)" "$(DESTDIR)$(devdvigendir)" "$(DESTDIR)$(devhtmlfontdir)" "$(DESTDIR)$(devlatin1fontdir)" "$(DESTDIR)$(devlbpfontdir)" "$(DESTDIR)$(devpdffontdir)" "$(DESTDIR)$(devpdffontencdir)" "$(DESTDIR)$(devpdffontmapdir)" "$(DESTDIR)$(devutf8fontdir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chempicdir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devlj4fontgendir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(devpsgendir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(glilyponddir)" "$(DESTDIR)$(gpinyindir)" "$(DESTDIR)$(grogdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(localtmacdir)" "$(DESTDIR)$(mmdir)" "$(DESTDIR)$(mmexampledir)" "$(DESTDIR)$(momexampledir)" "$(DESTDIR)$(momtmacdir)" "$(DESTDIR)$(olddevpsfontdir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarktmacdir)" "$(DESTDIR)$(tmacdir)" "$(DESTDIR)$(tmacmmdir)" "$(DESTDIR)$(grofferdir)" "$(DESTDIR)$(groffoptsdir)" "$(DESTDIR)$(hdtbltmacdir)" "$(DESTDIR)$(htmlpicdir)" "$(DESTDIR)$(momhtmldir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chemexample122dir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(docpdfdocdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(htmlexamplesdir)" "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(momprocessedexampledir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarkpdfdocdir)" "$(DESTDIR)$(tmacdir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(prefixexecbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(devX100_12_fontdir)" "$(DESTDIR)$(devX100_fontdir)" "$(DESTDIR)$(devX75_12_fontdir)" "$(DESTDIR)$(devX75_fontdir)" "$(DESTDIR)$(devasciifontdir)" "$(DESTDIR)$(devcp1047fontdir)" "$(DESTDIR)$(devdvifontdir)" "$(DESTDIR)$(devdvigendir)" "$(DESTDIR)$(devhtmlfontdir)" "$(DESTDIR)$(devlatin1fontdir)" "$(DESTDIR)$(devlbpfontdir)" "$(DESTDIR)$(devpdffontdir)" "$(DESTDIR)$(devpdffontencdir)" "$(DESTDIR)$(devpdffontmapdir)" "$(DESTDIR)$(devutf8fontdir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chempicdir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devlj4fontgendir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(devpsgendir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(hdtbltmacdir)" "$(DESTDIR)$(localtmacdir)" "$(DESTDIR)$(mdocdir)" "$(DESTDIR)$(mmdir)" "$(DESTDIR)$(mmexampledir)" "$(DESTDIR)$(momexampledir)" "$(DESTDIR)$(momtmacdir)" "$(DESTDIR)$(olddevpsfontdir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarktmacdir)" "$(DESTDIR)$(rfc1345tmacdir)" "$(DESTDIR)$(sboxestmacdir)" "$(DESTDIR)$(tmacdir)" "$(DESTDIR)$(tmacmmdir)" "$(DESTDIR)$(htmlpicdir)" "$(DESTDIR)$(momhtmldir)" "$(DESTDIR)$(chemexampledir)" "$(DESTDIR)$(chemexample122dir)" "$(DESTDIR)$(devlj4fontdir)" "$(DESTDIR)$(devpsfontdir)" "$(DESTDIR)$(docexamplesdir)" "$(DESTDIR)$(docpdfdocdir)" "$(DESTDIR)$(hdtblexampledir)" "$(DESTDIR)$(momprocessedexampledir)" "$(DESTDIR)$(otherdocdir)" "$(DESTDIR)$(pdfmarkpdfdocdir)" "$(DESTDIR)$(sboxesotherdocdir)" "$(DESTDIR)$(sboxespdfdocdir)" "$(DESTDIR)$(tmacdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -9891,44 +12015,47 @@ maintainer-clean-generic: -rm -f src/preproc/refer/label.cpp -rm -f src/preproc/refer/label.hpp -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -@BUILD_INFODOC_FALSE@install-html-local: -@BUILD_INFODOC_FALSE@install-pdf-local: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-local clean-nobase_binPROGRAMS clean-noinstLIBRARIES \ + clean-nobase_binPROGRAMS clean-noinstLIBRARIES \ clean-prefixexecbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f lib/$(DEPDIR)/asnprintf.Po - -rm -f lib/$(DEPDIR)/float.Po - -rm -f lib/$(DEPDIR)/fprintf.Po - -rm -f lib/$(DEPDIR)/frexp.Po - -rm -f lib/$(DEPDIR)/frexpl.Po - -rm -f lib/$(DEPDIR)/fseterr.Po - -rm -f lib/$(DEPDIR)/isnan.Po - -rm -f lib/$(DEPDIR)/isnand.Po - -rm -f lib/$(DEPDIR)/isnanf.Po - -rm -f lib/$(DEPDIR)/isnanl.Po - -rm -f lib/$(DEPDIR)/itold.Po - -rm -f lib/$(DEPDIR)/localcharset.Po - -rm -f lib/$(DEPDIR)/math.Po - -rm -f lib/$(DEPDIR)/memchr.Po - -rm -f lib/$(DEPDIR)/printf-args.Po - -rm -f lib/$(DEPDIR)/printf-frexp.Po - -rm -f lib/$(DEPDIR)/printf-frexpl.Po - -rm -f lib/$(DEPDIR)/printf-parse.Po - -rm -f lib/$(DEPDIR)/signbitd.Po - -rm -f lib/$(DEPDIR)/signbitf.Po - -rm -f lib/$(DEPDIR)/signbitl.Po - -rm -f lib/$(DEPDIR)/snprintf.Po - -rm -f lib/$(DEPDIR)/vasnprintf.Po - -rm -f lib/$(DEPDIR)/vsnprintf.Po - -rm -f lib/$(DEPDIR)/wctype-h.Po - -rm -f lib/$(DEPDIR)/wcwidth.Po - -rm -f lib/$(DEPDIR)/xsize.Po - -rm -f lib/uniwidth/$(DEPDIR)/width.Po + -rm -f lib/$(DEPDIR)/libgnu_a-asnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-float.Po + -rm -f lib/$(DEPDIR)/libgnu_a-fprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-free.Po + -rm -f lib/$(DEPDIR)/libgnu_a-frexp.Po + -rm -f lib/$(DEPDIR)/libgnu_a-frexpl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-fseterr.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnan.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnand.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnanf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnanl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-itold.Po + -rm -f lib/$(DEPDIR)/libgnu_a-localcharset.Po + -rm -f lib/$(DEPDIR)/libgnu_a-math.Po + -rm -f lib/$(DEPDIR)/libgnu_a-memchr.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-args.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexp.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-parse.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitd.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-snprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-stdio-read.Po + -rm -f lib/$(DEPDIR)/libgnu_a-stdio-write.Po + -rm -f lib/$(DEPDIR)/libgnu_a-unistd.Po + -rm -f lib/$(DEPDIR)/libgnu_a-vasnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-vsnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-wctype-h.Po + -rm -f lib/$(DEPDIR)/libgnu_a-wcwidth.Po + -rm -f lib/$(DEPDIR)/libgnu_a-xsize.Po + -rm -f lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po -rm -f src/devices/grodvi/$(DEPDIR)/dvi.Po -rm -f src/devices/grohtml/$(DEPDIR)/html-table.Po -rm -f src/devices/grohtml/$(DEPDIR)/html-text.Po @@ -10070,11 +12197,11 @@ distclean: distclean-am distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags -@BUILD_INFODOC_FALSE@dvi: dvi-am +dvi: dvi-am dvi-am: -@BUILD_INFODOC_FALSE@html: html-am +html: html-am html-am: @@ -10082,9 +12209,9 @@ info: info-am info-am: -install-data-am: install-data-local install-devX10012fontDATA \ - install-devX100fontDATA install-devX7512fontDATA \ - install-devX75fontDATA install-devasciifontDATA \ +install-data-am: install-data-local install-devX100_12_fontDATA \ + install-devX100_fontDATA install-devX75_12_fontDATA \ + install-devX75_fontDATA install-devasciifontDATA \ install-devcp1047fontDATA install-devdvifontDATA \ install-devdvigenDATA install-devhtmlfontDATA \ install-devlatin1fontDATA install-devlbpfontDATA \ @@ -10093,24 +12220,23 @@ install-data-am: install-data-local install-devX10012fontDATA \ install-dist_chemexampleDATA install-dist_chempicDATA \ install-dist_devlj4fontDATA install-dist_devlj4fontgenDATA \ install-dist_devpsfontDATA install-dist_devpsgenDATA \ - install-dist_docexamplesDATA install-dist_glilypondDATA \ - install-dist_gpinyinDATA install-dist_grogDATA \ - install-dist_hdtblexampleDATA install-dist_localtmacDATA \ - install-dist_mmDATA install-dist_mmexampleDATA \ - install-dist_momexampleDATA install-dist_momtmacDATA \ - install-dist_olddevpsfontDATA install-dist_otherdocDATA \ - install-dist_pdfmarktmacDATA install-dist_tmacDATA \ - install-dist_tmacmmDATA install-grofferDATA \ - install-groffoptsDATA install-hdtbltmacDATA \ + install-dist_docexamplesDATA install-dist_hdtblexampleDATA \ + install-dist_hdtbltmacDATA install-dist_localtmacDATA \ + install-dist_mdocDATA install-dist_mmDATA \ + install-dist_mmexampleDATA install-dist_momexampleDATA \ + install-dist_momtmacDATA install-dist_olddevpsfontDATA \ + install-dist_otherdocDATA install-dist_pdfmarktmacDATA \ + install-dist_rfc1345tmacDATA install-dist_sboxestmacDATA \ + install-dist_tmacDATA install-dist_tmacmmDATA \ install-htmlpicDATA install-man install-momhtmlDATA \ install-nodist_chemexample122DATA \ install-nodist_chemexampleDATA install-nodist_devlj4fontDATA \ install-nodist_devpsfontDATA install-nodist_docexamplesDATA \ install-nodist_docpdfdocDATA install-nodist_hdtblexampleDATA \ - install-nodist_htmlexamplesDATA install-nodist_mdocDATA \ install-nodist_momprocessedexampleDATA \ install-nodist_otherdocDATA install-nodist_pdfmarkpdfdocDATA \ - install-nodist_tmacDATA + install-nodist_sboxesotherdocDATA \ + install-nodist_sboxespdfdocDATA install-nodist_tmacDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am @@ -10145,34 +12271,38 @@ installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache - -rm -f lib/$(DEPDIR)/asnprintf.Po - -rm -f lib/$(DEPDIR)/float.Po - -rm -f lib/$(DEPDIR)/fprintf.Po - -rm -f lib/$(DEPDIR)/frexp.Po - -rm -f lib/$(DEPDIR)/frexpl.Po - -rm -f lib/$(DEPDIR)/fseterr.Po - -rm -f lib/$(DEPDIR)/isnan.Po - -rm -f lib/$(DEPDIR)/isnand.Po - -rm -f lib/$(DEPDIR)/isnanf.Po - -rm -f lib/$(DEPDIR)/isnanl.Po - -rm -f lib/$(DEPDIR)/itold.Po - -rm -f lib/$(DEPDIR)/localcharset.Po - -rm -f lib/$(DEPDIR)/math.Po - -rm -f lib/$(DEPDIR)/memchr.Po - -rm -f lib/$(DEPDIR)/printf-args.Po - -rm -f lib/$(DEPDIR)/printf-frexp.Po - -rm -f lib/$(DEPDIR)/printf-frexpl.Po - -rm -f lib/$(DEPDIR)/printf-parse.Po - -rm -f lib/$(DEPDIR)/signbitd.Po - -rm -f lib/$(DEPDIR)/signbitf.Po - -rm -f lib/$(DEPDIR)/signbitl.Po - -rm -f lib/$(DEPDIR)/snprintf.Po - -rm -f lib/$(DEPDIR)/vasnprintf.Po - -rm -f lib/$(DEPDIR)/vsnprintf.Po - -rm -f lib/$(DEPDIR)/wctype-h.Po - -rm -f lib/$(DEPDIR)/wcwidth.Po - -rm -f lib/$(DEPDIR)/xsize.Po - -rm -f lib/uniwidth/$(DEPDIR)/width.Po + -rm -f lib/$(DEPDIR)/libgnu_a-asnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-float.Po + -rm -f lib/$(DEPDIR)/libgnu_a-fprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-free.Po + -rm -f lib/$(DEPDIR)/libgnu_a-frexp.Po + -rm -f lib/$(DEPDIR)/libgnu_a-frexpl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-fseterr.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnan.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnand.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnanf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-isnanl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-itold.Po + -rm -f lib/$(DEPDIR)/libgnu_a-localcharset.Po + -rm -f lib/$(DEPDIR)/libgnu_a-math.Po + -rm -f lib/$(DEPDIR)/libgnu_a-memchr.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-args.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexp.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-frexpl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-printf-parse.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitd.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-signbitl.Po + -rm -f lib/$(DEPDIR)/libgnu_a-snprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-stdio-read.Po + -rm -f lib/$(DEPDIR)/libgnu_a-stdio-write.Po + -rm -f lib/$(DEPDIR)/libgnu_a-unistd.Po + -rm -f lib/$(DEPDIR)/libgnu_a-vasnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-vsnprintf.Po + -rm -f lib/$(DEPDIR)/libgnu_a-wctype-h.Po + -rm -f lib/$(DEPDIR)/libgnu_a-wcwidth.Po + -rm -f lib/$(DEPDIR)/libgnu_a-xsize.Po + -rm -f lib/uniwidth/$(DEPDIR)/libgnu_a-width.Po -rm -f src/devices/grodvi/$(DEPDIR)/dvi.Po -rm -f src/devices/grohtml/$(DEPDIR)/html-table.Po -rm -f src/devices/grohtml/$(DEPDIR)/html-text.Po @@ -10319,7 +12449,7 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-local -@BUILD_INFODOC_FALSE@pdf: pdf-am +pdf: pdf-am pdf-am: @@ -10328,8 +12458,8 @@ ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ - uninstall-devX10012fontDATA uninstall-devX100fontDATA \ - uninstall-devX7512fontDATA uninstall-devX75fontDATA \ + uninstall-devX100_12_fontDATA uninstall-devX100_fontDATA \ + uninstall-devX75_12_fontDATA uninstall-devX75_fontDATA \ uninstall-devasciifontDATA uninstall-devcp1047fontDATA \ uninstall-devdvifontDATA uninstall-devdvigenDATA \ uninstall-devhtmlfontDATA uninstall-devlatin1fontDATA \ @@ -10339,15 +12469,14 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-dist_chemexampleDATA uninstall-dist_chempicDATA \ uninstall-dist_devlj4fontDATA uninstall-dist_devlj4fontgenDATA \ uninstall-dist_devpsfontDATA uninstall-dist_devpsgenDATA \ - uninstall-dist_docexamplesDATA uninstall-dist_glilypondDATA \ - uninstall-dist_gpinyinDATA uninstall-dist_grogDATA \ - uninstall-dist_hdtblexampleDATA uninstall-dist_localtmacDATA \ - uninstall-dist_mmDATA uninstall-dist_mmexampleDATA \ - uninstall-dist_momexampleDATA uninstall-dist_momtmacDATA \ - uninstall-dist_olddevpsfontDATA uninstall-dist_otherdocDATA \ - uninstall-dist_pdfmarktmacDATA uninstall-dist_tmacDATA \ - uninstall-dist_tmacmmDATA uninstall-grofferDATA \ - uninstall-groffoptsDATA uninstall-hdtbltmacDATA \ + uninstall-dist_docexamplesDATA uninstall-dist_hdtblexampleDATA \ + uninstall-dist_hdtbltmacDATA uninstall-dist_localtmacDATA \ + uninstall-dist_mdocDATA uninstall-dist_mmDATA \ + uninstall-dist_mmexampleDATA uninstall-dist_momexampleDATA \ + uninstall-dist_momtmacDATA uninstall-dist_olddevpsfontDATA \ + uninstall-dist_otherdocDATA uninstall-dist_pdfmarktmacDATA \ + uninstall-dist_rfc1345tmacDATA uninstall-dist_sboxestmacDATA \ + uninstall-dist_tmacDATA uninstall-dist_tmacmmDATA \ uninstall-htmlpicDATA uninstall-local uninstall-man \ uninstall-momhtmlDATA uninstall-nobase_binPROGRAMS \ uninstall-nodist_chemexample122DATA \ @@ -10356,73 +12485,73 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-nodist_docexamplesDATA \ uninstall-nodist_docpdfdocDATA \ uninstall-nodist_hdtblexampleDATA \ - uninstall-nodist_htmlexamplesDATA uninstall-nodist_mdocDATA \ uninstall-nodist_momprocessedexampleDATA \ uninstall-nodist_otherdocDATA \ - uninstall-nodist_pdfmarkpdfdocDATA uninstall-nodist_tmacDATA \ + uninstall-nodist_pdfmarkpdfdocDATA \ + uninstall-nodist_sboxesotherdocDATA \ + uninstall-nodist_sboxespdfdocDATA uninstall-nodist_tmacDATA \ uninstall-prefixexecbinPROGRAMS uninstall-prefixexecbinSCRIPTS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7 .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am + install-exec install-exec-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS \ - clean-checkPROGRAMS clean-cscope clean-generic clean-local \ + clean-checkPROGRAMS clean-cscope clean-generic \ clean-nobase_binPROGRAMS clean-noinstLIBRARIES \ clean-prefixexecbinPROGRAMS cscope cscopelist-am ctags \ ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ - dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \ - distclean distclean-compile distclean-generic distclean-hdr \ - distclean-local distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-binSCRIPTS \ - install-data install-data-am install-data-hook \ - install-data-local install-devX10012fontDATA \ - install-devX100fontDATA install-devX7512fontDATA \ - install-devX75fontDATA install-devasciifontDATA \ - install-devcp1047fontDATA install-devdvifontDATA \ - install-devdvigenDATA install-devhtmlfontDATA \ - install-devlatin1fontDATA install-devlbpfontDATA \ - install-devpdffontDATA install-devpdffontencDATA \ - install-devpdffontmapDATA install-devutf8fontDATA \ - install-dist_binSCRIPTS install-dist_chemexampleDATA \ - install-dist_chempicDATA install-dist_devlj4fontDATA \ - install-dist_devlj4fontgenDATA install-dist_devpsfontDATA \ - install-dist_devpsgenDATA install-dist_docexamplesDATA \ - install-dist_glilypondDATA install-dist_gpinyinDATA \ - install-dist_grogDATA install-dist_hdtblexampleDATA \ - install-dist_localtmacDATA install-dist_mmDATA \ + dist-lzip dist-shar dist-tarZ dist-xz dist-zip dist-zstd \ + distcheck distclean distclean-compile distclean-generic \ + distclean-hdr distclean-local distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-data install-data-am \ + install-data-hook install-data-local \ + install-devX100_12_fontDATA install-devX100_fontDATA \ + install-devX75_12_fontDATA install-devX75_fontDATA \ + install-devasciifontDATA install-devcp1047fontDATA \ + install-devdvifontDATA install-devdvigenDATA \ + install-devhtmlfontDATA install-devlatin1fontDATA \ + install-devlbpfontDATA install-devpdffontDATA \ + install-devpdffontencDATA install-devpdffontmapDATA \ + install-devutf8fontDATA install-dist_binSCRIPTS \ + install-dist_chemexampleDATA install-dist_chempicDATA \ + install-dist_devlj4fontDATA install-dist_devlj4fontgenDATA \ + install-dist_devpsfontDATA install-dist_devpsgenDATA \ + install-dist_docexamplesDATA install-dist_hdtblexampleDATA \ + install-dist_hdtbltmacDATA install-dist_localtmacDATA \ + install-dist_mdocDATA install-dist_mmDATA \ install-dist_mmexampleDATA install-dist_momexampleDATA \ install-dist_momtmacDATA install-dist_olddevpsfontDATA \ install-dist_otherdocDATA install-dist_pdfmarktmacDATA \ + install-dist_rfc1345tmacDATA install-dist_sboxestmacDATA \ install-dist_tmacDATA install-dist_tmacmmDATA install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ - install-grofferDATA install-groffoptsDATA \ - install-hdtbltmacDATA install-html install-html-am \ - install-html-local install-htmlpicDATA install-info \ - install-info-am install-man install-man1 install-man5 \ - install-man7 install-momhtmlDATA install-nobase_binPROGRAMS \ - install-nodist_chemexample122DATA \ + install-html install-html-am install-html-local \ + install-htmlpicDATA install-info install-info-am install-man \ + install-man1 install-man5 install-man7 install-momhtmlDATA \ + install-nobase_binPROGRAMS install-nodist_chemexample122DATA \ install-nodist_chemexampleDATA install-nodist_devlj4fontDATA \ install-nodist_devpsfontDATA install-nodist_docexamplesDATA \ install-nodist_docpdfdocDATA install-nodist_hdtblexampleDATA \ - install-nodist_htmlexamplesDATA install-nodist_mdocDATA \ install-nodist_momprocessedexampleDATA \ install-nodist_otherdocDATA install-nodist_pdfmarkpdfdocDATA \ - install-nodist_tmacDATA install-pdf install-pdf-am \ - install-pdf-local install-prefixexecbinPROGRAMS \ - install-prefixexecbinSCRIPTS install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic \ - maintainer-clean-local mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-local pdf pdf-am ps ps-am \ - recheck tags tags-am uninstall uninstall-am \ + install-nodist_sboxesotherdocDATA \ + install-nodist_sboxespdfdocDATA install-nodist_tmacDATA \ + install-pdf install-pdf-am install-pdf-local \ + install-prefixexecbinPROGRAMS install-prefixexecbinSCRIPTS \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-local pdf \ + pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-binSCRIPTS \ - uninstall-devX10012fontDATA uninstall-devX100fontDATA \ - uninstall-devX7512fontDATA uninstall-devX75fontDATA \ + uninstall-devX100_12_fontDATA uninstall-devX100_fontDATA \ + uninstall-devX75_12_fontDATA uninstall-devX75_fontDATA \ uninstall-devasciifontDATA uninstall-devcp1047fontDATA \ uninstall-devdvifontDATA uninstall-devdvigenDATA \ uninstall-devhtmlfontDATA uninstall-devlatin1fontDATA \ @@ -10432,17 +12561,16 @@ uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7 uninstall-dist_chemexampleDATA uninstall-dist_chempicDATA \ uninstall-dist_devlj4fontDATA uninstall-dist_devlj4fontgenDATA \ uninstall-dist_devpsfontDATA uninstall-dist_devpsgenDATA \ - uninstall-dist_docexamplesDATA uninstall-dist_glilypondDATA \ - uninstall-dist_gpinyinDATA uninstall-dist_grogDATA \ - uninstall-dist_hdtblexampleDATA uninstall-dist_localtmacDATA \ - uninstall-dist_mmDATA uninstall-dist_mmexampleDATA \ - uninstall-dist_momexampleDATA uninstall-dist_momtmacDATA \ - uninstall-dist_olddevpsfontDATA uninstall-dist_otherdocDATA \ - uninstall-dist_pdfmarktmacDATA uninstall-dist_tmacDATA \ - uninstall-dist_tmacmmDATA uninstall-grofferDATA \ - uninstall-groffoptsDATA uninstall-hdtbltmacDATA uninstall-hook \ - uninstall-htmlpicDATA uninstall-local uninstall-man \ - uninstall-man1 uninstall-man5 uninstall-man7 \ + uninstall-dist_docexamplesDATA uninstall-dist_hdtblexampleDATA \ + uninstall-dist_hdtbltmacDATA uninstall-dist_localtmacDATA \ + uninstall-dist_mdocDATA uninstall-dist_mmDATA \ + uninstall-dist_mmexampleDATA uninstall-dist_momexampleDATA \ + uninstall-dist_momtmacDATA uninstall-dist_olddevpsfontDATA \ + uninstall-dist_otherdocDATA uninstall-dist_pdfmarktmacDATA \ + uninstall-dist_rfc1345tmacDATA uninstall-dist_sboxestmacDATA \ + uninstall-dist_tmacDATA uninstall-dist_tmacmmDATA \ + uninstall-hook uninstall-htmlpicDATA uninstall-local \ + uninstall-man uninstall-man1 uninstall-man5 uninstall-man7 \ uninstall-momhtmlDATA uninstall-nobase_binPROGRAMS \ uninstall-nodist_chemexample122DATA \ uninstall-nodist_chemexampleDATA \ @@ -10450,10 +12578,11 @@ uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7 uninstall-nodist_docexamplesDATA \ uninstall-nodist_docpdfdocDATA \ uninstall-nodist_hdtblexampleDATA \ - uninstall-nodist_htmlexamplesDATA uninstall-nodist_mdocDATA \ uninstall-nodist_momprocessedexampleDATA \ uninstall-nodist_otherdocDATA \ - uninstall-nodist_pdfmarkpdfdocDATA uninstall-nodist_tmacDATA \ + uninstall-nodist_pdfmarkpdfdocDATA \ + uninstall-nodist_sboxesotherdocDATA \ + uninstall-nodist_sboxespdfdocDATA uninstall-nodist_tmacDATA \ uninstall-prefixexecbinPROGRAMS uninstall-prefixexecbinSCRIPTS .PRECIOUS: Makefile @@ -10462,20 +12591,40 @@ uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7 # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_ALLOCA_H_TRUE@lib/alloca.h: lib/alloca.in.h $(top_builddir)/config.status -@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_ALLOCA_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ -@GL_GENERATE_ALLOCA_H_TRUE@ cat $(top_srcdir)/lib/alloca.in.h; \ -@GL_GENERATE_ALLOCA_H_TRUE@ } > $@-t && \ -@GL_GENERATE_ALLOCA_H_TRUE@ mv -f $@-t $@ +@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_ALLOCA_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_ALLOCA_H_TRUE@ -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' \ +@GL_GENERATE_ALLOCA_H_TRUE@ $(top_srcdir)/lib/alloca.in.h > $@-t +@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_ALLOCA_H_FALSE@lib/alloca.h: $(top_builddir)/config.status @GL_GENERATE_ALLOCA_H_FALSE@ rm -f $@ +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +@GL_GENERATE_ASSERT_H_TRUE@lib/assert.h: lib/assert.in.h lib/verify.h $(top_builddir)/config.status +@GL_GENERATE_ASSERT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_ASSERT_H_TRUE@ $(gl_V_at){ $(SED_HEADER_STDOUT) \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|@''NEXT_ASSERT_H''@|$(NEXT_ASSERT_H)|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ < $(top_srcdir)/lib/assert.in.h && \ +@GL_GENERATE_ASSERT_H_TRUE@ sed -e '/@assert.h omit start@/,/@assert.h omit end@/d' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_gl_verify|_gl_static_assert|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_GL_VERIFY|_GL_STATIC_ASSERT|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ -e 's|_GL\(_STATIC_ASSERT_H\)|_GL\1|g' \ +@GL_GENERATE_ASSERT_H_TRUE@ < $(top_srcdir)/lib/verify.h; \ +@GL_GENERATE_ASSERT_H_TRUE@ } > $@-t +@GL_GENERATE_ASSERT_H_TRUE@ $(AM_V_at)mv $@-t $@ +@GL_GENERATE_ASSERT_H_FALSE@lib/assert.h: $(top_builddir)/config.status +@GL_GENERATE_ASSERT_H_FALSE@ rm -f $@ + # We need the following in order to create when the system # doesn't have one that is POSIX compliant. @GL_GENERATE_ERRNO_H_TRUE@lib/errno.h: lib/errno.in.h $(top_builddir)/config.status -@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_ERRNO_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ -@GL_GENERATE_ERRNO_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ +@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_ERRNO_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @@ -10486,151 +12635,189 @@ uninstall-man: uninstall-man1 uninstall-man5 uninstall-man7 @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ @GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ -@GL_GENERATE_ERRNO_H_TRUE@ < $(top_srcdir)/lib/errno.in.h; \ -@GL_GENERATE_ERRNO_H_TRUE@ } > $@-t && \ -@GL_GENERATE_ERRNO_H_TRUE@ mv $@-t $@ +@GL_GENERATE_ERRNO_H_TRUE@ $(top_srcdir)/lib/errno.in.h > $@-t +@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_ERRNO_H_FALSE@lib/errno.h: $(top_builddir)/config.status @GL_GENERATE_ERRNO_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_FLOAT_H_TRUE@lib/float.h: lib/float.in.h $(top_builddir)/config.status -@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_FLOAT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ -@GL_GENERATE_FLOAT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ +@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_FLOAT_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ @GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \ -@GL_GENERATE_FLOAT_H_TRUE@ < $(top_srcdir)/lib/float.in.h; \ -@GL_GENERATE_FLOAT_H_TRUE@ } > $@-t && \ -@GL_GENERATE_FLOAT_H_TRUE@ mv $@-t $@ +@GL_GENERATE_FLOAT_H_TRUE@ $(top_srcdir)/lib/float.in.h > $@-t +@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_FLOAT_H_FALSE@lib/float.h: $(top_builddir)/config.status @GL_GENERATE_FLOAT_H_FALSE@ rm -f $@ +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +lib/inttypes.h: lib/inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ + -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ + -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ + -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \ + -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ + -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \ + -e 's/@''GNULIB_IMAXABS''@/$(GL_GNULIB_IMAXABS)/g' \ + -e 's/@''GNULIB_IMAXDIV''@/$(GL_GNULIB_IMAXDIV)/g' \ + -e 's/@''GNULIB_STRTOIMAX''@/$(GL_GNULIB_STRTOIMAX)/g' \ + -e 's/@''GNULIB_STRTOUMAX''@/$(GL_GNULIB_STRTOUMAX)/g' \ + -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \ + -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \ + -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \ + -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \ + -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \ + -e 's/@''REPLACE_IMAXABS''@/$(REPLACE_IMAXABS)/g' \ + -e 's/@''REPLACE_IMAXDIV''@/$(REPLACE_IMAXDIV)/g' \ + -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \ + -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \ + -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \ + -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \ + -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \ + -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \ + -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ + -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + $(top_srcdir)/lib/inttypes.in.h > $@-t + $(AM_V_at)mv $@-t $@ + # We need the following in order to create when the system # doesn't have one that is compatible with GNU. @GL_GENERATE_LIMITS_H_TRUE@lib/limits.h: lib/limits.in.h $(top_builddir)/config.status -@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_LIMITS_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ -@GL_GENERATE_LIMITS_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ +@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_LIMITS_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \ -@GL_GENERATE_LIMITS_H_TRUE@ < $(top_srcdir)/lib/limits.in.h; \ -@GL_GENERATE_LIMITS_H_TRUE@ } > $@-t && \ -@GL_GENERATE_LIMITS_H_TRUE@ mv $@-t $@ +@GL_GENERATE_LIMITS_H_TRUE@ $(top_srcdir)/lib/limits.in.h > $@-t +@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_LIMITS_H_FALSE@lib/limits.h: $(top_builddir)/config.status @GL_GENERATE_LIMITS_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \ - -e 's/@''GNULIB_ACOSF''@/$(GNULIB_ACOSF)/g' \ - -e 's/@''GNULIB_ACOSL''@/$(GNULIB_ACOSL)/g' \ - -e 's/@''GNULIB_ASINF''@/$(GNULIB_ASINF)/g' \ - -e 's/@''GNULIB_ASINL''@/$(GNULIB_ASINL)/g' \ - -e 's/@''GNULIB_ATANF''@/$(GNULIB_ATANF)/g' \ - -e 's/@''GNULIB_ATANL''@/$(GNULIB_ATANL)/g' \ - -e 's/@''GNULIB_ATAN2F''@/$(GNULIB_ATAN2F)/g' \ - -e 's/@''GNULIB_CBRT''@/$(GNULIB_CBRT)/g' \ - -e 's/@''GNULIB_CBRTF''@/$(GNULIB_CBRTF)/g' \ - -e 's/@''GNULIB_CBRTL''@/$(GNULIB_CBRTL)/g' \ - -e 's/@''GNULIB_CEIL''@/$(GNULIB_CEIL)/g' \ - -e 's/@''GNULIB_CEILF''@/$(GNULIB_CEILF)/g' \ - -e 's/@''GNULIB_CEILL''@/$(GNULIB_CEILL)/g' \ - -e 's/@''GNULIB_COPYSIGN''@/$(GNULIB_COPYSIGN)/g' \ - -e 's/@''GNULIB_COPYSIGNF''@/$(GNULIB_COPYSIGNF)/g' \ - -e 's/@''GNULIB_COPYSIGNL''@/$(GNULIB_COPYSIGNL)/g' \ - -e 's/@''GNULIB_COSF''@/$(GNULIB_COSF)/g' \ - -e 's/@''GNULIB_COSL''@/$(GNULIB_COSL)/g' \ - -e 's/@''GNULIB_COSHF''@/$(GNULIB_COSHF)/g' \ - -e 's/@''GNULIB_EXPF''@/$(GNULIB_EXPF)/g' \ - -e 's/@''GNULIB_EXPL''@/$(GNULIB_EXPL)/g' \ - -e 's/@''GNULIB_EXP2''@/$(GNULIB_EXP2)/g' \ - -e 's/@''GNULIB_EXP2F''@/$(GNULIB_EXP2F)/g' \ - -e 's/@''GNULIB_EXP2L''@/$(GNULIB_EXP2L)/g' \ - -e 's/@''GNULIB_EXPM1''@/$(GNULIB_EXPM1)/g' \ - -e 's/@''GNULIB_EXPM1F''@/$(GNULIB_EXPM1F)/g' \ - -e 's/@''GNULIB_EXPM1L''@/$(GNULIB_EXPM1L)/g' \ - -e 's/@''GNULIB_FABSF''@/$(GNULIB_FABSF)/g' \ - -e 's/@''GNULIB_FABSL''@/$(GNULIB_FABSL)/g' \ - -e 's/@''GNULIB_FLOOR''@/$(GNULIB_FLOOR)/g' \ - -e 's/@''GNULIB_FLOORF''@/$(GNULIB_FLOORF)/g' \ - -e 's/@''GNULIB_FLOORL''@/$(GNULIB_FLOORL)/g' \ - -e 's/@''GNULIB_FMA''@/$(GNULIB_FMA)/g' \ - -e 's/@''GNULIB_FMAF''@/$(GNULIB_FMAF)/g' \ - -e 's/@''GNULIB_FMAL''@/$(GNULIB_FMAL)/g' \ - -e 's/@''GNULIB_FMOD''@/$(GNULIB_FMOD)/g' \ - -e 's/@''GNULIB_FMODF''@/$(GNULIB_FMODF)/g' \ - -e 's/@''GNULIB_FMODL''@/$(GNULIB_FMODL)/g' \ - -e 's/@''GNULIB_FREXPF''@/$(GNULIB_FREXPF)/g' \ - -e 's/@''GNULIB_FREXP''@/$(GNULIB_FREXP)/g' \ - -e 's/@''GNULIB_FREXPL''@/$(GNULIB_FREXPL)/g' \ - -e 's/@''GNULIB_HYPOT''@/$(GNULIB_HYPOT)/g' \ - -e 's/@''GNULIB_HYPOTF''@/$(GNULIB_HYPOTF)/g' \ - -e 's/@''GNULIB_HYPOTL''@/$(GNULIB_HYPOTL)/g' \ + -e 's/@''GNULIB_ACOSF''@/$(GL_GNULIB_ACOSF)/g' \ + -e 's/@''GNULIB_ACOSL''@/$(GL_GNULIB_ACOSL)/g' \ + -e 's/@''GNULIB_ASINF''@/$(GL_GNULIB_ASINF)/g' \ + -e 's/@''GNULIB_ASINL''@/$(GL_GNULIB_ASINL)/g' \ + -e 's/@''GNULIB_ATANF''@/$(GL_GNULIB_ATANF)/g' \ + -e 's/@''GNULIB_ATANL''@/$(GL_GNULIB_ATANL)/g' \ + -e 's/@''GNULIB_ATAN2F''@/$(GL_GNULIB_ATAN2F)/g' \ + -e 's/@''GNULIB_CBRT''@/$(GL_GNULIB_CBRT)/g' \ + -e 's/@''GNULIB_CBRTF''@/$(GL_GNULIB_CBRTF)/g' \ + -e 's/@''GNULIB_CBRTL''@/$(GL_GNULIB_CBRTL)/g' \ + -e 's/@''GNULIB_CEIL''@/$(GL_GNULIB_CEIL)/g' \ + -e 's/@''GNULIB_CEILF''@/$(GL_GNULIB_CEILF)/g' \ + -e 's/@''GNULIB_CEILL''@/$(GL_GNULIB_CEILL)/g' \ + -e 's/@''GNULIB_COPYSIGN''@/$(GL_GNULIB_COPYSIGN)/g' \ + -e 's/@''GNULIB_COPYSIGNF''@/$(GL_GNULIB_COPYSIGNF)/g' \ + -e 's/@''GNULIB_COPYSIGNL''@/$(GL_GNULIB_COPYSIGNL)/g' \ + -e 's/@''GNULIB_COSF''@/$(GL_GNULIB_COSF)/g' \ + -e 's/@''GNULIB_COSL''@/$(GL_GNULIB_COSL)/g' \ + -e 's/@''GNULIB_COSHF''@/$(GL_GNULIB_COSHF)/g' \ + -e 's/@''GNULIB_EXPF''@/$(GL_GNULIB_EXPF)/g' \ + -e 's/@''GNULIB_EXPL''@/$(GL_GNULIB_EXPL)/g' \ + -e 's/@''GNULIB_EXP2''@/$(GL_GNULIB_EXP2)/g' \ + -e 's/@''GNULIB_EXP2F''@/$(GL_GNULIB_EXP2F)/g' \ + -e 's/@''GNULIB_EXP2L''@/$(GL_GNULIB_EXP2L)/g' \ + -e 's/@''GNULIB_EXPM1''@/$(GL_GNULIB_EXPM1)/g' \ + -e 's/@''GNULIB_EXPM1F''@/$(GL_GNULIB_EXPM1F)/g' \ + -e 's/@''GNULIB_EXPM1L''@/$(GL_GNULIB_EXPM1L)/g' \ + -e 's/@''GNULIB_FABSF''@/$(GL_GNULIB_FABSF)/g' \ + -e 's/@''GNULIB_FABSL''@/$(GL_GNULIB_FABSL)/g' \ + -e 's/@''GNULIB_FLOOR''@/$(GL_GNULIB_FLOOR)/g' \ + -e 's/@''GNULIB_FLOORF''@/$(GL_GNULIB_FLOORF)/g' \ + -e 's/@''GNULIB_FLOORL''@/$(GL_GNULIB_FLOORL)/g' \ + -e 's/@''GNULIB_FMA''@/$(GL_GNULIB_FMA)/g' \ + -e 's/@''GNULIB_FMAF''@/$(GL_GNULIB_FMAF)/g' \ + -e 's/@''GNULIB_FMAL''@/$(GL_GNULIB_FMAL)/g' \ + -e 's/@''GNULIB_FMOD''@/$(GL_GNULIB_FMOD)/g' \ + -e 's/@''GNULIB_FMODF''@/$(GL_GNULIB_FMODF)/g' \ + -e 's/@''GNULIB_FMODL''@/$(GL_GNULIB_FMODL)/g' \ + -e 's/@''GNULIB_FREXPF''@/$(GL_GNULIB_FREXPF)/g' \ + -e 's/@''GNULIB_FREXP''@/$(GL_GNULIB_FREXP)/g' \ + -e 's/@''GNULIB_FREXPL''@/$(GL_GNULIB_FREXPL)/g' \ + -e 's/@''GNULIB_HYPOT''@/$(GL_GNULIB_HYPOT)/g' \ + -e 's/@''GNULIB_HYPOTF''@/$(GL_GNULIB_HYPOTF)/g' \ + -e 's/@''GNULIB_HYPOTL''@/$(GL_GNULIB_HYPOTL)/g' \ < $(top_srcdir)/lib/math.in.h | \ - sed -e 's/@''GNULIB_ILOGB''@/$(GNULIB_ILOGB)/g' \ - -e 's/@''GNULIB_ILOGBF''@/$(GNULIB_ILOGBF)/g' \ - -e 's/@''GNULIB_ILOGBL''@/$(GNULIB_ILOGBL)/g' \ - -e 's/@''GNULIB_ISFINITE''@/$(GNULIB_ISFINITE)/g' \ - -e 's/@''GNULIB_ISINF''@/$(GNULIB_ISINF)/g' \ - -e 's/@''GNULIB_ISNAN''@/$(GNULIB_ISNAN)/g' \ - -e 's/@''GNULIB_ISNANF''@/$(GNULIB_ISNANF)/g' \ - -e 's/@''GNULIB_ISNAND''@/$(GNULIB_ISNAND)/g' \ - -e 's/@''GNULIB_ISNANL''@/$(GNULIB_ISNANL)/g' \ - -e 's/@''GNULIB_LDEXPF''@/$(GNULIB_LDEXPF)/g' \ - -e 's/@''GNULIB_LDEXPL''@/$(GNULIB_LDEXPL)/g' \ - -e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \ - -e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \ - -e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \ - -e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \ - -e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \ - -e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \ - -e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \ - -e 's/@''GNULIB_LOG1PF''@/$(GNULIB_LOG1PF)/g' \ - -e 's/@''GNULIB_LOG1PL''@/$(GNULIB_LOG1PL)/g' \ - -e 's/@''GNULIB_LOG2''@/$(GNULIB_LOG2)/g' \ - -e 's/@''GNULIB_LOG2F''@/$(GNULIB_LOG2F)/g' \ - -e 's/@''GNULIB_LOG2L''@/$(GNULIB_LOG2L)/g' \ - -e 's/@''GNULIB_LOGB''@/$(GNULIB_LOGB)/g' \ - -e 's/@''GNULIB_LOGBF''@/$(GNULIB_LOGBF)/g' \ - -e 's/@''GNULIB_LOGBL''@/$(GNULIB_LOGBL)/g' \ - -e 's/@''GNULIB_MODF''@/$(GNULIB_MODF)/g' \ - -e 's/@''GNULIB_MODFF''@/$(GNULIB_MODFF)/g' \ - -e 's/@''GNULIB_MODFL''@/$(GNULIB_MODFL)/g' \ - -e 's/@''GNULIB_POWF''@/$(GNULIB_POWF)/g' \ - -e 's/@''GNULIB_REMAINDER''@/$(GNULIB_REMAINDER)/g' \ - -e 's/@''GNULIB_REMAINDERF''@/$(GNULIB_REMAINDERF)/g' \ - -e 's/@''GNULIB_REMAINDERL''@/$(GNULIB_REMAINDERL)/g' \ - -e 's/@''GNULIB_RINT''@/$(GNULIB_RINT)/g' \ - -e 's/@''GNULIB_RINTF''@/$(GNULIB_RINTF)/g' \ - -e 's/@''GNULIB_RINTL''@/$(GNULIB_RINTL)/g' \ - -e 's/@''GNULIB_ROUND''@/$(GNULIB_ROUND)/g' \ - -e 's/@''GNULIB_ROUNDF''@/$(GNULIB_ROUNDF)/g' \ - -e 's/@''GNULIB_ROUNDL''@/$(GNULIB_ROUNDL)/g' \ - -e 's/@''GNULIB_SIGNBIT''@/$(GNULIB_SIGNBIT)/g' \ - -e 's/@''GNULIB_SINF''@/$(GNULIB_SINF)/g' \ - -e 's/@''GNULIB_SINL''@/$(GNULIB_SINL)/g' \ - -e 's/@''GNULIB_SINHF''@/$(GNULIB_SINHF)/g' \ - -e 's/@''GNULIB_SQRTF''@/$(GNULIB_SQRTF)/g' \ - -e 's/@''GNULIB_SQRTL''@/$(GNULIB_SQRTL)/g' \ - -e 's/@''GNULIB_TANF''@/$(GNULIB_TANF)/g' \ - -e 's/@''GNULIB_TANL''@/$(GNULIB_TANL)/g' \ - -e 's/@''GNULIB_TANHF''@/$(GNULIB_TANHF)/g' \ - -e 's/@''GNULIB_TRUNC''@/$(GNULIB_TRUNC)/g' \ - -e 's/@''GNULIB_TRUNCF''@/$(GNULIB_TRUNCF)/g' \ - -e 's/@''GNULIB_TRUNCL''@/$(GNULIB_TRUNCL)/g' \ + sed -e 's/@''GNULIB_ILOGB''@/$(GL_GNULIB_ILOGB)/g' \ + -e 's/@''GNULIB_ILOGBF''@/$(GL_GNULIB_ILOGBF)/g' \ + -e 's/@''GNULIB_ILOGBL''@/$(GL_GNULIB_ILOGBL)/g' \ + -e 's/@''GNULIB_ISFINITE''@/$(GL_GNULIB_ISFINITE)/g' \ + -e 's/@''GNULIB_ISINF''@/$(GL_GNULIB_ISINF)/g' \ + -e 's/@''GNULIB_ISNAN''@/$(GL_GNULIB_ISNAN)/g' \ + -e 's/@''GNULIB_ISNANF''@/$(GL_GNULIB_ISNANF)/g' \ + -e 's/@''GNULIB_ISNAND''@/$(GL_GNULIB_ISNAND)/g' \ + -e 's/@''GNULIB_ISNANL''@/$(GL_GNULIB_ISNANL)/g' \ + -e 's/@''GNULIB_LDEXPF''@/$(GL_GNULIB_LDEXPF)/g' \ + -e 's/@''GNULIB_LDEXPL''@/$(GL_GNULIB_LDEXPL)/g' \ + -e 's/@''GNULIB_LOG''@/$(GL_GNULIB_LOG)/g' \ + -e 's/@''GNULIB_LOGF''@/$(GL_GNULIB_LOGF)/g' \ + -e 's/@''GNULIB_LOGL''@/$(GL_GNULIB_LOGL)/g' \ + -e 's/@''GNULIB_LOG10''@/$(GL_GNULIB_LOG10)/g' \ + -e 's/@''GNULIB_LOG10F''@/$(GL_GNULIB_LOG10F)/g' \ + -e 's/@''GNULIB_LOG10L''@/$(GL_GNULIB_LOG10L)/g' \ + -e 's/@''GNULIB_LOG1P''@/$(GL_GNULIB_LOG1P)/g' \ + -e 's/@''GNULIB_LOG1PF''@/$(GL_GNULIB_LOG1PF)/g' \ + -e 's/@''GNULIB_LOG1PL''@/$(GL_GNULIB_LOG1PL)/g' \ + -e 's/@''GNULIB_LOG2''@/$(GL_GNULIB_LOG2)/g' \ + -e 's/@''GNULIB_LOG2F''@/$(GL_GNULIB_LOG2F)/g' \ + -e 's/@''GNULIB_LOG2L''@/$(GL_GNULIB_LOG2L)/g' \ + -e 's/@''GNULIB_LOGB''@/$(GL_GNULIB_LOGB)/g' \ + -e 's/@''GNULIB_LOGBF''@/$(GL_GNULIB_LOGBF)/g' \ + -e 's/@''GNULIB_LOGBL''@/$(GL_GNULIB_LOGBL)/g' \ + -e 's/@''GNULIB_MODF''@/$(GL_GNULIB_MODF)/g' \ + -e 's/@''GNULIB_MODFF''@/$(GL_GNULIB_MODFF)/g' \ + -e 's/@''GNULIB_MODFL''@/$(GL_GNULIB_MODFL)/g' \ + -e 's/@''GNULIB_POWF''@/$(GL_GNULIB_POWF)/g' \ + -e 's/@''GNULIB_REMAINDER''@/$(GL_GNULIB_REMAINDER)/g' \ + -e 's/@''GNULIB_REMAINDERF''@/$(GL_GNULIB_REMAINDERF)/g' \ + -e 's/@''GNULIB_REMAINDERL''@/$(GL_GNULIB_REMAINDERL)/g' \ + -e 's/@''GNULIB_RINT''@/$(GL_GNULIB_RINT)/g' \ + -e 's/@''GNULIB_RINTF''@/$(GL_GNULIB_RINTF)/g' \ + -e 's/@''GNULIB_RINTL''@/$(GL_GNULIB_RINTL)/g' \ + -e 's/@''GNULIB_ROUND''@/$(GL_GNULIB_ROUND)/g' \ + -e 's/@''GNULIB_ROUNDF''@/$(GL_GNULIB_ROUNDF)/g' \ + -e 's/@''GNULIB_ROUNDL''@/$(GL_GNULIB_ROUNDL)/g' \ + -e 's/@''GNULIB_SIGNBIT''@/$(GL_GNULIB_SIGNBIT)/g' \ + -e 's/@''GNULIB_SINF''@/$(GL_GNULIB_SINF)/g' \ + -e 's/@''GNULIB_SINL''@/$(GL_GNULIB_SINL)/g' \ + -e 's/@''GNULIB_SINHF''@/$(GL_GNULIB_SINHF)/g' \ + -e 's/@''GNULIB_SQRTF''@/$(GL_GNULIB_SQRTF)/g' \ + -e 's/@''GNULIB_SQRTL''@/$(GL_GNULIB_SQRTL)/g' \ + -e 's/@''GNULIB_TANF''@/$(GL_GNULIB_TANF)/g' \ + -e 's/@''GNULIB_TANL''@/$(GL_GNULIB_TANL)/g' \ + -e 's/@''GNULIB_TANHF''@/$(GL_GNULIB_TANHF)/g' \ + -e 's/@''GNULIB_TRUNC''@/$(GL_GNULIB_TRUNC)/g' \ + -e 's/@''GNULIB_TRUNCF''@/$(GL_GNULIB_TRUNCF)/g' \ + -e 's/@''GNULIB_TRUNCL''@/$(GL_GNULIB_TRUNCL)/g' \ + -e 's/@''GNULIB_MDA_J0''@/$(GL_GNULIB_MDA_J0)/g' \ + -e 's/@''GNULIB_MDA_J1''@/$(GL_GNULIB_MDA_J1)/g' \ + -e 's/@''GNULIB_MDA_JN''@/$(GL_GNULIB_MDA_JN)/g' \ + -e 's/@''GNULIB_MDA_Y0''@/$(GL_GNULIB_MDA_Y0)/g' \ + -e 's/@''GNULIB_MDA_Y1''@/$(GL_GNULIB_MDA_Y1)/g' \ + -e 's/@''GNULIB_MDA_YN''@/$(GL_GNULIB_MDA_YN)/g' \ | \ sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \ @@ -10741,8 +12928,10 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU -e 's|@''REPLACE_COSF''@|$(REPLACE_COSF)|g' \ -e 's|@''REPLACE_COSHF''@|$(REPLACE_COSHF)|g' \ -e 's|@''REPLACE_EXPF''@|$(REPLACE_EXPF)|g' \ + -e 's|@''REPLACE_EXPL''@|$(REPLACE_EXPL)|g' \ -e 's|@''REPLACE_EXPM1''@|$(REPLACE_EXPM1)|g' \ -e 's|@''REPLACE_EXPM1F''@|$(REPLACE_EXPM1F)|g' \ + -e 's|@''REPLACE_EXPM1L''@|$(REPLACE_EXPM1L)|g' \ -e 's|@''REPLACE_EXP2''@|$(REPLACE_EXP2)|g' \ -e 's|@''REPLACE_EXP2L''@|$(REPLACE_EXP2L)|g' \ -e 's|@''REPLACE_FABSL''@|$(REPLACE_FABSL)|g' \ @@ -10792,11 +12981,12 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \ + -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \ - -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \ + -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \ -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \ -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \ -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \ @@ -10808,16 +12998,27 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ - -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ - } > $@-t && \ - mv $@-t $@ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works. +@GL_GENERATE_STDBOOL_H_TRUE@lib/stdbool.h: lib/stdbool.in.h $(top_builddir)/config.status +@GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_STDBOOL_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_STDBOOL_H_TRUE@ -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' \ +@GL_GENERATE_STDBOOL_H_TRUE@ $(top_srcdir)/lib/stdbool.in.h > $@-t +@GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_at)mv $@-t $@ +@GL_GENERATE_STDBOOL_H_FALSE@lib/stdbool.h: $(top_builddir)/config.status +@GL_GENERATE_STDBOOL_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDDEF_H_TRUE@lib/stddef.h: lib/stddef.in.h $(top_builddir)/config.status -@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_STDDEF_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ -@GL_GENERATE_STDDEF_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ +@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_STDDEF_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @@ -10825,18 +13026,17 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ @GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ -@GL_GENERATE_STDDEF_H_TRUE@ < $(top_srcdir)/lib/stddef.in.h; \ -@GL_GENERATE_STDDEF_H_TRUE@ } > $@-t && \ -@GL_GENERATE_STDDEF_H_TRUE@ mv $@-t $@ +@GL_GENERATE_STDDEF_H_TRUE@ $(top_srcdir)/lib/stddef.in.h > $@-t +@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_STDDEF_H_FALSE@lib/stddef.h: $(top_builddir)/config.status @GL_GENERATE_STDDEF_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. @GL_GENERATE_STDINT_H_TRUE@lib/stdint.h: lib/stdint.in.h $(top_builddir)/config.status -@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \ -@GL_GENERATE_STDINT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ -@GL_GENERATE_STDINT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ +@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)$(MKDIR_P) 'lib' +@GL_GENERATE_STDINT_H_TRUE@ $(gl_V_at)$(SED_HEADER_STDOUT) \ +@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''GUARD_PREFIX''@|GL|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ @@ -10848,8 +13048,6 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ -@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \ -@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \ @@ -10864,83 +13062,92 @@ lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNU @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ @GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ -@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ -@GL_GENERATE_STDINT_H_TRUE@ < $(top_srcdir)/lib/stdint.in.h; \ -@GL_GENERATE_STDINT_H_TRUE@ } > $@-t && \ -@GL_GENERATE_STDINT_H_TRUE@ mv $@-t $@ +@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \ +@GL_GENERATE_STDINT_H_TRUE@ $(top_srcdir)/lib/stdint.in.h > $@-t +@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_at)mv $@-t $@ @GL_GENERATE_STDINT_H_FALSE@lib/stdint.h: $(top_builddir)/config.status @GL_GENERATE_STDINT_H_FALSE@ rm -f $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. lib/stdio.h: lib/stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ - -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \ - -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \ - -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \ - -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \ - -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \ - -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \ - -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \ - -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \ - -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \ - -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \ - -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \ - -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \ - -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \ - -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \ - -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \ - -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \ - -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \ - -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \ - -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \ - -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \ - -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \ - -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \ - -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \ - -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \ - -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \ - -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \ - -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \ - -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \ - -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \ - -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \ - -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \ - -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \ - -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \ - -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \ - -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \ - -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \ - -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \ - -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \ - -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \ - -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \ - -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \ - -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \ - -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \ - -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \ - -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \ - -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \ - -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \ - -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \ - -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \ - -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \ - -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \ - -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \ - -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_DPRINTF''@/$(GL_GNULIB_DPRINTF)/g' \ + -e 's/@''GNULIB_FCLOSE''@/$(GL_GNULIB_FCLOSE)/g' \ + -e 's/@''GNULIB_FDOPEN''@/$(GL_GNULIB_FDOPEN)/g' \ + -e 's/@''GNULIB_FFLUSH''@/$(GL_GNULIB_FFLUSH)/g' \ + -e 's/@''GNULIB_FGETC''@/$(GL_GNULIB_FGETC)/g' \ + -e 's/@''GNULIB_FGETS''@/$(GL_GNULIB_FGETS)/g' \ + -e 's/@''GNULIB_FOPEN''@/$(GL_GNULIB_FOPEN)/g' \ + -e 's/@''GNULIB_FOPEN_GNU''@/$(GL_GNULIB_FOPEN_GNU)/g' \ + -e 's/@''GNULIB_FPRINTF''@/$(GL_GNULIB_FPRINTF)/g' \ + -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GL_GNULIB_FPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_FPURGE''@/$(GL_GNULIB_FPURGE)/g' \ + -e 's/@''GNULIB_FPUTC''@/$(GL_GNULIB_FPUTC)/g' \ + -e 's/@''GNULIB_FPUTS''@/$(GL_GNULIB_FPUTS)/g' \ + -e 's/@''GNULIB_FREAD''@/$(GL_GNULIB_FREAD)/g' \ + -e 's/@''GNULIB_FREOPEN''@/$(GL_GNULIB_FREOPEN)/g' \ + -e 's/@''GNULIB_FSCANF''@/$(GL_GNULIB_FSCANF)/g' \ + -e 's/@''GNULIB_FSEEK''@/$(GL_GNULIB_FSEEK)/g' \ + -e 's/@''GNULIB_FSEEKO''@/$(GL_GNULIB_FSEEKO)/g' \ + -e 's/@''GNULIB_FTELL''@/$(GL_GNULIB_FTELL)/g' \ + -e 's/@''GNULIB_FTELLO''@/$(GL_GNULIB_FTELLO)/g' \ + -e 's/@''GNULIB_FWRITE''@/$(GL_GNULIB_FWRITE)/g' \ + -e 's/@''GNULIB_GETC''@/$(GL_GNULIB_GETC)/g' \ + -e 's/@''GNULIB_GETCHAR''@/$(GL_GNULIB_GETCHAR)/g' \ + -e 's/@''GNULIB_GETDELIM''@/$(GL_GNULIB_GETDELIM)/g' \ + -e 's/@''GNULIB_GETLINE''@/$(GL_GNULIB_GETLINE)/g' \ + -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GL_GNULIB_OBSTACK_PRINTF)/g' \ + -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GL_GNULIB_OBSTACK_PRINTF_POSIX)/g' \ + -e 's/@''GNULIB_PCLOSE''@/$(GL_GNULIB_PCLOSE)/g' \ + -e 's/@''GNULIB_PERROR''@/$(GL_GNULIB_PERROR)/g' \ + -e 's/@''GNULIB_POPEN''@/$(GL_GNULIB_POPEN)/g' \ + -e 's/@''GNULIB_PRINTF''@/$(GL_GNULIB_PRINTF)/g' \ + -e 's/@''GNULIB_PRINTF_POSIX''@/$(GL_GNULIB_PRINTF_POSIX)/g' \ + -e 's/@''GNULIB_PUTC''@/$(GL_GNULIB_PUTC)/g' \ + -e 's/@''GNULIB_PUTCHAR''@/$(GL_GNULIB_PUTCHAR)/g' \ + -e 's/@''GNULIB_PUTS''@/$(GL_GNULIB_PUTS)/g' \ + -e 's/@''GNULIB_REMOVE''@/$(GL_GNULIB_REMOVE)/g' \ + -e 's/@''GNULIB_RENAME''@/$(GL_GNULIB_RENAME)/g' \ + -e 's/@''GNULIB_RENAMEAT''@/$(GL_GNULIB_RENAMEAT)/g' \ + -e 's/@''GNULIB_SCANF''@/$(GL_GNULIB_SCANF)/g' \ + -e 's/@''GNULIB_SNPRINTF''@/$(GL_GNULIB_SNPRINTF)/g' \ + -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GL_GNULIB_SPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GL_GNULIB_STDIO_H_NONBLOCKING)/g' \ + -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GL_GNULIB_STDIO_H_SIGPIPE)/g' \ + -e 's/@''GNULIB_TMPFILE''@/$(GL_GNULIB_TMPFILE)/g' \ + -e 's/@''GNULIB_VASPRINTF''@/$(GL_GNULIB_VASPRINTF)/g' \ + -e 's/@''GNULIB_VDPRINTF''@/$(GL_GNULIB_VDPRINTF)/g' \ + -e 's/@''GNULIB_VFPRINTF''@/$(GL_GNULIB_VFPRINTF)/g' \ + -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GL_GNULIB_VFPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_VFSCANF''@/$(GL_GNULIB_VFSCANF)/g' \ + -e 's/@''GNULIB_VSCANF''@/$(GL_GNULIB_VSCANF)/g' \ + -e 's/@''GNULIB_VPRINTF''@/$(GL_GNULIB_VPRINTF)/g' \ + -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GL_GNULIB_VPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_VSNPRINTF''@/$(GL_GNULIB_VSNPRINTF)/g' \ + -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GL_GNULIB_VSPRINTF_POSIX)/g' \ + -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GL_GNULIB_MDA_FCLOSEALL)/g' \ + -e 's/@''GNULIB_MDA_FDOPEN''@/$(GL_GNULIB_MDA_FDOPEN)/g' \ + -e 's/@''GNULIB_MDA_FILENO''@/$(GL_GNULIB_MDA_FILENO)/g' \ + -e 's/@''GNULIB_MDA_GETW''@/$(GL_GNULIB_MDA_GETW)/g' \ + -e 's/@''GNULIB_MDA_PUTW''@/$(GL_GNULIB_MDA_PUTW)/g' \ + -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GL_GNULIB_MDA_TEMPNAM)/g' \ < $(top_srcdir)/lib/stdio.in.h | \ - sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ + sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \ + -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ + -e 's|@''HAVE_DECL_GETW''@|$(HAVE_DECL_GETW)|g' \ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ + -e 's|@''HAVE_DECL_PUTW''@|$(HAVE_DECL_PUTW)|g' \ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ @@ -10956,6 +13163,7 @@ lib/stdio.h: lib/stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ + -e 's|@''REPLACE_FOPEN_FOR_FOPEN_GNU''@|$(REPLACE_FOPEN_FOR_FOPEN_GNU)|g' \ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ @@ -10986,67 +13194,224 @@ lib/stdio.h: lib/stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ - -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ - } > $@-t && \ - mv $@-t $@ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +lib/stdlib.h: lib/stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \ + $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ + -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ + -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ + -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ + -e 's/@''GNULIB__EXIT''@/$(GL_GNULIB__EXIT)/g' \ + -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GL_GNULIB_ALIGNED_ALLOC)/g' \ + -e 's/@''GNULIB_ATOLL''@/$(GL_GNULIB_ATOLL)/g' \ + -e 's/@''GNULIB_CALLOC_GNU''@/$(GL_GNULIB_CALLOC_GNU)/g' \ + -e 's/@''GNULIB_CALLOC_POSIX''@/$(GL_GNULIB_CALLOC_POSIX)/g' \ + -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GL_GNULIB_CANONICALIZE_FILE_NAME)/g' \ + -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \ + -e 's/@''GNULIB_GETLOADAVG''@/$(GL_GNULIB_GETLOADAVG)/g' \ + -e 's/@''GNULIB_GETPROGNAME''@/$(GL_GNULIB_GETPROGNAME)/g' \ + -e 's/@''GNULIB_GETSUBOPT''@/$(GL_GNULIB_GETSUBOPT)/g' \ + -e 's/@''GNULIB_GRANTPT''@/$(GL_GNULIB_GRANTPT)/g' \ + -e 's/@''GNULIB_MALLOC_GNU''@/$(GL_GNULIB_MALLOC_GNU)/g' \ + -e 's/@''GNULIB_MALLOC_POSIX''@/$(GL_GNULIB_MALLOC_POSIX)/g' \ + -e 's/@''GNULIB_MBTOWC''@/$(GL_GNULIB_MBTOWC)/g' \ + -e 's/@''GNULIB_MKDTEMP''@/$(GL_GNULIB_MKDTEMP)/g' \ + -e 's/@''GNULIB_MKOSTEMP''@/$(GL_GNULIB_MKOSTEMP)/g' \ + -e 's/@''GNULIB_MKOSTEMPS''@/$(GL_GNULIB_MKOSTEMPS)/g' \ + -e 's/@''GNULIB_MKSTEMP''@/$(GL_GNULIB_MKSTEMP)/g' \ + -e 's/@''GNULIB_MKSTEMPS''@/$(GL_GNULIB_MKSTEMPS)/g' \ + -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GL_GNULIB_POSIX_MEMALIGN)/g' \ + -e 's/@''GNULIB_POSIX_OPENPT''@/$(GL_GNULIB_POSIX_OPENPT)/g' \ + -e 's/@''GNULIB_PTSNAME''@/$(GL_GNULIB_PTSNAME)/g' \ + -e 's/@''GNULIB_PTSNAME_R''@/$(GL_GNULIB_PTSNAME_R)/g' \ + -e 's/@''GNULIB_PUTENV''@/$(GL_GNULIB_PUTENV)/g' \ + -e 's/@''GNULIB_QSORT_R''@/$(GL_GNULIB_QSORT_R)/g' \ + -e 's/@''GNULIB_RANDOM''@/$(GL_GNULIB_RANDOM)/g' \ + -e 's/@''GNULIB_RANDOM_R''@/$(GL_GNULIB_RANDOM_R)/g' \ + -e 's/@''GNULIB_REALLOC_GNU''@/$(GL_GNULIB_REALLOC_GNU)/g' \ + -e 's/@''GNULIB_REALLOC_POSIX''@/$(GL_GNULIB_REALLOC_POSIX)/g' \ + -e 's/@''GNULIB_REALLOCARRAY''@/$(GL_GNULIB_REALLOCARRAY)/g' \ + -e 's/@''GNULIB_REALPATH''@/$(GL_GNULIB_REALPATH)/g' \ + -e 's/@''GNULIB_RPMATCH''@/$(GL_GNULIB_RPMATCH)/g' \ + -e 's/@''GNULIB_SECURE_GETENV''@/$(GL_GNULIB_SECURE_GETENV)/g' \ + -e 's/@''GNULIB_SETENV''@/$(GL_GNULIB_SETENV)/g' \ + -e 's/@''GNULIB_STRTOD''@/$(GL_GNULIB_STRTOD)/g' \ + -e 's/@''GNULIB_STRTOL''@/$(GL_GNULIB_STRTOL)/g' \ + -e 's/@''GNULIB_STRTOLD''@/$(GL_GNULIB_STRTOLD)/g' \ + -e 's/@''GNULIB_STRTOLL''@/$(GL_GNULIB_STRTOLL)/g' \ + -e 's/@''GNULIB_STRTOUL''@/$(GL_GNULIB_STRTOUL)/g' \ + -e 's/@''GNULIB_STRTOULL''@/$(GL_GNULIB_STRTOULL)/g' \ + -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GL_GNULIB_SYSTEM_POSIX)/g' \ + -e 's/@''GNULIB_UNLOCKPT''@/$(GL_GNULIB_UNLOCKPT)/g' \ + -e 's/@''GNULIB_UNSETENV''@/$(GL_GNULIB_UNSETENV)/g' \ + -e 's/@''GNULIB_WCTOMB''@/$(GL_GNULIB_WCTOMB)/g' \ + -e 's/@''GNULIB_MDA_ECVT''@/$(GL_GNULIB_MDA_ECVT)/g' \ + -e 's/@''GNULIB_MDA_FCVT''@/$(GL_GNULIB_MDA_FCVT)/g' \ + -e 's/@''GNULIB_MDA_GCVT''@/$(GL_GNULIB_MDA_GCVT)/g' \ + -e 's/@''GNULIB_MDA_MKTEMP''@/$(GL_GNULIB_MDA_MKTEMP)/g' \ + -e 's/@''GNULIB_MDA_PUTENV''@/$(GL_GNULIB_MDA_PUTENV)/g' \ + < $(top_srcdir)/lib/stdlib.in.h | \ + sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \ + -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \ + -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ + -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ + -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \ + -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \ + -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \ + -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ + -e 's|@''HAVE_GETPROGNAME''@|$(HAVE_GETPROGNAME)|g' \ + -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ + -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ + -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \ + -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \ + -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \ + -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ + -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ + -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ + -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ + -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ + -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \ + -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \ + -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ + -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \ + -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \ + -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \ + -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ + -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ + -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \ + -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ + -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ + -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \ + -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \ + -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \ + -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \ + -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ + -e 's|@''HAVE_STRTOL''@|$(HAVE_STRTOL)|g' \ + -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \ + -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \ + -e 's|@''HAVE_STRTOUL''@|$(HAVE_STRTOUL)|g' \ + -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ + -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ + -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ + -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ + -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \ + -e 's|@''REPLACE__EXIT''@|$(REPLACE__EXIT)|g' \ + -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \ + -e 's|@''REPLACE_CALLOC_FOR_CALLOC_GNU''@|$(REPLACE_CALLOC_FOR_CALLOC_GNU)|g' \ + -e 's|@''REPLACE_CALLOC_FOR_CALLOC_POSIX''@|$(REPLACE_CALLOC_FOR_CALLOC_POSIX)|g' \ + -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ + -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \ + -e 's|@''REPLACE_GETLOADAVG''@|$(REPLACE_GETLOADAVG)|g' \ + -e 's|@''REPLACE_GETPROGNAME''@|$(REPLACE_GETPROGNAME)|g' \ + -e 's|@''REPLACE_GETSUBOPT''@|$(REPLACE_GETSUBOPT)|g' \ + -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \ + -e 's|@''REPLACE_MALLOC_FOR_MALLOC_GNU''@|$(REPLACE_MALLOC_FOR_MALLOC_GNU)|g' \ + -e 's|@''REPLACE_MALLOC_FOR_MALLOC_POSIX''@|$(REPLACE_MALLOC_FOR_MALLOC_POSIX)|g' \ + -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \ + -e 's|@''REPLACE_MKOSTEMP''@|$(REPLACE_MKOSTEMP)|g' \ + -e 's|@''REPLACE_MKOSTEMPS''@|$(REPLACE_MKOSTEMPS)|g' \ + -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ + -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \ + -e 's|@''REPLACE_POSIX_OPENPT''@|$(REPLACE_POSIX_OPENPT)|g' \ + -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \ + -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \ + -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ + -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \ + -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \ + -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \ + -e 's|@''REPLACE_REALLOC_FOR_REALLOC_GNU''@|$(REPLACE_REALLOC_FOR_REALLOC_GNU)|g' \ + -e 's|@''REPLACE_REALLOC_FOR_REALLOC_POSIX''@|$(REPLACE_REALLOC_FOR_REALLOC_POSIX)|g' \ + -e 's|@''REPLACE_REALLOCARRAY''@|$(REPLACE_REALLOCARRAY)|g' \ + -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ + -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ + -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \ + -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ + -e 's|@''REPLACE_STRTOL''@|$(REPLACE_STRTOL)|g' \ + -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \ + -e 's|@''REPLACE_STRTOLL''@|$(REPLACE_STRTOLL)|g' \ + -e 's|@''REPLACE_STRTOUL''@|$(REPLACE_STRTOUL)|g' \ + -e 's|@''REPLACE_STRTOULL''@|$(REPLACE_STRTOULL)|g' \ + -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ + -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \ + -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ + -e '/definition of _Noreturn/r $(_NORETURN_H)' \ + -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. lib/string.h: lib/string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ - -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \ - -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \ - -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \ - -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \ - -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \ - -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \ - -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \ - -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \ - -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \ - -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \ - -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \ - -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \ - -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \ - -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \ - -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \ - -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \ - -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \ - -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \ - -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \ - -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \ - -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \ - -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \ - -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \ - -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \ - -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \ - -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \ - -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \ - -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \ - -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \ - -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \ - -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \ - -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \ - -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \ - -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \ - -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \ - -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \ - -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \ - -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \ + -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GL_GNULIB_EXPLICIT_BZERO)/g' \ + -e 's/@''GNULIB_FFSL''@/$(GL_GNULIB_FFSL)/g' \ + -e 's/@''GNULIB_FFSLL''@/$(GL_GNULIB_FFSLL)/g' \ + -e 's/@''GNULIB_MBSLEN''@/$(GL_GNULIB_MBSLEN)/g' \ + -e 's/@''GNULIB_MBSNLEN''@/$(GL_GNULIB_MBSNLEN)/g' \ + -e 's/@''GNULIB_MBSCHR''@/$(GL_GNULIB_MBSCHR)/g' \ + -e 's/@''GNULIB_MBSRCHR''@/$(GL_GNULIB_MBSRCHR)/g' \ + -e 's/@''GNULIB_MBSSTR''@/$(GL_GNULIB_MBSSTR)/g' \ + -e 's/@''GNULIB_MBSCASECMP''@/$(GL_GNULIB_MBSCASECMP)/g' \ + -e 's/@''GNULIB_MBSNCASECMP''@/$(GL_GNULIB_MBSNCASECMP)/g' \ + -e 's/@''GNULIB_MBSPCASECMP''@/$(GL_GNULIB_MBSPCASECMP)/g' \ + -e 's/@''GNULIB_MBSCASESTR''@/$(GL_GNULIB_MBSCASESTR)/g' \ + -e 's/@''GNULIB_MBSCSPN''@/$(GL_GNULIB_MBSCSPN)/g' \ + -e 's/@''GNULIB_MBSPBRK''@/$(GL_GNULIB_MBSPBRK)/g' \ + -e 's/@''GNULIB_MBSSPN''@/$(GL_GNULIB_MBSSPN)/g' \ + -e 's/@''GNULIB_MBSSEP''@/$(GL_GNULIB_MBSSEP)/g' \ + -e 's/@''GNULIB_MBSTOK_R''@/$(GL_GNULIB_MBSTOK_R)/g' \ + -e 's/@''GNULIB_MEMCHR''@/$(GL_GNULIB_MEMCHR)/g' \ + -e 's/@''GNULIB_MEMMEM''@/$(GL_GNULIB_MEMMEM)/g' \ + -e 's/@''GNULIB_MEMPCPY''@/$(GL_GNULIB_MEMPCPY)/g' \ + -e 's/@''GNULIB_MEMRCHR''@/$(GL_GNULIB_MEMRCHR)/g' \ + -e 's/@''GNULIB_MEMSET_EXPLICIT''@/$(GL_GNULIB_MEMSET_EXPLICIT)/g' \ + -e 's/@''GNULIB_RAWMEMCHR''@/$(GL_GNULIB_RAWMEMCHR)/g' \ + -e 's/@''GNULIB_STPCPY''@/$(GL_GNULIB_STPCPY)/g' \ + -e 's/@''GNULIB_STPNCPY''@/$(GL_GNULIB_STPNCPY)/g' \ + -e 's/@''GNULIB_STRCHRNUL''@/$(GL_GNULIB_STRCHRNUL)/g' \ + -e 's/@''GNULIB_STRDUP''@/$(GL_GNULIB_STRDUP)/g' \ + -e 's/@''GNULIB_STRNCAT''@/$(GL_GNULIB_STRNCAT)/g' \ + -e 's/@''GNULIB_STRNDUP''@/$(GL_GNULIB_STRNDUP)/g' \ + -e 's/@''GNULIB_STRNLEN''@/$(GL_GNULIB_STRNLEN)/g' \ + -e 's/@''GNULIB_STRPBRK''@/$(GL_GNULIB_STRPBRK)/g' \ + -e 's/@''GNULIB_STRSEP''@/$(GL_GNULIB_STRSEP)/g' \ + -e 's/@''GNULIB_STRSTR''@/$(GL_GNULIB_STRSTR)/g' \ + -e 's/@''GNULIB_STRCASESTR''@/$(GL_GNULIB_STRCASESTR)/g' \ + -e 's/@''GNULIB_STRTOK_R''@/$(GL_GNULIB_STRTOK_R)/g' \ + -e 's/@''GNULIB_STRERROR''@/$(GL_GNULIB_STRERROR)/g' \ + -e 's/@''GNULIB_STRERROR_R''@/$(GL_GNULIB_STRERROR_R)/g' \ + -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GL_GNULIB_STRERRORNAME_NP)/g' \ + -e 's/@''GNULIB_SIGABBREV_NP''@/$(GL_GNULIB_SIGABBREV_NP)/g' \ + -e 's/@''GNULIB_SIGDESCR_NP''@/$(GL_GNULIB_SIGDESCR_NP)/g' \ + -e 's/@''GNULIB_STRSIGNAL''@/$(GL_GNULIB_STRSIGNAL)/g' \ + -e 's/@''GNULIB_STRVERSCMP''@/$(GL_GNULIB_STRVERSCMP)/g' \ + -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GL_GNULIB_MDA_MEMCCPY)/g' \ + -e 's/@''GNULIB_MDA_STRDUP''@/$(GL_GNULIB_MDA_STRDUP)/g' \ + -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \ < $(top_srcdir)/lib/string.in.h | \ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ - -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ + -e 's|@''HAVE_MEMSET_EXPLICIT''@|$(HAVE_MEMSET_EXPLICIT)|g' \ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ @@ -11059,10 +13424,17 @@ lib/string.h: lib/string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_N -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \ + -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \ + -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \ + -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ + -e 's|@''REPLACE_FFSLL''@|$(REPLACE_FFSLL)|g' \ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ + -e 's|@''REPLACE_MEMPCPY''@|$(REPLACE_MEMPCPY)|g' \ + -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \ + -e 's|@''REPLACE_STPCPY''@|$(REPLACE_STPCPY)|g' \ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ @@ -11074,52 +13446,249 @@ lib/string.h: lib/string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_N -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \ + -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ - -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ - < $(top_srcdir)/lib/string.in.h; \ - } > $@-t && \ - mv $@-t $@ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. lib/sys/types.h: lib/sys_types.in.h $(top_builddir)/config.status - $(AM_V_at)$(MKDIR_P) lib/sys - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib/sys' + $(AM_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \ - < $(top_srcdir)/lib/sys_types.in.h; \ - } > $@-t && \ - mv $@-t $@ + $(top_srcdir)/lib/sys_types.in.h > $@-t + $(AM_V_at)mv $@-t $@ + +# We need the following in order to create an empty placeholder for +# when the system doesn't have one. +lib/unistd.h: lib/unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ + -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ + -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ + -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ + -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ + -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \ + -e 's/@''GNULIB_ACCESS''@/$(GL_GNULIB_ACCESS)/g' \ + -e 's/@''GNULIB_CHDIR''@/$(GL_GNULIB_CHDIR)/g' \ + -e 's/@''GNULIB_CHOWN''@/$(GL_GNULIB_CHOWN)/g' \ + -e 's/@''GNULIB_CLOSE''@/$(GL_GNULIB_CLOSE)/g' \ + -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GL_GNULIB_COPY_FILE_RANGE)/g' \ + -e 's/@''GNULIB_DUP''@/$(GL_GNULIB_DUP)/g' \ + -e 's/@''GNULIB_DUP2''@/$(GL_GNULIB_DUP2)/g' \ + -e 's/@''GNULIB_DUP3''@/$(GL_GNULIB_DUP3)/g' \ + -e 's/@''GNULIB_ENVIRON''@/$(GL_GNULIB_ENVIRON)/g' \ + -e 's/@''GNULIB_EUIDACCESS''@/$(GL_GNULIB_EUIDACCESS)/g' \ + -e 's/@''GNULIB_EXECL''@/$(GL_GNULIB_EXECL)/g' \ + -e 's/@''GNULIB_EXECLE''@/$(GL_GNULIB_EXECLE)/g' \ + -e 's/@''GNULIB_EXECLP''@/$(GL_GNULIB_EXECLP)/g' \ + -e 's/@''GNULIB_EXECV''@/$(GL_GNULIB_EXECV)/g' \ + -e 's/@''GNULIB_EXECVE''@/$(GL_GNULIB_EXECVE)/g' \ + -e 's/@''GNULIB_EXECVP''@/$(GL_GNULIB_EXECVP)/g' \ + -e 's/@''GNULIB_EXECVPE''@/$(GL_GNULIB_EXECVPE)/g' \ + -e 's/@''GNULIB_FACCESSAT''@/$(GL_GNULIB_FACCESSAT)/g' \ + -e 's/@''GNULIB_FCHDIR''@/$(GL_GNULIB_FCHDIR)/g' \ + -e 's/@''GNULIB_FCHOWNAT''@/$(GL_GNULIB_FCHOWNAT)/g' \ + -e 's/@''GNULIB_FDATASYNC''@/$(GL_GNULIB_FDATASYNC)/g' \ + -e 's/@''GNULIB_FSYNC''@/$(GL_GNULIB_FSYNC)/g' \ + -e 's/@''GNULIB_FTRUNCATE''@/$(GL_GNULIB_FTRUNCATE)/g' \ + -e 's/@''GNULIB_GETCWD''@/$(GL_GNULIB_GETCWD)/g' \ + -e 's/@''GNULIB_GETDOMAINNAME''@/$(GL_GNULIB_GETDOMAINNAME)/g' \ + -e 's/@''GNULIB_GETDTABLESIZE''@/$(GL_GNULIB_GETDTABLESIZE)/g' \ + -e 's/@''GNULIB_GETENTROPY''@/$(GL_GNULIB_GETENTROPY)/g' \ + -e 's/@''GNULIB_GETGROUPS''@/$(GL_GNULIB_GETGROUPS)/g' \ + -e 's/@''GNULIB_GETHOSTNAME''@/$(GL_GNULIB_GETHOSTNAME)/g' \ + -e 's/@''GNULIB_GETLOGIN''@/$(GL_GNULIB_GETLOGIN)/g' \ + -e 's/@''GNULIB_GETLOGIN_R''@/$(GL_GNULIB_GETLOGIN_R)/g' \ + -e 's/@''GNULIB_GETOPT_POSIX''@/$(GL_GNULIB_GETOPT_POSIX)/g' \ + -e 's/@''GNULIB_GETPAGESIZE''@/$(GL_GNULIB_GETPAGESIZE)/g' \ + -e 's/@''GNULIB_GETPASS''@/$(GL_GNULIB_GETPASS)/g' \ + -e 's/@''GNULIB_GETPASS_GNU''@/$(GL_GNULIB_GETPASS_GNU)/g' \ + -e 's/@''GNULIB_GETUSERSHELL''@/$(GL_GNULIB_GETUSERSHELL)/g' \ + -e 's/@''GNULIB_GROUP_MEMBER''@/$(GL_GNULIB_GROUP_MEMBER)/g' \ + -e 's/@''GNULIB_ISATTY''@/$(GL_GNULIB_ISATTY)/g' \ + -e 's/@''GNULIB_LCHOWN''@/$(GL_GNULIB_LCHOWN)/g' \ + -e 's/@''GNULIB_LINK''@/$(GL_GNULIB_LINK)/g' \ + -e 's/@''GNULIB_LINKAT''@/$(GL_GNULIB_LINKAT)/g' \ + -e 's/@''GNULIB_LSEEK''@/$(GL_GNULIB_LSEEK)/g' \ + -e 's/@''GNULIB_PIPE''@/$(GL_GNULIB_PIPE)/g' \ + -e 's/@''GNULIB_PIPE2''@/$(GL_GNULIB_PIPE2)/g' \ + -e 's/@''GNULIB_PREAD''@/$(GL_GNULIB_PREAD)/g' \ + -e 's/@''GNULIB_PWRITE''@/$(GL_GNULIB_PWRITE)/g' \ + -e 's/@''GNULIB_READ''@/$(GL_GNULIB_READ)/g' \ + -e 's/@''GNULIB_READLINK''@/$(GL_GNULIB_READLINK)/g' \ + -e 's/@''GNULIB_READLINKAT''@/$(GL_GNULIB_READLINKAT)/g' \ + -e 's/@''GNULIB_RMDIR''@/$(GL_GNULIB_RMDIR)/g' \ + -e 's/@''GNULIB_SETHOSTNAME''@/$(GL_GNULIB_SETHOSTNAME)/g' \ + -e 's/@''GNULIB_SLEEP''@/$(GL_GNULIB_SLEEP)/g' \ + -e 's/@''GNULIB_SYMLINK''@/$(GL_GNULIB_SYMLINK)/g' \ + -e 's/@''GNULIB_SYMLINKAT''@/$(GL_GNULIB_SYMLINKAT)/g' \ + -e 's/@''GNULIB_TRUNCATE''@/$(GL_GNULIB_TRUNCATE)/g' \ + -e 's/@''GNULIB_TTYNAME_R''@/$(GL_GNULIB_TTYNAME_R)/g' \ + -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_UNISTD_H_GETOPT)/g' \ + -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GL_GNULIB_UNISTD_H_NONBLOCKING)/g' \ + -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GL_GNULIB_UNISTD_H_SIGPIPE)/g' \ + -e 's/@''GNULIB_UNLINK''@/$(GL_GNULIB_UNLINK)/g' \ + -e 's/@''GNULIB_UNLINKAT''@/$(GL_GNULIB_UNLINKAT)/g' \ + -e 's/@''GNULIB_USLEEP''@/$(GL_GNULIB_USLEEP)/g' \ + -e 's/@''GNULIB_WRITE''@/$(GL_GNULIB_WRITE)/g' \ + -e 's/@''GNULIB_MDA_ACCESS''@/$(GL_GNULIB_MDA_ACCESS)/g' \ + -e 's/@''GNULIB_MDA_CHDIR''@/$(GL_GNULIB_MDA_CHDIR)/g' \ + -e 's/@''GNULIB_MDA_CLOSE''@/$(GL_GNULIB_MDA_CLOSE)/g' \ + -e 's/@''GNULIB_MDA_DUP''@/$(GL_GNULIB_MDA_DUP)/g' \ + -e 's/@''GNULIB_MDA_DUP2''@/$(GL_GNULIB_MDA_DUP2)/g' \ + -e 's/@''GNULIB_MDA_EXECL''@/$(GL_GNULIB_MDA_EXECL)/g' \ + -e 's/@''GNULIB_MDA_EXECLE''@/$(GL_GNULIB_MDA_EXECLE)/g' \ + -e 's/@''GNULIB_MDA_EXECLP''@/$(GL_GNULIB_MDA_EXECLP)/g' \ + -e 's/@''GNULIB_MDA_EXECV''@/$(GL_GNULIB_MDA_EXECV)/g' \ + -e 's/@''GNULIB_MDA_EXECVE''@/$(GL_GNULIB_MDA_EXECVE)/g' \ + -e 's/@''GNULIB_MDA_EXECVP''@/$(GL_GNULIB_MDA_EXECVP)/g' \ + -e 's/@''GNULIB_MDA_EXECVPE''@/$(GL_GNULIB_MDA_EXECVPE)/g' \ + -e 's/@''GNULIB_MDA_GETCWD''@/$(GL_GNULIB_MDA_GETCWD)/g' \ + -e 's/@''GNULIB_MDA_GETPID''@/$(GL_GNULIB_MDA_GETPID)/g' \ + -e 's/@''GNULIB_MDA_ISATTY''@/$(GL_GNULIB_MDA_ISATTY)/g' \ + -e 's/@''GNULIB_MDA_LSEEK''@/$(GL_GNULIB_MDA_LSEEK)/g' \ + -e 's/@''GNULIB_MDA_READ''@/$(GL_GNULIB_MDA_READ)/g' \ + -e 's/@''GNULIB_MDA_RMDIR''@/$(GL_GNULIB_MDA_RMDIR)/g' \ + -e 's/@''GNULIB_MDA_SWAB''@/$(GL_GNULIB_MDA_SWAB)/g' \ + -e 's/@''GNULIB_MDA_UNLINK''@/$(GL_GNULIB_MDA_UNLINK)/g' \ + -e 's/@''GNULIB_MDA_WRITE''@/$(GL_GNULIB_MDA_WRITE)/g' \ + < $(top_srcdir)/lib/unistd.in.h | \ + sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ + -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \ + -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ + -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ + -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \ + -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ + -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ + -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ + -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \ + -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ + -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ + -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ + -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \ + -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ + -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ + -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ + -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \ + -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \ + -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ + -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ + -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ + -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \ + -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ + -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ + -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \ + -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ + -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ + -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \ + -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ + -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ + -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ + -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ + -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ + -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ + -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \ + -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \ + -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \ + -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \ + -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \ + -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ + -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ + -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ + -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \ + -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \ + -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \ + -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ + -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ + | \ + sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \ + -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ + -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ + -e 's|@''REPLACE_COPY_FILE_RANGE''@|$(REPLACE_COPY_FILE_RANGE)|g' \ + -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ + -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ + -e 's|@''REPLACE_DUP3''@|$(REPLACE_DUP3)|g' \ + -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \ + -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \ + -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \ + -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \ + -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \ + -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \ + -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \ + -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \ + -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ + -e 's|@''REPLACE_FDATASYNC''@|$(REPLACE_FDATASYNC)|g' \ + -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \ + -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ + -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \ + -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \ + -e 's|@''REPLACE_GETENTROPY''@|$(REPLACE_GETENTROPY)|g' \ + -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \ + -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ + -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ + -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \ + -e 's|@''REPLACE_GETPASS_FOR_GETPASS_GNU''@|$(REPLACE_GETPASS_FOR_GETPASS_GNU)|g' \ + -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \ + -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ + -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ + -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ + -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ + -e 's|@''REPLACE_PIPE2''@|$(REPLACE_PIPE2)|g' \ + -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ + -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \ + -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \ + -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ + -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \ + -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ + -e 's|@''REPLACE_SETHOSTNAME''@|$(REPLACE_SETHOSTNAME)|g' \ + -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ + -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ + -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \ + -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \ + -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \ + -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ + -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ + -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ + -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ + -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \ + -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ + -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ + -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ + -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ lib/unitypes.h: lib/unitypes.in.h - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - cat $(top_srcdir)/lib/unitypes.in.h; \ - } > $@-t && \ - mv -f $@-t $@ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/unitypes.in.h + $(AM_V_at)mv $@-t $@ lib/uniwidth.h: lib/uniwidth.in.h - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - cat $(top_srcdir)/lib/uniwidth.in.h; \ - } > $@-t && \ - mv -f $@-t $@ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_TO_AT_t) $(top_srcdir)/lib/uniwidth.in.h + $(AM_V_at)mv $@-t $@ # We need the following in order to create when the system # version does not work standalone. lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ @@ -11127,47 +13696,50 @@ lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ - -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ - -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \ - -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \ - -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \ - -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \ - -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \ - -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \ - -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \ - -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \ - -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \ - -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \ - -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \ - -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \ - -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \ - -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \ - -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \ - -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \ - -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \ - -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \ - -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \ - -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \ - -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \ - -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \ - -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \ - -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \ - -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \ - -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \ - -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \ - -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \ - -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \ - -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \ - -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \ - -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \ - -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \ - -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \ - -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \ - -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \ - -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \ - -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \ - -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \ - -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \ + -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \ + -e 's/@''GNULIB_BTOWC''@/$(GL_GNULIB_BTOWC)/g' \ + -e 's/@''GNULIB_WCTOB''@/$(GL_GNULIB_WCTOB)/g' \ + -e 's/@''GNULIB_MBSINIT''@/$(GL_GNULIB_MBSINIT)/g' \ + -e 's/@''GNULIB_MBRTOWC''@/$(GL_GNULIB_MBRTOWC)/g' \ + -e 's/@''GNULIB_MBRLEN''@/$(GL_GNULIB_MBRLEN)/g' \ + -e 's/@''GNULIB_MBSRTOWCS''@/$(GL_GNULIB_MBSRTOWCS)/g' \ + -e 's/@''GNULIB_MBSNRTOWCS''@/$(GL_GNULIB_MBSNRTOWCS)/g' \ + -e 's/@''GNULIB_WCRTOMB''@/$(GL_GNULIB_WCRTOMB)/g' \ + -e 's/@''GNULIB_WCSRTOMBS''@/$(GL_GNULIB_WCSRTOMBS)/g' \ + -e 's/@''GNULIB_WCSNRTOMBS''@/$(GL_GNULIB_WCSNRTOMBS)/g' \ + -e 's/@''GNULIB_WCWIDTH''@/$(GL_GNULIB_WCWIDTH)/g' \ + -e 's/@''GNULIB_WMEMCHR''@/$(GL_GNULIB_WMEMCHR)/g' \ + -e 's/@''GNULIB_WMEMCMP''@/$(GL_GNULIB_WMEMCMP)/g' \ + -e 's/@''GNULIB_WMEMCPY''@/$(GL_GNULIB_WMEMCPY)/g' \ + -e 's/@''GNULIB_WMEMMOVE''@/$(GL_GNULIB_WMEMMOVE)/g' \ + -e 's/@''GNULIB_WMEMPCPY''@/$(GL_GNULIB_WMEMPCPY)/g' \ + -e 's/@''GNULIB_WMEMSET''@/$(GL_GNULIB_WMEMSET)/g' \ + -e 's/@''GNULIB_WCSLEN''@/$(GL_GNULIB_WCSLEN)/g' \ + -e 's/@''GNULIB_WCSNLEN''@/$(GL_GNULIB_WCSNLEN)/g' \ + -e 's/@''GNULIB_WCSCPY''@/$(GL_GNULIB_WCSCPY)/g' \ + -e 's/@''GNULIB_WCPCPY''@/$(GL_GNULIB_WCPCPY)/g' \ + -e 's/@''GNULIB_WCSNCPY''@/$(GL_GNULIB_WCSNCPY)/g' \ + -e 's/@''GNULIB_WCPNCPY''@/$(GL_GNULIB_WCPNCPY)/g' \ + -e 's/@''GNULIB_WCSCAT''@/$(GL_GNULIB_WCSCAT)/g' \ + -e 's/@''GNULIB_WCSNCAT''@/$(GL_GNULIB_WCSNCAT)/g' \ + -e 's/@''GNULIB_WCSCMP''@/$(GL_GNULIB_WCSCMP)/g' \ + -e 's/@''GNULIB_WCSNCMP''@/$(GL_GNULIB_WCSNCMP)/g' \ + -e 's/@''GNULIB_WCSCASECMP''@/$(GL_GNULIB_WCSCASECMP)/g' \ + -e 's/@''GNULIB_WCSNCASECMP''@/$(GL_GNULIB_WCSNCASECMP)/g' \ + -e 's/@''GNULIB_WCSCOLL''@/$(GL_GNULIB_WCSCOLL)/g' \ + -e 's/@''GNULIB_WCSXFRM''@/$(GL_GNULIB_WCSXFRM)/g' \ + -e 's/@''GNULIB_WCSDUP''@/$(GL_GNULIB_WCSDUP)/g' \ + -e 's/@''GNULIB_WCSCHR''@/$(GL_GNULIB_WCSCHR)/g' \ + -e 's/@''GNULIB_WCSRCHR''@/$(GL_GNULIB_WCSRCHR)/g' \ + -e 's/@''GNULIB_WCSCSPN''@/$(GL_GNULIB_WCSCSPN)/g' \ + -e 's/@''GNULIB_WCSSPN''@/$(GL_GNULIB_WCSSPN)/g' \ + -e 's/@''GNULIB_WCSPBRK''@/$(GL_GNULIB_WCSPBRK)/g' \ + -e 's/@''GNULIB_WCSSTR''@/$(GL_GNULIB_WCSSTR)/g' \ + -e 's/@''GNULIB_WCSTOK''@/$(GL_GNULIB_WCSTOK)/g' \ + -e 's/@''GNULIB_WCSWIDTH''@/$(GL_GNULIB_WCSWIDTH)/g' \ + -e 's/@''GNULIB_WCSFTIME''@/$(GL_GNULIB_WCSFTIME)/g' \ + -e 's/@''GNULIB_MDA_WCSDUP''@/$(GL_GNULIB_MDA_WCSDUP)/g' \ + -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \ < $(top_srcdir)/lib/wchar.in.h | \ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \ @@ -11183,6 +13755,7 @@ lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \ + -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \ @@ -11209,11 +13782,13 @@ lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \ + -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ | \ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \ + -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \ @@ -11225,43 +13800,48 @@ lib/wchar.h: lib/wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NON -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \ + -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \ + -e 's|@''REPLACE_WMEMPCPY''@|$(REPLACE_WMEMPCPY)|g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ - -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ - } > $@-t && \ - mv $@-t $@ + -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ + > $@-t + $(AM_V_at)mv $@-t $@ # We need the following in order to create when the system # doesn't have one that works with the given compiler. lib/wctype.h: lib/wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) - $(AM_V_GEN)rm -f $@-t $@ && \ - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - sed -e 's|@''GUARD_PREFIX''@|GL|g' \ + $(AM_V_GEN)$(MKDIR_P) 'lib' + $(gl_V_at)$(SED_HEADER_STDOUT) \ + -e 's|@''GUARD_PREFIX''@|GL|g' \ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \ - -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \ - -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \ - -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \ - -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \ - -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \ - -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \ + -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \ + -e 's/@''GNULIB_ISWBLANK''@/$(GL_GNULIB_ISWBLANK)/g' \ + -e 's/@''GNULIB_ISWDIGIT''@/$(GL_GNULIB_ISWDIGIT)/g' \ + -e 's/@''GNULIB_ISWXDIGIT''@/$(GL_GNULIB_ISWXDIGIT)/g' \ + -e 's/@''GNULIB_WCTYPE''@/$(GL_GNULIB_WCTYPE)/g' \ + -e 's/@''GNULIB_ISWCTYPE''@/$(GL_GNULIB_ISWCTYPE)/g' \ + -e 's/@''GNULIB_WCTRANS''@/$(GL_GNULIB_WCTRANS)/g' \ + -e 's/@''GNULIB_TOWCTRANS''@/$(GL_GNULIB_TOWCTRANS)/g' \ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \ + -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \ + -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ - < $(top_srcdir)/lib/wctype.in.h; \ - } > $@-t && \ - mv $@-t $@ + $(top_srcdir)/lib/wctype.in.h > $@-t + $(AM_V_at)mv $@-t $@ mostlyclean-local: mostlyclean-generic @for dir in '' $(MOSTLYCLEANDIRS); do \ @@ -11270,23 +13850,28 @@ mostlyclean-local: mostlyclean-generic fi; \ done; \ : +distclean-local: distclean-gnulib-libobjs +distclean-gnulib-libobjs: + -rm -f @gl_LIBOBJDEPS@ +maintainer-clean-local: distclean-gnulib-libobjs -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -shdeps.sed: $(top_srcdir)/arch/misc/shdeps.sh - $(SHELL) $(top_srcdir)/arch/misc/shdeps.sh "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ +$(SH_DEPS_SED_SCRIPT): $(top_srcdir)/$(arch_shdeps_sh) + $(AM_V_GEN)$(SHELL) $(top_srcdir)/$(arch_shdeps_sh) \ + "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -# This is strangly built but not installed +# This is strangely built but not installed all: contrib/chem/README contrib/chem/README: $(chem_srcdir)/README.txt @@ -11316,19 +13901,19 @@ chem: $(chem_srcdir)/chem.pl $(SH_DEPS_SED_SCRIPT) install-data-local: install_chem_extra install_chem_extra: -@BUILD_EXAMPLES_TRUE@ -test -d $(DESTDIR)$(chemexample122dir) \ -@BUILD_EXAMPLES_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(chemexample122dir); -@BUILD_EXAMPLES_TRUE@ for i in $(chem_srcdir)/examples/122/*.chem; do \ -@BUILD_EXAMPLES_TRUE@ n=`echo $$i | sed 's|$(chem_srcdir)/examples/122/||g'`; \ -@BUILD_EXAMPLES_TRUE@ $(INSTALL_DATA) $$i $(DESTDIR)$(chemexample122dir)/$$n; \ -@BUILD_EXAMPLES_TRUE@ done + -test -d $(DESTDIR)$(chemexample122dir) \ + || $(mkinstalldirs) $(DESTDIR)$(chemexample122dir); + for i in $(chem_srcdir)/examples/122/*.chem; do \ + n=`echo $$i | sed 's|$(chem_srcdir)/examples/122/||g'`; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(chemexample122dir)/$$n; \ + done uninstall-local: uninstall_chem_extra uninstall_chem_extra: -@BUILD_EXAMPLES_TRUE@ $(RM) $(DESTDIR)$(exampledir)/chem/122/* -@BUILD_EXAMPLES_TRUE@ -rmdir $(DESTDIR)$(exampledir)/chem/122 -@BUILD_EXAMPLES_TRUE@ $(RM) $(DESTDIR)$(exampledir)/chem/* -@BUILD_EXAMPLES_TRUE@ -rmdir $(DESTDIR)$(exampledir)/chem + $(RM) $(DESTDIR)$(exampledir)/chem/122/* + -rmdir $(DESTDIR)$(exampledir)/chem/122 + $(RM) $(DESTDIR)$(exampledir)/chem/* + -rmdir $(DESTDIR)$(exampledir)/chem -rmdir $(DESTDIR)$(datasubdir)/pic dist-hook: dist_chem @@ -11338,15 +13923,11 @@ dist_chem: cp -f $$i $(distdir)/contrib/chem/examples/122; \ done -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: eqn2graph: $(top_srcdir)/contrib/eqn2graph/eqn2graph.sh $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \ @@ -11355,11 +13936,11 @@ eqn2graph: $(top_srcdir)/contrib/eqn2graph/eqn2graph.sh >$@ \ && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: gdiffmk: $(gdiffmk_srcdir)/gdiffmk.sh $(AM_V_GEN)sed -e "s|[@]BINDIR[@]|$(bindir)|g" \ @@ -11371,25 +13952,14 @@ gdiffmk: $(gdiffmk_srcdir)/gdiffmk.sh >$@ \ && chmod +x $@ -clean-local: clean_gdiffmk_check -clean_gdiffmk_check: - if test -d $(top_builddir)/contrib/gdiffmk/tests; then \ - cd $(top_builddir)/contrib/gdiffmk/tests && \ - $(abs_top_srcdir)/contrib/gdiffmk/tests/runtests.sh clean; \ - fi - -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: # create perl executable 'glilypond', being stored into 'bindir' -glilypond: $(glilypond_srcdir)/glilypond.pl shdeps.sed +glilypond: $(glilypond_srcdir)/glilypond.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)$(RM) $@ \ && sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ @@ -11406,17 +13976,13 @@ uninstall-glilypond-hook: rmdir $(DESTDIR)$(glilyponddir); \ fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -gperl: $(top_srcdir)/contrib/gperl/gperl.pl shdeps.sed +gperl: $(top_srcdir)/contrib/gperl/gperl.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)$(RM) $@ \ && sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ @@ -11427,17 +13993,13 @@ gperl: $(top_srcdir)/contrib/gperl/gperl.pl shdeps.sed >$@ \ && chmod +x $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -gpinyin: contrib/gpinyin/gpinyin.pl +gpinyin: contrib/gpinyin/gpinyin.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \ @@ -11454,15 +14016,11 @@ uninstall-gpinyin-hook: rmdir $(DESTDIR)$(gpinyindir); \ fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: grap2graph: $(grap2graph_srcdir)/grap2graph.sh $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \ @@ -11471,86 +14029,37 @@ grap2graph: $(grap2graph_srcdir)/grap2graph.sh >$@ \ && chmod +x $@ -######################################################################## -### Emacs settings -# Local Variables: -# mode: makefile-automake -# End: - -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: -# mode: makefile-automake # fill-column: 72 -# End: -# vim: set filetype=automake textwidth=72: - -$(ROFF2PROGS): $(groffer_srcdir)/roff2.pl - cp $(groffer_srcdir)/roff2.pl $@ - -# we take roff2.man and replace the @ROFF2MODE@ by the type of file -# (dvi, pdf, html etc ...) -$(ROFF2MAN): $(groffer_srcdir)/roff2.1.man - $(AM_V_GEN)$(MKDIR_P) contrib/groffer \ - && FILEMODE=`echo $@ | sed 's|contrib/groffer/roff2\([a-z][a-z]*\)\.1\.man|\1|g'` \ - && sed -e 's/[@]ROFF2MODE[@]/'"$$FILEMODE"'/g' \ - $(groffer_srcdir)/roff2.1.man \ - > $@; - -groffer: $(GROFFER_PERL) $(GROFFER_REST) $(SH_DEPS_SED_SCRIPT) - $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \ - -e "s|[@]g[@]|$(g)|g" \ - -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \ - -e "s|[@]libdir[@]|$(DESTDIR)$(libdir)|g" \ - -e "s|[@]groffer_dir[@]|$(DESTDIR)$(groffer_dir)|g" \ - -e "s|[@]VERSION[@]|$(VERSION)|g" \ - -e "$(SH_SCRIPT_SED_CMD)" \ - $(groffer_srcdir)/groffer.pl \ - >$@ \ - && chmod +x $@; - -uninstall_groffdirs: uninstall-groffer-hook -uninstall-groffer-hook: - if test -d $(DESTDIR)$(grofferdir); then \ - rmdir $(DESTDIR)$(grofferdir); \ - fi - -######################################################################## -# Editor settings -######################################################################## -# -# Local Variables: # mode: makefile-automake -# fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: -$(hdtblexample_DATA): $(HDTBLSTRIPFILES) -@BUILD_EXAMPLES_TRUE@contrib/hdtbl/examples/test-hdtbl.sh: $(top_builddir)/config.status \ -@BUILD_EXAMPLES_TRUE@ $(HDTBLPROCESSEDEXAMPLEFILES) $(top_srcdir)/contrib/hdtbl/examples/test-hdtbl.sh.in -@BUILD_EXAMPLES_TRUE@ sed -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ -@BUILD_EXAMPLES_TRUE@ -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \ -@BUILD_EXAMPLES_TRUE@ $(top_srcdir)/contrib/hdtbl/examples/test-hdtbl.sh.in > $@ -@BUILD_EXAMPLES_TRUE@ chmod +x $@ +# vim: set autoindent filetype=automake textwidth=72: + +$(hdtblexample_DATA): $(HDTBLTMACFILES) +contrib/hdtbl/examples/test-hdtbl.sh: \ + $(top_builddir)/config.status \ + $(HDTBLPROCESSEDEXAMPLEFILES) \ + $(top_srcdir)/$(hdtbl_test_template) + $(AM_V_GEN)sed \ + -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ + -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \ + $(top_srcdir)/$(hdtbl_test_template) > $@ \ + && chmod +x $@ .roff.ps: $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(HDTBLGROFF) -Tps \ + && $(HDTBLGROFF) -I $(doc_builddir) -I $(doc_srcdir) -Tps \ -dfontpath=$(top_srcdir)/font \ -dsopath=$(hdtbl_srcdir)/ \ -mhdtbl $< >$@ + .in.roff: $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && sed -e "s|[@]fontdir[@]|$(fontdir)|" \ -e "s|[@]EGREP[@]|$(EGREP)|" $< >$@ -$(HDTBLPROCESSEDEXAMPLEFILES): gnu.eps groff troff pic tbl \ - contrib/hdtbl/examples/common.roff - -$(HDTBLSTRIPFILES): $(top_srcdir)/tmac/strip.sed - @$(MKDIR_P) `dirname $@` - sed -f $(top_srcdir)/tmac/strip.sed $(hdtbl_srcdir)/`basename $@`-u > $@; +$(HDTBLPROCESSEDEXAMPLEFILES): $(DOC_GNU_EPS) groff troff eqn pic tbl \ + grops font/devps/stamp contrib/hdtbl/examples/common.roff uninstall_groffdirs: uninstall-hdtbl-hook uninstall-hdtbl-hook: @@ -11558,24 +14067,22 @@ uninstall-hdtbl-hook: rmdir $(DESTDIR)$(hdtblexampledir); \ fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: mmroff: $(mm_srcdir)/mmroff.pl - $(AM_V_GEN)$(SED) -e 's;/usr/bin/perl;$(PERL);' \ - $(mm_srcdir)/mmroff.pl \ - >$@ \ - && chmod +x $@ - -# Special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac -# and MMLOCALE + $(AM_V_GEN)$(SED) \ + -e 's;[@]PERL[@];$(PERL);' \ + -e 's;[@]VERSION[@];$(VERSION);' \ + $(mm_srcdir)/mmroff.pl \ + >$@.tmp \ + && chmod +x $@.tmp \ + && mv $@.tmp $@ + +# special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac install-data-local: install_mm install_mm: -test -d $(DESTDIR)$(tmacdir) || $(mkinstalldirs) $(DESTDIR)$(tmacdir) @@ -11590,19 +14097,11 @@ install_mm: $(mm_srcdir)/mmse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac @$(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \ $(mm_srcdir)/mm.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac - @for f in $(MMLOCALE); do \ - test -f $(DESTDIR)$(tmacdir)/mm/$$f \ - || touch $(DESTDIR)$(tmacdir)/mm/$$f; \ - done uninstall-local: uninstall_mm uninstall_mm: if test -d $(DESTDIR)$(mmexampledir); then \ rmdir $(DESTDIR)$(mmexampledir); \ fi - -for f in $(MMLOCALE); do \ - test -s $(DESTDIR)$(tmacdir)/mm/$$f \ - || $(RM) $(DESTDIR)$(tmacdir)/mm/$$f; \ - done $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac @@ -11618,43 +14117,45 @@ dist_mm: cp -f $$i $(distdir)/contrib/mm/; \ done -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -# vim: set filetype=automake: -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@contrib/mom/examples/tests-mom.sh: $(top_builddir)/config.status \ -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@ $(MOMPROCESSEDEXAMPLEFILES) $(top_srcdir)/contrib/mom/examples/test-mom.sh.in -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@ sed -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@ -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \ -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@ $(top_srcdir)/contrib/mom/examples/test-mom.sh.in > $@ -@BUILD_PDFEXAMPLES_TRUE@@HAVE_PDFTOOLS_TRUE@ chmod +x $@ +# vim: set autoindent filetype=automake textwidth=72: +contrib/mom/examples/tests-mom.sh: \ + $(top_builddir)/config.status \ + $(MOMPROCESSEDEXAMPLEFILES) \ + $(top_srcdir)/$(mom_test_template) + $(AM_V_GEN)sed \ + -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ + -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \ + $(top_srcdir)/$(mom_test_template) > $@ \ + && chmod +x $@ .mom.pdf: $(GROFF_V)$(MKDIR_P) `dirname $@` \ && LC_ALL=C $(MOMPDFMOM) $< >$@ $(MOMPROCESSEDEXAMPLEFILES): $(MOMNORMALFILES) \ - groff troff gropdf pdfmom penguin.ps penguin.pdf \ - gnu.eps font/devpdf/build_font_files + groff troff gropdf pdfmom penguin.ps penguin.pdf font/devpdf/stamp penguin.ps: - cp $(mom_srcdir)/examples/penguin.ps $@ + $(AM_V_at)cp $(mom_srcdir)/examples/penguin.ps $@ penguin.pdf: - cp $(mom_srcdir)/examples/penguin.pdf $@ + $(AM_V_at)cp $(mom_srcdir)/examples/penguin.pdf $@ install-data-hook: install_mom install_mom: -@BUILD_PDFEXAMPLES_TRUE@ for f in $(PDFDOCFILE); do \ -@BUILD_PDFEXAMPLES_TRUE@ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \ -@BUILD_PDFEXAMPLES_TRUE@ ln -s $(exampledir)/mom/$$f $(DESTDIR)$(pdfdocdir)/$$f; \ -@BUILD_PDFEXAMPLES_TRUE@ done +@USE_GROPDF_TRUE@ for f in $(PDFDOCFILE); do \ +@USE_GROPDF_TRUE@ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \ +@USE_GROPDF_TRUE@ ln -s $(exampledir)/mom/$$f $(DESTDIR)$(pdfdocdir)/$$f; \ +@USE_GROPDF_TRUE@ done uninstall_groffdirs: uninstall_mom uninstall_mom: for f in $(PDFDOCFILE); do \ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \ done + -rmdir $(DESTDIR)$(pdfdocdir) if test -d $(DESTDIR)$(exampledir)/mom; then \ rmdir $(DESTDIR)$(exampledir)/mom; \ fi @@ -11662,21 +14163,22 @@ uninstall_mom: rmdir $(DESTDIR)$(htmldocdir)/mom; \ fi -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -# vim: set filetype=automake: +# vim: set autoindent filetype=automake textwidth=72: contrib/pdfmark/pdfmark.pdf: contrib/pdfmark/pdfmark.ms $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(PDFROFF) -mspdf --stylesheet=$(pdfmark_srcdir)/cover.ms \ - $(top_srcdir)/contrib/pdfmark/pdfmark.ms >$@ + && $(PDFROFF) -I $(doc_builddir) -I $(doc_srcdir) -mspdf \ + --stylesheet=$(pdfmark_srcdir)/cover.ms \ + $(top_srcdir)/contrib/pdfmark/pdfmark.ms >$@ # The pdf files use the local script to generate. -$(PDFDOCFILES): pdfroff groff troff gropdf -$(PDFDOCFILES): $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) gnu.eps +$(PDFDOCFILES): pdfroff groff troff gropdf +$(PDFDOCFILES): $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) \ + $(DOC_GNU_EPS) pdfroff: contrib/pdfmark/pdfroff.sh $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)sed -f $(SH_DEPS_SED_SCRIPT) \ @@ -11693,19 +14195,13 @@ mostlyclean_pdfmark: uninstall_groffdirs: uninstall-pdfmark-hook uninstall-pdfmark-hook: -@BUILD_PDFDOC_TRUE@ if test -d $(DESTDIR)$(pdfmarkpdfdocdir); then \ -@BUILD_PDFDOC_TRUE@ rmdir $(DESTDIR)$(pdfmarkpdfdocdir); \ -@BUILD_PDFDOC_TRUE@ fi +@USE_PDFROFF_TRUE@ -rmdir $(DESTDIR)$(pdfmarkpdfdocdir) -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: pic2graph: $(pic2graph_srcdir)/pic2graph.sh $(AM_V_GEN)sed -e "s|[@]g[@]|$(g)|g" \ @@ -11714,365 +14210,532 @@ pic2graph: $(pic2graph_srcdir)/pic2graph.sh >$@ \ && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -doc/automake.pdf: doc/automake.mom \ - groff troff gropdf pdfmom font/devpdf/build_font_files \ - contrib/mom/om.tmac +# vim: set autoindent filetype=automake textwidth=72: + +# Local Variables: +# fill-column: 72 +# mode: makefile-automake +# End: +# vim: set autoindent filetype=automake textwidth=72: + +# The ordering of the sed -e expressions is important. +$(sboxes_builddir)/msboxes.ms: $(SBOXES_EXAMPLEFILES) $(sboxesnotquine) + $(AM_V_at)mkdir -p $(sboxes_builddir) + $(AM_V_at)$(SED) -n -e '1,/REPLACEME/p' \ + $(SBOXES_EXAMPLEFILES) > $@.tmp + $(AM_V_at)$(SED) -f $(sboxesnotquine) \ + $(SBOXES_EXAMPLEFILES) >> $@.tmp + $(AM_V_at)$(SED) -n -e '/REPLACEME/,$$p' \ + $(SBOXES_EXAMPLEFILES) >> $@.tmp + $(AM_V_GEN)mv $@.tmp $@ + +$(sboxes_builddir)/msboxes.pdf: $(sboxes_builddir)/msboxes.ms \ + $(dist_sboxestmac_DATA) groff troff gropdf font/devpdf/stamp + $(GROFF_V)$(DOC_GROFF) -M$(sboxes_srcdir) -ms -msboxes -Tpdf \ + $(sboxes_builddir)/msboxes.ms > $@ + +uninstall_groffdirs: uninstall_sboxes +uninstall_sboxes: + if test -d $(DESTDIR)$(exampledir)/sboxes; then \ + rmdir $(DESTDIR)$(exampledir)/sboxes; \ + fi +@USE_GROPDF_TRUE@ -rmdir $(DESTDIR)$(sboxespdfdocdir) -# For simplicity, we always call preconv, grn, and eqn. -.me.txt: +# Local Variables: +# fill-column: 72 +# mode: makefile-automake +# End: +# vim: set autoindent filetype=automake textwidth=72: + +@USE_GROHTML_TRUE@$(PROCESSEDDOCFILES_HTML): $(PROCESSEDFILES_DEPS_HTML) +$(PROCESSEDDOCFILES_PS): $(PROCESSEDFILES_DEPS_PS) +@USE_GROPDF_TRUE@$(PROCESSEDDOCFILES_PDF): $(PROCESSEDFILES_DEPS_PDF) +$(PROCESSEDDOCFILES_TXT): $(PROCESSEDFILES_DEPS_TXT) +doc/automake.pdf: doc/automake.mom pdfmom contrib/mom/om.tmac + +$(PROCESSEDEXAMPLEFILES_HTML): $(PROCESSEDFILES_DEPS_HTML) +$(PROCESSEDEXAMPLEFILES_PS): $(PROCESSEDFILES_DEPS_PS) + +# This is a convenience target for (re-)generating all the man pages. +man-all: $(GROFF_MAN_PAGES_ALL) + +# ...and for cleaning them. +man-clean: + $(RM) $(GROFF_MAN_PAGES_ALL) + +# Many pages use tbl, a few use eqn, and soelim(1) uses pic. We also +# need groff's FreeEuro font so we can embed it. +# +# We embed the fonts (-P-e) to (1) honor the current PDF standard, (2) +# ensure consistent rendering of the document, and (3) exercise this +# feature of gropdf. +doc/groff-man-pages.pdf: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \ + $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC) font/devps/freeeuro.pfa + $(GROFF_V)$(DOC_GROFF) -pet -mandoc -dHF=HB -rC1 \ + -rCHECKSTYLE=3 -Tpdf -P-e \ + $(GROFF_MAN_PAGES1) \ + $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \ + $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@ + +doc/groff-man-pages.utf8.txt: $(GROFF_MAN_PAGES_ALL) eqn pic tbl \ + $(TMAC_PACKAGE_MAN) $(TMAC_PACKAGE_MDOC) + $(GROFF_V)$(DOC_GROFF) -pet -Tutf8 -mandoc \ + -rCHECKSTYLE=3 $(GROFF_MAN_PAGES1) \ + $(tmac_srcdir)/sv.tmac $(GROFF_MAN_PAGES2) \ + $(tmac_srcdir)/en.tmac $(GROFF_MAN_PAGES3) > $@ + +doc/grnexmpl.ps: $(doc_srcdir)/grnexmpl.me $(doc_srcdir)/grnexmpl.g \ + grn eqn + $(GROFF_V)$(MKDIR_P) `dirname $@` \ + && $(DOC_GROFF) -Tps -ge -me $(doc_srcdir)/grnexmpl.me >$@ + +# Generating *.me from *.me.in is, surprisingly, a challenge. +# 1. A pattern rule ("%.me: %.me.in") is not portable to NetBSD or +# OpenBSD make. +# 2. A single-suffix rule works in an isolated Makefile, but _only_ +# with the .SUFFIXES special target, not with the +# (Automake-specific) SUFFIXES macro. +# .SUFFIXES: .in +# .in: +# $(DOC_SED) $< >$@ +# (One can validly complain that this approach is too general.) +# 3. GNU Automake insists that we use the SUFFIXES macro and not the +# special target. +# error: use variable 'SUFFIXES', not target '.SUFFIXES' +# 4. What about a target rule? We'd have to explicitly write the first +# dependency name in the rule commands because NetBSD make (and +# reportedly OpenBSD) refuses to honor the $< variable in target +# rules. +# +# So what is left? A double-suffix rule--but you have to use it in a +# special way that is explicitly not countenanced by POSIX. +# +# "The application shall ensure that the target portion is a valid +# target name (see Target Rules) of the form .s2 or .s1.s2 (where .s1 +# and .s2 are suffixes that have been given as prerequisites of the +# .SUFFIXES special target and s1 and s2 do not contain any or +# characters.) If there is only one in the target, +# it is a single-suffix inference rule. Targets with two periods are +# double-suffix inference rules. Inference rules can have only one +# target before the ." +# (POSIX Issue 8, make(1), "Inference Rules") +# +# A double-suffix rule won't work in an obvious way because its +# semantics are that the suffix is replaced, not removed. You have to +# add both suffixes to the .SUFFIXES special target, in order with the +# dependency first. +# .SUFFIXES: .me.in .me +# .me.in.me: +# $(DOC_SED) $< >$@ +# Thanks to Automake, we must say +# SUFFIXES += .me.in .me +# for reason 3 above. The GNU Automake manual does not explicitly state +# that it preserves the ordering of the suffixes, but for now it does. +# +# It appears to be dumb luck that this works; the rigamarole by itself +# justifies to me the worth of GNU Make's pattern rules (which require +# neither '.SUFFIXES' nor 'SUFFIXES') and establishing semantics for $< +# in target rules. But I won't hold my breath waiting on other make(1) +# implementors to agree. -- GBR +.PRECIOUS: $(GENERATEDDOCFILES) +.me.in.me: $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(DOC_GROFF) -k -Tutf8 -ge -me >$@ + && $(DOC_SED) $< >$@ + .me.ps: $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(DOC_GROFF) -k -Tps -ge -me >$@ + && $(DOC_GROFF) -Tps -me $< >$@ + +# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet. +# The French translation uses tbl; its English counterpart does not. +doc/meintro_fr.ps: doc/meintro_fr.me preconv + $(GROFF_V)$(MKDIR_P) `dirname $@` \ + && $(DOC_GROFF) -K utf8 -t -Tps -me -mfr $< >$@ -.ms.html: +doc/ms.ps: $(doc_srcdir)/ms.ms eqn tbl $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(DOC_GROFF) -P-p -P-b -P-I`basename $< | sed -e 's|.ms$$||'` \ - -P-D$(imagedir) -Thtml -ms >$@ -.ms.txt: + && $(DOC_GROFF) -et -Tps -ms $(doc_srcdir)/ms.ms >$@ + +doc/pic.ps: $(doc_srcdir)/pic.ms eqn pic tbl $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(DOC_GROFF) -Tascii -ms -mwww >$@ -.ms.ps: + && $(DOC_GROFF) -pet -Tps -ms $(doc_srcdir)/pic.ms >$@ + +doc/webpage.ps: $(DOC_GNU_EPS) tmac/www.tmac tbl +doc/webpage.ps: $(doc_srcdir)/webpage.ms $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(DOC_GROFF) -Tps -ms -mwww >$@ + && $(DOC_GROFF) -I $(doc_srcdir) -I $(doc_builddir) -t -Tps \ + -ms -mwww $(doc_srcdir)/webpage.ms >$@ -$(PROCESSEDEXAMPLEFILES): $(bin_PROGRAMS) $(prefixexecbin_PROGRAMS) gnu.eps -$(PROCESSEDEXAMPLEFILES): $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) $(hdtbltmac_DATA) -$(PROCESSEDEXAMPLEFILES): $(dist_tmac_DATA) $(nodist_tmac_DATA) -$(PROCESSEDDOCFILES): $(bin_PROGRAMS) $(prefixexecbin_PROGRAMS) gnu.eps +# We have no "generic" ms documents. +#.ms.ps: +# $(GROFF_V)$(MKDIR_P) `dirname $@` \ +# && $(DOC_GROFF) -Tps -ms $< >$@ +doc/pic.html: eqn pic tbl doc/pic.html: tmac/www.tmac -doc/pic.html: $(bin_PROGRAMS) $(prefixexecbin_PROGRAMS) -doc/pic.html: doc/examples.stamp -doc/pic.html: $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) -doc/pic.html: $(doc_srcdir)/pic.ms $(devhtmlfont_DATA) +doc/pic.html: $(doc_srcdir)/pic.ms $(GROFF_V)$(MKDIR_P) $(doc_builddir) \ && cd $(doc_builddir) \ - && $(DOC_SED) $(doc_srcdir)/pic.ms \ - | $(DOC_GROFF_ONLY) -P-p -P-Ipic -P-D$(imagedir) -P-jpic \ - -Thtml -ms > pic.html - -doc/examples.stamp: doc/groff.css - @$(MKDIR_P) $(doc_builddir) - test -f $(doc_builddir)/groff.css || cp $(doc_srcdir)/groff.css $(doc_builddir) - echo timestamp > $@ - -doc/webpage.html: $(bin_PROGRAMS) $(prefixexecbin_PROGRAMS) -doc/webpage.html: doc/examples.stamp $(devhtmlfont_DATA) -doc/webpage.html: $(dist_devpsfont_DATA) $(nodist_devpsfont_DATA) -doc/webpage.html: $(doc_srcdir)/webpage.ms gnu.eps $(doc_srcdir)/groff.css - $(GROFF_V)$(MKDIR_P) doc \ + && $(DOC_GROFF) -pet -P-Ipic -P-Dimg -P-jpic -Thtml -ms \ + $(doc_srcdir)/pic.ms > pic.html + +doc/webpage.html: tbl +doc/webpage.html: tmac/www.tmac +doc/webpage.html: $(DOC_GNU_EPS) +doc/webpage.html: $(doc_srcdir)/groff.css +doc/webpage.html: $(doc_srcdir)/webpage.ms + $(GROFF_V)$(MKDIR_P) $(doc_builddir) \ && cd $(doc_builddir) \ - && $(DOC_SED) $(doc_srcdir)/webpage.ms \ - | $(DOC_GROFF_ONLY) -P-jwebpage -P-nrpb -P-Iwebpage \ - -P-D$(imagedir) -Thtml -ms > webpage.html + && $(DOC_GROFF) -t -I $(doc_srcdir) -P-jwebpage -P-nrb \ + -P-Iwebpage -P-Dimg -Thtml -ms $(doc_srcdir)/webpage.ms \ + > webpage.html -doc/grnexmpl.ps: doc/grnexmpl.me doc/grnexmpl.g - -# Note that we remove groff.css only if out-of-source build tree +# We remove groff.css only from an out-of-source build tree. mostlyclean-local: mostlyclean_doc mostlyclean_doc: -@BUILD_HTML_TRUE@ if test -d $(doc_builddir); then \ -@BUILD_HTML_TRUE@ cd $(doc_builddir) && \ -@BUILD_HTML_TRUE@ for f in $(HTMLDOCFILESALL); do \ -@BUILD_HTML_TRUE@ $(RM) $$f; \ -@BUILD_HTML_TRUE@ done; \ -@BUILD_HTML_TRUE@ fi -@BUILD_HTML_TRUE@ if test -d $(doc_builddir)/$(imagedir); then \ -@BUILD_HTML_TRUE@ cd $(doc_builddir)/$(imagedir) && \ -@BUILD_HTML_TRUE@ for f in $(HTMLDOCIMAGEFILES); do \ -@BUILD_HTML_TRUE@ $(RM) $$f; \ -@BUILD_HTML_TRUE@ done; \ -@BUILD_HTML_TRUE@ fi +@USE_GROHTML_TRUE@ if test -d $(doc_builddir); then \ +@USE_GROHTML_TRUE@ cd $(doc_builddir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLDOCFILESALL); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done; \ +@USE_GROHTML_TRUE@ fi +@USE_GROHTML_TRUE@ if test -d $(doc_builddir)/img; then \ +@USE_GROHTML_TRUE@ cd $(doc_builddir)/img \ +@USE_GROHTML_TRUE@ && for f in $(HTMLDOCIMAGEFILES); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done; \ +@USE_GROHTML_TRUE@ rmdir $(doc_builddir)/img || :; \ +@USE_GROHTML_TRUE@ fi if test $(top_builddir) != $(top_srcdir); then \ $(RM) $(top_builddir)/doc/groff.css; \ fi - -@BUILD_HTMLEXAMPLES_TRUE@ if test -d $(doc_builddir); then \ -@BUILD_HTMLEXAMPLES_TRUE@ cd $(doc_builddir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ for f in $(HTMLEXAMPLEFILESALL); do \ -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ done; \ -@BUILD_HTMLEXAMPLES_TRUE@ fi -@BUILD_HTMLEXAMPLES_TRUE@ if test -d $(doc_builddir)/$(imagedir); then \ -@BUILD_HTMLEXAMPLES_TRUE@ cd $(doc_builddir)/$(imagedir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ for f in $(HTMLEXAMPLEIMAGEFILES); do \ -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ done; \ -@BUILD_HTMLEXAMPLES_TRUE@ fi +@USE_GROHTML_TRUE@ if test -d $(doc_builddir); then \ +@USE_GROHTML_TRUE@ cd $(doc_builddir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEFILESALL); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done; \ +@USE_GROHTML_TRUE@ fi +@USE_GROHTML_TRUE@ if test -d $(doc_builddir)/img; then \ +@USE_GROHTML_TRUE@ cd $(doc_builddir)/img \ +@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEIMAGEFILES); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done; \ +@USE_GROHTML_TRUE@ rmdir $(doc_builddir)/img || :; \ +@USE_GROHTML_TRUE@ fi install-data-hook: install_doc_htmldoc install_doc_htmldoc: -@BUILD_HTML_TRUE@ cd $(doc_builddir) && \ -@BUILD_HTML_TRUE@ for f in `ls $(HTMLDOCFILESALL)`; do \ -@BUILD_HTML_TRUE@ $(RM) $(DESTDIR)$(htmldocdir)/$$f; \ -@BUILD_HTML_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(htmldocdir)/$$f; \ -@BUILD_HTML_TRUE@ done -@BUILD_HTML_TRUE@ -test -d $(DESTDIR)$(htmldocimagedir) \ -@BUILD_HTML_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(htmldocimagedir) -@BUILD_HTML_TRUE@ $(RM) $(DESTDIR)$(htmldocimagedir)/$(HTMLDOCIMAGEFILES) -@BUILD_HTML_TRUE@ $(INSTALL_DATA) $(doc_builddir)/$(imagedir)/$(HTMLDOCIMAGEFILES) \ -@BUILD_HTML_TRUE@ $(DESTDIR)$(htmldocimagedir) - -install-data-hook: install_doc_examples -install_doc_examples: gnu.eps -# Prefer gnu.eps in builddir over srcdir. -@BUILD_EXAMPLES_TRUE@ d=.; test -f "gnu.eps" || d=$(doc_srcdir); \ -@BUILD_EXAMPLES_TRUE@ $(RM) $(DESTDIR)$(exampledir)/gnu.eps; \ -@BUILD_EXAMPLES_TRUE@ $(INSTALL_DATA) $$d/gnu.eps $(DESTDIR)$(exampledir)/gnu.eps -@BUILD_HTMLEXAMPLES_TRUE@ cd $(doc_builddir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ for f in `ls $(HTMLEXAMPLEFILESALL)`; do \ -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $(DESTDIR)$(exampledir)/$$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(exampledir)/$$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ done -@BUILD_HTMLEXAMPLES_TRUE@ -test -d $(DESTDIR)$(exampleimagedir) \ -@BUILD_HTMLEXAMPLES_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(exampleimagedir) -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $(DESTDIR)$(exampleimagedir)/$(HTMLEXAMPLEIMAGEFILES) -@BUILD_HTMLEXAMPLES_TRUE@ $(INSTALL_DATA) $(doc_builddir)/$(imagedir)/$(HTMLEXAMPLEIMAGEFILES) \ -@BUILD_HTMLEXAMPLES_TRUE@ $(DESTDIR)$(exampleimagedir) - -uninstall-hook: uninstall_doc_examples uninstall_doc_htmldoc uninstall_mom +@USE_GROHTML_TRUE@ cd $(doc_builddir) \ +@USE_GROHTML_TRUE@ && for f in `ls $(HTMLDOCFILESALL)`; do \ +@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(htmldocdir)/$$f; \ +@USE_GROHTML_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(htmldocdir)/$$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \ +@USE_GROHTML_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/$(imagedir) +@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(htmldocdir)/$(imagedir)/$(HTMLDOCIMAGEFILES) +@USE_GROHTML_TRUE@ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLDOCIMAGEFILES) \ +@USE_GROHTML_TRUE@ $(DESTDIR)$(htmldocdir)/$(imagedir) + +install-data-hook: install_doc_gnu_eps install_doc_examples + +install_doc_gnu_eps: $(DOC_GNU_EPS) + for d in $(doc_builddir) $(doc_srcdir); do \ + if test -f "$$d/gnu.eps"; then \ + $(RM) $(DESTDIR)$(exampledir)/gnu.eps; \ + $(INSTALL_DATA) \ + $$d/gnu.eps $(DESTDIR)$(exampledir)/gnu.eps; \ + break; \ + fi; \ + done + +install_doc_examples: $(DOC_GNU_EPS) +@USE_GROHTML_TRUE@ cd $(doc_builddir) \ +@USE_GROHTML_TRUE@ && for f in `ls $(HTMLEXAMPLEFILESALL)`; do \ +@USE_GROHTML_TRUE@ $(RM) $(DESTDIR)$(exampledir)/$$f; \ +@USE_GROHTML_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(exampledir)/$$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(exampledir)/$(imagedir) \ +@USE_GROHTML_TRUE@ || $(mkinstalldirs) $(DESTDIR)$(exampledir)/$(imagedir) +@USE_GROHTML_TRUE@ $(RM) \ +@USE_GROHTML_TRUE@ $(DESTDIR)$(exampledir)/$(imagedir)/$(HTMLEXAMPLEIMAGEFILES) +@USE_GROHTML_TRUE@ $(INSTALL_DATA) $(doc_builddir)/img/$(HTMLEXAMPLEIMAGEFILES) \ +@USE_GROHTML_TRUE@ $(DESTDIR)$(exampledir)/$(imagedir) + +uninstall-hook: \ + uninstall_doc_examples uninstall_doc_htmldoc uninstall_doc_examples: -@BUILD_EXAMPLES_TRUE@ $(RM) -f $(DESTDIR)$(exampledir)/gnu.eps -@BUILD_HTMLEXAMPLES_TRUE@ -test -d $(DESTDIR)$(docexamplesdir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ cd $(DESTDIR)$(docexamplesdir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ for f in $(HTMLEXAMPLEFILESALL); do \ -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ done -@BUILD_HTMLEXAMPLES_TRUE@ -test -d $(DESTDIR)$(docexamplesdir)/$(imagedir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ cd $(DESTDIR)$(docexamplesdir)/$(imagedir) && \ -@BUILD_HTMLEXAMPLES_TRUE@ for f in $(HTMLEXAMPLEIMAGEFILES); do \ -@BUILD_HTMLEXAMPLES_TRUE@ $(RM) $$f; \ -@BUILD_HTMLEXAMPLES_TRUE@ done -@BUILD_HTMLEXAMPLES_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir)/$(imagedir) -@BUILD_HTMLEXAMPLES_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir) + $(RM) $(DESTDIR)$(exampledir)/gnu.eps +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(docexamplesdir) \ +@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(docexamplesdir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEFILESALL); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(docexamplesdir)/$(imagedir) \ +@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(docexamplesdir)/$(imagedir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLEXAMPLEIMAGEFILES); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir)/$(imagedir) +@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(docexamplesdir) uninstall_doc_htmldoc: -@BUILD_HTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir) && \ -@BUILD_HTML_TRUE@ cd $(DESTDIR)$(htmldocdir) && \ -@BUILD_HTML_TRUE@ for f in $(HTMLDOCFILESALL); do \ -@BUILD_HTML_TRUE@ $(RM) $$f; \ -@BUILD_HTML_TRUE@ done -@BUILD_HTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) && \ -@BUILD_HTML_TRUE@ cd $(DESTDIR)$(htmldocdir)/$(imagedir) && \ -@BUILD_HTML_TRUE@ for f in $(HTMLDOCIMAGEFILES); do \ -@BUILD_HTML_TRUE@ $(RM) $$f; \ -@BUILD_HTML_TRUE@ done -@BUILD_HTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir)/$(imagedir) -@BUILD_HTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir) - -# Texinfo doc -# -# Users who want to print out the groff manual are expected to have a -# working TeX installation. Note that texi2dvi properly honours the -# `MAKEINFO' environment variable. -# -# We can't use automake's facilities because the make dist target attempts to -# generate a pdf version of groff.texi by invoking texi2dvi without the -e -# option, which is needed to build this file. -# info_TEXINFOS = doc/groff.texi -# doc_groff_TEXINFOS = doc/fdl.texi -# -# Note that GNU standards require to install only info doc. Info doc -# can still be disabled by passing -# --with-doc= -# to configure - -all: build_infodoc -@BUILD_INFODOC_TRUE@build_infodoc: doc/groff.info -@BUILD_INFODOC_TRUE@doc/groff.info: $(doc_srcdir)/groff.texi -@BUILD_INFODOC_TRUE@ @$(MKDIR_P) $(doc_builddir) -@BUILD_INFODOC_TRUE@ LANG=C \ -@BUILD_INFODOC_TRUE@ LC_ALL=C \ -@BUILD_INFODOC_TRUE@ $(MAKEINFO) -o doc/groff.info --enable-encoding -I$(doc_srcdir) $(doc_srcdir)/groff.texi -@BUILD_INFODOC_FALSE@build_infodoc: -# Rules to generate various doc files from .texi files. -.texi.txt: - @$(MKDIR_P) $(doc_builddir) - LANG=C \ +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir) \ +@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(htmldocdir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLDOCFILESALL); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/$(imagedir) \ +@USE_GROHTML_TRUE@ && cd $(DESTDIR)$(htmldocdir)/$(imagedir) \ +@USE_GROHTML_TRUE@ && for f in $(HTMLDOCIMAGEFILES); do \ +@USE_GROHTML_TRUE@ $(RM) $$f; \ +@USE_GROHTML_TRUE@ done +@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir)/$(imagedir) +@USE_GROHTML_TRUE@ -rmdir $(DESTDIR)$(htmldocdir) + +all: doc/groff.info doc/groff.txt doc/groff.html $(GROFF_DVI) \ + $(GROFF_PDF) +doc/groff.info: $(doc_srcdir)/groff.texi + $(AM_V_at)$(MKDIR_P) $(doc_builddir) + $(AM_V_GEN)LANG=C \ LC_ALL=C \ - $(MAKEINFO) --enable-encoding -I$(doc_srcdir) --plaintext -o $@ $< - -.texi.dvi: -@HAVE_TEXI2DVI_TRUE@ @$(MKDIR_P) $(doc_builddir) -@HAVE_TEXI2DVI_TRUE@ LANG=C \ -@HAVE_TEXI2DVI_TRUE@ LC_ALL=C \ -@HAVE_TEXI2DVI_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \ -@HAVE_TEXI2DVI_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \ -@HAVE_TEXI2DVI_TRUE@ $(TEXI2DVI) -e --batch --build-dir=doc/`basename $@`.t2d -o $@ $< -@HAVE_TEXI2DVI_FALSE@ @echo "Program texi2dvi is missing, cannot generate dvi doc"; \ -@HAVE_TEXI2DVI_FALSE@ exit 1 - -.texi.pdf: -@HAVE_TEXI2DVI_TRUE@ @$(MKDIR_P) $(doc_builddir) -@HAVE_TEXI2DVI_TRUE@ LANG=C \ -@HAVE_TEXI2DVI_TRUE@ LC_ALL=C \ -@HAVE_TEXI2DVI_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \ -@HAVE_TEXI2DVI_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \ -@HAVE_TEXI2DVI_TRUE@ $(TEXI2DVI) -e --batch --pdf --build-dir=doc/`basename $@`.t2p -o $@ $< -@HAVE_TEXI2DVI_FALSE@ @echo "Program texi2dvi is missing, cannot generate pdf doc"; \ -@HAVE_TEXI2DVI_FALSE@ exit 1 + $(MAKEINFO) -o doc/groff.info --enable-encoding \ + -I $(doc_srcdir) $(doc_srcdir)/groff.texi -# This will generate both html split into several files and html doc -# in a single file. If texinfo version < 5.0, we process the resulting -# (mono) .html file with fixinfo.sh du to a problem with blockquote -# closing (for example 5.6.1 Setting Registers, the 'Request' -# blockquote is not properly closed, see fixinfo.sh for more details +# Distribute the Info files. +dist-hook: dist-info-bits +dist-info-bits: + chmod u+w $(distdir)/doc + for d in $(doc_builddir) $(doc_srcdir); do \ + if [ -f "$$d"/groff.info ]; then \ + cp -f "$$d"/groff.info-* $(distdir)/doc; \ + break; \ + fi; \ + done +.texi.txt: + $(AM_V_at)$(MKDIR_P) $(doc_builddir) + $(AM_V_GEN)LANG=C \ + LC_ALL=C \ + $(MAKEINFO) --enable-encoding -I $(doc_srcdir) --plaintext \ + -o $@ $< .texi.html: - @$(MKDIR_P) $(doc_builddir)/ - LANG=C \ + $(AM_V_at)$(MKDIR_P) $(doc_builddir)/ + $(AM_V_GEN)LANG=C \ LC_ALL=C \ $(MAKEINFO) --html -I $(doc_srcdir) \ -o doc/`basename $@`.node $< - LANG=C \ + $(AM_V_at)LANG=C \ LC_ALL=C \ $(MAKEINFO) --html -I $(doc_srcdir) --no-split \ -o $@ $< - if test "$(makeinfo_version_numeric)" -lt 5000; then \ - echo "patching $@ with fixinfo.sh"; \ - $(SHELL) $(doc_srcdir)/fixinfo.sh \ - doc/`basename $@`.mono/`basename $@`; \ - fi -# Targets to make all the doc in all formats. These doc are not built -# by default. pdf, dvi, ps, html and their install equivalent -# install-pdf, install-dvi, install-ps, install-html are standard -# Automake targets. +# Define pattern rules to make our Texinfo manual in DVI and PDF +# formats. 'pdf' and 'dvi' and their installation counterparts +# 'install-pdf' and 'install-dvi' are standard Automake targets. +.texi.dvi: +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_at)$(MKDIR_P) $(doc_builddir) +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_GEN)LANG=C \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ LC_ALL=C \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ FORCE_SOURCE_DATE=1 \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(PROG_TEXI2DVI) -e --batch --build-dir=doc/`basename $@`.t2d \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ -o $@ $< +@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ @echo "program 'tex' is missing; cannot generate $@" >&2; \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ exit 1 +@HAVE_TEXI2DVI_FALSE@ @echo "program 'texi2dvi' is missing or too old;" \ +@HAVE_TEXI2DVI_FALSE@ "cannot generate $@" >&2; \ +@HAVE_TEXI2DVI_FALSE@ exit 1 + +.texi.pdf: +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_at)$(MKDIR_P) $(doc_builddir) +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(AM_V_GEN)LANG=C \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ LC_ALL=C \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ TEXINPUTS="$(top_srcdir)/build-aux:$(TEXINPUTS)" \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ MAKEINFO='$(MAKEINFO) -I $(doc_srcdir)' \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ $(PROG_TEXI2DVI) -e --batch --pdf \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_TRUE@ --build-dir=doc/`basename $@`.t2p -o $@ $< +@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ @echo "program 'tex' is missing; cannot generate $@" >&2; \ +@HAVE_TEXI2DVI_TRUE@@USE_TEX_FALSE@ exit 1 +@HAVE_TEXI2DVI_FALSE@ @echo "program 'texi2dvi' is missing or too old;" \ +@HAVE_TEXI2DVI_FALSE@ "cannot generate $@" >&2; \ +@HAVE_TEXI2DVI_FALSE@ exit 1 + +install-doc: install-dvi install-html install-pdf -@BUILD_INFODOC_TRUE@doc: doc_all -@BUILD_INFODOC_TRUE@doc_all: doc_txt dvi pdf html -@BUILD_INFODOC_TRUE@doc_txt: doc/groff.txt -@BUILD_INFODOC_TRUE@dvi: doc_dvi -@BUILD_INFODOC_TRUE@doc_dvi: doc/groff.dvi -@BUILD_INFODOC_TRUE@pdf: doc_pdf -@BUILD_INFODOC_TRUE@doc_pdf: doc/groff.pdf -@BUILD_INFODOC_TRUE@html: doc_html -@BUILD_INFODOC_TRUE@doc_html: doc/groff.html -@BUILD_INFODOC_TRUE@install-doc: install-pdf install-html - -distclean-local: clean_infodoc clean_otherdoc -maintainer-clean-local: clean_infodoc clean_otherdoc -clean_infodoc: - -$(RM) $(doc_builddir)/groff.info* - -$(RM) $(doc_builddir)/groff.pdf - -$(RM) $(doc_builddir)/groff.dvi - -$(RM) -r $(doc_builddir)/groff.html.* -clean_otherdoc: - -cd $(doc_builddir) && \ - $(RM) -r *.pdf *.html *.txt *.dvi *.t2p *.t2d +maintainer-clean-local: + $(RM) $(doc_builddir)/groff.info* + $(RM) $(doc_builddir)/groff.pdf + $(RM) $(doc_builddir)/groff.dvi + $(RM) $(doc_builddir)/groff.txt + $(RM) -r $(doc_builddir)/groff.html.* + +install-data-local: install-txt +install-txt: + -test -d $(DESTDIR)$(docdir) \ + || $(mkinstalldirs) $(DESTDIR)$(docdir) + cp $(top_srcdir)/doc/groff.txt $(DESTDIR)$(docdir) install-data-local: install_infodoc -@BUILD_INFODOC_TRUE@install_infodoc: doc/groff.info -@BUILD_INFODOC_TRUE@ -test -d $(DESTDIR)$(infodir) || $(mkinstalldirs) $(DESTDIR)$(infodir) -@BUILD_INFODOC_TRUE@ for p in doc/groff.info `ls doc/groff.info*`; do \ -@BUILD_INFODOC_TRUE@ f=`basename $$p`; \ -@BUILD_INFODOC_TRUE@ $(RM) $(DESTDIR)$(infodir)/$$f; \ -@BUILD_INFODOC_TRUE@ $(INSTALL_DATA) $$p $(DESTDIR)$(infodir)/$$f; \ -@BUILD_INFODOC_TRUE@ done -@BUILD_INFODOC_TRUE@ $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) \ -@BUILD_INFODOC_TRUE@ $(DESTDIR)$(infodir)/groff.info -@BUILD_INFODOC_TRUE@install-pdf-local: doc/groff.pdf -@BUILD_INFODOC_TRUE@ -test -d $(DESTDIR)$(pdfdocdir) || $(mkinstalldirs) $(DESTDIR)$(pdfdocdir) -@BUILD_INFODOC_TRUE@ cp $(top_builddir)/doc/groff.pdf $(DESTDIR)$(pdfdocdir) -@BUILD_INFODOC_TRUE@install-html-local: doc/groff.html -@BUILD_INFODOC_TRUE@ -test -d $(DESTDIR)$(htmldocdir)/groff.html.mono || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/groff.html.mono -@BUILD_INFODOC_TRUE@ cp -r $(top_builddir)/doc/groff.html $(DESTDIR)$(htmldocdir)/groff.html.mono -@BUILD_INFODOC_TRUE@ cp -r $(top_builddir)/doc/groff.html.node $(DESTDIR)$(htmldocdir) -@BUILD_INFODOC_FALSE@install_infodoc: - -uninstall-local: uninstall_infodoc uninstall-pdf uninstall-html +install_infodoc: doc/groff.info + -test -d $(DESTDIR)$(infodir) \ + || $(mkinstalldirs) $(DESTDIR)$(infodir) + $(RM) $(DESTDIR)/doc/groff.info* + for d in $(doc_builddir) $(doc_srcdir); do \ + if [ -f "$$d"/groff.info ]; then \ + cp "$$d"/groff.info* $(DESTDIR)$(infodir); \ + $(INSTALL_INFO) --info-file="$$d"/groff.info \ + --info-dir=$(DESTDIR)$(infodir); \ + break; \ + fi; \ + done +install-pdf-local: doc/groff.pdf + -test -d $(DESTDIR)$(pdfdocdir) \ + || $(mkinstalldirs) $(DESTDIR)$(pdfdocdir) + cp $(top_srcdir)/doc/groff.pdf $(DESTDIR)$(pdfdocdir) +install-html-local: doc/groff.html + -test -d $(DESTDIR)$(htmldocdir)/groff.html.mono \ + || $(mkinstalldirs) $(DESTDIR)$(htmldocdir)/groff.html.mono + cp -r $(top_srcdir)/doc/groff.html \ + $(DESTDIR)$(htmldocdir)/groff.html.mono + cp -r $(top_srcdir)/doc/groff.html.node \ + $(DESTDIR)$(htmldocdir) + +uninstall-local: uninstall_infodoc uninstall-pdf uninstall-html \ + uninstall-txt uninstall_doc: uninstall-local uninstall-doc: uninstall-local uninstall_infodoc: -@BUILD_INFODOC_TRUE@ -$(INSTALL_INFO) --remove --info-dir=$(DESTDIR)$(infodir) \ -@BUILD_INFODOC_TRUE@ $(DESTDIR)$(infodir)/groff.info -@BUILD_INFODOC_TRUE@ -for f in `ls $(DESTDIR)$(infodir)/groff.info*`; do \ -@BUILD_INFODOC_TRUE@ $(RM) $$f; \ -@BUILD_INFODOC_TRUE@ done + -$(INSTALL_INFO) --remove --info-dir=$(DESTDIR)$(infodir) \ + $(DESTDIR)$(infodir)/groff.info + -for f in `ls $(DESTDIR)$(infodir)/groff.info*`; do \ + $(RM) $$f; \ + done uninstall-pdf: -@BUILD_INFODOC_TRUE@ -$(RM) -f $(DESTDIR)$(pdfdocdir)/groff.pdf + $(RM) $(DESTDIR)$(pdfdocdir)/groff.pdf + -rmdir $(DESTDIR)$(pdfdocdir) uninstall-html: -@BUILD_INFODOC_TRUE@ -$(RM) -r $(DESTDIR)$(htmldocdir)/groff.html.* -gnu.eps: - echo $(XPMTOPPM) - if test -f $(top_srcdir)/doc/gnu.eps; then \ - cp $(top_srcdir)/doc/gnu.eps . ; \ - elif test -f $(top_builddir)/doc/gnu.eps; then \ - cp $(top_builddir)/doc/gnu.eps . ; \ - else \ - if test ""$(XPMTOPPM) != "found"; then \ - echo "Program xpmtoppm is missing, can't generate gnu.eps" ; \ - exit 1; \ - fi; \ - if test ""$(pnmtops) != "found"; then \ - echo "Program pnmtops is missing, can't generate gnu.eps" ; \ - exit 1; \ - fi; \ - if test "$(pnmtops_nosetpage)" != "pnmtops -nosetpage"; then \ - echo "Program pnmtops can't handle -nosetpage, can't generate gnu.eps" ; \ - exit 1; \ - fi; \ - xpmtoppm $(top_srcdir)/doc/gnu.xpm | pnmdepth 15 \ - | $(pnmtops_nosetpage) -noturn -rle >$@ ; \ - fi + $(RM) $(DESTDIR)$(htmldocdir)/groff.html.mono/* + $(RM) $(DESTDIR)$(htmldocdir)/groff.html.node/* +uninstall-txt: + $(RM) $(DESTDIR)$(docdir)/groff.txt +$(DOC_GNU_EPS): doc/gnu.xpm + $(AM_V_GEN)if test "$(XPMTOPPM)" != found; then \ + echo "program 'xpmtoppm' is missing; can't generate $@" >&2; \ + exit 1; \ + fi; \ + if test "$(pnmtops)" != found; then \ + echo "program 'pnmtops' is missing; can't generate $@" >&2; \ + exit 1; \ + fi; \ + if ! echo "$(pnmtops_nosetpage)" | grep -q nosetpage; then \ + echo "program 'pnmtops' can't handle -nosetpage option;" \ + "can't generate $@" >&2; \ + exit 1; \ + fi; \ + xpmtoppm $(top_srcdir)/doc/gnu.xpm | pnmdepth 15 \ + | $(pnmtops_nosetpage) -noturn -rle >$@ -# Copy gnu.eps in 'doc' directory +# Provide a copy of the image in the distribution archive to accommodate +# systems without a tool to generate it from an X pixmap. dist-hook: dist-gnueps dist-gnueps: chmod u+w $(distdir)/doc - cp -f gnu.eps $(distdir)/doc + for d in $(doc_builddir) $(doc_srcdir); do \ + if [ -f "$$d"/$(DOC_GNU_EPS) ]; then \ + cp -f "$$d"/$(DOC_GNU_EPS) $(distdir)/doc; \ + break; \ + fi; \ + done -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: + +# This target generates font descriptions from core X11 font data +# returned by a running X server; these are _not_ normally generated +# during a build, but provided with the groff source distribution. +# +# This maintainer-mode target alters files in the source tree. +maintainer-font-descriptions: devX100_font-descriptions +devX100_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \ + $(xditview_srcdir)/FontMap-X11 + $(AM_V_GEN)$(MKDIR_P) $(devX100_fontsrcdir) \ + && sed -e 's/res .*/res 100/' $(xditview_srcdir)/DESC.in \ + >$(devX100_fontsrcdir)/DESC \ + && $(xtotroff) -d $(devX100_fontsrcdir) -r 100 -s 10 \ + $(xditview_srcdir)/FontMap-X11 -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +# This target generates font descriptions from core X11 font data +# returned by a running X server; these are _not_ normally generated +# during a build, but provided with the groff source distribution. +# +# This maintainer-mode target alters files in the source tree. +maintainer-font-descriptions: devX100-12_font-descriptions +devX100-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \ + $(xditview_srcdir)/FontMap-X11 + $(AM_V_GEN)$(MKDIR_P) $(devX100_12_fontsrcdir) \ + && sed -e 's/res .*/res 100/;s/unitwidth .*/unitwidth 12/' \ + $(xditview_srcdir)/DESC.in >$(devX100_12_fontsrcdir)/DESC \ + && $(xtotroff) -d $(devX100_12_fontsrcdir) -r 100 -s 12 \ + $(xditview_srcdir)/FontMap-X11 -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +# This target generates font descriptions from core X11 font data +# returned by a running X server; these are _not_ normally generated +# during a build, but provided with the groff source distribution. +# +# This maintainer-mode target alters files in the source tree. +maintainer-font-descriptions: devX75_font-descriptions +devX75_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \ + $(xditview_srcdir)/FontMap-X11 + $(AM_V_GEN)$(MKDIR_P) $(devX75_fontsrcdir) \ + && sed -e 's/res .*/res 75/' $(xditview_srcdir)/DESC.in \ + >$(devX75_fontsrcdir)/DESC \ + && $(xtotroff) -d $(devX75_fontsrcdir) -r 75 -s 10 \ + $(xditview_srcdir)/FontMap-X11 -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +# This target generates font descriptions from core X11 font data +# returned by a running X server; these are _not_ normally generated +# during a build, but provided with the groff source distribution. +# +# This maintainer-mode target alters files in the source tree. +maintainer-font-descriptions: devX75-12_font-descriptions +devX75-12_font-descriptions: $(xtotroff) $(xditview_srcdir)/DESC.in \ + $(xditview_srcdir)/FontMap-X11 + $(AM_V_GEN)$(MKDIR_P) $(devX75_12_fontsrcdir) \ + && sed -e 's/res .*/res 75/;s/unitwidth .*/unitwidth 12/' \ + $(xditview_srcdir)/DESC.in >$(devX75_12_fontsrcdir)/DESC \ + && $(xtotroff) -d $(devX75_12_fontsrcdir) -r 75 -s 12 \ + $(xditview_srcdir)/FontMap-X11 -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: $(DEVASCIIFONTSFILES): $(devascii_srcdir)/R.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12086,15 +14749,11 @@ font/devascii/DESC: $(devascii_srcdir)/DESC.proto $(DEVASCIIRES) $(DEVASCIICPI) $(DEVASCIILPI) \ $(DEVASCIIFONTS) > $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: $(DEVCP1047FONTSFILES): $(devcp1047_srcdir)/R.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12108,15 +14767,11 @@ font/devcp1047/DESC: $(devcp1047_srcdir)/DESC.proto $(DEVCP1047RES) $(DEVCP1047CPI) $(DEVCP1047LPI) \ $(DEVCP1047FONTS) > $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: font/devdvi/DESC: $(devdvi_srcdir)/DESC.in $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12129,37 +14784,33 @@ font/devdvi/DESC: $(devdvi_srcdir)/DESC.in && (test -z '$(DVIPRINT)' \ || echo print '$(DVIPRINT)' >>$@) -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: $(DEVHTMLFONTSFILES): $(devhtml_srcdir)/R.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && $(RM) $@ \ && $(SHELL) $(GENFONTSSH) $(devhtml_srcdir)/R.proto \ - $(DEVHTMLRES) $(DEVHTMLCPI) `basename $@` > $@ + $(DEVHTMLRES) $(DEVHTMLCPI) `basename $@` >$@ font/devhtml/DESC: $(devhtml_srcdir)/DESC.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && $(SHELL) $(GENDESCSH) $(devhtml_srcdir)/DESC.proto \ - $(DEVHTMLRES) $(DEVHTMLCPI) $(DEVHTMLLPI) $(DEVHTMLFONTS) > $@ \ - && echo "image_generator $(GHOSTSCRIPT)" >> $@ + $(DEVHTMLRES) $(DEVHTMLCPI) $(DEVHTMLLPI) $(DEVHTMLFONTS) \ + > $@.tmp \ + && echo "image_generator $(GHOSTSCRIPT)" >>$@.tmp \ + && mv $@.tmp $@ +font/devhtml/stamp: font/devhtml/DESC $(DEVHTMLFONTSFILES) + $(AM_V_at)>$@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: $(DEVLATIN1FONTSFILES): $(devlatin1_srcdir)/R.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12173,15 +14824,11 @@ font/devlatin1/DESC: $(devlatin1_srcdir)/DESC.proto $(DEVLATIN1RES) $(DEVLATIN1CPI) $(DEVLATIN1LPI) \ $(DEVLATIN1FONTS) > $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: font/devlbp/DESC: $(devlbp_srcdir)/DESC.in $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12194,15 +14841,11 @@ font/devlbp/DESC: $(devlbp_srcdir)/DESC.in && (test -z '$(LBPPRINT)' \ || echo print '$(LBPPRINT)' >>$@) -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: font/devlj4/DESC: $(devlj4_srcdir)/DESC.in $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ @@ -12223,39 +14866,32 @@ devlj4_fonts: hpftodit font/devlj4/DESC srcdir=$(devlj4_srcdir)/generate \ HPFTODIT=$(top_builddir)/hpftodit -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +all: font/devpdf/stamp font/devpdf/enc/text.enc: - @$(MKDIR_P) $(top_builddir)/font/devpdf/enc - cp -f $(top_srcdir)/font/devps/text.enc \ + $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/enc + $(AM_V_at)cp -f $(top_srcdir)/font/devps/text.enc \ $(top_builddir)/font/devpdf/enc -font/devpdf/map/symbolmap: - @$(MKDIR_P) $(top_builddir)/font/devpdf/map - @cp -f $(top_srcdir)/font/devps/symbolmap \ - $(top_builddir)/font/devpdf/map - -$(DEVPDFFONTMAP_1): - @$(MKDIR_P) $(top_builddir)/font/devpdf/map - @cp -f $(top_srcdir)/font/devps/generate/`basename $@` \ +$(devpdffontmapdata): + $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/map + $(AM_V_at)cp -f \ + $(top_srcdir)/font/devps/generate/`basename $@` \ $(top_builddir)/font/devpdf/map - -font/devpdf/util/BuildFoundries: shdeps.sed \ - $(devpdf_srcdir)/util/BuildFoundries.pl +font/devpdf/util/BuildFoundries: \ + $(devpdf_srcdir)/util/BuildFoundries.pl $(SH_DEPS_SED_SCRIPT) afmtodit $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf/util \ - && $(RM) $(top_builddir)/font/devpdf/util/BuildFoundries \ && if test -n "$(PERL)"; then \ sed -f $(SH_DEPS_SED_SCRIPT) \ -e "s|/usr/bin/perl|$(PERL)|" \ - -e "s|[@]GROFF_GHOSTSCRIPT_INTERPRETERS[@]|$(GHOSTSCRIPT)|" \ + -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|" \ + -e "s|[@]PATH_SEPARATOR[@]|$(PATH_SEPARATOR)|" \ -e "s|[@]VERSION[@]|$(VERSION)|" \ -e "s|[@]GROFF_FONT_DIR[@]|$(fontdir)|" \ $(devpdf_srcdir)/util/BuildFoundries.pl \ @@ -12268,43 +14904,42 @@ font/devpdf/util/BuildFoundries: shdeps.sed \ >$(top_builddir)/font/devpdf/util/BuildFoundries; \ fi \ && chmod +x $(top_builddir)/font/devpdf/util/BuildFoundries - font/devpdf/DESC: $(devpdf_srcdir)/DESC.in $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \ - && $(RM) $(top_builddir)/font/devpdf/DESC \ - && cat $(devpdf_srcdir)/DESC.in >$(top_builddir)/font/devpdf/DESC \ + && cat $(devpdf_srcdir)/DESC.in \ + >$(top_builddir)/font/devpdf/DESC \ && if test "$(PAGE)" = A4; then \ echo "papersize a4" >>$(top_builddir)/font/devpdf/DESC; \ else \ - echo "papersize letter" >>$(top_builddir)/font/devpdf/DESC; \ + echo "papersize letter" \ + >>$(top_builddir)/font/devpdf/DESC; \ fi -font/devpdf/Foundry: - $(AM_V_GEN)$(RM) $(top_builddir)/font/devpdf/Foundry \ - && sed "s|[@]urwfontsdir[@]|$(urwfontsdir)|" \ - $(devpdf_srcdir)/Foundry.in >$(top_builddir)/$@ - -all: font/devpdf/build_font_files - -# PATH: path to find afmtodit. We add $(abs_top_builddir) because -# afmtodit is built in the top builddir. -font/devpdf/build_font_files: afmtodit font/devpdf/DESC \ - $(devpdffontenc_DATA) $(devpdffontmap_DATA) $(devpdffont_DATA) \ +font/devpdf/Foundry: $(devpdf_srcdir)/Foundry.in + $(AM_V_at)$(MKDIR_P) $(top_builddir)/font/devpdf/ +@HAVE_URW_FONTS_TRUE@ $(AM_V_GEN)sed "s|[@]urwfontsdir[@]|$(urwfontsdir)|" \ +@HAVE_URW_FONTS_TRUE@ $(devpdf_srcdir)/Foundry.in >$@ +@HAVE_URW_FONTS_FALSE@ $(AM_V_GEN)sed "/BEGIN URW/,/END URW/d" \ +@HAVE_URW_FONTS_FALSE@ $(devpdf_srcdir)/Foundry.in >$@ + +# This is kind of a cheat, but works because BuildFoundries produces so +# many artifacts. +$(DEFAULT_BASE35_FONTS) $(URW_BASE35_FONTS): font/devpdf/download +font/devpdf/download: $(devpdffontmapdata) font/devpdf/DESC \ + font/devpdf/Foundry font/devpdf/enc/text.enc \ font/devpdf/util/BuildFoundries - @if $(AM_V_P); then \ - set -x; \ - else \ - echo " GEN $(top_builddir)/font/devpdf/download"; \ - fi \ - && $(RM) $@ \ - && $(MKDIR_P) $(top_builddir)/font/devpdf \ - && echo "# foundry ps name psfile" > $(top_builddir)/font/devpdf/download \ + $(AM_V_GEN)$(MKDIR_P) $(top_builddir)/font/devpdf \ + && echo "# foundry ps-font-name ps-font-file" >$@.tmp \ + && echo "# A blank foundry is the default." >>$@.tmp \ && PATH="$(abs_top_builddir)$(GROFF_PATH_SEPARATOR)$(abs_top_builddir)/build-aux$(GROFF_PATH_SEPARATOR)$(PATH)" \ $(abs_top_builddir)/font/devpdf/util/BuildFoundries \ - $(abs_top_builddir)/font/devpdf \ - '$(abs_top_srcdir)/font/devps : $(abs_top_builddir)/font/devps' \ - >> $(top_builddir)/font/devpdf/download \ - && touch $@ + --strict $(abs_top_builddir)/font/devpdf \ + '$(abs_top_srcdir)/font/devps:$(abs_top_builddir)/font/devps' \ + >>$@.tmp \ + && mv $@.tmp $@ +font/devpdf/stamp: font/devpdf/DESC font/devpdf/download \ + $(devpdffontenc_DATA) $(devpdffontmap_DATA) $(devpdffont_DATA) + $(AM_V_at)>$@ mostlyclean-local: mostlyclean_devpdf_extra mostlyclean_devpdf_extra: @@ -12351,32 +14986,51 @@ uninstall_devpdf: rmdir $(DESTDIR)$(devpdffontdir); \ fi -######################################################################## -# Editor settings -######################################################################## -# +font/devpdf/tests/check-default-foundry.sh: $(font_devpdf_default_test) + $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ + && sed -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \ + $(font_devpdf_default_test) > $@ \ + && chmod +x $@ + +font/devpdf/tests/check-urw-foundry.sh: $(font_devpdf_urw_test) + $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ + && sed -e "s|[@]urwfontsdir[@]|$(urwfontsdir)|g" \ + $(font_devpdf_urw_test) > $@ \ + && chmod +x $@ + # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: font/devps/DESC: $(devps_srcdir)/DESC.in $(AM_V_GEN)$(MKDIR_P) font/devps \ - && cat $(devps_srcdir)/DESC.in >$@ \ - && echo broken $(BROKEN_SPOOLER_FLAGS) >>$@ \ + && cat $(devps_srcdir)/DESC.in >$@.tmp \ + && echo broken $(BROKEN_SPOOLER_FLAGS) >>$@.tmp \ && if test "$(PAGE)" = A4; then \ - echo "papersize a4" >>$@; \ + echo "papersize a4" >>$@.tmp; \ else \ - echo "papersize letter" >>$@; \ + echo "papersize letter" >>$@.tmp; \ fi \ && (test -z '$(PSPRINT)' \ - || echo print '$(PSPRINT)' >>$@) + || echo print '$(PSPRINT)' >>$@.tmp) + $(AM_V_at)mv $@.tmp $@ +font/devps/stamp: font/devps/DESC \ + $(DEVPSFONTFILES) $(DEVPSFONTFILES_GENERATED) + $(AM_V_at)>$@ -fonts: devps_fonts +maintainer-font-descriptions: devps_font-descriptions +# This target generates font descriptions from installed Type 1 AFM +# files; these are _not_ normally generated during a build, but provided +# with the groff source distribution. +# # We add top_builddir to the PATH in case the only afmtodit available is # the one in the current build. -devps_fonts: afmtodit font/devps/DESC +# +# The AFM files from which these descriptions are produced must be +# obtained elsewhere, so this target runs only in "maintainer mode". +devps_font-descriptions: afmtodit font/devps/DESC PATH=$(top_builddir)$(GROFF_PATH_SEPARATOR)$(PATH) \ $(MAKE) -f $(devps_srcdir)/generate/Makefile \ srcdir=$(devps_srcdir)/generate DESC=$(devps_srcdir)/DESC.in @@ -12385,67 +15039,50 @@ font/devps/prologue: $(devps_srcdir)/prologue.ps $(AM_V_GEN)$(MKDIR_P) font/devps \ && $(RM) $@ \ && sed -f $(devps_srcdir)/psstrip.sed $? >$@ -font/devps/zapfdr.pfa: $(devps_srcdir)/zapfdr.ps - $(AM_V_GEN)$(MKDIR_P) font/devps \ - && $(RM) $@ \ - && sed -f $(devps_srcdir)/psstrip.sed $? >$@ -font/devps/symbolsl.pfa: $(devps_srcdir)/symbolsl.ps + +.ps.pfa: $(AM_V_GEN)$(MKDIR_P) font/devps \ && $(RM) $@ \ && sed -f $(devps_srcdir)/psstrip.sed $? >$@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: $(DEVUTF8FONTSFILES): $(devutf8_srcdir)/R.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && $(RM) $@ \ && $(SHELL) $(GENFONTSSH) $(devutf8_srcdir)/R.proto \ - $(DEVUTF8RES) $(DEVUTF8CPI) `basename $@` > $@ + $(DEVUTF8RES) $(DEVUTF8CPI) `basename $@` >$@ font/devutf8/DESC: $(devutf8_srcdir)/DESC.proto $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && $(SHELL) $(GENDESCSH) $(devutf8_srcdir)/DESC.proto \ - $(DEVUTF8RES) $(DEVUTF8CPI) $(DEVUTF8LPI) $(DEVUTF8FONTS) > $@ + $(DEVUTF8RES) $(DEVUTF8CPI) $(DEVUTF8LPI) $(DEVUTF8FONTS) >$@ +font/devutf8/stamp: font/devutf8/DESC $(DEVUTF8FONTSFILES) + $(AM_V_at)>$@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: man: $(MKDIR_P) $(top_builddir)/man -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: defs.h: config.status @$(SHELL) $(top_srcdir)/gendef.sh defs.h \ "PROG_PREFIX=\"$(g)\"" \ @@ -12465,67 +15102,60 @@ dist_include: chmod u+w $(distdir)/src/include cp -f $(top_srcdir)/src/include/*.h $(distdir)/src/include -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: src/libs/libbib/index.$(OBJEXT): defs.h -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -# .o files have a 'libgroff_a-' prefix because we set libgroff_a_CPPFLAGS +# .o files have a 'libgroff_a-' prefix because we set +# libgroff_a_CPPFLAGS. src/libs/libgroff/libgroff_a-device.$(OBJEXT): defs.h src/libs/libgroff/libgroff_a-fontfile.$(OBJEXT): defs.h src/libs/libgroff/libgroff_a-macropath.$(OBJEXT): defs.h src/libs/libgroff/libgroff_a-relocate.$(OBJEXT): defs.h src/libs/libgroff/version.cpp: $(top_srcdir)/.version - @echo Making version.cpp - @echo const char \*version_string = \"$(MAJOR_VERSION).$(MINOR_VERSION)\"\; >$@ - @echo const char \*revision_string = \"$(REVISION)\"\; >>$@ - @echo extern \"C\" { >>$@ - @echo const char \*Version_string = \"$(VERSION)\"\; >>$@ - @echo } >>$@ \ - | sed -e 's/\.0\"/\"/' >>$@ + $(AM_V_at)printf 'const char *version_string = "%s.%s";\n' \ + $(MAJOR_VERSION) $(MINOR_VERSION) > $@.tmp + $(AM_V_at)printf 'const char *revision_string = "%s";\n' \ + $(REVISION) >> $@.tmp + $(AM_V_at)printf \ + 'extern "C" {\nconst char *Version_string = "%s";\n}\n' \ + $(VERSION) >> $@.tmp + $(AM_V_GEN)mv $@.tmp $@ all: charset.alias ref-add.sed ref-del.sed charset.alias: $(libgroff_srcdir)/config.charset - $(SHELL) $(libgroff_srcdir)/config.charset '$(HOST)' > t-$@ - mv t-$@ $@ - -ref-add.sed : $(libgroff_srcdir)/ref-add.sin - sed -e '/^#/d' \ - -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' $(libgroff_srcdir)/ref-add.sin > t-$@ - mv t-$@ $@ - -ref-del.sed : $(libgroff_srcdir)/ref-del.sin - sed -e '/^#/d' \ - -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' $(libgroff_srcdir)/ref-del.sin > t-$@ - mv t-$@ $@ + $(AM_V_GEN)$(SHELL) $(libgroff_srcdir)/config.charset \ + '$(HOST)' > t-$@ \ + && mv t-$@ $@ + +ref-add.sed: $(libgroff_srcdir)/ref-add.sin + $(AM_V_GEN)sed -e '/^#/d' \ + -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \ + $(libgroff_srcdir)/ref-add.sin > t-$@ \ + && mv t-$@ $@ + +ref-del.sed: $(libgroff_srcdir)/ref-del.sin + $(AM_V_GEN)sed -e '/^#/d' \ + -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \ + $(libgroff_srcdir)/ref-del.sin > t-$@ \ + && mv t-$@ $@ install-data-local: install_charset_data install_charset_data: @@ -12561,49 +15191,41 @@ uninstall_charset_data: rm -f $(DESTDIR)$(libdir)/t-charset.alias; \ fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: gropdf: $(gropdf_dir)/gropdf.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)$(RM) $@ \ @@ -12624,32 +15246,37 @@ pdfmom: $(gropdf_dir)/pdfmom.pl $(SH_DEPS_SED_SCRIPT) >$@ \ && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: + +$(GXDITVIEW_GROFF_VERSION_H): $(top_srcdir)/.version + $(AM_V_at)$(MKDIR_P) `dirname $@` + $(AM_V_GEN)printf \ + 'const char *Version_string = "%s";\n' '@VERSION@' > $@ -# Because we defined gxditview_CPPFLAGS, automake renames all the xditview's -# objects, adding an "gxditview-" prefix. +# Because we defined gxditview_CPPFLAGS, automake renames all of +# xditview's objects, adding an "gxditview-" prefix. @WITHOUT_X11_FALSE@src/devices/xditview/gxditview-device.$(OBJEXT): defs.h @WITHOUT_X11_FALSE@src/devices/xditview/gxditview-xditview.$(OBJEXT): $(XDITVIEW_GENHDRS) @WITHOUT_X11_FALSE@src/devices/xditview/GXditview-ad.h: $(xditview_srcdir)/GXditview.ad -@WITHOUT_X11_FALSE@ @echo Making $@ -@WITHOUT_X11_FALSE@ $(SHELL) $(xditview_srcdir)/ad2c $(xditview_srcdir)/GXditview.ad > $@ +@WITHOUT_X11_FALSE@ $(AM_V_GEN)$(SHELL) $(xditview_srcdir)/ad2c \ +@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview.ad > $@ # Custom installation of GXditview.ad and GXditview-color.ad install-data-local: install_xditview @@ -12657,154 +15284,110 @@ uninstall-local: uninstall_xditview @WITHOUT_X11_TRUE@install_xditview: @WITHOUT_X11_TRUE@uninstall_xditview: -@WITHOUT_X11_FALSE@install_xditview: $(xditview_srcdir)/GXditview.ad $(xditview_srcdir)/GXditview-color.ad -@WITHOUT_X11_FALSE@ -test -d $(DESTDIR)$(appresdir) \ -@WITHOUT_X11_FALSE@ || $(mkinstalldirs) $(DESTDIR)$(appresdir) -@WITHOUT_X11_FALSE@ if test -f $(DESTDIR)$(appresdir)/GXditview; then \ -@WITHOUT_X11_FALSE@ mv $(DESTDIR)$(appresdir)/GXditview \ -@WITHOUT_X11_FALSE@ $(DESTDIR)$(appresdir)/GXditview.old; \ -@WITHOUT_X11_FALSE@ fi -@WITHOUT_X11_FALSE@ if test -f $(DESTDIR)$(appresdir)/GXditview-color; then \ -@WITHOUT_X11_FALSE@ mv $(DESTDIR)$(appresdir)/GXditview-color \ -@WITHOUT_X11_FALSE@ $(DESTDIR)$(appresdir)/GXditview-color.old; \ -@WITHOUT_X11_FALSE@ fi +@WITHOUT_X11_FALSE@install_xditview: \ +@WITHOUT_X11_FALSE@ $(xditview_srcdir)/FontMap-X11 \ +@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview.ad \ +@WITHOUT_X11_FALSE@ $(xditview_srcdir)/GXditview-color.ad +@WITHOUT_X11_FALSE@ $(MKDIR_P) $(DESTDIR)$(fontdir) +@WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/FontMap-X11 \ +@WITHOUT_X11_FALSE@ $(DESTDIR)$(fontdir)/FontMap-X11 +@WITHOUT_X11_FALSE@ -test -d $(DESTDIR)$(appdefdir) \ +@WITHOUT_X11_FALSE@ || $(mkinstalldirs) $(DESTDIR)$(appdefdir) @WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/GXditview.ad \ -@WITHOUT_X11_FALSE@ $(DESTDIR)$(appresdir)/GXditview +@WITHOUT_X11_FALSE@ $(DESTDIR)$(appdefdir)/GXditview @WITHOUT_X11_FALSE@ $(INSTALL_DATA) $(xditview_srcdir)/GXditview-color.ad \ -@WITHOUT_X11_FALSE@ $(DESTDIR)$(appresdir)/GXditview-color +@WITHOUT_X11_FALSE@ $(DESTDIR)$(appdefdir)/GXditview-color @WITHOUT_X11_FALSE@uninstall_xditview: -@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appresdir)/GXditview -@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appresdir)/GXditview-color +@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appdefdir)/GXditview +@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(appdefdir)/GXditview-color +@WITHOUT_X11_FALSE@ rm -f $(DESTDIR)$(fontdir)/FontMap-X11 +@WITHOUT_X11_FALSE@ -rmdir $(DESTDIR)$(fontdir) 2>/dev/null -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: +# Since eqn_CPPFLAGS was set, all .o files have an 'eqn-' prefix. src/preproc/eqn/eqn-lex.$(OBJEXT): src/preproc/eqn/eqn.hpp neqn: $(top_srcdir)/src/preproc/eqn/neqn.sh $(SH_DEPS_SED_SCRIPT) - $(AM_V_GEN)$(RM) $@ \ - && sed -e 's/[@]g[@]/$(g)/g' \ + $(AM_V_GEN)sed -e 's/[@]g[@]/$(g)/g' \ -f $(SH_DEPS_SED_SCRIPT) \ -e $(SH_SCRIPT_SED_CMD) \ $(top_srcdir)/src/preproc/eqn/neqn.sh \ - >$@ \ - && chmod +x $@ + >$@.tmp \ + && chmod +x $@.tmp \ + && mv $@.tmp $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: src/preproc/grn/main.$(OBJEXT): defs.h -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: src/preproc/html/pre-html.$(OBJEXT): defs.h -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: +# Since pic_CPPFLAGS was set, all .o files have a 'pic-' prefix. src/preproc/pic/pic-lex.$(OBJEXT): src/preproc/pic/pic.hpp -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -# As refer_CPPFLAGS was set, all the .o have a 'refer-' prefix +# vim: set autoindent filetype=automake textwidth=72: + +# Since refer_CPPFLAGS was set, all .o files have a 'refer-' prefix. src/preproc/refer/refer-command.$(OBJEXT): defs.h src/preproc/refer/refer-ref.$(OBJEXT): defs.h src/preproc/refer/refer-refer.$(OBJEXT): defs.h src/preproc/refer/refer-token.$(OBJEXT): defs.h src/preproc/refer/refer-label.$(OBJEXT): defs.h -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: src/roff/groff/groff.$(OBJEXT): defs.h -groff_opts.tmp: src/roff/groff/groff.cpp - @$(GREP) -e ':.*:.*:' $? | sed -e 's/[ \t",]//g' > $@ - @echo -n 'groff options: ' - @cat $@ - -groff_opts_no_arg.txt: groff_opts.tmp - @sed -e 's/[a-zA-Z]://g' $? > $@ - @echo -n 'no arg: ' - @cat $@ - -groff_opts_with_arg.txt: groff_opts_no_arg.txt - @rm -f $@ - @sed "s/[`cat $?`:]//g" groff_opts.tmp > $@ - @echo -n 'with arg: ' - @cat $@ - -######################################################################## -# Editor settings -######################################################################## -# -# Local Variables: -# mode: makefile-automake -# fill-column: 72 -# End: -# vim: set filetype=automake textwidth=72: - -# Perl version works for all parts of 'groff'. - -grog: $(grog_srcdir)/grog.pl $(GROG) $(SH_DEPS_SED_SCRIPT) - $(AM_V_GEN)$(RM) $@ \ - && sed -f "$(SH_DEPS_SED_SCRIPT)" \ - -e "1s|^\(#! \).*perl|\\1$(PERL)|" \ - -e "s|[@]g[@]|$(g)|g" \ - -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \ - -e "s|[@]libdir[@]|$(DESTDIR)$(libdir)|g" \ - -e "s|[@]EGREP[@]|$(EGREP)|g" \ - -e "s|[@]VERSION[@]|$(VERSION)|" \ - -e "s|[@]grog_dir[@]|$(grog_dir)|" \ - -e "$(SH_SCRIPT_SED_CMD)" \ - $(grog_srcdir)/grog.pl \ - >$@ \ - && chmod +x $@ - -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: nroff: $(nroff_srcdir)/nroff.sh $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)rm -f $@ \ @@ -12815,44 +15398,38 @@ nroff: $(nroff_srcdir)/nroff.sh $(SH_DEPS_SED_SCRIPT) >$@ \ && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: # mode: makefile-automake +# fill-column: 72 # End: +# vim: set autoindent filetype=automake textwidth=72: src/roff/troff/input.$(OBJEXT): defs.h src/roff/troff/majorminor.cpp: $(top_srcdir)/.version - @echo Making $@ - @$(RM) $@ - @echo const char \*major_version = \"$(MAJOR_VERSION)\"\; >$@ - @echo const char \*minor_version = \"$(MINOR_VERSION)\"\; >>$@ - @echo const char \*revision = \"$(REVISION)\"\; >>$@ + $(AM_V_at)printf 'const char *major_version = "%s";\n' \ + $(MAJOR_VERSION) > $@.tmp + $(AM_V_at)printf 'const char *minor_version = "%s";\n' \ + $(MINOR_VERSION) >> $@.tmp + $(AM_V_at)printf 'const char *revision = "%s";\n' \ + $(REVISION) >> $@.tmp + $(AM_V_GEN)mv $@.tmp $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: afmtodit: $(afmtodit_srcdir)/afmtodit.pl $(afmtodit_srcdir)/afmtodit.tables $(AM_V_GEN)if test -n "$(PERL)"; then \ - sed -e "s|/usr/bin/perl|$(PERL)|" \ + sed -e "s|[@]PERL[@]|$(PERL)|" \ -e "s|[@]VERSION[@]|$(VERSION)|" \ -e "s|[@]FONTDIR[@]|$(fontdir)|" \ -e "/[@]afmtodit.tables[@]/ r $(afmtodit_srcdir)/afmtodit.tables" \ @@ -12869,25 +15446,33 @@ afmtodit: $(afmtodit_srcdir)/afmtodit.pl $(afmtodit_srcdir)/afmtodit.tables fi \ && chmod +x afmtodit -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +grog: $(grog_srcdir)/grog.pl $(SH_DEPS_SED_SCRIPT) + $(AM_V_GEN)$(RM) $@ \ + && sed -f "$(SH_DEPS_SED_SCRIPT)" \ + -e "s|[@]PERL[@]|$(PERL)|" \ + -e "s|[@]VERSION[@]|$(VERSION)|" \ + -e "$(SH_SCRIPT_SED_CMD)" \ + $(grog_srcdir)/grog.pl \ + >$@ \ + && chmod +x $@ + +# Local Variables: +# mode: makefile-automake +# fill-column: 72 +# End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: src/utils/indxbib/indxbib.$(OBJEXT): defs.h install-data-local: install_indxbib @@ -12912,61 +15497,62 @@ uninstall-local: uninstall_indxbib uninstall_indxbib: rm -f $(DESTDIR)$(common_words_file) -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: src/utils/lkbib/lkbib.$(OBJEXT): defs.h -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: - -dist-hook: tmac-dist-hook -tmac-dist-hook: - chmod u+w $(distdir)/tmac - for f in $(TMACMDOCFILES) $(TMACSTRIPFILES); do \ - cp -f $(top_srcdir)/$$f-u $(distdir)/tmac; \ - done - -$(TMACMDOCFILES) $(TMACSTRIPFILES): - $(MKDIR_P) $(top_builddir)/tmac - for f in $(TMACMDOCFILES) $(TMACSTRIPFILES); do \ - sed -f $(tmac_srcdir)/strip.sed $(top_srcdir)/$$f-u > $(top_builddir)/$$f; \ - done +# vim: set autoindent filetype=automake textwidth=72: tmac/www.tmac: tmac/www.tmac.in - $(MKDIR_P) $(top_builddir)/tmac - sed -e "s;[@]PNMTOPS_NOSETPAGE[@];$(pnmtops_nosetpage);g" \ + $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac + $(AM_V_GEN)sed -e \ + "s;[@]PNMTOPS_NOSETPAGE[@];$(pnmtops_nosetpage);g" \ $(tmac_srcdir)/www.tmac.in > $(top_builddir)/tmac/www.tmac +$(M4CHECK): tmac/groff_man.7.man.in + $(AM_V_at)! $(EGREP) \ + '(^|[[:space:]])($(M4WORDS))($$|[[:space:]])' \ + $(tmac_srcdir)/groff_man.7.man.in > $@ + +tmac/groff_man.7.man: tmac/groff_man.7.man.in $(M4CHECK) + $(AM_V_GEN)$(M4) -D_groff_man_not_style \ + $(tmac_srcdir)/groff_man.7.man.in > $@ + +tmac/groff_man_style.7.man: tmac/groff_man.7.man.in $(M4CHECK) + $(AM_V_GEN)$(M4) -D_groff_man_style \ + $(tmac_srcdir)/groff_man.7.man.in > $@ + # The installation of groff compatibility wrappers for vendor-provided # non-GNU macro sets is controlled by 'compatibility_wrappers' (see the # commentary surrounding m4/groff.m4's @@ -12998,21 +15584,22 @@ tmac/www.tmac: tmac/www.tmac.in all: tmac/stamp-wrap -# Generate groff compatibility wrappers for all non-GNU OS provided -# macro sets. +# Generate compatibility wrappers for non-GNU OS-provided macro packages +# for which groff provides an alternative implementation. tmac/stamp-wrap: - $(MKDIR_P) $(top_builddir)/tmac; - if test -n "$(tmac_wrap)"; then \ + $(AM_V_at)$(MKDIR_P) $(top_builddir)/tmac; + $(AM_V_at)if test -n "$(tmac_wrap)"; then \ for m in ""$(tmac_wrap); do \ $(RM) $(top_builddir)/tmac/$$m-wrap; \ if test "$$m" = an; then \ - echo .do mso andoc.tmac >>$(top_builddir)/tmac/$$m-wrap; \ + echo .do mso an.tmac >>$(top_builddir)/tmac/$$m-wrap; \ fi; \ echo .cp 1 >>$(top_builddir)/tmac/$$m-wrap; \ - echo .so $(sys_tmac_prefix)$$m >>$(top_builddir)/tmac/$$m-wrap; \ + echo .so $(sys_tmac_prefix)$$m \ + >>$(top_builddir)/tmac/$$m-wrap; \ done; \ fi - touch $@ + $(AM_V_at)touch $@ # Install groff compatibility wrappers into # /lib/groff/site-tmac. @@ -13023,7 +15610,7 @@ install_tmac_wrap: if test -n "$(tmac_wrap)"; then \ for m in ""$(tmac_wrap); do \ $(INSTALL_DATA) $(tmac_builddir)/$$m-wrap \ - $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \ + $(DESTDIR)$(systemtmacdir)/$$m$(wrapper_suffix).tmac; \ done; \ fi; \ fi @@ -13070,15 +15657,14 @@ uninstall_tmac_hook: rmdir $(DESTDIR)$(localtmacdir); \ fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: + +.DELETE_ON_ERROR: +.PRECIOUS: $(TEST_SUITE_LOG) # if there is a name prefix we install the man pages by hand all: generate_man_files @@ -13145,9 +15731,6 @@ uninstall_groffdirs: fi; \ rmdir $(DESTDIR)$(dataprogramdir); \ fi - if test -d $(DESTDIR)$(grog_dir); then \ - rmdir $(DESTDIR)$(grog_dir); \ - fi if test -d $(DESTDIR)$(libprogramdir); then \ if test -d $(DESTDIR)$(systemtmacdir); then \ rm -f $(DESTDIR)$(systemtmacdir)/*; \ @@ -13160,6 +15743,12 @@ uninstall_groffdirs: rmdir $(DESTDIR)$(exampledir); \ fi; \ if test -d $(DESTDIR)$(htmldocdir); then \ + if test -d $(DESTDIR)$(htmldocdir)/groff.html.mono; then \ + rmdir $(DESTDIR)$(htmldocdir)/groff.html.mono; \ + fi; \ + if test -d $(DESTDIR)$(htmldocdir)/groff.html.node; then \ + rmdir $(DESTDIR)$(htmldocdir)/groff.html.node; \ + fi; \ rmdir $(DESTDIR)$(htmldocdir); \ fi; \ rmdir $(DESTDIR)$(docdir); \ @@ -13174,23 +15763,22 @@ uninstall_binaries_with_prefix: @USEPROGRAMPREFIX_TRUE@ done; \ @USEPROGRAMPREFIX_TRUE@ fi .man: - $(AM_V_GEN)rm -f $@ \ - && $(MKDIR_P) `dirname $@` \ + $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && LC_ALL=C \ - sed -e "s|[@]APPRESDIR[@]|`echo $(appresdir) | sed -f $(makevarescape)`|g" \ + sed -e "s|[@]APPDEFDIR[@]|`echo $(appdefdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]BINDIR[@]|`echo $(bindir) | sed -f $(makevarescape)`|g" \ -e "s|[@]COMMON_WORDS_FILE[@]|`echo $(common_words_file) | sed -f $(makevarescape)`|g" \ + -e "s|[@]COMPATIBILITY_WRAPPERS[@]|$(compatibility_wrappers)|g" \ -e "s|[@]DATASUBDIR[@]|`echo $(datasubdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]DEFAULT_INDEX[@]|`echo $(indexdir)/$(indexname) | sed -f $(makevarescape)`|g" \ -e "s|[@]DEFAULT_INDEX_NAME[@]|`echo $(indexname) | sed -f $(makevarescape)`|g" \ - -e "s|[@]DEVICE[@]|$(DEVICE)|g" \ + -e "s|[@]DEVICE[@]|\\\\%$(DEVICE)|g" \ -e "s|[@]DOCDIR[@]|`echo $(docdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]EXAMPLEDIR[@]|`echo $(exampledir) | sed -f $(makevarescape)`|g" \ -e "s|[@]FONTDIR[@]|`echo $(fontdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]g[@]|$(g)|g" \ - -e "s![@]G[@]!`echo $(g) | tr '[a-z]' '[A-Z]'`!g" \ + -e "s|[@]g[@]|\\\\%$(g)|g" \ -e "s|[@]HTMLDOCDIR[@]|`echo $(htmldocdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]INDEX_SUFFIX[@]|$(indexext)|g" \ + -e "s|[@]INDEX_SUFFIX[@]|\\\\%$(indexext)|g" \ -e "s|[@]LEGACYFONTDIR[@]|`echo $(legacyfontdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]LOCALFONTDIR[@]|`echo $(localfontdir) | sed -f $(makevarescape)`|g" \ -e "s|[@]LOCALMACRODIR[@]|`echo $(localtmacdir) | sed -f $(makevarescape)`|g" \ @@ -13200,12 +15788,14 @@ uninstall_binaries_with_prefix: -e "s|[@]MAN7EXT[@]|$(man7ext)|g" \ -e "s|[@]MDATE[@]|`$(PERL) $(top_srcdir)/mdate.pl $<`|g" \ -e "s|[@]OLDFONTDIR[@]|`echo $(oldfontdir) | sed -f $(makevarescape)`|g" \ + -e "s|[@]PAGE[@]|\\\\%$(PAGE)|g" \ -e "s|[@]PDFDOCDIR[@]|`echo $(pdfdocdir) | sed -f $(makevarescape)`|g" \ + -e "s|[@]PSPRINT[@]|`echo $(PSPRINT) | sed -f $(makevarescape)`|g" \ -e "s|[@]SYSTEMMACRODIR[@]|`echo $(systemtmacdir) | sed -f $(makevarescape)`|g" \ - -e "s|[@]TMAC_AN_PREFIX[@]|$(tmac_an_prefix)|g" \ - -e "s|[@]TMAC_M_PREFIX[@]|$(tmac_m_prefix)|g" \ - -e "s|[@]TMAC_MDIR[@]|$(tmacdir)/mm|g" \ - -e "s|[@]TMAC_S_PREFIX[@]|$(tmac_s_prefix)|g" \ + -e "s|[@]TMAC_AN_PREFIX[@]|\\\\%$(tmac_an_prefix)|g" \ + -e "s|[@]TMAC_M_PREFIX[@]|\\\\%$(tmac_m_prefix)|g" \ + -e "s|[@]TMAC_MDIR[@]|`echo $(tmacdir) | sed -f $(makevarescape)`/mm|g" \ + -e "s|[@]TMAC_S_PREFIX[@]|\\\\%$(tmac_s_prefix)|g" \ -e "s|[@]VERSION[@]|$(VERSION)|g" \ $< \ >$@ @@ -13214,11 +15804,11 @@ $(top_srcdir)/.version: dist-hook: echo $(VERSION) > $(distdir)/.tarball-version -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/NEWS b/NEWS index 1adb2a1..85b034b 100644 --- a/NEWS +++ b/NEWS @@ -1,11 +1,692 @@ - Copyright (C) 1992-2018 Free Software Foundation, Inc. + Copyright (C) 1992-2023 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This file describes recent user-visible changes in groff. Bug fixes are not -described. There are more details in the man and info pages. +This file describes recent user-visible changes in groff. Bug fixes are +not described. There are more details in the man and info pages. + +VERSION 1.23.0 +============== + +troff +----- + +o The `troffrc` file now loads an English localization file instead of + directly housing configuration parameters appropriate to the English + language. See "Macro Packages" below. + +o A new read-only register `.cp` is implemented. Within a `do` request, + "\n[.cp]" holds the saved value of compatibility mode. See + groff_diff(7) or the groff Texinfo manual for rationale, use case, and + example. + +o New read-only registers `.nm` and `.nn` are implemented. `.nm` is of + Boolean sense, reporting the enablement status of output line + numbering (caused by the `nm` request) irrespective of the temporary + suspension of numbering with the `nn` request. `.nn` holds the count + of numbered output lines still to have that numbering suppressed. + These registers were introduced because there was no way for the + formatter (and thus a document) to introspect their state, tbl(1) + needs to be able to do so, and the writable line number register `ln` + is not a reliable proxy for this information. + +o Type size escape sequences of the form "\sNN", where NN is in the + range 10-39, are now recognized only in compatibility mode ("groff + -C"); when encountered, an error diagnostic is emitted. Otherwise, + "\sN" is interpreted as setting the type size to the single-digit + value N (in scaled points), which ends the escape sequence. This + change eliminates a quirk in the language grammar that dates back to + the mid-1970s (AT&T troff by Ossanna) but was not documented in the + Troff User's Manual until 1992 when Kernighan updated CSTR #54 for + device-independent AT&T troff. + + The form "\s(NN" is accepted for two-digit sizes in all known troffs. + The form "\s[NNN]" accepts a numeric expression of variable length; it + has been supported by groff since version 1.01 (March 1991) or + earlier, by Heirloom Doctools troff since its 2005-08-16 release, and + by neatroff, but not by Plan 9 troff. The form "\s'NNN'" is also + widely supported. + + Summary: in your documents, rewrite escape sequences beginning with + "\s1", "\s2", or "\s3" in an unambiguous and portable form. For + instance, "\s36" can become any of: + \s(36 + \s[36] + \s'36' + You can use + grep '\\s[123]' + to find instances in your documents. + + Those who have changed the escape character with the `ec` request (an + advanced usage) are expected to be able to cope; ask the development + team for support if you need it. + +o New requests `soquiet` and `msoquiet` are available. They operate as + `so` and `mso`, respectively, except that they do not emit a warning + diagnostic if the file named in their argument does not exist. + +o New requests `stringdown` and `stringup` are available. These change + the string named in their argument by replacing each of its bytes with + its lowercase or uppercase version (if any), respectively. groff + special characters (see the groff_char(7) man page) in the string will + often transform in the expected way due to the regular naming + convention for accented letters. When they do not, use substrings + and/or catenation. + +o The `ab` request no longer writes "User Abort." to the standard error + stream if given no arguments. + +o The `fp` request no longer accepts file or font names with slashes in + them as arguments. All font description files are expected to be + accessible within the directory of the output device for which they + were prepared. + +nroff +----- + +o The new option -P takes an argument to pass to the output driver + (always grotty(1)). "-P-i" directs the terminal device to display + real italic (oblique) characters instead of underlining: it is up to + your terminal (emulator) to support italics (xterm does since patch + #314 [2014-12-28]). "-P-h" can now be used instead of -h; the latter + may eventually be deprecated and repurposed. + +o The new option -V emits the constructed groff command that nroff would + run to standard output instead of executing it. Arguments to nroff + that contain shell metacharacters may not be sufficiently escaped for + the output of nroff -V to be copied and pasted to the shell prompt; + this is a historical deficiency of the Bourne shell family not yet + corrected by the POSIX standard. + +o nroff now recognizes the -b, -E, -k, -K, -R, and -z options and passes + them through to groff. + +o nroff now supports spaces and tabs between option flag letters and + arguments to options, like groff and troff themselves. + +groff +----- + +o The -I option now implies -g (run the grn(1) preprocessor), and + supplies grn an -M option with the argument to -I. + +eqn +--- + +o The GNU extension + + delim on + + is now recognized even in AT&T compatibility mode (the -C option) in + order to reliably integrate with tbl. Few eqn documents are expected + to use 'o' and 'n' as left and right delimiters, respectively. If + yours does, consider swapping them, or select others. + +o The command-line option -D is no longer supported. It has been + undocumented, and issued a warning of its obsolescence upon use, for + 30 years, since groff 1.06 (September 1992). + +pic +--- + +o The token `.PY` is now recognized as a synonym of `.PF` to work around + a name space collision with the m (mm) macro package, which defines + `PF` as a page footer management macro. (This problem dates back at + least to Unix System V Release 2, 1983.) You should continue to use + `.PF` to end pictures with flyback unless a similar problem faces your + document. + +tbl +--- + +o GNU tbl now suspends output line numbering while formatting tables, + saving and restoring its status before and after each table region, + including the count of lines for which numbering is suppressed. + Historical tbl implementations did not, with bizarre consequences when + text blocks were used in tables. + +Macro packages +-------------- + +o mom version 2.5 is distributed with this release. New features + include shaded backgrounds, frames, and colored pages. Thanks to + Peter Schaffter. + +o English localization has been split into a dedicated macro file, + `en.tmac`, for better parallelism with other localization files and to + improve support for multilingual documents. Those who want a + different default input language should edit the troffrc file to + source the desired groff locale macro file (`cs.tmac`, `de.tmac`, + `den.tmac`, `fr.tmac`, `it.tmac`, `ja.tmac`, `sv.tmac`, or `zh.tmac`) + instead of `en.tmac`. + + The default hyphenation mode (as given to the `hy` request) for users + of English has changed from "1", which was inappropriate for the + TeX-based hyphenation patterns groff has used since at least 1991, to + "4". However, invoking ".hy" without an argument remains synonymous + with ".hy 1". + +o The hyphenation patterns for English have been updated using the + `hyph-en-us.tex` patterns file from the TeX hyph-utf8 project. The + new patterns likely _will_ change the automatic hyphenation break + points of your English documents. + +o The `PDFPIC` macro (provided by the `pdfpic` package) no longer aborts + upon encountering trouble. Instead, it reports an error and abandons + processing of its argument(s). It is also more sensitive to other + kinds of problems and handles them the same way, by issuing a + diagnostic and returning. If you wish `PDFPIC` to abort document + processing immediately upon error, you can append an `ab` request to + the package's error-handling macro. + + .am pdfpic@error + . ab + .. + +o The pspic package now also has an error hook macro, which you can use + to make failed image loads fatal (or attempt fallback or recovery). + + .am pspic@error-hook + . ab + .. + +o The new rfc1345 macro package, contributed by Dorai Sitaram, defines + special character identifiers implementing RFC 1345 mnemonics (plus + some additions from Vim, which itself uses RFC 1345 for its digraphs). + It is documented in the groff_rfc1345(7) man page. + +o The new sboxes macro package, contributed by Deri James, offers a + simple interface to the new gropdf(1) "background" feature. Using it, + ms documents can draw colored rectangles beneath any groff output. + See "Using PDF boxes with groff and the ms macros", installed as + `msboxes.ms` and `msboxes.pdf` for instructions and a demonstration. + +o The an (man) and doc (mdoc) macro packages no longer remap the -, ', + and ` input characters to Basic Latin code points on UTF-8 devices, + but treat them as groff normally does (and AT&T troff before it did) + for typesetting devices, where they become the hyphen, apostrophe or + right single quotation mark, and left single quotation mark, + respectively. This change is expected to expose glyph usage errors in + man pages. See the "PROBLEMS" file for a recipe that will conceal + these errors. A better long-term approach is for man pages to adopt + correct input practices; the man pages groff_man_style(7), + groff_char(7), and man-pages(7) (subsection "Generating optimal + glyphs"; from the Linux man-pages project) contain such instructions. + Doing so also improves man page typography when formatting for PDF. + + If you maintain a generator of man(7) or mdoc(7) documents (such as a + tool that converts other formats to them), and need assistance, please + contact the groff@gnu.org mailing list and describe your situation. + +o The an (man) macro package can now produce clickable hyperlinks within + terminal emulators, using the OSC 8 support added to grotty(1) (see + below). The groff man(7) extension macros `UR` and `MT`, present + since 2007, expose this feature. At present the feature is disabled + by default in `man.local` pending more widespread recognition of OSC 8 + sequences in pager programs. The package now recognizes a `U` + register to enable hyperlinks in any output driver supporting them. + + Use a command like + printf '\033]8;;man:grotty(1)\033\\grotty(1)\033]8;;\033\\\n' | more + to check your terminal and pager for OSC 8 support. If you see + "grotty(1)" and no additional garbage characters, then you may wish to + edit "man.local" to remove the lines that disable this feature. + +o The an (man) macro package supports a new macro, `MR`, intended for + use by man page cross references in preference to the font style + alternation macros historically used. Where before you would write + .BR ls (1). + or + .IR ls (1). + you should now write + .MR ls 1 . + (the third argument, typically used for trailing punctuation, is + optional). Because the macro semantically identifies a man page, it + can create a clickable hyperlink ("man:ls(1)" for the above example) + on supporting devices. Furthermore, a new string, `MF`, defines the + font to be used for setting the man page topic (the first argument to + `MR` and `TH`), permitting configuration by distributions, sites, and + users. + + Inclusion of the `MR` macro was prompted by its introduction to + Plan 9 from User Space's troff in August 2020. Its purpose is to + ameliorate several long-standing problems with man page cross + references: (1) the package's lack of inherent hyperlink support for + them; (2) false-positive identification of strings resembling man page + cross references (as can happen with "exit(1)", "while(1)", + "sleep(5)", "time(0)" and others) by terminal emulators and other + programs; (3) the unwanted intrusion of hyphens into man page topics, + which frustrates copy-and-paste operations (this problem has always + been avoidable through use of the \% escape sequence, but cross + references are frequent in man pages and some page authors are + inexpert *roff users); and (4) deep divisions in man page maintenance + communities over which typeface should be used to set the man page + topic (italics, roman, or bold). + +o Part of the an (man) macro package has been renamed from "an-old.tmac" + to "an.tmac", replacing a file that sourced the "andoc.tmac" wrapper. + This means that the "-man" argument to groff (or nroff, or troff) will + no longer load the andoc wrapper, and not successfully format mdoc(7) + man pages. If you are not sure which macro package a given man page + uses, or you wish to batch-process a series of man pages written + variously in the man and mdoc formats, be sure to call the formatter + with the "-mandoc" option explicitly, as "-man" will no longer do + this. The man-db man(1) implementation has, since 2001, used + "-mandoc" preferentially if available when man-db is configured. + +o The an (man) and doc (mdoc) macro packages support a new `AD` string + to put the default adjustment mode under user control at rendering + time. The default is "b" (adjust lines to both margins) as has been + the Unix man(7) default since 1979. + +o The an (man) and doc (mdoc) macro packages support new `CS` and `CT` + registers to control rendering of man page section headings and topics + (seen in the page header), respectively, in full capitals. These + default off (with no visible effect on pages that already fully + capitalize such text in man page sources). The rationale is to + encourage man page authors to preserve case distinction information in + (or restore it to) their topics and section headings, while giving + users (including system administrators, distributors, integrators, and + maintainers of man(1) implementations) a way to view the rendered page + elements in full capitals if desired. + +o The an (man) macro package no longer honors an `ll` request to set the + line length on nroff devices prior to processing a man page. This was + deprecated in groff 1.18 (July 2002), and all known man program and + macro package implementations either have set an LL register since + 2002 (man-db man), 2005 (Brouwer/Lucifredi man), or don't let the user + vary the line length freely (DWB troff, Solaris troff, Plan 9 troff), + don't permit its configuation via the `ll` request (mandoc), or at all + (Heirloom Doctools troff). + +o The an (man) macro package now interprets the value of the `HY` + register as a Boolean; using it to set a specific hyphenation mode is + no longer supported. The groff command-line option `-rHY=0` continues + to disable automatic hyphenation of man page text as before. + +o The an (man) macro package's `TS` macro no longer inserts vertical + space. It was not documented to do so, but had since groff 1.18 (July + 2002). Man page authors may freely use paragraphing macros around + tables if vertical space is desired. + +o The an (man) macro package no longer attempts to detect misuse of the + `R` string as a macro. The `R` string itself is a legacy feature, not + required in modern man pages; see groff_man_style(7). + +o The groff_man(7) man page documenting the groff implementation of the + an (man) macro package has been split into two pages. The original + page remains as a terser reference for experienced users. A new page, + groff_man_style(7), is a tutorial and style guide containing the same + material supplemented with explanations, examples, and advice for the + reader who is not an expert in *roff systems or in writing man pages. + +o The doc (mdoc) macro package now honors the `C`, `FT`, `HY`, `IN`, + `P`, `SN`, and `X` registers and `HF` string as the an (man) package + does. + +o The doc (mdoc) macro package now renders man page (sub)section cross + references cited with the `Sx` macro by quoting them instead of + setting them in italics. + +o The e (me) macro package has changed its default line length on + typesetting devices from 6i to the output device's default (for + example, 6.5i on the 'ps' and 'pdf' devices). You can use + "papersize.tmac" to override this length, as in "groff -d paper=a4l" + to select A4 paper in landscape orientation, without needing to alter + the document. + +o The e (me) macro package has changed its support for output line + numbering with the `n1` and `n2` macros to resolve several bugs in the + previous implementation. The `n1` macro now accepts an optional `C` + argument to set the line number at the existing page offset instead of + reducing the page offset to make the line number appear in the left + margin. A second argument to the `n2` macro is no longer supported. + A new register `no` makes configurable the amount of horizontal space + to be used for the line number (the default is unchanged). + +o The e (me) macro package now uses strings `wa` and `wc` to store the + terms the package produces in chapter headings created by the `$c` + macro. The strings, which default to "Appendix" and "Chapter", + respectively, ease localization of the package and replacement of the + terms used without requiring the `$c` macro to be redefined. + +o The e (me) macro package has a new macro, `ld`, which "re-localizes + the date"; if you modify troff registers `dw`, `mo`, and `yr` (to + record a document's date of revision, for instance), call `ld` + afterward to update the package's `y2` and `y4` registers and the + localized strings `dw` and `mo` for the names of the weekday and + month. `ld` is also used internally to simplify the use of the + package with languages other than English; it thus updates the `wa` + and `wc` strings as well. If you want to customize these strings, do + so after any `ld` call you make. + +o The e (me) macro package now has a register `sx` that eases the + configuration of space added to the line height above/below when + super/subscripting is used. It defaults to 0.2m, the value used + literally in past definitions of the super/subscripting strings. + groff's own 'me' documents redefine it to zero. + +o The e (me) macro package's `$v` and `$V` registers have been renamed + to `tv` and `dv`--they control the vertical spacing used + for text and displays/annotations, respectively. The old names are + still supported as aliases. The new names reflect the fact that users + are expected to set them if desired, unlike other registers and + strings beginning with "$". + +o The e (me) and s (ms) macro packages now offer a `PF` macro, + supporting the pic(1) preprocessor's "flyback" feature. Thanks to + Dave Kemper. + +o The m (mm) and s (ms) macro packages no longer implement the `IX` + macro. This undocumented 4.2BSD ms extension was similarly + undocumented by groff mm and ms. No documents applying it are + attested. groff mm documents its own indexing feature, `INITI`. We + otherwise suggest makeindex(1), which supports troff and is available + with most TeX distributions, for your mm/ms document indexing needs. + +o The m (mm) macro package now adapts to the paper format selected when + the macro file "papersize.tmac" is used (by specifying the groff "-d + paper" command-line option). A consequence is that "groff -mm" and + "groff -d paper=letter -mm" are _not_ synonymous (when groff is + configured to use U.S. letter as the default paper format), because + groff mm(7) uses a page offset of 0.963 inches on typesetting devices + for compatibility with DWB mm. If the `W` or `O` registers are also + set on the command line, the line length and page offset, + respectively, are not overridden by "papersize.tmac". + +o The m (mm) macro package now recognizes a `V` register to set the + vertical spacing for the document. Like the existing `S`, it must be + set from the command line. Further, both registers are interpreted + correctly if suffixed with a scaling unit, instead of requiring an + unscaled value assumed to be points. + +o The m (mm) macro package now supports AT&T/DWB mm's `Sm` string. + +o The m (mm) macro package now requires a title to be declared when + memorandum type 5 is used (".MT 5"), just as type 4 has since groff + 1.10 (November 1995). + +o The m (mm) and s (ms) macro packages no longer manipulate the set of + enabled warning categories. If you want all warnings on, use the + `warn` request with no arguments in your document or pass "-w w" to + groff (see troff(1) or the groff Texinfo manual for more on warnings). + +o The m (mm) and s (ms) macro packages' `R` macros now work analogously + to their `B` and `I` macros instead of ignoring their arguments. + +o The m (mm) package now offers a `PY` macro, which serves the function + of `PF` (end pic(1) picture with flyback) from other macro packages. + +o The "ptx.tmac" macro file, a counterpart to the GNU coreutils ptx(1) + command for generating permuted indexes, is now installed. It has + long been part of the source distribution. + +o The s (ms) macro package now enables the formatter's "no-space mode" + after ending displays (`DE`), equations (`EN`), tables (`TS`), and + pictures without flyback (`PE`). This means that display distance + spacing (the `DD` register) overrides the spacing that may follow in a + subsequent paragraph, section heading, or display instead of + accumulating with that distance. This change is to make the behavior + of the package more predictable; you can fine-tune such spacing by + setting the `DD` register in desired places. It has also helped us to + improve groff ms's rendering of historical ms(7) documents such as + Kernighan & Cherry's "Typesetting Mathematics". + +o The s (ms) macro package supports a new string, `FR`, which defines + the ratio of the footnote line length to the current line length. The + default expression is "11/12", eleven twelfths of the normal line + length, adopted for better compatibility with ms documents prepared + with AT&T ms or its descendant implementations in Heirloom Doctools + and neatroff. This is a change from previous groff releases, which + used a ratio of five sixths. + + You may wish to set the `FR` string to "1" to align with contemporary + typesetting practices. In Unix Version 7 ms, its descendants, and + groff prior to this release, an `FL` register was used for the line + length in footnotes; however, setting this register at document + initialization time had no effect on the footnote line length in + multi-column arrangements. + + `FR` should be used in preference to the old `FL` register in + contemporary documents; see the groff Texinfo manual or the "Using + groff with the ms macros" document, also part of this release. Thanks + to T. Kurt Bond. + +o The s (ms) macro package has added strings, `<` and `>`, to perform + subscripting. They work analogously to the `{` and `}` superscripting + strings that have been present in groff ms since 1991 or earlier. + +o The s (ms) macro package has added a hook macro, `FS-MARK`, which is + called automatically by the `FS` macro (with the same arguments given + to `FS`) before any other footnote processing. It is empty by default + but can be defined by the user to, for example, place a hyperlink + anchor so that a link within a footnote can return to its referential + context. "Portable Document Format Publishing with GNU Troff", + distributed with groff as `pdfmark.ms`, uses this technique. Thanks + to Keith Marshall. + +o The s (ms) macro package's `RP` macro recognizes a new optional + argument, `no-renumber`, which suppresses the renumbering of the page + after the cover page as page 1. It furthermore recognizes the + optional argument `no-repeat-info`, which has the same effect as `no`; + the latter will continue to be supported for backward compatibility. + Optional arguments to `RP` can be given in any order. + +o The s (ms) macro package supports new macros `XN` and `XH` to ease the + input of numbered and unnumbered section headings, respectively. They + internally call the `XS` and `XE` macros to produce table of contents + entries, and lay a foundation for inclusion of PDF bookmarks, all + without requiring retyping of the heading text as the package + previously encouraged. Thanks to Keith Marshall. + +o The s (ms) macro package now uses a default line length of 6.5 inches + by default, resulting in 1-inch left and right margins. When the + "papersize.tmac" package is used by employing the "-d paper" groff(1) + option on typesetting devices, the default page offset and line length + are adjusted to maintain these margins. + +o The "a4.tmac" file has been dropped from the distribution. Its + successor, "papersize.tmac", has been present and documented for + nearly 20 years. See subsection "Paper format" of groff(1). + +o The "safer.tmac" file has been dropped from the distribution. It was + present only to support man(1) programs that unconditionally passed + the formatter the "-msafer" option, and had contained only comments + for over 20 years. If your man(1) program has this requirement, you + can create an empty file of this name in groff's macro file search + path (see troff(1)) or consider migrating to man-db man(1). + +Output drivers +-------------- + +o On output devices using the Latin-1 character encoding ("groff -T + latin1" and the X11 devices) the special character escape sequence + \[oq] (opening quote) is now rendered as code point 0x27 (apostrophe) + instead of 0x60 (grave accent). The ISO 8859/ECMA-94 Latin character + sets do not define any glyphs for directional ("typographer's") + quotation marks, but the apostrophe is depicted in the defining + standard as a neutral (vertical) glyph, whereas the grave accent 0x60 + and acute accent 0xB4 are mirror-symmetric diacritical marks. + + This change has no effect on _input_ conventions for roff source + documents. You can still get directional single quotes on UTF-8, + PostScript, PDF, and other output devices supporting them by typing + sequences like `this' in the input (character remapping with 'char' + requests and similar notwithstanding). + +gropdf +------ + +o A new device control command, "background", enables boxes to be drawn + underneath other page content. The boxes can be shaded with colors, + drawn with a colored border of configurable thickness, and interrupted + by page breaks with special support for breaking before footnotes and + similar material. For convenience, "pdf.tmac" exposes a new macro, + `pdfbackground`. Thanks to Deri James. + +grotty +------ + +o The "utf8" output device now maps the input characters '^' (caret, + circumflex accent, or "hat") and '~' (tilde) to U+02C6 (modifier + letter circumflex accent) and U+02DC (small tilde), respectively, for + consistency with groff's other output devices. This change is + expected to expose glyph usage errors in man pages. See the + "PROBLEMS" file for a recipe that will conceal these errors. A better + long-term approach is for man pages to adopt correct input practices; + the man pages groff_man_style(7), groff_char(7), and man-pages(7) + (subsection "Generating optimal glyphs"; from the Linux man-pages + project) contain such instructions. Doing so also improves man page + typography when formatting for PDF. + + If you maintain a generator of man(7) or mdoc(7) documents (such as a + tool that converts other formats to them), and need assistance, please + contact the groff@gnu.org mailing list and describe your situation. + +o A new device control command, "link", generates OSC 8 hyperlinks. + This means that groff documents can produce clickable links in the + terminal window for emulators that support such escape sequences. + +o The "sgr" device control command, which dynamically configured support + for ISO 6429/ECMA-48 SGR escape sequences (and restored traditional + overstriking behavior if disabled), has been removed. It took effect + only at page boundaries. grotty's "-c" command-line option and the + GROFF_NO_SGR environment variable remain supported. + +Documentation +------------- + +o groff's Texinfo manual is included in the distribution archive in + several formats, including GNU Info, HTML, TeX DVI, PDF, and plain + text. Many sections have been extensively revised and corrected, and + much material added to help the learner acquire the groff formatting + language (see, for instance, the section/node "Text"). + +o A compilation of all of groff's man pages in PDF and UTF-8-encoded + text (with SGR escape sequences) is produced by the build. Many of + the documents in this 380+-page document have been heavily revised or + rewritten, including tbl(1), groff(1), groff_diff(7), groff_font(5), + groff(7), groff_char(7), and roff(7). The PDF version uses pdfmark + extensions to produce an internal bookmark for every man page + document, section heading, and subsection heading. + +o Larry Kollar's "Using groff with the ms Macro Package" has been + resurrected after 20+ years, revised, and updated. + +o Eric Allman's "me Reference Manual" has been revised in detail. + +Miscellaneous +------------- + +o Because all generated forms of groff's Texinfo manual are now included + in the distribution archive, building from that archive no longer + depends on GNU Texinfo or a TeX installation (the latter was required + only for the "doc" target, which had to be explicitly named). + +o Building groff from its distribution archive no longer requires byacc + (or GNU Bison) to be installed. + +o m4 is now required to build. Any m4 that implements the features + documented in the Version 7 Unix m4(1) man page, and the `-D` option, + should suffice. + +o New 'configure' options '--{en,dis}able-groff-allocator' control + whether groff uses its own malloc/free-wrapping allocator to implement + all C++ new/delete operations. groff has used this allocator for over + 30 years; C++ implementations are more mature now. The default is now + to rely on C++ language runtime support for new/delete. When building + groff, use + configure --enable-groff-allocator + to re-enable groff's traditional allocator. + +o The 'configure' option '--with-appresdir' has been renamed to + '--with-appdefdir'. + +o Italian language input documents are now supported, including + hyphenation patterns from the hyph-utf8 project and localized strings + for the ms, me, mm, and mom packages. Thanks to Edmond Orignac. + +o Manual section titles for man pages (those that appear by default in + the page header, like "General Commands Manual") are now localized for + Czech, German, French, Italian, and Swedish. + +o The semantics of the environment variable SOURCE_DATE_EPOCH to groff, + support for which was added in 1.22.4, were not established at that + time with respect to time zone selection, prompting divergent + interpretations; Debian and distributions derived from it have for + several years patched groff to implicitly use UTC as the time zone + when interpreting the current time (or SOURCE_DATE_EPOCH) as a local + time. While a convenient and defensible choice for reproducible build + efforts, it runs against the grain of user expectations. Systems + programmers like time zone-invariant, monotonically increasing clocks; + the broader user base usually prefers a clock that follows an + applicable civil calendar. groff programs now reckon + SOURCE_DATE_EPOCH with respect to the local time zone. Users of + SOURCE_DATE_EPOCH may wish to also set the TZ environment variable. + +o xtotroff now supports a "-d" option to specify the directory in which + to generate font description files. + +o The 'configure' option '--with-doc' that was introduced in version + 1.22.3 has been deleted again. Its basic idea was misguided because + each of the documents is only available in a subset of the output + formats, so in contrast to the documentation, the option not only + affected which output formats were generated, but also restricted the + documentation content the user would get in erratic and surprising + ways. The option was also ill-designed insofar as the "examples" + keyword did not represent an output format. Some example files were + controlled by the "examples" keyword alone, some by the respective + format keywords alone, and some by a combination of both. The + implementation of the option was full of bugs, but few, if any, of + these bugs were ever reported by users, giving the impression that + few, if any, users ever attempted to use the option, and those who did + likely remained unaware that doing so deprived them of parts of the + content of the documentation. Experience has demonstrated that + properly maintaining and testing the option exceeds the amount of + effort the GNU troff team is able to invest. Finally, GNU standards + contain no recommendation to support this option, and indeed, few, if + any, GNU packages apart from groff support it. + +o The 'doc' Make target has been eliminated. 'all' (the default Make + target) assumes responsibility for generating the groff Texinfo manual + in all formats supported by the build host. This change is only + significant when building from a Git checkout or if our Texinfo + manual's sources are modified; the distribution archive now provides + copies of the manual in Info, plain text, HTML, DVI, and PDF. + +o afmtodit no longer writes file names with directory information in + them to the "name" directives of the font descriptions it generates. + (The `fp` request no longer accepts such names; see "troff" above.) + +o afmtodit now exits with status 2 (not 1) upon usage errors. + +o afmtodit now recognizes a '-w' option to specify the generated font + description's "spacewidth" parameter (see groff_font(5)). The + internal library "libgroff" now emits a diagnostic if a font + description file is missing such a directive. Adding this option + enables a well-formed font description to be produced by the tool + (without requiring editing by hand). + +o pfbtops now exits with status 2 upon usage errors and the standard C + library's `EXIT_FAILURE` status (usually 1) on operational failures + instead of vice versa. + +o groffer has been deleted from the distribution. + +o grog no longer supports the "--warnings" option; the one diagnostic + message that it enabled has been removed. + +o The ditroff(7) man page has been deleted. The "History" section of + roff(7) covers the same subject in greater depth. + +o The groff_filenames(5) man page has been deleted. It had inaccuracies + and spurious content. The "File name conventions" section of roff(7) + covers the same subject. + +o The lj4_font(5) man page has been deleted. Its content has moved into + the "Fonts" subsection of grolj4(1). VERSION 1.22.4 @@ -14,38 +695,36 @@ VERSION 1.22.4 Troff ----- -o The `hy' request has been extended. Value 16 enables hyphenation before - the last character, and value 32 enables hyphenation after the first - character. - +o The `hy' request has been extended. Value 16 enables hyphenation + before the last character, and value 32 enables hyphenation after the + first character. PDFPIC ------ -o PDFPIC has been corrected so the behaviour is the same whether you use the - PostScript or PDF drivers. However, this means that any documents which - were written using the old behaviour will not be rendered correctly if - using the PDF driver with the new version. +o PDFPIC has been corrected so the behaviour is the same whether you use + the PostScript or PDF drivers. However, this means that any documents + which were written using the old behaviour will not be rendered + correctly if using the PDF driver with the new version. The change would mean that documents which relied on the previous behaviour are likely to have a gap underneath the image which was not - there before. If you see this effect there are three ways you can restore - the previous behaviour: + there before. If you see this effect there are three ways you can + restore the previous behaviour: - Add the line ".nr PDFPIC_NOSPACE 1" to the document before the first call - to .PDFPIC. + Add the line ".nr PDFPIC_NOSPACE 1" to the document before the first + call to .PDFPIC. - If it is just a single document which exhibits this behaviour you can run - groff adding "-rPDFPIC_NOSPACE=1" to the command line. + If it is just a single document which exhibits this behaviour you can + run groff adding "-rPDFPIC_NOSPACE=1" to the command line. - If you have many documents which rely on the previous behaviour you can - set an environment variable "export GROFF_PDFPIC_NOSPACE=1" which will - restore the previous behaviour for all runs. + If you have many documents which rely on the previous behaviour you + can set an environment variable "export GROFF_PDFPIC_NOSPACE=1" which + will restore the previous behaviour for all runs. - Note that this change has no effect if you were using .PDFPIC with the + This change has no effect if you were using .PDFPIC with the PostScript driver--only if you used it with the PDF driver. - Gropdf ------ @@ -54,37 +733,37 @@ o Type 1 font loading is fixed to handle newer Ghostscript versions. o Handling of glyphs above position 255 is improved to allow many more glyphs to be used. -o New macros .pdftransition and .pdfpause are introduced to allow creation - of presentation slides. Partially backward-compatible with present.tmac, - specifically the PAUSE, BLOCKS and BLOCKE commands. Supports all the - transition types introduced in PDF v1.5 (see the gropdf man page). - +o New macros .pdftransition and .pdfpause are introduced to allow + creation of presentation slides. Partially backward-compatible with + present.tmac, specifically the PAUSE, BLOCKS and BLOCKE commands. + Supports all the transition types introduced in PDF v1.5 (see the + gropdf man page). Miscellaneous ------------- -o A new 'configure' option --with-compatibility-wrappers controls how groff - compatibility wrappers for vendor-provided non-GNU macro sets are - installed (see ./configure --help). +o A new 'configure' option --with-compatibility-wrappers controls how + groff compatibility wrappers for vendor-provided non-GNU macro sets + are installed (see ./configure --help). o eqn2graph, grap2graph, and pic2graph now attempt to adapt to very old installed versions of the ImageMagick and GraphicsMagick programs - "convert". They search the output of convert's "-help" option, and use - "-trim" if that string is found; otherwise, the old "-crop 0x0" method - (which produces incompatible results on versions that _do_ support - "-trim") is used. The programs emit a warning to standard error if the - search fails and the old method is used. + "convert". They search the output of convert's "-help" option, and + use "-trim" if that string is found; otherwise, the old "-crop 0x0" + method (which produces incompatible results on versions that _do_ + support "-trim") is used. The programs emit a warning to standard + error if the search fails and the old method is used. o eqn2graph no longer supports the "-unsafe" option. It did nothing. o groffer now supports the output of XHTML. Use the "--xhtml" or "--mode=xhtml" command-line options to generate it. -o Much work has been done, and is ongoing, to make groff's man pages better - examples for man page writers to follow. groff_man(7) itself has been - expanded and largely rewritten to more precisely document the macro - package's behavior and to be more helpful and accessible to man page - writers who may never read any other groff documentation. +o Much work has been done, and is ongoing, to make groff's man pages + better examples for man page writers to follow. groff_man(7) itself + has been expanded and largely rewritten to more precisely document the + macro package's behavior and to be more helpful and accessible to man + page writers who may never read any other groff documentation. VERSION 1.22.3 @@ -108,57 +787,53 @@ o X11 resources for `gxditview', which were previously installed in Note that if the option `--with-appresdir' is passed to `configure', the `prefix' will not be added to `appresdir'. - Glilypond --------- -o This new preprocessor (contributed by Bernd Warken) allows embedding of - code for GNU LilyPond (http://www.lilypond.org), a music typesetter. The - data gets automatically processed and embedded as EPS images. - +o This new preprocessor (contributed by Bernd Warken) allows embedding + of code for GNU LilyPond (http://www.lilypond.org), a music + typesetter. The data gets automatically processed and embedded as EPS + images. Gperl ----- -o Bernd Warken contributed a new preprocessor to handle Perl code that can - be evaluated and then processed by groff. - +o Bernd Warken contributed a new preprocessor to handle Perl code that + can be evaluated and then processed by groff. Gpinyin ------- -o Another preprocessor from Bernd Warken to pretty-print Pinyin syllables - like `guo2wang2' as `guówáng'. - +o Another preprocessor from Bernd Warken to pretty-print Pinyin + syllables like `guo2wang2' as `guówáng'. Pdfroff ------- -o The pdfroff utility script now activates its `--no-toc-relocation' option - by default, unless a request similar to: +o The pdfroff utility script now activates its `--no-toc-relocation' + option by default, unless a request similar to: .if !\n[PHASE] .tm pdfroff-option:set toc_relocation=enabled is invoked during input file processing; (`.if !\n[PHASE] ...' ensures - that the effect of the `.tm' request is restricted to the document setup - phase of processing, as pdfroff sets it to 1 or 2 in the output phase, - but leaves it unset in the setup phase). + that the effect of the `.tm' request is restricted to the document + setup phase of processing, as pdfroff sets it to 1 or 2 in the output + phase, but leaves it unset in the setup phase). The bundled `spdf.tmac' macro package, which implicitly activates `-mpdfmark' for `ms' macro users, ensures that TOC relocation is appropriately enabled, when the `.TC' macro is invoked. - Macro Packages -------------- -o New default values for hyphenation. The previous values were too strict, - suppressing some hyphenation points unnecessarily. +o New default values for hyphenation. The previous values were too + strict, suppressing some hyphenation points unnecessarily. -o The -mom macro package now has full support for eqn, pic, and tbl, as well - as captioning and labelling of PDF images and preprocessor output. Lists - of Figures, Equations, and Tables can now be autogenerated. PDF_IMAGE has - a new FRAME option. +o The -mom macro package now has full support for eqn, pic, and tbl, as + well as captioning and labelling of PDF images and preprocessor + output. Lists of Figures, Equations, and Tables can now be + autogenerated. PDF_IMAGE has a new FRAME option. o A French introduction to the -me macro package has been added (file `meintro_fr.me'). @@ -175,7 +850,6 @@ Tbl o The character `#' can now be used as an eqn delimiter within tables. - Eqn --- @@ -219,17 +893,19 @@ o In -me, the `TH' macro was changed for compatibility with line number o The -mom macro package has reached version 2.0, focusing on PDF output with gropdf (using the new `pdfmom' wrapper script). See the file - `version-2.html' of the -mom documentation for a list of the many changes. + `version-2.html' of the -mom documentation for a list of the many + changes. -o Some generic Unicode fallback characters (mainly Roman numerals) have been - added. +o Some generic Unicode fallback characters (mainly Roman numerals) have + been added. Gropdf ------ -o A new driver for generating PDF output directly, contributed by Deri James - . Note that this driver is written in Perl, - thus you need a working Perl installation to run this output device. +o A new driver for generating PDF output directly, contributed by Deri + James . Note that this driver is written + in Perl, thus you need a working Perl installation to run this output + device. Pdfmom ------ @@ -244,18 +920,19 @@ VERSION 1.21 Troff ----- -o The new `lsm' request specifies a macro to be invoked when leading spaces - in an input line are encountered (which are removed then). Number - registers `lsn' and `lss' hold the number of removed leading spaces and - the corresponding horizontal space, respectively. +o The new `lsm' request specifies a macro to be invoked when leading + spaces in an input line are encountered (which are removed then). + Number registers `lsn' and `lss' hold the number of removed leading + spaces and the corresponding horizontal space, respectively. o There is a new warning category `file', enabled by default. The `mso' - request emits warnings in this category when the requested macro file does - not exist. + request emits warnings in this category when the requested macro file + does not exist. o The new `class' request assigns a short name to a set of characters which can be referred to in the `cflags' request. This is especially - useful to control line-breaking and hyphenation rules in CJK languages. + useful to control line-breaking and hyphenation rules in CJK + languages. o Three new values for the `cflags' request have been added, which are needed for proper CJK support. @@ -267,8 +944,8 @@ o Three new values for the `cflags' request have been added, which are Tbl --- -o A new global option `nowarn' suppresses warnings if tables are longer than - the current line width. +o A new global option `nowarn' suppresses warnings if tables are longer + than the current line width. Afmtodit -------- @@ -281,12 +958,12 @@ Macro Packages o A new macro `%U' has been added to the mdoc package to indicate a URL reference within an .Rs/.Re environment. -o Rudimentary support for the Japanese script has been added, most suitable - for man page handling as output by grotty. The file `ja.tmac' contains - the necessary setup to allow line breaks before and after CJK characters - (with proper exceptions). Note, however, that no inter-character spacing - is implemented yet -- this usually causes many warnings about bad line - breaks. +o Rudimentary support for the Japanese script has been added, most + suitable for man page handling as output by grotty. The file + `ja.tmac' contains the necessary setup to allow line breaks before and + after CJK characters (with proper exceptions). Note, however, that no + inter-character spacing is implemented yet -- this usually causes many + warnings about bad line breaks. VERSION 1.20.1 @@ -303,18 +980,18 @@ Groff ----- o XHTML support has been added to grohtml and can be specified by - -Txhtml. This option also utilizes the MathML capability of - eqn and combines the outputs of both in the final XHTML file. - Users can also specify the `-P-V' option together with `-Txhtml' - in groff. This has the effect of creating an XHTML validator - button at the bottom of each page. + -Txhtml. This option also utilizes the MathML capability of eqn and + combines the outputs of both in the final XHTML file. Users can also + specify the `-P-V' option together with `-Txhtml' in groff. This has + the effect of creating an XHTML validator button at the bottom of each + page. o Some options have been added to control a new preprocessor, `preconv' (see below): `-k' activates it, `-K' sets the input encoding, and `-D' sets the default encoding. -o A new environment variable `GROFF_ENCODING' sets the encoding - of input files; it implies command option `-k'. +o A new environment variable `GROFF_ENCODING' sets the encoding of input + files; it implies command option `-k'. Troff ----- @@ -323,8 +1000,8 @@ o Two new requests `device' and `devicem' have been added which are equivalents to the \X and \Y escapes, respectively. o A new read-only number register `.br' is available which is set to 1 - if a macro is called as .foo and to 0 if called as 'foo. This allows to - reliably modify requests. + if a macro is called as .foo and to 0 if called as 'foo. This allows + to reliably modify requests. .als bp@orig bp .de bp @@ -344,30 +1021,31 @@ o A new request `fzoom' has been added to adjust the optical size of a .ps 12 Palatino and \f[CR]Courier\f[] - The new number register `.zoom' holds the zoom value of the current font, - in multiples of 1/1000th. + The new number register `.zoom' holds the zoom value of the current + font, in multiples of 1/1000th. o The `cflags' request has been extended with a new flag value 64, to be - used in combination with values 2 (break before character) and 4 (break - after character). If set, the hyphenation codes of the surrounding - characters are ignored. + used in combination with values 2 (break before character) and 4 + (break after character). If set, the hyphenation codes of the + surrounding characters are ignored. -o A new debugging request, `pev', has been added to print all of the current - known environments to stderr. It first prints the state of the current - environment, then iterates through all of the known environments, printing - each except the one that is current. +o A new debugging request, `pev', has been added to print all of the + current known environments to stderr. It first prints the state of + the current environment, then iterates through all of the known + environments, printing each except the one that is current. o A new escape `\$^' has been added. It represents the parameters of a - macro as if they were an argument to the `ds' request. This is used by - `trace.tmac'. + macro as if they were an argument to the `ds' request. This is used + by `trace.tmac'. o A new read-only number register `.O' is available which returns the current suppression level as set by the `\O' escape. o The space width emitted by the `\|' and `\^' escape sequences can be - controlled on a per-font basis. If there is a glyph named `\|' or `\^', - respectively (note the leading backslash), defined in the current font - file, use this glyph's width instead of the default value. + controlled on a per-font basis. If there is a glyph named `\|' or + `\^', respectively (note the leading backslash), defined in the + current font file, use this glyph's width instead of the default + value. This behaviour is not new, but hasn't been documented before. @@ -380,35 +1058,35 @@ o Two new command line options `-w' and `-W' are accepted and passed to Preconv ------- -o This is a new preprocessor to convert various input encodings to something - groff understands (this is, ASCII and \[uXXXX] entities, with `XXXX' a - hexadecimal number with 4 to 6 digits, representing a Unicode input code). - Normally, preconv should be invoked with options `-k' and `-K' of groff. - See the preconv man page for details. +o This is a new preprocessor to convert various input encodings to + something groff understands (this is, ASCII and \[uXXXX] entities, + with `XXXX' a hexadecimal number with 4 to 6 digits, representing a + Unicode input code). Normally, preconv should be invoked with options + `-k' and `-K' of groff. See the preconv man page for details. Pic --- -o int(x) now really behaves as documented: It truncates the non-integer part - of x, this is, it rounds towards zero and not towards the next integer - less than or equal to x. +o int(x) now really behaves as documented: It truncates the non-integer + part of x, this is, it rounds towards zero and not towards the next + integer less than or equal to x. o Pic now supports up to 32 macro arguments (and up to 16 on EBCDIC platforms). -o Heinz-Jürgen Örtel contributed code for two new keywords, `xslanted' and - `yslanted', which can change the shape of boxes into arbitrary +o Heinz-Jürgen Örtel contributed code for two new keywords, `xslanted' + and `yslanted', which can change the shape of boxes into arbitrary parallelograms. Tbl --- -o Latest versions of DWB tbl introduced an `x' column specifier for a single - column expanded to the line width. GNU tbl has now been extended to - support even multiple `x' specifiers within a table. +o Latest versions of DWB tbl introduced an `x' column specifier for a + single column expanded to the line width. GNU tbl has now been + extended to support even multiple `x' specifiers within a table. -o To avoid collision with the new `x' specifier, a block formatting macro - must now be selected with specifier letter `m'. +o To avoid collision with the new `x' specifier, a block formatting + macro must now be selected with specifier letter `m'. Eqn --- @@ -420,25 +1098,25 @@ o Eric S. Raymond has added a new device type to eqn, MathML. When Chem ---- -o The preprocessor `chem' was added. `chem' is a roff language to generate - chemical structure diagrams. It generates `pic' output. +o The preprocessor `chem' was added. `chem' is a roff language to + generate chemical structure diagrams. It generates `pic' output. Grops ----- -o The PS font definition files have been regenerated with newer AFM versions - from Adobe's 35 core fonts as present in most Level 2 PS printers. The - changes are minor (most notably, the addition of the `Euro' glyph and an - extended set of kerning values). +o The PS font definition files have been regenerated with newer AFM + versions from Adobe's 35 core fonts as present in most Level 2 PS + printers. The changes are minor (most notably, the addition of the + `Euro' glyph and an extended set of kerning values). - For backwards compatibility, the old set of font definition files is still - available; for details please read the man page of grops. + For backwards compatibility, the old set of font definition files is + still available; for details please read the man page of grops. Grotty ------ -o \D'p...' is now supported if the polygon consists entirely of horizontal - and vertical lines. +o \D'p...' is now supported if the polygon consists entirely of + horizontal and vertical lines. Grohtml ------- @@ -448,8 +1126,9 @@ o XHTML support has been added. o New command line option `-V' (to be used in XHTML mode) to produce an XHTML validator button. -o New command line option `-y' to produce a right-justified groff signature - at the end of the document (in combination with option `-V'). +o New command line option `-y' to produce a right-justified groff + signature at the end of the document (in combination with option + `-V'). Gxditview --------- @@ -476,8 +1155,8 @@ o New option `-f NAME' to set the internal name of the groff font. Macro Packages -------------- -o Joachim Walsdorff contributed the `hdtbl' package for the generation of - tables, using a syntax very similar to the HTML table model. For +o Joachim Walsdorff contributed the `hdtbl' package for the generation + of tables, using a syntax very similar to the HTML table model. For example, a table with two cells and two rows looks like this: .TBL cols=2 @@ -501,17 +1180,19 @@ o Joachim Walsdorff contributed the `hdtbl' package for the generation of This package currently works with `-Tps' only. -o -mandoc now supports multiple man pages (in either man or mdoc format). +o -mandoc now supports multiple man pages (in either man or mdoc + format). o Fabrice Ménard contributed locales support. In particular, it is now - possible to get French localization of the main macro packages (-ms, -mm, - -me, and -mom, but not -man and -mdoc which are localized differently) by - appending `-mfr' to the list of macro packages. Example: + possible to get French localization of the main macro packages (-ms, + -mm, -me, and -mom, but not -man and -mdoc which are localized + differently) by appending `-mfr' to the list of macro packages. + Example: groff -ms -mfr foo > foo.ps - Note that latin-9 input encoding is used for French (to support the `oe' - ligature). + Note that latin-9 input encoding is used for French (to support the + `oe' ligature). o Swedish macro localization (with `-msv') has been added. @@ -522,33 +1203,34 @@ o Czech macro localization (with `-mcs') has been added. Note that latin-2 input encoding is used for Czech. -o A new macro `Dx' has been added to the mdoc package which identifies the - DragonFly OS. +o A new macro `Dx' has been added to the mdoc package which identifies + the DragonFly OS. o If mdoc is used to print multiple man pages (together with the -rcR=0 command line option), each man page now starts a new page. o -mtrace has been considerably improved, now showing number and string - register assignments, among other things. See the groff_trace man page - for details. + register assignments, among other things. See the groff_trace man + page for details. o The PSPIC macro now works with all devices (producing a hollow rectangle on devices which don't support inclusion of PS images) and is loaded in troffrc at start-up. -o A new auxiliary macro package `62bit' has been added which provides some - macros for adding, multiplying, and dividing signed 62bit integers (mainly - to handle normal groff number operations without risking overflow errors). +o A new auxiliary macro package `62bit' has been added which provides + some macros for adding, multiplying, and dividing signed 62bit + integers (mainly to handle normal groff number operations without + risking overflow errors). o For -ms, Eric S. Raymond contributed support for ancient Bell Labs - localisms `.SC', `.UC', `.P1', and `.P2'. The latter three are enabled - only after .SC is called. + localisms `.SC', `.UC', `.P1', and `.P2'. The latter three are + enabled only after .SC is called. o A new string, `SN-STYLE', has been added to the ms macros, controlling the formatting of section numbers in headings defined by `.NH'. -o The new macro package `ptx' provides a template definition for the `.xx' - macro as needed by GNU ptx (for creating permuted indices). +o The new macro package `ptx' provides a template definition for the + `.xx' macro as needed by GNU ptx (for creating permuted indices). VERSION 1.19.2 @@ -564,9 +1246,9 @@ o Analogously to the .ft and \f pair, two new requests `gcolor' and o A new read-only, string-valued register `.sty' returns the name of the current style. -o Two new conditional operators `F ' and `S ' have been added. - `F' is true if a font exists. `S' is true if a style has - been registered. +o Two new conditional operators `F ' and `S ' have been + added. `F' is true if a font exists. `S' is true if a style + has been registered. o Cyrillic characters have been added to the `utf8' and `html' output devices. @@ -574,23 +1256,25 @@ o Cyrillic characters have been added to the `utf8' and `html' output Pic --- -o The `by' argument in a `for' loop can now be negative if it is additive. - For the multiplicative case, it must be greater than zero. +o The `by' argument in a `for' loop can now be negative if it is + additive. For the multiplicative case, it must be greater than zero. Eqn --- -o The following keywords aren't new but haven't been documented previously: +o The following keywords aren't new but haven't been documented + previously: undef NAME (to undefine a macro) copy "FILE" (a synonym for `include') space n (to modify the vertical spacing before and after an equation) -o The following macros aren't new but haven't been documented previously: +o The following macros aren't new but haven't been documented + previously: Alpha, ..., Omega (the same as `ALPHA', ..., `OMEGA') - ldots (three dots on the base line) + ldots (three dots on the baseline) dollar (a dollar glyph) o The following keywords have been extended. Again, this isn't new but @@ -608,8 +1292,8 @@ o The following keywords have been extended. Again, this isn't new but Grohtml ------- -o This device driver has been raised to beta stage; its set of tags should - be stable now. +o This device driver has been raised to beta stage; its set of tags + should be stable now. o New command line option `-s' to set the base point size. @@ -624,14 +1308,14 @@ o Experimental support for zero-width and double-width characters. Gxditview --------- -o On platforms which have the X Window System this program is now built and - installed automatically. +o On platforms which have the X Window System this program is now built + and installed automatically. Xtotroff -------- -o This program to create font definition files for xditview isn't new but - hasn't been installed previously. +o This program to create font definition files for xditview isn't new + but hasn't been installed previously. Groffer ------- @@ -641,41 +1325,43 @@ o A security problem (reported as CAN-2004-0969) has been fixed. Gdiffmk ------- -o A new script contributed by Mike Bianchi. It compares two groff, nroff, - or troff documents and creates an output with added margin characters - (using `.mc') to indicate the differences. +o A new script contributed by Mike Bianchi. It compares two groff, + nroff, or troff documents and creates an output with added margin + characters (using `.mc') to indicate the differences. Pdfroff ------- -o A new wrapper script contributed by Keith Marshall to easily create PDF - documents with groff. +o A new wrapper script contributed by Keith Marshall to easily create + PDF documents with groff. Macro packages -------------- o ms.tmac - . Support for fractional point sizes: A value for the `PS', `VS', `FPS', - and `VPS' register larger than or equal to 1000 is always divided by - 1000. For example, `.nr PS 10250' sets the document's font size to - 10.25 points. + . Support for fractional point sizes: A value for the `PS', `VS', + `FPS', and `VPS' register larger than or equal to 1000 is always + divided by 1000. For example, `.nr PS 10250' sets the document's + font size to 10.25 points. - . The `Ds' and `De' macros provided in ms since groff version 1.19 have - been removed; the equivalent `DS' and `DE' macros should be used - instead. X11 documents which actually use `Ds' and `De' always load a - specific macro file from the X11 distribution (`macros.t') which - provides proper definitions for the two macros. + . The `Ds' and `De' macros provided in ms since groff version 1.19 + have been removed; the equivalent `DS' and `DE' macros should be + used instead. X11 documents which actually use `Ds' and `De' always + load a specific macro file from the X11 distribution (`macros.t') + which provides proper definitions for the two macros. - . The following registers have been added for improving layout control: + . The following registers have been added for improving layout + control: PORPHANS - Defines number of lines following `LP', `PP', `QP', `IP' or `XP' which - must be kept together, before any automatic page break. + Defines number of lines following `LP', `PP', `QP', `IP' or `XP' + which must be kept together, before any automatic page break. HORPHANS - Sets number of lines of following paragraph which must be kept with a - heading, defined by `NH' or `SH', before any automatic page break. + Sets number of lines of following paragraph which must be kept + with a heading, defined by `NH' or `SH', before any automatic page + break. GROWPS Sets the first level of heading (set with `NH') which keeps the @@ -689,8 +1375,8 @@ o ms.tmac levels remain at 10pt (because \n[PS] = 10). . The `SH' macro now accepts a numeric argument, to make heading size - match that of `NH' with same argument value when the `GROWPS'/`PSINCR' - feature is enabled. + match that of `NH' with same argument value when the + `GROWPS'/`PSINCR' feature is enabled. Please refer to the documentation of the ms package for other, minor improvements. @@ -721,9 +1407,9 @@ Miscellaneous ------------- o Two new keywords to the DESC file have been added which are needed for - grohtml: `image_generator' and `unscaled_charwidths'. The former gives - the name of the program which creates PNG images, and the latter makes - troff always use unscaled character widths. + grohtml: `image_generator' and `unscaled_charwidths'. The former + gives the name of the program which creates PNG images, and the latter + makes troff always use unscaled character widths. VERSION 1.19.1 @@ -732,10 +1418,10 @@ VERSION 1.19.1 Groff ----- -o The argument of the command line option `-I' is now also passed to troff - and grops, specifying a directory to search for files on the command line, - files named in `so' and `psbb' requests, and files named in \X'ps: file' - and \X'ps: import' escapes. +o The argument of the command line option `-I' is now also passed to + troff and grops, specifying a directory to search for files on the + command line, files named in `so' and `psbb' requests, and files named + in \X'ps: file' and \X'ps: import' escapes. o If option `-V' is used more than once, the commands are both printed on standard error and run. @@ -746,33 +1432,34 @@ Troff o Two new read-only, string-valued registers `.m' and `.M' return the name of the current drawing and background color, respectively. -o New read-only register `.U' which is set to 1 if in safer mode and set - to 0 if in unsafe mode. +o New read-only register `.U' which is set to 1 if in unsafe mode, and 0 + otherwise. o An input encoding file for latin-5 (a.k.a. ISO 8859-9) has been added. Example use: groff -Tdvi -mlatin5 my_file > my_file.dvi - Note that some output devices don't support all glyphs of this encoding. + Note that some output devices don't support all glyphs of this + encoding. o If the `return' request is called with an argument, it exits twice, - namely the current macro and the macro one level higher. This is - used to define a wrapper macro for `return' in trace.tmac. + namely the current macro and the macro one level higher. This is used + to define a wrapper macro for `return' in trace.tmac. o For completeness, two new requests have been added: `dei1' and `ami1'. They are equivalent to `dei' and `ami', respectively, but the macros are executed with compatibility mode off (similar to `de1' and `am1'). o New command line option `-I' to specify a directory for files (both - those on the command line and those named in `psbb' requests). This is - also handled by the groff wrapper program. + those on the command line and those named in `psbb' requests). This + is also handled by the groff wrapper program. o Since version 1.19 you can say `.vs 0'. Older versions emit a warning and convert this to `.vs \n[.V]'. - This hasn't been documented properly. Note that `.vs 0' isn't saved in a - diversion since it doesn't result in vertical motion. + This hasn't been documented properly. Note that `.vs 0' isn't saved + in a diversion since it doesn't result in vertical motion. Pic --- @@ -789,10 +1476,10 @@ Grap2graph ---------- o A new script contributed by Eric S. Raymond . It - converts a grap diagram into a cropped image. Since it uses gs and the - PNM library, virtually all graphics formats are available for output. - [Note that the grap program itself isn't part of the groff package; - see the file MORE.STUFF how to obtain grap.] + converts a grap diagram into a cropped image. Since it uses gs and + the PNM library, virtually all graphics formats are available for + output. [Note that the grap program itself isn't part of the groff + package; see the file MORE.STUFF how to obtain grap.] Grohtml ------- @@ -802,9 +1489,9 @@ o New option `-j' to emit output split into multiple files. Grops ----- -o New command line option `-I' to specify a directory to search for files - on the command line and files named in \X'ps: import' and \X'ps: file' - escapes. This is also handled by the groff wrapper program. +o New command line option `-I' to specify a directory to search for + files on the command line and files named in \X'ps: import' and \X'ps: + file' escapes. This is also handled by the groff wrapper program. o The default value for the `broken' keyword in the DESC file is now 0. @@ -814,11 +1501,11 @@ Grolj4 o A new man page `lj4_font(5)' documents how fonts are accessed with grolj4. -o The built-in fonts for LJ4 and newer PCL 5 devices have been completely - revised, mainly to access as much glyphs as possible. The provided - metric files should be compatible with recent PCL 5 printers also. - Additionally, font description files have been added for the Arial and - Times New Roman family, the MS symbol, and Wingdings fonts. +o The built-in fonts for LJ4 and newer PCL 5 devices have been + completely revised, mainly to access as much glyphs as possible. The + provided metric files should be compatible with recent PCL 5 printers + also. Additionally, font description files have been added for the + Arial and Times New Roman family, the MS symbol, and Wingdings fonts. Afmtodit -------- @@ -865,18 +1552,18 @@ o Input encoding files for latin-9 (a.k.a. latin-0 and ISO 8859-15) and groff -Tdvi -mlatin9 my_file > my_file.dvi - You still need proper fonts with the necessary glyphs. Out of the box, - the groff package supports latin-9 only for -Tps, -Tdvi, and -Tutf8, - and latin-2 only for -Tdvi and -Tutf8. + You still need proper fonts with the necessary glyphs. Out of the + box, the groff package supports latin-9 only for -Tps, -Tdvi, and + -Tutf8, and latin-2 only for -Tdvi and -Tutf8. o Composite glyphs are now supported. To do this, a subset of the Adobe Glyph List (AGL) Algorithm as described in http://partners.adobe.com/public/developer/opentype/index_glyph.html - is used to construct glyph names based on Unicode character codes. The - existing groff glyph names are frozen; no glyph names which can't be - constructed algorithmically will be added in the future. + is used to construct glyph names based on Unicode character codes. + The existing groff glyph names are frozen; no glyph names which can't + be constructed algorithmically will be added in the future. The \[...] escape sequence has been extended to specify multiple glyph components. Example: @@ -885,10 +1572,10 @@ o Composite glyphs are now supported. To do this, a subset of the Adobe this accesses a glyph with the name `u0041_0328'. - Some groff glyphs which are useful as composites map to `wrong' Unicode - code points. For example, `ho' maps to U+02DB which is a spacing - ogonek, whereas a non-spacing ogonek U+0328 is needed for composite - glyphs. The new request + Some groff glyphs which are useful as composites map to `wrong' + Unicode code points. For example, `ho' maps to U+02DB which is a + spacing ogonek, whereas a non-spacing ogonek U+0328 is needed for + composite glyphs. The new request .composite from to @@ -904,24 +1591,25 @@ o Composite glyphs are now supported. To do this, a subset of the Adobe for more details. o A new request `fschar' has been added to define font-specific fallback - characters. They are searched after the list of fonts declared with the - `fspecial' request but before the list of fonts declared with `special'. + characters. They are searched after the list of fonts declared with + the `fspecial' request but before the list of fonts declared with + `special'. o Fallback characters defined with `fschar' can be removed with the new `rfschar' request. o A new request `schar' has been added to define global fallback - characters. They are searched after the list of fonts declared with the - `special' request but before the already mounted special fonts. + characters. They are searched after the list of fonts declared with + the `special' request but before the already mounted special fonts. o In groff versions 1.18 and 1.18.1, \D'f ...' didn't move the current point horizontally. Despite of being silly, this change has been reverted for backwards compatibility. Consequently, the intermediate output command `Df' also moves the position horizontally again. - \D'f ...' is deprecated since it depends on the horizontal resolution of - the output device (given with the `hor' parameter in the DESC file). - Use the new \D'Fg ...' escape instead. + \D'f ...' is deprecated since it depends on the horizontal motion + quantum of the output device (given with the `hor' parameter in the + DESC file). Use the new \D'Fg ...' escape instead. o For orthogonality, new \D subcommands to change the fill color are available: @@ -932,8 +1620,8 @@ o For orthogonality, new \D subcommands to change the fill color are \D'Fk ...' (cmyk) \D'Fd' (default color) - The arguments are the same as with the `defcolor' request. The current - position is *not* changed. + The arguments are the same as with the `defcolor' request. The + current position is *not* changed. o The values set with \H and \S are now available in number registers \n[.height] and \n[.slant], respectively. @@ -943,21 +1631,21 @@ o The `.pe' number register isn't new but hasn't been documented before. o The new glyph symbol `tno' is a textual variant of `no'. -o The new glyph symbol `+e' represents U+03F5, GREEK LUNATE EPSILON SYMBOL. - (Well, it is not really new since it has been previously supported by - grolj4.) The mapping for both the dvi and lj4 symbol font has been - changed accordingly so that Greek small letter epsilon, `*e', has the - same glyph shape as with other devices. +o The new glyph symbol `+e' represents U+03F5, GREEK LUNATE EPSILON + SYMBOL. (Well, it is not really new since it has been previously + supported by grolj4.) The mapping for both the dvi and lj4 symbol + font has been changed accordingly so that Greek small letter epsilon, + `*e', has the same glyph shape as with other devices. Grops ----- -o The font `freeeuro.pfa' has been added to provide various default glyph - shapes for `eu' and `Eu'. +o The font `freeeuro.pfa' has been added to provide various default + glyph shapes for `eu' and `Eu'. o It is now possible to access all glyphs in a Type 1 font, not only 256 - (provided the font file created by afmtodit has proper entries). grops - constructs additional encoding vectors on the fly if necessary. + (provided the font file created by afmtodit has proper entries). + grops constructs additional encoding vectors on the fly if necessary. o The paper size is now emitted via the %%DocumentMedia and PageSize mechanisms so that it is no longer required to tell `gv' or `ps2pdf' @@ -975,17 +1663,17 @@ o Non-slanted PostScript metrics have been changed again; they no longer Grodvi ------ -o The font cmtex10 has been added as the special font `SC' to the DVI fonts. - It is used as a font-specific special font for CW and CWI. +o The font cmtex10 has been added as the special font `SC' to the DVI + fonts. It is used as a font-specific special font for CW and CWI. o New options -l and -p to set landscape orientation and the paper size. - grodvi now emits a `papersize' special which is understood by DVI drivers - like dvips. + grodvi now emits a `papersize' special which is understood by DVI + drivers like dvips. Consequently, the DESC file should contain a `papersize' keyword. -o The glyph shapes for \[*f] and \[*e] have been exchanged with \[+f] and - \[+e], respectively, to be in sync with all other devices. +o The glyph shapes for \[*f] and \[*e] have been exchanged with \[+f] + and \[+e], respectively, to be in sync with all other devices. o Glyphs \[HE] and \[DI] have been replaced with \[u2662] and \[u2661], respectively, since the former two glyphs have a black (filled) shape @@ -994,8 +1682,8 @@ o Glyphs \[HE] and \[DI] have been replaced with \[u2662] and \[u2661], Grolj4 ------ -o The glyphs \[*e] and \[+e] have been exchanged to be in sync with - all other devices. +o The glyphs \[*e] and \[+e] have been exchanged to be in sync with all + other devices. o The glyph \[~=] is now called \[|=]. Similar to other devices, \[~=] is now another name for glyph \[~~]. @@ -1003,8 +1691,8 @@ o The glyph \[~=] is now called \[|=]. Similar to other devices, \[~=] Grotty ------ -o New option `-r'. It is similar to the -i option except it tells grotty to - use the `reverse video' attribute to render italic fonts. +o New option `-r'. It is similar to the -i option except it tells + grotty to use the `reverse video' attribute to render italic fonts. Pic --- @@ -1029,14 +1717,14 @@ o New option `-t' to emit TeX comment lines (giving current file and the Afmtodit -------- -o Unencoded glyphs in an AFM file are output also (since grops can now emit - multiple encoding vectors for a single font). +o Unencoded glyphs in an AFM file are output also (since grops can now + emit multiple encoding vectors for a single font). o New option `-m' to prevent negative left italic correction values. -o The mapping and encoding file together with file `DESC' are now searched - in the default font directory also. Please refer to the man page of - afmtodit for more details. +o The mapping and encoding file together with file `DESC' are now + searched in the default font directory also. Please refer to the man + page of afmtodit for more details. Macro Packages -------------- @@ -1063,10 +1751,10 @@ o Larry Kollar and others made the man macros more o troff's start-up file `troffrc' now includes `papersize.tmac' to set the paper size with the command line option `-dpaper='. - Possible values for `' are the same as the predefined `papersize' - values in the DESC file (only lowercase; see the groff_font man page) - except a7-d7. An appended `l' (ell) character denotes landscape - orientation. Examples: `a4', `c3l', `letterl'. + Possible values for `' are the same as the predefined + `papersize' values in the DESC file (only lowercase; see the + groff_font man page) except a7-d7. An appended `l' (ell) character + denotes landscape orientation. Examples: `a4', `c3l', `letterl'. Most output drivers need additional command line switches `-p' and `-l' to override the default paper length and orientation as set in @@ -1084,25 +1772,26 @@ VERSION 1.18.1 Troff ----- -o The non-slanted PostScript font definition files have been regenerated to - include left and right italic correction values. Applying those to a - glyph (this is, prepending the glyph with `\,' and appending `\/' to the - glyph) sets the glyph width to the real value given by the horizontal - bounding box values. Without those escapes, the advance width for the - particular glyph is used (which can differ considerably). +o The non-slanted PostScript font definition files have been regenerated + to include left and right italic correction values. Applying those to + a glyph (this is, prepending the glyph with `\,' and appending `\/' to + the glyph) sets the glyph width to the real value given by the + horizontal bounding box values. Without those escapes, the advance + width for the particular glyph is used (which can differ + considerably). Most users will neither need this feature nor notice a difference in - existing documents (provided \, and \/ is used as advertised, namely for - italic fonts only); its main goal is to improve image generation with - grohtml. + existing documents (provided \, and \/ is used as advertised, namely + for italic fonts only); its main goal is to improve image generation + with grohtml. This is an experimental change, and feedback is welcome. Tbl --- -o Added global option `nospaces' to ignore leading and trailing spaces in - data items. +o Added global option `nospaces' to ignore leading and trailing spaces + in data items. Grolbp ------ @@ -1118,7 +1807,8 @@ o Support for b-spline and Bezier curves has been added. Groffer ------- -o New option `--shell' to select the shell under which groffer shall run. +o New option `--shell' to select the shell under which groffer shall + run. Macro Packages -------------- @@ -1129,18 +1819,19 @@ o The string `Am' (producing an ampersand) has been added to mdoc for o `.IX' is now deprecated for mom; you should use `.IQ' (Indent Quit) instead. -o In mom, new inlines `FWD', `BCK', `UP', and `DOWN' deal with horizontal - and vertical movements; please refer to contrib/mom/NEWS for more - details. +o In mom, new inlines `FWD', `BCK', `UP', and `DOWN' deal with + horizontal and vertical movements; please refer to contrib/mom/NEWS + for more details. o New macro ENDNOTES_HDRFTR_CENTER for mom to better control headers. Miscellaneous ------------- -o The `papersize' keyword in the DESC file now accepts multiple arguments. - It is scanned from left to the right, and the first valid argument is - used. This makes it possible to provide a fallback paper size. +o The `papersize' keyword in the DESC file now accepts multiple + arguments. It is scanned from left to the right, and the first valid + argument is used. This makes it possible to provide a fallback paper + size. Example: @@ -1148,8 +1839,8 @@ o The `papersize' keyword in the DESC file now accepts multiple arguments. o A local font directory has been prepended to the default font path; it defaults to /usr/local/share/groff/site-font. Similar to the normal - font searching process, files must be placed into a devXXX subdirectory, - e.g. + font searching process, files must be placed into a devXXX + subdirectory, e.g. /usr/local/share/groff/site-font/devps/FOO @@ -1159,41 +1850,39 @@ o A local font directory has been prepended to the default font path; it VERSION 1.18 ============ -*************************************************************************** -* * -* PLEASE READ THE CHANGES BELOW REGARDING GROTTY, GROFF'S TTY FRONTEND. * -* * -*************************************************************************** +************************************************************************ + PLEASE READ THE CHANGES BELOW REGARDING GROTTY, GROFF'S TTY FRONTEND. +************************************************************************ Troff ----- -o Color support has been added to troff and pic (and to the device drivers - grops, grodvi, grotty, and grohtml -- other preprocessors and drivers will - follow). A new function `defcolor' defines colors; the escape sequence - `\m' sets the drawing color, the escape sequence `\M' specifies the - background color for closed objects created with \D'...' commands. - `\m[]' and `\M[]' switch back to the previous color. `\m' and `\M' - correspond to the new troff output command sets starting with `m' and - `DF'. The device-specific default color is called `default' and can't be - redefined. - - Use the `color' request to toggle the usage of colors (default is on); the - read-only register `.color' is 0 if colors are not active, and non-zero - otherwise. +o Color support has been added to troff and pic (and to the device + drivers grops, grodvi, grotty, and grohtml -- other preprocessors and + drivers will follow). A new function `defcolor' defines colors; the + escape sequence `\m' sets the drawing color, the escape sequence `\M' + specifies the background color for closed objects created with \D'...' + commands. `\m[]' and `\M[]' switch back to the previous color. `\m' + and `\M' correspond to the new troff output command sets starting with + `m' and `DF'. The device-specific default color is called `default' + and can't be redefined. + + Use the `color' request to toggle the usage of colors (default is on); + the read-only register `.color' is 0 if colors are not active, and + non-zero otherwise. The old `Df' output command is mapped onto `DFg'; all color output commands don't change the current font position (consequently, `Df' doesn't either). Outputting color can be disabled in troff and groff with the option -c - (it is always disabled in compatibility mode). See the section on grotty - for the GROFF_NO_SGR environment variable also. + (it is always disabled in compatibility mode). See the section on + grotty for the GROFF_NO_SGR environment variable also. - For defining color components as fractions between 0 and 1, a new scaling - indicator `f' has been introduced: 1f = 65536u. For testing whether a - color is defined (with .if and .ie), a new conditional operator `m' is - available. + For defining color components as fractions between 0 and 1, a new + scaling indicator `f' has been introduced: 1f = 65536u. For testing + whether a color is defined (with .if and .ie), a new conditional + operator `m' is available. More details can be found in the groff_diff.7 manual page and in groff.texinfo. @@ -1201,8 +1890,8 @@ o Color support has been added to troff and pic (and to the device drivers o Similar to \m and \M, \f[] switches back to the previous font. \fP (and \f[P]) is still valid for backwards compatibility. -o The new escape \F is the same as `.fam'; \F[] switches back to previous - family -- \F[P] selects family `P'. +o The new escape \F is the same as `.fam'; \F[] switches back to + previous family -- \F[P] selects family `P'. o Two new glyph symbols are available: `eu' is the official Euro symbol; `Eu' is a font-specific glyph variant. @@ -1210,8 +1899,8 @@ o Two new glyph symbols are available: `eu' is the official Euro symbol; o The new glyph symbols `t+-', `tdi', and `tmu' are textual variants of `+-', `di', and `mu', respectively. -o Latin-1 character 181 (PS name `mu', Unicode name U+00B5 MICRO SIGN) has - got the troff glyph name `mc'. +o Latin-1 character 181 (PS name `mu', Unicode name U+00B5 MICRO SIGN) + has got the troff glyph name `mc'. o -Tutf8 is now available on EBCDIC hosts. @@ -1221,8 +1910,8 @@ o Strings can take arguments, using this syntax: \*[foo arg1 arg2 ...]. .ds xxx This is a \\$1 test. \*[xxx nice] -o It is now possible to have whitespace between the first and second dot (or - the name of the ending macro) to end a macro definition. Example: +o It is now possible to have whitespace between the first and second dot + (or the name of the ending macro) to end a macro definition. Example: .de ! .. @@ -1235,60 +1924,61 @@ o It is now possible to have whitespace between the first and second dot (or . ! .. -o `.fn' is a new string-valued register which returns the (internal) real - font name; styles and families are properly concatenated. +o `.fn' is a new string-valued register that returns the resolved font + font name; a font family and abstract style are catenated. -o Three new read/write registers `seconds', `minutes', and `hours' contain - the current time, set at start-up of troff. Use the `af' request to - control their output format. +o Three new read/write registers `seconds', `minutes', and `hours' + contain the current time, set at start-up of troff. Use the `af' + request to control their output format. -o The new request `fchar' can be used to provide fallback characters. It - has the same syntax as the `char' request; the only difference is that a - character defined with `.char' hides the glyph with the same name in the - current font, whereas a character defined with `.fchar' is checked only if - the particular glyph isn't found in the current font. This test happens - before checking special fonts. +o The new request `fchar' can be used to provide fallback characters. + It has the same syntax as the `char' request; the only difference is + that a character defined with `.char' hides the glyph with the same + name in the current font, whereas a character defined with `.fchar' is + checked only if the particular glyph isn't found in the current font. + This test happens before checking special fonts. o In analogy to the `tmc' request, `.writec' is the same as `.write' but doesn't emit a final newline. -o The new request `itc' is a variant of `.it' for which a line interrupted - with \c counts as one input line. +o The new request `itc' is a variant of `.it' for which a line + interrupted with \c counts as one input line. -o Two new requests `ds1' and `as1' which are similar to `ds' and `as' but - with compatibility mode disabled during expansion of strings defined by - them. +o Two new requests `ds1' and `as1' which are similar to `ds' and `as' + but with compatibility mode disabled during expansion of strings + defined by them. o The syntax of the `substring' request has been changed: The first - character in a string now has index 0, the last character has index -1. - Note that this is an incompatible change. + character in a string now has index 0, the last character has index + -1. Note that this is an incompatible change. o To emit strings directly to the intermediate output, a new `output' request has been added; it is similar to `\!' used at the top level. o `.hpf' has been extended. It can now handle most TeX hyphenation - pattern files without modification. To do that, the commands \patterns, - \hyphenation, and \endinput are recognized. Please refer to groff_diff.7 - for more information. + pattern files without modification. To do that, the commands + \patterns, \hyphenation, and \endinput are recognized. Please refer + to groff_diff.7 for more information. -o `hpfcode' is a new request to provide an input encoding mapping for the - `hpf' request. +o `hpfcode' is a new request to provide an input encoding mapping for + the `hpf' request. o The new request `hpfa' appends hyphenation patterns (`hpf' replaces already existing patterns). -o A new request `ami' (append macro indirect) has been added. The first and - second parameter of `ami' are taken from string registers rather than - directly; this very special request is needed to make `trace.tmac' - independent from the escape character (which might even be disabled). +o A new request `ami' (append macro indirect) has been added. The first + and second parameter of `ami' are taken from string registers rather + than directly; this very special request is needed to make + `trace.tmac' independent from the escape character (which might even + be disabled). -o The new request `sizes' is similar to the `sizes' command in DESC files. - It expects the same syntax; the data must be on a single line, and the - final `0' can be omitted. +o The new request `sizes' is similar to the `sizes' command in DESC + files. It expects the same syntax; the data must be on a single line, + and the final `0' can be omitted. -o `trin' (translate input) is a new request which is similar to `tr' with - the exception that the `asciify' request uses the character code (if - any) before the character translation. Example: +o `trin' (translate input) is a new request which is similar to `tr' + with the exception that the `asciify' request uses the character code + (if any) before the character translation. Example: .trin ax .di xxx @@ -1337,52 +2027,53 @@ o Using the latin-1 input character 0xAD (soft hyphen) for the `shc' Macro Packages -------------- -o Peter Schaffter has contributed a new major macro package - called `mom', mainly for non-scientific writers, which takes care of - many typographic issues. It comes with a complete reference (in HTML - format) and some examples. `mom' has been designed to format documents - for PostScript output only. +o Peter Schaffter has contributed a new major macro + package called `mom', mainly for non-scientific writers, which takes + care of many typographic issues. It comes with a complete reference + (in HTML format) and some examples. `mom' has been designed to format + documents for PostScript output only. -o Two macros `AT' (AT&T) and `UC' (Univ. of California) have been added to - the man macros for compatibility with older BSD releases. +o Two macros `AT' (AT&T) and `UC' (Univ. of California) have been added + to the man macros for compatibility with older BSD releases. -o Both the man and mdoc macro packages now use the LL and LT registers for - setting the line and title length, respectively (similar to those +o Both the man and mdoc macro packages now use the LL and LT registers + for setting the line and title length, respectively (similar to those registers in the ms macro package). If not set on the command line or - in a macro file loaded before the macro package itself, they default to - 78n in nroff mode and 6.5i in troff mode. + in a macro file loaded before the macro package itself, they default + to 78n in nroff mode and 6.5i in troff mode. -o The `-xwidth' specifier in the mdoc macro package has been removed. Its - functionality is now integrated directly into `-width'. Similarly, - `-column' has been extended to provide this functionality also. +o The `-xwidth' specifier in the mdoc macro package has been removed. + Its functionality is now integrated directly into `-width'. + Similarly, `-column' has been extended to provide this functionality + also. -o A new macro `Ex' has been added to the mdoc macro package to document an - exit status. +o A new macro `Ex' has been added to the mdoc macro package to document + an exit status. -o The PSPIC macro has been extended to work with DVI output (`pspic.tmac' is - now automatically loaded for -Tdvi), using a dvips special to load the EPS - file. +o The PSPIC macro has been extended to work with DVI output + (`pspic.tmac' is now automatically loaded for -Tdvi), using a dvips + special to load the EPS file. -o The trace.tmac package now traces calls to `am' also. Additionally, it - works in compatibility mode. +o The trace.tmac package now traces calls to `am' also. Additionally, + it works in compatibility mode. -o `troff.1' has been split. Differences to Unix troff are now documented - in the new man page `groff_diff.7'. +o `troff.1' has been split. Differences to Unix troff are now + documented in the new man page `groff_diff.7'. o `groff_mwww.7' has been renamed to `groff_www.7'. The file mwww.tmac has been removed. -o `groff_ms.7' has been completely rewritten. It now contains a complete - reference to the ms macros. +o `groff_ms.7' has been completely rewritten. It now contains a + complete reference to the ms macros. o `groff_trace.7' documents the trace macro package. o Changes in www.tmac: - Note that HTML support is still in alpha change, so it is rather likely - that both macro names and macro syntax will change. Some of the macros - mentioned below aren't really new but haven't been documented properly - before. + Note that HTML support is still in alpha change, so it is rather + likely that both macro names and macro syntax will change. Some of + the macros mentioned below aren't really new but haven't been + documented properly before. The following macros have been renamed: @@ -1393,41 +2084,44 @@ o Changes in www.tmac: For consistency, the macros `URL', `FTL', and `MTO' now all have the address as the first parameter followed by the description. - By default, grohtml generates links to all section headings at the top - of the document. Use the new `LK' macro to specify a different place. + By default, grohtml generates links to all section headings at the + top of the document. Use the new `LK' macro to specify a different + place. For specifying the background color and a background image, use the new macros `BCL' and `BGIMG', respectively. - The macro `NHR' has been added; it suppresses the generation of top and - bottom rules which grohtml emits by default. + The macro `NHR' has been added; it suppresses the generation of top + and bottom rules which grohtml emits by default. The new macro `HX' determines the cut-off point for automatic link generation to headings. - The image position parameter names in `IMG' have been changed to `-L', - `-R', and `-C'. + The image position parameter names in `IMG' have been changed to + `-L', `-R', and `-C'. New macro `PIMG' for inclusion of a PNG image (it automatically converts it into an EPS file if not -Thtml is used). - New macro `MPIMG' for putting a PNG image into the left or right margin - (it automatically converts it into an EPS file if not -Thtml is used). + New macro `MPIMG' for putting a PNG image into the left or right + margin (it automatically converts it into an EPS file if not -Thtml + is used). New macros `HnS', `HnE' to start and end a header line block. New macro `DC' to produce dropcap characters. - New macro `HTL' to generate an HTML title line only but no H1 heading. + New macro `HTL' to generate an HTML title line only but no H1 + heading. - New macros `ULS' and `ULE' to start and end an unordered list. The new - macro `LI' inserts a list item. + New macros `ULS' and `ULE' to start and end an unordered list. The + new macro `LI' inserts a list item. Groff ----- -o The new command line option `-c' disables color output (which is always - disabled in compatibility mode). +o The new command line option `-c' disables color output (which is + always disabled in compatibility mode). Nroff ----- @@ -1439,9 +2133,11 @@ o Two new command line options `-c' and `-C'; the former passes `-c' to Pic --- -o New keywords `color' (or `colour', `colored', `coloured'), `outline' (or - `outlined'), and `shaded' are available. `outline' sets the color of the - outline, `shaded' the fill color, and `color' sets both. Example: +o New keywords `color' (or `colour', `colored', `coloured'), `outline' + (or `outlined'), and `shaded' are available. `outline' sets the color + of the outline, `shaded' the fill color, and `color' sets both. + + Example: circle shaded "green" outline "black" ; @@ -1453,22 +2149,23 @@ Pic2graph --------- o A new script contributed by Eric S. Raymond . It - converts a PIC diagram into a cropped image. Since it uses gs and the PNM - library, virtually all graphics formats are available for output. + converts a PIC diagram into a cropped image. Since it uses gs and the + PNM library, virtually all graphics formats are available for output. Eqn2graph --------- o A new script contributed by Eric S. Raymond . It - converts an EQN diagram into a cropped image. Since it uses gs and the - PNM library, virtually all graphics formats are available for output. + converts an EQN diagram into a cropped image. Since it uses gs and + the PNM library, virtually all graphics formats are available for + output. Groffer ------- -o A new script contributed by Bernd Warken . It displays - groff files and man pages on X and tty, taking care of most parameters - automatically. +o A new script contributed by Bernd Warken . It + displays groff files and man pages on X and tty, taking care of most + parameters automatically. Grog ---- @@ -1480,15 +2177,16 @@ Grops o Color support has been added. -o A new option `-p' is available to select the output paper size. It has - the same syntax as the new `papersize' keyword in the DESC file. +o A new option `-p' is available to select the output paper size. It + has the same syntax as the new `papersize' keyword in the DESC file. Grodvi ------ -o By default, font sizes are now available in the range 5-10000pt, similar - to PS fonts. If you want the old behaviour (i.e., font sizes at discrete - values only), insert the following at the start of your document: +o By default, font sizes are now available in the range 5-10000pt, + similar to PS fonts. If you want the old behaviour (i.e., font sizes + at discrete values only), insert the following at the start of your + document: .if '\*[.T]'dvi' \ . sizes 500 600 700 800 900 1000 1095 1200 1400 1440 1600 \ @@ -1500,46 +2198,48 @@ o A new font file HBI (using cmssbxo10; this is slanted sans serif bold o Two font families are now available: `T' and `H'. o EC and TC fonts have been integrated. Use `-mec' (calling the file - ec.tmac) to switch to them. Those fonts give a much better coverage of - the symbols defined by groff than the CM fonts. + ec.tmac) to switch to them. Those fonts give a much better coverage + of the symbols defined by groff than the CM fonts. - Note that ec.tmac must be called before any language-specific files; it - doesn't take care of hcode values. + Note that ec.tmac must be called before any language-specific files; + it doesn't take care of hcode values. -o Color support has been added. For drawing commands, colors are translated - to gray values currently. +o Color support has been added. For drawing commands, colors are + translated to gray values currently. Grotty ------ -o Color support has been added, using the SGR (ISO 6429, sometimes called - ANSI color) escape sequences. +o Color support has been added, using the SGR (ISO 6429, sometimes + called ANSI color) escape sequences. o SGR escape sequences are now used by default for underlining and bold - printing also, no longer using the backspace character trick. To revert - to the old behaviour, use the `-c' switch. + printing also, no longer using the backspace character trick. To + revert to the old behaviour, use the `-c' switch. - Note that you have to use the `-R' option of `less' to make SGR escapes - display correctly. On the other hand, terminal programs and consoles like - `xterm' which support SGR sequences natively can directly display the - output of grotty. Consequently, the options `-b', `-B', `-u', and `-U' - work only in combination with `-c' and are ignored silently otherwise. + Note that you have to use the `-R' option of `less' to make SGR + escapes display correctly. On the other hand, terminal programs and + consoles like `xterm' which support SGR sequences natively can + directly display the output of grotty. Consequently, the options + `-b', `-B', `-u', and `-U' work only in combination with `-c' and are + ignored silently otherwise. For the `man' program, it may be necessary to add the `-R' option of - `less' to the $PAGER environment variable (or $MANPAGER, depending on the - used `man' program); alternatively, you can use `man's `-P' option (or - adapt its configuration file accordingly). See man(1) for more details. + `less' to the $PAGER environment variable (or $MANPAGER, depending on + the used `man' program); alternatively, you can use `man's `-P' option + (or adapt its configuration file accordingly). See man(1) for more + details. -o If the environment variable GROFF_NO_SGR is set, SGR output is disabled, - reverting to the old behaviour. +o If the environment variable GROFF_NO_SGR is set, SGR output is + disabled, reverting to the old behaviour. -o A new special \X'tty: sgr n' has been added; if n is non-zero or missing, - enable SGR output (the default). +o A new special \X'tty: sgr n' has been added; if n is non-zero or + missing, enable SGR output (the default). o If the new option `-i' is used (only in SGR mode), grotty sends escape sequences to set the italic font attribute instead of the underline - attribute for italic fonts. Note that many terminals don't have support - for this (including xterm). + attribute for italic fonts. Note that many terminals don't have + support for this (including xterm). Grohtml ------- @@ -1550,26 +2250,26 @@ o New option `-h' to select the style of headings in HTML output. o New option `-b' to set the background colour to white. -o New options `-a' and `-g' to control the number of bits for anti-aliasing - used for text and graphics, respectively. Default value is 4; 0 means - no anti-aliasing. +o New options `-a' and `-g' to control the number of bits for + anti-aliasing used for text and graphics, respectively. Default value + is 4; 0 means no anti-aliasing. o groff character/glyph entities now map onto HTML 4 character entities. Grolbp ------ -o Valid paper sizes are now specified as with the new `papersize' keyword - in the DESC file. Specifically, the old custom paper type format - `custAAAxBBB' is no longer supported. +o Valid paper sizes are now specified as with the new `papersize' + keyword in the DESC file. Specifically, the old custom paper type + format `custAAAxBBB' is no longer supported. Miscellaneous ------------- o A new manual page `ditroff.7' is available. -o The groff texinfo manual is installed now, together with a bunch - of examples. +o The groff texinfo manual is installed now, together with a bunch of + examples. o A new keyword `papersize' has been added to the DESC file format. Its argument is either @@ -1582,8 +2282,8 @@ o A new keyword `papersize' has been added to the DESC file format. Its . a custom paper size definition like `35c,4i' See groff_font(5) for more details. This keyword only affects the - physical dimensions of the output medium; grops, grolj4, and grolbp use it - currently. troff completely ignores it. + physical dimensions of the output medium; grops, grolj4, and grolbp + use it currently. troff completely ignores it. VERSION 1.17.2 @@ -1594,9 +2294,9 @@ This is major bug-fixing release which should replace 1.17.1. Troff ----- -o The `IMAGE' macro in www.tmac has changed: Now the optional 2nd parameter - gives the horizontal image location (left, centered, or right), and the - optional 3rd and 4th parameter the image dimensions. +o The `IMAGE' macro in www.tmac has changed: Now the optional 2nd + parameter gives the horizontal image location (left, centered, or + right), and the optional 3rd and 4th parameter the image dimensions. VERSION 1.17.1 @@ -1607,17 +2307,17 @@ This is mainly a bug-fixing release. Troff ----- -o Two new requests `de1' and `am1' which are similar to `de' and `am' but - with compatibility mode disabled during expansion of macros defined by - them. +o Two new requests `de1' and `am1' which are similar to `de' and `am' + but with compatibility mode disabled during expansion of macros + defined by them. o Added request `brp'. This is the same as `\p'. o Similar to other versions of troff, the `ns' request now works in all diversions, not only in the top-level one. -o New read-only number register `.ns'. Returns 1 if in no-space mode, - 0 otherwise. +o New read-only number register `.ns'. Returns 1 if in no-space mode, 0 + otherwise. Nroff ----- @@ -1630,7 +2330,8 @@ o The environment variable GROFF_BIN_PATH is now checked before PATH for Grohtml ------- -o New option `-D dir' to specify a directory in which all images are placed. +o New option `-D dir' to specify a directory in which all images are + placed. o New option `-I stem' to specify an image name stame. If not given, `grohtml-XXX' is used (`XXX' is the process ID). @@ -1642,38 +2343,39 @@ VERSION 1.17 Groff ----- -o `-mFOO' now searches first for `FOO.tmac' and then for `tmac.FOO'. The - old behaviour has been changed to overcome problems with platforms which - have an 8+3 file name limit, and platforms which have other versions of - troff installed also. Additionally, all macro files have been renamed - using the latter scheme to avoid 8+3 name clashes. +o `-mFOO' now searches first for `FOO.tmac' and then for `tmac.FOO'. + The old behaviour has been changed to overcome problems with platforms + which have an 8+3 file name limit, and platforms which have other + versions of troff installed also. Additionally, all macro files have + been renamed using the latter scheme to avoid 8+3 name clashes. -o The new environment variable GROFF_BIN_PATH is checked for programs groff - is calling (preprocessors, troff, and output devices) before PATH. If not - set, it defaults to the directory where the groff binary is located. - Previously, it was PATH only. The nroff script only uses GROFF_BIN_PATH - to find the groff binary but passes both the GROFF_BIN_PATH and PATH - environment variables to groff. +o The new environment variable GROFF_BIN_PATH is checked for programs + groff is calling (preprocessors, troff, and output devices) before + PATH. If not set, it defaults to the directory where the groff binary + is located. Previously, it was PATH only. The nroff script only uses + GROFF_BIN_PATH to find the groff binary but passes both the + GROFF_BIN_PATH and PATH environment variables to groff. Troff ----- -o The mdoc package has been completely rewritten, using the full power of - GNU troff to remove limitations of Unix troff (which is no longer +o The mdoc package has been completely rewritten, using the full power + of GNU troff to remove limitations of Unix troff (which is no longer supported). Most important changes are: . No argument limit . Almost all macros are parsed and callable (if it makes sense) . `.Lb': prints library names - . `.Nm ' now works as expected; `.Nm "" ' has - been withdrawn + . `.Nm ' now works as expected; `.Nm "" ' + has been withdrawn . Updated `.St' command . `.Fx': prints FreeBSD . `.Ox': prints OpenBSD . `.Bsx': prints BSD/OS . `.Brq', `.Bro', `.Brc': brace enclosure macros . `.Bd -centered': center lines - . `.Bl -xwidth ': interpret and use the resulting width + . `.Bl -xwidth ': interpret and use the resulting + width . Support for double-sided printing (-rD1 command line switch) . Support for 11pt and 12pt document sizes (-rS11, -rS12 command line switches) @@ -1682,16 +2384,18 @@ o The mdoc package has been completely rewritten, using the full power of documents the mdoc package. Great care has been taken to assure backwards compatibility. If you - encounter any abnormal results, please report them to bug-groff@gnu.org. - [2018 UPDATE: This address no longer accepts bug reports; please use the - GNU Savannah bug tracker at http://savannah.gnu.org/bugs/?group=groff.] + encounter any abnormal results, please report them to + bug-groff@gnu.org. [2018 UPDATE: This address no longer accepts bug + reports; please use the GNU Savannah bug tracker at + http://savannah.gnu.org/bugs/?group=groff.] o A new command line option for the `man' macros (similar to the `mdoc' - package) has been implemented: `-rcR=1' (now the default in nroff mode) - produces one single, very long page instead of multiple pages. `-rcR=0' - deactivates it. + package) has been implemented: `-rcR=1' (now the default in nroff + mode) produces one single, very long page instead of multiple pages. + `-rcR=0' deactivates it. -o The `return' request has been added to return immediately from a macro. +o The `return' request has been added to return immediately from a + macro. o A new request `nop' (no operation) has been added which is similar to `if 1'. For example, @@ -1706,9 +2410,9 @@ o A new request `nop' (no operation) has been added which is similar to . nop Hallo! .\} -o `box' and `boxa' are two new requests which behave similarly to `di' and - `da' but don't include a partially filled line (which is restored after - ending the diversion). +o `box' and `boxa' are two new requests which behave similarly to `di' + and `da' but don't include a partially filled line (which is restored + after ending the diversion). o The `asciify' request has been extended to `unformat' space characters and some other escape sequences also. @@ -1716,10 +2420,10 @@ o The `asciify' request has been extended to `unformat' space characters `\ ' is no longer unformatted as a space but remains an unpaddable, unbreakable space character. -o The new `unformat' request is similar to `asciify' but only handles space - characters and tabs specially if the diversion is reread, retaining font - information. This makes it possible to reformat diversions; for example - the following +o The new `unformat' request is similar to `asciify' but only handles + space characters and tabs specially if the diversion is reread, + retaining font information. This makes it possible to reformat + diversions; for example the following .ll 3i . @@ -1755,10 +2459,10 @@ o The new `unformat' request is similar to `asciify' but only handles space b02 b03 b04 b05 b06 b07 b08 b09 b10. -o The new request `linetabs' controls the `line-tabs' mode. In line-tabs - mode, tab distances are computed relative to the (current) output line. - Otherwise they are taken relative to the input line. For example, the - following +o The new request `linetabs' controls the `line-tabs' mode. In + line-tabs mode, tab distances are computed relative to the (current) + output line. Otherwise they are taken relative to the input line. + For example, the following .ds x a\t\c .ds y b\t\c @@ -1776,54 +2480,56 @@ o The new request `linetabs' controls the `line-tabs' mode. In line-tabs a b c - The new read-only number register `.linetabs' returns 1 if in line-tabs - mode, and 0 otherwise. + The new read-only number register `.linetabs' returns 1 if in + line-tabs mode, and 0 otherwise. o Two new requests `tm1' and `tmc' have been added to improve writing messages to the terminal. `tm1' is similar to `tm' but allows leading - whitespace. `tmc' is similar to `tm1' but doesn't emit a final newline. + whitespace. `tmc' is similar to `tm1' but doesn't emit a final + newline. o For compatibility with sqtroff, the request `output' has been added. - The behaviour is similar to `\!' at the top-level, that is, it directly - inserts its argument into the intermediate output format. The syntax - is similar to .tm1, allowing leading whitespace. + The behaviour is similar to `\!' at the top-level, that is, it + directly inserts its argument into the intermediate output format. + The syntax is similar to .tm1, allowing leading whitespace. o The new `spreadwarn' request makes troff warn if spaces in an output line are widened by a given limit or more. -o Use `warnscale' to change the scaling indicator troff uses for - warning messages. +o Use `warnscale' to change the scaling indicator troff uses for warning + messages. o A new request `dei' (define indirect) has been added. The first and second parameter of `dei' are taken from string registers rather than directly; this very special request is needed to make `trace.tmac' independent from the escape character (which might even be disabled). -o It is now possible to save and restore the escape character with two new - requests `ecs' and `ecr'. +o It is now possible to save and restore the escape character with two + new requests `ecs' and `ecr'. o The new escape sequence \B'...' is an analogon to `\A': If the string - within the delimiters is a valid numeric expression, return character `1', - and `0' otherwise. + within the delimiters is a valid numeric expression, return character + `1', and `0' otherwise. -o The new escape sequence `\:' inserts a zero-width break point. This is - similar to `\%' but without a soft hyphen character. +o The new escape sequence `\:' inserts a zero-width break point. This + is similar to `\%' but without a soft hyphen character. o The `tr' request can now map characters onto `\~'. o Calling the `fam' request without an argument switches back to the previous font family. -o The new read-only register `.int' is set to a positive value if the last - output line is interrupted (i.e., if the input line contains `\c'). +o The new read-only register `.int' is set to a positive value if the + last output line is interrupted (i.e., if the input line contains + `\c'). -o The `writem' request is not new, but hasn't been documented before. This - is similar to `write' but instead of a string the contents of a given - macro or string is written to a stream. +o The `writem' request is not new, but hasn't been documented before. + This is similar to `write' but instead of a string the contents of a + given macro or string is written to a stream. o The read/write number register `hp' to get/set the current horizontal - position relative to the input line isn't new but hasn't been documented - properly before. + position relative to the input line isn't new but hasn't been + documented properly before. o `\X' and `\Y' are now transparent for end-of-sentence recognition. @@ -1834,53 +2540,58 @@ Grog ---- o The grog script now works in non-compatibility mode also (which is the - default). As usual, use the `-C' option to activate compatibility mode. + default). As usual, use the `-C' option to activate compatibility + mode. Grops ----- -o A new option `-P' resp. a new environment variable `GROPS_PROLOGUE' has - been added to select a different prologue file. +o A new option `-P' resp. a new environment variable `GROPS_PROLOGUE' + has been added to select a different prologue file. -o The effect of the former `-mpsnew' option to access more Type 1 characters - is now the default and no longer available. To get the old behaviour - (i.e., emulation of some glyphs by composition) use `-mpsold'. +o The effect of the former `-mpsnew' option to access more Type 1 + characters is now the default and no longer available. To get the old + behaviour (i.e., emulation of some glyphs by composition) use + `-mpsold'. Miscellaneous ------------- o For security reasons the following changes have been done: - . The tmac.safer file has been replaced with a built-in solution; .open, - .opena, .pso, .sy, and .pi are completely disabled in safer mode (which - is the default); to enable these requests the `-U' command line flag - must be used. + . The tmac.safer file has been replaced with a built-in solution; + .open, .opena, .pso, .sy, and .pi are completely disabled in safer + mode (which is the default); to enable these requests the `-U' + command line flag must be used. . Files specified with the .mso request or given with the `-m' command - line option, and hyphenation patterns loaded with `.hpf' are no longer - searched in the current directory by default (besides the usual tmac - path). Instead, the home directory is used. To add the current - directory, either use the `-U' or `-M' command line option or set the - GROFF_TMAC_PATH environment variable to an appropriate value. + line option, and hyphenation patterns loaded with `.hpf' are no + longer searched in the current directory by default (besides the + usual tmac path). Instead, the home directory is used. To add the + current directory, either use the `-U' or `-M' command line option + or set the GROFF_TMAC_PATH environment variable to an appropriate + value. - . troffrc, troffrc-end, and eqnrc are neither searched in the current nor - in the home directory (even if -U is given). Use -M or GROFF_TMAC_PATH - to change that. + . troffrc, troffrc-end, and eqnrc are neither searched in the current + nor in the home directory (even if -U is given). Use -M or + GROFF_TMAC_PATH to change that. . Similarly, the current directory is no longer part of the font path. Use the `-F' command line option or the GROFF_FONT_PATH environment variable if you really need the current directory. -o groff now installs its data files into /usr/local/share/groff/ by - default, following the GNU standard. Additionally, a local tmac directory - (by default /usr/local/share/groff/site-tmac) is scanned before the - standard tmac directory. Wrapper files for system-specific macro packages - (if necessary) are put into /usr/local/lib/groff/site-tmac; this directory +o groff now installs its data files into + /usr/local/share/groff/ by default, following the GNU + standard. Additionally, a local tmac directory (by default + /usr/local/share/groff/site-tmac) is scanned before the standard tmac + directory. Wrapper files for system-specific macro packages (if + necessary) are put into /usr/local/lib/groff/site-tmac; this directory is searched before the local tmac directory. -o All programs now have option `-v' to show the version number; they exit - immediately afterwards, following the GNU standards. Additionally, - `--version' and `--help' have been added, doing the obvious actions. +o All programs now have option `-v' to show the version number; they + exit immediately afterwards, following the GNU standards. + Additionally, `--version' and `--help' have been added, doing the + obvious actions. VERSION 1.16.1 @@ -1895,38 +2606,39 @@ VERSION 1.16 Groff ----- -The anachronism of calling the man macro package with `-man' has been fixed; -now you can say `-m man' also. The same is true for `ms', `me', `markup', -`mandoc', and `mdoc'. +The anachronism of calling the man macro package with `-man' has been +fixed; now you can say `-m man' also. The same is true for `ms', `me', +`markup', `mandoc', and `mdoc'. A new switch `-g' for calling `grn' is available. A new switch `-G' for calling `grap' is available. -EBCDIC support for tty devices has been added. On such hosts, IBM code page -1047 is available with -Tcp1047 instead of -Tascii and -Tlatin1 (and, for -the moment, -Tutf8). Note that non-tty devices are not yet supported (but -installed). +EBCDIC support for tty devices has been added. On such hosts, IBM code +page 1047 is available with -Tcp1047 instead of -Tascii and -Tlatin1 +(and, for the moment, -Tutf8). Note that non-tty devices are not yet +supported (but installed). Troff ----- -A new command line option to the `man' macros is available: `-rSxx' (with -`xx' either 10, 11, or 12) to set the base document font size to `xx' -points. Additionally, `.SH' now produces larger headings than `.SS'. +A new command line option to the `man' macros is available: `-rSxx' +(with `xx' either 10, 11, or 12) to set the base document font size to +`xx' points. Additionally, `.SH' now produces larger headings than +`.SS'. To solve a problem with the .PSPIC macro which needs the `-U' switch of troff to access an external program (psbb), a new request .psbb is now -available to get the bounding box of a PostScript image file. The values -(in PostScript units) are returned in the new read-only number registers -`llx', `lly', `urx', and `ury'. Consequently, .PSPIC has been adapted to -use the new request, and the psbb program has been removed. +available to get the bounding box of a PostScript image file. The +values (in PostScript units) are returned in the new read-only number +registers `llx', `lly', `urx', and `ury'. Consequently, .PSPIC has been +adapted to use the new request, and the psbb program has been removed. A new predefined writable number register, `year', has been added. It contains the current year. -A new read-only register, `.Y', has been added. It contains the revision -number of the groff package. +A new read-only register, `.Y', has been added. It contains the +revision number of the groff package. `\fP' now behaves as expected in situations like the following where the font `foo' is undefined: @@ -1938,43 +2650,43 @@ Previously, the text after \fP appeared as bold. The `substring' request is not new, but hasn't been documented before. -The predefined `.T' string register (which holds the current output device) -is not new, but hasn't been documented before. +The predefined `.T' string register (which holds the name of the output +device) is not new, but hasn't been documented before. A new request `length' computes the length of a string and returns it in a number register. -The macro files `tmac.a4' (for specifying A4 paper format) and `tmac.trace' -(a debugging aid) are now installed also. +The macro files `tmac.a4' (for specifying A4 paper format) and +`tmac.trace' (a debugging aid) are now installed also. -A new resource file, `troffrc-end', is now available. It is invoked after -all user-specified macros. Currently used by the html device to include -tmac.html; thus no need for users to specify -mhtml anymore. +A new resource file, `troffrc-end', is now available. It is invoked +after all user-specified macros. Currently used by the html device to +include tmac.html; thus no need for users to specify -mhtml anymore. The soft hyphen character now has a glyph name: `shc'. -The latin-1 character 173 (PS name `periodcentered') has got the troff glyph -name `pc' and is no longer intermixed with the symbol character `md' (PS -name `mathdot'). +The latin-1 character 173 (PS name `periodcentered') has got the troff +glyph name `pc' and is no longer intermixed with the symbol character +`md' (PS name `mathdot'). -ASCII character 34 (PS name `quotedbl') has got the troff glyph name `dq' -(which is an alias to character `"'). +ASCII character 34 (PS name `quotedbl') has got the troff glyph name +`dq' (which is an alias to character `"'). -ASCII character 39 (PS name `quoteright') has got the troff glyph name `cq' -(which is an alias to character "'"). +ASCII character 39 (PS name `quoteright') has got the troff glyph name +`cq' (which is an alias to character "'"). Some additions to the font description files have been implemented for better support of HTML output: - The new format of lines in the `charset' subsection of font description - files is + The new format of lines in the `charset' subsection of font + description files is name metrics type code [entity_name] [-- comment] Currently, only the font description files in devhtml use the optional - entity_name string to define glyph entities in HTML. Everything after the - entity_name field is ignored; in case this field isn't used, two hyphen - characters are now necessary to start a comment. + entity_name string to define glyph entities in HTML. Everything after + the entity_name field is ignored; in case this field isn't used, two + hyphen characters are now necessary to start a comment. Two new requests are available in DESC files (currently used only with grohtml): @@ -1990,7 +2702,8 @@ better support of HTML output: Grotty ------ -Bruno Haible contributed support for UTF8 output. +Bruno Haible contributed support for UTF8 +output. Grohtml ------- @@ -1999,8 +2712,8 @@ Added .LINE macro to tmac.arkup. The obsolete `.LINK' macro has been removed. -.URL, .FTP, and .MAILTO macros now accept an optional third argument which -is immediately appended to the second argument (to be used with +.URL, .FTP, and .MAILTO macros now accept an optional third argument +which is immediately appended to the second argument (to be used with punctuation, for example). Grodvi @@ -2014,7 +2727,7 @@ added. Grolbp ------ -A new driver for Canon CAPSL printers (LBP-4 and LBP-8 series laser +A new driver for Canon CaPSL printers (LBP-4 and LBP-8 series laser printers). This code has been contributed by Francisco Andres Verdu . @@ -2042,14 +2755,15 @@ Documentation ------------- Three new man pages are available: groff_tmac.5 (documenting how troff -macros are accessed and where they are found), groff.7 (a short reference of -the GNU roff language), and roff.7 (a general survey on GNU troff). +macros are accessed and where they are found), groff.7 (a short +reference of the GNU roff language), and roff.7 (a general survey on GNU +troff). Miscellaneous ------------- -A partial port to win32 (for use with Microsoft Visual C++ 6.0) is now part -of the distribution. It has been contributed by Blake McBride +A partial port to win32 (for use with Microsoft Visual C++ 6.0) is now +part of the distribution. It has been contributed by Blake McBride . More information about programs, macros, documentation, etc., which is @@ -2066,25 +2780,25 @@ VERSION 1.12 ============ Finally, there are new maintainers for groff. Mailing lists and a -development repository are available also. See the file README for details. -Not all reported bugs could be fixed, so please send mails again if -something is still not working. +development repository are available also. See the file README for +details. Not all reported bugs could be fixed, so please send mails +again if something is still not working. -Most of the installation problems should have vanished now (most -notably the $(tmac_wrap) bug). +Most of the installation problems should have vanished now (most notably +the $(tmac_wrap) bug). -There is now a man page called groff_man.7 which documents the basics of the --man macros. It has been originally written by Susan G. Kleinmann +There is now a man page called groff_man.7 which documents the basics of +the -man macros. It has been originally written by Susan G. Kleinmann . A (still incomplete) groff reference manual in texinfo format originally contributed by Trent A. Fisher . -me.man and msafer.man have been renamed to groff_me.man -resp. groff_msafer.man for consistency. +me.man and msafer.man have been renamed to groff_me.man resp. +groff_msafer.man for consistency. -Default strings for macros in doc-common resp. tmac.an no longer contain the -word `UNIX'. +Default strings for macros in doc-common resp. tmac.an no longer contain +the word `UNIX'. groff should now be Y2k safe (fixes contributed by Paul Eggert ). @@ -2093,16 +2807,16 @@ Following the GNU standards, groff now uses the prefix `/usr/local/' as the default instead of replacing an existent groff binary. groff, troff, nroff, and pic now support the -U flag to activate unsafe -behaviour (without -msafer); the -S flag for using the -msafer macros is now -the default. +behaviour (without -msafer); the -S flag for using the -msafer macros is +now the default. Grohtml ------- -This is a new output device for producing HTML output contributed by Gaius -Mulley . It is still very alpha but has been included -into the distribution so that a lot of people have a chance to test it. Bug -reports are highly welcome. +This is a new output device for producing HTML output contributed by +Gaius Mulley . It is still very alpha but has been +included into the distribution so that a lot of people have a chance to +test it. Bug reports are highly welcome. Grolj4 ------ @@ -2135,29 +2849,29 @@ VERSION 1.11 Complete documentation for pic is now in the file doc/pic.ms. It was contributed by Eric S. Raymond, , who is emphatically -*not* volunteering to take over groff as he is way overworked with -half a dozen other projects. +*not* volunteering to take over groff as he is way overworked with half +a dozen other projects. VERSION 1.10 ============ The directory where data files are installed has been changed from -/usr/local/lib/groff to /usr/local/share/groff to comply with the -latest GNU coding standards. - -By default groff programs with Unix equivalents are installed with a -"g" prefix unless there is an existing (non-groff) troff installation. - -A new approach is used to make system macro packages available to -groff. Instead of simply including /usr/lib/tmac in the list of -directories searched by groff, the installation process creates for -each system macro package a wrapper macro package in the groff macro -directory that references the system macro package. The groff macro -packages are now installed with a leading "g" prefix if there is a -system version of the same macro package, and otherwise without the -"g" prefix, with the exception that the groff version of -me which is -always installed as -me. +/usr/local/lib/groff to /usr/local/share/groff to comply with the latest +GNU coding standards. + +By default groff programs with Unix equivalents are installed with a "g" +prefix unless there is an existing (non-groff) troff installation. + +A new approach is used to make system macro packages available to groff. +Instead of simply including /usr/lib/tmac in the list of directories +searched by groff, the installation process creates for each system +macro package a wrapper macro package in the groff macro directory that +references the system macro package. The groff macro packages are now +installed with a leading "g" prefix if there is a system version of the +same macro package, and otherwise without the "g" prefix, with the +exception that the groff version of -me which is always installed as +-me. There is a new device, lj4, for the HP LaserJet 4 (and PCL5 compatibles). @@ -2166,8 +2880,8 @@ Groff ----- groff has a -S option that prevents the use of unsafe features in pic -and troff. This uses a new -S option of pic and the -msafer macros -for troff. +and troff. This uses a new -S option of pic and the -msafer macros for +troff. Troff ----- @@ -2189,11 +2903,10 @@ The -m option enables manual feed. VERSION 1.09 ============ -\(rn now produces a character that has the traditional metrics, -and form corners with \(ul and \(br. This means that it does not -align properly with \(sr. Instead there's a new character -\[radicalex] which aligns with \(sr; this is used by eqn for doing -square roots. +\(rn now produces a character that has the traditional metrics, and form +corners with \(ul and \(br. This means that it does not align properly +with \(sr. Instead there's a new character \[radicalex] which aligns +with \(sr; this is used by eqn for doing square roots. Troff ----- @@ -2214,8 +2927,8 @@ VERSION 1.08 Troff ----- -The escape sequence \V[xxx] interpolates the value of the -environment variable xxx. +The escape sequence \V[xxx] interpolates the value of the environment +variable xxx. Tbl --- @@ -2232,7 +2945,7 @@ Groff ----- The environment variable GROFF_COMMAND_PREFIX can be used to control -whether groff looks for `gtroff' or `troff' (similarily for the +whether groff looks for `gtroff' or `troff' (similarly for the preprocessors.) Troff @@ -2251,16 +2964,16 @@ apply to text transparently throughput into a diversion with \!. Tbl --- -There is a `nokeep' option which tells tbl not to use diversions to -try to keep the table on one page. +There is a `nokeep' option which tells tbl not to use diversions to try +to keep the table on one page. Eqn --- Setting the parameter `nroff' to a non-zero value causes `ndefine' to -behave like `define' and `tdefine' to be ignored. This is done by -eqnrc when the current device is ascii or latin1. There's a `neqn' -script that just does `eqn -Tascii'. +behave like `define' and `tdefine' to be ignored. This is done by eqnrc +when the current device is ascii or latin1. There's a `neqn' script +that just does `eqn -Tascii'. Grotty ------ @@ -2286,31 +2999,32 @@ New special characters \(+h, \(+f, \(+p, \(Fn, \(Bq, \(bq, \(aq, \(lz, Groff ----- -The Xps pseudo-device has disappeared. Instead there is a new -X -option that tells groff to use gxditview instead of the usual -postprocessor. (So instead of -TXps, use -XTps or just -X if your -default device is ps.) +The Xps pseudo-device has disappeared. Instead there is a new -X option +that tells groff to use gxditview instead of the usual postprocessor. +(So instead of -TXps, use -XTps or just -X if your default device is +ps.) -The postprocessor to be used for a particular device is now specified -by a `postpro' command in the DESC file rather than being compiled -into groff. Similarly the command to be used for printing (with the --l option) is now specified by a `print' command in the DESC file. +The postprocessor to be used for a particular device is now specified by +a `postpro' command in the DESC file rather than being compiled into +groff. Similarly the command to be used for printing (with the -l +option) is now specified by a `print' command in the DESC file. -The groff command no longer specifies eqnchar as an input file for -eqn. Instead eqn automatically loads a file `eqnrc'. The groff -command no longer passes the -D option to eqn. Instead eqnrc sets the -draw_lines parameter. +The groff command no longer specifies eqnchar as an input file for eqn. +Instead eqn automatically loads a file `eqnrc'. The groff command no +longer passes the -D option to eqn. Instead eqnrc sets the draw_lines +parameter. -The groff command no longer tells troff to load a device-specific -macro file. This is handled instead by the `troffrc' file, which is -always loaded by troff. +The groff command no longer tells troff to load a device-specific macro +file. This is handled instead by the `troffrc' file, which is always +loaded by troff. The shell script version of groff has been removed. Troff ----- -The `rchar' request removes a character definition established with `char'. +The `rchar' request removes a character definition established with +`char'. Compatibility mode is disabled and the escape character is set to `\' while a character definition is being processed. @@ -2318,29 +3032,29 @@ while a character definition is being processed. The `\#' escape sequence is like `\"' except that the terminating newline is ignored. -The `shc' request tells troff which character to insert (instead of -the default \(hy) when a word is hyphenated at a line break. +The `shc' request tells troff which character to insert (instead of the +default \(hy) when a word is hyphenated at a line break. -A font name of 0 (zero) in the DESC file causes no font to be -mounted on the corresponding font position. This is useful for -arranging that special fonts are mounted on positions on which users -are not likely explicitly to mount fonts. All groff devices now avoid -initially mounting fonts on positions 5-9. +A font name of 0 (zero) in the DESC file causes no font to be mounted on +the corresponding font position. This is useful for arranging that +special fonts are mounted on positions on which users are not likely +explicitly to mount fonts. All groff devices now avoid initially +mounting fonts on positions 5-9. -The `do' request allows a single request or macro to be interpreted -with compatibility mode disabled. +The `do' request allows a single request or macro to be interpreted with +compatibility mode disabled. troff automatically loads a file `troffrc' before any other input file. -This can be prevented with the -R option. This file is responsible -for loading the device-specific macros. +This can be prevented with the -R option. This file is responsible for +loading the device-specific macros. Pic --- The -x option has been removed and a -n option has been added. By default, pic now assumes that the postprocessor supports groff -extensions. The -n option tells pic to generate output that works -with ditroff drivers. The -z option now applies only to TeX mode. +extensions. The -n option tells pic to generate output that works with +ditroff drivers. The -z option now applies only to TeX mode. The -p option has been removed. Instead if the -n option is not specified, pic generates output that uses \X'ps: ...' if the \n(0p @@ -2353,11 +3067,11 @@ Eqn --- Eqn now automatically reads a file `eqnrc' from the macro directory. -This performs the same role that the eqnchar files used to. This can -be prevented by the -R option. +This performs the same role that the eqnchar files used to. This can be +prevented by the -R option. -Setting the draw_lines parameter to a non-zero value causes lines to -be drawn using \D rather than \l. The -D option is now obsolete. +Setting the draw_lines parameter to a non-zero value causes lines to be +drawn using \D rather than \l. The -D option is now obsolete. `uparrow', `downarrow' and `updownarrow' can be used with `left' and `right'. @@ -2369,15 +3083,15 @@ parameters. Grops ----- -Font description files have been regenerated from newer AFM files. -You can get access to the additional characters present in the text -fonts in newer PostScript printers by using -mpsnew. +Font description files have been regenerated from newer AFM files. You +can get access to the additional characters present in the text fonts in +newer PostScript printers by using -mpsnew. -The default value of the -b option is specified by a `broken' command -in the DESC file. +The default value of the -b option is specified by a `broken' command in +the DESC file. -With the -g option, grops generates PostScript code that guesses -the page height. This allows documents to be printed on both letter +With the -g option, grops generates PostScript code that guesses the +page height. This allows documents to be printed on both letter (8.5x11) and A4 paper without change. Grodvi @@ -2389,8 +3103,8 @@ with groff -Tdvi for more information. Grotty ------ -The -mtty-char macros contain additional character definitions for -use with grotty. +The -mtty-char macros contain additional character definitions for use +with grotty. Macros ------ @@ -2398,20 +3112,19 @@ Macros In previous releases the groff -me macros treated the $r and $R number registers in a way that was incompatible with the BSD -me macros. The reason for this was that the approach used by the BSD -me macros does -not work with low resolution devices such as -TX75 and -TX100. -However, this caused problems with existing -me documents. In this -release, the vertical spacing is controlled by the $v and $V registers -which have the same meaning as $r and $R in earlier groff releases. -In addition, if the $r or $R register is set to a value that would be -correct for for the BSD -me macros and a low resolution device is not -being used, then an appropriate value for the $v or $V register -is derived from the $r or $R register. +not work with low resolution devices such as -TX75 and -TX100. However, +this caused problems with existing -me documents. In this release, the +vertical spacing is controlled by the $v and $V registers which have the +same meaning as $r and $R in earlier groff releases. In addition, if +the $r or $R register is set to a value that would be correct for the +BSD -me macros and a low resolution device is not being used, then an +appropriate value for the $v or $V register is derived from the $r or $R +register. The groff -me macros work with -C and (I think) with Unix troff. For backward compatibility with BSD -me, the \*{ and \*} strings are -also available as \*[ and \*]. Of course, \*[ is only usable -with -C. +also available as \*[ and \*]. Of course, \*[ is only usable with -C. The \*T string has been deleted. Use \*(Tm instead. @@ -2446,21 +3159,21 @@ contexts. Grotty ------ -Horizontal and vertical lines drawn with \D'l ...' are rendered -using -, | and + characters. This is intended to give reasonable -results with boxed tables. It won't work well with pic. +Horizontal and vertical lines drawn with \D'l ...' are rendered using -, +| and + characters. This is intended to give reasonable results with +boxed tables. It won't work well with pic. Macros ------ The -mdoc macros have been upgraded to the version in the second -Berkeley networking release. This version is not completely -compatible with earlier versions; the old version is still available -as -mdoc.old. The grog script has been enhanced so that it can -usually determine whether a document requires the old or new versions. +Berkeley networking release. This version is not completely compatible +with earlier versions; the old version is still available as -mdoc.old. +The grog script has been enhanced so that it can usually determine +whether a document requires the old or new versions. -With -TX75, -TX100 and -TXps, the PSPIC macro produces a box -around where the picture would appear with -Tps. +With -TX75, -TX100 and -TXps, the PSPIC macro produces a box around +where the picture would appear with -Tps. VERSION 1.04 @@ -2468,8 +3181,8 @@ VERSION 1.04 An implementation of the -mm macros is included. -The directory in which temporary files are created can be controlled -by setting the GROFF_TMPDIR or TMPDIR environment variables. +The directory in which temporary files are created can be controlled by +setting the GROFF_TMPDIR or TMPDIR environment variables. Pic --- @@ -2479,10 +3192,9 @@ Some MS-DOS support (see pic/make-dos-dist). Grops ----- -There are two new \X commands (\X'ps: invis' and \X'ps: endinvis') -which make it possible to have substitute characters that are -displayed when previewing with -TXps but ignored when printing with -grops. +There are two new \X commands (\X'ps: invis' and \X'ps: endinvis') which +make it possible to have substitute characters that are displayed when +previewing with -TXps but ignored when printing with grops. Xditview -------- @@ -2500,24 +3212,24 @@ VERSION 1.02 ============ There is an implementation of refer and associated programs. groff -R -preprocesses with grefer; no mechanism is provided for passing -arguments to grefer because most grefer options have equivalent -commands which can be included in the file. grog also supports refer. +preprocesses with grefer; no mechanism is provided for passing arguments +to grefer because most grefer options have equivalent commands which can +be included in the file. grog also supports refer. There is an alternative perl implementation of the grog script. -The code field in lines in the charset section of font description -files is now allowed to contain an arbitrary integer (previously it -was required to lie between 0 and 255). Currently grops and grodvi -use only the low order 8 bits of the value. Grodvi uses the -complete value; however, this is unlikely to be useful with -traditional TeX tools (.tfm files only allow 8 bit character codes.) +The code field in lines in the charset section of font description files +is now allowed to contain an arbitrary integer (previously it was +required to lie between 0 and 255). Currently grops and grodvi use only +the low order 8 bits of the value. Grodvi uses the complete value; +however, this is unlikely to be useful with traditional TeX tools (.tfm +files only allow 8 bit character codes.) Left and right double quotes can be obtained with \(lq and \(rq respectively. -There is a new program called pfbtops which translates PostScript -fonts in pfb format to ASCII. +There is a new program called pfbtops which translates PostScript fonts +in pfb format to ASCII. A slightly modified version of the Berkeley tmac.doc is included. @@ -2525,13 +3237,13 @@ Troff ----- In long escape names the closing ] is now required to be at the same -input level as the opening [. +interpolation depth as the opening [. The \A'S' escape sequence returns 1 or 0 according as S is or is not suitable for use as a name. -\~ produces an unbreakable space that can be stretched when the line -is adjusted. +\~ produces an unbreakable space that can be stretched when the line is +adjusted. The `mso' request is like the `so' request except that it searches for the file in the same directories in which tmac.X is searched for when @@ -2554,9 +3266,9 @@ Grops ----- The compile-time -DBROKEN_SPOOLER option has been replaced by a -BROKEN_SPOOLER_FLAGS option. This allows more precise control over -how grops should workaround broken spoolers and previewers. There is -a new -b option that can change this at run-time. +BROKEN_SPOOLER_FLAGS option. This allows more precise control over how +grops should workaround broken spoolers and previewers. There is a new +-b option that can change this at run-time. Grops now generates PostScript that complies with version 3.0 of the Document Structuring Convention. @@ -2575,8 +3287,7 @@ Xditview -------- Parts of xditview have been rewritten so that it can be used with the -output of gtroff -Tps. groff -TXps runs gtroff -Tps with -gxditview. +output of gtroff -Tps. groff -TXps runs gtroff -Tps with gxditview. There is a new menu entry `Print' which brings up a dialog box for specifying a command with which the file being previewed should be @@ -2590,20 +3301,20 @@ VERSION 1.01 The groff command now understands the gtroff `-a' and `-i' options. -With the `m' and `n' scale indicators, the scale factor is rounded +With the `m' and `n' scaling indicators, the scale factor is rounded horizontally before being applied. This makes (almost) no difference for devices with `hor' equal to 1, but it makes groff with -Tascii or -Tlatin1 behave more like nroff in its treatment of these scale -indicators. Accordingly tmac.tty now calls the `nroff' request so -that the `n' condition is true. +indicators. Accordingly tmac.tty now calls the `nroff' request so that +the `n' condition is true. -The device-specific macros (tmac.ps, tmac.dvi, tmac.tty and tmac.X) -have been made to work at least somewhat with -C. In particular the -special characters defined by these macros now work with -C. +The device-specific macros (tmac.ps, tmac.dvi, tmac.tty and tmac.X) have +been made to work at least somewhat with -C. In particular the special +characters defined by these macros now work with -C. -groff -Tdvi -p now passes pic the -x flag; this enables filling -of arrowheads and boxes, provided that your dvi driver supports the -latest version of the tpic specials. +groff -Tdvi -p now passes pic the -x flag; this enables filling of +arrowheads and boxes, provided that your dvi driver supports the latest +version of the tpic specials. Eqn --- @@ -2615,8 +3326,8 @@ delimiters. The groff command passes on a `-N' option to eqn. Grops ----- -You can now use psfig with grops. See the file ps/psfig.diff. I do -not recommend using psfig for new documents. +You can now use psfig with grops. See the file ps/psfig.diff. I do not +recommend using psfig for new documents. The command \X'ps: file F' is similar to \X'ps: exec ...' except that the PostScript code is read from the file F instead of being contained @@ -2630,13 +3341,13 @@ There are font files HB and HI corresponding to cmsssbx10 and cmssi10. Macros ------ -The groff -me macros now work with the -C option. As a result, they -may also work with Unix nroff/troff. +The groff -me macros now work with the -C option. As a result, they may +also work with Unix nroff/troff. -In -me, the $r and $R number registers now contain the line spacing as -a percentage of the pointsize expressed in units (normally about 120). -The previous definition was useless with low resolution devices such -as X75 and X100. +In -me, the $r and $R number registers now contain the line spacing as a +percentage of the pointsize expressed in units (normally about 120). +The previous definition was useless with low resolution devices such as +X75 and X100. VERSION 1.00 @@ -2644,8 +3355,8 @@ VERSION 1.00 A -ms-like macro-package is now included. -The name for the Icelandic lowercase eth character has been changed -from \(-d to \(Sd. +The name for the Icelandic lowercase eth character has been changed from +\(-d to \(Sd. Troff ----- @@ -2653,8 +3364,8 @@ Troff There is a new request `nroff', which makes the `n' built-in condition true and the `t' built-in condition false; also a new request `troff' which undoes the effect of the `nroff' request. This is intended only -for backward compatibility: it is usually better to test \n(.H or -\n(.V or to use the `c' built-in condition. +for backward compatibility: it is usually better to test \n(.H or \n(.V +or to use the `c' built-in condition. The \R escape sequence has been deleted. Use \E instead. @@ -2662,29 +3373,28 @@ There are `break' and `continue' requests for use with the `while' request. There is a request `hym' that can ensure that when the current -adjustment mode is not `b' a line is not hyphenated if it is no -more than a given amount short, and a request `hys' that can ensure -that when the current adjustment mode is `b' a line is not -hyphenated if it can be justified by adding no more than a given -amount of extra space to each word space. +adjustment mode is not `b' a line is not hyphenated if it is no more +than a given amount short, and a request `hys' that can ensure that when +the current adjustment mode is `b' a line is not hyphenated if it can be +justified by adding no more than a given amount of extra space to each +word space. There is a request `rj' similar to `ce' that right justifies lines. -A warning of type `space' is given when a call is made to an -undefined request or macro with a name longer than two characters, and -the first two characters of the name make a name that is defined. -This is intended to find places where a space has been omitted been a -request or macro and its argument. This type of warning is enabled by -default. +A warning of type `space' is given when a call is made to an undefined +request or macro with a name longer than two characters, and the first +two characters of the name make a name that is defined. This is +intended to find places where a space has been omitted been a request or +macro and its argument. This type of warning is enabled by default. Pic --- A comma is permitted between the arguments to the `reset' command. -For use with TeX, there is a new `-c' option that makes gpic treat -lines beginning with `.' in a way that is more compatible with tpic -(but ugly). +For use with TeX, there is a new `-c' option that makes gpic treat lines +beginning with `.' in a way that is more compatible with tpic (but +ugly). Eqn --- @@ -2700,8 +3410,8 @@ Xditview -------- There are two new devices X75-12 and X100-12 which are the same as X75 -and X100 except that they are optimized for documents that use mostly -12 point text. +and X100 except that they are optimized for documents that use mostly 12 +point text. VERSION 0.6 @@ -2725,35 +3435,33 @@ files that a character name of `---' refers to an unnamed character. The drivers now all support the `N' command required for this. The font description files have been updated to include unnamed characters. -The `x' command in font description files has been removed: instead -any unknown commands are automatically made available to the drivers. -If you constructed your own font files with an earlier version of -tfmtodit or afmtodit, you must construct them again using the current -version. +The `x' command in font description files has been removed: instead any +unknown commands are automatically made available to the drivers. If +you constructed your own font files with an earlier version of tfmtodit +or afmtodit, you must construct them again using the current version. Characters between 0200 and 0237 octal are no longer valid input characters. Note that these are not used in ISO 8859. -A command called `grog' has been added, similar to the `doctype' -command described in Kernighan and Pike. +A command called `grog' has been added, similar to the `doctype' command +described in Kernighan and Pike. Groff ----- -The groff command has some new options: -V prints the pipeline -instead of executing it; -P passes an argument to the postprocessor, --L passes an argument to the spooler. +The groff command has some new options: -V prints the pipeline instead +of executing it; -P passes an argument to the postprocessor, -L passes +an argument to the spooler. There is a C++ implementation of the groff command. This handles some things slightly better than the shell script. In particular, it can correctly handle arguments containing characters that have a special -meaning to the shell; it can give an error message when child -processes other than the last in the pipeline terminate abnormally; -its exit status can take account of the exit statuses of all its child -processes; it is a little more efficient; when geqn is used, it -searches for the eqnchar file in the same way that font metric files -are searched for, rather than expecting to find it in one particular -directory. +meaning to the shell; it can give an error message when child processes +other than the last in the pipeline terminate abnormally; its exit +status can take account of the exit statuses of all its child processes; +it is a little more efficient; when geqn is used, it searches for the +eqnchar file in the same way that font metric files are searched for, +rather than expecting to find it in one particular directory. Gtroff ------ @@ -2761,20 +3469,19 @@ Gtroff There is font translation feature: For example, you can tell gtroff to use font `HR' whenever font `H' is requested with the line .ftr H HR -This would be useful for a document that uses `H' to refer to -Helvetica. +This would be useful for a document that uses `H' to refer to Helvetica. There are some new number registers: `.kern' contains the current kern mode, `.lg' the current ligature mode, `.x' the major version number, -`.y' the minor version number, `.ce' the number of lines to be -centered in the current environment, `.trunc' the amount of vertical -space truncated by the most recently sprung vertical position trap, -`.ne' the amount of vertical space needed in the last `ne' request -that caused a vertical position trap to be sprung. +`.y' the minor version number, `.ce' the number of lines to be centered +in the current environment, `.trunc' the amount of vertical space +truncated by the most recently sprung vertical position trap, `.ne' the +amount of vertical space needed in the last `ne' request that caused a +vertical position trap to be sprung. The `cf' request now behaves sensibly in a diversion. If used in a -diversion, it now arranges for the file to be copied to the output -when the diversion is reread. +diversion, it now arranges for the file to be copied to the output when +the diversion is reread. There is a new request `trf' (transparent file) similar to `cf', but more like `\!'. @@ -2790,10 +3497,11 @@ that it has a first argument giving the number of definitions. There is a new warning category `escape' which warns about unknown escape sequences. -The `fp' request now takes an optional third argument giving the external -name of the font. +The `fp' request now takes an optional third argument giving the +external name of the font. -The `\_' character is now automatically translated to `\(ul' as in troff. +The `\_' character is now automatically translated to `\(ul' as in +troff. The environment variable `GROFF_HYPHEN' gives the name of the file containing the hyphenation patterns. @@ -2803,17 +3511,17 @@ There is a `\C'xxx'' escape sequence equivalent to `\[xxx]'. Characters ", ', ), ], *, \(dg are now initially transparent for the purposes of end of sentence recognition. -There is an anti-recursion feature in the `char' request, so you can -say `.char \(bu \s+2\(bu\s-2'. +There is an anti-recursion feature in the `char' request, so you can say +`.char \(bu \s+2\(bu\s-2'. -The limit on the number of font positions has been removed. -Accordingly `\n[.fp]' never returns 0. +The limit on the number of font positions has been removed. Accordingly +`\n[.fp]' never returns 0. The restriction on the number of numbered environments has been removed. -There is a new escape sequence `\E' that makes it possible to -guarantee that an escape sequence won't get interpreted in copy-mode. -The `\R' escape sequence is accordingly now deprecated. +There is a new escape sequence `\E' that makes it possible to guarantee +that an escape sequence won't get interpreted in copy-mode. The `\R' +escape sequence is accordingly now deprecated. Gpic ---- @@ -2821,28 +3529,26 @@ Gpic Arguments of the form `X anything X' (in the `copy thru', `sh', `for', `if' and `define' constructs) can now be of the form `{ anything }'. -If the `linethick' variable is negative (as it now is initially), -lines are drawn with a thickness proportional to the current point -size. +If the `linethick' variable is negative (as it now is initially), lines +are drawn with a thickness proportional to the current point size. The `rand' function now takes no arguments and returns a number between 0 and 1. The old syntax is still supported. `^' can be used in expressions to indicate exponentiation. -In the `for' construct the argument to the by clause can be prefixed -by `*' to indicate that the increment is multiplicative. +In the `for' construct the argument to the by clause can be prefixed by +`*' to indicate that the increment is multiplicative. -A bare expression may be used as an attribute. If the current -direction is `dir', then an attribute `expr' is equivalent to -`dir expr' +A bare expression may be used as an attribute. If the current direction +is `dir', then an attribute `expr' is equivalent to `dir expr' -There is a `sprintf' construct that allows numbers to be formatted and used -wherever a quoted string can be used. +There is a `sprintf' construct that allows numbers to be formatted and +used wherever a quoted string can be used. -The height of a text object without an explicit height attribute is -the number of text strings associated with the object times the value -of the `textht' variable. +The height of a text object without an explicit height attribute is the +number of text strings associated with the object times the value of the +`textht' variable. The maximum height and width of a picture is controlled by the `maxpswid' and `maxpsht' variables. @@ -2850,38 +3556,39 @@ The maximum height and width of a picture is controlled by the Gtbl ---- -Gtbl can now handle gracefully the situation where the `ce' request -has been applied to a table. +Gtbl can now handle gracefully the situation where the `ce' request has +been applied to a table. Geqn ---- The `ifdef' primitive has been generalized. -A tilde accent can be put underneath a box using `utilde'. This -defined using a general `uaccent' primitive. +A tilde accent can be put underneath a box using `utilde'. This defined +using a general `uaccent' primitive. Grops ----- There is a new PostScript font downloading scheme which handles font downloading for imported illustrations. Previously, the name of the -file containing the font was given in the `x download' line in the -groff font metric file. Now, there is a `download' file which says -for each PostScript font name which file contains that font. Grops -can also now handle inter-font dependencies, where one downloadable -font depends on some other (possibly downloadable) font. +file containing the font was given in the `x download' line in the groff +font metric file. Now, there is a `download' file which says for each +PostScript font name which file contains that font. Grops can also now +handle inter-font dependencies, where one downloadable font depends on +some other (possibly downloadable) font. The `T' font has been removed. The characters it used to provide are -now provided by `char' definitions in tmac.ps. TSymbol.ps has also -been removed, and the tweaks it provided are now provided by `char' +now provided by `char' definitions in tmac.ps. TSymbol.ps has also been +removed, and the tweaks it provided are now provided by `char' definitions. -##### Emacs + +##### Editor settings Local Variables: -version-control: never coding: latin-1 -fill-column: 76 +fill-column: 72 mode: text +version-control: never End: -# vim: set autoindent textwidth=76: +# vim: set autoindent textwidth=72: diff --git a/PROBLEMS b/PROBLEMS index 8710a12..c40d499 100644 --- a/PROBLEMS +++ b/PROBLEMS @@ -1,4 +1,4 @@ - Copyright 1989-2018 Free Software Foundation, Inc. + Copyright 1989-2023 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -10,126 +10,171 @@ other improvements to this file are welcome. ---------------------------------------------------------------------- +Problems are organized into categories underscored with equals signs. +* General Problems +* Printing and Display Problems +* Platform-Dependent Macro Problems +* Compilation Problems -Generic Problems +Within each category, items are organized in reverse chronological order +(that is, with the most recent first). groff version numbers +corresponding to their inclusion in this file are included as +guideposts. Entries have been revised for clarity in the years since. + +In the following discussions, several references to "/usr/local" are +made. You should read this directory name as the destination directory +you set up with the "--prefix" option to groff's "configure" script. + + +General Problems ================ +[groff 1.23.0] + +* gdiffmk doesn't work / its automated test fails. -* Displaying a man page on a terminal with/without my favourite pager - only gives garbage. +Some portability issues are known to affect groff's gdiffmk utility. -groff by default now uses SGR escape sequences (`ANSI color') to -control the display attributes (bold, underlined, colour) on TTYs. -Some terminals (e.g. `kterm') don't understand SGR, and some pagers -(e.g. older versions of `less' or `less' without the -R option) don't -understand SGR either. There are three solutions to fix this, in -order of preference; please read the grotty man page for more details. +- A defect in GNU diffutils 3.9 (January 2023) causes gdiffmk to + malfunction and its automated test to fail. See + . -The fourth and probably best option is to update your terminal program -and pager to versions which can handle SGR. +- gdiffmk does not work with BusyBox diff (which does not implement GNU + diff's "-D" option). - 1. Set the GROFF_NO_SGR environment variable. +- gdiffmk does not work on FreeBSD due to specifics of that platform's + expr(1) implementation. - 2. Pass option `-c' to grotty (this is, add `-P-c' to groff's - command line options). + gdiffmk uses the expr(1) command to parse its arguments. FreeBSD has + extended the syntax of its expr command in a non-backward compatible + way that it claims better conforms with POSIX's utility syntax + guidelines with respect to option processing: however, POSIX mandates + no options for expr. Other implementations of expr do not support + traditional Unix-style options ('-a', '-b', ...), and perhaps as a + consequence do not follow FreeBSD's interpretation of the guidelines. + You way want to set $EXPR_COMPAT in your shell environment. We hope + to have a workaround for this behavior in a future release. - 3. Append the following fragment to the `troffrc' file: +---------------------------------------------------------------------- +* The `PDFPIC` macro doesn't work / its automated test fails. ---- start --- -.if n \{\ -. nr _C \n(.C -. cp 0 -. -. \" The following code sets a top-of-page trap to disable grotty's TTY -. \" mode. Since neither \X nor .output can be used before the first -. \" page has started, we must use a trap. To make it work with troff's -. \" -o option, we wait until the first printed page. -. -. de sgr@dummy -. . -. -. rn wh wh@old -. -. \" The stand-alone version. If no other trap is set, we can safely -. \" insert the truncated vertical space caused by the trap (if any). -. \" Otherwise we assume that the document's main macro package takes -. \" care of that. As soon as the trap has been executed, it is removed. -. de1 no@sgr -. if \\n[.P] \{\ -. if (\\n[.t] == \\n[.p]) \{\ -. rn wh@old wh -. rm no@sgr -. wh 0 -. sp \\n[.trunc] -. nop \X'tty: sgr 0' -. sp -1 -. \}\} -. . -. -. wh@old 0 no@sgr -. -. \" The piggyback version to be appended to macros planted with the -. \" modified `wh' request. -. de1 no@sgr1 -. if \\n[.P] \{\ -. rn wh@old wh -. ds no@sgr1 -. nop \X'tty: sgr 0' -. sp -1 -. \} -. . -. -. \" We redefine the `wh' request so that `no@sgr1' is appended to -. \" the trap macro. -. de1 wh -. am1 \\$2 sgr@dummy -. no@sgr1 -. sgr@dummy -. wh@old \\$1 \\$2 -. . -. -. cp \n[_C] -.\} ---- end --- + FAIL: tmac/tests/pdfpic_does-not-choke-on-bad-pdfinfo-output.sh + +Due to a limitation (shared by AT&T troff) in the way the `sy` request +constructs a C string argument to the C library's system(3) function, +groff requires a GNU sed(1) extension that interprets "\n" as a newline +in the replacement text of the 's' command. (We might enhance GNU +troff's `sy` request to avoid this dependency in the future.) We have +observed this problem on Solaris 10 and 11 and Mac OS X 10.11.6, but not +macOS 12: the last's sed supports the extension in question. + +Install GNU sed in the default $PATH as "gsed" and edit +tmac/pdfpic.tmac. On line 172, change "sed" to "gsed". Alternatively, +you can use the absolute path to GNU sed's location. (`system()` +sanitizes $PATH to avoid privilege escalation.) Then (re-)make the +"check" target or format your PDFPIC-employing document again. ---------------------------------------------------------------------- -* The UTF-8 output of grotty has strange characters for the minus, the - hyphen, and the right quote. Why? +[groff 1.19.2] + +* When viewing man pages, some characters on my UTF-8 terminal emulator + look funny or copy-and-paste wrong. Why? + +Some Unicode Basic Latin ("ASCII") input characters are mapped to +non-Basic Latin code points in output for consistency with other output +devices, like PDF. See groff_man_style(7) and groff_char(7) for correct +input conventions and background. If you use the correct groff special +character escape sequences to input them, you will get correct output no +matter what device the input is formatted for. -The used Unicode characters (U+2212 for the minus sign and U+2010 for -the hyphen) are the correct ones, but many programs can't search them -properly. The same is true for the right quote (U+201D). To map -those characters back to the ASCII characters, insert the following -code snippet into the `troffrc' configuration file: +However, many man pages are written in ignorance of the correct special +characters to obtain the desired glyphs. You can conceal these errors +by adding the following to your site-local man(7) configuration. The +file is called "man.local"; its installation directory depends on how +groff was configured when it was built. +--- start --- .if '\*[.T]'utf8' \{\ -. char \- \N'45' -. char - \N'45' -. char ' \N'39' +. char ' \[aq] +. char - \- +. char ^ \[ha] +. char ` \[ga] +. char ~ \[ti] .\} +--- end --- ----------------------------------------------------------------------- +You may also wish to do the same for "mdoc.local". + +In man pages (only), groff maps the minus sign special character '\-' to +the Basic Latin hyphen-minus (U+002D) because man pages require this +glyph and there is no historically established *roff input character, +ordinary or special, for obtaining it when a hyphen and minus sign are +both separately available. To obtain a true minus sign, use the special +character escape sequences '\(mi' or '\[mi]'. -* Processing mdoc man pages like `groff_mdoc.n' fails if I use - `test-groff'. Why? +---------------------------------------------------------------------- -The mdoc package works only after installation, not with test-groff. -Reason is that the macro files of mdoc get stripped off the `doc-' -prefix before they are copied to the final destination. +* Displaying a man page on a terminal with/without my favorite pager + shows garbage. + +groff's terminal output driver, grotty, by default uses ISO 6429/ECMA-48 +escape sequences understood by video terminals and their emulators, +rather than the overstriking sequences implemented for typewriter-like +terminals used in the 1960s and 1970s. These escape sequences control +display attributes like bold and italic or oblique typefaces, +underlining, foreground and background color selection, and hyperlink +marking. Terminal emulators that claim compatibility with the DEC +VT100, Linux console driver, or xterm should ignore well-formed escape +sequences that they are not able to support, but some implementations +are buggy. + +Furthermore, the popular "less" pager by default assumes that its input +will use overstriking sequences. (This is a surprising choice, as users +of paper terminals had no need for pager programs; to "scroll back", the +operator would simply physically pull up the spool of ejected paper to +read it.) less(1) must instead be given the '-R' option to interpret +escape sequences used by video terminals. Be aware that the +overstriking convention is inescapably ambiguous in some output +sequences. See the grotty(1) man page. + +Hyperlink support in terminal emulators is a relatively new initiative +(as of 2022) employing a sequence known as "OSC 8". + https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda + +Due to the feature's young age, the man and mdoc macro packages have a +configuration switch for hyperlink support, and it may be disabled in +your site's man.local and mdoc.local files. Use a command like + printf '\033]8;;man:grotty(1)\033\\grotty(1)\033]8;;\033\\\n' | more +to check your terminal and pager for OSC 8 support. If you see +"grotty(1)" and no additional garbage characters, then you may wish to +edit those site files to remove any lines that disable this feature. + +There are a couple of workarounds if you prefer or require overstriking +sequences rather than ISO 6429/ECMA-48 escape sequences. + + 1. Set the GROFF_NO_SGR environment variable to any value. + + 2. Pass option '-c' to grotty (that is, add '-P-c' to groff's + command-line options). + +The third and probably best option is to use terminal and pager programs +that handle standardized video terminal escape sequences well. ---------------------------------------------------------------------- +[groff 1.16] + * My document says that the current year is 19100, not 2000. In groff, as in traditional troff, the yr number register yields the -year minus 1900. Unfortunately, there is a longstanding bug in the -Troff User's Manual , -which incorrectly claims that yr is the last two digits of the year. -This claim was never true of either Unix troff or of groff. +year minus 1900. Unfortunately, the Bell Labs document "Troff User's +Manual" (Computing Science Technical Report #54) incorrectly claims that +yr is the last two digits of the year. This claim has never been true +AT&T troff nor of groff. If your text looks like this: @@ -147,94 +192,7 @@ or, if you want to be portable to older troff versions, as follows: ---------------------------------------------------------------------- -* groff can't handle my troff document. It works fine with AT&T - troff. - -Read the section on incompatibilities in groff_diff(7). Try using the --C option. Alternatively there's the sed script `tmac/fixmacros.sed' -which attempts to edit a file of macros so that it can be used with -groff without the -C flag. - ----------------------------------------------------------------------- - -* gtroff doesn't understand lines like `.ce99' with no space between - the name of the request or macro and the arguments. - -gtroff requires a space between macro or request and its arguments -because it allows the use of long names for macros and requests. You -can use the -C option or the `cp' request to put gtroff into a -compatibility mode in which it is not possible to use long names for -macros but in which no space is required between macros and their -arguments. The use of compatibility mode is strongly discouraged. - ----------------------------------------------------------------------- - -* groff -Tdvi produces dvi files that use fonts at weird - magnifications. - -Yes, it does. You may need to compile fonts with Metafont at these -magnifications. The CompileFonts script in the devdvi/generate -directory may help you to do this. (It takes a *long* time on slow -computers.) - ----------------------------------------------------------------------- - -* Groff doesn't use the font names I'm used to. - -Use the `ftr' request. See groff_diff(7). - ----------------------------------------------------------------------- - -* gpic output is not centered horizontally; pictures sometimes run off - the bottom of the page. - -The macro package you are using is not supplying appropriate -definitions of PS and PE. Give groff a -mpic option. - ----------------------------------------------------------------------- - -* gpic doesn't accept the syntax `chop N M' for chopping both ends of - a line. - -The correct syntax is `chop N chop M'. - ----------------------------------------------------------------------- - -* With gpic -t, when I print `line ->; box' using a dvi to ps program, - the arrow head sticks through into the inside of the box. - -The dvi to ps program should be modified to set the line cap and line -join parameters to 1 while printing tpic specials. - ----------------------------------------------------------------------- - -* gtroff gives warnings about lines like - .ev \" a comment - (with a tab after the .ev). - -A tab character cannot be used as a substitute for a space character -(except in one case: between a control character at the beginning of a -line and the name of a macro or request). For example, in Unix troff - - .ps \" restore the previous point size - -(with a tab after the .ps) does NOT restore the previous point-size; -instead it is silently ignored. Since this is very likely to be an -error, gtroff can give a warning about it. If you want to align -comments, you can do it like this: - - .ev\" \" a comment - ----------------------------------------------------------------------- - -* I don't like the page headers and footers produced by groff -man. - -There seem to be many different styles of page header and footer -produced by different versions of the -man macros. You need to put -modified macros from tmac/an-old.tmac into man.local. More -information is available in groff_man(7). - ----------------------------------------------------------------------- +[groff 1.09] * Where can I get grap? @@ -250,36 +208,26 @@ You need version 1.42 or newer. them to the height and depth of its argument, but the registers always seem to be 0. -\n(st and \n(sb aren't supposed to give the height and depth of the -string rather they give the minimum and maximum vertical displacement -of the baseline. For example for \v'2u'\v'-3u', \n(st is 1 and \n(sb -is -2. The height and depth of the string is available in the \n[rst] -and \n[rsb] registers: these are groff extensions. - ----------------------------------------------------------------------- - -* While formatting a manual page, groff complains about not being able - to break lines. The problem seems to be caused by a line like: - .TP \w'label'+2 - -The -man documentation says that the default scale indicator for TP -macro is `n'. The groff -man macros implement this correctly, so that -the argument is evaluated as if it were - - \w'label'n+2n - -The Unix -man macros don't implement this correctly (probably because -it's hard to do in Unix troff); they just append `n' to the entire -argument, so that it is evaluated as if it were +\n(st and \n(sb don't give the height and depth of the argument to \w, +but the maximum vertical displacements of the text baseline above +(\n(st) and below (\n(sb) its original position. Consider an example +where no text is formatted, but small vertical motions are used. - \w'label'u+2n + \w"\v'-1u'\v'3u'" + .tm st=\n(st, sb=\n(sb + st=1, sb=-2 -The solution is to fix the manual page: +Observe that the sign convention of these registers is opposite that of +relative vertical motion. (This is how Documenter's Workbench troff +and Heirloom Doctools troff work as well.) - .TP \w'label'u+2 +The height and depth of formatted text in the \w argument are available +in the \n[rst] and \n[rsb] registers; these are groff extensions. ---------------------------------------------------------------------- +[groff 1.08] + * I'm having problems formatting man pages produced by the perl wrapman script. @@ -361,6 +309,8 @@ following patch: ---------------------------------------------------------------------- +[groff 1.07] + * groff uses up an enormous amount of memory processing large files. I'm using 386BSD 0.1. @@ -396,129 +346,166 @@ and recompile groff: else exprstmt = 0; +---------------------------------------------------------------------- +[groff 1.06] -Printing and Display Problems -============================= - +* groff can't handle my troff document. It works fine with AT&T + troff. +Read the section on incompatibilities in groff_diff(7). Try using the +-C option. Alternatively there's the sed script `tmac/fixmacros.sed' +which attempts to edit a file of macros so that it can be used with +groff without the -C flag. -* I'm having problems including PostScript illustrations (EPS) using - the PSPIC macro and/or \X'ps: import ...'. +---------------------------------------------------------------------- -A PostScript document must meet three requirements in order to be -included with the PSPIC macro: it must comply with the Adobe Document -Structuring Conventions; it must contain a BoundingBox line; it must -be `well-behaved'. The BoundingBox line should be of the form: +* groff -Tdvi produces dvi files that use fonts at weird + magnifications. - %%BoundingBox: llx lly urx ury +Yes, it does. You may need to compile fonts with Metafont at these +magnifications. The CompileFonts script in the devdvi/generate +directory may help you to do this. (It takes a *long* time on slow +computers.) -where llx, lly, urx, ury are the coordinates of the lower left x, -lower left y, upper right x, upper right y of the bounding box of -marks on the page expressed as integers in the default PostScript -coordinate system (72 units per inch, origin at bottom left corner). +---------------------------------------------------------------------- -The most convenient program to get the bounding box of a document is -the `ps2epsi' script coming with GhostScript. +[groff 1.01] -If you can't use this program, another useful tactic is to print out -the illustration by itself (you may need to add a `showpage' at the -end), and physically measure the bounding box. For more detail on -these requirements, read the specification of Encapsulated PostScript -format. (This is available from the Adobe file server; send a message -with a body of `help' to ps-file-server@adobe.com.) +* gpic output is not centered horizontally; pictures sometimes run off + the bottom of the page. -If an EPS file to be included via \X'ps: import' does not start with -`%!PS-Adobe-...', gtroff still includes the file, but grops does not -add any fonts to the generated output file that are listed in the EPS -file, even though the files are listed in the `download' file and are -available in the devps directory. +The macro package you are using is not supplying appropriate +definitions of PS and PE. Give groff a -mpic option. ---------------------------------------------------------------------- -* I've configured groff for A4 paper, but gtroff still seems to think - that the length of a page (as returned by `\n(.p') is 11 inches. +* Groff doesn't use the font names I'm used to. -This is intentional. The PAGE option during configuration is used -only by grops. For compatibility with ditroff, the default page -length in gtroff is always 11 inches. The page length can be changed -with the `pl' request. +Use the `ftr' request. See groff_diff(7). -A convenient way to set paper dimensions is to use the -dpaper option -of groff, together with proper -P options for the postprocessor -(overriding the default). For example, use the following for PS -output on A4 paper in landscape orientation: +---------------------------------------------------------------------- - groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps +* I get errors using the Unix -ms macros with groff -e -C. + +Apply this change. Be careful of copying and pasting it; literal BEL +characters (Control+G) appear in the source--this is an AT&T troff idiom +in output comparisons that is never necessary in GNU troff. -See groff_tmac(5) for more information. +*** /usr/lib/ms/ms.eqn Tue Apr 25 02:14:28 1989 +--- ms.eqn Sun Nov 11 10:33:59 1990 +*************** +*** 22,29 **** + .. + . \" EN - end of a displayed equation + .de EN +! .if !\\*(10 .br + .di + .rm EZ + .nr ZN \\n(dn + .if \\n(ZN>0 .if \\n(YE=0 .LP +--- 22,30 ---- + .. + . \" EN - end of a displayed equation + .de EN +! .if \\n(.k>0 .br + .di ++ .ds 10 \\*(EZ\\ + .rm EZ + .nr ZN \\n(dn + .if \\n(ZN>0 .if \\n(YE=0 .LP ---------------------------------------------------------------------- -* When I print the output of groff -Tps, the output is always shifted - up by about 0.7 inches; I'm using 8.5x11 inch paper. +* gpic doesn't accept the syntax `chop N M' for chopping both ends of + a line. -Make sure that the paper size is `letter'. See groff_tmac(5). +The correct syntax is `chop N chop M'. ---------------------------------------------------------------------- -* When I try to run gxditview, I get the error: - Error: Widget viewport has zero width and/or height - -This error means you haven't correctly installed the application -defaults file, GXditview.ad; `make install' does this for you -automatically, so either you didn't do `make install', or you haven't -passed a good `--appresdir=' argument to groff's configure -script. +* With gpic -t, when I print `line ->; box' using a dvi to ps program, + the arrow head sticks through into the inside of the box. -See the X(7) man page for information how and where application -resource files have to be located. Look for the XAPPLRESDIR and -XUSERFILESEARCHPATH environment variables. +The dvi to ps program should be modified to set the line cap and line +join parameters to 1 while printing tpic specials. ---------------------------------------------------------------------- -* When I preview documents using -TX75 or -TX100, the layout is not - the same as when I print the document with -Tps: the line and page - breaks come in different places. +* gtroff doesn't understand lines like `.ce99' with no space between + the name of the request or macro and the arguments. -Use `groff -X -Tps'. +gtroff requires a space between macro or request and its arguments +because it allows the use of long names for macros and requests. You +can use the -C option or the `cp' request to put gtroff into a +compatibility mode in which it is not possible to use long names for +macros but in which no space is required between macros and their +arguments. The use of compatibility mode is strongly discouraged. ---------------------------------------------------------------------- -* When I try to print the output of groff -Tps, I get no output at all - from the printer, and the log file shows the error - %%[ error: undefined; offendingcommand: BP ]%% - I'm using TranScript spooling software. +* gtroff gives warnings about lines like + .ev \" a comment + (with a tab after the .ev). -This is a bug in the page reversal filter in early versions of -TranScript. Change the `broken' parameter in -/usr/local/lib/groff/font/devps/DESC to 7. +A tab character cannot be used as a substitute for a space character +(except in one case: between a control character at the beginning of a +line and the name of a macro or request). For example, in Unix troff ----------------------------------------------------------------------- + .ps \" restore the previous point size -* When I preview groff -Tps output using the Sun OpenWindows 2.0 - pageview program, all the pages are displayed on top of each other. +(with a tab after the .ps) does NOT restore the previous point-size; +instead it is silently ignored. Since this is very likely to be an +error, gtroff can give a warning about it. If you want to align +comments, you can do it like this: -This is a defect in pageview. Change the `broken' parameter in -/usr/local/lib/groff/font/devps/DESC to 2. + .ev\" \" a comment ---------------------------------------------------------------------- -* With groff -TX75, -TX100 or -X, I can only view the first page. +* I don't like the page headers and footers produced by groff -man. -The left mouse button brings up a menu that allows you to view other -pages. +There seem to be many different styles of page header and footer +produced by different versions of the -man macros. You need to put +modified macros from tmac/an.tmac into man.local. More information is +available in groff_man(7). ---------------------------------------------------------------------- -* When I print the output of groff -Tdvi, I just get a black dot in - upper left corner. +* While formatting a manual page, groff complains about not being able + to break lines. A line like the following seems to cause this. + .TP \w'label'+2 + +The groff_man(7) man page says that the default scaling unit for the +`TP` macro is 'n' (ens), and that is how the groff man macros are +implemented. Consequently, the macro argument above is evaluated +equivalently to this expression. + + \w'label'n+2n + +AT&T troff's man macros don't implement this correctly (probably because +it's hard to do in that troff); instead, they append 'n' to the entire +argument, so that it is evaluated as if it were written as follows. + + \w'label'u+2n + +The solution is to fix the manual page. + + .TP \w'label'u+2 + +It might be better still to avoid such computations in macro arguments, +however; programs that are not *roff formatters that attempt to +interpret man pages can lack the ability to interpret numeric +expressions. See section "Portability" of groff_man_style(7). -Some dvi drivers (notably early versions of xtex) do not correctly -handle dvi files that use a resolution different from that used by dvi -files produced by TeX. Try getting a more up to date driver. ----------------------------------------------------------------------- + +Printing and Display Problems +============================= + + + +[groff 1.09] * How can I use groff with an old LaserJet printer that doesn't work with groff -Tlj4? @@ -527,7 +514,7 @@ You have at least 3 options: - use groff -Tps with GNU Ghostscript; -- use groff -Tdvi with a TeX .dvi to Laserjet driver; +- use groff -Tdvi with a TeX .dvi to LaserJet driver; - use groff with the LaserJet driver in Chris Lewis' psroff package (available for ftp from: @@ -547,102 +534,152 @@ generated by groff should be printable on any PostScript printer. Problems with groff output's not printing are most often caused by the spooling system. +---------------------------------------------------------------------- +[groff 1.04] -Platform-Dependent Macro Problems -================================= +* When I try to run gxditview, I get the error: + Error: Widget viewport has zero width and/or height + +This error means you haven't correctly installed the application +defaults file, GXditview.ad; `make install' does this for you +automatically, so either you didn't do `make install', or you haven't +passed a good `--appdefdir=' argument to groff's configure +script. +See the X(7) man page for information how and where application +defaults files have to be located. Look for the XAPPLRESDIR and +XUSERFILESEARCHPATH environment variables. +---------------------------------------------------------------------- -* I get lots of errors when I use groff with the AT&T -mm macros. +[groff 1.01] -Use the groff -mm macros. +* I'm having problems including PostScript illustrations (EPS) using + the PSPIC macro and/or \X'ps: import ...'. + +A PostScript document must meet three requirements in order to be +included with the PSPIC macro: it must comply with the Adobe Document +Structuring Conventions; it must contain a BoundingBox line; it must +be `well-behaved'. The BoundingBox line should be of the form: + + %%BoundingBox: llx lly urx ury + +where llx, lly, urx, ury are the coordinates of the lower left x, +lower left y, upper right x, upper right y of the bounding box of +marks on the page expressed as integers in the default PostScript +coordinate system (72 units per inch, origin at bottom left corner). + +The most convenient program to get the bounding box of a document is +the `ps2epsi' script coming with GhostScript. + +If you can't use this program, another useful tactic is to print out +the illustration by itself (you may need to add a `showpage' at the +end), and physically measure the bounding box. For more detail on +these requirements, read the specification of Encapsulated PostScript +format. (This is available from the Adobe file server; send a message +with a body of `help' to ps-file-server@adobe.com.) + +If an EPS file to be included via \X'ps: import' does not start with +`%!PS-Adobe-...', gtroff still includes the file, but grops does not +add any fonts to the generated output file that are listed in the EPS +file, even though the files are listed in the `download' file and are +available in the devps directory. ---------------------------------------------------------------------- -* groff produces wrapper macros for `ms' and friends which call the - system's original macros. Then, to get groff's ms macro package I - have to use `-mgs' instead `-ms'. Can I avoid this? +* I've configured groff for A4 paper, but gtroff still seems to think + that the length of a page (as returned by `\n(.p') is 11 inches. -Yes. Configure and compile groff as usual, but install it with +This is intentional. The PAGE option during configuration is used +only by grops. For compatibility with AT&T troff, the default page +length in GNU troff is always 11 inches. The page length can be changed +with the `pl' request. - make install tmac_wrap="" +A convenient way to set paper dimensions is to use the -dpaper option +of groff, together with proper -P options for the postprocessor +(overriding the default). For example, use the following command for +PostScript output on A4 paper in landscape orientation. -Then no wrapper files are produced, and `-ms' uses groff's `ms' -macros. + groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps + +See groff(1) and groff_tmac(5) for more information. ---------------------------------------------------------------------- -* I'm having problems formatting HP-UX 9.0 man pages with groff -man. +* When I print the output of groff -Tps, the output is always shifted + up by about 0.7 inches; I'm using 8.5x11 inch paper. -Copy HP's tmac.an into /usr/local/share/groff/site-tmac/an.tmac, and -either put `.cp 1' at the beginning or filter it (and any files it -.so's) through tmac/fixmacros.sed. +Make sure that the paper format is "letter". See groff_tmac(5). ---------------------------------------------------------------------- -* I get errors using the Unix -ms macros with groff -e -C. +* When I try to print the output of groff -Tps, I get no output at all + from the printer, and the log file shows the error + %%[ error: undefined; offendingcommand: BP ]%% + I'm using TranScript spooling software. + +This is a bug in the page reversal filter in early versions of +TranScript. Change the `broken' parameter in +/usr/local/lib/groff/font/devps/DESC to 7. -Apply this change: +---------------------------------------------------------------------- -*** /usr/lib/ms/ms.eqn Tue Apr 25 02:14:28 1989 ---- ms.eqn Sun Nov 11 10:33:59 1990 -*************** -*** 22,29 **** - .. - . \" EN - end of a displayed equation - .de EN -! .if !\\*(10 .br - .di - .rm EZ - .nr ZN \\n(dn - .if \\n(ZN>0 .if \\n(YE=0 .LP ---- 22,30 ---- - .. - . \" EN - end of a displayed equation - .de EN -! .if \\n(.k>0 .br - .di -+ .ds 10 \\*(EZ\\ - .rm EZ - .nr ZN \\n(dn - .if \\n(ZN>0 .if \\n(YE=0 .LP +* When I preview groff -Tps output using the Sun OpenWindows 2.0 + pageview program, all the pages are displayed on top of each other. + +This is a defect in pageview. Change the `broken' parameter in +/usr/local/lib/groff/font/devps/DESC to 2. ---------------------------------------------------------------------- -* I'm having problems formatting Ultrix man pages with groff -man. +* With groff -TX75, -TX100 or -X, I can only view the first page. -The Ultrix man pages use a number of non-standard extensions to the -Unix man macros. One solution is to use the Ultrix -man macros with -groff. Copy /usr/lib/tmac/tmac.an to -/usr/local/share/groff/site-tmac/an.tmac and apply the following patch -(from Frank Wortner): +The left mouse button brings up a menu that allows you to view other +pages. You can also press and to advance and +retreat the current page view, respectively. -*** /usr/local/lib/groff/tmac/tmac.an Wed Sep 9 12:29:28 1992 ---- /usr/lib/tmac/tmac.an Fri Jul 24 19:58:19 1992 -*************** -*** 489,495 **** - . \" make special case of shift out of italic - .de }S - .ds ]F -! .if \\$12 .if !\\$5 .ds ]F \^ - .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" - .el \\$3 - .}f ---- 489,495 ---- - . \" make special case of shift out of italic - .de }S - .ds ]F -! .if \\$12 .if !\\$5 .ds ]F\^ - .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" - .el \\$3 - .}f +---------------------------------------------------------------------- -Another possible solution is to install tmac/man.ultrix as -/usr/local/share/groff/site-tmac/man.local. +* When I print the output of groff -Tdvi, I just get a black dot in + upper left corner. + +Some dvi drivers (notably early versions of xtex) do not correctly +handle dvi files that use a resolution different from that used by dvi +files produced by TeX. Try getting a more up to date driver. + +---------------------------------------------------------------------- + +* When I preview documents using -TX75 or -TX100, the layout is not + the same as when I print the document with -Tps: the line and page + breaks come in different places. + +Use `groff -X -Tps'. + + + +Platform-Dependent Macro Problems +================================= + + + +[groff 1.17] + +* groff produces wrapper macros for `ms' and friends which call the + system's original macros. Then, to get groff's ms macro package I + have to use `-mgs' instead `-ms'. Can I avoid this? + +Yes. Configure and compile groff as usual, but install it with + + make install tmac_wrap="" + +Then no wrapper files are produced, and `-ms' uses groff's `ms' +macros. ---------------------------------------------------------------------- +[groff 1.09] + * On an SGI system, how can I make the man command use groff? From David Hinds (some of these steps @@ -651,13 +688,13 @@ as empty): Create a script called `eqn': - > #! /bin/sh + > #!/bin/sh > if [ ${1:-""} = /usr/pub/eqnchar ] ; then shift ; fi > geqn $* and a script called `neqn': - > #! /bin/sh + > #!/bin/sh > if [ ${1:-""} = /usr/pub/eqnchar ] ; then shift ; fi > geqn -Tascii $* @@ -720,214 +757,319 @@ To get PostScript output from `man -t', you also need to create a ! # probably not wanted. ! exec groff -Wall $T $opts $rest +---------------------------------------------------------------------- + +[groff 1.08] +* I'm having problems formatting HP-UX 9.0 man pages with groff -man. -Compilation Problems -==================== +Copy HP's tmac.an into /usr/local/share/groff/site-tmac/an.tmac, and +either put `.cp 1' at the beginning or filter it (and any files it +.so's) through tmac/fixmacros.sed. +---------------------------------------------------------------------- +[groff 1.07] -* Compilation dies with +* I'm having problems formatting Ultrix man pages with groff -man. - y.tab.c: In function `int yyparse()': - y.tab.c: `size_t' undeclared in namespace `std' +The Ultrix man pages use a number of non-standard extensions to the +Unix man macros. [To be fair, SunOS did too, albeit not as many; see +groff_man(7). groff embraced SunOS's extensions early on, but not +Ultrix's. --GBR in 2023] One solution is to use the Ultrix -man macros +with groff. Copy /usr/lib/tmac/tmac.an to +/usr/local/share/groff/site-tmac/an.tmac and apply the following patch +(from Frank Wortner): -* bison reports conflicts (either on stderr or in the `pic.output' - file) while processing `pic.y', and the produced pic binary doesn't - work at all. +*** /usr/local/lib/groff/tmac/tmac.an Wed Sep 9 12:29:28 1992 +--- /usr/lib/tmac/tmac.an Fri Jul 24 19:58:19 1992 +*************** +*** 489,495 **** + . \" make special case of shift out of italic + .de }S + .ds ]F +! .if \\$12 .if !\\$5 .ds ]F \^ + .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" + .el \\$3 + .}f +--- 489,495 ---- + . \" make special case of shift out of italic + .de }S + .ds ]F +! .if \\$12 .if !\\$5 .ds ]F\^ + .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" + .el \\$3 + .}f -You need bison version 1.875b or greater. Alternatively, use yacc or -byacc. +Another possible solution is to install tmac/man.ultrix as +/usr/local/share/groff/site-tmac/man.local. ---------------------------------------------------------------------- -* There are many empty `Makefile.dep' files. Is this a bug? +[groff 1.01] -No. Real dependency files are created with a `make depend' call. +* I get lots of errors when I use groff with the AT&T -mm macros. ----------------------------------------------------------------------- +Use the groff -mm macros. -* On HP-UX, the compiler complains about missing symbol `alloca'. -Say - export LDFLAGS=-lPW +Compilation Problems +==================== -before starting the configure script. + + +[groff 1.23.0] + +* The "initialization_is_quiet" test fails on my NetBSD box. + +This is a known problem. We haven't tracked down the cause yet, but +have improved the reporting of the test output in hopes that we can +isolate it in a future release. ---------------------------------------------------------------------- -* The configure script fails on OS/390 (z/OS) Unix. +* I get a build failure on Cygwin / a system using newlib and GCC 11. -[This has been fixed in z/OS V1R3 (aka OS/390 R13).] +"newlib" defines a function called "utoa" which conflicts with a static +(file scope-local) function in src/libs/libxutil/XFontName.c. -There is a bug in the Language Environment (LE) whereby the test -program for static destructors fails. You see the message `configure: -error: a working C++ compiler is required'. +We expect to fix this in the near future; in the meantime, you can patch +the file to rename the function (and update its call sites) or, if you +don't require the "gxditview" output previewer or "xtotroff" utility, +you can build groff without X11 support. -Applying PTF UQ42006 is supposed to fix this, but the test program is -still returning the wrong value (1). To work around this problem, you -can comment out the following in the configure script (near line -2029). This effectively bypasses the test (static constructors and -destructors do actually work properly): - -#if { (eval echo "$as_me:2029: \"$ac_link\"") >&5 -# (eval $ac_link) 2>&5 -# ac_status=$? -# echo "$as_me:2032: \$? = $ac_status" >&5 -# (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -# { (eval echo "$as_me:2034: \"$ac_try\"") >&5 -# (eval $ac_try) 2>&5 -# ac_status=$? -# echo "$as_me:2037: \$? = $ac_status" >&5 -# (exit $ac_status); }; }; then -# echo "$as_me:2039: result: yes" >&5 -#echo "${ECHO_T}yes" >&6 -#else -# echo "$as_me: program exited with status $ac_status" >&5 -#echo "$as_me: failed program was:" >&5 -#cat conftest.$ac_ext >&5 -#echo "$as_me:2045: result: no" >&5 -#echo "${ECHO_T}no" >&6;{ { echo "$as_me:2046: error: a working C++ compiler is required" >&5 -#echo "$as_me: error: a working C++ compiler is required" >&2;} -# { (exit 1); exit 1; }; } -#fi + $ make distclean + $ ./configure --without-x ---------------------------------------------------------------------- -* I get errors when I try to compile groff with DEC C++. +* The "check-default-foundry" test fails when I run "make check". -Fix the declaration of write() in so that the second -argument is a const char *. Fix the declaration of open() in - so that the first argument is a const char *. +Your Ghostscript installation may have its fonts embedded in the +executable; this can be discerned by searching for the pattern "%rom%" +in its search path. + + $ gs -h | grep '%rom%' + +The consequence is that gropdf(1) will be unable to embed fonts into PDF +files it generates (apart from groff's "EURO" font) when the default +foundry is used. This is the same outcome as if Ghostscript were not +installed at all. If you install URW fonts (see "INSTALL.extra"), you +will be able to embed them all by using the "U" foundry with gropdf to +overcome this problem. ---------------------------------------------------------------------- -* On a host using Unix make (e.g. Solaris), if you are compiling for - multiple architectures by building in a subdirectory, the make stops - with a message like this: +* I get a lot of warnings about "sprintf" on macOS. - make: Fatal error: Don't know how to make target `assert.o' +Apple has decided to treat the sprintf() standard C library function as +deprecated even though the C standard itself has not. - or like this: +https://developer.apple.com/forums/thread/714675 - make: Fatal error: Can't find /u/src/groff/src/include/Makefile.sub': No such file or directory +---------------------------------------------------------------------- -This occurs because GNU make and Unix make handle VPATH differently, -and the groff build relies on GNU make's VPATH handling. +* I get a make(1) failure involving grep and the groff_man.7.man.in file + on Solaris 11. -Use GNU make to work around this. -In Solaris 8 and 9, GNU make is on the Software Companion CD in -package SFWgmake and is installed as /opt/sfw/bin/gmake. Prebuilt -versions of GNU make for Solaris are also available from -sunfreeware.com. +Solaris make(1) has a bug easily exhibited by the following Makefile. + +all: + ! false + +Use GNU make instead; it may be available in /opt/csw/bin/gmake. ---------------------------------------------------------------------- -* On Ultrix, the make program stops with the message +* Tests fail when I run "make check" on Solaris 10 or 11. - *** Error code 1 +The test suite expects a POSIX-conforming shell and utilities. Solaris +10 does not offer these in the default $PATH. We try to use features +standardized no later than POSIX Issue 4 (1994). Unfortunately even +that is too recent for some implementations. Solaris 11 has a (mostly) +conforming shell. It may help to ensure that "/usr/xpg6/bin" and +"/usr/xpg4/bin" precede "/usr/bin" in the $PATH when building groff. - Stop. +For Solaris 10, it is necessary to modify the shell-based test scripts +in place to use a conforming shell. Here is an example. - for no apparent reason. + $ gsed -i -e '1s@#!/bin/sh@#!/usr/xpg4/bin/sh@' \ + `find . -name '*.sh' | grep /tests/` + $ PATH=/usr/xpg4/bin:$PATH gmake check -Use GNU make. +Some test failures remain expected on Solaris 10 and/or 11. + +1. FAIL: contrib/hdtbl/examples/test-hdtbl.sh + + /usr/bin/tr on Solaris 10 is non-conforming with the POSIX Issue 4 + standard. It furthermore issues anonymous diagnostics, saying only + "Bad string". + + Install tr from GNU coreutils in the $PATH. Edit line 57 of each of + contrib/hdtbl/examples/fonts_x.in and + contrib/hdtbl/examples/fonts_n.in. Change "tr" to "gtr". + Alternatively, you can use the absolute path to GNU tr's location. + Re-run "gmake check" as above. (Some files will be rebuilt.) + + The tr commands in /usr/xpg4/bin and /usr/xpg6/bin also work, but + the documents constructed from the above inputs use groff's `pso` + request, which wraps the standard C library `popen()` function, + which sanitizes $PATH to avoid privilege escalation, thus making it + likely that the non-conforming tr in /usr/bin will be found first. + +2. FAIL: src/roff/groff/tests/initialization_is_quiet.sh + FAIL: src/roff/groff/tests/msoquiet_works.sh + FAIL: src/roff/groff/tests/soquiet_works.sh + + (The first of these might be SKIPped instead.) + + /usr/xpg4/bin/sh is non-conforming with the POSIX Issue 4 standard, + despite its name. Its "unset" builtin is buggy. (The /usr/bin/sh + in Solaris 11 does not have this problem.) + + These tests use the "unset" shell builtin command to prevent + environment variables from confounding test results. + + POSIX says "[u]nsetting a variable ... that was not previously set + is not considered an error and will not cause the shell to abort." + + Nevertheless this builtin returns an error exit status in this + circumstance. + + $ /usr/xpg4/bin/sh -c 'unset _NON_EXISTENT_XYZ; echo $?' + 1 + + You may disregard these failures, edit the test scripts to append + "|| true" to the "unset" commands, or change the scripts to use GNU + Bash or some other POSIX-conforming shell as illustrated above. ---------------------------------------------------------------------- -* I'm having problems compiling groff on 386BSD 0.1. +* I get warnings from afmtodit about names already being mapped. -If you're using ash as /bin/sh, you'll need the following patch. +afmtodit: AGL name 'Delta' already mapped to groff name '*D'; ignoring AGL name 'uni0394' -*** gendef.sh.org Sun Jun 30 13:30:36 1991 ---- gendef.sh Sun Feb 28 10:23:49 1993 -*************** -*** 3,9 **** - file=$1 - shift +You can ignore these if they're in the form shown above, where the +ignored AGL name is 'uniXXXX' and 'XXXX' is four hexadecimal digits. +The Adobe Glyph List (AGL) has its own names for glyphs; they are often +different from groff's special character names. The afmtodit program is +constructing a mapping from groff special character names to AGL names; +this can be a one-to-one or many-to-one mapping, but one-to-many will +not work, so afmtodit discards the excessive mappings. The example you +see above is telling you that the groff font description that afmtodit +is writing cannot map the groff special character '*D' to both 'Delta' +and 'uni0394'. -! defs="#define $1" - shift - for def - do ---- 3,10 ---- - file=$1 - shift +Which, if any, such warnings you see depends on the version of the URW +fonts you are building groff against. See the '--with-urw-fonts-dir' +option to the "configure" script, and the afmtodit(1) and groff_char(7) +man pages for more background. -! x=$1 -! defs="#define $x" - shift - for def - do +---------------------------------------------------------------------- -You'll also need to change dirnamemax.c so that it doesn't use -pathconf(). +* I am building from the Git repository, using 'autoreconf' from a GNU + Autoconf release earlier than 2.69, and I get this. + + /usr/share/aclocal/gtkglextmm-1.2.m4:225: + warning: underquoted definition of AC_GTKGLEXTMM_SUPPORTS_MULTIHEAD + /usr/share/aclocal/gtkglextmm-1.2.m4:225: + run info '(automake)Extending aclocal' + /usr/share/aclocal/gtkglextmm-1.2.m4:225: + or see http://www.gnu.org/software/automake/manual/automake.html#Extending-aclocal + +Ignore this. It doesn't occur in more recent versions of 'autoreconf'. ---------------------------------------------------------------------- -* While compiling on Xenix, ranlib libgroff.a fails. +* I get warnings about special characters in the groff_char(7) man page. -The system ranlib can't handle externals longer than 40 characters. -Use the ranlib included in demon.co.uk:/pub/xenix/g++-1.40.3a.v1 -instead. +troff:man/groff_char.7:1033: warning: special character '.j' not defined + + (...and similar for 'vA', 'bs', '-+', 'coproduct', and '+e'.) + +You can ignore these. groff defines a handful of special characters for +which historical PostScript fonts usually did not possess glyphs. +Except for 'bs' (the Bell System logo), we hope to provide fallbacks or +a supplementary PostScript font in groff in the future (as was done for +the Euro glyph). ---------------------------------------------------------------------- -* I get errors when I try to compile groff with Sun C++ version 3 or - earlier. +* I get warnings about the "vasnprintf" function. -Groff requires header files that are moderately compatible with AT&T -C++ and ANSI C. With some versions of Sun C++, the supplied header -files need some of the following changes to meet this requirement: - must declare the mem* functions, (just add `#include -' to ); the first argument to fopen and freopen -should be declared as `const char *'; the first argument to fread -should be declared as `void *'; the first argument to fwrite should be -declared as `const void *'; malloc should be declared to return -`void *'; in , the declaration `extern "C" { void -*__builtin_alloca(int); }' should be added; in the -return type and the second argument type of signal() should be changed -to be `void (*)(int)'. +lib/vasnprintf.c: In function 'vasnprintf': +lib/vasnprintf.c:5268:27: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] +(and similar) -You can either change them in place, or copy them to some other -directory and include that directory with a -I option. +The groff source tree includes gnulib, the GNU portability library +. These warnings are about its +source code and that project's responsibility to resolve. We expect a +future release of gnulib to do so. ---------------------------------------------------------------------- -* I get errors when I try to compile groff with Forte Development 6 - or 6u1, or Sun C++ version 5.0 through 5.2. +[groff 1.22.4] -This is a known problem; see Sun bug #4301919. See Sun patches -109482, 109490, 109508, and 109509 for fixes. +* When compiling on NetBSD, make issues warnings like + + Warning: line 28: Unable to locate font(s) + URWGothicL-Demi,a010015l.pfb on the given path(s) + + and + + Warning: line 77: Failed to create groff font 'U-AB' by running + afmtodit + +In this case install the package "urw-fonts": + + pkgin install urw-fonts + +and make the font path known to ghostscript, e.g. with (ksh): + + export GS_LIB=/usr/pkg/share/fonts/urw ---------------------------------------------------------------------- -* I get warnings from the Sun linker while using gcc 3.4.0: +* Currently (December 2015) building groff fails on NetBSD and + FreeBSD with the message: - ld: warning: relocation error: R_SPARC_UA32: - file groff/src/libs/libgroff/libgroff.a(getopt.o): symbol optarg: - external symbolic relocation against non-allocatable - section .debug_info; cannot be processed at runtime: - relocation ignored + make[1]: don't know how to make contrib/chem/chem.1. Stop -This seems to be a known problem (Sun bugs #4910101 and #4910810, -filed in September 2003; gcc bug #15599, filed May 2004) without a -public fix as of this writing. A work-around is to use option -`-gstabs+' instead of `-g' (and a high probability that the output is -only debuggable with gdb but not with Sun's debuggers). +The reason is a bug in the make(1) tool used on those systems related +to .SUFFIXES lines. + +A temporary workaround is to change the Makefile line + + .SUFFIXES: .roff .in .ps .mom .pdf .me .ms .ps .html .txt .texi \ + .dvi .pdf .xhtml .man .c .cpp .log .o .obj .sed .sin \ + .test .test$(EXEEXT) .trs .ypp + +into + + .SUFFIXES: .man .roff .in .ps .mom .pdf .me .ms .ps .html .txt \ + .texi .dvi .pdf .xhtml .c .cpp .log .o .obj .sed .sin \ + .test .test$(EXEEXT) .trs .ypp + +(put .man at begin of the list). + +The bug is reported to the maintainer of the make(1) tool of those +systems. ---------------------------------------------------------------------- -* I get lots of `numeric overflow' error messages whenever I run - groff; I compiled groff with AT&T C++ 2.0 with an ANSI C compiler. +[groff 1.22.3] + +* Configuration on MacOS X 10.6 doesn't succeed. + +Use -Make sure -DCFRONT_ANSI_BUG is included in DEFINES in the top-level -Makefile. If that doesn't solve the problem, define INT_MIN as --INT_MAX in libgroff/lib.h. + ./configure CXX=g++-4.2 ---------------------------------------------------------------------- +[groff 1.21] + * In MacOS X, I want to completely replace the groff that came with the system. @@ -944,6 +1086,26 @@ Note that subsequent system updates may replace your groff. ---------------------------------------------------------------------- +[groff 1.19.2] + +* I get warnings from the Sun linker while using gcc 3.4.0: + + ld: warning: relocation error: R_SPARC_UA32: + file groff/src/libs/libgroff/libgroff.a(getopt.o): symbol optarg: + external symbolic relocation against non-allocatable + section .debug_info; cannot be processed at runtime: + relocation ignored + +This seems to be a known problem (Sun bugs #4910101 and #4910810, +filed in September 2003; gcc bug #15599, filed May 2004) without a +public fix as of this writing. A work-around is to use option +`-gstabs+' instead of `-g' (and a high probability that the output is +only debuggable with gdb but not with Sun's debuggers). + +---------------------------------------------------------------------- + +[groff 1.19] + * When compiling on MacOS X 10.2, groff compiles but does not run well, especially `eqn', causing many `can't break line' messages. @@ -959,60 +1121,201 @@ as usual. ---------------------------------------------------------------------- -* Configuration on MacOS X 10.6 doesn't succeed. +[groff 1.18.0] -Use +* Compilation dies with - ./configure CXX=g++-4.2 + y.tab.c: In function `int yyparse()': + y.tab.c: `size_t' undeclared in namespace `std' + +* bison reports conflicts (either on stderr or in the `pic.output' + file) while processing `pic.y', and the produced pic binary doesn't + work at all. + +You need bison version 1.875b or greater. Alternatively, use yacc or +byacc. ---------------------------------------------------------------------- -* When compiling on NetBSD, make issues warnings like +[groff 1.17] - Warning: line 28: Unable to locate font(s) - URWGothicL-Demi,a010015l.pfb on the given path(s) +* On HP-UX, the compiler complains about missing symbol `alloca'. - and +Say - Warning: line 77: Failed to create groff font 'U-AB' by running - afmtodit + export LDFLAGS=-lPW -In this case install the package "urw-fonts": +before starting the configure script. - pkgin install urw-fonts +---------------------------------------------------------------------- -and make the font path known to ghostscript, e.g. with (ksh): +[groff 1.16.1] - export GS_LIB=/usr/pkg/share/fonts/urw +* On a host using Unix make (e.g. Solaris), if you are compiling for + multiple architectures by building in a subdirectory, the make stops + with a message like this: + + make: Fatal error: Don't know how to make target `assert.o' + + or like this: + + make: Fatal error: Can't find /u/src/groff/src/include/Makefile.sub': No such file or directory + +This occurs because GNU make and Unix make handle VPATH differently, +and the groff build relies on GNU make's VPATH handling. + +Use GNU make to work around this. +In Solaris 8 and 9, GNU make is on the Software Companion CD in +package SFWgmake and is installed as /opt/sfw/bin/gmake. Prebuilt +versions of GNU make for Solaris are also available from +sunfreeware.com. ---------------------------------------------------------------------- -* Currently (December 2015) building groff fails on NetBSD and - FreeBSD with the message: +* There are many empty `Makefile.dep' files. Is this a bug? - make[1]: don't know how to make contrib/chem/chem.1. Stop +No. Real dependency files are created with a `make depend' call. -The reason is a bug in the make(1) tool used on those systems related -to .SUFFIXES lines. +---------------------------------------------------------------------- -A temporary workaround is to change the Makefile line +[groff 1.16] - .SUFFIXES: .roff .in .ps .mom .pdf .me .ms .ps .html .txt .texi \ - .dvi .pdf .xhtml .man .c .cpp .log .o .obj .sed .sin \ - .test .test$(EXEEXT) .trs .ypp +* The configure script fails on OS/390 (z/OS) Unix. -into +[This has been fixed in z/OS V1R3 (aka OS/390 R13).] - .SUFFIXES: .man .roff .in .ps .mom .pdf .me .ms .ps .html .txt \ - .texi .dvi .pdf .xhtml .c .cpp .log .o .obj .sed .sin \ - .test .test$(EXEEXT) .trs .ypp +There is a bug in the Language Environment (LE) whereby the test +program for static destructors fails. You see the message `configure: +error: a working C++ compiler is required'. + +Applying PTF UQ42006 is supposed to fix this, but the test program is +still returning the wrong value (1). To work around this problem, you +can comment out the following in the configure script (near line +2029). This effectively bypasses the test (static constructors and +destructors do actually work properly): + +#if { (eval echo "$as_me:2029: \"$ac_link\"") >&5 +# (eval $ac_link) 2>&5 +# ac_status=$? +# echo "$as_me:2032: \$? = $ac_status" >&5 +# (exit $ac_status); } && { ac_try='./conftest$ac_exeext' +# { (eval echo "$as_me:2034: \"$ac_try\"") >&5 +# (eval $ac_try) 2>&5 +# ac_status=$? +# echo "$as_me:2037: \$? = $ac_status" >&5 +# (exit $ac_status); }; }; then +# echo "$as_me:2039: result: yes" >&5 +#echo "${ECHO_T}yes" >&6 +#else +# echo "$as_me: program exited with status $ac_status" >&5 +#echo "$as_me: failed program was:" >&5 +#cat conftest.$ac_ext >&5 +#echo "$as_me:2045: result: no" >&5 +#echo "${ECHO_T}no" >&6;{ { echo "$as_me:2046: error: a working C++ compiler is required" >&5 +#echo "$as_me: error: a working C++ compiler is required" >&2;} +# { (exit 1); exit 1; }; } +#fi + +---------------------------------------------------------------------- + +[groff 1.15] + +* I get errors when I try to compile groff with Forte Development 6 + or 6u1, or Sun C++ version 5.0 through 5.2. + +This is a known problem; see Sun bug #4301919. See Sun patches +109482, 109490, 109508, and 109509 for fixes. + +---------------------------------------------------------------------- + +[groff 1.08] + +* I'm having problems compiling groff on 386BSD 0.1. + +If you're using ash as /bin/sh, you'll need the following patch. + +*** gendef.sh.org Sun Jun 30 13:30:36 1991 +--- gendef.sh Sun Feb 28 10:23:49 1993 +*************** +*** 3,9 **** + file=$1 + shift + +! defs="#define $1" + shift + for def + do +--- 3,10 ---- + file=$1 + shift + +! x=$1 +! defs="#define $x" + shift + for def + do + +You'll also need to change dirnamemax.c so that it doesn't use +pathconf(). + +---------------------------------------------------------------------- + +* While compiling on Xenix, ranlib libgroff.a fails. + +The system ranlib can't handle externals longer than 40 characters. +Use the ranlib included in demon.co.uk:/pub/xenix/g++-1.40.3a.v1 +instead. + +---------------------------------------------------------------------- + +[groff 1.07] + +* I get errors when I try to compile groff with DEC C++. + +Fix the declaration of write() in so that the second +argument is a const char *. Fix the declaration of open() in + so that the first argument is a const char *. + +---------------------------------------------------------------------- + +* On Ultrix, the make program stops with the message + + *** Error code 1 + + Stop. + + for no apparent reason. + +Use GNU make. + +---------------------------------------------------------------------- + +[groff 1.01] + +* I get errors when I try to compile groff with Sun C++ version 3 or + earlier. + +Groff requires header files that are moderately compatible with AT&T +C++ and ANSI C. With some versions of Sun C++, the supplied header +files need some of the following changes to meet this requirement: + must declare the mem* functions, (just add `#include +' to ); the first argument to fopen and freopen +should be declared as `const char *'; the first argument to fread +should be declared as `void *'; the first argument to fwrite should be +declared as `const void *'; malloc should be declared to return +`void *'; in , the declaration `extern "C" { void +*__builtin_alloca(int); }' should be added; in the +return type and the second argument type of signal() should be changed +to be `void (*)(int)'. + +You can either change them in place, or copy them to some other +directory and include that directory with a -I option. -(put .man at begin of the list). -The bug is reported to the maintainer of the make(1) tool of those -systems. -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set autoindent textwidth=72: diff --git a/PROJECTS b/PROJECTS index 98f2fa7..533759e 100644 --- a/PROJECTS +++ b/PROJECTS @@ -1,13 +1,13 @@ -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # -# This file is part of `groffer' which is part of `groff'. +# This file is part of groff. # -# `groff' is free software; you can redistribute it and/or modify it +# groff is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # -# `groff' is distributed in the hope that it will be useful, but +# groff is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. @@ -24,10 +24,10 @@ Here are some things that would be useful additions to groff: distribution. refer: `refer' database directory under /usr/local/share. - There maybe create a default database `Ind' or others for - storing books and documents for `groff' man pages. + There maybe create a default database `Ind' or others for + storing books and documents for `groff' man pages. Write the following `groff' programs from Heirloom and - `refer' history: + `refer' history: - addbib - roffbib - sortbib @@ -44,7 +44,9 @@ gnu.groff.bug (or send email to groff@gnu.org) to see if anyone else has gotten there first. -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set filetype= textwidth=72: diff --git a/README b/README index 44fa8a6..41036e2 100644 --- a/README +++ b/README @@ -1,124 +1,130 @@ - Copyright (C) 1989-2018 Free Software Foundation, Inc. + Copyright (C) 1989-2023 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This is the GNU `groff' document formatting system. The version -number is given in the file VERSION. +This is the 'groff' document formatting system, a reimplementation and +extension of the AT&T Unix 'troff' system. The version number is given +in the file '.tarball-version' if you are building from a distribution +archive; otherwise, building from its Git repository will store it in +the file '.version'. -Included in this release are implementations of `troff', `pic', `eqn', -`tbl', `grn', `refer', `-man', `-mdoc', `-mom', and `-ms' macros, and -drivers for `PostScript', `PDF', `TeX DVI' format, `HP LaserJet 4' -printers, `Canon CAPSL' printers, `HTML' and `XHTML' formats (beta -status), and typewriter-like devices. Also included is a modified -version of the Berkeley `-me' macros, the enhanced version `gxditview' -of the X11 `xditview' previewer, and an implementation of the `-mm' -macros contributed by Joergen Haegg. +This release includes original implementations (not derived from AT&T +Unix code) of the 'troff', 'nroff', 'pic', 'eqn', 'tbl', 'refer', and +'soelim' programs; the 'man' and 'ms' macro packages; and output drivers +for PostScript, PDF, and TeX DVI file formats, HP LaserJet 4- and Canon +CaPSL-compatible printers, HTML and XHTML (in beta status), and +typewriter/terminal devices. -See the file `INSTALL' for instructions on how to install from a -release. You will require a C++ compiler. +It also provides modified versions of BSD Unix additions to Unix troff: +the 'grn' preprocessor, and the 'mdoc' and 'me' macro packages. +'gxditview', an enhanced version of the X11 'xditview' previewer for +'troff' device-independent output, originates from X11R5. -The file `INSTALL.REPO' contains supplementary instructions for -building directly from a clone of the repository or a snapshot -tarball. +Contributed components feature a reimplementation and extension of the +DWB 'troff' 'mm' macro package by Joergen Haegg, Peter Schaffter's 'mom' +macro package, and Bernd Warken's reimplementation of the 'chem' +preprocessor in Perl. -The file `NEWS' describes recent user-visible changes to `groff'. +See the file 'INSTALL.extra' for instructions on how to install from a +distribution archive, such as a release, beta, or release candidate. -`groff' is free software. See the file `COPYING' for copying -permission. +The file 'INSTALL.REPO' contains supplementary instructions for building +directly from a clone of the Git repository. -The file `PROBLEMS' describes various problems that have been -encountered in compiling, installing, and running `groff'. +The file 'NEWS' contains a history of user-visible changes to 'groff'. -The file `MORE.STUFF' contains information about add-on packages -useful for `groff'. +'groff' is free software. See the file 'COPYING' for copying +permissions, and 'LICENSES' for further detail. -The most recent released version of `groff' is always available by -anonymous ftp from `ftp.gnu.org' in the directory `gnu/groff'. +The file 'PROBLEMS' describes various issues that users have encountered +in compiling, installing, and running 'groff'. -The current development version of `groff' is available from a git -repository at +The file 'MORE.STUFF' describes some third-party programming and +documentary resources useful with 'groff'. - https://savannah.gnu.org/git/?group=groff +Current and historical releases of 'groff' are available via HTTPS and +anonymous FTP from the host 'ftp.gnu.org' in the directory 'gnu/groff'. + +'groff' has a home page at the GNU Project. + +https://www.gnu.org/software/groff/ -To view the git repository in your browser, go to +Administration of the project is done through GNU Savannah. + + https://savannah.gnu.org/git/?group=groff - http://git.savannah.gnu.org/cgit/groff.git +'groff' is developed at its Git repository, which has a web interface. -There you can also download snapshots; simply click on a commit entry -line to get the URL. + https://git.savannah.gnu.org/cgit/groff.git -Depending on your requirements, you may need at least some of the -following tools to build `groff' directly from its source: +You can view any commit in isolation, and browse the entire source tree +corresponding to its state as of that commit. Click the summary line of +the commit message to expose these options. - perl >= v5.6.1 (see macro GROFF_PERL in file `m4/groff.m4') - ghostscript - the psutils package - the netpbm package - texinfo 4.8 - bison >= 1.875b or byacc +Build requirements are discussed in the 'INSTALL.extra' and +'INSTALL.REPO' files noted above. 'groff' also has runtime +dependencies. -Note that `texinfo' and `bison' or `byacc' are required only for -building from repository sources (either a checked out working copy, -or a commit snapshot). They are not required for building from a -stable release tarball. Also note that the version numbers stated are -the minimum supported. No version of `texinfo' < 4.8 works, and the -original release of `bison' 1.875 is known not to work; you *may* find -that `bison' releases < 1.875 work, but in case of difficulty, please -update to a later version *before* posting a bug report. +Ghostscript is required for creation of PDF and (X)HTML output. +Production of (X)HTML furthermore demands tools from the 'netpbm' and +'psutils' packages. -For *all* sources, you need `ghostscript' for creation of either `PDF' -or `HTML' output; the `netpbm' and `psutils' packages are required -only for `HTML' output (and for compilation from the repository). If -you don't intend to produce output in either of these formats, then -these packages are unnecessary. +Perl is required for production of PDF output using the 'gropdf' output +driver. (You can alternatively produce PostScript with 'grops' and +convert that to PDF using Ghostscipt.) The 'chem', 'gperl', and +'gpinyin' preprocessors and several utilities, such as 'grog', are also +written in Perl. -Additionally, producing `PDF' output directly with the `gropdf' device needs -a working installation of `perl'. The same is true for some other -preprocessors like `chem'. +If 'groff' is configured with 'lp' or 'lpr' support, the corresponding +program must remain available on the system for the 'groff' command's +'-l' option to work. Similarly, build-time detection of development +headers for the 'uchardet', 'Xaw', and 'Xmu' libraries (and their +dependencies) assumes that their runtime counterparts will remain +installed to support the 'groff' that is built. -The `groff' configure script searches for the X11 headers and -libraries `Xaw' and `Xmu'. So the corresponding developer packages of -your system must be installed, otherwise `groff' does not install -`gxditview' and the `-TX*' devices. In Debian, the developer packages -are `libxaw7-dev' and `libxmu-dev'. +You can view or add to to groff's bug database via its issue tracker on +the Savannah site (also linked from the groff home page). -Please report bugs using the bug tracker available from the project -page at + http://savannah.gnu.org/bugs/?group=groff - https://savannah.gnu.org/projects/groff +To report a problem, you may use the form in the file 'BUG-REPORT'; its +purpose is to make sure that FSF has all the information it needs to fix +the bug. At the very least, read the 'BUG-REPORT' form and make sure +that you supply all the information that it asks for. Even if you are +not sure that something is a bug, please report it so we can determine +whether it is a software defect, or an omission from our documentation. -You may use the form in the file `BUG-REPORT'; the idea of this is to -make sure that FSF has all the information it needs to fix the bug. -At the very least, read the `BUG-REPORT' form and make sure that you -supply all the information that it asks for. Even if you are not sure -that something is a bug, report it: this enables us to determine whether -it really is a bug. +If you'd like to modify 'groff' or participate in its development, files +'HACKING' and 'MANIFEST' will familiarize you with the structure of the +code and the project's conventions for maintaining it. -Three mailing lists are available: +Three mailing lists are available. - bug-groff@gnu.org for following bug reports + bug-groff@gnu.org a read-only list for following bug reports groff@gnu.org for general discussion of groff - groff-commit@gnu.org a read-only list to follow commits - to the git repository + groff-commit@gnu.org a read-only list for following commits + to the Git repository To subscribe, send a mail to -request@ (example: -groff-request@gnu.org for the `groff' list) with the word `subscribe' -in either the subject or body of the e-mail (don't include the quotes). -Alternatively, you may subscribe by visiting the web pages at +groff-request@gnu.org for the 'groff' list) with the word 'subscribe' +in either the subject or body of the email (don't include the quotes). +Alternatively, subscribe via our web pages by completing an HTML form. - http://lists.gnu.org/mailman/listinfo/bug-groff - http://lists.gnu.org/mailman/listinfo/groff - http://lists.gnu.org/mailman/listinfo/groff-commit + https://lists.gnu.org/mailman/listinfo/bug-groff + https://lists.gnu.org/mailman/listinfo/groff + https://lists.gnu.org/mailman/listinfo/groff-commit Each of these web pages also provides a link to a browseable archive of postings to the corresponding mailing list. -GNU `groff' was written by James Clark . +'groff' was primarily written by James Clark . -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/README.MinGW b/README.MinGW index 2cbc35e..412597a 100644 --- a/README.MinGW +++ b/README.MinGW @@ -1,4 +1,4 @@ - Copyright (C) 2003-2018 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -13,194 +13,206 @@ INTRODUCTION ------------ - This file provides recommendations for building a Win32 implementation of - GNU Groff, using the MinGW port of GCC for Microsoft (TM) Windows-32 - platforms. It is intended to supplement the standard installation - instructions (see file INSTALL); it does not replace them. + This file provides recommendations for building a Win32 implementation + of GNU Groff, using the MinGW port of GCC for Microsoft (TM) + Windows-32 platforms. It is intended to supplement the standard + installation instructions (see file INSTALL); it does not replace + them. - You require both the MinGW implementation of GCC and its supporting MSYS - toolkit, which provides a Win-32 implementation of the GNU bash shell, and a - few other essential utilities; these may be obtained from + You require both the MinGW implementation of GCC and its supporting + MSYS toolkit, which provides a Win-32 implementation of the GNU bash + shell, and a few other essential utilities; these may be obtained from http://sourceforge.net/projects/mingw - by following the appropriate download links, where they are available as - self-extracting executable installation packages. If installing both from - scratch, it is recommended that MinGW is installed first, as the MSYS - installer can then automatically set up the proper environment for running - MinGW. + by following the appropriate download links, where they are available + as self-extracting executable installation packages. If installing + both from scratch, it is recommended that MinGW is installed first, as + the MSYS installer can then automatically set up the proper + environment for running MinGW. - Additionally, if you wish to compile groff with support for its HTML (and - XHTML) output capability, some additional tools are required as described in - the section PREREQUISITES FOR HTML OUTPUT later in this file. + Additionally, if you wish to compile groff with support for its HTML + (and XHTML) output capability, some additional tools are required as + described in the section PREREQUISITES FOR HTML OUTPUT later in this + file. BUILDING GROFF WITH MINGW ------------------------- *** WARNING *** - - Before commencing this procedure, you should ensure that you are running the - MSYS shell in a *native* Win32 console window, and not in any window managed - by the rxvt emulator provided with MSYS; (this emulator suffers from various - known defects, which will prevent successful completion of a groff build). + + Before commencing this procedure, you should ensure that you are + running the MSYS shell in a *native* Win32 console window, and not in + any window managed by the rxvt emulator provided with MSYS; (this + emulator suffers from various known defects, which will prevent + successful completion of a groff build). ****** - Assuming that you have obtained the appropriate groff distribution, and that - you are already running an MSYS shell, then the configuration, compilation, - and installation of groff, using MinGW, is performed in much the same way as - it is described in the INSTALL file, which is provided with the groff - distribution. The installation steps are summarised below: + Assuming that you have obtained the appropriate groff distribution, + and that you are already running an MSYS shell, then the + configuration, compilation, and installation of groff, using MinGW, is + performed in much the same way as it is described in the INSTALL file, + which is provided with the groff distribution. The installation steps + are summarised below: - 1. Change working directory to any suitable location where you may unpack - the groff distribution; you must be authorized for write access. - Approximately 30MB of free disk space are needed. + 1. Change working directory to any suitable location where you may + unpack the groff distribution; you must be authorized for write + access. Approximately 30MB of free disk space are needed. 2. Unpack the groff distribution: tar xzf /groff-.tar.gz - This creates a new sub-directory, groff-, containing an image of - the groff source tree. You should now change directory, to make this - ./groff- your working directory. + This creates a new sub-directory, groff-, containing an + image of the groff source tree. You should now change directory, + to make this ./groff- your working directory. - 3. If you are intending to build groff with support for HTML (and XHTML) - output, then you must now ensure that the prerequisites described in the - later section PREREQUISITES FOR HTML OUTPUT are satisfied, before - proceeding to build groff; in particular, please ensure that all required - support programs are installed in the current PATH. + 3. If you are intending to build groff with support for HTML (and + XHTML) output, then you must now ensure that the prerequisites + described in the later section PREREQUISITES FOR HTML OUTPUT are + satisfied, before proceeding to build groff; in particular, please + ensure that all required support programs are installed in the + current PATH. 4. You are now ready to configure, build, and install groff. This is - accomplished using the conventional procedure, as described in the file - INSTALL, i.e. + accomplished using the conventional procedure, as described in the + file INSTALL, i.e. ./configure --prefix= ... make make install - Please observe the syntax for the configure command, indicated above; the - default value for --prefix is not suitable for use with MinGW, so the - --prefix= option must be specified, where - is the chosen MS-Windows directory in which the - groff application files are to be installed (see the later section - entitled CHOOSING AN INSTALLATION PATH). Any other desired configuration - options may also be specified, as described in the standard groff - installation instructions. - - 5. After completing the above, groff should be successfully installed; the - build directory is no longer required; it may be simply deleted in its - entirety. Alternatively, you may choose to keep it, but to remove all - files which can be reproduced later, by repeating the configure, make and - make install steps; this is readily accomplished by the command + Please observe the syntax for the configure command, indicated + above; the default value for --prefix is not suitable for use with + MinGW, so the --prefix= option must be + specified, where is the chosen MS-Windows + directory in which the groff application files are to be installed + (see the later section entitled CHOOSING AN INSTALLATION PATH). + Any other desired configuration options may also be specified, as + described in the standard groff installation instructions. + + 5. After completing the above, groff should be successfully installed; + the build directory is no longer required; it may be simply deleted + in its entirety. Alternatively, you may choose to keep it, but to + remove all files which can be reproduced later, by repeating the + configure, make and make install steps; this is readily + accomplished by the command make distclean - This completes the installation of groff; please read the final sections of - this file, GROFF RUNTIME ENVIRONMENT and CAVEATS AND BUGS, for advice on - setting up the runtime environment, and avoiding known runtime problems, - before running groff. + This completes the installation of groff; please read the final + sections of this file, GROFF RUNTIME ENVIRONMENT and CAVEATS AND BUGS, + for advice on setting up the runtime environment, and avoiding known + runtime problems, before running groff. CHOOSING AN INSTALLATION PATH ----------------------------- - It may be noted that the above instructions indicate that the ./configure - command must be invoked with an argument specifying a preference for - --prefix=, whereas the standard groff installation - instructions indicate that this may be omitted, in which case it defaults to - --prefix=/usr/local. - - In the case of building with MinGW, the default behaviour of configure is - not appropriate for the following reasons. - - o The MSYS environment creates a virtual Unix-like file system, with its - root mapped to the actual MS-Windows directory where MSYS itself is - installed; /usr is also mapped to this MSYS installation directory. - - o All of the MSYS tools, and the MinGW implementation of GCC, refer to files - via this virtual file system representation; thus, if the - --prefix= is not specified when groff is configured, - `make install' causes groff to be installed in /local. - - o groff needs to know its own installation path, so that it can locate its - own installed components. This information is compiled in, using the - exact form specified with the --prefix= option to - configure. - - o Knowledge of the MSYS virtual file system is not imparted to groff; it - expects the compiled-in path to its components to be a fully qualified - MS-Windows path name (although Unix-style slashes are permitted, and - preferred to the MS-Windows style backslashes, to demarcate the directory - hierarchy). Thus, when configuring groff, if - --prefix= is not correctly specified, then the - installed groff application looks for its components in /usr/local, and - most likely doesn't find them, because they are actually installed in - /local. + It may be noted that the above instructions indicate that the + ./configure command must be invoked with an argument specifying a + preference for --prefix=, whereas the standard + groff installation instructions indicate that this may be omitted, in + which case it defaults to --prefix=/usr/local. + + In the case of building with MinGW, the default behaviour of configure + is not appropriate for the following reasons. - It is actually convenient, but by no means a requirement, to have groff - installed in the /usr/local directory of the MSYS virtual file system; this - makes it easy to invoke groff from the MSYS shell, since the virtual - /usr/local/bin is normally added automatically to the PATH (the default - PATH, as set in MSYS's /etc/profile), when MSYS is started. + o The MSYS environment creates a virtual Unix-like file system, with + its root mapped to the actual MS-Windows directory where MSYS itself + is installed; /usr is also mapped to this MSYS installation + directory. + + o All of the MSYS tools, and the MinGW implementation of GCC, refer to + files via this virtual file system representation; thus, if the + --prefix= is not specified when groff is + configured, `make install' causes groff to be installed in + /local. - In order to install groff into MSYS's /usr/local directory, it is necessary - to specify the fully qualified absolute MS-Windows path to this directory, - when configuring groff, i.e. + o groff needs to know its own installation path, so that it can locate + its own installed components. This information is compiled in, + using the exact form specified with the + --prefix= option to configure. + + o Knowledge of the MSYS virtual file system is not imparted to groff; + it expects the compiled-in path to its components to be a fully + qualified MS-Windows path name (although Unix-style slashes are + permitted, and preferred to the MS-Windows style backslashes, to + demarcate the directory hierarchy). Thus, when configuring groff, + if --prefix= is not correctly specified, then + the installed groff application looks for its components in + /usr/local, and most likely doesn't find them, because they are + actually installed in /local. + + It is actually convenient, but by no means a requirement, to have + groff installed in the /usr/local directory of the MSYS virtual file + system; this makes it easy to invoke groff from the MSYS shell, since + the virtual /usr/local/bin is normally added automatically to the PATH + (the default PATH, as set in MSYS's /etc/profile), when MSYS is + started. + + In order to install groff into MSYS's /usr/local directory, it is + necessary to specify the fully qualified absolute MS-Windows path to + this directory, when configuring groff, i.e. ./configure --prefix=/local ... - For example, on a system where MSYS is installed in the MS-Windows directory - D:\MSYS\1.0, the MSYS virtual path /usr/local resolves to the absolute - MS-Windows native path D:\MSYS\1.0\local (the /usr component of the MSYS - virtual path does not appear in the resolved absolute native path name since - MSYS maps this directly to the root of the MSYS virtual file system). Thus, - the --prefix option should be specified to configure as + For example, on a system where MSYS is installed in the MS-Windows + directory D:\MSYS\1.0, the MSYS virtual path /usr/local resolves to + the absolute MS-Windows native path D:\MSYS\1.0\local (the /usr + component of the MSYS virtual path does not appear in the resolved + absolute native path name since MSYS maps this directly to the root of + the MSYS virtual file system). Thus, the --prefix option should be + specified to configure as ./configure --prefix=D:/MSYS/1.0/local ... - Note that the backslash characters, which appear in the native MS-Windows - form of the path name, are replaced by Unix-style slashes in the argument to - configure; this is the preferred syntax. + Note that the backslash characters, which appear in the native + MS-Windows form of the path name, are replaced by Unix-style slashes + in the argument to configure; this is the preferred syntax. - Also note that the MS-Windows device designator (D: in this instance) is - prepended to the specified path, in the normal MS-Windows format, and that, - since upper and lower case distinctions are ignored in MS-Windows path - names, any combination of upper and lower case is acceptable. + Also note that the MS-Windows device designator (D: in this instance) + is prepended to the specified path, in the normal MS-Windows format, + and that, since upper and lower case distinctions are ignored in + MS-Windows path names, any combination of upper and lower case is + acceptable. PREREQUISITES FOR HTML OUTPUT ----------------------------- - If you intend to use groff for production of HTML or XHTML output, then - there are a few dependencies which must be satisfied. Ideally, these should - be resolved before attempting to configure and build groff, since the - configuration script does check them. + If you intend to use groff for production of HTML or XHTML output, + then there are a few dependencies which must be satisfied. Ideally, + these should be resolved before attempting to configure and build + groff, since the configuration script does check them. In order to produce HTML or XHTML output, you first require a working implementation of Ghostscript; either the AFPL Ghostscript or the GNU - Ghostscript implementation for MS-Windows should be suitable, depending on - your licensing preference. It is highly recommended to use version 8.11 - or higher due to bugs in older versions. These may be obtained, in the - form of self-installing binary packages, by following the download links - for the chosen licensing option, from + Ghostscript implementation for MS-Windows should be suitable, + depending on your licensing preference. It is highly recommended to + use version 8.11 or higher due to bugs in older versions. These may + be obtained, in the form of self-installing binary packages, by + following the download links for the chosen licensing option, from http://sourceforge.net/projects/ghostscript. - Please note that these packages install the Ghostscript interpreter required - by groff in the ./bin subdirectory of the Ghostscript installation - directory, with the name gswin32c.exe. However, groff expects this - interpreter to be located in the system PATH, with the name gs.exe. Thus, - to ensure that groff can correctly locate the Ghostscript interpreter, it is - recommended that the file gswin32c.exe should be copied from the Ghostscript - installation directory to the MSYS /usr/local/bin directory, where it should - be renamed to gs.exe. - - In addition to a working Ghostscript interpreter, you also require several - image manipulation utilities, all of which may be scavenged from various - packages available from http://sourceforge.net/projects/gnuwin32, and which - should be installed in the MSYS /usr/local/bin directory, or any other - suitable directory which is specified in the PATH. These additional + Please note that these packages install the Ghostscript interpreter + required by groff in the ./bin subdirectory of the Ghostscript + installation directory, with the name gswin32c.exe. However, groff + expects this interpreter to be located in the system PATH, with the + name gs.exe. Thus, to ensure that groff can correctly locate the + Ghostscript interpreter, it is recommended that the file gswin32c.exe + should be copied from the Ghostscript installation directory to the + MSYS /usr/local/bin directory, where it should be renamed to gs.exe. + + In addition to a working Ghostscript interpreter, you also require + several image manipulation utilities, all of which may be scavenged + from various packages available from + http://sourceforge.net/projects/gnuwin32, and which should be + installed in the MSYS /usr/local/bin directory, or any other suitable + directory which is specified in the PATH. These additional prerequisites are 1. from the netpbm--bin.zip package: @@ -223,84 +235,92 @@ psselect.exe - Note that it is not necessary to install the above four packages in their - entirety; of course, you may do so if you wish. + Note that it is not necessary to install the above four packages in + their entirety; of course, you may do so if you wish. - Further note that you are advised to avoid the netpbm-10.27 release from the - GnuWin32 download repository, as its pnmtopng.exe has been reported to fail - on even simple conversions, resulting in failure of the groff build process; - the earlier netpbm-10.18.4 has been found to work successfully. Also, you - may find it necessary to use libpng-1.2.7, rather than libpng-1.2.8, in - conjunction with this earlier release of netpbm. + Further note that you are advised to avoid the netpbm-10.27 release + from the GnuWin32 download repository, as its pnmtopng.exe has been + reported to fail on even simple conversions, resulting in failure of + the groff build process; the earlier netpbm-10.18.4 has been found to + work successfully. Also, you may find it necessary to use + libpng-1.2.7, rather than libpng-1.2.8, in conjunction with this + earlier release of netpbm. GROFF RUNTIME ENVIRONMENT ------------------------- - The runtime environment, provided to groff by MSYS, is essentially the same - as would be provided under a Unix or GNU/Linux operating system; thus, any - environment variables which may be used to customize the groff runtime - environment have similar effects under MSYS, as they would in Unix or - GNU/Linux, with the exception that any variable specifying a path should - adopt the same syntax as a native MS-Windows PATH specification. + The runtime environment, provided to groff by MSYS, is essentially the + same as would be provided under a Unix or GNU/Linux operating system; + thus, any environment variables which may be used to customize the + groff runtime environment have similar effects under MSYS, as they + would in Unix or GNU/Linux, with the exception that any variable + specifying a path should adopt the same syntax as a native MS-Windows + PATH specification. There is, however, one known problem which is associated with the - implementation of the MS-Windows file system, and the manner in which the - Microsoft runtime library (which is used by the MinGW implementation of GCC) - generates names for temporary files. This known problem arises when groff - is invoked with a current working directory which refers to a network share, - for which the user does not have write access in the root directory, and - there is no environment variable set to define a writeable location for - creating temporary files. When these conditions arise, groff fails with a - `permission denied' error, as soon as it tries to create any temporary file. - - To specify the location for creating temporary files, the standard Unix or - GNU/Linux implementation of groff provides the GROFF_TMPDIR or TMPDIR - environment variables, whereas MS-Windows applications generally use TMP or - TEMP; furthermore, the MS-Windows implementations of Ghostscript apparently - support the use of only TEMP or TMPDIR. - - To avoid problems with creation of temporary files, it is recommended that - you ensure that both TMP and TEMP are defined, with identical values, to - point to a suitable location for creating temporary files; many MS-Windows - boxes have them set already, and groff has been adapted to honour them, when - built in accordance with the preceding instructions, using MinGW. + implementation of the MS-Windows file system, and the manner in which + the Microsoft runtime library (which is used by the MinGW + implementation of GCC) generates names for temporary files. This + known problem arises when groff is invoked with a current working + directory which refers to a network share, for which the user does not + have write access in the root directory, and there is no environment + variable set to define a writeable location for creating temporary + files. When these conditions arise, groff fails with a `permission + denied' error, as soon as it tries to create any temporary file. + + To specify the location for creating temporary files, the standard + Unix or GNU/Linux implementation of groff provides the GROFF_TMPDIR or + TMPDIR environment variables, whereas MS-Windows applications + generally use TMP or TEMP; furthermore, the MS-Windows implementations + of Ghostscript apparently support the use of only TEMP or TMPDIR. + + To avoid problems with creation of temporary files, it is recommended + that you ensure that both TMP and TEMP are defined, with identical + values, to point to a suitable location for creating temporary files; + many MS-Windows boxes have them set already, and groff has been + adapted to honour them, when built in accordance with the preceding + instructions, using MinGW. CAVEATS AND BUGS ---------------- - There are two known issues, observed when running groff in the MinGW/MSYS - environment, which would not affect groff in its native Unix environment: + There are two known issues, observed when running groff in the + MinGW/MSYS environment, which would not affect groff in its native + Unix environment: o Running groff with the working directory set to a subdirectory of a - network share, where the user does not have write permission in the root - directory of the share, causes groff to fail with a `permission denied' - exception, if the TMP environment variable is not appropriately defined; - it may also be necessary to define the TEMP environment variable, to - avoid a similar failure mode, when using the -Thtml or -Txhtml output - mode of groff. This problem is more fully discussed in the preceding - section, GROFF RUNTIME ENVIRONMENT. + network share, where the user does not have write permission in the + root directory of the share, causes groff to fail with a `permission + denied' exception, if the TMP environment variable is not + appropriately defined; it may also be necessary to define the TEMP + environment variable, to avoid a similar failure mode, when using + the -Thtml or -Txhtml output mode of groff. This problem is more + fully discussed in the preceding section, GROFF RUNTIME ENVIRONMENT. o When running groff (or nroff) to process standard input, where the - standard input stream is obtained directly from the RXVT console provided - with MSYS, groff cannot detect the end-of-file condition for the standard - input stream, and hangs. This appears to be caused by a fault in the MSYS - implementation of RXVT; it may be worked around by either starting MSYS - without RXVT (see the comments in the MSYS.BAT startup script); in this - case standard input is terminated by typing followed by , - on a new input line. Alternatively, if you prefer to use MSYS with RXVT, - you can enter the interactive groff command in the form + standard input stream is obtained directly from the RXVT console + provided with MSYS, groff cannot detect the end-of-file condition + for the standard input stream, and hangs. This appears to be caused + by a fault in the MSYS implementation of RXVT; it may be worked + around by either starting MSYS without RXVT (see the comments in the + MSYS.BAT startup script); in this case standard input is terminated + by typing followed by , on a new input line. + Alternatively, if you prefer to use MSYS with RXVT, you can enter + the interactive groff command in the form cat | groff ... - in which case terminates the standard input stream, in just the - same way it does on a Unix system; the cat executable provided with MSYS - does seem to trap the end-of-file condition, and properly signals groff - that the input stream has terminated. + in which case terminates the standard input stream, in just + the same way it does on a Unix system; the cat executable provided + with MSYS does seem to trap the end-of-file condition, and properly + signals groff that the input stream has terminated. -##### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/TODO b/TODO index b098782..188054e 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,13 @@ -# Copyright (C) 2000-2018 Free Software Foundation, Inc. +# Copyright (C) 2000-2020 Free Software Foundation, Inc. # -# This file is part of `groffer' which is part of `groff'. +# This file is part of groff. # -# `groff' is free software; you can redistribute it and/or modify it +# groff is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # -# `groff' is distributed in the hope that it will be useful, but +# groff is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. @@ -27,8 +27,6 @@ Provide man.sun implementing .TX. Improve GROFF_PRINT macro in aclocal.m4. -Provide a `check' target. - Provide a `bindist' target. Implement tmac.bib in terms of tmac.s. diff --git a/acinclude.m4 b/acinclude.m4 index 000c5fc..e6eb680 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,6 +1,6 @@ # generated automatically by aclocal 1.14 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/aclocal.m4 b/aclocal.m4 index 74c41d5..af8878a 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) @@ -364,7 +364,7 @@ AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES -# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -379,7 +379,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.1], [], +m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -395,14 +395,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.1])dnl +[AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -452,9 +452,46 @@ AC_DEFUN([AM_AUX_DIR_EXPAND], am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) +# AM_COND_IF -*- Autoconf -*- + +# Copyright (C) 2008-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_COND_IF +# _AM_COND_ELSE +# _AM_COND_ENDIF +# -------------- +# These macros are only used for tracing. +m4_define([_AM_COND_IF]) +m4_define([_AM_COND_ELSE]) +m4_define([_AM_COND_ENDIF]) + +# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) +# --------------------------------------- +# If the shell condition COND is true, execute IF-TRUE, otherwise execute +# IF-FALSE. Allow automake to learn about conditional instantiating macros +# (the AC_CONFIG_FOOS). +AC_DEFUN([AM_COND_IF], +[m4_ifndef([_AM_COND_VALUE_$1], + [m4_fatal([$0: no such condition "$1"])])dnl +_AM_COND_IF([$1])dnl +if test -z "$$1_TRUE"; then : + m4_n([$2])[]dnl +m4_ifval([$3], +[_AM_COND_ELSE([$1])dnl +else + $3 +])dnl +_AM_COND_ENDIF([$1])dnl +fi[]dnl +]) + # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -485,7 +522,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -676,7 +713,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -715,7 +752,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi @@ -742,7 +781,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -770,6 +809,10 @@ m4_defn([AC_PROG_CC]) # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -806,7 +849,7 @@ m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl @@ -858,6 +901,20 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This @@ -939,7 +996,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -960,7 +1017,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -981,7 +1038,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1024,7 +1081,7 @@ AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1045,12 +1102,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then @@ -1063,7 +1115,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1092,7 +1144,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1139,7 +1191,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1158,7 +1210,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1239,7 +1291,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1299,7 +1351,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1327,7 +1379,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1346,7 +1398,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1480,7 +1532,7 @@ AC_SUBST([am__untar]) m4_include([gnulib_m4/00gnulib.m4]) m4_include([gnulib_m4/absolute-header.m4]) m4_include([gnulib_m4/alloca.m4]) -m4_include([gnulib_m4/asm-underscore.m4]) +m4_include([gnulib_m4/assert_h.m4]) m4_include([gnulib_m4/errno_h.m4]) m4_include([gnulib_m4/exponentd.m4]) m4_include([gnulib_m4/exponentf.m4]) @@ -1490,14 +1542,15 @@ m4_include([gnulib_m4/extern-inline.m4]) m4_include([gnulib_m4/float_h.m4]) m4_include([gnulib_m4/fpieee.m4]) m4_include([gnulib_m4/fprintf-posix.m4]) +m4_include([gnulib_m4/free.m4]) m4_include([gnulib_m4/frexp.m4]) m4_include([gnulib_m4/frexpl.m4]) m4_include([gnulib_m4/fseterr.m4]) m4_include([gnulib_m4/gnulib-common.m4]) m4_include([gnulib_m4/gnulib-comp.m4]) -m4_include([gnulib_m4/host-cpu-c-abi.m4]) m4_include([gnulib_m4/include_next.m4]) m4_include([gnulib_m4/intmax_t.m4]) +m4_include([gnulib_m4/inttypes.m4]) m4_include([gnulib_m4/inttypes_h.m4]) m4_include([gnulib_m4/isnand.m4]) m4_include([gnulib_m4/isnanf.m4]) @@ -1505,13 +1558,11 @@ m4_include([gnulib_m4/isnanl.m4]) m4_include([gnulib_m4/ldexpl.m4]) m4_include([gnulib_m4/libunistring-base.m4]) m4_include([gnulib_m4/limits-h.m4]) -m4_include([gnulib_m4/longlong.m4]) m4_include([gnulib_m4/math_h.m4]) m4_include([gnulib_m4/memchr.m4]) m4_include([gnulib_m4/mmap-anon.m4]) m4_include([gnulib_m4/multiarch.m4]) m4_include([gnulib_m4/nocrash.m4]) -m4_include([gnulib_m4/non-recursive-gnulib-prefix-hack.m4]) m4_include([gnulib_m4/off_t.m4]) m4_include([gnulib_m4/printf-frexp.m4]) m4_include([gnulib_m4/printf-frexpl.m4]) @@ -1520,12 +1571,15 @@ m4_include([gnulib_m4/signbit.m4]) m4_include([gnulib_m4/size_max.m4]) m4_include([gnulib_m4/snprintf.m4]) m4_include([gnulib_m4/ssize_t.m4]) +m4_include([gnulib_m4/stdbool.m4]) m4_include([gnulib_m4/stddef_h.m4]) m4_include([gnulib_m4/stdint.m4]) m4_include([gnulib_m4/stdint_h.m4]) m4_include([gnulib_m4/stdio_h.m4]) +m4_include([gnulib_m4/stdlib_h.m4]) m4_include([gnulib_m4/string_h.m4]) m4_include([gnulib_m4/sys_types_h.m4]) +m4_include([gnulib_m4/unistd_h.m4]) m4_include([gnulib_m4/vasnprintf.m4]) m4_include([gnulib_m4/vsnprintf.m4]) m4_include([gnulib_m4/warn-on-use.m4]) @@ -1535,4 +1589,5 @@ m4_include([gnulib_m4/wctype_h.m4]) m4_include([gnulib_m4/wcwidth.m4]) m4_include([gnulib_m4/wint_t.m4]) m4_include([gnulib_m4/xsize.m4]) +m4_include([gnulib_m4/zzgnulib.m4]) m4_include([acinclude.m4]) diff --git a/arch/djgpp/README b/arch/djgpp/README index 48993dc..90a5a6d 100644 --- a/arch/djgpp/README +++ b/arch/djgpp/README @@ -1,4 +1,4 @@ - Copyright (C) 2000-2018 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided diff --git a/arch/djgpp/config.bat b/arch/djgpp/config.bat index 8657ff6..ba9d1c6 100644 --- a/arch/djgpp/config.bat +++ b/arch/djgpp/config.bat @@ -1,4 +1,4 @@ -Rem Copyright (C) 2000-2018 Free Software Foundation, Inc. +Rem Copyright (C) 2000-2020 Free Software Foundation, Inc. Rem Rem This configure script is free software; the Free Software Foundation Rem gives unlimited permission to copy, distribute and modify it. diff --git a/arch/djgpp/config.sed b/arch/djgpp/config.sed index 9e4a50f..72c5fb1 100644 --- a/arch/djgpp/config.sed +++ b/arch/djgpp/config.sed @@ -1,4 +1,4 @@ -# Copyright (C) 2000-2018 Free Software Foundation, Inc. +# Copyright (C) 2000-2020 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. diff --git a/arch/djgpp/config.site b/arch/djgpp/config.site index c1e5650..a463ad9 100644 --- a/arch/djgpp/config.site +++ b/arch/djgpp/config.site @@ -1,6 +1,6 @@ #! /bin/sh -# Copyright (C) 2000-2018 Free Software Foundation, Inc. +# Copyright (C) 2000-2020 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. diff --git a/arch/djgpp/t-groff.bat b/arch/djgpp/t-groff.bat index c78fccf..8960b7a 100644 --- a/arch/djgpp/t-groff.bat +++ b/arch/djgpp/t-groff.bat @@ -1,4 +1,4 @@ -Rem Copyright (C) 2000-2018 Free Software Foundation, Inc. +Rem Copyright (C) 2000-2020 Free Software Foundation, Inc. Rem Rem This file is part of groff. Rem @@ -72,7 +72,7 @@ set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refe echo I will use this command to format a document and print it on an LBP printer: roff\groff\groff -V -e -s -t -p -R -me -Tlbp ../doc/meintro.me pause -Rem Uncomment the following if you have a Canon CAPSL LBP-4 or LBP-8 printer: +Rem Uncomment the following if you have a Canon CaPSL LBP-4 or LBP-8 printer: REM roff\groff\groff -e -s -t -p -R -me -Tlbp ../doc/meintro.me >>prn Rem set PATH=%PATH1% diff --git a/arch/mingw/grap2graph.cmd b/arch/mingw/grap2graph.cmd index 6b26cc9..5ee9e5a 100644 --- a/arch/mingw/grap2graph.cmd +++ b/arch/mingw/grap2graph.cmd @@ -75,7 +75,7 @@ rm -rf %tdir% goto end :version -echo GNU grap2graph (groff) version 1.22.4 +echo GNU grap2graph (groff) version 1.23.0 goto end :usage diff --git a/arch/mingw/groffer.cmd b/arch/mingw/groffer.cmd deleted file mode 100644 index 3fb18d4..0000000 --- a/arch/mingw/groffer.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -perl %~dpn0 %* diff --git a/arch/mingw/mingw.am b/arch/mingw/mingw.am index 389453c..4badf5a 100644 --- a/arch/mingw/mingw.am +++ b/arch/mingw/mingw.am @@ -1,6 +1,4 @@ -# Copyright (C) 2014-2018 Free Software Foundation, Inc. -# -# Last update: 13 Aug 2015 +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -25,7 +23,6 @@ WINSCRIPTS=\ arch/mingw/gperl.cmd \ arch/mingw/gpinyin.cmd \ arch/mingw/grap2graph.cmd \ - arch/mingw/groffer.cmd \ arch/mingw/grog.cmd \ arch/mingw/gropdf.cmd \ arch/mingw/mmroff.cmd \ @@ -45,8 +42,8 @@ EXTRA_DIST += $(WINSCRIPTS) endif -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/arch/misc/misc.am b/arch/misc/misc.am index 2c3a1c8..f8237cc 100644 --- a/arch/misc/misc.am +++ b/arch/misc/misc.am @@ -1,33 +1,35 @@ -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2023 Free Software Foundation, Inc. # Original Makefile.sub written by Keith Marshall -# (keith.d.marshall@ntlworld.com). -# Adapted to Automake by Bertrand Garrigues (bertrand.garrigues@laposte.net). -# -# Last update: 13 Aug 2015 +# . +# Adapted to Automake by Bertrand Garrigues +# . # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -EXTRA_DIST += arch/misc/shdeps.sh + +arch_shdeps_sh = arch/misc/shdeps.sh +EXTRA_DIST += $(arch_shdeps_sh) MOSTLYCLEANFILES += shdeps.sed -shdeps.sed: $(top_srcdir)/arch/misc/shdeps.sh - $(SHELL) $(top_srcdir)/arch/misc/shdeps.sh "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ +$(SH_DEPS_SED_SCRIPT): $(top_srcdir)/$(arch_shdeps_sh) + $(AM_V_GEN)$(SHELL) $(top_srcdir)/$(arch_shdeps_sh) \ + "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/arch/misc/shdeps.sh b/arch/misc/shdeps.sh index c38a859..844b368 100644 --- a/arch/misc/shdeps.sh +++ b/arch/misc/shdeps.sh @@ -1,7 +1,7 @@ #! /bin/sh # shdeps.sh: Generate OS dependency fixups, for 'groff' shell scripts # -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # Written by Keith Marshall (keith.d.marshall@ntlworld.com) # # Invoked only by 'make', as: diff --git a/build-aux/compile b/build-aux/compile index 99e5052..df363c8 100755 --- a/build-aux/compile +++ b/build-aux/compile @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -53,7 +53,7 @@ func_file_conv () MINGW*) file_conv=mingw ;; - CYGWIN*) + CYGWIN* | MSYS*) file_conv=cygwin ;; *) @@ -67,7 +67,7 @@ func_file_conv () mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; - cygwin/*) + cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) diff --git a/build-aux/config.guess b/build-aux/config.guess index b33c9e8..69188da 100755 --- a/build-aux/config.guess +++ b/build-aux/config.guess @@ -1,12 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. -timestamp='2018-08-29' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2023-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -27,11 +29,19 @@ timestamp='2018-08-29' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ @@ -50,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,6 +94,9 @@ if test $# != 0; then exit 1 fi +# Just in case it came from the environment. +GUESS= + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -96,12 +109,13 @@ fi tmp= # shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 -trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 + # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || @@ -111,7 +125,7 @@ set_cc_for_build() { ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" + CC_FOR_BUILD=$driver break fi done @@ -132,14 +146,12 @@ fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "$UNAME_SYSTEM" in +case $UNAME_SYSTEM in Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu + LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" @@ -148,24 +160,37 @@ Linux|GNU|GNU/*) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc - #else + #elif defined(__GLIBC__) LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -177,12 +202,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; @@ -191,13 +216,13 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown + machine=${arch}${endian}-unknown ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; @@ -218,7 +243,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ;; esac # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` @@ -229,7 +254,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; @@ -240,45 +265,57 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; + GUESS=$UNAME_MACHINE-unknown-redox + ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -292,7 +329,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") @@ -329,112 +366,121 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - case `isainfo -b` in - 32) - echo i386-pc-solaris2"$UNAME_REL" - ;; - 64) - echo x86_64-pc-solaris2"$UNAME_REL" - ;; - esac - exit ;; + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in + case `/bin/arch` in sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -444,41 +490,41 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -506,75 +552,76 @@ EOF dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux"$UNAME_RELEASE" + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux"$UNAME_RELEASE" + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build @@ -591,16 +638,16 @@ EOF EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then @@ -608,56 +655,56 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; + GUESS=rs6000-ibm-aix + ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in + case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in + case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then + if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -696,7 +743,7 @@ EOF test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if test "$HP_ARCH" = hppa2.0w then set_cc_for_build @@ -717,12 +764,12 @@ EOF HP_ARCH=hppa64 fi fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -752,36 +799,36 @@ EOF EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo "$UNAME_MACHINE"-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -789,17 +836,18 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ @@ -807,114 +855,135 @@ EOF -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi - exit ;; + ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case "$UNAME_PROCESSOR" in + case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case "$UNAME_MACHINE" in + case $UNAME_MACHINE in x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix - exit ;; + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -925,183 +994,236 @@ EOF esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" - test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; + GUESS=or1k-unknown-linux-$LIBC + ;; or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64le-unknown-linux-$LIBC + ;; ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1109,12 +1231,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1124,11 +1246,11 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about @@ -1136,31 +1258,31 @@ EOF # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1185,250 +1307,407 @@ EOF /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv"$UNAME_RELEASE" + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build fi - if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; + GUESS=i386-pc-qnx + ;; NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; - i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + echo "$0: unable to guess system type" >&2 -case "$UNAME_MACHINE:$UNAME_SYSTEM" in +case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <, 1996 # @@ -371,7 +371,7 @@ else hardcode_direct=yes hardcode_minus_L=yes ;; - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; @@ -547,7 +547,7 @@ case "$host_os" in freebsd[23].*) library_names_spec='$libname$shrext$versuffix' ;; - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) library_names_spec='$libname$shrext' ;; gnu*) diff --git a/build-aux/config.sub b/build-aux/config.sub index b51fb8c..de4259e 100755 --- a/build-aux/config.sub +++ b/build-aux/config.sub @@ -1,12 +1,14 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. -timestamp='2018-08-29' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2023-01-21' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -33,7 +35,7 @@ timestamp='2018-08-29' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -50,6 +52,13 @@ timestamp='2018-08-29' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ @@ -67,7 +76,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -89,7 +98,7 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) @@ -111,9 +120,12 @@ case $# in esac # Split fields of configuration type -IFS="-" read -r field1 field2 field3 field4 <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1525,6 +1531,7 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. +kernel= case $cpu-$vendor in score-*) os=elf @@ -1536,7 +1543,8 @@ case $cpu-$vendor in os=riscix1.2 ;; arm*-rebel) - os=linux + kernel=linux + os=gnu ;; arm*-semi) os=aout @@ -1702,84 +1710,193 @@ case $cpu-$vendor in os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* | mlibc* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + kernel* ) + # Restricted further below + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) + ;; + uclinux-uclibc* ) + ;; + managarm-mlibc* | managarm-kernel* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel* ) + echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel* ) + echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) - case $os in - riscix*) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - sunos*) + *-sunos*) vendor=sun ;; - cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - beos*) + *-beos*) vendor=be ;; - hpux*) + *-hpux*) vendor=hp ;; - mpeix*) + *-mpeix*) vendor=hp ;; - hiux*) + *-hiux*) vendor=hitachi ;; - unos*) + *-unos*) vendor=crds ;; - dgux*) + *-dgux*) vendor=dg ;; - luna*) + *-luna*) vendor=omron ;; - genix*) + *-genix*) vendor=ns ;; - clix*) + *-clix*) vendor=intergraph ;; - mvs* | opened*) + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) vendor=ibm ;; - os400*) + s390-* | s390x-*) vendor=ibm ;; - ptx*) + *-ptx*) vendor=sequent ;; - tpf*) + *-tpf*) vendor=ibm ;; - vxsim* | vxworks* | windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - aux*) + *-aux*) vendor=apple ;; - hms*) + *-hms*) vendor=hitachi ;; - mpw* | macos*) + *-mpw* | *-macos*) vendor=apple ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - vos*) + *-vos*) vendor=stratus ;; esac ;; esac -echo "$cpu-$vendor-$os" +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: diff --git a/build-aux/depcomp b/build-aux/depcomp index 65cbf70..ce5c2f7 100755 --- a/build-aux/depcomp +++ b/build-aux/depcomp @@ -1,9 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2018-03-07.03; # UTC +scriptversion=2022-09-18.14; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2023 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -113,7 +113,6 @@ nl=' # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz -digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then @@ -198,7 +197,7 @@ gcc3) ;; gcc) -## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen index 6d073fc..a72057b 100755 --- a/build-aux/git-version-gen +++ b/build-aux/git-version-gen @@ -1,12 +1,12 @@ #!/bin/sh # Print a version string. -scriptversion=2018-03-07.03; # UTC +scriptversion=2022-07-09.08; # UTC -# Copyright (C) 2007-2018 Free Software Foundation, Inc. +# Copyright (C) 2007-2023 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, @@ -65,19 +65,21 @@ scriptversion=2018-03-07.03; # UTC # EXTRA_DIST = $(top_srcdir)/.version # BUILT_SOURCES = $(top_srcdir)/.version # $(top_srcdir)/.version: -# echo $(VERSION) > $@-t && mv $@-t $@ +# echo '$(VERSION)' > $@-t +# mv $@-t $@ # dist-hook: -# echo $(VERSION) > $(distdir)/.tarball-version +# echo '$(VERSION)' > $(distdir)/.tarball-version me=$0 +year=`expr "$scriptversion" : '\([^-]*\)'` version="git-version-gen $scriptversion -Copyright 2011 Free Software Foundation, Inc. -There is NO warranty. You may redistribute this software -under the terms of the GNU General Public License. -For more information about these matters, see the files named COPYING." +Copyright (C) ${year} Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later . +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law." usage="\ Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT] @@ -92,7 +94,7 @@ Options: --help display this help and exit --version output version information and exit -Running without arguments will suffice in most cases." +Send patches and bug reports to ." prefix=v fallback= @@ -141,11 +143,9 @@ then v=`cat $tarball_version_file` || v= case $v in *$nl*) v= ;; # reject multi-line output - [0-9]*) ;; - *) v= ;; esac test "x$v" = x \ - && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2 + && echo "$0: WARNING: $tarball_version_file is damaged" 1>&2 fi if test "x$v" != x diff --git a/build-aux/install-sh b/build-aux/install-sh index 8175c64..ec298b5 100755 --- a/build-aux/install-sh +++ b/build-aux/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -99,18 +104,28 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,8 +152,13 @@ while test $# -ne 0; do -o) chowncmd="$chownprog $2" shift;; + -p) cpprog="$cpprog -p";; + -s) stripcmd=$stripprog;; + -S) backupsuffix="$2" + shift;; + -t) is_target_a_directory=always dst_arg=$2 @@ -255,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -301,22 +325,6 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -326,52 +334,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # Note that $RANDOM variable is not portable (e.g. dash); Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p' feature. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -382,7 +387,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -411,7 +416,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 @@ -451,7 +456,18 @@ do trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -477,6 +493,13 @@ do then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -491,9 +514,9 @@ do # file should still install successfully. { test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || + $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 diff --git a/build-aux/missing b/build-aux/missing index 625aeb1..1fe1611 100755 --- a/build-aux/missing +++ b/build-aux/missing @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify diff --git a/build-aux/prefix-gnulib-mk b/build-aux/prefix-gnulib-mk deleted file mode 100755 index 544654f..0000000 --- a/build-aux/prefix-gnulib-mk +++ /dev/null @@ -1,229 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"' - & eval 'exec perl -wS "$0" $argv:q' - if 0; - -use strict; -use IO::File; -use Getopt::Long; -use File::Basename; # for dirname - -my $VERSION = '2012-01-21 17:13'; # UTC -(my $ME = $0) =~ s|.*/||; - -my $prefix; -my $lib_name; - -sub usage ($) -{ - my ($exit_code) = @_; - my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); - if ($exit_code != 0) - { - print $STREAM "Try '$ME --help' for more information.\n"; - } - else - { - print $STREAM <getline or die "$file"; - $f->close; - return $contents; -} - -# prefix_word ($WORD) -# ------------------- -# Do not prefix special words such as variable dereferences. Also, -# "Makefile" is really "Makefile", since precisely there is no -# lib/Makefile. -sub prefix_word ($) -{ - local ($_) = @_; - $_ = $prefix . $_ - unless (/^-/ || m{^\$\(\w+\)} || $_ eq "Makefile" || $_ eq '\\' - || $_ eq '@ALLOCA@'); - return $_; -} - - -# prefix_words ($TEXT) -# -------------------- -sub prefix_words ($) -{ - local ($_) = @_; - s{(\S+)}{prefix_word($1)}gem; - return $_; -} - - -# prefix_assignment ($LHS-AND-ASSIGN-OP, $RHS) -# -------------------------------------------- -sub prefix_assignment ($$) -{ - my ($lhs_and_assign_op, $rhs) = @_; - my $res; - - # Some variables are initialized by gnulib.mk, and we don't want - # that. Change '=' to '+='. - if ($lhs_and_assign_op =~ /^(GPERF|V_GPERF.*) =$/) - { - # Do not change the RHS, which specifies the GPERF program. - } - elsif ($lhs_and_assign_op =~ - /^(SUBDIRS|EXTRA_DIST|BUILT_SOURCES|SUFFIXES|MOSTLYCLEANFILES - |CLEANFILES|DISTCLEANFILES|MAINTAINERCLEANFILES|AM_CFLAGS - |AM_CPPFLAGS|AM_GNU_GETTEXT)\ =/x) - { - $lhs_and_assign_op =~ s/=/+=/; - } - # We don't want to inherit gnulib's AUTOMAKE_OPTIONS, comment them. - elsif ($lhs_and_assign_op =~ /^AUTOMAKE_OPTIONS =/) - { - $lhs_and_assign_op =~ s/^/# /; - } - elsif ($lhs_and_assign_op =~ /^SUFFIXES /) - { - # Elide any SUFFIXES assignment or concatenation. - $lhs_and_assign_op =~ s/^/# /; - } - # The words are (probably) paths to files in lib/: prefix them. - else - { - $rhs = prefix_words($rhs) - } - - # Variables which name depend on the location: libbison_a_SOURCES => - # lib_libbison_a_SOURCES. - $lhs_and_assign_op =~ s/($lib_name)/lib_$1/g; - - return $lhs_and_assign_op . $rhs; -} - -# prefix $CONTENTS -# ---------------- -# $CONTENTS is a Makefile content. Post-process it so that each file-name -# is prefixed with $prefix (e.g., "lib/"). -# -# Relies heavily on the regularity of the file generated by gnulib-tool. -sub prefix ($) -{ - # Work on $_. - local ($_) = @_; - - # Prefix all the occurrence of files in rules. If there is nothing - # after in the :, it's probably a phony target, or a suffix rule. - # Don't touch it. - s{^([-\w+/]+\.[-\w.]+ *: *\S.*)$} - {prefix_words($1)}gem; - - # Prefix files in variables. - s{^([\w.]+\s*\+?=)(.*)$} - {prefix_assignment($1, $2)}gem; - - # $(srcdir)/ is actually $(top_srcdir)/$prefix/. - # The trailing slash is required to avoid matching this rule: - # test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile - s{\$\(srcdir\)/}{\$(top_srcdir)/$prefix}g; - - # Sometimes, t-$@ is used instead of $@-t, which, of course, does - # not work when we have a $@ with a directory in it. - s{t-\$\@}{\$\@-t}g; - - # Some AC_SUBST patterns remain and would better be Make macros. - s{\@(MKDIR_P)\@}{\$($1)}g; - - # Adjust paths in mkdir. - s{(\$\(MKDIR_P\))\s*(\w+)}{$1 $prefix$2}g; - - return $_; -} - -# process ($IN) -# ------------- -sub process ($) -{ - my ($file) = @_; - my ($bak) = "$file.bak"; - rename ($file, $bak) or die "$ME: rename $file $bak failed: $!\n"; - my $contents = contents ($bak); - $contents = prefix ($contents); - my $out = new IO::File(">$file") - or die "$ME: $file: failed to open for writing: $!\n"; - print $out $contents; -} - -{ - GetOptions - ( - 'lib-name=s' => \$lib_name, - help => sub { usage 0 }, - version => sub { print "$ME version $VERSION\n"; exit }, - ) or usage 1; - - my $fail = 0; - defined $lib_name - or (warn "$ME: no library name; use --lib-name=NAME\n"), $fail = 1; - - # There must be exactly one argument. - @ARGV == 0 - and (warn "$ME: missing FILE argument\n"), $fail = 1; - 1 < @ARGV - and (warn "$ME: too many arguments:\n", join ("\n", @ARGV), "\n"), - $fail = 1; - $fail - and usage 1; - - my $file = $ARGV[0]; - $prefix = (dirname $file) . '/'; - warn "prefix=$prefix\n"; - - process $file; -} - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## eval: (add-hook 'before-save-hook 'time-stamp) -## time-stamp-start: "my $VERSION = '" -## time-stamp-format: "%:y-%02m-%02d %02H:%02M" -## time-stamp-time-zone: "UTC0" -## time-stamp-end: "'; # UTC" -## End: diff --git a/build-aux/test-driver b/build-aux/test-driver index b8521a4..be73b80 100755 --- a/build-aux/test-driver +++ b/build-aux/test-driver @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,11 +42,13 @@ print_usage () { cat <$log_file 2>&1 +# Test script is run here. We create the file first, then append to it, +# to ameliorate tests themselves also writing to the log file. Our tests +# don't, but others can (automake bug#35762). +: >"$log_file" +"$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then @@ -126,7 +131,7 @@ esac # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). -echo "$res $test_name (exit status: $estatus)" >>$log_file +echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" diff --git a/build-aux/ylwrap b/build-aux/ylwrap index 5943168..e8ec109 100755 --- a/build-aux/ylwrap +++ b/build-aux/ylwrap @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # Written by Tom Tromey . # diff --git a/configure b/configure index 783de81..f55665a 100755 --- a/configure +++ b/configure @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GNU Troff 1.22.4. +# Generated by GNU Autoconf 2.71 for GNU roff 1.23.0. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -187,42 +169,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -230,14 +223,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -255,18 +255,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: http://savannah.gnu.org/bugs/?group=groff about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run @@ -294,6 +295,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -311,6 +313,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -325,7 +335,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -334,7 +344,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -373,12 +383,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -390,18 +401,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -413,9 +433,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -442,7 +462,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -486,7 +506,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -500,6 +520,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -513,6 +537,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -578,113 +609,98 @@ MFLAGS= MAKEFLAGS= # Identity of this package. -PACKAGE_NAME='GNU Troff' +PACKAGE_NAME='GNU roff' PACKAGE_TARNAME='groff' -PACKAGE_VERSION='1.22.4' -PACKAGE_STRING='GNU Troff 1.22.4' +PACKAGE_VERSION='1.23.0' +PACKAGE_STRING='GNU roff 1.23.0' PACKAGE_BUGREPORT='http://savannah.gnu.org/bugs/?group=groff' -PACKAGE_URL='http://www.gnu.org/software/groff/' +PACKAGE_URL='https://www.gnu.org/software/groff/' ac_unique_file="src/roff/groff/groff.cpp" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" -ac_func_list= -ac_header_list= -ac_config_libobj_dir=lib -ac_subst_vars='gltests_LTLIBOBJS +ac_header_c_list= +ac_func_c_list= +ac_subst_vars='gltests_LIBOBJDEPS +gltests_LTLIBOBJS gltests_LIBOBJS +gl_LIBOBJDEPS gl_LTLIBOBJS gl_LIBOBJS am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS +USE_TEX_FALSE +USE_TEX_TRUE HAVE_TEXI2DVI_FALSE HAVE_TEXI2DVI_TRUE -HAVE_PDFTOOLS_FALSE -HAVE_PDFTOOLS_TRUE -INSTALL_SHIPPED_HTML_FALSE -INSTALL_SHIPPED_HTML_TRUE -BUILD_EXAMPLES_FALSE -BUILD_EXAMPLES_TRUE -BUILD_OTHERDOC_FALSE -BUILD_OTHERDOC_TRUE -BUILD_PDFEXAMPLES_FALSE -BUILD_PDFEXAMPLES_TRUE -BUILD_PDFDOC_FALSE -BUILD_PDFDOC_TRUE -BUILD_HTMLEXAMPLES_FALSE -BUILD_HTMLEXAMPLES_TRUE -BUILD_HTML_FALSE -BUILD_HTML_TRUE -BUILD_INFODOC_FALSE -BUILD_INFODOC_TRUE +HAVE_URW_FONTS_FALSE +HAVE_URW_FONTS_TRUE +HAVE_GHOSTSCRIPT_FALSE +HAVE_GHOSTSCRIPT_TRUE +USE_GROFF_ALLOCATOR_FALSE +USE_GROFF_ALLOCATOR_TRUE +USE_GROPDF_FALSE +USE_GROPDF_TRUE +USE_PDFROFF_FALSE +USE_PDFROFF_TRUE +USE_GROHTML_FALSE +USE_GROHTML_TRUE USEPROGRAMPREFIX_FALSE USEPROGRAMPREFIX_TRUE -MAKE_DONT_HAVE_RM_FALSE -MAKE_DONT_HAVE_RM_TRUE +MAKE_DEFINES_RM_FALSE +MAKE_DEFINES_RM_TRUE WITHOUT_X11_FALSE WITHOUT_X11_TRUE BUILD_WINSCRIPTS_FALSE BUILD_WINSCRIPTS_TRUE -groff_have_urw_fonts BASH_PROG HAVE_TEST_EF_OPTION DIFF_PROG GDIFF pnmtops_nosetpage -make_uninstall_pdfexamples -make_install_pdfexamples -make_pdfexamples -make_uninstall_pdfdoc -make_install_pdfdoc -make_pdfdoc +pnmtools_quiet +use_gropdf +urwfontsdir +groff_have_urw_fonts +use_pdfroff ac_ct_AWK ALT_AWK_PROGS -make_uninstall_htmlexamples -make_install_htmlexamples -make_htmlexamples -make_uninstall_htmldoc -make_install_htmldoc make_htmldoc -pnmtops psselect +pnmtops pnmtopng -pnmcrop pnmcut +pnmcrop ac_ct_GHOSTSCRIPT GHOSTSCRIPT ALT_GHOSTSCRIPT_PROGS @@ -695,7 +711,6 @@ sys_tmac_prefix g PAGE BROKEN_SPOOLER_FLAGS -urwfontsdir LIBOBJS LIBEXT LTLIBICONV @@ -704,9 +719,6 @@ CXXCPP LIBM LIBC SH_SCRIPT_SED_CMD -PDFIMAGES -PDFFONTS -PDFINFO UCHARDET_LIBS UCHARDET_CFLAGS PKG_CONFIG_LIBDIR @@ -715,20 +727,9 @@ PKG_CONFIG XPMTOPPM LN_S INSTALL_INFO +PROG_TEX PROG_TEXI2DVI -makeinfo_version_numeric -make_uninstall_infodoc -make_install_infodoc -make_infodoc -make_uninstall_examples -make_install_examples -make_examples -make_uninstall_otherdoc -make_install_otherdoc -make_otherdoc -make_uninstall_shipped_htmldoc -make_install_shipped_htmldoc -doc_dist_target_ok +M4 YACC DVIPRINT PSPRINT @@ -738,8 +739,7 @@ LPR PERL_VERSION SED PERL -groffer_dir -appresdir +appdefdir XLIBDIRS XPROGDIRS XDEVDIRS @@ -753,26 +753,78 @@ OTHERDEVDIRS TTYDEVDIRS LIBGNU_LTLIBDEPS LIBGNU_LIBDEPS +GL_CFLAG_GNULIB_WARNINGS +GL_CFLAG_ALLOW_WARNINGS gltests_WITNESS +GL_COND_OBJ_WCWIDTH_FALSE +GL_COND_OBJ_WCWIDTH_TRUE +GL_GNULIB_TOWCTRANS +GL_GNULIB_WCTRANS +GL_GNULIB_ISWCTYPE +GL_GNULIB_WCTYPE +GL_GNULIB_ISWXDIGIT +GL_GNULIB_ISWDIGIT +GL_GNULIB_ISWBLANK REPLACE_TOWLOWER REPLACE_ISWCNTRL HAVE_WCTYPE_H NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H NEXT_WCTYPE_H HAVE_ISWCNTRL +REPLACE_ISWXDIGIT +REPLACE_ISWDIGIT REPLACE_ISWBLANK HAVE_WCTRANS_T HAVE_WCTYPE_T HAVE_ISWBLANK -GNULIB_TOWCTRANS -GNULIB_WCTRANS -GNULIB_ISWCTYPE -GNULIB_WCTYPE -GNULIB_ISWBLANK +GL_GNULIB_MDA_WCSDUP +GL_GNULIB_WCSFTIME +GL_GNULIB_WCSWIDTH +GL_GNULIB_WCSTOK +GL_GNULIB_WCSSTR +GL_GNULIB_WCSPBRK +GL_GNULIB_WCSSPN +GL_GNULIB_WCSCSPN +GL_GNULIB_WCSRCHR +GL_GNULIB_WCSCHR +GL_GNULIB_WCSDUP +GL_GNULIB_WCSXFRM +GL_GNULIB_WCSCOLL +GL_GNULIB_WCSNCASECMP +GL_GNULIB_WCSCASECMP +GL_GNULIB_WCSNCMP +GL_GNULIB_WCSCMP +GL_GNULIB_WCSNCAT +GL_GNULIB_WCSCAT +GL_GNULIB_WCPNCPY +GL_GNULIB_WCSNCPY +GL_GNULIB_WCPCPY +GL_GNULIB_WCSCPY +GL_GNULIB_WCSNLEN +GL_GNULIB_WCSLEN +GL_GNULIB_WMEMSET +GL_GNULIB_WMEMPCPY +GL_GNULIB_WMEMMOVE +GL_GNULIB_WMEMCPY +GL_GNULIB_WMEMCMP +GL_GNULIB_WMEMCHR +GL_GNULIB_WCWIDTH +GL_GNULIB_WCSNRTOMBS +GL_GNULIB_WCSRTOMBS +GL_GNULIB_WCRTOMB +GL_GNULIB_MBSNRTOWCS +GL_GNULIB_MBSRTOWCS +GL_GNULIB_MBRLEN +GL_GNULIB_MBRTOWC +GL_GNULIB_MBSINIT +GL_GNULIB_WCTOB +GL_GNULIB_BTOWC HAVE_CRTDEFS_H HAVE_WINT_T NEXT_AS_FIRST_DIRECTIVE_WCHAR_H NEXT_WCHAR_H +REPLACE_WMEMPCPY +REPLACE_WCSTOK REPLACE_WCSFTIME REPLACE_WCSWIDTH REPLACE_WCWIDTH @@ -788,6 +840,7 @@ REPLACE_WCTOB REPLACE_BTOWC REPLACE_MBSTATE_T HAVE_DECL_WCWIDTH +HAVE_DECL_WCSDUP HAVE_DECL_WCTOB HAVE_WCSFTIME HAVE_WCSWIDTH @@ -814,6 +867,7 @@ HAVE_WCSCPY HAVE_WCSNLEN HAVE_WCSLEN HAVE_WMEMSET +HAVE_WMEMPCPY HAVE_WMEMMOVE HAVE_WMEMCPY HAVE_WMEMCMP @@ -827,95 +881,277 @@ HAVE_MBRLEN HAVE_MBRTOWC HAVE_MBSINIT HAVE_BTOWC -GNULIB_WCSFTIME -GNULIB_WCSWIDTH -GNULIB_WCSTOK -GNULIB_WCSSTR -GNULIB_WCSPBRK -GNULIB_WCSSPN -GNULIB_WCSCSPN -GNULIB_WCSRCHR -GNULIB_WCSCHR -GNULIB_WCSDUP -GNULIB_WCSXFRM -GNULIB_WCSCOLL -GNULIB_WCSNCASECMP -GNULIB_WCSCASECMP -GNULIB_WCSNCMP -GNULIB_WCSCMP -GNULIB_WCSNCAT -GNULIB_WCSCAT -GNULIB_WCPNCPY -GNULIB_WCSNCPY -GNULIB_WCPCPY -GNULIB_WCSCPY -GNULIB_WCSNLEN -GNULIB_WCSLEN -GNULIB_WMEMSET -GNULIB_WMEMMOVE -GNULIB_WMEMCPY -GNULIB_WMEMCMP -GNULIB_WMEMCHR -GNULIB_WCWIDTH -GNULIB_WCSNRTOMBS -GNULIB_WCSRTOMBS -GNULIB_WCRTOMB -GNULIB_MBSNRTOWCS -GNULIB_MBSRTOWCS -GNULIB_MBRLEN -GNULIB_MBRTOWC -GNULIB_MBSINIT -GNULIB_WCTOB -GNULIB_BTOWC LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE LIBUNISTRING_UNIWIDTH_H LIBUNISTRING_UNITYPES_H +GL_GNULIB_MDA_WRITE +GL_GNULIB_MDA_UNLINK +GL_GNULIB_MDA_SWAB +GL_GNULIB_MDA_RMDIR +GL_GNULIB_MDA_READ +GL_GNULIB_MDA_LSEEK +GL_GNULIB_MDA_ISATTY +GL_GNULIB_MDA_GETPID +GL_GNULIB_MDA_GETCWD +GL_GNULIB_MDA_EXECVPE +GL_GNULIB_MDA_EXECVP +GL_GNULIB_MDA_EXECVE +GL_GNULIB_MDA_EXECV +GL_GNULIB_MDA_EXECLP +GL_GNULIB_MDA_EXECLE +GL_GNULIB_MDA_EXECL +GL_GNULIB_MDA_DUP2 +GL_GNULIB_MDA_DUP +GL_GNULIB_MDA_CLOSE +GL_GNULIB_MDA_CHDIR +GL_GNULIB_MDA_ACCESS +GL_GNULIB_WRITE +GL_GNULIB_USLEEP +GL_GNULIB_UNLINKAT +GL_GNULIB_UNLINK +GL_GNULIB_UNISTD_H_SIGPIPE +GL_GNULIB_UNISTD_H_NONBLOCKING +GL_GNULIB_UNISTD_H_GETOPT +GL_GNULIB_TTYNAME_R +GL_GNULIB_TRUNCATE +GL_GNULIB_SYMLINKAT +GL_GNULIB_SYMLINK +GL_GNULIB_SLEEP +GL_GNULIB_SETHOSTNAME +GL_GNULIB_RMDIR +GL_GNULIB_READLINKAT +GL_GNULIB_READLINK +GL_GNULIB_READ +GL_GNULIB_PWRITE +GL_GNULIB_PREAD +GL_GNULIB_PIPE2 +GL_GNULIB_PIPE +GL_GNULIB_LSEEK +GL_GNULIB_LINKAT +GL_GNULIB_LINK +GL_GNULIB_LCHOWN +GL_GNULIB_ISATTY +GL_GNULIB_GROUP_MEMBER +GL_GNULIB_GETUSERSHELL +GL_GNULIB_GETPASS_GNU +GL_GNULIB_GETPASS +GL_GNULIB_GETPAGESIZE +GL_GNULIB_GETOPT_POSIX +GL_GNULIB_GETLOGIN_R +GL_GNULIB_GETLOGIN +GL_GNULIB_GETHOSTNAME +GL_GNULIB_GETGROUPS +GL_GNULIB_GETENTROPY +GL_GNULIB_GETDTABLESIZE +GL_GNULIB_GETDOMAINNAME +GL_GNULIB_GETCWD +GL_GNULIB_FTRUNCATE +GL_GNULIB_FSYNC +GL_GNULIB_FDATASYNC +GL_GNULIB_FCHOWNAT +GL_GNULIB_FCHDIR +GL_GNULIB_FACCESSAT +GL_GNULIB_EXECVPE +GL_GNULIB_EXECVP +GL_GNULIB_EXECVE +GL_GNULIB_EXECV +GL_GNULIB_EXECLP +GL_GNULIB_EXECLE +GL_GNULIB_EXECL +GL_GNULIB_EUIDACCESS +GL_GNULIB_ENVIRON +GL_GNULIB_DUP3 +GL_GNULIB_DUP2 +GL_GNULIB_DUP +GL_GNULIB_COPY_FILE_RANGE +GL_GNULIB_CLOSE +GL_GNULIB_CHOWN +GL_GNULIB_CHDIR +GL_GNULIB_ACCESS +HAVE_UNISTD_H +NEXT_AS_FIRST_DIRECTIVE_UNISTD_H +NEXT_UNISTD_H +UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS +UNISTD_H_HAVE_WINSOCK2_H +UNISTD_H_HAVE_SYS_RANDOM_H +REPLACE_WRITE +REPLACE_USLEEP +REPLACE_UNLINKAT +REPLACE_UNLINK +REPLACE_TTYNAME_R +REPLACE_TRUNCATE +REPLACE_SYMLINKAT +REPLACE_SYMLINK +REPLACE_SLEEP +REPLACE_SETHOSTNAME +REPLACE_RMDIR +REPLACE_READLINKAT +REPLACE_READLINK +REPLACE_READ +REPLACE_PWRITE +REPLACE_PREAD +REPLACE_PIPE2 +REPLACE_LSEEK +REPLACE_LINKAT +REPLACE_LINK +REPLACE_LCHOWN +REPLACE_ISATTY +REPLACE_GETPASS_FOR_GETPASS_GNU +REPLACE_GETPASS +REPLACE_GETPAGESIZE +REPLACE_GETGROUPS +REPLACE_GETLOGIN_R +REPLACE_GETENTROPY +REPLACE_GETDTABLESIZE +REPLACE_GETDOMAINNAME +REPLACE_GETCWD +REPLACE_FTRUNCATE +REPLACE_FDATASYNC +REPLACE_FCHOWNAT +REPLACE_FACCESSAT +REPLACE_EXECVPE +REPLACE_EXECVP +REPLACE_EXECVE +REPLACE_EXECV +REPLACE_EXECLP +REPLACE_EXECLE +REPLACE_EXECL +REPLACE_DUP3 +REPLACE_DUP2 +REPLACE_DUP +REPLACE_COPY_FILE_RANGE +REPLACE_CLOSE +REPLACE_CHOWN +REPLACE_ACCESS +HAVE_SYS_PARAM_H +HAVE_OS_H +HAVE_DECL_TTYNAME_R +HAVE_DECL_TRUNCATE +HAVE_DECL_SETHOSTNAME +HAVE_DECL_GETUSERSHELL +HAVE_DECL_GETPAGESIZE +HAVE_DECL_GETLOGIN_R +HAVE_DECL_GETLOGIN +HAVE_DECL_GETDOMAINNAME +HAVE_DECL_FDATASYNC +HAVE_DECL_FCHDIR +HAVE_DECL_EXECVPE +HAVE_DECL_ENVIRON +HAVE_USLEEP +HAVE_UNLINKAT +HAVE_SYMLINKAT +HAVE_SYMLINK +HAVE_SLEEP +HAVE_SETHOSTNAME +HAVE_READLINKAT +HAVE_READLINK +HAVE_PWRITE +HAVE_PREAD +HAVE_PIPE2 +HAVE_PIPE +HAVE_LINKAT +HAVE_LINK +HAVE_LCHOWN +HAVE_GROUP_MEMBER +HAVE_GETPASS +HAVE_GETPAGESIZE +HAVE_GETLOGIN +HAVE_GETHOSTNAME +HAVE_GETGROUPS +HAVE_GETENTROPY +HAVE_GETDTABLESIZE +HAVE_FTRUNCATE +HAVE_FSYNC +HAVE_FDATASYNC +HAVE_FCHOWNAT +HAVE_FCHDIR +HAVE_FACCESSAT +HAVE_EXECVPE +HAVE_EUIDACCESS +HAVE_DUP3 +HAVE_COPY_FILE_RANGE +HAVE_CHOWN WINDOWS_STAT_INODES WINDOWS_64_BIT_OFF_T NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H NEXT_SYS_TYPES_H NEXT_AS_FIRST_DIRECTIVE_STRING_H NEXT_STRING_H +NEXT_AS_FIRST_DIRECTIVE_STDLIB_H +NEXT_STDLIB_H +GL_COND_OBJ_STDIO_WRITE_FALSE +GL_COND_OBJ_STDIO_WRITE_TRUE +GL_COND_OBJ_STDIO_READ_FALSE +GL_COND_OBJ_STDIO_READ_TRUE NEXT_AS_FIRST_DIRECTIVE_STDIO_H NEXT_STDIO_H GL_GENERATE_STDINT_H_FALSE GL_GENERATE_STDINT_H_TRUE STDINT_H -HAVE_SYS_INTTYPES_H -HAVE_SYS_BITYPES_H -HAVE_C99_STDINT_H -WINT_T_SUFFIX -WCHAR_T_SUFFIX -SIG_ATOMIC_T_SUFFIX -SIZE_T_SUFFIX -PTRDIFF_T_SUFFIX -HAVE_SIGNED_WINT_T -HAVE_SIGNED_WCHAR_T -HAVE_SIGNED_SIG_ATOMIC_T -BITSIZEOF_WINT_T -BITSIZEOF_WCHAR_T -BITSIZEOF_SIG_ATOMIC_T -BITSIZEOF_SIZE_T -BITSIZEOF_PTRDIFF_T -HAVE_STDINT_H -NEXT_AS_FIRST_DIRECTIVE_STDINT_H -NEXT_STDINT_H -HAVE_SYS_TYPES_H -HAVE_INTTYPES_H -HAVE_WCHAR_H -HAVE_UNSIGNED_LONG_LONG_INT -HAVE_LONG_LONG_INT -NEXT_AS_FIRST_DIRECTIVE_STDDEF_H -NEXT_STDDEF_H GL_GENERATE_STDDEF_H_FALSE GL_GENERATE_STDDEF_H_TRUE STDDEF_H +NEXT_AS_FIRST_DIRECTIVE_STDDEF_H +NEXT_STDDEF_H HAVE_WCHAR_T HAVE_MAX_ALIGN_T REPLACE_NULL +GL_GENERATE_STDBOOL_H_FALSE +GL_GENERATE_STDBOOL_H_TRUE +STDBOOL_H +HAVE__BOOL +GL_COND_OBJ_SIGNBIT3_FALSE +GL_COND_OBJ_SIGNBIT3_TRUE +GL_GNULIB_MDA_STRDUP +GL_GNULIB_MDA_MEMCCPY +GL_GNULIB_STRVERSCMP +GL_GNULIB_STRSIGNAL +GL_GNULIB_SIGDESCR_NP +GL_GNULIB_SIGABBREV_NP +GL_GNULIB_STRERRORNAME_NP +GL_GNULIB_STRERROR_R +GL_GNULIB_STRERROR +GL_GNULIB_MBSTOK_R +GL_GNULIB_MBSSEP +GL_GNULIB_MBSSPN +GL_GNULIB_MBSPBRK +GL_GNULIB_MBSCSPN +GL_GNULIB_MBSCASESTR +GL_GNULIB_MBSPCASECMP +GL_GNULIB_MBSNCASECMP +GL_GNULIB_MBSCASECMP +GL_GNULIB_MBSSTR +GL_GNULIB_MBSRCHR +GL_GNULIB_MBSCHR +GL_GNULIB_MBSNLEN +GL_GNULIB_MBSLEN +GL_GNULIB_STRTOK_R +GL_GNULIB_STRCASESTR +GL_GNULIB_STRSTR +GL_GNULIB_STRSEP +GL_GNULIB_STRPBRK +GL_GNULIB_STRNLEN +GL_GNULIB_STRNDUP +GL_GNULIB_STRNCAT +GL_GNULIB_STRDUP +GL_GNULIB_STRCHRNUL +GL_GNULIB_STPNCPY +GL_GNULIB_STPCPY +GL_GNULIB_RAWMEMCHR +GL_GNULIB_MEMSET_EXPLICIT +GL_GNULIB_MEMRCHR +GL_GNULIB_MEMPCPY +GL_GNULIB_MEMMEM +GL_GNULIB_MEMCHR +GL_GNULIB_FFSLL +GL_GNULIB_FFSL +GL_GNULIB_EXPLICIT_BZERO +GL_COND_OBJ_MEMCHR_FALSE +GL_COND_OBJ_MEMCHR_TRUE UNDEFINE_STRTOK_R REPLACE_STRSIGNAL +REPLACE_STRERRORNAME_NP REPLACE_STRERROR_R REPLACE_STRERROR REPLACE_STRTOK_R @@ -927,10 +1163,16 @@ REPLACE_STRNCAT REPLACE_STRDUP REPLACE_STRCHRNUL REPLACE_STPNCPY +REPLACE_STPCPY +REPLACE_MEMPCPY REPLACE_MEMMEM REPLACE_MEMCHR +REPLACE_FFSLL HAVE_STRVERSCMP HAVE_DECL_STRSIGNAL +HAVE_SIGDESCR_NP +HAVE_SIGABBREV_NP +HAVE_STRERRORNAME_NP HAVE_DECL_STRERROR_R HAVE_DECL_STRTOK_R HAVE_STRCASESTR @@ -944,51 +1186,13 @@ HAVE_STPNCPY HAVE_STPCPY HAVE_RAWMEMCHR HAVE_DECL_MEMRCHR +HAVE_MEMSET_EXPLICIT HAVE_MEMPCPY HAVE_DECL_MEMMEM -HAVE_MEMCHR HAVE_FFSLL HAVE_FFSL HAVE_EXPLICIT_BZERO HAVE_MBSLEN -GNULIB_STRVERSCMP -GNULIB_STRSIGNAL -GNULIB_STRERROR_R -GNULIB_STRERROR -GNULIB_MBSTOK_R -GNULIB_MBSSEP -GNULIB_MBSSPN -GNULIB_MBSPBRK -GNULIB_MBSCSPN -GNULIB_MBSCASESTR -GNULIB_MBSPCASECMP -GNULIB_MBSNCASECMP -GNULIB_MBSCASECMP -GNULIB_MBSSTR -GNULIB_MBSRCHR -GNULIB_MBSCHR -GNULIB_MBSNLEN -GNULIB_MBSLEN -GNULIB_STRTOK_R -GNULIB_STRCASESTR -GNULIB_STRSTR -GNULIB_STRSEP -GNULIB_STRPBRK -GNULIB_STRNLEN -GNULIB_STRNDUP -GNULIB_STRNCAT -GNULIB_STRDUP -GNULIB_STRCHRNUL -GNULIB_STPNCPY -GNULIB_STPCPY -GNULIB_RAWMEMCHR -GNULIB_MEMRCHR -GNULIB_MEMPCPY -GNULIB_MEMMEM -GNULIB_MEMCHR -GNULIB_FFSLL -GNULIB_FFSL -GNULIB_EXPLICIT_BZERO NEXT_AS_FIRST_DIRECTIVE_MATH_H NEXT_MATH_H LOCALCHARSET_TESTS_ENVIRONMENT @@ -996,10 +1200,155 @@ GLIBC21 GL_GENERATE_LIMITS_H_FALSE GL_GENERATE_LIMITS_H_TRUE LIMITS_H +GL_GNULIB_STRTOUMAX +GL_GNULIB_STRTOIMAX +GL_GNULIB_IMAXDIV +GL_GNULIB_IMAXABS +NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H +NEXT_INTTYPES_H +UINT64_MAX_EQ_ULONG_MAX +UINT32_MAX_LT_UINTMAX_MAX +PRIPTR_PREFIX +INT64_MAX_EQ_LONG_MAX +INT32_MAX_LT_INTMAX_MAX +REPLACE_STRTOUMAX +REPLACE_STRTOIMAX +REPLACE_IMAXDIV +REPLACE_IMAXABS +HAVE_IMAXDIV +HAVE_IMAXABS +HAVE_IMAXDIV_T +HAVE_DECL_STRTOUMAX +HAVE_DECL_STRTOIMAX +HAVE_DECL_IMAXDIV +HAVE_DECL_IMAXABS +HAVE_SYS_INTTYPES_H +HAVE_SYS_BITYPES_H +HAVE_C99_STDINT_H +WINT_T_SUFFIX +WCHAR_T_SUFFIX +SIG_ATOMIC_T_SUFFIX +SIZE_T_SUFFIX +PTRDIFF_T_SUFFIX +HAVE_SIGNED_WINT_T +HAVE_SIGNED_WCHAR_T +HAVE_SIGNED_SIG_ATOMIC_T +BITSIZEOF_WINT_T +BITSIZEOF_WCHAR_T +BITSIZEOF_SIG_ATOMIC_T +BITSIZEOF_SIZE_T +BITSIZEOF_PTRDIFF_T +HAVE_STDINT_H +NEXT_AS_FIRST_DIRECTIVE_STDINT_H +NEXT_STDINT_H +HAVE_SYS_TYPES_H +HAVE_INTTYPES_H +HAVE_WCHAR_H NEXT_AS_FIRST_DIRECTIVE_LIMITS_H NEXT_LIMITS_H -HOST_CPU_C_ABI -HOST_CPU +GL_COND_OBJ_FSETERR_FALSE +GL_COND_OBJ_FSETERR_TRUE +GL_GNULIB_MDA_YN +GL_GNULIB_MDA_Y1 +GL_GNULIB_MDA_Y0 +GL_GNULIB_MDA_JN +GL_GNULIB_MDA_J1 +GL_GNULIB_MDA_J0 +GL_GNULIB_TRUNCL +GL_GNULIB_TRUNCF +GL_GNULIB_TRUNC +GL_GNULIB_TANHF +GL_GNULIB_TANL +GL_GNULIB_TANF +GL_GNULIB_SQRTL +GL_GNULIB_SQRTF +GL_GNULIB_SINHF +GL_GNULIB_SINL +GL_GNULIB_SINF +GL_GNULIB_SIGNBIT +GL_GNULIB_ROUNDL +GL_GNULIB_ROUNDF +GL_GNULIB_ROUND +GL_GNULIB_RINTL +GL_GNULIB_RINTF +GL_GNULIB_RINT +GL_GNULIB_REMAINDERL +GL_GNULIB_REMAINDERF +GL_GNULIB_REMAINDER +GL_GNULIB_POWF +GL_GNULIB_MODFL +GL_GNULIB_MODFF +GL_GNULIB_MODF +GL_GNULIB_LOGBL +GL_GNULIB_LOGBF +GL_GNULIB_LOGB +GL_GNULIB_LOG2L +GL_GNULIB_LOG2F +GL_GNULIB_LOG2 +GL_GNULIB_LOG1PL +GL_GNULIB_LOG1PF +GL_GNULIB_LOG1P +GL_GNULIB_LOG10L +GL_GNULIB_LOG10F +GL_GNULIB_LOG10 +GL_GNULIB_LOGL +GL_GNULIB_LOGF +GL_GNULIB_LOG +GL_GNULIB_LDEXPL +GL_GNULIB_LDEXPF +GL_GNULIB_ISNANL +GL_GNULIB_ISNAND +GL_GNULIB_ISNANF +GL_GNULIB_ISNAN +GL_GNULIB_ISINF +GL_GNULIB_ISFINITE +GL_GNULIB_ILOGBL +GL_GNULIB_ILOGBF +GL_GNULIB_ILOGB +GL_GNULIB_HYPOTL +GL_GNULIB_HYPOTF +GL_GNULIB_HYPOT +GL_GNULIB_FREXPL +GL_GNULIB_FREXP +GL_GNULIB_FREXPF +GL_GNULIB_FMODL +GL_GNULIB_FMODF +GL_GNULIB_FMOD +GL_GNULIB_FMAL +GL_GNULIB_FMAF +GL_GNULIB_FMA +GL_GNULIB_FLOORL +GL_GNULIB_FLOORF +GL_GNULIB_FLOOR +GL_GNULIB_FABSL +GL_GNULIB_FABSF +GL_GNULIB_EXPM1L +GL_GNULIB_EXPM1F +GL_GNULIB_EXPM1 +GL_GNULIB_EXP2L +GL_GNULIB_EXP2F +GL_GNULIB_EXP2 +GL_GNULIB_EXPL +GL_GNULIB_EXPF +GL_GNULIB_COSHF +GL_GNULIB_COSL +GL_GNULIB_COSF +GL_GNULIB_COPYSIGNL +GL_GNULIB_COPYSIGNF +GL_GNULIB_COPYSIGN +GL_GNULIB_CEILL +GL_GNULIB_CEILF +GL_GNULIB_CEIL +GL_GNULIB_CBRTL +GL_GNULIB_CBRTF +GL_GNULIB_CBRT +GL_GNULIB_ATAN2F +GL_GNULIB_ATANL +GL_GNULIB_ATANF +GL_GNULIB_ASINL +GL_GNULIB_ASINF +GL_GNULIB_ACOSL +GL_GNULIB_ACOSF REPLACE_TRUNCL REPLACE_TRUNCF REPLACE_TRUNC @@ -1009,11 +1358,12 @@ REPLACE_SQRTL REPLACE_SQRTF REPLACE_SINHF REPLACE_SINF -REPLACE_SIGNBIT_USING_GCC +REPLACE_SIGNBIT_USING_BUILTINS REPLACE_SIGNBIT REPLACE_ROUNDL REPLACE_ROUNDF REPLACE_ROUND +REPLACE_RINTL REPLACE_REMAINDERL REPLACE_REMAINDERF REPLACE_REMAINDER @@ -1062,8 +1412,10 @@ REPLACE_FLOOR REPLACE_FABSL REPLACE_EXP2L REPLACE_EXP2 +REPLACE_EXPM1L REPLACE_EXPM1F REPLACE_EXPM1 +REPLACE_EXPL REPLACE_EXPF REPLACE_COSHF REPLACE_COSF @@ -1172,101 +1524,200 @@ HAVE_ASINL HAVE_ASINF HAVE_ACOSL HAVE_ACOSF -GNULIB_TRUNCL -GNULIB_TRUNCF -GNULIB_TRUNC -GNULIB_TANHF -GNULIB_TANL -GNULIB_TANF -GNULIB_SQRTL -GNULIB_SQRTF -GNULIB_SINHF -GNULIB_SINL -GNULIB_SINF -GNULIB_SIGNBIT -GNULIB_ROUNDL -GNULIB_ROUNDF -GNULIB_ROUND -GNULIB_RINTL -GNULIB_RINTF -GNULIB_RINT -GNULIB_REMAINDERL -GNULIB_REMAINDERF -GNULIB_REMAINDER -GNULIB_POWF -GNULIB_MODFL -GNULIB_MODFF -GNULIB_MODF -GNULIB_LOGBL -GNULIB_LOGBF -GNULIB_LOGB -GNULIB_LOG2L -GNULIB_LOG2F -GNULIB_LOG2 -GNULIB_LOG1PL -GNULIB_LOG1PF -GNULIB_LOG1P -GNULIB_LOG10L -GNULIB_LOG10F -GNULIB_LOG10 -GNULIB_LOGL -GNULIB_LOGF -GNULIB_LOG -GNULIB_LDEXPL -GNULIB_LDEXPF -GNULIB_ISNANL -GNULIB_ISNAND -GNULIB_ISNANF -GNULIB_ISNAN -GNULIB_ISINF -GNULIB_ISFINITE -GNULIB_ILOGBL -GNULIB_ILOGBF -GNULIB_ILOGB -GNULIB_HYPOTL -GNULIB_HYPOTF -GNULIB_HYPOT -GNULIB_FREXPL -GNULIB_FREXP -GNULIB_FREXPF -GNULIB_FMODL -GNULIB_FMODF -GNULIB_FMOD -GNULIB_FMAL -GNULIB_FMAF -GNULIB_FMA -GNULIB_FLOORL -GNULIB_FLOORF -GNULIB_FLOOR -GNULIB_FABSL -GNULIB_FABSF -GNULIB_EXPM1L -GNULIB_EXPM1F -GNULIB_EXPM1 -GNULIB_EXP2L -GNULIB_EXP2F -GNULIB_EXP2 -GNULIB_EXPL -GNULIB_EXPF -GNULIB_COSHF -GNULIB_COSL -GNULIB_COSF -GNULIB_COPYSIGNL -GNULIB_COPYSIGNF -GNULIB_COPYSIGN -GNULIB_CEILL -GNULIB_CEILF -GNULIB_CEIL -GNULIB_CBRTL -GNULIB_CBRTF -GNULIB_CBRT -GNULIB_ATAN2F -GNULIB_ATANL -GNULIB_ATANF -GNULIB_ASINL -GNULIB_ASINF -GNULIB_ACOSL -GNULIB_ACOSF +GL_GNULIB_MDA_PUTENV +GL_GNULIB_MDA_MKTEMP +GL_GNULIB_MDA_GCVT +GL_GNULIB_MDA_FCVT +GL_GNULIB_MDA_ECVT +GL_GNULIB_WCTOMB +GL_GNULIB_UNSETENV +GL_GNULIB_UNLOCKPT +GL_GNULIB_SYSTEM_POSIX +GL_GNULIB_STRTOULL +GL_GNULIB_STRTOUL +GL_GNULIB_STRTOLL +GL_GNULIB_STRTOLD +GL_GNULIB_STRTOL +GL_GNULIB_STRTOD +GL_GNULIB_SETENV +GL_GNULIB_SECURE_GETENV +GL_GNULIB_RPMATCH +GL_GNULIB_REALPATH +GL_GNULIB_REALLOC_POSIX +GL_GNULIB_REALLOC_GNU +GL_GNULIB_REALLOCARRAY +GL_GNULIB_RANDOM_R +GL_GNULIB_RANDOM +GL_GNULIB_QSORT_R +GL_GNULIB_PUTENV +GL_GNULIB_PTSNAME_R +GL_GNULIB_PTSNAME +GL_GNULIB_POSIX_OPENPT +GL_GNULIB_POSIX_MEMALIGN +GL_GNULIB_MKSTEMPS +GL_GNULIB_MKSTEMP +GL_GNULIB_MKOSTEMPS +GL_GNULIB_MKOSTEMP +GL_GNULIB_MKDTEMP +GL_GNULIB_MBTOWC +GL_GNULIB_MALLOC_POSIX +GL_GNULIB_MALLOC_GNU +GL_GNULIB_GRANTPT +GL_GNULIB_GETSUBOPT +GL_GNULIB_GETPROGNAME +GL_GNULIB_GETLOADAVG +GL_GNULIB_FREE_POSIX +GL_GNULIB_CANONICALIZE_FILE_NAME +GL_GNULIB_CALLOC_POSIX +GL_GNULIB_CALLOC_GNU +GL_GNULIB_ATOLL +GL_GNULIB_ALIGNED_ALLOC +GL_GNULIB__EXIT +GL_COND_OBJ_FREE_FALSE +GL_COND_OBJ_FREE_TRUE +REPLACE_WCTOMB +REPLACE_UNSETENV +REPLACE_STRTOULL +REPLACE_STRTOUL +REPLACE_STRTOLL +REPLACE_STRTOLD +REPLACE_STRTOL +REPLACE_STRTOD +REPLACE_SETSTATE +REPLACE_SETENV +REPLACE_REALPATH +REPLACE_REALLOCARRAY +REPLACE_REALLOC_FOR_REALLOC_POSIX +REPLACE_REALLOC_FOR_REALLOC_GNU +REPLACE_RANDOM_R +REPLACE_RANDOM +REPLACE_QSORT_R +REPLACE_PUTENV +REPLACE_PTSNAME_R +REPLACE_PTSNAME +REPLACE_POSIX_OPENPT +REPLACE_POSIX_MEMALIGN +REPLACE_MKSTEMP +REPLACE_MKOSTEMPS +REPLACE_MKOSTEMP +REPLACE_MBTOWC +REPLACE_MALLOC_FOR_MALLOC_POSIX +REPLACE_MALLOC_FOR_MALLOC_GNU +REPLACE_INITSTATE +REPLACE_GETSUBOPT +REPLACE_GETPROGNAME +REPLACE_GETLOADAVG +REPLACE_FREE +REPLACE_CANONICALIZE_FILE_NAME +REPLACE_CALLOC_FOR_CALLOC_POSIX +REPLACE_CALLOC_FOR_CALLOC_GNU +REPLACE_ALIGNED_ALLOC +REPLACE__EXIT +HAVE_DECL_UNSETENV +HAVE_UNLOCKPT +HAVE_SYS_LOADAVG_H +HAVE_STRUCT_RANDOM_DATA +HAVE_STRTOULL +HAVE_STRTOUL +HAVE_STRTOLL +HAVE_STRTOLD +HAVE_STRTOL +HAVE_STRTOD +HAVE_DECL_SETSTATE +HAVE_SETSTATE +HAVE_DECL_SETENV +HAVE_SETENV +HAVE_SECURE_GETENV +HAVE_RPMATCH +HAVE_REALPATH +HAVE_REALLOCARRAY +HAVE_RANDOM_R +HAVE_RANDOM_H +HAVE_RANDOM +HAVE_QSORT_R +HAVE_PTSNAME_R +HAVE_PTSNAME +HAVE_POSIX_OPENPT +HAVE_POSIX_MEMALIGN +HAVE_MKSTEMPS +HAVE_MKSTEMP +HAVE_MKOSTEMPS +HAVE_MKOSTEMP +HAVE_MKDTEMP +HAVE_MBTOWC +HAVE_DECL_INITSTATE +HAVE_INITSTATE +HAVE_GRANTPT +HAVE_GETSUBOPT +HAVE_GETPROGNAME +HAVE_DECL_GETLOADAVG +HAVE_DECL_GCVT +HAVE_DECL_FCVT +HAVE_DECL_ECVT +HAVE_CANONICALIZE_FILE_NAME +HAVE_ATOLL +HAVE_ALIGNED_ALLOC +HAVE__EXIT +GL_GNULIB_MDA_TEMPNAM +GL_GNULIB_MDA_PUTW +GL_GNULIB_MDA_GETW +GL_GNULIB_MDA_FILENO +GL_GNULIB_MDA_FDOPEN +GL_GNULIB_MDA_FCLOSEALL +GL_GNULIB_VSPRINTF_POSIX +GL_GNULIB_VSNPRINTF +GL_GNULIB_VPRINTF_POSIX +GL_GNULIB_VPRINTF +GL_GNULIB_VFPRINTF_POSIX +GL_GNULIB_VFPRINTF +GL_GNULIB_VDPRINTF +GL_GNULIB_VSCANF +GL_GNULIB_VFSCANF +GL_GNULIB_VASPRINTF +GL_GNULIB_TMPFILE +GL_GNULIB_STDIO_H_SIGPIPE +GL_GNULIB_STDIO_H_NONBLOCKING +GL_GNULIB_SPRINTF_POSIX +GL_GNULIB_SNPRINTF +GL_GNULIB_SCANF +GL_GNULIB_RENAMEAT +GL_GNULIB_RENAME +GL_GNULIB_REMOVE +GL_GNULIB_PUTS +GL_GNULIB_PUTCHAR +GL_GNULIB_PUTC +GL_GNULIB_PRINTF_POSIX +GL_GNULIB_PRINTF +GL_GNULIB_POPEN +GL_GNULIB_PERROR +GL_GNULIB_PCLOSE +GL_GNULIB_OBSTACK_PRINTF_POSIX +GL_GNULIB_OBSTACK_PRINTF +GL_GNULIB_GETLINE +GL_GNULIB_GETDELIM +GL_GNULIB_GETCHAR +GL_GNULIB_GETC +GL_GNULIB_FWRITE +GL_GNULIB_FTELLO +GL_GNULIB_FTELL +GL_GNULIB_FSEEKO +GL_GNULIB_FSEEK +GL_GNULIB_FSCANF +GL_GNULIB_FREOPEN +GL_GNULIB_FREAD +GL_GNULIB_FPUTS +GL_GNULIB_FPUTC +GL_GNULIB_FPURGE +GL_GNULIB_FPRINTF_POSIX +GL_GNULIB_FPRINTF +GL_GNULIB_FOPEN_GNU +GL_GNULIB_FOPEN +GL_GNULIB_FGETS +GL_GNULIB_FGETC +GL_GNULIB_FFLUSH +GL_GNULIB_FDOPEN +GL_GNULIB_FCLOSE +GL_GNULIB_DPRINTF REPLACE_VSPRINTF REPLACE_VSNPRINTF REPLACE_VPRINTF @@ -1294,6 +1745,7 @@ REPLACE_FSEEK REPLACE_FREOPEN REPLACE_FPURGE REPLACE_FPRINTF +REPLACE_FOPEN_FOR_FOPEN_GNU REPLACE_FOPEN REPLACE_FFLUSH REPLACE_FDOPEN @@ -1309,86 +1761,45 @@ HAVE_FSEEKO HAVE_DPRINTF HAVE_DECL_VSNPRINTF HAVE_DECL_SNPRINTF +HAVE_DECL_PUTW HAVE_DECL_OBSTACK_PRINTF +HAVE_DECL_GETW HAVE_DECL_GETLINE HAVE_DECL_GETDELIM HAVE_DECL_FTELLO HAVE_DECL_FSEEKO HAVE_DECL_FPURGE -GNULIB_VSPRINTF_POSIX -GNULIB_VSNPRINTF -GNULIB_VPRINTF_POSIX -GNULIB_VPRINTF -GNULIB_VFPRINTF_POSIX -GNULIB_VFPRINTF -GNULIB_VDPRINTF -GNULIB_VSCANF -GNULIB_VFSCANF -GNULIB_VASPRINTF -GNULIB_TMPFILE -GNULIB_STDIO_H_SIGPIPE -GNULIB_STDIO_H_NONBLOCKING -GNULIB_SPRINTF_POSIX -GNULIB_SNPRINTF -GNULIB_SCANF -GNULIB_RENAMEAT -GNULIB_RENAME -GNULIB_REMOVE -GNULIB_PUTS -GNULIB_PUTCHAR -GNULIB_PUTC -GNULIB_PRINTF_POSIX -GNULIB_PRINTF -GNULIB_POPEN -GNULIB_PERROR -GNULIB_PCLOSE -GNULIB_OBSTACK_PRINTF_POSIX -GNULIB_OBSTACK_PRINTF -GNULIB_GETLINE -GNULIB_GETDELIM -GNULIB_GETCHAR -GNULIB_GETC -GNULIB_FWRITE -GNULIB_FTELLO -GNULIB_FTELL -GNULIB_FSEEKO -GNULIB_FSEEK -GNULIB_FSCANF -GNULIB_FREOPEN -GNULIB_FREAD -GNULIB_FPUTS -GNULIB_FPUTC -GNULIB_FPURGE -GNULIB_FPRINTF_POSIX -GNULIB_FPRINTF -GNULIB_FOPEN -GNULIB_FGETS -GNULIB_FGETC -GNULIB_FFLUSH -GNULIB_FDOPEN -GNULIB_FCLOSE -GNULIB_DPRINTF +HAVE_DECL_FCLOSEALL HAVE_FEATURES_H -GNULIB_OVERRIDES_WINT_T +GNULIBHEADERS_OVERRIDE_WINT_T APPLE_UNIVERSAL_BUILD HAVE_SAME_LONG_DOUBLE_AS_DOUBLE -REPLACE_ITOLD +GL_COND_OBJ_ITOLD_FALSE +GL_COND_OBJ_ITOLD_TRUE +GL_COND_OBJ_FLOAT_FALSE +GL_COND_OBJ_FLOAT_TRUE GL_GENERATE_FLOAT_H_FALSE GL_GENERATE_FLOAT_H_TRUE FLOAT_H +REPLACE_ITOLD NEXT_AS_FIRST_DIRECTIVE_FLOAT_H NEXT_FLOAT_H +GL_GENERATE_ERRNO_H_FALSE +GL_GENERATE_ERRNO_H_TRUE +ERRNO_H EOVERFLOW_VALUE EOVERFLOW_HIDDEN ENOLINK_VALUE ENOLINK_HIDDEN EMULTIHOP_VALUE EMULTIHOP_HIDDEN -GL_GENERATE_ERRNO_H_FALSE -GL_GENERATE_ERRNO_H_TRUE -ERRNO_H NEXT_AS_FIRST_DIRECTIVE_ERRNO_H NEXT_ERRNO_H +GL_GENERATE_ASSERT_H_FALSE +GL_GENERATE_ASSERT_H_TRUE +ASSERT_H +NEXT_AS_FIRST_DIRECTIVE_ASSERT_H +NEXT_ASSERT_H PRAGMA_COLUMNS PRAGMA_SYSTEM_HEADER INCLUDE_NEXT_AS_FIRST_DIRECTIVE @@ -1396,9 +1807,16 @@ INCLUDE_NEXT GL_GENERATE_ALLOCA_H_FALSE GL_GENERATE_ALLOCA_H_TRUE ALLOCA_H +HAVE_ALLOCA_H ALLOCA GL_COND_LIBTOOL_FALSE GL_COND_LIBTOOL_TRUE +RANLIB +ARFLAGS +AR +EGREP +GREP +CPP host_os host_vendor host_cpu @@ -1407,9 +1825,6 @@ build_os build_vendor build_cpu build -RANLIB -ARFLAGS -AR am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE @@ -1420,6 +1835,9 @@ AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V +CSCOPE +ETAGS +CTAGS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -1452,9 +1870,6 @@ am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM -EGREP -GREP -CPP OBJEXT EXEEXT ac_ct_CC @@ -1482,6 +1897,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -1502,7 +1918,6 @@ PACKAGE_NAME PATH_SEPARATOR SHELL referdir -grog_dir gpinyin_dir glilypond_dir libprogramdir @@ -1512,15 +1927,15 @@ ac_user_opts=' enable_option_checking enable_dependency_tracking enable_silent_rules +enable_cross_guesses with_x -with_appresdir -with_grofferdir -with_doc +with_appdefdir with_uchardet with_gnu_ld enable_rpath with_libiconv_prefix with_urw_fonts_dir +enable_groff_allocator with_compatibility_wrappers with_alt_gs with_gs @@ -1535,10 +1950,10 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP CXX CXXFLAGS CCC +CPP XMKMF PKG_CONFIG PKG_CONFIG_PATH @@ -1584,6 +1999,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1613,8 +2029,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -1655,9 +2069,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1681,9 +2095,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1836,6 +2250,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1885,9 +2308,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1901,9 +2324,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1947,9 +2370,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1965,7 +2388,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1973,7 +2396,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -2029,7 +2452,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -2086,7 +2509,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures GNU Troff 1.22.4 to adapt to many kinds of systems. +\`configure' configures GNU roff 1.23.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -2126,6 +2549,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -2160,7 +2584,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GNU Troff 1.22.4:";; + short | recursive ) echo "Configuration of GNU roff 1.23.0:";; esac cat <<\_ACEOF @@ -2174,47 +2598,42 @@ Optional Features: speeds up one-time build --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") + --enable-cross-guesses={conservative|risky} + specify policy for cross-compilation guesses --disable-rpath do not hardcode runtime library paths + --enable-groff-allocator + enable libgroff's allocator for C++ new/delete Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System - --with-appresdir=DIR X11 application resource files - --with-grofferdir=DIR groffer files location - --with-doc[=TYPE] choose which manuals (beside man pages) are - desirable. TYPE can be 'yes' or 'no', or a - comma-separated list of one or multiple of 'html', - 'info', 'other', 'pdf', and 'examples', to restrict - what is produced - --with-uchardet Build 'preconv' with uchardet library for file - encoding automatic detection [=auto|no|yes] + --with-appdefdir=DIR place X11 application defaults files in DIR + --with-uchardet={auto|no|yes} + build 'preconv' against uchardet library to + automatically detect input file encoding --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-urw-fonts-dir=DIR - Search for URW fonts in this directory - --with-compatibility-wrappers[=VALUE] + search for URW PostScript Type 1 fonts in DIR + --with-compatibility-wrappers={check|manual|no|yes} choose whether and how groff compatibility wrappers - for vendor-provided non-GNU macro sets are - installed. VALUE can be 'check', 'yes', 'no' or - 'manual'. 'check' (the default) checks for the - existence of vendor-provided non-GNU macro sets, and - implements the 'yes' or 'no' option accordingly. - 'yes' generates compatibility wrappers for - vendor-provided non-GNU macro sets to allow their - use with groff-based tools. The compatibility - wrappers are installed with the original macro set - name, while groff implementation of these macro sets - are installed with a 'g' prefix. Thus use of the - groff implementation of these macro sets requires - use of the '-mg' option (example: -mgan). - 'no' only installs the groff implementation of macro - sets. 'manual' generates compatibility wrappers for - vendor-provided non-GNU macro sets as '-os'. - Use of these groff compatibility wrappers (for - vendor-provided non-GNU macro sets) requires the use - of the '-m-os' option (example: -man-os). + for vendor-provided non-GNU macro packages are + installed. 'check' searches for such packages, and + behaves as if 'yes' or 'no' were given, accordingly. + 'yes' generates compatibility wrappers for the + vendor-provided packages to allow their use with + groff and related tools. The compatibility wrappers + are installed using the vendor-provided names, while + their groff implementations are installed with a 'g' + prefix. Use of the latter thus requires options of + the form '-mg' (example: -mgan). 'no' + installs only the groff implementations. 'manual' + generates compatibility wrappers for the + vendor-provided packages as '-os'. Use of the + latter thus requires options of the form + '-m-os' option (example: -man-os). --with-alt-gs=LIST alternative names for ghostscript executable --with-gs=PROG actual [/path/]name of ghostscript executable --with-alt-awk=LIST alternative names for awk executable @@ -2228,9 +2647,9 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory - CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags + CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH @@ -2247,8 +2666,8 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . -GNU Troff home page: . -General help using GNU software: . +GNU roff home page: . +General help using GNU software: . _ACEOF ac_status=$? fi @@ -2264,9 +2683,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -2294,7 +2713,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -2302,7 +2722,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -2311,10 +2731,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GNU Troff configure 1.22.4 -generated by GNU Autoconf 2.69 +GNU roff configure 1.23.0 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -2331,14 +2751,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -2346,14 +2766,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -2363,6 +2784,78 @@ fi } # ac_fn_c_try_compile +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. @@ -2375,7 +2868,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -2383,14 +2876,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -2400,258 +2894,59 @@ fi } # ac_fn_c_try_cpp -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -#include <$2> +int +main (void) +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if ac_fn_c_try_compile "$LINENO" +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include <$2> +$4 +int +main (void) +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + eval "$3=yes" fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## -------------------------------------------------------- ## -## Report this to http://savannah.gnu.org/bugs/?group=groff ## -## -------------------------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -2662,14 +2957,14 @@ $as_echo "$ac_res" >&6; } ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -2677,17 +2972,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -2702,72 +2998,48 @@ fi } # ac_fn_c_try_link -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + ac_retval=$ac_status fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval -} # ac_fn_c_check_func +} # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- @@ -2783,7 +3055,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; @@ -2793,14 +3065,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2810,9 +3083,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid; break -else +else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= @@ -2820,14 +3094,14 @@ else fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; @@ -2837,14 +3111,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; @@ -2854,9 +3129,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=$ac_mid; break -else +else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= @@ -2864,14 +3140,14 @@ else fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop ac_lo= ac_hi= fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val @@ -2879,7 +3155,7 @@ while test "x$ac_lo" != "x$ac_hi"; do /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2889,12 +3165,13 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid -else +else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; @@ -2904,12 +3181,12 @@ esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } #include #include int -main () +main (void) { FILE *f = fopen ("conftest.val", "w"); @@ -2937,9 +3214,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : echo >>conftest.val; read $3 &5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { #ifndef $as_decl_name #ifdef __cplusplus @@ -2984,61 +3269,128 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + ac_compile="$ac_save_ac_compile" -} # ac_fn_c_check_decl +} # ac_fn_check_decl -# ac_fn_cxx_try_run LINENO -# ------------------------ -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_cxx_try_run () +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ -} # ac_fn_cxx_try_run +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_run LINENO +# ------------------------ +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_cxx_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_run # ac_fn_cxx_try_link LINENO # ------------------------- @@ -3046,14 +3398,14 @@ fi ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3061,17 +3413,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -3098,7 +3451,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3106,14 +3459,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -3122,14 +3476,34 @@ fi as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GNU Troff $as_me 1.22.4, which was -generated by GNU Autoconf 2.69. Invocation command line was +It was created by GNU roff $as_me 1.23.0, which was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -3162,8 +3536,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -3198,7 +3576,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -3233,11 +3611,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -3248,8 +3628,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -3273,7 +3653,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -3281,14 +3661,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -3296,15 +3676,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -3312,8 +3692,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -3327,63 +3707,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -3393,936 +3758,728 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -as_fn_append ac_func_list " vasnprintf" -as_fn_append ac_header_list " features.h" -as_fn_append ac_func_list " snprintf" -as_fn_append ac_func_list " __fseterr" -as_fn_append ac_header_list " limits.h" -as_fn_append ac_header_list " unistd.h" -as_fn_append ac_func_list " symlink" -as_fn_append ac_header_list " math.h" -as_fn_append ac_header_list " sys/mman.h" -as_fn_append ac_func_list " mprotect" -gl_printf_safe=yes -as_fn_append ac_header_list " wchar.h" -as_fn_append ac_header_list " stdint.h" -as_fn_append ac_header_list " crtdefs.h" -as_fn_append ac_func_list " iswcntrl" -as_fn_append ac_header_list " wctype.h" -as_fn_append ac_func_list " wcwidth" -as_fn_append ac_header_list " stdlib.h" -as_fn_append ac_header_list " sys/param.h" -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' -# SHORT_VERSION contains only the number of REVISION before the first '.', -# e.g. if REVISION is '3.real.434-5aafd' then SHORT_VERSION is 'x.yy.3', -# where x and yy are MAJOR_VERSION and MINOR_VERSION, respectively. -SHORT_VERSION=1.22.4 +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} -# Directories where the helper scripts should be found. This must be consistent -# with the variable build_aux in bootstrap.conf -ac_aux_dir= -for ac_dir in build-aux "$srcdir"/build-aux; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 -fi +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +struct incomplete_array +{ + int datasize; + double data[]; +}; +struct named_init { + int number; + const wchar_t *name; + double average; +}; +typedef const char *ccp; -ac_config_headers="$ac_config_headers src/include/config.h:src/include/config.hin" +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + const char *str = ""; + int number = 0; + float fnumber = 0; -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + return *str && number && fnumber; +} +' -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + ni.number = 58; -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" - test -n "$ac_ct_CC" && break -done +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" -fi +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" +as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +namespace { -int -main () +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template { + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; - ; - return 0; +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); } -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +' -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles +namespace cxx11test +{ + constexpr int get_val() { return 20; } -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= + struct testinit + { + int i; + double d; + }; -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext + virtual int getval() { return this->n; }; + protected: + int n; + }; -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' -int -main () +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' { + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } -int -main () + decltype(a2) a4 = 34895.034; +} { -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; } -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} int -main () +main (int argc, char **argv) { - - ; - return 0; + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; } -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +" +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int -main () +main (int argc, char **argv) { - - ; - return 0; + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; } -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +" -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +as_fn_append ac_func_c_list " vasnprintf HAVE_VASNPRINTF" +as_fn_append ac_header_c_list " features.h features_h HAVE_FEATURES_H" +as_fn_append ac_func_c_list " snprintf HAVE_SNPRINTF" +as_fn_append ac_header_c_list " limits.h limits_h HAVE_LIMITS_H" +as_fn_append ac_func_c_list " symlink HAVE_SYMLINK" +as_fn_append ac_header_c_list " math.h math_h HAVE_MATH_H" +as_fn_append ac_header_c_list " sys/mman.h sys_mman_h HAVE_SYS_MMAN_H" +as_fn_append ac_func_c_list " mprotect HAVE_MPROTECT" +gl_printf_safe=yes +as_fn_append ac_header_c_list " crtdefs.h crtdefs_h HAVE_CRTDEFS_H" +as_fn_append ac_func_c_list " iswcntrl HAVE_ISWCNTRL" +as_fn_append ac_header_c_list " wctype.h wctype_h HAVE_WCTYPE_H" +as_fn_append ac_func_c_list " wcwidth HAVE_WCWIDTH" +as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H" +as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE" + +# Auxiliary files required by this configure script. +ac_aux_files="config.rpath config.guess config.sub missing install-sh compile" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/build-aux" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: -int -main () -{ + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4330,1432 +4487,1568 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +# SHORT_VERSION contains only the number of REVISION before the first +# '.'; e.g., if REVISION is '3.real.434-5aafd' then SHORT_VERSION is +# 'x.yy.3', where x and yy are MAJOR_VERSION and MINOR_VERSION, +# respectively. +SHORT_VERSION=1.23.0 + + +# Directories where the helper scripts should be found. This must be +# consistent with the variable build_aux in bootstrap.conf. + + +ac_config_headers="$ac_config_headers src/include/config.h:src/include/config.hin" + + + + + + + + + + + + + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -else - # Broken: fails on valid input. -continue fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - done - ac_cv_prog_CPP=$CPP fi - CPP=$ac_cv_prog_CPP +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -else - # Broken: fails on valid input. -continue fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - # Passes both tests. -ac_preproc_ok=: -break + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } + CC="$ac_cv_prog_CC" fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi -else - ac_cv_path_EGREP=$EGREP fi - - fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - ac_cv_header_stdc=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : -else - ac_cv_header_stdc=no fi -rm -f conftest* +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - ac_cv_header_stdc=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f conftest* -fi -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + test -n "$CC" && break + done fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi + test -n "$ac_ct_CC" && break done + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = xyes; then : - MINIX=yes +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - MINIX= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h - - -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h - - -$as_echo "#define _MINIX 1" >>confdefs.h - - -$as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h - +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi +done + done +IFS=$as_save_IFS - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if ${ac_cv_safe_to_define___extensions__+:} false; then : - $as_echo_n "(cached) " >&6 +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_safe_to_define___extensions__=yes + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else - ac_cv_safe_to_define___extensions__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CC="$ac_cv_prog_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h - - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h - - $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h - - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h - - $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h - - $as_echo "#define _OPENBSD_SOURCE 1" >>confdefs.h - - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h - - $as_echo "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h - $as_echo "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h - - $as_echo "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h - - $as_echo "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h - - $as_echo "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h +fi - $as_echo "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h - $as_echo "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 -$as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; } -if ${ac_cv_should_define__xopen_source+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_should_define__xopen_source=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - mbstate_t x; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #define _XOPEN_SOURCE 500 - #include - mbstate_t x; -int -main () -{ +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_should_define__xopen_source=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 -$as_echo "$ac_cv_should_define__xopen_source" >&6; } - test $ac_cv_should_define__xopen_source = yes && - $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - $as_echo "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -am__api_version='1.16' +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +int +main (void) +{ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! +rm -f conftest.$ac_cv_objext conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -rm -f conftest.file +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test x"${install_sh+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +int +main (void) +{ -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP + CFLAGS="-g" fi else - STRIP="$ac_cv_prog_STRIP" + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi fi - +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break done - done -IFS=$as_save_IFS +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -DEPDIR="${am__leading_dot}deps" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_config_commands="$ac_config_commands depfiles" +int +main (void) +{ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 -$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } -cat > confinc.mk << 'END' -am__doit: - @echo this is the am__doit target >confinc.out -.PHONY: am__doit -END -am__include="#" -am__quote= -# BSD make does it like this. -echo '.include "confinc.mk" # ignored' > confmf.BSD -# Other make implementations (GNU, Solaris 10, AIX) do it like this. -echo 'include confinc.mk # ignored' > confmf.GNU -_am_result=no -for s in GNU BSD; do - { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 - (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - case $?:`cat confinc.out 2>/dev/null` in #( - '0:this is the am__doit target') : - case $s in #( - BSD) : - am__include='.include' am__quote='"' ;; #( - *) : - am__include='include' am__quote='' ;; -esac ;; #( - *) : - ;; -esac - if test "$am__include" != "#"; then - _am_result="yes ($s style)" - break - fi -done -rm -f confinc.* confmf.* -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 -$as_echo "${_am_result}" >&6; } - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 +printf %s "checking whether the compiler is clang... " >&6; } +if test ${gl_cv_compiler_clang+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef __clang__ + barfbarf + #endif + +int +main (void) +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_compiler_clang=no +else $as_nop + gl_cv_compiler_clang=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5 +printf "%s\n" "$gl_cv_compiler_clang" >&6; } + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5 +printf %s "checking for compiler option needed when checking for declarations... " >&6; } +if test ${gl_cv_compiler_check_decl_option+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test $gl_cv_compiler_clang = yes; then + save_ac_compile="$ac_compile" + ac_compile="$ac_compile -Werror=implicit-function-declaration" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration' +else $as_nop + gl_cv_compiler_check_decl_option=none fi -AM_BACKSLASH='\' +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_compile="$save_ac_compile" + else + gl_cv_compiler_check_decl_option=none + fi -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5 +printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; } + if test "x$gl_cv_compiler_check_decl_option" != xnone; then + ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" + else + ac_compile_for_check_decl="$ac_compile" + fi -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item else - CYGPATH_W=echo + ac_header=$ac_item fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + fi -# Define the identity of the package. - PACKAGE='groff' - VERSION='1.22.4' -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test ${ac_cv_safe_to_define___extensions__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main (void) +{ + + ; + return 0; +} _ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_safe_to_define___extensions__=yes +else $as_nop + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 +printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } +if test ${ac_cv_should_define__xopen_source+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_should_define__xopen_source=no + if test $ac_cv_header_wchar_h = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include + mbstate_t x; +int +main (void) +{ -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" + ; + return 0; +} _ACEOF +if ac_fn_c_try_compile "$LINENO" +then : -# Some tools Automake needs. +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + #define _XOPEN_SOURCE 500 + #include + mbstate_t x; +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_should_define__xopen_source=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 +printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h + printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h + printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' + printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' + printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h + printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' + printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h + printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h + printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h + printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h + printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h -depcc="$CC" am_compiler_list= + if test $ac_cv_header_minix_config_h = yes +then : + MINIX=yes + printf "%s\n" "#define _MINIX 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub + printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac + printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none +else $as_nop + MINIX= fi + if test $ac_cv_safe_to_define___extensions__ = yes +then : + printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + if test $ac_cv_should_define__xopen_source = yes +then : + printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= fi +am__api_version='1.16' -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . + done +IFS=$as_save_IFS -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. +rm -rf conftest.one conftest.two conftest.dir -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh fi fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=0;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : else - am_cv_make_support_nested_variables=no + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -AM_BACKSLASH='\' +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi -# checks for programs -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5764,38 +6057,43 @@ IFS=$as_save_IFS fi fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5804,194 +6102,107 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_CC" = x; then - CC="" + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - CC=$ac_ct_CC + STRIP=$ac_ct_STRIP fi else - CC="$ac_cv_prog_CC" + STRIP="$ac_cv_prog_STRIP" fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done done IFS=$as_save_IFS -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe +for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6000,599 +6211,241 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - test -n "$ac_ct_CC" && break + test -n "$AWK" && break done - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; esac - CC=$ac_ct_CC - fi +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" fi +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ fi +rmdir .tst 2>/dev/null +DEPDIR="${am__leading_dot}deps" -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +ac_config_commands="$ac_config_commands depfiles" -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' else - GCC= + AMDEP_TRUE='#' + AMDEP_FALSE= fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_make_support_nested_variables=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' else - CFLAGS= + CYGPATH_W=echo fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +# Define the identity of the package. + PACKAGE='groff' + VERSION='1.23.0' -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# Some tools Automake needs. -int -main () -{ +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - test -n "$ac_ct_CXX" && break -done +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ -#ifndef __GNUC__ - choke me -#endif +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' -int -main () -{ +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -depcc="$CXX" am_compiler_list= +depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -6613,7 +6466,7 @@ else # directory. mkdir sub - am_cv_CXX_dependencies_compiler_type=none + am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi @@ -6686,7 +6539,7 @@ else # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode + am_cv_CC_dependencies_compiler_type=$depmode break fi fi @@ -6695,92 +6548,156 @@ else cd .. rm -rf conftest.dir else - am_cv_CXX_dependencies_compiler_type=none + am_cv_CC_dependencies_compiler_type=none fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= fi +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +if test -z "$ETAGS"; then + ETAGS=etags +fi +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 -$as_echo_n "checking for Minix Amsterdam compiler... " >&6; } -if ${gl_cv_c_amsterdam_compiler+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef __ACK__ -Amsterdam -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Amsterdam" >/dev/null 2>&1; then : - gl_cv_c_amsterdam_compiler=yes -else - gl_cv_c_amsterdam_compiler=no -fi -rm -f conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 -$as_echo "$gl_cv_c_amsterdam_compiler" >&6; } +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. - if test $gl_cv_c_amsterdam_compiler = yes; then - if test -z "$AR"; then - AR='cc -c.a' - fi - if test -z "$ARFLAGS"; then - ARFLAGS='-o' - fi - else - : +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi +fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 + +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +# checks for programs +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6789,38 +6706,43 @@ IFS=$as_save_IFS fi fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6829,60 +6751,56 @@ IFS=$as_save_IFS fi fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_AR" = x; then - AR="ar" + if test "x$ac_ct_CC" = x; then + CC="" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - AR=$ac_ct_AR + CC=$ac_ct_CC fi else - AR="$ac_cv_prog_AR" + CC="$ac_cv_prog_CC" fi - if test -z "$ARFLAGS"; then - ARFLAGS='cr' - fi - - - - if test -z "$RANLIB"; then - if test $gl_cv_c_amsterdam_compiler = yes; then - RANLIB=':' - else - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6891,4588 +6809,10712 @@ IFS=$as_save_IFS fi fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + fi fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else + ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi fi fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - RANLIB="$ac_cv_prog_RANLIB" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - fi - fi - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + test -n "$CC" && break + done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + test -n "$ac_ct_CC" && break +done + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi - # IEEE behaviour is the default on all CPUs except Alpha and SH - # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 - # and the GCC 4.1.2 manual). - case "$host_cpu" in - alpha*) - # On Alpha systems, a compiler option provides the behaviour. - # See the ieee(3) manual page, also available at - # - if test -n "$GCC"; then - # GCC has the option -mieee. - # For full IEEE compliance (rarely needed), use option -mieee-with-inexact. - CPPFLAGS="$CPPFLAGS -mieee" - else - # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact. - # For full IEEE compliance (rarely needed), use option -ieee_with_inexact. - CPPFLAGS="$CPPFLAGS -ieee" - fi - ;; - sh*) - if test -n "$GCC"; then - # GCC has the option -mieee. - CPPFLAGS="$CPPFLAGS -mieee" - fi - ;; +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - # Pre-early section. - - - - - # Code from module absolute-header: - # Code from module alloca-opt: - # Code from module errno: - # Code from module extensions: - # Code from module extern-inline: - # Code from module float: - # Code from module fpieee: - - # Code from module fprintf-posix: - # Code from module fpucw: - # Code from module frexp-nolibm: - # Code from module frexpl-nolibm: - # Code from module fseterr: - # Code from module git-version-gen: - # Code from module havelib: - # Code from module host-cpu-c-abi: - # Code from module include_next: - # Code from module isnand-nolibm: - # Code from module isnanf-nolibm: - # Code from module isnanl-nolibm: - # Code from module limits-h: - # Code from module localcharset: - # Code from module math: - # Code from module memchr: - # Code from module multiarch: - # Code from module nocrash: - # Code from module non-recursive-gnulib-prefix-hack: - # Code from module printf-frexp: - # Code from module printf-frexpl: - # Code from module printf-safe: - # Code from module signbit: - # Code from module size_max: - # Code from module snippet/arg-nonnull: - # Code from module snippet/c++defs: - # Code from module snippet/warn-on-use: - # Code from module snprintf: - # Code from module ssize_t: - # Code from module stddef: - # Code from module stdint: - # Code from module stdio: - # Code from module streq: - # Code from module string: - # Code from module sys_types: - # Code from module unitypes: - # Code from module uniwidth/base: - # Code from module uniwidth/width: - # Code from module vasnprintf: - # Code from module verify: - # Code from module vsnprintf: - # Code from module wchar: - # Code from module wctype-h: - # Code from module wcwidth: - # Code from module xsize: - - - - +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - LIBC_FATAL_STDERR_=1 - export LIBC_FATAL_STDERR_ + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +fi -else -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } -fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 -$as_echo_n "checking for working alloca.h... " >&6; } -if ${ac_cv_working_alloca_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + int -main () +main (void) { -char *p = (char *) alloca (2 * sizeof (int)); - if (p) return 0; +#ifndef __GNUC__ + choke me +#endif + ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_working_alloca_h=yes -else - ac_cv_working_alloca_h=no +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 -$as_echo "$ac_cv_working_alloca_h" >&6; } -if test $ac_cv_working_alloca_h = yes; then - -$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 -$as_echo_n "checking for alloca... " >&6; } -if ${ac_cv_func_alloca_works+:} false; then : - $as_echo_n "(cached) " >&6 +if test $ac_compiler_gnu = yes; then + GCC=yes else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include -# define alloca _alloca -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -void *alloca (size_t); -# endif -# endif -# endif -# endif -#endif int -main () +main (void) { -char *p = (char *) alloca (1); - if (p) return 0; + ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_func_alloca_works=yes -else - ac_cv_func_alloca_works=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 -$as_echo "$ac_cv_func_alloca_works" >&6; } +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -if test $ac_cv_func_alloca_works = yes; then +int +main (void) +{ -$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : -else - # The SVR3 libPW and SVR4 libucb both contain incompatible functions -# that cause trouble. Some versions do not even contain alloca or -# contain a buggy version. If you still want to use their alloca, -# use ar to extract alloca.o from them instead of compiling alloca.c. +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -ALLOCA=\${LIBOBJDIR}alloca.$ac_objext +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi -$as_echo "#define C_ALLOCA 1" >>confdefs.h +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 -$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } -if ${ac_cv_os_cray+:} false; then : - $as_echo_n "(cached) " >&6 -else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif +int +main (void) +{ + + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then : - ac_cv_os_cray=yes -else - ac_cv_os_cray=no + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i fi -rm -f conftest* - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 -$as_echo "$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - break -fi - done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 -$as_echo_n "checking stack direction for C alloca... " >&6; } -if ${ac_cv_c_stack_direction+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_c_stack_direction=0 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 +printf %s "checking whether the compiler is clang... " >&6; } +if test ${gl_cv_compiler_clang+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_includes_default + + #ifdef __clang__ + barfbarf + #endif + int -find_stack_direction (int *addr, int depth) +main (void) { - int dir, dummy = 0; - if (! addr) - addr = &dummy; - *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; - dir = depth ? find_stack_direction (addr, depth - 1) : 0; - return dir + dummy; + + ; + return 0; } +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_compiler_clang=no +else $as_nop + gl_cv_compiler_clang=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5 +printf "%s\n" "$gl_cv_compiler_clang" >&6; } + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5 +printf %s "checking for compiler option needed when checking for declarations... " >&6; } +if test ${gl_cv_compiler_check_decl_option+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test $gl_cv_compiler_clang = yes; then + save_ac_compile="$ac_compile" + ac_compile="$ac_compile -Werror=implicit-function-declaration" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int -main (int argc, char **argv) +main (void) { - return find_stack_direction (0, argc + !argv + 20) < 0; + + ; + return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_stack_direction=1 -else - ac_cv_c_stack_direction=-1 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration' +else $as_nop + gl_cv_compiler_check_decl_option=none fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_compile="$save_ac_compile" + else + gl_cv_compiler_check_decl_option=none + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 -$as_echo "$ac_cv_c_stack_direction" >&6; } -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5 +printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; } + if test "x$gl_cv_compiler_check_decl_option" != xnone; then + ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" + else + ac_compile_for_check_decl="$ac_compile" + fi + + + -fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5 -$as_echo_n "checking whether the preprocessor supports include_next... " >&6; } -if ${gl_cv_have_include_next+:} false; then : - $as_echo_n "(cached) " >&6 +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. else - rm -rf conftestd1a conftestd1b conftestd2 - mkdir conftestd1a conftestd1b conftestd2 - cat < conftestd1a/conftest.h -#define DEFINED_IN_CONFTESTD1 -#include_next -#ifdef DEFINED_IN_CONFTESTD2 -int foo; -#else -#error "include_next doesn't work" -#endif -EOF - cat < conftestd1b/conftest.h -#define DEFINED_IN_CONFTESTD1 -#include -#include_next -#ifdef DEFINED_IN_CONFTESTD2 -int foo; -#else -#error "include_next doesn't work" -#endif -EOF - cat < conftestd2/conftest.h -#ifndef DEFINED_IN_CONFTESTD1 -#error "include_next test doesn't work" -#endif -#define DEFINED_IN_CONFTESTD2 -EOF - gl_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_have_include_next=yes -else - CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_have_include_next=buggy -else - gl_cv_have_include_next=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CPPFLAGS="$gl_save_CPPFLAGS" - rm -rf conftestd1a conftestd1b conftestd2 - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5 -$as_echo "$gl_cv_have_include_next" >&6; } - PRAGMA_SYSTEM_HEADER= - if test $gl_cv_have_include_next = yes; then - INCLUDE_NEXT=include_next - INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next - if test -n "$GCC"; then - PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' - fi - else - if test $gl_cv_have_include_next = buggy; then - INCLUDE_NEXT=include - INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next - else - INCLUDE_NEXT=include - INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include - fi - fi - +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5 -$as_echo_n "checking whether system header files limit the line length... " >&6; } -if ${gl_cv_pragma_columns+:} false; then : - $as_echo_n "(cached) " >&6 + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef __TANDEM -choke me -#endif +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "choke me" >/dev/null 2>&1; then : - gl_cv_pragma_columns=yes +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } else - gl_cv_pragma_columns=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5 -$as_echo "$gl_cv_pragma_columns" >&6; } - if test $gl_cv_pragma_columns = yes; then - PRAGMA_COLUMNS="#pragma COLUMNS 10000" + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" else - PRAGMA_COLUMNS= + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX fi +fi + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5 -$as_echo_n "checking for complete errno.h... " >&6; } -if ${gl_cv_header_errno_h_complete+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if !defined ETXTBSY -booboo -#endif -#if !defined ENOMSG -booboo -#endif -#if !defined EIDRM -booboo -#endif -#if !defined ENOLINK -booboo -#endif -#if !defined EPROTO -booboo -#endif -#if !defined EMULTIHOP -booboo -#endif -#if !defined EBADMSG -booboo -#endif -#if !defined EOVERFLOW -booboo -#endif -#if !defined ENOTSUP -booboo -#endif -#if !defined ENETRESET -booboo -#endif -#if !defined ECONNABORTED -booboo -#endif -#if !defined ESTALE -booboo -#endif -#if !defined EDQUOT -booboo -#endif -#if !defined ECANCELED -booboo -#endif -#if !defined EOWNERDEAD -booboo -#endif -#if !defined ENOTRECOVERABLE -booboo -#endif -#if !defined EILSEQ -booboo +int +main (void) +{ +#ifndef __GNUC__ + choke me #endif + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "booboo" >/dev/null 2>&1; then : - gl_cv_header_errno_h_complete=no -else - gl_cv_header_errno_h_complete=yes +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no fi -rm -f conftest* - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5 -$as_echo "$gl_cv_header_errno_h_complete" >&6; } - if test $gl_cv_header_errno_h_complete = yes; then - ERRNO_H='' - else - - - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ - if test $gl_cv_have_include_next = yes; then - gl_cv_next_errno_h='<'errno.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_errno_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + ; + return 0; +} _ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'errno.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - - gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - - gl_header=$gl_cv_absolute_errno_h - gl_cv_next_errno_h='"'$gl_header'"' - - +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5 -$as_echo "$gl_cv_next_errno_h" >&6; } - fi - NEXT_ERRNO_H=$gl_cv_next_errno_h - - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'errno.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_errno_h - fi - NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive - - - - - ERRNO_H='errno.h' +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" fi - - if test -n "$ERRNO_H"; then - GL_GENERATE_ERRNO_H_TRUE= - GL_GENERATE_ERRNO_H_FALSE='#' else - GL_GENERATE_ERRNO_H_TRUE='#' - GL_GENERATE_ERRNO_H_FALSE= + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi fi - - - if test -n "$ERRNO_H"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5 -$as_echo_n "checking for EMULTIHOP value... " >&6; } -if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#ifdef EMULTIHOP -yes -#endif - +$ac_cxx_conftest_cxx11_program _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_EMULTIHOP=yes -else - gl_cv_header_errno_h_EMULTIHOP=no +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg fi -rm -f conftest* - - if test $gl_cv_header_errno_h_EMULTIHOP = no; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#define _XOPEN_SOURCE_EXTENDED 1 -#include -#ifdef EMULTIHOP -yes -#endif - +$ac_cxx_conftest_cxx98_program _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_EMULTIHOP=hidden +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX fi -rm -f conftest* - - if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then - if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" " -#define _XOPEN_SOURCE_EXTENDED 1 -#include -/* The following two lines are a workaround against an autoconf-2.52 bug. */ -#include -#include -"; then : +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi fi - fi - fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5 -$as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; } - case $gl_cv_header_errno_h_EMULTIHOP in - yes | no) - EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE= - ;; - *) - EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP" - ;; - esac +depcc="$CXX" am_compiler_list= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - if test -n "$ERRNO_H"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5 -$as_echo_n "checking for ENOLINK value... " >&6; } -if ${gl_cv_header_errno_h_ENOLINK+:} false; then : - $as_echo_n "(cached) " >&6 -else + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi -#include -#ifdef ENOLINK -yes -#endif +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_ENOLINK=yes + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' else - gl_cv_header_errno_h_ENOLINK=no + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= fi -rm -f conftest* - if test $gl_cv_header_errno_h_ENOLINK = no; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _XOPEN_SOURCE_EXTENDED 1 -#include -#ifdef ENOLINK -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_ENOLINK=hidden -fi -rm -f conftest* - - if test $gl_cv_header_errno_h_ENOLINK = hidden; then - if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" " -#define _XOPEN_SOURCE_EXTENDED 1 -#include -/* The following two lines are a workaround against an autoconf-2.52 bug. */ -#include -#include -"; then : -fi + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 - fi - fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5 -$as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; } - case $gl_cv_header_errno_h_ENOLINK in - yes | no) - ENOLINK_HIDDEN=0; ENOLINK_VALUE= - ;; - *) - ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK" - ;; - esac - - - fi - - - if test -n "$ERRNO_H"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5 -$as_echo_n "checking for EOVERFLOW value... " >&6; } -if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -#include -#ifdef EOVERFLOW -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_EOVERFLOW=yes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build else - gl_cv_header_errno_h_EOVERFLOW=no -fi -rm -f conftest* - - if test $gl_cv_header_errno_h_EOVERFLOW = no; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#define _XOPEN_SOURCE_EXTENDED 1 -#include -#ifdef EOVERFLOW -yes -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - gl_cv_header_errno_h_EOVERFLOW=hidden + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi -rm -f conftest* - - if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then - if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" " -#define _XOPEN_SOURCE_EXTENDED 1 -#include -/* The following two lines are a workaround against an autoconf-2.52 bug. */ -#include -#include -"; then : fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - fi - fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5 -$as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; } - case $gl_cv_header_errno_h_EOVERFLOW in - yes | no) - EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE= - ;; - *) - EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW" - ;; - esac - fi + case "$host_os" in + openbsd*) +printf "%s\n" "#define _ISOC11_SOURCE 1" >>confdefs.h + ;; + esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 -$as_echo_n "checking for stdint.h... " >&6; } -if ${gl_cv_header_stdint_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - #include -int -main () -{ -uintmax_t i = (uintmax_t) -1; return !i; - ; - return 0; -} +#include + Syntax error _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_stdint_h=yes -else - gl_cv_header_stdint_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 -$as_echo "$gl_cv_header_stdint_h" >&6; } - if test $gl_cv_header_stdint_h = yes; then +rm -f conftest.err conftest.i conftest.$ac_ext -cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H_WITH_UINTMAX 1 + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include _ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext - fi +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + done + ac_cv_prog_CPP=$CPP - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 -$as_echo_n "checking for inttypes.h... " >&6; } -if ${gl_cv_header_inttypes_h+:} false; then : - $as_echo_n "(cached) " >&6 +fi + CPP=$ac_cv_prog_CPP else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#include - -int -main () -{ -uintmax_t i = (uintmax_t) -1; return !i; - ; - return 0; -} +#include + Syntax error _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_inttypes_h=yes -else - gl_cv_header_inttypes_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 -$as_echo "$gl_cv_header_inttypes_h" >&6; } - if test $gl_cv_header_inttypes_h = yes; then +rm -f conftest.err conftest.i conftest.$ac_ext -cat >>confdefs.h <<_ACEOF -#define HAVE_INTTYPES_H_WITH_UINTMAX 1 + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include _ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext - fi - - - +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5 -$as_echo_n "checking whether printf supports size specifiers as in C99... " >&6; } -if ${gl_cv_func_printf_sizes_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; - # Guess yes on FreeBSD >= 5. - freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";; - freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; - # Guess yes on Mac OS X >= 10.3. - darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; - darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; - # Guess yes on OpenBSD >= 3.9. - openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) - gl_cv_func_printf_sizes_c99="guessing no";; - openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; - # Guess yes on Solaris >= 2.10. - solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; - solaris*) gl_cv_func_printf_sizes_c99="guessing no";; - # Guess yes on NetBSD >= 3. - netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) - gl_cv_func_printf_sizes_c99="guessing no";; - netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef _MSC_VER - Known -#endif +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_printf_sizes_c99="guessing yes" + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - gl_cv_func_printf_sizes_c99="guessing no" + ac_cv_path_GREP=$GREP fi -rm -f conftest* - ;; - # If we don't know, assume the worst. - *) gl_cv_func_printf_sizes_c99="guessing no";; - esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#if HAVE_STDINT_H_WITH_UINTMAX -# include -#endif -#if HAVE_INTTYPES_H_WITH_UINTMAX -# include -#endif -static char buf[100]; -int main () -{ - int result = 0; -#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX - buf[0] = '\0'; - if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 - || strcmp (buf, "12345671 33") != 0) - result |= 1; -#else - result |= 1; -#endif - buf[0] = '\0'; - if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 - || strcmp (buf, "12345672 33") != 0) - result |= 2; - buf[0] = '\0'; - if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 - || strcmp (buf, "12345673 33") != 0) - result |= 4; - buf[0] = '\0'; - if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 - || strcmp (buf, "1.5 33") != 0) - result |= 8; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_sizes_c99=yes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - gl_cv_func_printf_sizes_c99=no + ac_cv_path_EGREP=$EGREP fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + + fi fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5 -$as_echo "$gl_cv_func_printf_sizes_c99" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5 -$as_echo_n "checking whether printf supports 'long double' arguments... " >&6; } -if ${gl_cv_func_printf_long_double+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 +printf %s "checking for Minix Amsterdam compiler... " >&6; } +if test ${gl_cv_c_amsterdam_compiler+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test "$cross_compiling" = yes; then : - case "$host_os" in - beos*) gl_cv_func_printf_long_double="guessing no";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef _MSC_VER - Known +#ifdef __ACK__ +Amsterdam #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_printf_long_double="guessing yes" -else - gl_cv_func_printf_long_double="guessing no" + $EGREP "Amsterdam" >/dev/null 2>&1 +then : + gl_cv_c_amsterdam_compiler=yes +else $as_nop + gl_cv_c_amsterdam_compiler=no fi -rm -f conftest* +rm -rf conftest* - ;; - *) gl_cv_func_printf_long_double="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 +printf "%s\n" "$gl_cv_c_amsterdam_compiler" >&6; } -#include -#include -static char buf[10000]; -int main () -{ - int result = 0; - buf[0] = '\0'; - if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 - || strcmp (buf, "1.750000 33") != 0) - result |= 1; - buf[0] = '\0'; - if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 - || strcmp (buf, "1.750000e+00 33") != 0) - result |= 2; - buf[0] = '\0'; - if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 - || strcmp (buf, "1.75 33") != 0) - result |= 4; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_long_double=yes + if test $gl_cv_c_amsterdam_compiler = yes; then + if test -z "$AR"; then + AR='cc -c.a' + fi + if test -z "$ARFLAGS"; then + ARFLAGS='-o' + fi + else + : + fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. else - gl_cv_func_printf_long_double=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext fi - - +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5 -$as_echo "$gl_cv_func_printf_long_double" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5 -$as_echo_n "checking whether printf supports infinite 'double' arguments... " >&6; } -if ${gl_cv_func_printf_infinite+:} false; then : - $as_echo_n "(cached) " >&6 +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - if test "$cross_compiling" = yes; then : +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on FreeBSD >= 6. - freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; - freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on Mac OS X >= 10.3. - darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; - darwin*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on HP-UX >= 11. - hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; - hpux*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on NetBSD >= 3. - netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) - gl_cv_func_printf_infinite="guessing no";; - netbsd*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on BeOS. - beos*) gl_cv_func_printf_infinite="guessing yes";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef _MSC_VER - Known -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_printf_infinite="guessing yes" + if test "x$ac_ct_AR" = x; then + AR="ar" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else - gl_cv_func_printf_infinite="guessing no" + AR="$ac_cv_prog_AR" fi -rm -f conftest* - ;; - # If we don't know, assume the worst. - *) gl_cv_func_printf_infinite="guessing no";; - esac + if test -z "$ARFLAGS"; then + ARFLAGS='cr' + fi -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static int -strisnan (const char *string, size_t start_index, size_t end_index) -{ - if (start_index < end_index) - { - if (string[start_index] == '-') - start_index++; - if (start_index + 3 <= end_index - && memcmp (string + start_index, "nan", 3) == 0) - { - start_index += 3; - if (start_index == end_index - || (string[start_index] == '(' && string[end_index - 1] == ')')) - return 1; - } - } - return 0; -} -static int -have_minus_zero () -{ - static double plus_zero = 0.0; - double minus_zero = - plus_zero; - return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; -} -static char buf[10000]; -static double zero = 0.0; -int main () -{ - int result = 0; - if (sprintf (buf, "%f", 1.0 / zero) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 1; - if (sprintf (buf, "%f", -1.0 / zero) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 1; - if (sprintf (buf, "%f", zero / zero) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - if (sprintf (buf, "%e", 1.0 / zero) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 4; - if (sprintf (buf, "%e", -1.0 / zero) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 4; - if (sprintf (buf, "%e", zero / zero) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 8; - if (sprintf (buf, "%g", 1.0 / zero) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 16; - if (sprintf (buf, "%g", -1.0 / zero) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 16; - if (sprintf (buf, "%g", zero / zero) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 32; - /* This test fails on HP-UX 10.20. */ - if (have_minus_zero ()) - if (sprintf (buf, "%g", - zero) < 0 - || strcmp (buf, "-0") != 0) - result |= 64; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_infinite=yes + + if test -z "$RANLIB"; then + if test $gl_cv_c_amsterdam_compiler = yes; then + RANLIB=':' + else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else - gl_cv_func_printf_infinite=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5 -$as_echo "$gl_cv_func_printf_infinite" >&6; } +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; + RANLIB="$ac_cv_prog_RANLIB" +fi -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : + fi + fi - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + # IEEE behaviour is the default on all CPUs except Alpha and SH + # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 + # and the GCC 4.1.2 manual). + case "$host_cpu" in + alpha*) + # On Alpha systems, a compiler option provides the behaviour. + # See the ieee(3) manual page, also available at + # + if test -n "$GCC"; then + # GCC has the option -mieee. + # For full IEEE compliance (rarely needed), use option -mieee-with-inexact. + CPPFLAGS="$CPPFLAGS -mieee" + else + # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact. + # For full IEEE compliance (rarely needed), use option -ieee_with_inexact. + CPPFLAGS="$CPPFLAGS -ieee" + fi + ;; + sh*) + if test -n "$GCC"; then + # GCC has the option -mieee. + CPPFLAGS="$CPPFLAGS -mieee" + fi + ;; + esac -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif + # Pre-early section. - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + # Code from module absolute-header: + # Code from module alloca-opt: + # Code from module assert-h: + # Code from module attribute: + # Code from module errno: + # Code from module extensions: + # Code from module extern-inline: + # Code from module float: + # Code from module fpieee: + + # Code from module fprintf-posix: + # Code from module fpucw: + # Code from module free-posix: + # Code from module frexp-nolibm: + # Code from module frexpl-nolibm: + # Code from module fseterr: + # Code from module gen-header: + # Code from module git-version-gen: + # Code from module havelib: + # Code from module include_next: + # Code from module inttypes-incomplete: + # Code from module isnand-nolibm: + # Code from module isnanf-nolibm: + # Code from module isnanl-nolibm: + # Code from module limits-h: + # Code from module localcharset: + # Code from module math: + # Code from module memchr: + # Code from module multiarch: + # Code from module nocrash: + # Code from module printf-frexp: + # Code from module printf-frexpl: + # Code from module printf-safe: + # Code from module signbit: + # Code from module size_max: + # Code from module snippet/_Noreturn: + # Code from module snippet/arg-nonnull: + # Code from module snippet/c++defs: + # Code from module snippet/warn-on-use: + # Code from module snprintf: + # Code from module ssize_t: + # Code from module stdbool-c99: + # Code from module stddef: + # Code from module stdint: + # Code from module stdio: + # Code from module stdlib: + # Code from module streq: + # Code from module string: + # Code from module sys_types: + # Code from module unistd: + # Code from module unitypes: + # Code from module uniwidth/base: + # Code from module uniwidth/width: + # Code from module vasnprintf: + # Code from module vsnprintf: + # Code from module wchar: + # Code from module wctype-h: + # Code from module wcwidth: + # Code from module xsize: + + + + + + + + + + # Check whether --enable-cross-guesses was given. +if test ${enable_cross_guesses+y} +then : + enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5 +printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;} + enableval=conservative + fi + gl_cross_guesses="$enableval" +else $as_nop + gl_cross_guesses=conservative fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi + if test $gl_cross_guesses = risky; then + gl_cross_guess_normal="guessing yes" + gl_cross_guess_inverted="guessing no" + else + gl_cross_guess_normal="guessing no" + gl_cross_guess_inverted="guessing yes" + fi + LIBC_FATAL_STDERR_=1 + export LIBC_FATAL_STDERR_ + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes +then : + +else $as_nop + +printf "%s\n" "#define size_t unsigned int" >>confdefs.h + fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +printf %s "checking for working alloca.h... " >&6; } +if test ${ac_cv_working_alloca_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_includes_default +#include int -main () +main (void) { - - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; ; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_working_alloca_h=yes +else $as_nop + ac_cv_working_alloca_h=no fi - - fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h -;; #( - no) - ;; #( - universal) - -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - - ;; #( - *) - as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +printf "%s\n" "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then +printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5 -$as_echo_n "checking whether long double and double are the same... " >&6; } -if ${gl_cv_long_double_equals_double+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +printf %s "checking for alloca... " >&6; } +if test ${ac_cv_func_alloca_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test $ac_cv_working_alloca_h = yes; then + ac_cv_func_alloca_works=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include +#include +#ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# elif defined _MSC_VER +# include +# define alloca _alloca +# else +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + int -main () +main (void) { -typedef int check[sizeof (long double) == sizeof (double) - && LDBL_MANT_DIG == DBL_MANT_DIG - && LDBL_MAX_EXP == DBL_MAX_EXP - && LDBL_MIN_EXP == DBL_MIN_EXP - ? 1 : -1]; - +char *p = (char *) alloca (1); + if (p) return 0; ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_long_double_equals_double=yes -else - gl_cv_long_double_equals_double=no +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_func_alloca_works=yes +else $as_nop + ac_cv_func_alloca_works=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +printf "%s\n" "$ac_cv_func_alloca_works" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5 -$as_echo "$gl_cv_long_double_equals_double" >&6; } - if test $gl_cv_long_double_equals_double = yes; then - -$as_echo "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h - HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1 - else - HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0 - fi +if test $ac_cv_func_alloca_works = yes; then +printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. - if test -n "$gl_printf_safe"; then +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext -$as_echo "#define CHECK_PRINTF_SAFE 1" >>confdefs.h +printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h - fi - case "$gl_cv_func_printf_long_double" in - *yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5 -$as_echo_n "checking whether printf supports infinite 'long double' arguments... " >&6; } -if ${gl_cv_func_printf_infinite_long_double+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_cpu" in - # Guess no on ia64, x86_64, i386. - ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; - *) - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; - # Guess yes on FreeBSD >= 6. - freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; - freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; - # Guess yes on HP-UX >= 11. - hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; - hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +printf %s "checking stack direction for C alloca... " >&6; } +if test ${ac_cv_c_stack_direction+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + ac_cv_c_stack_direction=0 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction (int *addr, int depth) +{ + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; +} -#ifdef _MSC_VER - Known -#endif +int +main (int argc, char **argv) +{ + return find_stack_direction (0, argc + !argv + 20) < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_stack_direction=1 +else $as_nop + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +printf "%s\n" "$ac_cv_c_stack_direction" >&6; } +printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h + + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5 +printf %s "checking whether the preprocessor supports include_next... " >&6; } +if test ${gl_cv_have_include_next+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -rf conftestd1a conftestd1b conftestd2 + mkdir conftestd1a conftestd1b conftestd2 + cat < conftestd1a/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd1b/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd2/conftest.h +#ifndef DEFINED_IN_CONFTESTD1 +#error "include_next test doesn't work" +#endif +#define DEFINED_IN_CONFTESTD2 +EOF + gl_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_printf_infinite_long_double="guessing yes" -else - gl_cv_func_printf_infinite_long_double="guessing no" +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_have_include_next=yes +else $as_nop + CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_have_include_next=buggy +else $as_nop + gl_cv_have_include_next=no fi -rm -f conftest* +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ;; - # If we don't know, assume the worst. - *) gl_cv_func_printf_infinite_long_double="guessing no";; - esac - ;; - esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CPPFLAGS="$gl_save_CPPFLAGS" + rm -rf conftestd1a conftestd1b conftestd2 -else +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5 +printf "%s\n" "$gl_cv_have_include_next" >&6; } + PRAGMA_SYSTEM_HEADER= + if test $gl_cv_have_include_next = yes; then + INCLUDE_NEXT=include_next + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next + if test -n "$GCC"; then + PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' + fi + else + if test $gl_cv_have_include_next = buggy; then + INCLUDE_NEXT=include + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next + else + INCLUDE_NEXT=include + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include + fi + fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether source code line length is unlimited" >&5 +printf %s "checking whether source code line length is unlimited... " >&6; } +if test ${gl_cv_source_line_length_unlimited+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#ifdef __TANDEM +choke me +#endif -#include -#if defined __MACH__ && defined __APPLE__ -/* Avoid a crash on Mac OS X. */ -#include -#include -#include -#include -#include -#include -/* The exception port on which our thread listens. */ -static mach_port_t our_exception_port; -/* The main function of the thread listening for exceptions of type - EXC_BAD_ACCESS. */ -static void * -mach_exception_thread (void *arg) -{ - /* Buffer for a message to be received. */ - struct { - mach_msg_header_t head; - mach_msg_body_t msgh_body; - char data[1024]; - } msg; - mach_msg_return_t retval; - /* Wait for a message on the exception port. */ - retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), - our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (retval != MACH_MSG_SUCCESS) - abort (); - exit (1); -} -static void -nocrash_init (void) -{ - mach_port_t self = mach_task_self (); - /* Allocate a port on which the thread shall listen for exceptions. */ - if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) - == KERN_SUCCESS) { - /* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ - if (mach_port_insert_right (self, our_exception_port, our_exception_port, - MACH_MSG_TYPE_MAKE_SEND) - == KERN_SUCCESS) { - /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting - for us. */ - exception_mask_t mask = EXC_MASK_BAD_ACCESS; - /* Create the thread listening on the exception port. */ - pthread_attr_t attr; - pthread_t thread; - if (pthread_attr_init (&attr) == 0 - && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 - && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { - pthread_attr_destroy (&attr); - /* Replace the exception port info for these exceptions with our own. - Note that we replace the exception port for the entire task, not only - for a particular thread. This has the effect that when our exception - port gets the message, the thread specific exception port has already - been asked, and we don't need to bother about it. - See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ - task_set_exception_ports (self, mask, our_exception_port, - EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); - } - } - } -} -#elif defined _WIN32 && ! defined __CYGWIN__ -/* Avoid a crash on native Windows. */ -#define WIN32_LEAN_AND_MEAN -#include -#include -static LONG WINAPI -exception_filter (EXCEPTION_POINTERS *ExceptionInfo) -{ - switch (ExceptionInfo->ExceptionRecord->ExceptionCode) - { - case EXCEPTION_ACCESS_VIOLATION: - case EXCEPTION_IN_PAGE_ERROR: - case EXCEPTION_STACK_OVERFLOW: - case EXCEPTION_GUARD_PAGE: - case EXCEPTION_PRIV_INSTRUCTION: - case EXCEPTION_ILLEGAL_INSTRUCTION: - case EXCEPTION_DATATYPE_MISALIGNMENT: - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - case EXCEPTION_NONCONTINUABLE_EXCEPTION: - exit (1); - } - return EXCEPTION_CONTINUE_SEARCH; -} -static void -nocrash_init (void) -{ - SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); -} -#else -/* Avoid a crash on POSIX systems. */ -#include -#include -/* A POSIX signal handler. */ -static void -exception_handler (int sig) -{ - _exit (1); -} -static void -nocrash_init (void) -{ -#ifdef SIGSEGV - signal (SIGSEGV, exception_handler); +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "choke me" >/dev/null 2>&1 +then : + gl_cv_source_line_length_unlimited=no +else $as_nop + gl_cv_source_line_length_unlimited=yes +fi +rm -rf conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_source_line_length_unlimited" >&5 +printf "%s\n" "$gl_cv_source_line_length_unlimited" >&6; } + if test $gl_cv_source_line_length_unlimited = no; then + PRAGMA_COLUMNS="#pragma COLUMNS 10000" + else + PRAGMA_COLUMNS= + fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5 +printf %s "checking for complete errno.h... " >&6; } +if test ${gl_cv_header_errno_h_complete+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if !defined ETXTBSY +booboo #endif -#ifdef SIGBUS - signal (SIGBUS, exception_handler); +#if !defined ENOMSG +booboo #endif -} +#if !defined EIDRM +booboo #endif - -#include +#if !defined ENOLINK +booboo +#endif +#if !defined EPROTO +booboo +#endif +#if !defined EMULTIHOP +booboo +#endif +#if !defined EBADMSG +booboo +#endif +#if !defined EOVERFLOW +booboo +#endif +#if !defined ENOTSUP +booboo +#endif +#if !defined ENETRESET +booboo +#endif +#if !defined ECONNABORTED +booboo +#endif +#if !defined ESTALE +booboo +#endif +#if !defined EDQUOT +booboo +#endif +#if !defined ECANCELED +booboo +#endif +#if !defined EOWNERDEAD +booboo +#endif +#if !defined ENOTRECOVERABLE +booboo +#endif +#if !defined EILSEQ +booboo +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "booboo" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_complete=no +else $as_nop + gl_cv_header_errno_h_complete=yes +fi +rm -rf conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5 +printf "%s\n" "$gl_cv_header_errno_h_complete" >&6; } + if test $gl_cv_header_errno_h_complete = yes; then + GL_GENERATE_ERRNO_H=false + else + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_errno_h='<'errno.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_errno_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'errno.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_errno_h + gl_cv_next_errno_h='"'$gl_header'"' + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5 +printf "%s\n" "$gl_cv_next_errno_h" >&6; } + fi + NEXT_ERRNO_H=$gl_cv_next_errno_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'errno.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_errno_h + fi + NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive + + + + + GL_GENERATE_ERRNO_H=true + fi + + if $GL_GENERATE_ERRNO_H; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5 +printf %s "checking for EMULTIHOP value... " >&6; } +if test ${gl_cv_header_errno_h_EMULTIHOP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef EMULTIHOP +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_EMULTIHOP=yes +else $as_nop + gl_cv_header_errno_h_EMULTIHOP=no +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_EMULTIHOP = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#ifdef EMULTIHOP +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_EMULTIHOP=hidden +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then + if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" " +#define _XOPEN_SOURCE_EXTENDED 1 +#include +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +" +then : + +fi + + fi + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5 +printf "%s\n" "$gl_cv_header_errno_h_EMULTIHOP" >&6; } + case $gl_cv_header_errno_h_EMULTIHOP in + yes | no) + EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE= + ;; + *) + EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP" + ;; + esac + + + fi + + + if $GL_GENERATE_ERRNO_H; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5 +printf %s "checking for ENOLINK value... " >&6; } +if test ${gl_cv_header_errno_h_ENOLINK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef ENOLINK +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_ENOLINK=yes +else $as_nop + gl_cv_header_errno_h_ENOLINK=no +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_ENOLINK = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#ifdef ENOLINK +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_ENOLINK=hidden +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_ENOLINK = hidden; then + if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" " +#define _XOPEN_SOURCE_EXTENDED 1 +#include +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +" +then : + +fi + + fi + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5 +printf "%s\n" "$gl_cv_header_errno_h_ENOLINK" >&6; } + case $gl_cv_header_errno_h_ENOLINK in + yes | no) + ENOLINK_HIDDEN=0; ENOLINK_VALUE= + ;; + *) + ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK" + ;; + esac + + + fi + + + if $GL_GENERATE_ERRNO_H; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5 +printf %s "checking for EOVERFLOW value... " >&6; } +if test ${gl_cv_header_errno_h_EOVERFLOW+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef EOVERFLOW +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_EOVERFLOW=yes +else $as_nop + gl_cv_header_errno_h_EOVERFLOW=no +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_EOVERFLOW = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#ifdef EOVERFLOW +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + gl_cv_header_errno_h_EOVERFLOW=hidden +fi +rm -rf conftest* + + if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then + if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" " +#define _XOPEN_SOURCE_EXTENDED 1 +#include +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +" +then : + +fi + + fi + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5 +printf "%s\n" "$gl_cv_header_errno_h_EOVERFLOW" >&6; } + case $gl_cv_header_errno_h_EOVERFLOW in + yes | no) + EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE= + ;; + *) + EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW" + ;; + esac + + + fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ctype.h defines __header_inline" >&5 +printf %s "checking whether ctype.h defines __header_inline... " >&6; } +if test ${gl_cv_have___header_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #ifndef __header_inline + #error " does not define __header_inline" + #endif + +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + gl_cv_have___header_inline=yes +else $as_nop + gl_cv_have___header_inline=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have___header_inline" >&5 +printf "%s\n" "$gl_cv_have___header_inline" >&6; } + if test "$gl_cv_have___header_inline" = yes; then + +printf "%s\n" "#define HAVE___HEADER_INLINE 1" >>confdefs.h + + fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 +printf %s "checking for stdint.h... " >&6; } +if test ${gl_cv_header_stdint_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include +int +main (void) +{ +uintmax_t i = (uintmax_t) -1; return !i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_stdint_h=yes +else $as_nop + gl_cv_header_stdint_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 +printf "%s\n" "$gl_cv_header_stdint_h" >&6; } + if test $gl_cv_header_stdint_h = yes; then + +printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h + + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 +printf %s "checking for inttypes.h... " >&6; } +if test ${gl_cv_header_inttypes_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ +uintmax_t i = (uintmax_t) -1; return !i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_inttypes_h=yes +else $as_nop + gl_cv_header_inttypes_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 +printf "%s\n" "$gl_cv_header_inttypes_h" >&6; } + if test $gl_cv_header_inttypes_h = yes; then + +printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h + + fi + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5 +printf %s "checking whether printf supports size specifiers as in C99... " >&6; } +if test ${gl_cv_func_printf_sizes_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on FreeBSD >= 5. + freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; + midnightbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on Mac OS X >= 10.3. + darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; + darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on OpenBSD >= 3.9. + openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) + gl_cv_func_printf_sizes_c99="guessing no";; + openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on Solaris >= 2.10. + solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; + solaris*) gl_cv_func_printf_sizes_c99="guessing no";; + # Guess yes on NetBSD >= 3. + netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) + gl_cv_func_printf_sizes_c99="guessing no";; + netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_printf_sizes_c99="guessing yes" +else $as_nop + gl_cv_func_printf_sizes_c99="guessing no" +fi +rm -rf conftest* + + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +# include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +# include +#endif +static char buf[100]; +int main () +{ + int result = 0; +#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX + buf[0] = '\0'; + if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 + || strcmp (buf, "12345671 33") != 0) + result |= 1; +#else + result |= 1; +#endif + buf[0] = '\0'; + if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 + || strcmp (buf, "12345672 33") != 0) + result |= 2; + buf[0] = '\0'; + if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 + || strcmp (buf, "12345673 33") != 0) + result |= 4; + buf[0] = '\0'; + if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 + || strcmp (buf, "1.5 33") != 0) + result |= 8; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_sizes_c99=yes +else $as_nop + gl_cv_func_printf_sizes_c99=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5 +printf "%s\n" "$gl_cv_func_printf_sizes_c99" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5 +printf %s "checking whether printf supports 'long double' arguments... " >&6; } +if test ${gl_cv_func_printf_long_double+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess no on BeOS. + beos*) gl_cv_func_printf_long_double="guessing no";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_long_double="guessing yes";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_printf_long_double="guessing yes" +else $as_nop + gl_cv_func_printf_long_double="guessing no" +fi +rm -rf conftest* + + ;; + *) gl_cv_func_printf_long_double="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[10000]; +int main () +{ + int result = 0; + buf[0] = '\0'; + if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 + || strcmp (buf, "1.750000 33") != 0) + result |= 1; + buf[0] = '\0'; + if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 + || strcmp (buf, "1.750000e+00 33") != 0) + result |= 2; + buf[0] = '\0'; + if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 + || strcmp (buf, "1.75 33") != 0) + result |= 4; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_long_double=yes +else $as_nop + gl_cv_func_printf_long_double=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5 +printf "%s\n" "$gl_cv_func_printf_long_double" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5 +printf %s "checking whether printf supports infinite 'double' arguments... " >&6; } +if test ${gl_cv_func_printf_infinite+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on FreeBSD >= 6. + freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; + midnightbsd*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on Mac OS X >= 10.3. + darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; + darwin*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on HP-UX >= 11. + hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; + hpux*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on NetBSD >= 3. + netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) + gl_cv_func_printf_infinite="guessing no";; + netbsd*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on OpenBSD >= 6.0. + openbsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; + openbsd*) gl_cv_func_printf_infinite="guessing yes";; + # Guess yes on BeOS. + beos*) gl_cv_func_printf_infinite="guessing yes";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_infinite="guessing no";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_printf_infinite="guessing yes" +else $as_nop + gl_cv_func_printf_infinite="guessing no" +fi +rm -rf conftest* + + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static int +strisnan (const char *string, size_t start_index, size_t end_index) +{ + if (start_index < end_index) + { + if (string[start_index] == '-') + start_index++; + if (start_index + 3 <= end_index + && memcmp (string + start_index, "nan", 3) == 0) + { + start_index += 3; + if (start_index == end_index + || (string[start_index] == '(' && string[end_index - 1] == ')')) + return 1; + } + } + return 0; +} +static int +have_minus_zero () +{ + static double plus_zero = 0.0; + double minus_zero = - plus_zero; + return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; +} +static char buf[10000]; +static double zero = 0.0; +int main () +{ + int result = 0; + if (sprintf (buf, "%f", 1.0 / zero) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 1; + if (sprintf (buf, "%f", -1.0 / zero) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 1; + if (sprintf (buf, "%f", zero / zero) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + if (sprintf (buf, "%e", 1.0 / zero) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 4; + if (sprintf (buf, "%e", -1.0 / zero) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 4; + if (sprintf (buf, "%e", zero / zero) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 8; + if (sprintf (buf, "%g", 1.0 / zero) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 16; + if (sprintf (buf, "%g", -1.0 / zero) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 16; + if (sprintf (buf, "%g", zero / zero) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 32; + /* This test fails on HP-UX 10.20. */ + if (have_minus_zero ()) + if (sprintf (buf, "%g", - zero) < 0 + || strcmp (buf, "-0") != 0) + result |= 64; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_infinite=yes +else $as_nop + gl_cv_func_printf_infinite=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5 +printf "%s\n" "$gl_cv_func_printf_infinite" >&6; } + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes +then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + unsigned short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + unsigned short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + unsigned short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main (void) +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_bigendian=no +else $as_nop + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5 +printf %s "checking whether long double and double are the same... " >&6; } +if test ${gl_cv_long_double_equals_double+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +typedef int check[sizeof (long double) == sizeof (double) + && LDBL_MANT_DIG == DBL_MANT_DIG + && LDBL_MAX_EXP == DBL_MAX_EXP + && LDBL_MIN_EXP == DBL_MIN_EXP + ? 1 : -1]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_long_double_equals_double=yes +else $as_nop + gl_cv_long_double_equals_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5 +printf "%s\n" "$gl_cv_long_double_equals_double" >&6; } + if test $gl_cv_long_double_equals_double = yes; then + +printf "%s\n" "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h + + HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1 + else + HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0 + fi + + + + + + + + if test -n "$gl_printf_safe"; then + +printf "%s\n" "#define CHECK_PRINTF_SAFE 1" >>confdefs.h + + fi + case "$gl_cv_func_printf_long_double" in + *yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5 +printf %s "checking whether printf supports infinite 'long double' arguments... " >&6; } +if test ${gl_cv_func_printf_infinite_long_double+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host_cpu" in + # Guess no on ia64, x86_64, i386. + ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; + *) + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";; + # Guess yes on FreeBSD >= 6. + freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; + midnightbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; + # Guess yes on HP-UX >= 11. + hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; + hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; + # Guess yes on OpenBSD >= 6.0. + openbsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; + openbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_printf_infinite_long_double="guessing yes" +else $as_nop + gl_cv_func_printf_infinite_long_double="guessing no" +fi +rm -rf conftest* + + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";; + esac + ;; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#include +#if defined __MACH__ && defined __APPLE__ +/* Avoid a crash on Mac OS X. */ +#include +#include +#include +#include +#include +#include +/* The exception port on which our thread listens. */ +static mach_port_t our_exception_port; +/* The main function of the thread listening for exceptions of type + EXC_BAD_ACCESS. */ +static void * +mach_exception_thread (void *arg) +{ + /* Buffer for a message to be received. */ + struct { + mach_msg_header_t head; + mach_msg_body_t msgh_body; + char data[1024]; + } msg; + mach_msg_return_t retval; + /* Wait for a message on the exception port. */ + retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), + our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (retval != MACH_MSG_SUCCESS) + abort (); + exit (1); +} +static void +nocrash_init (void) +{ + mach_port_t self = mach_task_self (); + /* Allocate a port on which the thread shall listen for exceptions. */ + if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) + == KERN_SUCCESS) { + /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ + if (mach_port_insert_right (self, our_exception_port, our_exception_port, + MACH_MSG_TYPE_MAKE_SEND) + == KERN_SUCCESS) { + /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting + for us. */ + exception_mask_t mask = EXC_MASK_BAD_ACCESS; + /* Create the thread listening on the exception port. */ + pthread_attr_t attr; + pthread_t thread; + if (pthread_attr_init (&attr) == 0 + && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 + && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { + pthread_attr_destroy (&attr); + /* Replace the exception port info for these exceptions with our own. + Note that we replace the exception port for the entire task, not only + for a particular thread. This has the effect that when our exception + port gets the message, the thread specific exception port has already + been asked, and we don't need to bother about it. + See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ + task_set_exception_ports (self, mask, our_exception_port, + EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); + } + } + } +} +#elif defined _WIN32 && ! defined __CYGWIN__ +/* Avoid a crash on native Windows. */ +#define WIN32_LEAN_AND_MEAN +#include +#include +static LONG WINAPI +exception_filter (EXCEPTION_POINTERS *ExceptionInfo) +{ + switch (ExceptionInfo->ExceptionRecord->ExceptionCode) + { + case EXCEPTION_ACCESS_VIOLATION: + case EXCEPTION_IN_PAGE_ERROR: + case EXCEPTION_STACK_OVERFLOW: + case EXCEPTION_GUARD_PAGE: + case EXCEPTION_PRIV_INSTRUCTION: + case EXCEPTION_ILLEGAL_INSTRUCTION: + case EXCEPTION_DATATYPE_MISALIGNMENT: + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + exit (1); + } + return EXCEPTION_CONTINUE_SEARCH; +} +static void +nocrash_init (void) +{ + SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); +} +#else +/* Avoid a crash on POSIX systems. */ +#include +#include +/* A POSIX signal handler. */ +static void +exception_handler (int sig) +{ + _exit (1); +} +static void +nocrash_init (void) +{ +#ifdef SIGSEGV + signal (SIGSEGV, exception_handler); +#endif +#ifdef SIGBUS + signal (SIGBUS, exception_handler); +#endif +} +#endif + +#include +#include +#include +static int +strisnan (const char *string, size_t start_index, size_t end_index) +{ + if (start_index < end_index) + { + if (string[start_index] == '-') + start_index++; + if (start_index + 3 <= end_index + && memcmp (string + start_index, "nan", 3) == 0) + { + start_index += 3; + if (start_index == end_index + || (string[start_index] == '(' && string[end_index - 1] == ')')) + return 1; + } + } + return 0; +} +static char buf[10000]; +static long double zeroL = 0.0L; +int main () +{ + int result = 0; + nocrash_init(); + if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 1; + if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Le", zeroL / zeroL) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 1; + if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 + || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 + || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) + result |= 1; + if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 1; +#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE +/* Representation of an 80-bit 'long double' as an initializer for a sequence + of 'unsigned int' words. */ +# ifdef WORDS_BIGENDIAN +# define LDBL80_WORDS(exponent,manthi,mantlo) \ + { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ + ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ + (unsigned int) (mantlo) << 16 \ + } +# else +# define LDBL80_WORDS(exponent,manthi,mantlo) \ + { mantlo, manthi, exponent } +# endif + { /* Quiet NaN. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + if (sprintf (buf, "%Le", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + if (sprintf (buf, "%Lg", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + } + { + /* Signalling NaN. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + if (sprintf (buf, "%Le", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + if (sprintf (buf, "%Lg", x.value) < 0 + || !strisnan (buf, 0, strlen (buf))) + result |= 2; + } + { /* Pseudo-NaN. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) <= 0) + result |= 4; + if (sprintf (buf, "%Le", x.value) <= 0) + result |= 4; + if (sprintf (buf, "%Lg", x.value) <= 0) + result |= 4; + } + { /* Pseudo-Infinity. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) <= 0) + result |= 8; + if (sprintf (buf, "%Le", x.value) <= 0) + result |= 8; + if (sprintf (buf, "%Lg", x.value) <= 0) + result |= 8; + } + { /* Pseudo-Zero. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) <= 0) + result |= 16; + if (sprintf (buf, "%Le", x.value) <= 0) + result |= 16; + if (sprintf (buf, "%Lg", x.value) <= 0) + result |= 16; + } + { /* Unnormalized number. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) <= 0) + result |= 32; + if (sprintf (buf, "%Le", x.value) <= 0) + result |= 32; + if (sprintf (buf, "%Lg", x.value) <= 0) + result |= 32; + } + { /* Pseudo-Denormal. */ + static union { unsigned int word[4]; long double value; } x = + { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; + if (sprintf (buf, "%Lf", x.value) <= 0) + result |= 64; + if (sprintf (buf, "%Le", x.value) <= 0) + result |= 64; + if (sprintf (buf, "%Lg", x.value) <= 0) + result |= 64; + } +#endif + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_infinite_long_double=yes +else $as_nop + gl_cv_func_printf_infinite_long_double=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5 +printf "%s\n" "$gl_cv_func_printf_infinite_long_double" >&6; } + ;; + *) + gl_cv_func_printf_infinite_long_double="irrelevant" + ;; + esac + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5 +printf %s "checking whether printf supports the 'a' and 'A' directives... " >&6; } +if test ${gl_cv_func_printf_directive_a+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc >= 2.5 systems. + *-gnu* | gnu*) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifdef __GNU_LIBRARY__ + #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ + BZ2908 + #endif + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "BZ2908" >/dev/null 2>&1 +then : + gl_cv_func_printf_directive_a="guessing yes" +else $as_nop + gl_cv_func_printf_directive_a="guessing no" +fi +rm -rf conftest* + + ;; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_directive_a="guessing yes";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_directive_a="guessing no";; + # Guess no on native Windows. + mingw*) gl_cv_func_printf_directive_a="guessing no";; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[100]; +static double zero = 0.0; +int main () +{ + int result = 0; + if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 + || (strcmp (buf, "0x1.922p+1 33") != 0 + && strcmp (buf, "0x3.244p+0 33") != 0 + && strcmp (buf, "0x6.488p-1 33") != 0 + && strcmp (buf, "0xc.91p-2 33") != 0)) + result |= 1; + if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 + || (strcmp (buf, "-0X1.922P+1 33") != 0 + && strcmp (buf, "-0X3.244P+0 33") != 0 + && strcmp (buf, "-0X6.488P-1 33") != 0 + && strcmp (buf, "-0XC.91P-2 33") != 0)) + result |= 2; + /* This catches a FreeBSD 13.0 bug: it doesn't round. */ + if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 + || (strcmp (buf, "0x1.83p+0 33") != 0 + && strcmp (buf, "0x3.05p-1 33") != 0 + && strcmp (buf, "0x6.0ap-2 33") != 0 + && strcmp (buf, "0xc.14p-3 33") != 0)) + result |= 4; + /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ + if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 + || (strcmp (buf, "0x2p+0 33") != 0 + && strcmp (buf, "0x3p-1 33") != 0 + && strcmp (buf, "0x6p-2 33") != 0 + && strcmp (buf, "0xcp-3 33") != 0)) + result |= 4; + /* This catches a FreeBSD 6.1 bug. See + */ + if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 + || buf[0] == '0') + result |= 8; + /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ + if (sprintf (buf, "%.1a", 1.999) < 0 + || (strcmp (buf, "0x1.0p+1") != 0 + && strcmp (buf, "0x2.0p+0") != 0 + && strcmp (buf, "0x4.0p-1") != 0 + && strcmp (buf, "0x8.0p-2") != 0)) + result |= 16; + /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a + glibc 2.4 bug . */ + if (sprintf (buf, "%.1La", 1.999L) < 0 + || (strcmp (buf, "0x1.0p+1") != 0 + && strcmp (buf, "0x2.0p+0") != 0 + && strcmp (buf, "0x4.0p-1") != 0 + && strcmp (buf, "0x8.0p-2") != 0)) + result |= 32; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_directive_a=yes +else $as_nop + gl_cv_func_printf_directive_a=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5 +printf "%s\n" "$gl_cv_func_printf_directive_a" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5 +printf %s "checking whether printf supports the 'F' directive... " >&6; } +if test ${gl_cv_func_printf_directive_f+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_directive_f="guessing yes";; + # Guess yes on FreeBSD >= 6. + freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; + midnightbsd*) gl_cv_func_printf_directive_f="guessing yes";; + # Guess yes on Mac OS X >= 10.3. + darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; + darwin*) gl_cv_func_printf_directive_f="guessing yes";; + # Guess yes on OpenBSD >= 6.0. + openbsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; + openbsd*) gl_cv_func_printf_directive_f="guessing yes";; + # Guess yes on Solaris >= 2.10. + solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";; + solaris*) gl_cv_func_printf_directive_f="guessing no";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_directive_f="guessing no";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_printf_directive_f="guessing yes" +else $as_nop + gl_cv_func_printf_directive_f="guessing no" +fi +rm -rf conftest* + + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[100]; +static double zero = 0.0; +int main () +{ + int result = 0; + if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 + || strcmp (buf, "1234567.000000 33") != 0) + result |= 1; + if (sprintf (buf, "%F", 1.0 / zero) < 0 + || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) + result |= 2; + /* This catches a Cygwin 1.5.x bug. */ + if (sprintf (buf, "%.F", 1234.0) < 0 + || strcmp (buf, "1234") != 0) + result |= 4; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_directive_f=yes +else $as_nop + gl_cv_func_printf_directive_f=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5 +printf "%s\n" "$gl_cv_func_printf_directive_f" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5 +printf %s "checking whether printf supports the 'n' directive... " >&6; } +if test ${gl_cv_func_printf_directive_n+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess no on glibc when _FORTIFY_SOURCE >= 2. + *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if _FORTIFY_SOURCE >= 2 + error fail + #endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_func_printf_directive_n="guessing yes" +else $as_nop + gl_cv_func_printf_directive_n="guessing no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_directive_n="guessing no";; + # Guess no on native Windows. + mingw*) gl_cv_func_printf_directive_n="guessing no";; + *) gl_cv_func_printf_directive_n="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#ifdef _MSC_VER +#include +/* See page about "Parameter Validation" on msdn.microsoft.com. + + */ +static void cdecl +invalid_parameter_handler (const wchar_t *expression, + const wchar_t *function, + const wchar_t *file, unsigned int line, + uintptr_t dummy) +{ + exit (1); +} +#endif +static char fmtstring[10]; +static char buf[100]; +int main () +{ + int count = -1; +#ifdef _MSC_VER + _set_invalid_parameter_handler (invalid_parameter_handler); +#endif + /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) + support %n in format strings in read-only memory but not in writable + memory. */ + strcpy (fmtstring, "%d %n"); + if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 + || strcmp (buf, "123 ") != 0 + || count != 4) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_directive_n=yes +else $as_nop + gl_cv_func_printf_directive_n=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5 +printf "%s\n" "$gl_cv_func_printf_directive_n" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5 +printf %s "checking whether printf supports the 'ls' directive... " >&6; } +if test ${gl_cv_func_printf_directive_ls+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on OpenBSD >= 6.0. + openbsd[1-5].*) gl_cv_func_printf_directive_ls="guessing no";; + openbsd*) gl_cv_func_printf_directive_ls="guessing yes";; + irix*) gl_cv_func_printf_directive_ls="guessing no";; + solaris*) gl_cv_func_printf_directive_ls="guessing no";; + cygwin*) gl_cv_func_printf_directive_ls="guessing no";; + beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_directive_ls="guessing no";; + # Guess yes on native Windows. + mingw*) gl_cv_func_printf_directive_ls="guessing yes";; + *) gl_cv_func_printf_directive_ls="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +int main () +{ + int result = 0; + char buf[100]; + /* Test whether %ls works at all. + This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on + Cygwin 1.5. */ + { + static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; + buf[0] = '\0'; + if (sprintf (buf, "%ls", wstring) < 0 + || strcmp (buf, "abc") != 0) + result |= 1; + } + /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an + assertion failure inside libc), but not on OpenBSD 4.0. */ + { + static const wchar_t wstring[] = { 'a', 0 }; + buf[0] = '\0'; + if (sprintf (buf, "%ls", wstring) < 0 + || strcmp (buf, "a") != 0) + result |= 2; + } + /* Test whether precisions in %ls are supported as specified in ISO C 99 + section 7.19.6.1: + "If a precision is specified, no more than that many bytes are written + (including shift sequences, if any), and the array shall contain a + null wide character if, to equal the multibyte character sequence + length given by the precision, the function would need to access a + wide character one past the end of the array." + This test fails on Solaris 10. */ + { + static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; + buf[0] = '\0'; + if (sprintf (buf, "%.2ls", wstring) < 0 + || strcmp (buf, "ab") != 0) + result |= 8; + } + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_directive_ls=yes +else $as_nop + gl_cv_func_printf_directive_ls=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5 +printf "%s\n" "$gl_cv_func_printf_directive_ls" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 +printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } +if test ${gl_cv_func_printf_positions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) + gl_cv_func_printf_positions="guessing no";; + beos*) gl_cv_func_printf_positions="guessing no";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_positions="guessing yes";; + # Guess no on native Windows. + mingw* | pw*) gl_cv_func_printf_positions="guessing no";; + *) gl_cv_func_printf_positions="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_positions=yes +else $as_nop + gl_cv_func_printf_positions=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 +printf "%s\n" "$gl_cv_func_printf_positions" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5 +printf %s "checking whether printf supports the grouping flag... " >&6; } +if test ${gl_cv_func_printf_flag_grouping+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; + netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";; + # Guess no on native Windows. + mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; + *) gl_cv_func_printf_flag_grouping="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[100]; +int main () +{ + if (sprintf (buf, "%'d %d", 1234567, 99) < 0 + || buf[strlen (buf) - 1] != '9') + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_flag_grouping=yes +else $as_nop + gl_cv_func_printf_flag_grouping=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5 +printf "%s\n" "$gl_cv_func_printf_flag_grouping" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5 +printf %s "checking whether printf supports the left-adjust flag correctly... " >&6; } +if test ${gl_cv_func_printf_flag_leftadjust+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on HP-UX 11. + hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; + # Guess no on HP-UX 10 and older. + hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";; + # Guess yes on native Windows. + mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";; + # Guess yes otherwise. + *) gl_cv_func_printf_flag_leftadjust="guessing yes";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[100]; +int main () +{ + /* Check that a '-' flag is not annihilated by a negative width. */ + if (sprintf (buf, "a%-*sc", -3, "b") < 0 + || strcmp (buf, "ab c") != 0) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_flag_leftadjust=yes +else $as_nop + gl_cv_func_printf_flag_leftadjust=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5 +printf "%s\n" "$gl_cv_func_printf_flag_leftadjust" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5 +printf %s "checking whether printf supports the zero flag correctly... " >&6; } +if test ${gl_cv_func_printf_flag_zero+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_printf_flag_zero="guessing yes";; + # Guess yes on BeOS. + beos*) gl_cv_func_printf_flag_zero="guessing yes";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_flag_zero="guessing no";; + # Guess no on native Windows. + mingw*) gl_cv_func_printf_flag_zero="guessing no";; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[100]; +static double zero = 0.0; +int main () +{ + if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 + || (strcmp (buf, " inf") != 0 + && strcmp (buf, " infinity") != 0)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_flag_zero=yes +else $as_nop + gl_cv_func_printf_flag_zero=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5 +printf "%s\n" "$gl_cv_func_printf_flag_zero" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5 +printf %s "checking whether printf supports large precisions... " >&6; } +if test ${gl_cv_func_printf_precision+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess no only on Solaris, native Windows, and BeOS systems. + solaris*) gl_cv_func_printf_precision="guessing no" ;; + mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; + beos*) gl_cv_func_printf_precision="guessing no" ;; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_precision="guessing yes" ;; + *) gl_cv_func_printf_precision="guessing yes" ;; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +static char buf[5000]; +int main () +{ + int result = 0; +#ifdef __BEOS__ + /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ + return 1; +#endif + if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) + result |= 1; + if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) + result |= 2; + if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 + || buf[0] != '1') + result |= 4; + if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 + || buf[0] != '1') + result |= 4; + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_precision=yes +else $as_nop + gl_cv_func_printf_precision=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5 +printf "%s\n" "$gl_cv_func_printf_precision" >&6; } + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5 +printf %s "checking whether the compiler produces multi-arch binaries... " >&6; } +if test ${gl_cv_c_multiarch+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_cv_c_multiarch=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + arch= + prev= + for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do + if test -n "$prev"; then + case $word in + i?86 | x86_64 | ppc | ppc64 | arm | arm64) + if test -z "$arch" || test "$arch" = "$word"; then + arch="$word" + else + gl_cv_c_multiarch=yes + fi + ;; + esac + prev= + else + if test "x$word" = "x-arch"; then + prev=arch + fi + fi + done + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5 +printf "%s\n" "$gl_cv_c_multiarch" >&6; } + if test $gl_cv_c_multiarch = yes; then + APPLE_UNIVERSAL_BUILD=1 + else + APPLE_UNIVERSAL_BUILD=0 + fi + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5 +printf %s "checking whether printf survives out-of-memory conditions... " >&6; } +if test ${gl_cv_func_printf_enomem+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + gl_cv_func_printf_enomem="guessing no" + if test "$cross_compiling" = no; then + if test $APPLE_UNIVERSAL_BUILD = 0; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#include +#if defined __MACH__ && defined __APPLE__ +/* Avoid a crash on Mac OS X. */ +#include +#include +#include +#include +#include +#include +/* The exception port on which our thread listens. */ +static mach_port_t our_exception_port; +/* The main function of the thread listening for exceptions of type + EXC_BAD_ACCESS. */ +static void * +mach_exception_thread (void *arg) +{ + /* Buffer for a message to be received. */ + struct { + mach_msg_header_t head; + mach_msg_body_t msgh_body; + char data[1024]; + } msg; + mach_msg_return_t retval; + /* Wait for a message on the exception port. */ + retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), + our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (retval != MACH_MSG_SUCCESS) + abort (); + exit (1); +} +static void +nocrash_init (void) +{ + mach_port_t self = mach_task_self (); + /* Allocate a port on which the thread shall listen for exceptions. */ + if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) + == KERN_SUCCESS) { + /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ + if (mach_port_insert_right (self, our_exception_port, our_exception_port, + MACH_MSG_TYPE_MAKE_SEND) + == KERN_SUCCESS) { + /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting + for us. */ + exception_mask_t mask = EXC_MASK_BAD_ACCESS; + /* Create the thread listening on the exception port. */ + pthread_attr_t attr; + pthread_t thread; + if (pthread_attr_init (&attr) == 0 + && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 + && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { + pthread_attr_destroy (&attr); + /* Replace the exception port info for these exceptions with our own. + Note that we replace the exception port for the entire task, not only + for a particular thread. This has the effect that when our exception + port gets the message, the thread specific exception port has already + been asked, and we don't need to bother about it. + See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ + task_set_exception_ports (self, mask, our_exception_port, + EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); + } + } + } +} +#elif defined _WIN32 && ! defined __CYGWIN__ +/* Avoid a crash on native Windows. */ +#define WIN32_LEAN_AND_MEAN +#include +#include +static LONG WINAPI +exception_filter (EXCEPTION_POINTERS *ExceptionInfo) +{ + switch (ExceptionInfo->ExceptionRecord->ExceptionCode) + { + case EXCEPTION_ACCESS_VIOLATION: + case EXCEPTION_IN_PAGE_ERROR: + case EXCEPTION_STACK_OVERFLOW: + case EXCEPTION_GUARD_PAGE: + case EXCEPTION_PRIV_INSTRUCTION: + case EXCEPTION_ILLEGAL_INSTRUCTION: + case EXCEPTION_DATATYPE_MISALIGNMENT: + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + exit (1); + } + return EXCEPTION_CONTINUE_SEARCH; +} +static void +nocrash_init (void) +{ + SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); +} +#else +/* Avoid a crash on POSIX systems. */ +#include +#include +/* A POSIX signal handler. */ +static void +exception_handler (int sig) +{ + _exit (1); +} +static void +nocrash_init (void) +{ +#ifdef SIGSEGV + signal (SIGSEGV, exception_handler); +#endif +#ifdef SIGBUS + signal (SIGBUS, exception_handler); +#endif +} +#endif + +#include +#include +#include +#include +#include +int main() +{ + struct rlimit limit; + int ret; + nocrash_init (); + /* Some printf implementations allocate temporary space with malloc. */ + /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ +#ifdef RLIMIT_DATA + if (getrlimit (RLIMIT_DATA, &limit) < 0) + return 77; + if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) + limit.rlim_max = 5000000; + limit.rlim_cur = limit.rlim_max; + if (setrlimit (RLIMIT_DATA, &limit) < 0) + return 77; +#endif + /* On Linux systems, malloc() is limited by RLIMIT_AS. */ +#ifdef RLIMIT_AS + if (getrlimit (RLIMIT_AS, &limit) < 0) + return 77; + if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) + limit.rlim_max = 5000000; + limit.rlim_cur = limit.rlim_max; + if (setrlimit (RLIMIT_AS, &limit) < 0) + return 77; +#endif + /* Some printf implementations allocate temporary space on the stack. */ +#ifdef RLIMIT_STACK + if (getrlimit (RLIMIT_STACK, &limit) < 0) + return 77; + if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) + limit.rlim_max = 5000000; + limit.rlim_cur = limit.rlim_max; + if (setrlimit (RLIMIT_STACK, &limit) < 0) + return 77; +#endif + ret = printf ("%.5000000f", 1.0); + return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); +} + +_ACEOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + (./conftest 2>&5 + result=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5 + if test $result != 0 && test $result != 77; then result=1; fi + exit $result + ) >/dev/null 2>/dev/null + case $? in + 0) gl_cv_func_printf_enomem="yes" ;; + 77) gl_cv_func_printf_enomem="guessing no" ;; + *) gl_cv_func_printf_enomem="no" ;; + esac + else + gl_cv_func_printf_enomem="guessing no" + fi + rm -fr conftest* + else + gl_cv_func_printf_enomem="guessing no" + fi + fi + if test "$gl_cv_func_printf_enomem" = "guessing no"; then + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on Solaris. + solaris*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on AIX. + aix*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on HP-UX/hppa. + hpux*) case "$host_cpu" in + hppa*) gl_cv_func_printf_enomem="guessing yes";; + *) gl_cv_func_printf_enomem="guessing no";; + esac + ;; + # Guess yes on IRIX. + irix*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on OSF/1. + osf*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on BeOS. + beos*) gl_cv_func_printf_enomem="guessing yes";; + # Guess yes on Haiku. + haiku*) gl_cv_func_printf_enomem="guessing yes";; + # Guess no on Android. + linux*-android*) gl_cv_func_printf_enomem="guessing no";; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";; + esac + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5 +printf "%s\n" "$gl_cv_func_printf_enomem" >&6; } + + + + case "$gl_cv_func_printf_long_double" in + *yes) + ;; + *) + +printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h + + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_func= +for ac_item in $ac_func_c_list +do + if test $ac_func; then + ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func + if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then + echo "#define $ac_item 1" >> confdefs.h + fi + ac_func= + else + ac_func=$ac_item + fi +done + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 +printf %s "checking for wchar_t... " >&6; } +if test ${gt_cv_c_wchar_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wchar_t foo = (wchar_t)'\0'; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gt_cv_c_wchar_t=yes +else $as_nop + gt_cv_c_wchar_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 +printf "%s\n" "$gt_cv_c_wchar_t" >&6; } + if test $gt_cv_c_wchar_t = yes; then + +printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h + + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 +printf %s "checking for wint_t... " >&6; } +if test ${gt_cv_c_wint_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wint_t foo = (wchar_t)'\0'; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gt_cv_c_wint_t=yes +else $as_nop + gt_cv_c_wint_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 +printf "%s\n" "$gt_cv_c_wint_t" >&6; } + if test $gt_cv_c_wint_t = yes; then + +printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wint_t is large enough" >&5 +printf %s "checking whether wint_t is large enough... " >&6; } +if test ${gl_cv_type_wint_t_large_enough+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_type_wint_t_large_enough=yes +else $as_nop + gl_cv_type_wint_t_large_enough=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_large_enough" >&5 +printf "%s\n" "$gl_cv_type_wint_t_large_enough" >&6; } + if test $gl_cv_type_wint_t_large_enough = no; then + GNULIBHEADERS_OVERRIDE_WINT_T=1 + else + GNULIBHEADERS_OVERRIDE_WINT_T=0 + fi + else + GNULIBHEADERS_OVERRIDE_WINT_T=0 + fi + + + + + + if test $ac_cv_header_features_h = yes; then + HAVE_FEATURES_H=1 + else + HAVE_FEATURES_H=0 + fi + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 +printf %s "checking for intmax_t... " >&6; } +if test ${gt_cv_c_intmax_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif + +int +main (void) +{ +intmax_t x = -1; return !x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gt_cv_c_intmax_t=yes +else $as_nop + gt_cv_c_intmax_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 +printf "%s\n" "$gt_cv_c_intmax_t" >&6; } + if test $gt_cv_c_intmax_t = yes; then + +printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h + + else + +printf "%s\n" "#define intmax_t long long" >>confdefs.h + + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5 +printf %s "checking where to find the exponent in a 'double'... " >&6; } +if test ${gl_cv_cc_double_expbit0+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined arm || defined __arm || defined __arm__ + mixed_endianness +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "mixed_endianness" >/dev/null 2>&1 +then : + gl_cv_cc_double_expbit0="unknown" +else $as_nop + + : +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes +then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + unsigned short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + unsigned short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + unsigned short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main (void) +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_bigendian=no +else $as_nop + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +: + case $ac_cv_c_bigendian in #( + yes) + gl_cv_cc_double_expbit0="word 0 bit 20";; #( + no) + gl_cv_cc_double_expbit0="word 1 bit 20" ;; #( + universal) + +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + gl_cv_cc_double_expbit0="unknown" ;; + esac + + +fi +rm -rf conftest* + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#define NWORDS \ + ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { double value; unsigned int word[NWORDS]; } memory_double; +static unsigned int ored_words[NWORDS]; +static unsigned int anded_words[NWORDS]; +static void add_to_ored_words (double x) +{ + memory_double m; + size_t i; + /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ + memset (&m, 0, sizeof (memory_double)); + m.value = x; + for (i = 0; i < NWORDS; i++) + { + ored_words[i] |= m.word[i]; + anded_words[i] &= m.word[i]; + } +} +int main () +{ + size_t j; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + for (j = 0; j < NWORDS; j++) + anded_words[j] = ~ (unsigned int) 0; + add_to_ored_words (0.25); + add_to_ored_words (0.5); + add_to_ored_words (1.0); + add_to_ored_words (2.0); + add_to_ored_words (4.0); + /* Remove bits that are common (e.g. if representation of the first mantissa + bit is explicit). */ + for (j = 0; j < NWORDS; j++) + ored_words[j] &= ~anded_words[j]; + /* Now find the nonzero word. */ + for (j = 0; j < NWORDS; j++) + if (ored_words[j] != 0) + break; + if (j < NWORDS) + { + size_t i; + for (i = j + 1; i < NWORDS; i++) + if (ored_words[i] != 0) + { + fprintf (fp, "unknown"); + return (fclose (fp) != 0); + } + for (i = 0; ; i++) + if ((ored_words[j] >> i) & 1) + { + fprintf (fp, "word %d bit %d", (int) j, (int) i); + return (fclose (fp) != 0); + } + } + fprintf (fp, "unknown"); + return (fclose (fp) != 0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_double_expbit0=`cat conftest.out` +else $as_nop + gl_cv_cc_double_expbit0="unknown" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + rm -f conftest.out + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5 +printf "%s\n" "$gl_cv_cc_double_expbit0" >&6; } + case "$gl_cv_cc_double_expbit0" in + word*bit*) + word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` + +printf "%s\n" "#define DBL_EXPBIT0_WORD $word" >>confdefs.h + + +printf "%s\n" "#define DBL_EXPBIT0_BIT $bit" >>confdefs.h + + ;; + esac + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5 +printf %s "checking whether snprintf returns a byte count as in C99... " >&6; } +if test ${gl_cv_func_snprintf_retval_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on FreeBSD >= 5. + freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; + midnightbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on Mac OS X >= 10.3. + darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; + darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on OpenBSD >= 3.9. + openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) + gl_cv_func_snprintf_retval_c99="guessing no";; + openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on Solaris >= 2.10. + solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; + solaris*) gl_cv_func_printf_sizes_c99="guessing no";; + # Guess yes on AIX >= 4. + aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; + aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on NetBSD >= 3. + netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) + gl_cv_func_snprintf_retval_c99="guessing no";; + netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on BeOS. + beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on Android. + linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";; + # Guess yes on MSVC, no on mingw. + mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Known +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_snprintf_retval_c99="guessing yes" +else $as_nop + gl_cv_func_snprintf_retval_c99="guessing no" +fi +rm -rf conftest* + + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#if HAVE_SNPRINTF +# define my_snprintf snprintf +#else +# include +static int my_snprintf (char *buf, int size, const char *format, ...) +{ + va_list args; + int ret; + va_start (args, format); + ret = vsnprintf (buf, size, format, args); + va_end (args); + return ret; +} +#endif +static char buf[100]; +int main () +{ + strcpy (buf, "ABCDEF"); + if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) + return 1; + if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) + return 2; + if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) + return 3; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_snprintf_retval_c99=yes +else $as_nop + gl_cv_func_snprintf_retval_c99=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5 +printf "%s\n" "$gl_cv_func_snprintf_retval_c99" >&6; } + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5 +printf %s "checking whether snprintf truncates the result as in C99... " >&6; } +if test ${gl_cv_func_snprintf_truncation_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on FreeBSD >= 5. + freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; + freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + midnightbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on Mac OS X >= 10.3. + darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; + darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on OpenBSD >= 3.9. + openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) + gl_cv_func_snprintf_truncation_c99="guessing no";; + openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on Solaris >= 2.6. + solaris2.[0-5] | solaris2.[0-5].*) + gl_cv_func_snprintf_truncation_c99="guessing no";; + solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on AIX >= 4. + aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; + aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on HP-UX >= 11. + hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; + hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on IRIX >= 6.5. + irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on OSF/1 >= 5. + osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; + osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on NetBSD >= 3. + netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) + gl_cv_func_snprintf_truncation_c99="guessing no";; + netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on BeOS. + beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess yes on Android. + linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; + # Guess no on native Windows. + mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#if HAVE_SNPRINTF +# define my_snprintf snprintf +#else +# include +static int my_snprintf (char *buf, int size, const char *format, ...) +{ + va_list args; + int ret; + va_start (args, format); + ret = vsnprintf (buf, size, format, args); + va_end (args); + return ret; +} +#endif +static char buf[100]; +int main () +{ + strcpy (buf, "ABCDEF"); + my_snprintf (buf, 3, "%d %d", 4567, 89); + if (memcmp (buf, "45\0DEF", 6) != 0) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_snprintf_truncation_c99=yes +else $as_nop + gl_cv_func_snprintf_truncation_c99=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5 +printf "%s\n" "$gl_cv_func_snprintf_truncation_c99" >&6; } + + + + + + ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = xyes +then : + printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" +if test "x$ac_cv_func_strnlen" = xyes +then : + printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen" +if test "x$ac_cv_func_wcslen" = xyes +then : + printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcsnlen" "ac_cv_func_wcsnlen" +if test "x$ac_cv_func_wcsnlen" = xyes +then : + printf "%s\n" "#define HAVE_WCSNLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc" +if test "x$ac_cv_func_mbrtowc" = xyes +then : + printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" +if test "x$ac_cv_func_wcrtomb" = xyes +then : + printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h + +fi + + ac_fn_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl__snprintf" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL__SNPRINTF $ac_have_decl" >>confdefs.h + + + + case "$gl_cv_func_snprintf_retval_c99" in + *yes) + +printf "%s\n" "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h + + ;; + esac + + case "$gl_cv_func_snprintf_truncation_c99" in + *yes) + +printf "%s\n" "#define HAVE_SNPRINTF_TRUNCATION_C99 1" >>confdefs.h + + ;; + esac + + + HAVE_DECL_FCLOSEALL=1; + HAVE_DECL_FPURGE=1; + HAVE_DECL_FSEEKO=1; + HAVE_DECL_FTELLO=1; + HAVE_DECL_GETDELIM=1; + HAVE_DECL_GETLINE=1; + HAVE_DECL_GETW=1; + HAVE_DECL_OBSTACK_PRINTF=1; + HAVE_DECL_PUTW=1; + HAVE_DECL_SNPRINTF=1; + HAVE_DECL_VSNPRINTF=1; + HAVE_DPRINTF=1; + HAVE_FSEEKO=1; + HAVE_FTELLO=1; + HAVE_PCLOSE=1; + HAVE_POPEN=1; + HAVE_RENAMEAT=1; + HAVE_VASPRINTF=1; + HAVE_VDPRINTF=1; + REPLACE_DPRINTF=0; + REPLACE_FCLOSE=0; + REPLACE_FDOPEN=0; + REPLACE_FFLUSH=0; + REPLACE_FOPEN=0; + REPLACE_FOPEN_FOR_FOPEN_GNU=0; + REPLACE_FPRINTF=0; + REPLACE_FPURGE=0; + REPLACE_FREOPEN=0; + REPLACE_FSEEK=0; + REPLACE_FSEEKO=0; + REPLACE_FTELL=0; + REPLACE_FTELLO=0; + REPLACE_GETDELIM=0; + REPLACE_GETLINE=0; + REPLACE_OBSTACK_PRINTF=0; + REPLACE_PERROR=0; + REPLACE_POPEN=0; + REPLACE_PRINTF=0; + REPLACE_REMOVE=0; + REPLACE_RENAME=0; + REPLACE_RENAMEAT=0; + REPLACE_SNPRINTF=0; + REPLACE_SPRINTF=0; + REPLACE_STDIO_READ_FUNCS=0; + REPLACE_STDIO_WRITE_FUNCS=0; + REPLACE_TMPFILE=0; + REPLACE_VASPRINTF=0; + REPLACE_VDPRINTF=0; + REPLACE_VFPRINTF=0; + REPLACE_VPRINTF=0; + REPLACE_VSNPRINTF=0; + REPLACE_VSPRINTF=0; + + + + GL_GNULIB_DPRINTF=0 + + + + GL_GNULIB_FCLOSE=0 + + + + GL_GNULIB_FDOPEN=0 + + + + GL_GNULIB_FFLUSH=0 + + + + GL_GNULIB_FGETC=0 + + + + GL_GNULIB_FGETS=0 + + + + GL_GNULIB_FOPEN=0 + + + + GL_GNULIB_FOPEN_GNU=0 + + + + GL_GNULIB_FPRINTF=0 + + + + GL_GNULIB_FPRINTF_POSIX=0 + + + + GL_GNULIB_FPURGE=0 + + + + GL_GNULIB_FPUTC=0 + + + + GL_GNULIB_FPUTS=0 + + + + GL_GNULIB_FREAD=0 + + + + GL_GNULIB_FREOPEN=0 + + + + GL_GNULIB_FSCANF=0 + + + + GL_GNULIB_FSEEK=0 + + + + GL_GNULIB_FSEEKO=0 + + + + GL_GNULIB_FTELL=0 + + + + GL_GNULIB_FTELLO=0 + + + + GL_GNULIB_FWRITE=0 + + + + GL_GNULIB_GETC=0 + + + + GL_GNULIB_GETCHAR=0 + + + + GL_GNULIB_GETDELIM=0 + + + + GL_GNULIB_GETLINE=0 + + + + GL_GNULIB_OBSTACK_PRINTF=0 + + + + GL_GNULIB_OBSTACK_PRINTF_POSIX=0 + + + + GL_GNULIB_PCLOSE=0 + + + + GL_GNULIB_PERROR=0 + + + + GL_GNULIB_POPEN=0 + + + + GL_GNULIB_PRINTF=0 + + + + GL_GNULIB_PRINTF_POSIX=0 + + + + GL_GNULIB_PUTC=0 + + + + GL_GNULIB_PUTCHAR=0 + + + + GL_GNULIB_PUTS=0 + + + + GL_GNULIB_REMOVE=0 + + + + GL_GNULIB_RENAME=0 + + + + GL_GNULIB_RENAMEAT=0 + + + + GL_GNULIB_SCANF=0 + + + + GL_GNULIB_SNPRINTF=0 + + + + GL_GNULIB_SPRINTF_POSIX=0 + + + + GL_GNULIB_STDIO_H_NONBLOCKING=0 + + + + GL_GNULIB_STDIO_H_SIGPIPE=0 + + + + GL_GNULIB_TMPFILE=0 + + + + GL_GNULIB_VASPRINTF=0 + + + + GL_GNULIB_VFSCANF=0 + + + + GL_GNULIB_VSCANF=0 + + + + GL_GNULIB_VDPRINTF=0 + + + + GL_GNULIB_VFPRINTF=0 + + + + GL_GNULIB_VFPRINTF_POSIX=0 + + + + GL_GNULIB_VPRINTF=0 + + + + GL_GNULIB_VPRINTF_POSIX=0 + + + + GL_GNULIB_VSNPRINTF=0 + + + + GL_GNULIB_VSPRINTF_POSIX=0 + + + + GL_GNULIB_MDA_FCLOSEALL=1 + + + + GL_GNULIB_MDA_FDOPEN=1 + + + + GL_GNULIB_MDA_FILENO=1 + + + + GL_GNULIB_MDA_GETW=1 + + + + GL_GNULIB_MDA_PUTW=1 + + + + GL_GNULIB_MDA_TEMPNAM=1 + + + + + HAVE__EXIT=1; + HAVE_ALIGNED_ALLOC=1; + HAVE_ATOLL=1; + HAVE_CANONICALIZE_FILE_NAME=1; + HAVE_DECL_ECVT=1; + HAVE_DECL_FCVT=1; + HAVE_DECL_GCVT=1; + HAVE_DECL_GETLOADAVG=1; + HAVE_GETPROGNAME=1; + HAVE_GETSUBOPT=1; + HAVE_GRANTPT=1; + HAVE_INITSTATE=1; + HAVE_DECL_INITSTATE=1; + HAVE_MBTOWC=1; + HAVE_MKDTEMP=1; + HAVE_MKOSTEMP=1; + HAVE_MKOSTEMPS=1; + HAVE_MKSTEMP=1; + HAVE_MKSTEMPS=1; + HAVE_POSIX_MEMALIGN=1; + HAVE_POSIX_OPENPT=1; + HAVE_PTSNAME=1; + HAVE_PTSNAME_R=1; + HAVE_QSORT_R=1; + HAVE_RANDOM=1; + HAVE_RANDOM_H=1; + HAVE_RANDOM_R=1; + HAVE_REALLOCARRAY=1; + HAVE_REALPATH=1; + HAVE_RPMATCH=1; + HAVE_SECURE_GETENV=1; + HAVE_SETENV=1; + HAVE_DECL_SETENV=1; + HAVE_SETSTATE=1; + HAVE_DECL_SETSTATE=1; + HAVE_STRTOD=1; + HAVE_STRTOL=1; + HAVE_STRTOLD=1; + HAVE_STRTOLL=1; + HAVE_STRTOUL=1; + HAVE_STRTOULL=1; + HAVE_STRUCT_RANDOM_DATA=1; + HAVE_SYS_LOADAVG_H=0; + HAVE_UNLOCKPT=1; + HAVE_DECL_UNSETENV=1; + REPLACE__EXIT=0; + REPLACE_ALIGNED_ALLOC=0; + REPLACE_CALLOC_FOR_CALLOC_GNU=0; + REPLACE_CALLOC_FOR_CALLOC_POSIX=0; + REPLACE_CANONICALIZE_FILE_NAME=0; + REPLACE_FREE=0; + REPLACE_GETLOADAVG=0; + REPLACE_GETPROGNAME=0; + REPLACE_GETSUBOPT=0; + REPLACE_INITSTATE=0; + REPLACE_MALLOC_FOR_MALLOC_GNU=0; + REPLACE_MALLOC_FOR_MALLOC_POSIX=0; + REPLACE_MBTOWC=0; + REPLACE_MKOSTEMP=0; + REPLACE_MKOSTEMPS=0; + REPLACE_MKSTEMP=0; + REPLACE_POSIX_MEMALIGN=0; + REPLACE_POSIX_OPENPT=0; + REPLACE_PTSNAME=0; + REPLACE_PTSNAME_R=0; + REPLACE_PUTENV=0; + REPLACE_QSORT_R=0; + REPLACE_RANDOM=0; + REPLACE_RANDOM_R=0; + REPLACE_REALLOC_FOR_REALLOC_GNU=0; + REPLACE_REALLOC_FOR_REALLOC_POSIX=0; + REPLACE_REALLOCARRAY=0; + REPLACE_REALPATH=0; + REPLACE_SETENV=0; + REPLACE_SETSTATE=0; + REPLACE_STRTOD=0; + REPLACE_STRTOL=0; + REPLACE_STRTOLD=0; + REPLACE_STRTOLL=0; + REPLACE_STRTOUL=0; + REPLACE_STRTOULL=0; + REPLACE_UNSETENV=0; + REPLACE_WCTOMB=0; + + + + GL_GNULIB__EXIT=0 + + + + GL_GNULIB_ALIGNED_ALLOC=0 + + + + GL_GNULIB_ATOLL=0 + + + + GL_GNULIB_CALLOC_GNU=0 + + + + GL_GNULIB_CALLOC_POSIX=0 + + + + GL_GNULIB_CANONICALIZE_FILE_NAME=0 + + + + GL_GNULIB_FREE_POSIX=0 + + + + GL_GNULIB_GETLOADAVG=0 + + + + GL_GNULIB_GETPROGNAME=0 + + + + GL_GNULIB_GETSUBOPT=0 + + + + GL_GNULIB_GRANTPT=0 + + + + GL_GNULIB_MALLOC_GNU=0 + + + + GL_GNULIB_MALLOC_POSIX=0 + + + + GL_GNULIB_MBTOWC=0 + + + + GL_GNULIB_MKDTEMP=0 + + + + GL_GNULIB_MKOSTEMP=0 + + + + GL_GNULIB_MKOSTEMPS=0 + + + + GL_GNULIB_MKSTEMP=0 + + + + GL_GNULIB_MKSTEMPS=0 + + + + GL_GNULIB_POSIX_MEMALIGN=0 + + + + GL_GNULIB_POSIX_OPENPT=0 + + + + GL_GNULIB_PTSNAME=0 + + + + GL_GNULIB_PTSNAME_R=0 + + + + GL_GNULIB_PUTENV=0 + + + + GL_GNULIB_QSORT_R=0 + + + + GL_GNULIB_RANDOM=0 + + + + GL_GNULIB_RANDOM_R=0 + + + + GL_GNULIB_REALLOCARRAY=0 + + + + GL_GNULIB_REALLOC_GNU=0 + + + + GL_GNULIB_REALLOC_POSIX=0 + + + + GL_GNULIB_REALPATH=0 + + + + GL_GNULIB_RPMATCH=0 + + + + GL_GNULIB_SECURE_GETENV=0 + + + + GL_GNULIB_SETENV=0 + + + + GL_GNULIB_STRTOD=0 + + + + GL_GNULIB_STRTOL=0 + + + + GL_GNULIB_STRTOLD=0 + + + + GL_GNULIB_STRTOLL=0 + + + + GL_GNULIB_STRTOUL=0 + + + + GL_GNULIB_STRTOULL=0 + + + + GL_GNULIB_SYSTEM_POSIX=0 + + + + GL_GNULIB_UNLOCKPT=0 + + + + GL_GNULIB_UNSETENV=0 + + + + GL_GNULIB_WCTOMB=0 + + + + GL_GNULIB_MDA_ECVT=1 + + + + GL_GNULIB_MDA_FCVT=1 + + + + GL_GNULIB_MDA_GCVT=1 + + + + GL_GNULIB_MDA_MKTEMP=1 + + + + GL_GNULIB_MDA_PUTENV=1 + + + + + HAVE_ACOSF=1; + HAVE_ACOSL=1; + HAVE_ASINF=1; + HAVE_ASINL=1; + HAVE_ATANF=1; + HAVE_ATANL=1; + HAVE_ATAN2F=1; + HAVE_CBRT=1; + HAVE_CBRTF=1; + HAVE_CBRTL=1; + HAVE_COPYSIGN=1; + HAVE_COPYSIGNL=1; + HAVE_COSF=1; + HAVE_COSL=1; + HAVE_COSHF=1; + HAVE_EXPF=1; + HAVE_EXPL=1; + HAVE_EXPM1=1; + HAVE_EXPM1F=1; + HAVE_FABSF=1; + HAVE_FABSL=1; + HAVE_FMA=1; + HAVE_FMAF=1; + HAVE_FMAL=1; + HAVE_FMODF=1; + HAVE_FMODL=1; + HAVE_FREXPF=1; + HAVE_HYPOTF=1; + HAVE_HYPOTL=1; + HAVE_ILOGB=1; + HAVE_ILOGBF=1; + HAVE_ILOGBL=1; + HAVE_ISNANF=1; + HAVE_ISNAND=1; + HAVE_ISNANL=1; + HAVE_LDEXPF=1; + HAVE_LOGF=1; + HAVE_LOGL=1; + HAVE_LOG10F=1; + HAVE_LOG10L=1; + HAVE_LOG1P=1; + HAVE_LOG1PF=1; + HAVE_LOG1PL=1; + HAVE_LOGBF=1; + HAVE_LOGBL=1; + HAVE_MODFF=1; + HAVE_MODFL=1; + HAVE_POWF=1; + HAVE_REMAINDER=1; + HAVE_REMAINDERF=1; + HAVE_RINT=1; + HAVE_RINTL=1; + HAVE_SINF=1; + HAVE_SINL=1; + HAVE_SINHF=1; + HAVE_SQRTF=1; + HAVE_SQRTL=1; + HAVE_TANF=1; + HAVE_TANL=1; + HAVE_TANHF=1; + HAVE_DECL_ACOSL=1; + HAVE_DECL_ASINL=1; + HAVE_DECL_ATANL=1; + HAVE_DECL_CBRTF=1; + HAVE_DECL_CBRTL=1; + HAVE_DECL_CEILF=1; + HAVE_DECL_CEILL=1; + HAVE_DECL_COPYSIGNF=1; + HAVE_DECL_COSL=1; + HAVE_DECL_EXPL=1; + HAVE_DECL_EXP2=1; + HAVE_DECL_EXP2F=1; + HAVE_DECL_EXP2L=1; + HAVE_DECL_EXPM1L=1; + HAVE_DECL_FLOORF=1; + HAVE_DECL_FLOORL=1; + HAVE_DECL_FREXPL=1; + HAVE_DECL_LDEXPL=1; + HAVE_DECL_LOGL=1; + HAVE_DECL_LOG10L=1; + HAVE_DECL_LOG2=1; + HAVE_DECL_LOG2F=1; + HAVE_DECL_LOG2L=1; + HAVE_DECL_LOGB=1; + HAVE_DECL_REMAINDER=1; + HAVE_DECL_REMAINDERL=1; + HAVE_DECL_RINTF=1; + HAVE_DECL_ROUND=1; + HAVE_DECL_ROUNDF=1; + HAVE_DECL_ROUNDL=1; + HAVE_DECL_SINL=1; + HAVE_DECL_SQRTL=1; + HAVE_DECL_TANL=1; + HAVE_DECL_TRUNC=1; + HAVE_DECL_TRUNCF=1; + HAVE_DECL_TRUNCL=1; + REPLACE_ACOSF=0; + REPLACE_ASINF=0; + REPLACE_ATANF=0; + REPLACE_ATAN2F=0; + REPLACE_CBRTF=0; + REPLACE_CBRTL=0; + REPLACE_CEIL=0; + REPLACE_CEILF=0; + REPLACE_CEILL=0; + REPLACE_COSF=0; + REPLACE_COSHF=0; + REPLACE_EXPF=0; + REPLACE_EXPL=0; + REPLACE_EXPM1=0; + REPLACE_EXPM1F=0; + REPLACE_EXPM1L=0; + REPLACE_EXP2=0; + REPLACE_EXP2L=0; + REPLACE_FABSL=0; + REPLACE_FLOOR=0; + REPLACE_FLOORF=0; + REPLACE_FLOORL=0; + REPLACE_FMA=0; + REPLACE_FMAF=0; + REPLACE_FMAL=0; + REPLACE_FMOD=0; + REPLACE_FMODF=0; + REPLACE_FMODL=0; + REPLACE_FREXPF=0; + REPLACE_FREXP=0; + REPLACE_FREXPL=0; + REPLACE_HUGE_VAL=0; + REPLACE_HYPOT=0; + REPLACE_HYPOTF=0; + REPLACE_HYPOTL=0; + REPLACE_ILOGB=0; + REPLACE_ILOGBF=0; + REPLACE_ILOGBL=0; + REPLACE_ISFINITE=0; + REPLACE_ISINF=0; + REPLACE_ISNAN=0; + REPLACE_LDEXPL=0; + REPLACE_LOG=0; + REPLACE_LOGF=0; + REPLACE_LOGL=0; + REPLACE_LOG10=0; + REPLACE_LOG10F=0; + REPLACE_LOG10L=0; + REPLACE_LOG1P=0; + REPLACE_LOG1PF=0; + REPLACE_LOG1PL=0; + REPLACE_LOG2=0; + REPLACE_LOG2F=0; + REPLACE_LOG2L=0; + REPLACE_LOGB=0; + REPLACE_LOGBF=0; + REPLACE_LOGBL=0; + REPLACE_MODF=0; + REPLACE_MODFF=0; + REPLACE_MODFL=0; + REPLACE_NAN=0; + REPLACE_REMAINDER=0; + REPLACE_REMAINDERF=0; + REPLACE_REMAINDERL=0; + REPLACE_RINTL=0; + REPLACE_ROUND=0; + REPLACE_ROUNDF=0; + REPLACE_ROUNDL=0; + REPLACE_SIGNBIT=0; + REPLACE_SIGNBIT_USING_BUILTINS=0; + REPLACE_SINF=0; + REPLACE_SINHF=0; + REPLACE_SQRTF=0; + REPLACE_SQRTL=0; + REPLACE_TANF=0; + REPLACE_TANHF=0; + REPLACE_TRUNC=0; + REPLACE_TRUNCF=0; + REPLACE_TRUNCL=0; + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5 +printf %s "checking whether frexp() can be used without linking with libm... " >&6; } +if test ${gl_cv_func_frexp_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + double x; +int +main (void) +{ +int e; return frexp (x, &e) > 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_frexp_no_libm=yes +else $as_nop + gl_cv_func_frexp_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5 +printf "%s\n" "$gl_cv_func_frexp_no_libm" >&6; } + +ac_fn_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_alarm" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_ALARM $ac_have_decl" >>confdefs.h + + + + GL_GNULIB_ACOSF=0 + + + + GL_GNULIB_ACOSL=0 + + + + GL_GNULIB_ASINF=0 + + + + GL_GNULIB_ASINL=0 + + + + GL_GNULIB_ATANF=0 + + + + GL_GNULIB_ATANL=0 + + + + GL_GNULIB_ATAN2F=0 + + + + GL_GNULIB_CBRT=0 + + + + GL_GNULIB_CBRTF=0 + + + + GL_GNULIB_CBRTL=0 + + + + GL_GNULIB_CEIL=0 + + + + GL_GNULIB_CEILF=0 + + + + GL_GNULIB_CEILL=0 + + + + GL_GNULIB_COPYSIGN=0 + + + + GL_GNULIB_COPYSIGNF=0 + + + + GL_GNULIB_COPYSIGNL=0 + + + + GL_GNULIB_COSF=0 + + + + GL_GNULIB_COSL=0 + + + + GL_GNULIB_COSHF=0 + + + + GL_GNULIB_EXPF=0 + + + + GL_GNULIB_EXPL=0 + + + + GL_GNULIB_EXP2=0 + + + + GL_GNULIB_EXP2F=0 + + + + GL_GNULIB_EXP2L=0 + + + + GL_GNULIB_EXPM1=0 + + + + GL_GNULIB_EXPM1F=0 + + + + GL_GNULIB_EXPM1L=0 + + + + GL_GNULIB_FABSF=0 + + + + GL_GNULIB_FABSL=0 + + + + GL_GNULIB_FLOOR=0 + + + + GL_GNULIB_FLOORF=0 + + + + GL_GNULIB_FLOORL=0 + + + + GL_GNULIB_FMA=0 + + + + GL_GNULIB_FMAF=0 + + + + GL_GNULIB_FMAL=0 + + + + GL_GNULIB_FMOD=0 + + + + GL_GNULIB_FMODF=0 + + + + GL_GNULIB_FMODL=0 + + + + GL_GNULIB_FREXPF=0 + + + + GL_GNULIB_FREXP=0 + + + + GL_GNULIB_FREXPL=0 + + + + GL_GNULIB_HYPOT=0 + + + + GL_GNULIB_HYPOTF=0 + + + + GL_GNULIB_HYPOTL=0 + + + + GL_GNULIB_ILOGB=0 + + + + GL_GNULIB_ILOGBF=0 + + + + GL_GNULIB_ILOGBL=0 + + + + GL_GNULIB_ISFINITE=0 + + + + GL_GNULIB_ISINF=0 + + + + GL_GNULIB_ISNAN=0 + + + + GL_GNULIB_ISNANF=0 + + + + GL_GNULIB_ISNAND=0 + + + + GL_GNULIB_ISNANL=0 + + + + GL_GNULIB_LDEXPF=0 + + + + GL_GNULIB_LDEXPL=0 + + + + GL_GNULIB_LOG=0 + + + + GL_GNULIB_LOGF=0 + + + + GL_GNULIB_LOGL=0 + + + + GL_GNULIB_LOG10=0 + + + + GL_GNULIB_LOG10F=0 + + + + GL_GNULIB_LOG10L=0 + + + + GL_GNULIB_LOG1P=0 + + + + GL_GNULIB_LOG1PF=0 + + + + GL_GNULIB_LOG1PL=0 + + + + GL_GNULIB_LOG2=0 + + + + GL_GNULIB_LOG2F=0 + + + + GL_GNULIB_LOG2L=0 + + + + GL_GNULIB_LOGB=0 + + + + GL_GNULIB_LOGBF=0 + + + + GL_GNULIB_LOGBL=0 + + + + GL_GNULIB_MODF=0 + + + + GL_GNULIB_MODFF=0 + + + + GL_GNULIB_MODFL=0 + + + + GL_GNULIB_POWF=0 + + + + GL_GNULIB_REMAINDER=0 + + + + GL_GNULIB_REMAINDERF=0 + + + + GL_GNULIB_REMAINDERL=0 + + + + GL_GNULIB_RINT=0 + + + + GL_GNULIB_RINTF=0 + + + + GL_GNULIB_RINTL=0 + + + + GL_GNULIB_ROUND=0 + + + + GL_GNULIB_ROUNDF=0 + + + + GL_GNULIB_ROUNDL=0 + + + + GL_GNULIB_SIGNBIT=0 + + + + GL_GNULIB_SINF=0 + + + + GL_GNULIB_SINL=0 + + + + GL_GNULIB_SINHF=0 + + + + GL_GNULIB_SQRTF=0 + + + + GL_GNULIB_SQRTL=0 + + + + GL_GNULIB_TANF=0 + + + + GL_GNULIB_TANL=0 + + + + GL_GNULIB_TANHF=0 + + + + GL_GNULIB_TRUNC=0 + + + + GL_GNULIB_TRUNCF=0 + + + + GL_GNULIB_TRUNCL=0 + + + + GL_GNULIB_MDA_J0=1 + + + + GL_GNULIB_MDA_J1=1 + + + + GL_GNULIB_MDA_JN=1 + + + + GL_GNULIB_MDA_Y0=1 + + + + GL_GNULIB_MDA_Y1=1 + + + + GL_GNULIB_MDA_YN=1 + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_limits_h='<'limits.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_limits_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test $ac_cv_header_limits_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'limits.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_limits_h + gl_cv_next_limits_h='"'$gl_header'"' + else + gl_cv_next_limits_h='<'limits.h'>' + fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5 +printf "%s\n" "$gl_cv_next_limits_h" >&6; } + fi + NEXT_LIMITS_H=$gl_cv_next_limits_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'limits.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_limits_h + fi + NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether limits.h has WORD_BIT, BOOL_WIDTH etc." >&5 +printf %s "checking whether limits.h has WORD_BIT, BOOL_WIDTH etc.... " >&6; } +if test ${gl_cv_header_limits_width+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ + #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 + #endif + #include + long long llm = LLONG_MAX; + int wb = WORD_BIT; + int ullw = ULLONG_WIDTH; + int bw = BOOL_WIDTH; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_limits_width=yes +else $as_nop + gl_cv_header_limits_width=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5 +printf "%s\n" "$gl_cv_header_limits_width" >&6; } + if test "$gl_cv_header_limits_width" = yes; then + GL_GENERATE_LIMITS_H=false + else + GL_GENERATE_LIMITS_H=true + fi + + + + + + + +printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h + + + + if test $ac_cv_header_wchar_h = yes; then + HAVE_WCHAR_H=1 + else + HAVE_WCHAR_H=0 + fi + + + + if test $ac_cv_header_inttypes_h = yes; then + HAVE_INTTYPES_H=1 + else + HAVE_INTTYPES_H=0 + fi + + + + if test $ac_cv_header_sys_types_h = yes; then + HAVE_SYS_TYPES_H=1 + else + HAVE_SYS_TYPES_H=0 + fi + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdint_h='<'stdint.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_stdint_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test $ac_cv_header_stdint_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'stdint.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_stdint_h + gl_cv_next_stdint_h='"'$gl_header'"' + else + gl_cv_next_stdint_h='<'stdint.h'>' + fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5 +printf "%s\n" "$gl_cv_next_stdint_h" >&6; } + fi + NEXT_STDINT_H=$gl_cv_next_stdint_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'stdint.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_stdint_h + fi + NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive + + + + + if test $ac_cv_header_stdint_h = yes; then + HAVE_STDINT_H=1 + else + HAVE_STDINT_H=0 + fi + + + if test $ac_cv_header_stdint_h = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5 +printf %s "checking whether stdint.h conforms to C99... " >&6; } +if test ${gl_cv_header_working_stdint_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_cv_header_working_stdint_h=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#define __STDC_CONSTANT_MACROS 1 +#define __STDC_LIMIT_MACROS 1 +#include +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#endif + + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + +#ifdef INT8_MAX +int8_t a1 = INT8_MAX; +int8_t a1min = INT8_MIN; +#endif +#ifdef INT16_MAX +int16_t a2 = INT16_MAX; +int16_t a2min = INT16_MIN; +#endif +#ifdef INT32_MAX +int32_t a3 = INT32_MAX; +int32_t a3min = INT32_MIN; +#endif +#ifdef INT64_MAX +int64_t a4 = INT64_MAX; +int64_t a4min = INT64_MIN; +#endif +#ifdef UINT8_MAX +uint8_t b1 = UINT8_MAX; +#else +typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; +#endif +#ifdef UINT16_MAX +uint16_t b2 = UINT16_MAX; +#endif +#ifdef UINT32_MAX +uint32_t b3 = UINT32_MAX; +#endif +#ifdef UINT64_MAX +uint64_t b4 = UINT64_MAX; +#endif +int_least8_t c1 = INT8_C (0x7f); +int_least8_t c1max = INT_LEAST8_MAX; +int_least8_t c1min = INT_LEAST8_MIN; +int_least16_t c2 = INT16_C (0x7fff); +int_least16_t c2max = INT_LEAST16_MAX; +int_least16_t c2min = INT_LEAST16_MIN; +int_least32_t c3 = INT32_C (0x7fffffff); +int_least32_t c3max = INT_LEAST32_MAX; +int_least32_t c3min = INT_LEAST32_MIN; +int_least64_t c4 = INT64_C (0x7fffffffffffffff); +int_least64_t c4max = INT_LEAST64_MAX; +int_least64_t c4min = INT_LEAST64_MIN; +uint_least8_t d1 = UINT8_C (0xff); +uint_least8_t d1max = UINT_LEAST8_MAX; +uint_least16_t d2 = UINT16_C (0xffff); +uint_least16_t d2max = UINT_LEAST16_MAX; +uint_least32_t d3 = UINT32_C (0xffffffff); +uint_least32_t d3max = UINT_LEAST32_MAX; +uint_least64_t d4 = UINT64_C (0xffffffffffffffff); +uint_least64_t d4max = UINT_LEAST64_MAX; +int_fast8_t e1 = INT_FAST8_MAX; +int_fast8_t e1min = INT_FAST8_MIN; +int_fast16_t e2 = INT_FAST16_MAX; +int_fast16_t e2min = INT_FAST16_MIN; +int_fast32_t e3 = INT_FAST32_MAX; +int_fast32_t e3min = INT_FAST32_MIN; +int_fast64_t e4 = INT_FAST64_MAX; +int_fast64_t e4min = INT_FAST64_MIN; +uint_fast8_t f1 = UINT_FAST8_MAX; +uint_fast16_t f2 = UINT_FAST16_MAX; +uint_fast32_t f3 = UINT_FAST32_MAX; +uint_fast64_t f4 = UINT_FAST64_MAX; +#ifdef INTPTR_MAX +intptr_t g = INTPTR_MAX; +intptr_t gmin = INTPTR_MIN; +#endif +#ifdef UINTPTR_MAX +uintptr_t h = UINTPTR_MAX; +#endif +intmax_t i = INTMAX_MAX; +uintmax_t j = UINTMAX_MAX; + +/* Check that SIZE_MAX has the correct type, if possible. */ +#if 201112 <= __STDC_VERSION__ +int k = _Generic (SIZE_MAX, size_t: 0); +#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \ + || (0x5110 <= __SUNPRO_C && !__STDC__)) +extern size_t k; +extern __typeof__ (SIZE_MAX) k; +#endif + +#include /* for CHAR_BIT */ +#define TYPE_MINIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) +#define TYPE_MAXIMUM(t) \ + ((t) ((t) 0 < (t) -1 \ + ? (t) -1 \ + : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) +struct s { + int check_PTRDIFF: + PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) + && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) + ? 1 : -1; + /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64. */ + int check_SIG_ATOMIC: + SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) + && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) + ? 1 : -1; + int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; + int check_WCHAR: + WCHAR_MIN == TYPE_MINIMUM (wchar_t) + && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) + ? 1 : -1; + /* Detect bug in mingw. */ + int check_WINT: + WINT_MIN == TYPE_MINIMUM (wint_t) + && WINT_MAX == TYPE_MAXIMUM (wint_t) + ? 1 : -1; + + /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ + int check_UINT8_C: + (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; + int check_UINT16_C: + (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; + + /* Detect bugs in OpenBSD 3.9 stdint.h. */ +#ifdef UINT8_MAX + int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; +#endif +#ifdef UINT16_MAX + int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; +#endif +#ifdef UINT32_MAX + int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; +#endif +#ifdef UINT64_MAX + int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; +#endif + int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; + int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; + int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; + int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; + int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; + int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; + int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; + int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; + int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; + int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; + int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; +}; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess yes on native Windows. + mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; + # In general, assume it works. + *) gl_cv_header_working_stdint_h="guessing yes" ;; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#define __STDC_CONSTANT_MACROS 1 +#define __STDC_LIMIT_MACROS 1 +#include + + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + +#include +#include +#define MVAL(macro) MVAL1(macro) +#define MVAL1(expression) #expression +static const char *macro_values[] = + { +#ifdef INT8_MAX + MVAL (INT8_MAX), +#endif +#ifdef INT16_MAX + MVAL (INT16_MAX), +#endif +#ifdef INT32_MAX + MVAL (INT32_MAX), +#endif +#ifdef INT64_MAX + MVAL (INT64_MAX), +#endif +#ifdef UINT8_MAX + MVAL (UINT8_MAX), +#endif +#ifdef UINT16_MAX + MVAL (UINT16_MAX), +#endif +#ifdef UINT32_MAX + MVAL (UINT32_MAX), +#endif +#ifdef UINT64_MAX + MVAL (UINT64_MAX), +#endif + NULL + }; + +int +main (void) +{ + + const char **mv; + for (mv = macro_values; *mv != NULL; mv++) + { + const char *value = *mv; + /* Test whether it looks like a cast expression. */ + if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 + || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 + || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 + || strncmp (value, "((int)"/*)*/, 6) == 0 + || strncmp (value, "((signed short)"/*)*/, 15) == 0 + || strncmp (value, "((signed char)"/*)*/, 14) == 0) + return mv - macro_values + 1; + } + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_header_working_stdint_h=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5 +printf "%s\n" "$gl_cv_header_working_stdint_h" >&6; } + fi + + HAVE_C99_STDINT_H=0 + HAVE_SYS_BITYPES_H=0 + HAVE_SYS_INTTYPES_H=0 + GL_GENERATE_STDINT_H=true + case "$gl_cv_header_working_stdint_h" in + *yes) + HAVE_C99_STDINT_H=1 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h works without ISO C predefines" >&5 +printf %s "checking whether stdint.h works without ISO C predefines... " >&6; } +if test ${gl_cv_header_stdint_without_STDC_macros+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_cv_header_stdint_without_STDC_macros=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include + + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + +intmax_t im = INTMAX_MAX; +int32_t i32 = INT32_C (0x7fffffff); + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_stdint_without_STDC_macros=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_without_STDC_macros" >&5 +printf "%s\n" "$gl_cv_header_stdint_without_STDC_macros" >&6; } + + if test $gl_cv_header_stdint_without_STDC_macros = no; then + +printf "%s\n" "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h + + +printf "%s\n" "#define __STDC_LIMIT_MACROS 1" >>confdefs.h + + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5 +printf %s "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; } +if test ${gl_cv_header_stdint_width+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_cv_header_stdint_width=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 + #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ + #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 + #endif + #include + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + int iw = UINTMAX_WIDTH; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_stdint_width=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5 +printf "%s\n" "$gl_cv_header_stdint_width" >&6; } + if test "$gl_cv_header_stdint_width" = yes; then + GL_GENERATE_STDINT_H=false + fi + ;; + *) + ac_fn_c_check_header_compile "$LINENO" "sys/inttypes.h" "ac_cv_header_sys_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_inttypes_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_INTTYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_bitypes_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h + +fi + + if test $ac_cv_header_sys_inttypes_h = yes; then + HAVE_SYS_INTTYPES_H=1 + fi + if test $ac_cv_header_sys_bitypes_h = yes; then + HAVE_SYS_BITYPES_H=1 + fi + + + if test $APPLE_UNIVERSAL_BUILD = 0; then + + + for gltype in ptrdiff_t size_t ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 +printf %s "checking for bit size of $gltype... " >&6; } +if eval test \${gl_cv_bitsizeof_${gltype}+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " + #include + #include + #if HAVE_WCHAR_H + # include + #endif + +#include " +then : + +else $as_nop + result=unknown +fi + + eval gl_cv_bitsizeof_${gltype}=\$result + +fi +eval ac_res=\$gl_cv_bitsizeof_${gltype} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval result=\$gl_cv_bitsizeof_${gltype} + if test $result = unknown; then + result=0 + fi + GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` + printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h + + eval BITSIZEOF_${GLTYPE}=\$result + done + + + fi + + + for gltype in sig_atomic_t wchar_t wint_t ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 +printf %s "checking for bit size of $gltype... " >&6; } +if eval test \${gl_cv_bitsizeof_${gltype}+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " + #include + #include + #if HAVE_WCHAR_H + # include + #endif + +#include " +then : + +else $as_nop + result=unknown +fi + + eval gl_cv_bitsizeof_${gltype}=\$result + +fi +eval ac_res=\$gl_cv_bitsizeof_${gltype} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval result=\$gl_cv_bitsizeof_${gltype} + if test $result = unknown; then + result=0 + fi + GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` + printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h + + eval BITSIZEOF_${GLTYPE}=\$result + done + + + + + for gltype in sig_atomic_t wchar_t wint_t ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5 +printf %s "checking whether $gltype is signed... " >&6; } +if eval test \${gl_cv_type_${gltype}_signed+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + result=yes +else $as_nop + result=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval gl_cv_type_${gltype}_signed=\$result + +fi +eval ac_res=\$gl_cv_type_${gltype}_signed + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval result=\$gl_cv_type_${gltype}_signed + GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` + if test "$result" = yes; then + printf "%s\n" "#define HAVE_SIGNED_${GLTYPE} 1" >>confdefs.h + + eval HAVE_SIGNED_${GLTYPE}=1 + else + eval HAVE_SIGNED_${GLTYPE}=0 + fi + done + + + gl_cv_type_ptrdiff_t_signed=yes + gl_cv_type_size_t_signed=no + if test $APPLE_UNIVERSAL_BUILD = 0; then + + + for gltype in ptrdiff_t size_t ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 +printf %s "checking for $gltype integer literal suffix... " >&6; } +if eval test \${gl_cv_type_${gltype}_suffix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval gl_cv_type_${gltype}_suffix=no + eval result=\$gl_cv_type_${gltype}_signed + if test "$result" = yes; then + glsufu= + else + glsufu=u + fi + for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do + case $glsuf in + '') gltype1='int';; + l) gltype1='long int';; + ll) gltype1='long long int';; + i64) gltype1='__int64';; + u) gltype1='unsigned int';; + ul) gltype1='unsigned long int';; + ull) gltype1='unsigned long long int';; + ui64)gltype1='unsigned __int64';; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + extern $gltype foo; + extern $gltype1 foo; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval gl_cv_type_${gltype}_suffix=\$glsuf +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" != no && break + done +fi +eval ac_res=\$gl_cv_type_${gltype}_suffix + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" = no && result= + eval ${GLTYPE}_SUFFIX=\$result + printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h + + done + + + fi + + + for gltype in sig_atomic_t wchar_t wint_t ; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 +printf %s "checking for $gltype integer literal suffix... " >&6; } +if eval test \${gl_cv_type_${gltype}_suffix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval gl_cv_type_${gltype}_suffix=no + eval result=\$gl_cv_type_${gltype}_signed + if test "$result" = yes; then + glsufu= + else + glsufu=u + fi + for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do + case $glsuf in + '') gltype1='int';; + l) gltype1='long int';; + ll) gltype1='long long int';; + i64) gltype1='__int64';; + u) gltype1='unsigned int';; + ul) gltype1='unsigned long int';; + ull) gltype1='unsigned long long int';; + ui64)gltype1='unsigned __int64';; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #if HAVE_WCHAR_H + # include + #endif + + extern $gltype foo; + extern $gltype1 foo; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval gl_cv_type_${gltype}_suffix=\$glsuf +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" != no && break + done +fi +eval ac_res=\$gl_cv_type_${gltype}_suffix + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" = no && result= + eval ${GLTYPE}_SUFFIX=\$result + printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h + + done + + + + if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then + BITSIZEOF_WINT_T=32 + fi + + ;; + esac + + + + GL_GENERATE_LIMITS_H=true + + + + + + + + HAVE_DECL_IMAXABS=1; + HAVE_DECL_IMAXDIV=1; + HAVE_DECL_STRTOIMAX=1; + HAVE_DECL_STRTOUMAX=1; + HAVE_IMAXDIV_T=1; + HAVE_IMAXABS=1; + HAVE_IMAXDIV=1; + REPLACE_IMAXABS=0; + REPLACE_IMAXDIV=0; + REPLACE_STRTOIMAX=0; + REPLACE_STRTOUMAX=0; + INT32_MAX_LT_INTMAX_MAX=1; + INT64_MAX_EQ_LONG_MAX='defined _LP64'; + PRIPTR_PREFIX=__PRIPTR_PREFIX; + UINT32_MAX_LT_UINTMAX_MAX=1; + UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +printf %s "checking for C/C++ restrict keyword... " >&6; } +if test ${ac_cv_c_restrict+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_restrict=no + # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see: + # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html + # Put 'restrict' last, because C++ lacks it. + for ac_kw in __restrict__ __restrict _Restrict restrict; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +typedef int *int_ptr; + int foo (int_ptr $ac_kw ip) { return ip[0]; } + int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ + int bar (int ip[$ac_kw]) { return ip[0]; } + +int +main (void) +{ +int s[1]; + int *$ac_kw t = s; + t[0] = 0; + return foo (t) + bar (t); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_restrict=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + test "$ac_cv_c_restrict" != no && break + done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +printf "%s\n" "$ac_cv_c_restrict" >&6; } + + case $ac_cv_c_restrict in + restrict) ;; + no) printf "%s\n" "#define restrict /**/" >>confdefs.h + ;; + *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h + ;; + esac + + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_inttypes_h='<'inttypes.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_inttypes_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test $ac_cv_header_inttypes_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'inttypes.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_inttypes_h + gl_cv_next_inttypes_h='"'$gl_header'"' + else + gl_cv_next_inttypes_h='<'inttypes.h'>' + fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5 +printf "%s\n" "$gl_cv_next_inttypes_h" >&6; } + fi + NEXT_INTTYPES_H=$gl_cv_next_inttypes_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'inttypes.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_inttypes_h + fi + NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive + + + + + + + + + + + + + + + + GL_GNULIB_IMAXABS=0 + + + + GL_GNULIB_IMAXDIV=0 + + + + GL_GNULIB_STRTOIMAX=0 + + + + GL_GNULIB_STRTOUMAX=0 + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 +printf %s "checking where to find the exponent in a 'float'... " >&6; } +if test ${gl_cv_cc_float_expbit0+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + gl_cv_cc_float_expbit0="word 0 bit 23" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#define NWORDS \ + ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { float value; unsigned int word[NWORDS]; } memory_float; +static unsigned int ored_words[NWORDS]; +static unsigned int anded_words[NWORDS]; +static void add_to_ored_words (float x) +{ + memory_float m; + size_t i; + /* Clear it first, in case + sizeof (float) < sizeof (memory_float). */ + memset (&m, 0, sizeof (memory_float)); + m.value = x; + for (i = 0; i < NWORDS; i++) + { + ored_words[i] |= m.word[i]; + anded_words[i] &= m.word[i]; + } +} +int main () +{ + size_t j; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + for (j = 0; j < NWORDS; j++) + anded_words[j] = ~ (unsigned int) 0; + add_to_ored_words (0.25f); + add_to_ored_words (0.5f); + add_to_ored_words (1.0f); + add_to_ored_words (2.0f); + add_to_ored_words (4.0f); + /* Remove bits that are common (e.g. if representation of the first mantissa + bit is explicit). */ + for (j = 0; j < NWORDS; j++) + ored_words[j] &= ~anded_words[j]; + /* Now find the nonzero word. */ + for (j = 0; j < NWORDS; j++) + if (ored_words[j] != 0) + break; + if (j < NWORDS) + { + size_t i; + for (i = j + 1; i < NWORDS; i++) + if (ored_words[i] != 0) + { + fprintf (fp, "unknown"); + return (fclose (fp) != 0); + } + for (i = 0; ; i++) + if ((ored_words[j] >> i) & 1) + { + fprintf (fp, "word %d bit %d", (int) j, (int) i); + return (fclose (fp) != 0); + } + } + fprintf (fp, "unknown"); + return (fclose (fp) != 0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_float_expbit0=`cat conftest.out` +else $as_nop + gl_cv_cc_float_expbit0="unknown" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + rm -f conftest.out + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 +printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; } + case "$gl_cv_cc_float_expbit0" in + word*bit*) + word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` + +printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h + + +printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h + + ;; + esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 +printf %s "checking for nl_langinfo and CODESET... " >&6; } +if test ${am_cv_langinfo_codeset+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +char* cs = nl_langinfo(CODESET); return !cs; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + am_cv_langinfo_codeset=yes +else $as_nop + am_cv_langinfo_codeset=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 +printf "%s\n" "$am_cv_langinfo_codeset" >&6; } + if test $am_cv_langinfo_codeset = yes; then + +printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h + + fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5 +printf %s "checking for working fcntl.h... " >&6; } +if test ${gl_cv_header_working_fcntl_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + gl_cv_header_working_fcntl_h=cross-compiling +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #if HAVE_UNISTD_H + # include + #else /* on Windows with MSVC */ + # include + # include + # defined sleep(n) _sleep ((n) * 1000) + #endif + #include + #ifndef O_NOATIME + #define O_NOATIME 0 + #endif + #ifndef O_NOFOLLOW + #define O_NOFOLLOW 0 + #endif + static int const constants[] = + { + O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, + O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY + }; + +int +main (void) +{ + + int result = !constants; + #if HAVE_SYMLINK + { + static char const sym[] = "conftest.sym"; + if (symlink ("/dev/null", sym) != 0) + result |= 2; + else + { + int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); + if (fd >= 0) + { + close (fd); + result |= 4; + } + } + if (unlink (sym) != 0 || symlink (".", sym) != 0) + result |= 2; + else + { + int fd = open (sym, O_RDONLY | O_NOFOLLOW); + if (fd >= 0) + { + close (fd); + result |= 4; + } + } + unlink (sym); + } + #endif + { + static char const file[] = "confdefs.h"; + int fd = open (file, O_RDONLY | O_NOATIME); + if (fd < 0) + result |= 8; + else + { + struct stat st0; + if (fstat (fd, &st0) != 0) + result |= 16; + else + { + char c; + sleep (1); + if (read (fd, &c, 1) != 1) + result |= 24; + else + { + if (close (fd) != 0) + result |= 32; + else + { + struct stat st1; + if (stat (file, &st1) != 0) + result |= 40; + else + if (st0.st_atime != st1.st_atime) + result |= 64; + } + } + } + } + } + return result; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_header_working_fcntl_h=yes +else $as_nop + case $? in #( + 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( + 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( + 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( + *) gl_cv_header_working_fcntl_h='no';; + esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5 +printf "%s\n" "$gl_cv_header_working_fcntl_h" >&6; } + + case $gl_cv_header_working_fcntl_h in #( + *O_NOATIME* | no | cross-compiling) ac_val=0;; #( + *) ac_val=1;; + esac + +printf "%s\n" "#define HAVE_WORKING_O_NOATIME $ac_val" >>confdefs.h + + + case $gl_cv_header_working_fcntl_h in #( + *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( + *) ac_val=1;; + esac + +printf "%s\n" "#define HAVE_WORKING_O_NOFOLLOW $ac_val" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getc_unlocked" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5 +printf %s "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; } +if test ${ac_cv_gnu_library_2_1+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif +#ifdef __UCLIBC__ + Lucky user +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Lucky" >/dev/null 2>&1 +then : + ac_cv_gnu_library_2_1=yes +else $as_nop + ac_cv_gnu_library_2_1=no +fi +rm -rf conftest* + + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 +printf "%s\n" "$ac_cv_gnu_library_2_1" >&6; } + + GLIBC21="$ac_cv_gnu_library_2_1" + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_math_h='<'math.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_math_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test $ac_cv_header_math_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'math.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_math_h + gl_cv_next_math_h='"'$gl_header'"' + else + gl_cv_next_math_h='<'math.h'>' + fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5 +printf "%s\n" "$gl_cv_next_math_h" >&6; } + fi + NEXT_MATH_H=$gl_cv_next_math_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'math.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_math_h + fi + NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5 +printf %s "checking whether NAN macro works... " >&6; } +if test ${gl_cv_header_math_nan_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +/* Solaris 10 has a broken definition of NAN. Other platforms + fail to provide NAN, or provide it only in C99 mode; this + test only needs to fail when NAN is provided but wrong. */ + float f = 1.0f; +#ifdef NAN + f = NAN; +#endif + return f == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_math_nan_works=yes +else $as_nop + gl_cv_header_math_nan_works=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5 +printf "%s\n" "$gl_cv_header_math_nan_works" >&6; } + if test $gl_cv_header_math_nan_works = no; then + REPLACE_NAN=1 + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5 +printf %s "checking whether HUGE_VAL works... " >&6; } +if test ${gl_cv_header_math_huge_val_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +/* Solaris 10 has a broken definition of HUGE_VAL. */ + double d = HUGE_VAL; + return d == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_header_math_huge_val_works=yes +else $as_nop + gl_cv_header_math_huge_val_works=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5 +printf "%s\n" "$gl_cv_header_math_huge_val_works" >&6; } + if test $gl_cv_header_math_huge_val_works = no; then + REPLACE_HUGE_VAL=1 + fi + + + + + + + + + # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it + # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is + # irrelevant for anonymous mappings. + ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +if test "x$ac_cv_func_mmap" = xyes +then : + gl_have_mmap=yes +else $as_nop + gl_have_mmap=no +fi + + + # Try to allow MAP_ANONYMOUS. + gl_have_mmap_anonymous=no + if test $gl_have_mmap = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 +printf %s "checking for MAP_ANONYMOUS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef MAP_ANONYMOUS + I cannot identify this map +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "I cannot identify this map" >/dev/null 2>&1 +then : + gl_have_mmap_anonymous=yes +fi +rm -rf conftest* + + if test $gl_have_mmap_anonymous != yes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef MAP_ANON + I cannot identify this map +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "I cannot identify this map" >/dev/null 2>&1 +then : + +printf "%s\n" "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h + + gl_have_mmap_anonymous=yes +fi +rm -rf conftest* + + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 +printf "%s\n" "$gl_have_mmap_anonymous" >&6; } + if test $gl_have_mmap_anonymous = yes; then + +printf "%s\n" "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h + + fi + fi + + + + + HAVE_MBSLEN=0; + HAVE_EXPLICIT_BZERO=1; + HAVE_FFSL=1; + HAVE_FFSLL=1; + HAVE_DECL_MEMMEM=1; + HAVE_MEMPCPY=1; + HAVE_MEMSET_EXPLICIT=1; + HAVE_DECL_MEMRCHR=1; + HAVE_RAWMEMCHR=1; + HAVE_STPCPY=1; + HAVE_STPNCPY=1; + HAVE_STRCHRNUL=1; + HAVE_DECL_STRDUP=1; + HAVE_DECL_STRNDUP=1; + HAVE_DECL_STRNLEN=1; + HAVE_STRPBRK=1; + HAVE_STRSEP=1; + HAVE_STRCASESTR=1; + HAVE_DECL_STRTOK_R=1; + HAVE_DECL_STRERROR_R=1; + HAVE_STRERRORNAME_NP=1; + HAVE_SIGABBREV_NP=1; + HAVE_SIGDESCR_NP=1; + HAVE_DECL_STRSIGNAL=1; + HAVE_STRVERSCMP=1; + REPLACE_FFSLL=0; + REPLACE_MEMCHR=0; + REPLACE_MEMMEM=0; + REPLACE_MEMPCPY=0; + REPLACE_STPCPY=0; + REPLACE_STPNCPY=0; + REPLACE_STRCHRNUL=0; + REPLACE_STRDUP=0; + REPLACE_STRNCAT=0; + REPLACE_STRNDUP=0; + REPLACE_STRNLEN=0; + REPLACE_STRSTR=0; + REPLACE_STRCASESTR=0; + REPLACE_STRTOK_R=0; + REPLACE_STRERROR=0; + REPLACE_STRERROR_R=0; + REPLACE_STRERRORNAME_NP=0; + REPLACE_STRSIGNAL=0; + UNDEFINE_STRTOK_R=0; + + + + + + + + + # Detect platform-specific bugs in some versions of glibc: + # memchr should not dereference anything with length 0 + # https://bugzilla.redhat.com/show_bug.cgi?id=499689 + # memchr should not dereference overestimated length after a match + # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 + # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 + # memchr should cast the second argument to 'unsigned char'. + # This bug exists in Android 4.3. + # Assume that memchr works on platforms that lack mprotect. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5 +printf %s "checking whether memchr works... " >&6; } +if test ${gl_cv_func_memchr_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess no on Android. + linux*-android*) gl_cv_func_memchr_works="guessing no" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_memchr_works="guessing yes" ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if HAVE_SYS_MMAN_H +# include +# include +# include +# include +# ifndef MAP_FILE +# define MAP_FILE 0 +# endif +#endif + +int +main (void) +{ + + int result = 0; + char *fence = NULL; +#if HAVE_SYS_MMAN_H && HAVE_MPROTECT +# if HAVE_MAP_ANONYMOUS + const int flags = MAP_ANONYMOUS | MAP_PRIVATE; + const int fd = -1; +# else /* !HAVE_MAP_ANONYMOUS */ + const int flags = MAP_FILE | MAP_PRIVATE; + int fd = open ("/dev/zero", O_RDONLY, 0666); + if (fd >= 0) +# endif + { + int pagesize = getpagesize (); + char *two_pages = + (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, + flags, fd, 0); + if (two_pages != (char *)(-1) + && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) + fence = two_pages + pagesize; + } +#endif + if (fence) + { + /* Test against bugs on glibc systems. */ + if (memchr (fence, 0, 0)) + result |= 1; + strcpy (fence - 9, "12345678"); + if (memchr (fence - 9, 0, 79) != fence - 1) + result |= 2; + if (memchr (fence - 1, 0, 3) != fence - 1) + result |= 4; + /* Test against bug on AIX 7.2. */ + if (memchr (fence - 4, '6', 16) != fence - 4) + result |= 8; + } + /* Test against bug on Android 4.3. */ + { + char input[3]; + input[0] = 'a'; + input[1] = 'b'; + input[2] = 'c'; + if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) + result |= 16; + } + return result; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_memchr_works=yes +else $as_nop + gl_cv_func_memchr_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5 +printf "%s\n" "$gl_cv_func_memchr_works" >&6; } + case "$gl_cv_func_memchr_works" in + *yes) ;; + *) REPLACE_MEMCHR=1 ;; + esac + + + + GL_GNULIB_EXPLICIT_BZERO=0 + + + + GL_GNULIB_FFSL=0 + + + + GL_GNULIB_FFSLL=0 + + + + GL_GNULIB_MEMCHR=0 + + + + GL_GNULIB_MEMMEM=0 + + + + GL_GNULIB_MEMPCPY=0 + + + + GL_GNULIB_MEMRCHR=0 + + + + GL_GNULIB_MEMSET_EXPLICIT=0 + + + + GL_GNULIB_RAWMEMCHR=0 + + + + GL_GNULIB_STPCPY=0 + + + + GL_GNULIB_STPNCPY=0 + + + + GL_GNULIB_STRCHRNUL=0 + + + + GL_GNULIB_STRDUP=0 + + + + GL_GNULIB_STRNCAT=0 + + + + GL_GNULIB_STRNDUP=0 + + + + GL_GNULIB_STRNLEN=0 + + + + GL_GNULIB_STRPBRK=0 + + + + GL_GNULIB_STRSEP=0 + + + + GL_GNULIB_STRSTR=0 + + + + GL_GNULIB_STRCASESTR=0 + + + + GL_GNULIB_STRTOK_R=0 + + + + GL_GNULIB_MBSLEN=0 + + + + GL_GNULIB_MBSNLEN=0 + + + + GL_GNULIB_MBSCHR=0 + + + + GL_GNULIB_MBSRCHR=0 + + + + GL_GNULIB_MBSSTR=0 + + + + GL_GNULIB_MBSCASECMP=0 + + + + GL_GNULIB_MBSNCASECMP=0 + + + + GL_GNULIB_MBSPCASECMP=0 + + + + GL_GNULIB_MBSCASESTR=0 + + + + GL_GNULIB_MBSCSPN=0 + + + + GL_GNULIB_MBSPBRK=0 + + + + GL_GNULIB_MBSSPN=0 + + + + GL_GNULIB_MBSSEP=0 + + + + GL_GNULIB_MBSTOK_R=0 + + + + GL_GNULIB_STRERROR=0 + + + + GL_GNULIB_STRERROR_R=0 + + + + GL_GNULIB_STRERRORNAME_NP=0 + + + + GL_GNULIB_SIGABBREV_NP=0 + + + + GL_GNULIB_SIGDESCR_NP=0 + + + + GL_GNULIB_STRSIGNAL=0 + + + + GL_GNULIB_STRVERSCMP=0 + + + + GL_GNULIB_MDA_MEMCCPY=1 + + + + GL_GNULIB_MDA_STRDUP=1 + + + +ac_fn_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_snprintf" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_SNPRINTF $ac_have_decl" >>confdefs.h + +ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" +if test "x$ac_cv_type__Bool" = xyes +then : + +printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h + + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99 or later" >&5 +printf %s "checking for stdbool.h that conforms to C99 or later... " >&6; } +if test ${ac_cv_header_stdbool_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + + /* "true" and "false" should be usable in #if expressions and + integer constant expressions, and "bool" should be a valid + type name. + + Although C99 requires bool, true, and false to be macros, + C23 and C++11 overrule that, so do not test for that. + Although C99 requires __bool_true_false_are_defined and + _Bool, C23 says they are obsolescent, so do not require + them. */ + + #if !true + #error "'true' is not true" + #endif + #if true != 1 + #error "'true' is not equal to 1" + #endif + char b[true == 1 ? 1 : -1]; + char c[true]; + + #if false + #error "'false' is not false" + #endif + #if false != 0 + #error "'false' is not equal to 0" + #endif + char d[false == 0 ? 1 : -1]; + + enum { e = false, f = true, g = false * true, h = true * 256 }; + + char i[(bool) 0.5 == true ? 1 : -1]; + char j[(bool) 0.0 == false ? 1 : -1]; + char k[sizeof (bool) > 0 ? 1 : -1]; + + struct sb { bool s: 1; bool t; } s; + char l[sizeof s.t > 0 ? 1 : -1]; + + /* The following fails for + HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ + bool m[h]; + char n[sizeof m == h * sizeof m[0] ? 1 : -1]; + char o[-1 - (bool) 0 < 0 ? 1 : -1]; + /* Catch a bug in an HP-UX C compiler. See + https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html + */ + bool p = true; + bool *pp = &p; + +int +main (void) +{ + + bool ps = &s; + *pp |= p; + *pp |= ! p; + + /* Refer to every declared value, so they cannot be + discarded as unused. */ + return (!b + !c + !d + !e + !f + !g + !h + !i + !j + !k + + !l + !m + !n + !o + !p + !pp + !ps); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_header_stdbool_h=yes +else $as_nop + ac_cv_header_stdbool_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 +printf "%s\n" "$ac_cv_header_stdbool_h" >&6; } + + + REPLACE_NULL=0; + HAVE_MAX_ALIGN_T=1; + HAVE_WCHAR_T=1; + + + + + + + + GL_GENERATE_STDDEF_H=false + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5 +printf %s "checking for good max_align_t... " >&6; } +if test ${gl_cv_type_max_align_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* On FreeBSD 12.0/x86, max_align_t defined by has + the correct alignment with the default (wrong) definition of + _Alignof, but a wrong alignment as soon as we activate an + ISO C compliant _Alignof definition. */ + #if ((defined __GNUC__ && 4 <= __GNUC__) || defined __clang__) && !defined __cplusplus + #define _Alignof(type) __builtin_offsetof (struct { char __a; type __b; }, __b) + #endif + #include + unsigned int s = sizeof (max_align_t); + #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__ + int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; + int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; + #endif + typedef struct { char a; max_align_t b; } max_helper; + typedef struct { char a; long b; } long_helper; + typedef struct { char a; double b; } double_helper; + typedef struct { char a; long double b; } long_double_helper; + int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1]; + int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1]; + int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1]; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_type_max_align_t=yes +else $as_nop + gl_cv_type_max_align_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5 +printf "%s\n" "$gl_cv_type_max_align_t" >&6; } + if test $gl_cv_type_max_align_t = no; then + HAVE_MAX_ALIGN_T=0 + GL_GENERATE_STDDEF_H=true + fi + + if test $gt_cv_c_wchar_t = no; then + HAVE_WCHAR_T=0 + GL_GENERATE_STDDEF_H=true + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 +printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; } +if test ${gl_cv_decl_null_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int test[2 * (sizeof NULL == sizeof (void *)) -1]; + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_decl_null_works=yes +else $as_nop + gl_cv_decl_null_works=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 +printf "%s\n" "$gl_cv_decl_null_works" >&6; } + if test $gl_cv_decl_null_works = no; then + REPLACE_NULL=1 + GL_GENERATE_STDDEF_H=true + fi + + if $GL_GENERATE_STDDEF_H; then + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stddef_h='<'stddef.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_stddef_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'stddef.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_stddef_h + gl_cv_next_stddef_h='"'$gl_header'"' + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 +printf "%s\n" "$gl_cv_next_stddef_h" >&6; } + fi + NEXT_STDDEF_H=$gl_cv_next_stddef_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'stddef.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_stddef_h + fi + NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive + + + + + fi + + + +ac_fn_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_fcloseall" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_FCLOSEALL $ac_have_decl" >>confdefs.h + +ac_fn_check_decl "$LINENO" "getw" "ac_cv_have_decl_getw" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getw" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GETW $ac_have_decl" >>confdefs.h + +ac_fn_check_decl "$LINENO" "putw" "ac_cv_have_decl_putw" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_putw" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_PUTW $ac_have_decl" >>confdefs.h + + + + + printf "%s\n" "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdio_h='<'stdio.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_stdio_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'stdio.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_stdio_h + gl_cv_next_stdio_h='"'$gl_header'"' + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5 +printf "%s\n" "$gl_cv_next_stdio_h" >&6; } + fi + NEXT_STDIO_H=$gl_cv_next_stdio_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'stdio.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_stdio_h + fi + NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5 +printf %s "checking which flavor of printf attribute matches inttypes macros... " >&6; } +if test ${gl_cv_func_printf_attribute_flavor+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define __STDC_FORMAT_MACROS 1 + #include + #include + /* For non-mingw systems, compilation will trivially succeed. + For mingw, compilation will succeed for older mingw (system + printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ + #if (defined _WIN32 && ! defined __CYGWIN__) && \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) + extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; + #endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_func_printf_attribute_flavor=system +else $as_nop + gl_cv_func_printf_attribute_flavor=gnu +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5 +printf "%s\n" "$gl_cv_func_printf_attribute_flavor" >&6; } + if test "$gl_cv_func_printf_attribute_flavor" = gnu; then + +printf "%s\n" "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h + + fi + + + + + + + + + + + + + + if test $ac_cv_have_decl_fcloseall = no; then + HAVE_DECL_FCLOSEALL=0 + fi + + + if test $ac_cv_have_decl_getw = no; then + HAVE_DECL_GETW=0 + fi + + + if test $ac_cv_have_decl_putw = no; then + HAVE_DECL_PUTW=0 + fi + +ac_fn_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ecvt" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_ECVT $ac_have_decl" >>confdefs.h + +ac_fn_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_fcvt" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_FCVT $ac_have_decl" >>confdefs.h + +ac_fn_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_gcvt" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GCVT $ac_have_decl" >>confdefs.h + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdlib_h='<'stdlib.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_stdlib_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'stdlib.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_stdlib_h + gl_cv_next_stdlib_h='"'$gl_header'"' + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5 +printf "%s\n" "$gl_cv_next_stdlib_h" >&6; } + fi + NEXT_STDLIB_H=$gl_cv_next_stdlib_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'stdlib.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_stdlib_h + fi + NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive + + + + + + + + + + + + + if test $ac_cv_have_decl_ecvt = no; then + HAVE_DECL_ECVT=0 + fi + + if test $ac_cv_have_decl_fcvt = no; then + HAVE_DECL_FCVT=0 + fi + + if test $ac_cv_have_decl_gcvt = no; then + HAVE_DECL_GCVT=0 + fi + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_string_h='<'string.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_string_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #include -static int -strisnan (const char *string, size_t start_index, size_t end_index) +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'string.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_string_h + gl_cv_next_string_h='"'$gl_header'"' + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5 +printf "%s\n" "$gl_cv_next_string_h" >&6; } + fi + NEXT_STRING_H=$gl_cv_next_string_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'string.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_string_h + fi + NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive + + + + + + + + + + + + + + + ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default +" +if test "x$ac_cv_type_pid_t" = xyes +then : + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #if defined _WIN64 && !defined __CYGWIN__ + LLP64 + #endif + +int +main (void) { - if (start_index < end_index) - { - if (string[start_index] == '-') - start_index++; - if (start_index + 3 <= end_index - && memcmp (string + start_index, "nan", 3) == 0) - { - start_index += 3; - if (start_index == end_index - || (string[start_index] == '(' && string[end_index - 1] == ')')) - return 1; - } - } + + ; return 0; } -static char buf[10000]; -static long double zeroL = 0.0L; -int main () -{ - int result = 0; - nocrash_init(); - if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 1; - if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Le", zeroL / zeroL) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 1; - if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 - || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 - || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) - result |= 1; - if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 1; -#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE -/* Representation of an 80-bit 'long double' as an initializer for a sequence - of 'unsigned int' words. */ -# ifdef WORDS_BIGENDIAN -# define LDBL80_WORDS(exponent,manthi,mantlo) \ - { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ - ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ - (unsigned int) (mantlo) << 16 \ - } -# else -# define LDBL80_WORDS(exponent,manthi,mantlo) \ - { mantlo, manthi, exponent } -# endif - { /* Quiet NaN. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - if (sprintf (buf, "%Le", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - if (sprintf (buf, "%Lg", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - } - { - /* Signalling NaN. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - if (sprintf (buf, "%Le", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - if (sprintf (buf, "%Lg", x.value) < 0 - || !strisnan (buf, 0, strlen (buf))) - result |= 2; - } - { /* Pseudo-NaN. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) <= 0) - result |= 4; - if (sprintf (buf, "%Le", x.value) <= 0) - result |= 4; - if (sprintf (buf, "%Lg", x.value) <= 0) - result |= 4; - } - { /* Pseudo-Infinity. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) <= 0) - result |= 8; - if (sprintf (buf, "%Le", x.value) <= 0) - result |= 8; - if (sprintf (buf, "%Lg", x.value) <= 0) - result |= 8; - } - { /* Pseudo-Zero. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) <= 0) - result |= 16; - if (sprintf (buf, "%Le", x.value) <= 0) - result |= 16; - if (sprintf (buf, "%Lg", x.value) <= 0) - result |= 16; - } - { /* Unnormalized number. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) <= 0) - result |= 32; - if (sprintf (buf, "%Le", x.value) <= 0) - result |= 32; - if (sprintf (buf, "%Lg", x.value) <= 0) - result |= 32; - } - { /* Pseudo-Denormal. */ - static union { unsigned int word[4]; long double value; } x = - { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; - if (sprintf (buf, "%Lf", x.value) <= 0) - result |= 64; - if (sprintf (buf, "%Le", x.value) <= 0) - result |= 64; - if (sprintf (buf, "%Lg", x.value) <= 0) - result |= 64; - } -#endif - return result; -} + _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_infinite_long_double=yes -else - gl_cv_func_printf_infinite_long_double=no +if ac_fn_c_try_compile "$LINENO" +then : + ac_pid_type='int' +else $as_nop + ac_pid_type='__int64' fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h + + +fi + + +ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" +if test "x$ac_cv_type_mode_t" = xyes +then : + +else $as_nop + +printf "%s\n" "#define mode_t int" >>confdefs.h + fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5 -$as_echo "$gl_cv_func_printf_infinite_long_double" >&6; } + + WINDOWS_64_BIT_OFF_T=0 + + + + + + + +printf "%s\n" "#define _USE_STD_STAT 1" >>confdefs.h + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_sys_types_h='<'sys/types.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_sys_types_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' ;; *) - gl_cv_func_printf_infinite_long_double="irrelevant" + gl_dirsep_regex='\/' ;; esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'sys/types.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + gl_header=$gl_cv_absolute_sys_types_h + gl_cv_next_sys_types_h='"'$gl_header'"' - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5 -$as_echo_n "checking whether printf supports the 'a' and 'A' directives... " >&6; } -if ${gl_cv_func_printf_directive_a+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5 +printf "%s\n" "$gl_cv_next_sys_types_h" >&6; } + fi + NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h - case "$host_os" in - # Guess yes on glibc >= 2.5 systems. - *-gnu* | gnu*) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'sys/types.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_sys_types_h + fi + NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive - #include - #ifdef __GNU_LIBRARY__ - #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ - BZ2908 - #endif - #endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "BZ2908" >/dev/null 2>&1; then : - gl_cv_func_printf_directive_a="guessing yes" -else - gl_cv_func_printf_directive_a="guessing no" + + + + + + + + + + + WINDOWS_STAT_INODES=0 + + + + + + + HAVE_CHOWN=1; + HAVE_COPY_FILE_RANGE=1; + HAVE_DUP3=1; + HAVE_EUIDACCESS=1; + HAVE_EXECVPE=1; + HAVE_FACCESSAT=1; + HAVE_FCHDIR=1; + HAVE_FCHOWNAT=1; + HAVE_FDATASYNC=1; + HAVE_FSYNC=1; + HAVE_FTRUNCATE=1; + HAVE_GETDTABLESIZE=1; + HAVE_GETENTROPY=1; + HAVE_GETGROUPS=1; + HAVE_GETHOSTNAME=1; + HAVE_GETLOGIN=1; + HAVE_GETPAGESIZE=1; + HAVE_GETPASS=1; + HAVE_GROUP_MEMBER=1; + HAVE_LCHOWN=1; + HAVE_LINK=1; + HAVE_LINKAT=1; + HAVE_PIPE=1; + HAVE_PIPE2=1; + HAVE_PREAD=1; + HAVE_PWRITE=1; + HAVE_READLINK=1; + HAVE_READLINKAT=1; + HAVE_SETHOSTNAME=1; + HAVE_SLEEP=1; + HAVE_SYMLINK=1; + HAVE_SYMLINKAT=1; + HAVE_UNLINKAT=1; + HAVE_USLEEP=1; + HAVE_DECL_ENVIRON=1; + HAVE_DECL_EXECVPE=1; + HAVE_DECL_FCHDIR=1; + HAVE_DECL_FDATASYNC=1; + HAVE_DECL_GETDOMAINNAME=1; + HAVE_DECL_GETLOGIN=1; + HAVE_DECL_GETLOGIN_R=1; + HAVE_DECL_GETPAGESIZE=1; + HAVE_DECL_GETUSERSHELL=1; + HAVE_DECL_SETHOSTNAME=1; + HAVE_DECL_TRUNCATE=1; + HAVE_DECL_TTYNAME_R=1; + HAVE_OS_H=0; + HAVE_SYS_PARAM_H=0; + REPLACE_ACCESS=0; + REPLACE_CHOWN=0; + REPLACE_CLOSE=0; + REPLACE_COPY_FILE_RANGE=0; + REPLACE_DUP=0; + REPLACE_DUP2=0; + REPLACE_DUP3=0; + REPLACE_EXECL=0; + REPLACE_EXECLE=0; + REPLACE_EXECLP=0; + REPLACE_EXECV=0; + REPLACE_EXECVE=0; + REPLACE_EXECVP=0; + REPLACE_EXECVPE=0; + REPLACE_FACCESSAT=0; + REPLACE_FCHOWNAT=0; + REPLACE_FDATASYNC=0; + REPLACE_FTRUNCATE=0; + REPLACE_GETCWD=0; + REPLACE_GETDOMAINNAME=0; + REPLACE_GETDTABLESIZE=0; + REPLACE_GETENTROPY=0; + REPLACE_GETLOGIN_R=0; + REPLACE_GETGROUPS=0; + REPLACE_GETPAGESIZE=0; + REPLACE_GETPASS=0; + REPLACE_GETPASS_FOR_GETPASS_GNU=0; + REPLACE_ISATTY=0; + REPLACE_LCHOWN=0; + REPLACE_LINK=0; + REPLACE_LINKAT=0; + REPLACE_LSEEK=0; + REPLACE_PIPE2=0; + REPLACE_PREAD=0; + REPLACE_PWRITE=0; + REPLACE_READ=0; + REPLACE_READLINK=0; + REPLACE_READLINKAT=0; + REPLACE_RMDIR=0; + REPLACE_SETHOSTNAME=0; + REPLACE_SLEEP=0; + REPLACE_SYMLINK=0; + REPLACE_SYMLINKAT=0; + REPLACE_TRUNCATE=0; + REPLACE_TTYNAME_R=0; + REPLACE_UNLINK=0; + REPLACE_UNLINKAT=0; + REPLACE_USLEEP=0; + REPLACE_WRITE=0; + UNISTD_H_HAVE_SYS_RANDOM_H=0; + UNISTD_H_HAVE_WINSOCK2_H=0; + UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; + + +ac_fn_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_execvpe" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 fi -rm -f conftest* +printf "%s\n" "#define HAVE_DECL_EXECVPE $ac_have_decl" >>confdefs.h + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_unistd_h='<'unistd.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_unistd_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test $ac_cv_header_unistd_h = yes; then + + - ;; - # Guess no on native Windows. - mingw*) gl_cv_func_printf_directive_a="guessing no";; - # If we don't know, assume the worst. - *) gl_cv_func_printf_directive_a="guessing no";; - esac -else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'unistd.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + + gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + + gl_header=$gl_cv_absolute_unistd_h + gl_cv_next_unistd_h='"'$gl_header'"' + else + gl_cv_next_unistd_h='<'unistd.h'>' + fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5 +printf "%s\n" "$gl_cv_next_unistd_h" >&6; } + fi + NEXT_UNISTD_H=$gl_cv_next_unistd_h + + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'unistd.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_unistd_h + fi + NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive + + + + + if test $ac_cv_header_unistd_h = yes; then + HAVE_UNISTD_H=1 + else + HAVE_UNISTD_H=0 + fi + + + + + + + + + + + + + + if test $ac_cv_have_decl_execvpe = no; then + HAVE_DECL_EXECVPE=0 + fi + + + + GL_GNULIB_ACCESS=0 + + + + GL_GNULIB_CHDIR=0 + + + + GL_GNULIB_CHOWN=0 + + + + GL_GNULIB_CLOSE=0 + + + + GL_GNULIB_COPY_FILE_RANGE=0 + + + + GL_GNULIB_DUP=0 + + + + GL_GNULIB_DUP2=0 + + + + GL_GNULIB_DUP3=0 + + + + GL_GNULIB_ENVIRON=0 + + + + GL_GNULIB_EUIDACCESS=0 + + + + GL_GNULIB_EXECL=0 + + + + GL_GNULIB_EXECLE=0 + + + + GL_GNULIB_EXECLP=0 + + + + GL_GNULIB_EXECV=0 + + + + GL_GNULIB_EXECVE=0 + + + + GL_GNULIB_EXECVP=0 + + + + GL_GNULIB_EXECVPE=0 + + + + GL_GNULIB_FACCESSAT=0 + + + + GL_GNULIB_FCHDIR=0 + + + + GL_GNULIB_FCHOWNAT=0 + + + + GL_GNULIB_FDATASYNC=0 + + + + GL_GNULIB_FSYNC=0 + + + + GL_GNULIB_FTRUNCATE=0 + + + + GL_GNULIB_GETCWD=0 + + + + GL_GNULIB_GETDOMAINNAME=0 + + + + GL_GNULIB_GETDTABLESIZE=0 + + + + GL_GNULIB_GETENTROPY=0 + + + + GL_GNULIB_GETGROUPS=0 + + + + GL_GNULIB_GETHOSTNAME=0 + -#include -#include -static char buf[100]; -static double zero = 0.0; -int main () -{ - int result = 0; - if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 - || (strcmp (buf, "0x1.922p+1 33") != 0 - && strcmp (buf, "0x3.244p+0 33") != 0 - && strcmp (buf, "0x6.488p-1 33") != 0 - && strcmp (buf, "0xc.91p-2 33") != 0)) - result |= 1; - if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 - || (strcmp (buf, "-0X1.922P+1 33") != 0 - && strcmp (buf, "-0X3.244P+0 33") != 0 - && strcmp (buf, "-0X6.488P-1 33") != 0 - && strcmp (buf, "-0XC.91P-2 33") != 0)) - result |= 2; - /* This catches a FreeBSD 6.1 bug: it doesn't round. */ - if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 - || (strcmp (buf, "0x1.83p+0 33") != 0 - && strcmp (buf, "0x3.05p-1 33") != 0 - && strcmp (buf, "0x6.0ap-2 33") != 0 - && strcmp (buf, "0xc.14p-3 33") != 0)) - result |= 4; - /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ - if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 - || (strcmp (buf, "0x2p+0 33") != 0 - && strcmp (buf, "0x3p-1 33") != 0 - && strcmp (buf, "0x6p-2 33") != 0 - && strcmp (buf, "0xcp-3 33") != 0)) - result |= 4; - /* This catches a FreeBSD 6.1 bug. See - */ - if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 - || buf[0] == '0') - result |= 8; - /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ - if (sprintf (buf, "%.1a", 1.999) < 0 - || (strcmp (buf, "0x1.0p+1") != 0 - && strcmp (buf, "0x2.0p+0") != 0 - && strcmp (buf, "0x4.0p-1") != 0 - && strcmp (buf, "0x8.0p-2") != 0)) - result |= 16; - /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a - glibc 2.4 bug . */ - if (sprintf (buf, "%.1La", 1.999L) < 0 - || (strcmp (buf, "0x1.0p+1") != 0 - && strcmp (buf, "0x2.0p+0") != 0 - && strcmp (buf, "0x4.0p-1") != 0 - && strcmp (buf, "0x8.0p-2") != 0)) - result |= 32; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_directive_a=yes -else - gl_cv_func_printf_directive_a=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_GETLOGIN=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5 -$as_echo "$gl_cv_func_printf_directive_a" >&6; } + GL_GNULIB_GETLOGIN_R=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5 -$as_echo_n "checking whether printf supports the 'F' directive... " >&6; } -if ${gl_cv_func_printf_directive_f+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";; - # Guess yes on FreeBSD >= 6. - freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; - freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; - # Guess yes on Mac OS X >= 10.3. - darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; - darwin*) gl_cv_func_printf_directive_f="guessing yes";; - # Guess yes on Solaris >= 2.10. - solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";; - solaris*) gl_cv_func_printf_directive_f="guessing no";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + GL_GNULIB_GETOPT_POSIX=0 -#ifdef _MSC_VER - Known -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_printf_directive_f="guessing yes" -else - gl_cv_func_printf_directive_f="guessing no" -fi -rm -f conftest* - ;; - # If we don't know, assume the worst. - *) gl_cv_func_printf_directive_f="guessing no";; - esac + GL_GNULIB_GETPAGESIZE=0 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static char buf[100]; -static double zero = 0.0; -int main () -{ - int result = 0; - if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 - || strcmp (buf, "1234567.000000 33") != 0) - result |= 1; - if (sprintf (buf, "%F", 1.0 / zero) < 0 - || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) - result |= 2; - /* This catches a Cygwin 1.5.x bug. */ - if (sprintf (buf, "%.F", 1234.0) < 0 - || strcmp (buf, "1234") != 0) - result |= 4; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_directive_f=yes -else - gl_cv_func_printf_directive_f=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_GETPASS=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5 -$as_echo "$gl_cv_func_printf_directive_f" >&6; } + GL_GNULIB_GETPASS_GNU=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5 -$as_echo_n "checking whether printf supports the 'n' directive... " >&6; } -if ${gl_cv_func_printf_directive_n+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess no on native Windows. - mingw*) gl_cv_func_printf_directive_n="guessing no";; - *) gl_cv_func_printf_directive_n="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + GL_GNULIB_GETUSERSHELL=0 -#include -#include -#include -#ifdef _MSC_VER -/* See page about "Parameter Validation" on msdn.microsoft.com. */ -static void cdecl -invalid_parameter_handler (const wchar_t *expression, - const wchar_t *function, - const wchar_t *file, unsigned int line, - uintptr_t dummy) -{ - exit (1); -} -#endif -static char fmtstring[10]; -static char buf[100]; -int main () -{ - int count = -1; -#ifdef _MSC_VER - _set_invalid_parameter_handler (invalid_parameter_handler); -#endif - /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) - support %n in format strings in read-only memory but not in writable - memory. */ - strcpy (fmtstring, "%d %n"); - if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 - || strcmp (buf, "123 ") != 0 - || count != 4) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_directive_n=yes -else - gl_cv_func_printf_directive_n=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5 -$as_echo "$gl_cv_func_printf_directive_n" >&6; } + GL_GNULIB_GROUP_MEMBER=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5 -$as_echo_n "checking whether printf supports the 'ls' directive... " >&6; } -if ${gl_cv_func_printf_directive_ls+:} false; then : - $as_echo_n "(cached) " >&6 -else + GL_GNULIB_ISATTY=0 - if test "$cross_compiling" = yes; then : - case "$host_os" in - openbsd*) gl_cv_func_printf_directive_ls="guessing no";; - irix*) gl_cv_func_printf_directive_ls="guessing no";; - solaris*) gl_cv_func_printf_directive_ls="guessing no";; - cygwin*) gl_cv_func_printf_directive_ls="guessing no";; - beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; - # Guess yes on native Windows. - mingw*) gl_cv_func_printf_directive_ls="guessing yes";; - *) gl_cv_func_printf_directive_ls="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + GL_GNULIB_LCHOWN=0 -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be - included before . */ -#include -#include -#include -#include -#include -int main () -{ - int result = 0; - char buf[100]; - /* Test whether %ls works at all. - This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on - Cygwin 1.5. */ - { - static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; - buf[0] = '\0'; - if (sprintf (buf, "%ls", wstring) < 0 - || strcmp (buf, "abc") != 0) - result |= 1; - } - /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an - assertion failure inside libc), but not on OpenBSD 4.0. */ - { - static const wchar_t wstring[] = { 'a', 0 }; - buf[0] = '\0'; - if (sprintf (buf, "%ls", wstring) < 0 - || strcmp (buf, "a") != 0) - result |= 2; - } - /* Test whether precisions in %ls are supported as specified in ISO C 99 - section 7.19.6.1: - "If a precision is specified, no more than that many bytes are written - (including shift sequences, if any), and the array shall contain a - null wide character if, to equal the multibyte character sequence - length given by the precision, the function would need to access a - wide character one past the end of the array." - This test fails on Solaris 10. */ - { - static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; - buf[0] = '\0'; - if (sprintf (buf, "%.2ls", wstring) < 0 - || strcmp (buf, "ab") != 0) - result |= 8; - } - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_directive_ls=yes -else - gl_cv_func_printf_directive_ls=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5 -$as_echo "$gl_cv_func_printf_directive_ls" >&6; } + GL_GNULIB_LINK=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 -$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } -if ${gl_cv_func_printf_positions+:} false; then : - $as_echo_n "(cached) " >&6 -else + GL_GNULIB_LINKAT=0 - if test "$cross_compiling" = yes; then : - case "$host_os" in - netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) - gl_cv_func_printf_positions="guessing no";; - beos*) gl_cv_func_printf_positions="guessing no";; - # Guess no on native Windows. - mingw* | pw*) gl_cv_func_printf_positions="guessing no";; - *) gl_cv_func_printf_positions="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + GL_GNULIB_LSEEK=0 -#include -#include -/* The string "%2$d %1$d", with dollar characters protected from the shell's - dollar expansion (possibly an autoconf bug). */ -static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; -static char buf[100]; -int main () -{ - sprintf (buf, format, 33, 55); - return (strcmp (buf, "55 33") != 0); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_positions=yes -else - gl_cv_func_printf_positions=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 -$as_echo "$gl_cv_func_printf_positions" >&6; } + GL_GNULIB_PIPE=0 + + + GL_GNULIB_PIPE2=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5 -$as_echo_n "checking whether printf supports the grouping flag... " >&6; } -if ${gl_cv_func_printf_flag_grouping+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + GL_GNULIB_PREAD=0 - case "$host_os" in - cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; - netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; - # Guess no on native Windows. - mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; - *) gl_cv_func_printf_flag_grouping="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static char buf[100]; -int main () -{ - if (sprintf (buf, "%'d %d", 1234567, 99) < 0 - || buf[strlen (buf) - 1] != '9') - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_flag_grouping=yes -else - gl_cv_func_printf_flag_grouping=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_PWRITE=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5 -$as_echo "$gl_cv_func_printf_flag_grouping" >&6; } + GL_GNULIB_READ=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5 -$as_echo_n "checking whether printf supports the left-adjust flag correctly... " >&6; } -if ${gl_cv_func_printf_flag_leftadjust+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + GL_GNULIB_READLINK=0 - case "$host_os" in - # Guess yes on HP-UX 11. - hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; - # Guess no on HP-UX 10 and older. - hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; - # Guess yes on native Windows. - mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";; - # Guess yes otherwise. - *) gl_cv_func_printf_flag_leftadjust="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static char buf[100]; -int main () -{ - /* Check that a '-' flag is not annihilated by a negative width. */ - if (sprintf (buf, "a%-*sc", -3, "b") < 0 - || strcmp (buf, "ab c") != 0) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_flag_leftadjust=yes -else - gl_cv_func_printf_flag_leftadjust=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_READLINKAT=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5 -$as_echo "$gl_cv_func_printf_flag_leftadjust" >&6; } + GL_GNULIB_RMDIR=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5 -$as_echo_n "checking whether printf supports the zero flag correctly... " >&6; } -if ${gl_cv_func_printf_flag_zero+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + GL_GNULIB_SETHOSTNAME=0 - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";; - # Guess yes on BeOS. - beos*) gl_cv_func_printf_flag_zero="guessing yes";; - # Guess no on native Windows. - mingw*) gl_cv_func_printf_flag_zero="guessing no";; - # If we don't know, assume the worst. - *) gl_cv_func_printf_flag_zero="guessing no";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static char buf[100]; -static double zero = 0.0; -int main () -{ - if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 - || (strcmp (buf, " inf") != 0 - && strcmp (buf, " infinity") != 0)) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_flag_zero=yes -else - gl_cv_func_printf_flag_zero=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_SLEEP=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5 -$as_echo "$gl_cv_func_printf_flag_zero" >&6; } + GL_GNULIB_SYMLINK=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5 -$as_echo_n "checking whether printf supports large precisions... " >&6; } -if ${gl_cv_func_printf_precision+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + GL_GNULIB_SYMLINKAT=0 - case "$host_os" in - # Guess no only on Solaris, native Windows, and BeOS systems. - solaris*) gl_cv_func_printf_precision="guessing no" ;; - mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; - beos*) gl_cv_func_printf_precision="guessing no" ;; - *) gl_cv_func_printf_precision="guessing yes" ;; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -static char buf[5000]; -int main () -{ - int result = 0; -#ifdef __BEOS__ - /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ - return 1; -#endif - if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) - result |= 1; - if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) - result |= 2; - if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 - || buf[0] != '1') - result |= 4; - if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 - || buf[0] != '1') - result |= 4; - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_precision=yes -else - gl_cv_func_printf_precision=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_TRUNCATE=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5 -$as_echo "$gl_cv_func_printf_precision" >&6; } + GL_GNULIB_TTYNAME_R=0 - gl_cv_c_multiarch=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - arch= - prev= - for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do - if test -n "$prev"; then - case $word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$arch" || test "$arch" = "$word"; then - arch="$word" - else - gl_cv_c_multiarch=yes - fi - ;; - esac - prev= - else - if test "x$word" = "x-arch"; then - prev=arch - fi - fi - done + GL_GNULIB_UNISTD_H_GETOPT=0 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $gl_cv_c_multiarch = yes; then - APPLE_UNIVERSAL_BUILD=1 - else - APPLE_UNIVERSAL_BUILD=0 - fi + GL_GNULIB_UNISTD_H_NONBLOCKING=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5 -$as_echo_n "checking whether printf survives out-of-memory conditions... " >&6; } -if ${gl_cv_func_printf_enomem+:} false; then : - $as_echo_n "(cached) " >&6 -else + GL_GNULIB_UNISTD_H_SIGPIPE=0 - gl_cv_func_printf_enomem="guessing no" - if test "$cross_compiling" = no; then - if test $APPLE_UNIVERSAL_BUILD = 0; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if defined __MACH__ && defined __APPLE__ -/* Avoid a crash on Mac OS X. */ -#include -#include -#include -#include -#include -#include -/* The exception port on which our thread listens. */ -static mach_port_t our_exception_port; -/* The main function of the thread listening for exceptions of type - EXC_BAD_ACCESS. */ -static void * -mach_exception_thread (void *arg) -{ - /* Buffer for a message to be received. */ - struct { - mach_msg_header_t head; - mach_msg_body_t msgh_body; - char data1024; - } msg; - mach_msg_return_t retval; - /* Wait for a message on the exception port. */ - retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), - our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (retval != MACH_MSG_SUCCESS) - abort (); - exit (1); -} -static void -nocrash_init (void) -{ - mach_port_t self = mach_task_self (); - /* Allocate a port on which the thread shall listen for exceptions. */ - if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) - == KERN_SUCCESS) { - /* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ - if (mach_port_insert_right (self, our_exception_port, our_exception_port, - MACH_MSG_TYPE_MAKE_SEND) - == KERN_SUCCESS) { - /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting - for us. */ - exception_mask_t mask = EXC_MASK_BAD_ACCESS; - /* Create the thread listening on the exception port. */ - pthread_attr_t attr; - pthread_t thread; - if (pthread_attr_init (&attr) == 0 - && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 - && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { - pthread_attr_destroy (&attr); - /* Replace the exception port info for these exceptions with our own. - Note that we replace the exception port for the entire task, not only - for a particular thread. This has the effect that when our exception - port gets the message, the thread specific exception port has already - been asked, and we don't need to bother about it. - See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ - task_set_exception_ports (self, mask, our_exception_port, - EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); - } - } - } -} -#elif defined _WIN32 && ! defined __CYGWIN__ -/* Avoid a crash on native Windows. */ -#define WIN32_LEAN_AND_MEAN -#include -#include -static LONG WINAPI -exception_filter (EXCEPTION_POINTERS *ExceptionInfo) -{ - switch (ExceptionInfo->ExceptionRecord->ExceptionCode) - { - case EXCEPTION_ACCESS_VIOLATION: - case EXCEPTION_IN_PAGE_ERROR: - case EXCEPTION_STACK_OVERFLOW: - case EXCEPTION_GUARD_PAGE: - case EXCEPTION_PRIV_INSTRUCTION: - case EXCEPTION_ILLEGAL_INSTRUCTION: - case EXCEPTION_DATATYPE_MISALIGNMENT: - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - case EXCEPTION_NONCONTINUABLE_EXCEPTION: - exit (1); - } - return EXCEPTION_CONTINUE_SEARCH; -} -static void -nocrash_init (void) -{ - SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); -} -#else -/* Avoid a crash on POSIX systems. */ -#include -#include -/* A POSIX signal handler. */ -static void -exception_handler (int sig) -{ - _exit (1); -} -static void -nocrash_init (void) -{ -#ifdef SIGSEGV - signal (SIGSEGV, exception_handler); -#endif -#ifdef SIGBUS - signal (SIGBUS, exception_handler); -#endif -} -#endif + GL_GNULIB_UNLINK=0 + + + + GL_GNULIB_UNLINKAT=0 + + -#include -#include -#include -#include -#include -int main() -{ - struct rlimit limit; - int ret; - nocrash_init (); - /* Some printf implementations allocate temporary space with malloc. */ - /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ -#ifdef RLIMIT_DATA - if (getrlimit (RLIMIT_DATA, &limit) < 0) - return 77; - if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) - limit.rlim_max = 5000000; - limit.rlim_cur = limit.rlim_max; - if (setrlimit (RLIMIT_DATA, &limit) < 0) - return 77; -#endif - /* On Linux systems, malloc() is limited by RLIMIT_AS. */ -#ifdef RLIMIT_AS - if (getrlimit (RLIMIT_AS, &limit) < 0) - return 77; - if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) - limit.rlim_max = 5000000; - limit.rlim_cur = limit.rlim_max; - if (setrlimit (RLIMIT_AS, &limit) < 0) - return 77; -#endif - /* Some printf implementations allocate temporary space on the stack. */ -#ifdef RLIMIT_STACK - if (getrlimit (RLIMIT_STACK, &limit) < 0) - return 77; - if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) - limit.rlim_max = 5000000; - limit.rlim_cur = limit.rlim_max; - if (setrlimit (RLIMIT_STACK, &limit) < 0) - return 77; -#endif - ret = printf ("%.5000000f", 1.0); - return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); -} + GL_GNULIB_USLEEP=0 -_ACEOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest$ac_exeext; then - (./conftest 2>&5 - result=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5 - if test $result != 0 && test $result != 77; then result=1; fi - exit $result - ) >/dev/null 2>/dev/null - case $? in - 0) gl_cv_func_printf_enomem="yes" ;; - 77) gl_cv_func_printf_enomem="guessing no" ;; - *) gl_cv_func_printf_enomem="no" ;; - esac - else - gl_cv_func_printf_enomem="guessing no" - fi - rm -fr conftest* - else - gl_cv_func_printf_enomem="guessing no" - fi - fi - if test "$gl_cv_func_printf_enomem" = "guessing no"; then - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on Solaris. - solaris*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on AIX. - aix*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on HP-UX/hppa. - hpux*) case "$host_cpu" in - hppa*) gl_cv_func_printf_enomem="guessing yes";; - *) gl_cv_func_printf_enomem="guessing no";; - esac - ;; - # Guess yes on IRIX. - irix*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on OSF/1. - osf*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on BeOS. - beos*) gl_cv_func_printf_enomem="guessing yes";; - # Guess yes on Haiku. - haiku*) gl_cv_func_printf_enomem="guessing yes";; - # If we don't know, assume the worst. - *) gl_cv_func_printf_enomem="guessing no";; - esac - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5 -$as_echo "$gl_cv_func_printf_enomem" >&6; } + GL_GNULIB_WRITE=0 - case "$gl_cv_func_printf_long_double" in - *yes) - ;; - *) -$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h + GL_GNULIB_MDA_ACCESS=1 - ;; - esac + GL_GNULIB_MDA_CHDIR=1 - for ac_func in $ac_func_list -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF -fi -done + GL_GNULIB_MDA_CLOSE=1 + GL_GNULIB_MDA_DUP=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 -$as_echo_n "checking for unsigned long long int... " >&6; } -if ${ac_cv_type_unsigned_long_long_int+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_type_unsigned_long_long_int=yes - if test "x${ac_cv_prog_cc_c99-no}" = xno; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* For now, do not test the preprocessor; as of 2007 there are too many - implementations with broken preprocessors. Perhaps this can - be revisited in 2012. In the meantime, code should not expect - #if to work with literals wider than 32 bits. */ - /* Test literals. */ - long long int ll = 9223372036854775807ll; - long long int nll = -9223372036854775807LL; - unsigned long long int ull = 18446744073709551615ULL; - /* Test constant expressions. */ - typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - ? 1 : -1)]; - typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 - ? 1 : -1)]; - int i = 63; -int -main () -{ -/* Test availability of runtime routines for shift and division. */ - long long int llmax = 9223372036854775807ll; - unsigned long long int ullmax = 18446744073709551615ull; - return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) - | (llmax / ll) | (llmax % ll) - | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) - | (ullmax / ull) | (ullmax % ull)); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : + GL_GNULIB_MDA_DUP2=1 -else - ac_cv_type_unsigned_long_long_int=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 -$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } - if test $ac_cv_type_unsigned_long_long_int = yes; then -$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h - fi + GL_GNULIB_MDA_EXECL=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 -$as_echo_n "checking for long long int... " >&6; } -if ${ac_cv_type_long_long_int+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_type_long_long_int=yes - if test "x${ac_cv_prog_cc_c99-no}" = xno; then - ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int - if test $ac_cv_type_long_long_int = yes; then - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #ifndef LLONG_MAX - # define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - # define LLONG_MAX (HALF - 1 + HALF) - #endif -int -main () -{ -long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : + GL_GNULIB_MDA_EXECLE=1 -else - ac_cv_type_long_long_int=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 -$as_echo "$ac_cv_type_long_long_int" >&6; } - if test $ac_cv_type_long_long_int = yes; then -$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h + GL_GNULIB_MDA_EXECLP=1 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 -$as_echo_n "checking for wchar_t... " >&6; } -if ${gt_cv_c_wchar_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - wchar_t foo = (wchar_t)'\0'; -int -main () -{ + GL_GNULIB_MDA_EXECV=1 - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gt_cv_c_wchar_t=yes -else - gt_cv_c_wchar_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 -$as_echo "$gt_cv_c_wchar_t" >&6; } - if test $gt_cv_c_wchar_t = yes; then -$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h + GL_GNULIB_MDA_EXECVE=1 + + + + GL_GNULIB_MDA_EXECVP=1 + + + + GL_GNULIB_MDA_EXECVPE=1 + + + + GL_GNULIB_MDA_GETCWD=1 + + + + GL_GNULIB_MDA_GETPID=1 + + + + GL_GNULIB_MDA_ISATTY=1 + + + + GL_GNULIB_MDA_LSEEK=1 + + + + GL_GNULIB_MDA_READ=1 + + + + GL_GNULIB_MDA_RMDIR=1 + + + + GL_GNULIB_MDA_SWAB=1 + + + + GL_GNULIB_MDA_UNLINK=1 + + + + GL_GNULIB_MDA_WRITE=1 + + + + + + + + + +gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} +i\ +0 +q +' +gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} +i\ +0 +q +' +gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} +i\ +0 +q +' + + + if test "$HAVE_LIBUNISTRING" = yes; then + LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` + LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` + LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` fi +ac_fn_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_vsnprintf" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_VSNPRINTF $ac_have_decl" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 -$as_echo_n "checking for wint_t... " >&6; } -if ${gt_cv_c_wint_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be included - before . */ -#include -#include -#include -#include - wint_t foo = (wchar_t)'\0'; -int -main () -{ + HAVE_BTOWC=1; + HAVE_MBSINIT=1; + HAVE_MBRTOWC=1; + HAVE_MBRLEN=1; + HAVE_MBSRTOWCS=1; + HAVE_MBSNRTOWCS=1; + HAVE_WCRTOMB=1; + HAVE_WCSRTOMBS=1; + HAVE_WCSNRTOMBS=1; + HAVE_WMEMCHR=1; + HAVE_WMEMCMP=1; + HAVE_WMEMCPY=1; + HAVE_WMEMMOVE=1; + HAVE_WMEMPCPY=1; + HAVE_WMEMSET=1; + HAVE_WCSLEN=1; + HAVE_WCSNLEN=1; + HAVE_WCSCPY=1; + HAVE_WCPCPY=1; + HAVE_WCSNCPY=1; + HAVE_WCPNCPY=1; + HAVE_WCSCAT=1; + HAVE_WCSNCAT=1; + HAVE_WCSCMP=1; + HAVE_WCSNCMP=1; + HAVE_WCSCASECMP=1; + HAVE_WCSNCASECMP=1; + HAVE_WCSCOLL=1; + HAVE_WCSXFRM=1; + HAVE_WCSDUP=1; + HAVE_WCSCHR=1; + HAVE_WCSRCHR=1; + HAVE_WCSCSPN=1; + HAVE_WCSSPN=1; + HAVE_WCSPBRK=1; + HAVE_WCSSTR=1; + HAVE_WCSTOK=1; + HAVE_WCSWIDTH=1; + HAVE_WCSFTIME=1; + HAVE_DECL_WCTOB=1; + HAVE_DECL_WCSDUP=1; + HAVE_DECL_WCWIDTH=1; + REPLACE_MBSTATE_T=0; + REPLACE_BTOWC=0; + REPLACE_WCTOB=0; + REPLACE_MBSINIT=0; + REPLACE_MBRTOWC=0; + REPLACE_MBRLEN=0; + REPLACE_MBSRTOWCS=0; + REPLACE_MBSNRTOWCS=0; + REPLACE_WCRTOMB=0; + REPLACE_WCSRTOMBS=0; + REPLACE_WCSNRTOMBS=0; + REPLACE_WCWIDTH=0; + REPLACE_WCSWIDTH=0; + REPLACE_WCSFTIME=0; + REPLACE_WCSTOK=0; + REPLACE_WMEMPCPY=0; + - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gt_cv_c_wint_t=yes -else - gt_cv_c_wint_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 -$as_echo "$gt_cv_c_wint_t" >&6; } - if test $gt_cv_c_wint_t = yes; then -$as_echo "#define HAVE_WINT_T 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether uses 'inline' correctly" >&5 +printf %s "checking whether uses 'inline' correctly... " >&6; } +if test ${gl_cv_header_wchar_h_correct_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_cv_header_wchar_h_correct_inline=yes + case "$host_os" in + *-gnu* | gnu*) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wint_t is too small" >&5 -$as_echo_n "checking whether wint_t is too small... " >&6; } -if ${gl_cv_type_wint_t_too_small+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + #define wcstod renamed_wcstod + #include + extern int zero (void); + int main () { return zero(); } + +_ACEOF + save_ac_compile="$ac_compile" + ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` + if echo '#include "conftest.c"' >conftest1.c \ + && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be - included before . */ -#if !(defined __GLIBC__ && !defined __UCLIBC__) -# include -# include -# include -#endif -#include - int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; -int -main () -{ + #define wcstod renamed_wcstod + #include + int zero (void) { return 0; } - ; - return 0; -} _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_type_wint_t_too_small=no -else - gl_cv_type_wint_t_too_small=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` + if echo '#include "conftest.c"' >conftest2.c \ + && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then + : + else + gl_cv_header_wchar_h_correct_inline=no + fi + fi + fi + ac_compile="$save_ac_compile" + rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext + ;; + esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_too_small" >&5 -$as_echo "$gl_cv_type_wint_t_too_small" >&6; } - if test $gl_cv_type_wint_t_too_small = yes; then - GNULIB_OVERRIDES_WINT_T=1 - else - GNULIB_OVERRIDES_WINT_T=0 - fi - else - GNULIB_OVERRIDES_WINT_T=0 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5 +printf "%s\n" "$gl_cv_header_wchar_h_correct_inline" >&6; } + if test $gl_cv_header_wchar_h_correct_inline = no; then + as_fn_error $? " cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). +This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in +C99 mode. You have four options: + - Add the flag -fgnu89-inline to CC and reconfigure, or + - Fix your include files, using parts of + , or + - Use a gcc version older than 4.3, or + - Don't use the flags -std=c99 or -std=gnu99. +Configuration aborted." "$LINENO" 5 fi + if test $ac_cv_header_crtdefs_h = yes; then + HAVE_CRTDEFS_H=1 + else + HAVE_CRTDEFS_H=0 + fi - for ac_header in $ac_header_list -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF -fi -done - if test $ac_cv_header_features_h = yes; then - HAVE_FEATURES_H=1 - else - HAVE_FEATURES_H=0 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 -$as_echo_n "checking for intmax_t... " >&6; } -if ${gt_cv_c_intmax_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if HAVE_STDINT_H_WITH_UINTMAX -#include -#endif -#if HAVE_INTTYPES_H_WITH_UINTMAX -#include -#endif + if test $gl_cv_have_include_next = yes; then + gl_cv_next_wchar_h='<'wchar.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_wchar_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop -int -main () -{ -intmax_t x = -1; return !x; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gt_cv_c_intmax_t=yes -else - gt_cv_c_intmax_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 -$as_echo "$gt_cv_c_intmax_t" >&6; } - if test $gt_cv_c_intmax_t = yes; then + if test $ac_cv_header_wchar_h = yes; then -$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h - else - test $ac_cv_type_long_long_int = yes \ - && ac_type='long long' \ - || ac_type='long' -cat >>confdefs.h <<_ACEOF -#define intmax_t $ac_type + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include _ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac - fi + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'wchar.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5 -$as_echo_n "checking where to find the exponent in a 'double'... " >&6; } -if ${gl_cv_cc_double_expbit0+:} false; then : - $as_echo_n "(cached) " >&6 -else + gl_header=$gl_cv_absolute_wchar_h + gl_cv_next_wchar_h='"'$gl_header'"' + else + gl_cv_next_wchar_h='<'wchar.h'>' + fi - if test "$cross_compiling" = yes; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5 +printf "%s\n" "$gl_cv_next_wchar_h" >&6; } + fi + NEXT_WCHAR_H=$gl_cv_next_wchar_h -#if defined arm || defined __arm || defined __arm__ - mixed_endianness -#endif + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'wchar.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_wchar_h + fi + NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "mixed_endianness" >/dev/null 2>&1; then : - gl_cv_cc_double_expbit0="unknown" -else - : -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include + if test $ac_cv_header_wchar_h = yes; then + HAVE_WCHAR_H=1 + else + HAVE_WCHAR_H=0 + fi -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif + if test $gt_cv_c_wint_t = yes; then + HAVE_WINT_T=1 + else + HAVE_WINT_T=0 + fi + - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - fi + + + ac_fn_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" " + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_wcsdup" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 fi -: - case $ac_cv_c_bigendian in #( - yes) - gl_cv_cc_double_expbit0="word 0 bit 20";; #( - no) - gl_cv_cc_double_expbit0="word 1 bit 20" ;; #( - universal) +printf "%s\n" "#define HAVE_DECL_WCSDUP $ac_have_decl" >>confdefs.h -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + if test $ac_cv_have_decl_wcsdup = no; then + HAVE_DECL_WCSDUP=0 + fi - ;; #( - *) - gl_cv_cc_double_expbit0="unknown" ;; - esac -fi -rm -f conftest* + GL_GNULIB_BTOWC=0 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#define NWORDS \ - ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { double value; unsigned int word[NWORDS]; } memory_double; -static unsigned int ored_words[NWORDS]; -static unsigned int anded_words[NWORDS]; -static void add_to_ored_words (double x) -{ - memory_double m; - size_t i; - /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ - memset (&m, 0, sizeof (memory_double)); - m.value = x; - for (i = 0; i < NWORDS; i++) - { - ored_words[i] |= m.word[i]; - anded_words[i] &= m.word[i]; - } -} -int main () -{ - size_t j; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - for (j = 0; j < NWORDS; j++) - anded_words[j] = ~ (unsigned int) 0; - add_to_ored_words (0.25); - add_to_ored_words (0.5); - add_to_ored_words (1.0); - add_to_ored_words (2.0); - add_to_ored_words (4.0); - /* Remove bits that are common (e.g. if representation of the first mantissa - bit is explicit). */ - for (j = 0; j < NWORDS; j++) - ored_words[j] &= ~anded_words[j]; - /* Now find the nonzero word. */ - for (j = 0; j < NWORDS; j++) - if (ored_words[j] != 0) - break; - if (j < NWORDS) - { - size_t i; - for (i = j + 1; i < NWORDS; i++) - if (ored_words[i] != 0) - { - fprintf (fp, "unknown"); - return (fclose (fp) != 0); - } - for (i = 0; ; i++) - if ((ored_words[j] >> i) & 1) - { - fprintf (fp, "word %d bit %d", (int) j, (int) i); - return (fclose (fp) != 0); - } - } - fprintf (fp, "unknown"); - return (fclose (fp) != 0); -} + GL_GNULIB_WCTOB=0 -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_double_expbit0=`cat conftest.out` -else - gl_cv_cc_double_expbit0="unknown" -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - rm -f conftest.out -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5 -$as_echo "$gl_cv_cc_double_expbit0" >&6; } - case "$gl_cv_cc_double_expbit0" in - word*bit*) - word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` + GL_GNULIB_MBSINIT=0 -cat >>confdefs.h <<_ACEOF -#define DBL_EXPBIT0_WORD $word -_ACEOF -cat >>confdefs.h <<_ACEOF -#define DBL_EXPBIT0_BIT $bit -_ACEOF + GL_GNULIB_MBRTOWC=0 - ;; - esac + GL_GNULIB_MBRLEN=0 + GL_GNULIB_MBSRTOWCS=0 + GL_GNULIB_MBSNRTOWCS=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5 -$as_echo_n "checking whether snprintf returns a byte count as in C99... " >&6; } -if ${gl_cv_func_snprintf_retval_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on FreeBSD >= 5. - freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; - freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on Mac OS X >= 10.3. - darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; - darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on OpenBSD >= 3.9. - openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) - gl_cv_func_snprintf_retval_c99="guessing no";; - openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on Solaris >= 2.10. - solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; - solaris*) gl_cv_func_printf_sizes_c99="guessing no";; - # Guess yes on AIX >= 4. - aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; - aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on NetBSD >= 3. - netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) - gl_cv_func_snprintf_retval_c99="guessing no";; - netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on BeOS. - beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; - # Guess yes on MSVC, no on mingw. - mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef _MSC_VER - Known -#endif + GL_GNULIB_WCRTOMB=0 -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_snprintf_retval_c99="guessing yes" -else - gl_cv_func_snprintf_retval_c99="guessing no" -fi -rm -f conftest* - ;; - # If we don't know, assume the worst. - *) gl_cv_func_snprintf_retval_c99="guessing no";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + GL_GNULIB_WCSRTOMBS=0 -#include -#include -#if HAVE_SNPRINTF -# define my_snprintf snprintf -#else -# include -static int my_snprintf (char *buf, int size, const char *format, ...) -{ - va_list args; - int ret; - va_start (args, format); - ret = vsnprintf (buf, size, format, args); - va_end (args); - return ret; -} -#endif -static char buf[100]; -int main () -{ - strcpy (buf, "ABCDEF"); - if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) - return 1; - if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) - return 2; - if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) - return 3; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_snprintf_retval_c99=yes -else - gl_cv_func_snprintf_retval_c99=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5 -$as_echo "$gl_cv_func_snprintf_retval_c99" >&6; } + GL_GNULIB_WCSNRTOMBS=0 + GL_GNULIB_WCWIDTH=0 - for ac_func in snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF + GL_GNULIB_WMEMCHR=0 -fi -done - ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include -" -if test "x$ac_cv_have_decl__snprintf" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL__SNPRINTF $ac_have_decl -_ACEOF + GL_GNULIB_WMEMCMP=0 - case "$gl_cv_func_snprintf_retval_c99" in - *yes) + GL_GNULIB_WMEMCPY=0 -$as_echo "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h - ;; - esac + GL_GNULIB_WMEMMOVE=0 - GNULIB_DPRINTF=0; - GNULIB_FCLOSE=0; - GNULIB_FDOPEN=0; - GNULIB_FFLUSH=0; - GNULIB_FGETC=0; - GNULIB_FGETS=0; - GNULIB_FOPEN=0; - GNULIB_FPRINTF=0; - GNULIB_FPRINTF_POSIX=0; - GNULIB_FPURGE=0; - GNULIB_FPUTC=0; - GNULIB_FPUTS=0; - GNULIB_FREAD=0; - GNULIB_FREOPEN=0; - GNULIB_FSCANF=0; - GNULIB_FSEEK=0; - GNULIB_FSEEKO=0; - GNULIB_FTELL=0; - GNULIB_FTELLO=0; - GNULIB_FWRITE=0; - GNULIB_GETC=0; - GNULIB_GETCHAR=0; - GNULIB_GETDELIM=0; - GNULIB_GETLINE=0; - GNULIB_OBSTACK_PRINTF=0; - GNULIB_OBSTACK_PRINTF_POSIX=0; - GNULIB_PCLOSE=0; - GNULIB_PERROR=0; - GNULIB_POPEN=0; - GNULIB_PRINTF=0; - GNULIB_PRINTF_POSIX=0; - GNULIB_PUTC=0; - GNULIB_PUTCHAR=0; - GNULIB_PUTS=0; - GNULIB_REMOVE=0; - GNULIB_RENAME=0; - GNULIB_RENAMEAT=0; - GNULIB_SCANF=0; - GNULIB_SNPRINTF=0; - GNULIB_SPRINTF_POSIX=0; - GNULIB_STDIO_H_NONBLOCKING=0; - GNULIB_STDIO_H_SIGPIPE=0; - GNULIB_TMPFILE=0; - GNULIB_VASPRINTF=0; - GNULIB_VFSCANF=0; - GNULIB_VSCANF=0; - GNULIB_VDPRINTF=0; - GNULIB_VFPRINTF=0; - GNULIB_VFPRINTF_POSIX=0; - GNULIB_VPRINTF=0; - GNULIB_VPRINTF_POSIX=0; - GNULIB_VSNPRINTF=0; - GNULIB_VSPRINTF_POSIX=0; - HAVE_DECL_FPURGE=1; - HAVE_DECL_FSEEKO=1; - HAVE_DECL_FTELLO=1; - HAVE_DECL_GETDELIM=1; - HAVE_DECL_GETLINE=1; - HAVE_DECL_OBSTACK_PRINTF=1; - HAVE_DECL_SNPRINTF=1; - HAVE_DECL_VSNPRINTF=1; - HAVE_DPRINTF=1; - HAVE_FSEEKO=1; - HAVE_FTELLO=1; - HAVE_PCLOSE=1; - HAVE_POPEN=1; - HAVE_RENAMEAT=1; - HAVE_VASPRINTF=1; - HAVE_VDPRINTF=1; - REPLACE_DPRINTF=0; - REPLACE_FCLOSE=0; - REPLACE_FDOPEN=0; - REPLACE_FFLUSH=0; - REPLACE_FOPEN=0; - REPLACE_FPRINTF=0; - REPLACE_FPURGE=0; - REPLACE_FREOPEN=0; - REPLACE_FSEEK=0; - REPLACE_FSEEKO=0; - REPLACE_FTELL=0; - REPLACE_FTELLO=0; - REPLACE_GETDELIM=0; - REPLACE_GETLINE=0; - REPLACE_OBSTACK_PRINTF=0; - REPLACE_PERROR=0; - REPLACE_POPEN=0; - REPLACE_PRINTF=0; - REPLACE_REMOVE=0; - REPLACE_RENAME=0; - REPLACE_RENAMEAT=0; - REPLACE_SNPRINTF=0; - REPLACE_SPRINTF=0; - REPLACE_STDIO_READ_FUNCS=0; - REPLACE_STDIO_WRITE_FUNCS=0; - REPLACE_TMPFILE=0; - REPLACE_VASPRINTF=0; - REPLACE_VDPRINTF=0; - REPLACE_VFPRINTF=0; - REPLACE_VPRINTF=0; - REPLACE_VSNPRINTF=0; - REPLACE_VSPRINTF=0; - GNULIB_ACOSF=0; - GNULIB_ACOSL=0; - GNULIB_ASINF=0; - GNULIB_ASINL=0; - GNULIB_ATANF=0; - GNULIB_ATANL=0; - GNULIB_ATAN2F=0; - GNULIB_CBRT=0; - GNULIB_CBRTF=0; - GNULIB_CBRTL=0; - GNULIB_CEIL=0; - GNULIB_CEILF=0; - GNULIB_CEILL=0; - GNULIB_COPYSIGN=0; - GNULIB_COPYSIGNF=0; - GNULIB_COPYSIGNL=0; - GNULIB_COSF=0; - GNULIB_COSL=0; - GNULIB_COSHF=0; - GNULIB_EXPF=0; - GNULIB_EXPL=0; - GNULIB_EXP2=0; - GNULIB_EXP2F=0; - GNULIB_EXP2L=0; - GNULIB_EXPM1=0; - GNULIB_EXPM1F=0; - GNULIB_EXPM1L=0; - GNULIB_FABSF=0; - GNULIB_FABSL=0; - GNULIB_FLOOR=0; - GNULIB_FLOORF=0; - GNULIB_FLOORL=0; - GNULIB_FMA=0; - GNULIB_FMAF=0; - GNULIB_FMAL=0; - GNULIB_FMOD=0; - GNULIB_FMODF=0; - GNULIB_FMODL=0; - GNULIB_FREXPF=0; - GNULIB_FREXP=0; - GNULIB_FREXPL=0; - GNULIB_HYPOT=0; - GNULIB_HYPOTF=0; - GNULIB_HYPOTL=0; - GNULIB_ILOGB=0; - GNULIB_ILOGBF=0; - GNULIB_ILOGBL=0; - GNULIB_ISFINITE=0; - GNULIB_ISINF=0; - GNULIB_ISNAN=0; - GNULIB_ISNANF=0; - GNULIB_ISNAND=0; - GNULIB_ISNANL=0; - GNULIB_LDEXPF=0; - GNULIB_LDEXPL=0; - GNULIB_LOG=0; - GNULIB_LOGF=0; - GNULIB_LOGL=0; - GNULIB_LOG10=0; - GNULIB_LOG10F=0; - GNULIB_LOG10L=0; - GNULIB_LOG1P=0; - GNULIB_LOG1PF=0; - GNULIB_LOG1PL=0; - GNULIB_LOG2=0; - GNULIB_LOG2F=0; - GNULIB_LOG2L=0; - GNULIB_LOGB=0; - GNULIB_LOGBF=0; - GNULIB_LOGBL=0; - GNULIB_MODF=0; - GNULIB_MODFF=0; - GNULIB_MODFL=0; - GNULIB_POWF=0; - GNULIB_REMAINDER=0; - GNULIB_REMAINDERF=0; - GNULIB_REMAINDERL=0; - GNULIB_RINT=0; - GNULIB_RINTF=0; - GNULIB_RINTL=0; - GNULIB_ROUND=0; - GNULIB_ROUNDF=0; - GNULIB_ROUNDL=0; - GNULIB_SIGNBIT=0; - GNULIB_SINF=0; - GNULIB_SINL=0; - GNULIB_SINHF=0; - GNULIB_SQRTF=0; - GNULIB_SQRTL=0; - GNULIB_TANF=0; - GNULIB_TANL=0; - GNULIB_TANHF=0; - GNULIB_TRUNC=0; - GNULIB_TRUNCF=0; - GNULIB_TRUNCL=0; - HAVE_ACOSF=1; - HAVE_ACOSL=1; - HAVE_ASINF=1; - HAVE_ASINL=1; - HAVE_ATANF=1; - HAVE_ATANL=1; - HAVE_ATAN2F=1; - HAVE_CBRT=1; - HAVE_CBRTF=1; - HAVE_CBRTL=1; - HAVE_COPYSIGN=1; - HAVE_COPYSIGNL=1; - HAVE_COSF=1; - HAVE_COSL=1; - HAVE_COSHF=1; - HAVE_EXPF=1; - HAVE_EXPL=1; - HAVE_EXPM1=1; - HAVE_EXPM1F=1; - HAVE_FABSF=1; - HAVE_FABSL=1; - HAVE_FMA=1; - HAVE_FMAF=1; - HAVE_FMAL=1; - HAVE_FMODF=1; - HAVE_FMODL=1; - HAVE_FREXPF=1; - HAVE_HYPOTF=1; - HAVE_HYPOTL=1; - HAVE_ILOGB=1; - HAVE_ILOGBF=1; - HAVE_ILOGBL=1; - HAVE_ISNANF=1; - HAVE_ISNAND=1; - HAVE_ISNANL=1; - HAVE_LDEXPF=1; - HAVE_LOGF=1; - HAVE_LOGL=1; - HAVE_LOG10F=1; - HAVE_LOG10L=1; - HAVE_LOG1P=1; - HAVE_LOG1PF=1; - HAVE_LOG1PL=1; - HAVE_LOGBF=1; - HAVE_LOGBL=1; - HAVE_MODFF=1; - HAVE_MODFL=1; - HAVE_POWF=1; - HAVE_REMAINDER=1; - HAVE_REMAINDERF=1; - HAVE_RINT=1; - HAVE_RINTL=1; - HAVE_SINF=1; - HAVE_SINL=1; - HAVE_SINHF=1; - HAVE_SQRTF=1; - HAVE_SQRTL=1; - HAVE_TANF=1; - HAVE_TANL=1; - HAVE_TANHF=1; - HAVE_DECL_ACOSL=1; - HAVE_DECL_ASINL=1; - HAVE_DECL_ATANL=1; - HAVE_DECL_CBRTF=1; - HAVE_DECL_CBRTL=1; - HAVE_DECL_CEILF=1; - HAVE_DECL_CEILL=1; - HAVE_DECL_COPYSIGNF=1; - HAVE_DECL_COSL=1; - HAVE_DECL_EXPL=1; - HAVE_DECL_EXP2=1; - HAVE_DECL_EXP2F=1; - HAVE_DECL_EXP2L=1; - HAVE_DECL_EXPM1L=1; - HAVE_DECL_FLOORF=1; - HAVE_DECL_FLOORL=1; - HAVE_DECL_FREXPL=1; - HAVE_DECL_LDEXPL=1; - HAVE_DECL_LOGL=1; - HAVE_DECL_LOG10L=1; - HAVE_DECL_LOG2=1; - HAVE_DECL_LOG2F=1; - HAVE_DECL_LOG2L=1; - HAVE_DECL_LOGB=1; - HAVE_DECL_REMAINDER=1; - HAVE_DECL_REMAINDERL=1; - HAVE_DECL_RINTF=1; - HAVE_DECL_ROUND=1; - HAVE_DECL_ROUNDF=1; - HAVE_DECL_ROUNDL=1; - HAVE_DECL_SINL=1; - HAVE_DECL_SQRTL=1; - HAVE_DECL_TANL=1; - HAVE_DECL_TRUNC=1; - HAVE_DECL_TRUNCF=1; - HAVE_DECL_TRUNCL=1; - REPLACE_ACOSF=0; - REPLACE_ASINF=0; - REPLACE_ATANF=0; - REPLACE_ATAN2F=0; - REPLACE_CBRTF=0; - REPLACE_CBRTL=0; - REPLACE_CEIL=0; - REPLACE_CEILF=0; - REPLACE_CEILL=0; - REPLACE_COSF=0; - REPLACE_COSHF=0; - REPLACE_EXPF=0; - REPLACE_EXPM1=0; - REPLACE_EXPM1F=0; - REPLACE_EXP2=0; - REPLACE_EXP2L=0; - REPLACE_FABSL=0; - REPLACE_FLOOR=0; - REPLACE_FLOORF=0; - REPLACE_FLOORL=0; - REPLACE_FMA=0; - REPLACE_FMAF=0; - REPLACE_FMAL=0; - REPLACE_FMOD=0; - REPLACE_FMODF=0; - REPLACE_FMODL=0; - REPLACE_FREXPF=0; - REPLACE_FREXP=0; - REPLACE_FREXPL=0; - REPLACE_HUGE_VAL=0; - REPLACE_HYPOT=0; - REPLACE_HYPOTF=0; - REPLACE_HYPOTL=0; - REPLACE_ILOGB=0; - REPLACE_ILOGBF=0; - REPLACE_ILOGBL=0; - REPLACE_ISFINITE=0; - REPLACE_ISINF=0; - REPLACE_ISNAN=0; - REPLACE_LDEXPL=0; - REPLACE_LOG=0; - REPLACE_LOGF=0; - REPLACE_LOGL=0; - REPLACE_LOG10=0; - REPLACE_LOG10F=0; - REPLACE_LOG10L=0; - REPLACE_LOG1P=0; - REPLACE_LOG1PF=0; - REPLACE_LOG1PL=0; - REPLACE_LOG2=0; - REPLACE_LOG2F=0; - REPLACE_LOG2L=0; - REPLACE_LOGB=0; - REPLACE_LOGBF=0; - REPLACE_LOGBL=0; - REPLACE_MODF=0; - REPLACE_MODFF=0; - REPLACE_MODFL=0; - REPLACE_NAN=0; - REPLACE_REMAINDER=0; - REPLACE_REMAINDERF=0; - REPLACE_REMAINDERL=0; - REPLACE_ROUND=0; - REPLACE_ROUNDF=0; - REPLACE_ROUNDL=0; - REPLACE_SIGNBIT=0; - REPLACE_SIGNBIT_USING_GCC=0; - REPLACE_SINF=0; - REPLACE_SINHF=0; - REPLACE_SQRTF=0; - REPLACE_SQRTL=0; - REPLACE_TANF=0; - REPLACE_TANHF=0; - REPLACE_TRUNC=0; - REPLACE_TRUNCF=0; - REPLACE_TRUNCL=0; + GL_GNULIB_WMEMPCPY=0 + + + + GL_GNULIB_WMEMSET=0 + + + + GL_GNULIB_WCSLEN=0 + + + + GL_GNULIB_WCSNLEN=0 + + + + GL_GNULIB_WCSCPY=0 + + + + GL_GNULIB_WCPCPY=0 + + + + GL_GNULIB_WCSNCPY=0 + + + + GL_GNULIB_WCPNCPY=0 + + + + GL_GNULIB_WCSCAT=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5 -$as_echo_n "checking whether frexp() can be used without linking with libm... " >&6; } -if ${gl_cv_func_frexp_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - double x; -int -main () -{ -int e; return frexp (x, &e) > 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_frexp_no_libm=yes -else - gl_cv_func_frexp_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + GL_GNULIB_WCSNCAT=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5 -$as_echo "$gl_cv_func_frexp_no_libm" >&6; } -ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" -if test "x$ac_cv_have_decl_alarm" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ALARM $ac_have_decl -_ACEOF + GL_GNULIB_WCSCMP=0 + GL_GNULIB_WCSNCMP=0 - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef _MSC_VER -MicrosoftCompiler -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "MicrosoftCompiler" >/dev/null 2>&1; then : - gl_asmext='asm' - gl_c_asm_opt='-c -Fa' + GL_GNULIB_WCSCASECMP=0 -else - gl_asmext='s' - gl_c_asm_opt='-S' -fi -rm -f conftest* + GL_GNULIB_WCSNCASECMP=0 + GL_GNULIB_WCSCOLL=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking host CPU and C ABI" >&5 -$as_echo_n "checking host CPU and C ABI... " >&6; } -if ${gl_cv_host_cpu_c_abi+:} false; then : - $as_echo_n "(cached) " >&6 -else - case "$host_cpu" in - i[4567]86 ) - gl_cv_host_cpu_c_abi=i386 - ;; - x86_64 ) - # On x86_64 systems, the C compiler may be generating code in one of - # these ABIs: - # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. - # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 - # with native Windows (mingw, MSVC). - # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. - # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if (defined __x86_64__ || defined __amd64__ \ - || defined _M_X64 || defined _M_AMD64) - int ok; - #else - error fail - #endif + GL_GNULIB_WCSXFRM=0 -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __ILP32__ || defined _ILP32 - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=x86_64-x32 -else - gl_cv_host_cpu_c_abi=x86_64 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - gl_cv_host_cpu_c_abi=i386 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) - gl_cv_host_cpu_c_abi=alpha - ;; + GL_GNULIB_WCSDUP=0 - arm* | aarch64 ) - # Assume arm with EABI. - # On arm64 systems, the C compiler may be generating code in one of - # these ABIs: - # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. - # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. - # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __aarch64__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __ILP32__ || defined _ILP32 - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=arm64-ilp32 -else - gl_cv_host_cpu_c_abi=arm64 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - # Don't distinguish little-endian and big-endian arm, since they - # don't require different machine code for simple operations and - # since the user can distinguish them through the preprocessor - # defines __ARMEL__ vs. __ARMEB__. - # But distinguish arm which passes floating-point arguments and - # return values in integer registers (r0, r1, ...) - this is - # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which - # passes them in float registers (s0, s1, ...) and double registers - # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer - # sets the preprocessor defines __ARM_PCS (for the first case) and - # __ARM_PCS_VFP (for the second case), but older GCC does not. - echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c - # Look for a reference to the register d0 in the .s file. - { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } >/dev/null 2>&1 - if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then - gl_cv_host_cpu_c_abi=armhf - else - gl_cv_host_cpu_c_abi=arm - fi - rm -f conftest* + GL_GNULIB_WCSCHR=0 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) - # On hppa, the C compiler may be generating 32-bit code or 64-bit - # code. In the latter case, it defines _LP64 and __LP64__. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __LP64__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=hppa64 -else - gl_cv_host_cpu_c_abi=hppa -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; + GL_GNULIB_WCSRCHR=0 - ia64* ) - # On ia64 on HP-UX, the C compiler may be generating 64-bit code or - # 32-bit code. In the latter case, it defines _ILP32. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef _ILP32 - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=ia64-ilp32 -else - gl_cv_host_cpu_c_abi=ia64 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - mips* ) - # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this - # at 32. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) - int ok; - #else - error fail - #endif + GL_GNULIB_WCSCSPN=0 -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=mips64 -else - # In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but - # may later get defined by ), and _MIPS_SIM == _ABIN32. - # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but - # may later get defined by ), and _MIPS_SIM == _ABIO32. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if (_MIPS_SIM == _ABIN32) - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=mipsn32 -else - gl_cv_host_cpu_c_abi=mips -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - powerpc* ) - # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. - # No need to distinguish them here; the caller may distinguish - # them based on the OS. - # On powerpc64 systems, the C compiler may still be generating - # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may - # be generating 64-bit code. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __powerpc64__ || defined _ARCH_PPC64 - int ok; - #else - error fail - #endif + GL_GNULIB_WCSSPN=0 -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # On powerpc64, there are two ABIs on Linux: The AIX compatible - # one and the ELFv2 one. The latter defines _CALL_ELF=2. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined _CALL_ELF && _CALL_ELF == 2 - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=powerpc64-elfv2 -else - gl_cv_host_cpu_c_abi=powerpc64 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - gl_cv_host_cpu_c_abi=powerpc -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; + GL_GNULIB_WCSPBRK=0 - rs6000 ) - gl_cv_host_cpu_c_abi=powerpc - ;; - riscv32 | riscv64 ) - # There are 2 architectures (with variants): rv32* and rv64*. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if __riscv_xlen == 64 - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cpu=riscv64 -else - cpu=riscv32 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. - # Size of 'long' and 'void *': - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __LP64__ - int ok; - #else - error fail - #endif + GL_GNULIB_WCSSTR=0 -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - main_abi=lp64 -else - main_abi=ilp32 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # Float ABIs: - # __riscv_float_abi_double: - # 'float' and 'double' are passed in floating-point registers. - # __riscv_float_abi_single: - # 'float' are passed in floating-point registers. - # __riscv_float_abi_soft: - # No values are passed in floating-point registers. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __riscv_float_abi_double - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - float_abi=d -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __riscv_float_abi_single - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - float_abi=f -else - float_abi='' -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + GL_GNULIB_WCSTOK=0 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" - ;; - s390* ) - # On s390x, the C compiler may be generating 64-bit (= s390x) code - # or 31-bit (= s390) code. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __LP64__ || defined __s390x__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=s390x -else - gl_cv_host_cpu_c_abi=s390 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; + GL_GNULIB_WCSWIDTH=0 - sparc | sparc64 ) - # UltraSPARCs running Linux have `uname -m` = "sparc64", but the - # C compiler still generates 32-bit code. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __sparcv9 || defined __arch64__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_host_cpu_c_abi=sparc64 -else - gl_cv_host_cpu_c_abi=sparc -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - *) - gl_cv_host_cpu_c_abi="$host_cpu" - ;; - esac + GL_GNULIB_WCSFTIME=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi" >&5 -$as_echo "$gl_cv_host_cpu_c_abi" >&6; } - HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` - HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" + GL_GNULIB_MDA_WCSDUP=1 - # This was - # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) - # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) - # earlier, but KAI C++ 3.2d doesn't like this. - sed -e 's/-/_/g' >> confdefs.h <&5 -$as_echo_n "checking where to find the exponent in a 'float'... " >&6; } -if ${gl_cv_cc_float_expbit0+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - gl_cv_cc_float_expbit0="word 0 bit 23" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#define NWORDS \ - ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { float value; unsigned int word[NWORDS]; } memory_float; -static unsigned int ored_words[NWORDS]; -static unsigned int anded_words[NWORDS]; -static void add_to_ored_words (float x) -{ - memory_float m; - size_t i; - /* Clear it first, in case - sizeof (float) < sizeof (memory_float). */ - memset (&m, 0, sizeof (memory_float)); - m.value = x; - for (i = 0; i < NWORDS; i++) - { - ored_words[i] |= m.word[i]; - anded_words[i] &= m.word[i]; - } -} -int main () -{ - size_t j; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - for (j = 0; j < NWORDS; j++) - anded_words[j] = ~ (unsigned int) 0; - add_to_ored_words (0.25f); - add_to_ored_words (0.5f); - add_to_ored_words (1.0f); - add_to_ored_words (2.0f); - add_to_ored_words (4.0f); - /* Remove bits that are common (e.g. if representation of the first mantissa - bit is explicit). */ - for (j = 0; j < NWORDS; j++) - ored_words[j] &= ~anded_words[j]; - /* Now find the nonzero word. */ - for (j = 0; j < NWORDS; j++) - if (ored_words[j] != 0) - break; - if (j < NWORDS) - { - size_t i; - for (i = j + 1; i < NWORDS; i++) - if (ored_words[i] != 0) - { - fprintf (fp, "unknown"); - return (fclose (fp) != 0); - } - for (i = 0; ; i++) - if ((ored_words[j] >> i) & 1) - { - fprintf (fp, "word %d bit %d", (int) j, (int) i); - return (fclose (fp) != 0); - } - } - fprintf (fp, "unknown"); - return (fclose (fp) != 0); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_float_expbit0=`cat conftest.out` -else - gl_cv_cc_float_expbit0="unknown" -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - rm -f conftest.out -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 -$as_echo "$gl_cv_cc_float_expbit0" >&6; } - case "$gl_cv_cc_float_expbit0" in - word*bit*) - word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` -cat >>confdefs.h <<_ACEOF -#define FLT_EXPBIT0_WORD $word -_ACEOF + if test $ac_cv_func_iswcntrl = yes; then + HAVE_ISWCNTRL=1 + else + HAVE_ISWCNTRL=0 + fi -cat >>confdefs.h <<_ACEOF -#define FLT_EXPBIT0_BIT $bit -_ACEOF - ;; - esac + if test $gt_cv_c_wint_t = yes; then + HAVE_WINT_T=1 + else + HAVE_WINT_T=0 + fi @@ -11487,22 +17529,23 @@ _ACEOF if test $gl_cv_have_include_next = yes; then - gl_cv_next_limits_h='<'limits.h'>' + gl_cv_next_wctype_h='<'wctype.h'>' else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_limits_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_wctype_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test $ac_cv_header_limits_h = yes; then + if test $ac_cv_header_wctype_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; @@ -11518,7 +17561,7 @@ _ACEOF ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'limits.h' \ + gl_header_literal_regex=`echo 'wctype.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ @@ -11527,623 +17570,399 @@ _ACEOF q }' - gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_limits_h - gl_cv_next_limits_h='"'$gl_header'"' + gl_header=$gl_cv_absolute_wctype_h + gl_cv_next_wctype_h='"'$gl_header'"' else - gl_cv_next_limits_h='<'limits.h'>' + gl_cv_next_wctype_h='<'wctype.h'>' fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5 -$as_echo "$gl_cv_next_limits_h" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5 +printf "%s\n" "$gl_cv_next_wctype_h" >&6; } fi - NEXT_LIMITS_H=$gl_cv_next_limits_h + NEXT_WCTYPE_H=$gl_cv_next_wctype_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'limits.h'>' + gl_next_as_first_directive='<'wctype.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_limits_h + gl_next_as_first_directive=$gl_cv_next_wctype_h fi - NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5 -$as_echo_n "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; } -if ${gl_cv_header_limits_width+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ - #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 - #endif - #include - long long llm = LLONG_MAX; - int wb = WORD_BIT; - int ullw = ULLONG_WIDTH; - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_limits_width=yes -else - gl_cv_header_limits_width=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5 -$as_echo "$gl_cv_header_limits_width" >&6; } - if test "$gl_cv_header_limits_width" = yes; then - LIMITS_H= - else - LIMITS_H=limits.h - fi - - if test -n "$LIMITS_H"; then - GL_GENERATE_LIMITS_H_TRUE= - GL_GENERATE_LIMITS_H_FALSE='#' -else - GL_GENERATE_LIMITS_H_TRUE='#' - GL_GENERATE_LIMITS_H_FALSE= -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 -$as_echo_n "checking for nl_langinfo and CODESET... " >&6; } -if ${am_cv_langinfo_codeset+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -char* cs = nl_langinfo(CODESET); return !cs; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - am_cv_langinfo_codeset=yes -else - am_cv_langinfo_codeset=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 -$as_echo "$am_cv_langinfo_codeset" >&6; } - if test $am_cv_langinfo_codeset = yes; then - -$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h - - fi - - - - - - + NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5 -$as_echo_n "checking for working fcntl.h... " >&6; } -if ${gl_cv_header_working_fcntl_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - gl_cv_header_working_fcntl_h=cross-compiling -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + if test $ac_cv_header_wctype_h = yes; then + if test $ac_cv_func_iswcntrl = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5 +printf %s "checking whether iswcntrl works... " >&6; } +if test ${gl_cv_func_iswcntrl_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - #include - #if HAVE_UNISTD_H - # include - #else /* on Windows with MSVC */ - # include - # include - # defined sleep(n) _sleep ((n) * 1000) - #endif - #include - #ifndef O_NOATIME - #define O_NOATIME 0 - #endif - #ifndef O_NOFOLLOW - #define O_NOFOLLOW 0 - #endif - static int const constants[] = - { - O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, - O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY - }; - +#include + #if __GNU_LIBRARY__ == 1 + Linux libc5 i18n is broken. + #endif int -main () +main (void) { - int result = !constants; - #if HAVE_SYMLINK - { - static char const sym[] = "conftest.sym"; - if (symlink ("/dev/null", sym) != 0) - result |= 2; - else - { - int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); - if (fd >= 0) - { - close (fd); - result |= 4; - } - } - if (unlink (sym) != 0 || symlink (".", sym) != 0) - result |= 2; - else - { - int fd = open (sym, O_RDONLY | O_NOFOLLOW); - if (fd >= 0) - { - close (fd); - result |= 4; - } - } - unlink (sym); - } - #endif - { - static char const file[] = "confdefs.h"; - int fd = open (file, O_RDONLY | O_NOATIME); - if (fd < 0) - result |= 8; - else - { - struct stat st0; - if (fstat (fd, &st0) != 0) - result |= 16; - else - { - char c; - sleep (1); - if (read (fd, &c, 1) != 1) - result |= 24; - else - { - if (close (fd) != 0) - result |= 32; - else - { - struct stat st1; - if (stat (file, &st1) != 0) - result |= 40; - else - if (st0.st_atime != st1.st_atime) - result |= 64; - } - } - } - } - } - return result; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_header_working_fcntl_h=yes -else - case $? in #( - 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( - 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( - 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( - *) gl_cv_header_working_fcntl_h='no';; - esac -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5 -$as_echo "$gl_cv_header_working_fcntl_h" >&6; } - - case $gl_cv_header_working_fcntl_h in #( - *O_NOATIME* | no | cross-compiling) ac_val=0;; #( - *) ac_val=1;; - esac - -cat >>confdefs.h <<_ACEOF -#define HAVE_WORKING_O_NOATIME $ac_val -_ACEOF - - - case $gl_cv_header_working_fcntl_h in #( - *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( - *) ac_val=1;; - esac - -cat >>confdefs.h <<_ACEOF -#define HAVE_WORKING_O_NOFOLLOW $ac_val -_ACEOF - - -ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" -if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl -_ACEOF - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5 -$as_echo_n "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; } -if ${ac_cv_gnu_library_2_1+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#ifdef __GNU_LIBRARY__ - #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) - Lucky GNU user - #endif -#endif -#ifdef __UCLIBC__ - Lucky user -#endif - + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Lucky" >/dev/null 2>&1; then : - ac_cv_gnu_library_2_1=yes -else - ac_cv_gnu_library_2_1=no +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_func_iswcntrl_works="guessing yes" +else $as_nop + gl_cv_func_iswcntrl_works="guessing no" fi -rm -f conftest* +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include + #include + int main () { return iswprint ('x') == 0; } +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_iswcntrl_works=yes +else $as_nop + gl_cv_func_iswcntrl_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 -$as_echo "$ac_cv_gnu_library_2_1" >&6; } - GLIBC21="$ac_cv_gnu_library_2_1" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5 +printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; } + fi + HAVE_WCTYPE_H=1 + else + HAVE_WCTYPE_H=0 + fi + if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then + REPLACE_ISWCNTRL=1 + else + case "$gl_cv_func_iswcntrl_works" in + *yes) REPLACE_ISWCNTRL=0 ;; + *) REPLACE_ISWCNTRL=1 ;; + esac + fi + if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then + : + fi + if test $REPLACE_ISWCNTRL = 1; then + REPLACE_TOWLOWER=1 + else + ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" +if test "x$ac_cv_func_towlower" = xyes +then : + printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h +fi + if test $ac_cv_func_towlower = yes; then + REPLACE_TOWLOWER=0 + else + ac_fn_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include + #if HAVE_WCTYPE_H + # include + #endif - GNULIB_EXPLICIT_BZERO=0; - GNULIB_FFSL=0; - GNULIB_FFSLL=0; - GNULIB_MEMCHR=0; - GNULIB_MEMMEM=0; - GNULIB_MEMPCPY=0; - GNULIB_MEMRCHR=0; - GNULIB_RAWMEMCHR=0; - GNULIB_STPCPY=0; - GNULIB_STPNCPY=0; - GNULIB_STRCHRNUL=0; - GNULIB_STRDUP=0; - GNULIB_STRNCAT=0; - GNULIB_STRNDUP=0; - GNULIB_STRNLEN=0; - GNULIB_STRPBRK=0; - GNULIB_STRSEP=0; - GNULIB_STRSTR=0; - GNULIB_STRCASESTR=0; - GNULIB_STRTOK_R=0; - GNULIB_MBSLEN=0; - GNULIB_MBSNLEN=0; - GNULIB_MBSCHR=0; - GNULIB_MBSRCHR=0; - GNULIB_MBSSTR=0; - GNULIB_MBSCASECMP=0; - GNULIB_MBSNCASECMP=0; - GNULIB_MBSPCASECMP=0; - GNULIB_MBSCASESTR=0; - GNULIB_MBSCSPN=0; - GNULIB_MBSPBRK=0; - GNULIB_MBSSPN=0; - GNULIB_MBSSEP=0; - GNULIB_MBSTOK_R=0; - GNULIB_STRERROR=0; - GNULIB_STRERROR_R=0; - GNULIB_STRSIGNAL=0; - GNULIB_STRVERSCMP=0; - HAVE_MBSLEN=0; - HAVE_EXPLICIT_BZERO=1; - HAVE_FFSL=1; - HAVE_FFSLL=1; - HAVE_MEMCHR=1; - HAVE_DECL_MEMMEM=1; - HAVE_MEMPCPY=1; - HAVE_DECL_MEMRCHR=1; - HAVE_RAWMEMCHR=1; - HAVE_STPCPY=1; - HAVE_STPNCPY=1; - HAVE_STRCHRNUL=1; - HAVE_DECL_STRDUP=1; - HAVE_DECL_STRNDUP=1; - HAVE_DECL_STRNLEN=1; - HAVE_STRPBRK=1; - HAVE_STRSEP=1; - HAVE_STRCASESTR=1; - HAVE_DECL_STRTOK_R=1; - HAVE_DECL_STRERROR_R=1; - HAVE_DECL_STRSIGNAL=1; - HAVE_STRVERSCMP=1; - REPLACE_MEMCHR=0; - REPLACE_MEMMEM=0; - REPLACE_STPNCPY=0; - REPLACE_STRCHRNUL=0; - REPLACE_STRDUP=0; - REPLACE_STRNCAT=0; - REPLACE_STRNDUP=0; - REPLACE_STRNLEN=0; - REPLACE_STRSTR=0; - REPLACE_STRCASESTR=0; - REPLACE_STRTOK_R=0; - REPLACE_STRERROR=0; - REPLACE_STRERROR_R=0; - REPLACE_STRSIGNAL=0; - UNDEFINE_STRTOK_R=0; +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_towlower" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h + if test $ac_cv_have_decl_towlower = yes; then + REPLACE_TOWLOWER=1 + else + REPLACE_TOWLOWER=0 + fi + fi + fi + if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then + : + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5 +printf %s "checking for wctype_t... " >&6; } +if test ${gl_cv_type_wctype_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #if HAVE_WCTYPE_H + # include + #endif + wctype_t a; +int +main (void) +{ - # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it - # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is - # irrelevant for anonymous mappings. - ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" -if test "x$ac_cv_func_mmap" = xyes; then : - gl_have_mmap=yes -else - gl_have_mmap=no + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_type_wctype_t=yes +else $as_nop + gl_cv_type_wctype_t=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5 +printf "%s\n" "$gl_cv_type_wctype_t" >&6; } + if test $gl_cv_type_wctype_t = no; then + HAVE_WCTYPE_T=0 + fi - # Try to allow MAP_ANONYMOUS. - gl_have_mmap_anonymous=no - if test $gl_have_mmap = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 -$as_echo_n "checking for MAP_ANONYMOUS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5 +printf %s "checking for wctrans_t... " >&6; } +if test ${gl_cv_type_wctrans_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include + #include + wctrans_t a; -#include -#ifdef MAP_ANONYMOUS - I cannot identify this map -#endif +int +main (void) +{ + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "I cannot identify this map" >/dev/null 2>&1; then : - gl_have_mmap_anonymous=yes +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_type_wctrans_t=yes +else $as_nop + gl_cv_type_wctrans_t=no fi -rm -f conftest* +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - if test $gl_have_mmap_anonymous != yes; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5 +printf "%s\n" "$gl_cv_type_wctrans_t" >&6; } + if test $gl_cv_type_wctrans_t = no; then + HAVE_WCTRANS_T=0 + fi -#include -#ifdef MAP_ANON - I cannot identify this map -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "I cannot identify this map" >/dev/null 2>&1; then : -$as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h - gl_have_mmap_anonymous=yes -fi -rm -f conftest* - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 -$as_echo "$gl_have_mmap_anonymous" >&6; } - if test $gl_have_mmap_anonymous = yes; then -$as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h - fi - fi + GL_GNULIB_ISWBLANK=0 + GL_GNULIB_ISWDIGIT=0 - if test $HAVE_MEMCHR = 1; then - # Detect platform-specific bugs in some versions of glibc: - # memchr should not dereference anything with length 0 - # https://bugzilla.redhat.com/show_bug.cgi?id=499689 - # memchr should not dereference overestimated length after a match - # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 - # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 - # Assume that memchr works on platforms that lack mprotect. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5 -$as_echo_n "checking whether memchr works... " >&6; } -if ${gl_cv_func_memchr_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on native Windows. - mingw*) gl_cv_func_memchr_works="guessing yes" ;; - # Be pessimistic for now. - *) gl_cv_func_memchr_works="guessing no" ;; - esac + GL_GNULIB_ISWXDIGIT=0 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if HAVE_SYS_MMAN_H -# include -# include -# include -# include -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif -#endif -int -main () -{ + GL_GNULIB_WCTYPE=0 - int result = 0; - char *fence = NULL; -#if HAVE_SYS_MMAN_H && HAVE_MPROTECT -# if HAVE_MAP_ANONYMOUS - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - const int fd = -1; -# else /* !HAVE_MAP_ANONYMOUS */ - const int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY, 0666); - if (fd >= 0) -# endif - { - int pagesize = getpagesize (); - char *two_pages = - (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, - flags, fd, 0); - if (two_pages != (char *)(-1) - && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) - fence = two_pages + pagesize; - } -#endif - if (fence) - { - if (memchr (fence, 0, 0)) - result |= 1; - strcpy (fence - 9, "12345678"); - if (memchr (fence - 9, 0, 79) != fence - 1) - result |= 2; - if (memchr (fence - 1, 0, 3) != fence - 1) - result |= 4; - } - return result; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_memchr_works=yes -else - gl_cv_func_memchr_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi + GL_GNULIB_ISWCTYPE=0 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5 -$as_echo "$gl_cv_func_memchr_works" >&6; } - case "$gl_cv_func_memchr_works" in - *yes) ;; - *) REPLACE_MEMCHR=1 ;; - esac - fi -ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" -if test "x$ac_cv_have_decl_snprintf" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SNPRINTF $ac_have_decl -_ACEOF + GL_GNULIB_WCTRANS=0 - REPLACE_NULL=0; - HAVE_MAX_ALIGN_T=1; - HAVE_WCHAR_T=1; + GL_GNULIB_TOWCTRANS=0 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } +#endif +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac - if test $ac_cv_type_long_long_int = yes; then - HAVE_LONG_LONG_INT=1 - else - HAVE_LONG_LONG_INT=0 - fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler option to allow warnings" >&5 +printf %s "checking for C compiler option to allow warnings... " >&6; } +if test ${gl_cv_cc_wallow+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f conftest* + echo 'int dummy;' > conftest.c + { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } >/dev/null + { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } >/dev/null + if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then + gl_cv_cc_wallow='-Wno-error' + else + gl_cv_cc_wallow=none + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_wallow" >&5 +printf "%s\n" "$gl_cv_cc_wallow" >&6; } + case "$gl_cv_cc_wallow" in + none) GL_CFLAG_ALLOW_WARNINGS='' ;; + *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;; + esac - if test $ac_cv_type_unsigned_long_long_int = yes; then - HAVE_UNSIGNED_LONG_LONG_INT=1 - else - HAVE_UNSIGNED_LONG_LONG_INT=0 - fi - if test $ac_cv_header_wchar_h = yes; then - HAVE_WCHAR_H=1 - else - HAVE_WCHAR_H=0 + GL_CFLAG_GNULIB_WARNINGS='' + if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then + cat > conftest.c <<\EOF + #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3) + -Wno-cast-qual + -Wno-conversion + -Wno-float-equal + -Wno-sign-compare + -Wno-undef + -Wno-unused-function + -Wno-unused-parameter + #endif + #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) + -Wno-float-conversion + #endif + #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3) + -Wimplicit-fallthrough + #endif + #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) + -Wno-pedantic + #endif + #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) + -Wno-sign-conversion + -Wno-type-limits + #endif + #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4 + -Wno-unsuffixed-float-constants + #endif +EOF + gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gl_command\""; } >&5 + (eval $gl_command) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + gl_options=`grep -v '#' conftest.out` + for word in $gl_options; do + GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word" + done + fi + rm -f conftest.c conftest.out fi - if test $ac_cv_header_inttypes_h = yes; then - HAVE_INTTYPES_H=1 - else - HAVE_INTTYPES_H=0 - fi + if false; then + GL_COND_LIBTOOL_TRUE= + GL_COND_LIBTOOL_FALSE='#' +else + GL_COND_LIBTOOL_TRUE='#' + GL_COND_LIBTOOL_FALSE= +fi - if test $ac_cv_header_sys_types_h = yes; then - HAVE_SYS_TYPES_H=1 - else - HAVE_SYS_TYPES_H=0 - fi + gl_cond_libtool=false + gl_libdeps= + gl_ltlibdeps= + gl_m4_base='gnulib_m4' @@ -12155,352 +17974,409 @@ _ACEOF - if test $gl_cv_have_include_next = yes; then - gl_cv_next_stdint_h='<'stdint.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_stdint_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test $ac_cv_header_stdint_h = yes; then + gl_source_base='lib' + gl_source_base_prefix='$(top_build_prefix)lib/' + if test $ac_cv_func_alloca_works = no; then + : + fi + # Define an additional variable used in the Makefile substitution. + if test $ac_cv_working_alloca_h = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5 +printf %s "checking for alloca as a compiler built-in... " >&6; } +if test ${gl_cv_rpl_alloca+y} +then : + printf %s "(cached) " >&6 +else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'stdint.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - - gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - - gl_header=$gl_cv_absolute_stdint_h - gl_cv_next_stdint_h='"'$gl_header'"' - else - gl_cv_next_stdint_h='<'stdint.h'>' - fi +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Need own alloca" >/dev/null 2>&1 +then : + gl_cv_rpl_alloca=yes +else $as_nop + gl_cv_rpl_alloca=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5 -$as_echo "$gl_cv_next_stdint_h" >&6; } - fi - NEXT_STDINT_H=$gl_cv_next_stdint_h +rm -rf conftest* - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'stdint.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_stdint_h - fi - NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5 +printf "%s\n" "$gl_cv_rpl_alloca" >&6; } + if test $gl_cv_rpl_alloca = yes; then +printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h + GL_GENERATE_ALLOCA_H=true + else + GL_GENERATE_ALLOCA_H=false + fi + else + GL_GENERATE_ALLOCA_H=true + fi - if test $ac_cv_header_stdint_h = yes; then - HAVE_STDINT_H=1 + if test $ac_cv_working_alloca_h = yes; then + HAVE_ALLOCA_H=1 else - HAVE_STDINT_H=0 + HAVE_ALLOCA_H=0 fi - if test $ac_cv_header_stdint_h = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5 -$as_echo_n "checking whether stdint.h conforms to C99... " >&6; } -if ${gl_cv_header_working_stdint_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - gl_cv_header_working_stdint_h=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ -#define __STDC_CONSTANT_MACROS 1 -#define __STDC_LIMIT_MACROS 1 -#include -/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ -#if !(defined WCHAR_MIN && defined WCHAR_MAX) -#error "WCHAR_MIN, WCHAR_MAX not defined in " -#endif - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif + case "$GL_GENERATE_ALLOCA_H" in + false) ALLOCA_H='' ;; + true) + if test -z "$ALLOCA_H"; then + ALLOCA_H="${gl_source_base_prefix}alloca.h" + fi + ;; + *) echo "*** GL_GENERATE_ALLOCA_H is not set correctly" 1>&2; exit 1 ;; + esac + + + if $GL_GENERATE_ALLOCA_H; then + GL_GENERATE_ALLOCA_H_TRUE= + GL_GENERATE_ALLOCA_H_FALSE='#' +else + GL_GENERATE_ALLOCA_H_TRUE='#' + GL_GENERATE_ALLOCA_H_FALSE= +fi +: + if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then + GL_GENERATE_ALLOCA_H_TRUE='#' + GL_GENERATE_ALLOCA_H_FALSE='#' + fi + -#ifdef INT8_MAX -int8_t a1 = INT8_MAX; -int8_t a1min = INT8_MIN; -#endif -#ifdef INT16_MAX -int16_t a2 = INT16_MAX; -int16_t a2min = INT16_MIN; -#endif -#ifdef INT32_MAX -int32_t a3 = INT32_MAX; -int32_t a3min = INT32_MIN; -#endif -#ifdef INT64_MAX -int64_t a4 = INT64_MAX; -int64_t a4min = INT64_MIN; -#endif -#ifdef UINT8_MAX -uint8_t b1 = UINT8_MAX; -#else -typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; -#endif -#ifdef UINT16_MAX -uint16_t b2 = UINT16_MAX; -#endif -#ifdef UINT32_MAX -uint32_t b3 = UINT32_MAX; -#endif -#ifdef UINT64_MAX -uint64_t b4 = UINT64_MAX; -#endif -int_least8_t c1 = INT8_C (0x7f); -int_least8_t c1max = INT_LEAST8_MAX; -int_least8_t c1min = INT_LEAST8_MIN; -int_least16_t c2 = INT16_C (0x7fff); -int_least16_t c2max = INT_LEAST16_MAX; -int_least16_t c2min = INT_LEAST16_MIN; -int_least32_t c3 = INT32_C (0x7fffffff); -int_least32_t c3max = INT_LEAST32_MAX; -int_least32_t c3min = INT_LEAST32_MIN; -int_least64_t c4 = INT64_C (0x7fffffffffffffff); -int_least64_t c4max = INT_LEAST64_MAX; -int_least64_t c4min = INT_LEAST64_MIN; -uint_least8_t d1 = UINT8_C (0xff); -uint_least8_t d1max = UINT_LEAST8_MAX; -uint_least16_t d2 = UINT16_C (0xffff); -uint_least16_t d2max = UINT_LEAST16_MAX; -uint_least32_t d3 = UINT32_C (0xffffffff); -uint_least32_t d3max = UINT_LEAST32_MAX; -uint_least64_t d4 = UINT64_C (0xffffffffffffffff); -uint_least64_t d4max = UINT_LEAST64_MAX; -int_fast8_t e1 = INT_FAST8_MAX; -int_fast8_t e1min = INT_FAST8_MIN; -int_fast16_t e2 = INT_FAST16_MAX; -int_fast16_t e2min = INT_FAST16_MIN; -int_fast32_t e3 = INT_FAST32_MAX; -int_fast32_t e3min = INT_FAST32_MIN; -int_fast64_t e4 = INT_FAST64_MAX; -int_fast64_t e4min = INT_FAST64_MIN; -uint_fast8_t f1 = UINT_FAST8_MAX; -uint_fast16_t f2 = UINT_FAST16_MAX; -uint_fast32_t f3 = UINT_FAST32_MAX; -uint_fast64_t f4 = UINT_FAST64_MAX; -#ifdef INTPTR_MAX -intptr_t g = INTPTR_MAX; -intptr_t gmin = INTPTR_MIN; -#endif -#ifdef UINTPTR_MAX -uintptr_t h = UINTPTR_MAX; -#endif -intmax_t i = INTMAX_MAX; -uintmax_t j = UINTMAX_MAX; -/* Check that SIZE_MAX has the correct type, if possible. */ -#if 201112 <= __STDC_VERSION__ -int k = _Generic (SIZE_MAX, size_t: 0); -#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \ - || (0x5110 <= __SUNPRO_C && !__STDC__)) -extern size_t k; -extern __typeof__ (SIZE_MAX) k; -#endif -#include /* for CHAR_BIT */ -#define TYPE_MINIMUM(t) \ - ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) -#define TYPE_MAXIMUM(t) \ - ((t) ((t) 0 < (t) -1 \ - ? (t) -1 \ - : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) -struct s { - int check_PTRDIFF: - PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) - && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) - ? 1 : -1; - /* Detect bug in FreeBSD 6.0 / ia64. */ - int check_SIG_ATOMIC: - SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) - && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) - ? 1 : -1; - int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; - int check_WCHAR: - WCHAR_MIN == TYPE_MINIMUM (wchar_t) - && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) - ? 1 : -1; - /* Detect bug in mingw. */ - int check_WINT: - WINT_MIN == TYPE_MINIMUM (wint_t) - && WINT_MAX == TYPE_MAXIMUM (wint_t) - ? 1 : -1; - /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ - int check_UINT8_C: - (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; - int check_UINT16_C: - (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; - /* Detect bugs in OpenBSD 3.9 stdint.h. */ -#ifdef UINT8_MAX - int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; -#endif -#ifdef UINT16_MAX - int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; -#endif -#ifdef UINT32_MAX - int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; -#endif -#ifdef UINT64_MAX - int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; -#endif - int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; - int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; - int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; - int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; - int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; - int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; - int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; - int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; - int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; - int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; - int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; -}; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static_assert" >&5 +printf %s "checking for static_assert... " >&6; } +if test ${gl_cv_static_assert+y} +then : + printf %s "(cached) " >&6 +else $as_nop + gl_save_CFLAGS=$CFLAGS + for gl_working in "yes, a keyword" "yes, an macro"; do + case $gl_working in #( + *assert.h*) : + CFLAGS="$gl_save_CFLAGS -DINCLUDE_ASSERT_H" ;; #( + *) : + ;; +esac + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined __clang__ && __STDC_VERSION__ < 202311 + #pragma clang diagnostic error "-Wc2x-extensions" + #pragma clang diagnostic error "-Wc++1z-extensions" + #endif + #ifdef INCLUDE_ASSERT_H + #include + #endif + static_assert (2 + 2 == 4, "arithmetic does not work"); + static_assert (2 + 2 == 4); int -main () +main (void) { + static_assert (sizeof (char) == 1, "sizeof does not work"); + static_assert (sizeof (char) == 1); + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on native Windows. - mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; - # In general, assume it works. - *) gl_cv_header_working_stdint_h="guessing yes" ;; - esac +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_static_assert=$gl_working +else $as_nop + gl_cv_static_assert=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$gl_save_CFLAGS + test "$gl_cv_static_assert" != no && break + done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_static_assert" >&5 +printf "%s\n" "$gl_cv_static_assert" >&6; } + + GL_GENERATE_ASSERT_H=false + case $gl_cv_static_assert in #( + yes*keyword*) : + +printf "%s\n" "#define HAVE_C_STATIC_ASSERT 1" >>confdefs.h + ;; #( + no) : + GL_GENERATE_ASSERT_H=true + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_assert_h='<'assert.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_assert_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + -else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include +_ACEOF + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' + ;; + *) + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'assert.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' -#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ -#define __STDC_CONSTANT_MACROS 1 -#define __STDC_LIMIT_MACROS 1 -#include + gl_cv_absolute_assert_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` + gl_header=$gl_cv_absolute_assert_h + gl_cv_next_assert_h='"'$gl_header'"' - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_assert_h" >&5 +printf "%s\n" "$gl_cv_next_assert_h" >&6; } + fi + NEXT_ASSERT_H=$gl_cv_next_assert_h -#include -#include -#define MVAL(macro) MVAL1(macro) -#define MVAL1(expression) #expression -static const char *macro_values[] = - { -#ifdef INT8_MAX - MVAL (INT8_MAX), -#endif -#ifdef INT16_MAX - MVAL (INT16_MAX), -#endif -#ifdef INT32_MAX - MVAL (INT32_MAX), -#endif -#ifdef INT64_MAX - MVAL (INT64_MAX), -#endif -#ifdef UINT8_MAX - MVAL (UINT8_MAX), -#endif -#ifdef UINT16_MAX - MVAL (UINT16_MAX), -#endif -#ifdef UINT32_MAX - MVAL (UINT32_MAX), -#endif -#ifdef UINT64_MAX - MVAL (UINT64_MAX), -#endif - NULL - }; + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'assert.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_assert_h + fi + NEXT_AS_FIRST_DIRECTIVE_ASSERT_H=$gl_next_as_first_directive -int -main () -{ - const char **mv; - for (mv = macro_values; *mv != NULL; mv++) - { - const char *value = *mv; - /* Test whether it looks like a cast expression. */ - if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 - || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 - || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 - || strncmp (value, "((int)"/*)*/, 6) == 0 - || strncmp (value, "((signed short)"/*)*/, 15) == 0 - || strncmp (value, "((signed char)"/*)*/, 14) == 0) - return mv - macro_values + 1; - } - return 0; - ; + ;; #( + *) : + ;; +esac + + + + + + + + case "$GL_GENERATE_ASSERT_H" in + false) ASSERT_H='' ;; + true) + if test -z "$ASSERT_H"; then + ASSERT_H="${gl_source_base_prefix}assert.h" + fi + ;; + *) echo "*** GL_GENERATE_ASSERT_H is not set correctly" 1>&2; exit 1 ;; + esac + + + if $GL_GENERATE_ASSERT_H; then + GL_GENERATE_ASSERT_H_TRUE= + GL_GENERATE_ASSERT_H_FALSE='#' +else + GL_GENERATE_ASSERT_H_TRUE='#' + GL_GENERATE_ASSERT_H_FALSE= +fi +: + if test -z "${GL_GENERATE_ASSERT_H_TRUE}" && test -z "${GL_GENERATE_ASSERT_H_FALSE}"; then + GL_GENERATE_ASSERT_H_TRUE='#' + GL_GENERATE_ASSERT_H_FALSE='#' + fi + + + + + + + + + + + + case "$GL_GENERATE_ERRNO_H" in + false) ERRNO_H='' ;; + true) + if test -z "$ERRNO_H"; then + ERRNO_H="${gl_source_base_prefix}errno.h" + fi + ;; + *) echo "*** GL_GENERATE_ERRNO_H is not set correctly" 1>&2; exit 1 ;; + esac + + + if $GL_GENERATE_ERRNO_H; then + GL_GENERATE_ERRNO_H_TRUE= + GL_GENERATE_ERRNO_H_FALSE='#' +else + GL_GENERATE_ERRNO_H_TRUE='#' + GL_GENERATE_ERRNO_H_FALSE= +fi +: + if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then + GL_GENERATE_ERRNO_H_TRUE='#' + GL_GENERATE_ERRNO_H_FALSE='#' + fi + + + + + + + + + + + GL_GENERATE_FLOAT_H=false + REPLACE_FLOAT_LDBL=0 + case "$host_os" in + aix* | beos* | openbsd* | mirbsd* | irix*) + GL_GENERATE_FLOAT_H=true + ;; + freebsd* | dragonfly*) + case "$host_cpu" in + i[34567]86 ) + GL_GENERATE_FLOAT_H=true + ;; + x86_64 ) + # On x86_64 systems, the C compiler may still be generating + # 32-bit code. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined __LP64__ || defined __x86_64__ || defined __amd64__ + int ok; + #else + error fail + #endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + GL_GENERATE_FLOAT_H=true +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + esac + ;; + linux*) + case "$host_cpu" in + powerpc*) + GL_GENERATE_FLOAT_H=true + ;; + esac + ;; + esac + case "$host_os" in + aix* | freebsd* | dragonfly* | linux*) + if $GL_GENERATE_FLOAT_H; then + REPLACE_FLOAT_LDBL=1 + fi + ;; + esac + + REPLACE_ITOLD=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5 +printf %s "checking whether conversion from 'int' to 'long double' works... " >&6; } +if test ${gl_cv_func_itold_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host" in + sparc*-*-linux*) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined __LP64__ || defined __arch64__ + int ok; + #else + error fail + #endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_func_itold_works="guessing no" +else $as_nop + gl_cv_func_itold_works="guessing yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_itold_works="guessing yes" ;; + *) gl_cv_func_itold_works="guessing yes" ;; + esac + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int i = -1; +volatile long double ld; +int main () +{ + ld += i * 1.0L; + if (ld > 0) + return 1; return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_header_working_stdint_h=yes +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_itold_works=yes +else $as_nop + gl_cv_func_itold_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -12508,630 +18384,439 @@ fi fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5 -$as_echo "$gl_cv_header_working_stdint_h" >&6; } - fi - - HAVE_C99_STDINT_H=0 - HAVE_SYS_BITYPES_H=0 - HAVE_SYS_INTTYPES_H=0 - STDINT_H=stdint.h - case "$gl_cv_header_working_stdint_h" in - *yes) - HAVE_C99_STDINT_H=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h predates C++11" >&5 -$as_echo_n "checking whether stdint.h predates C++11... " >&6; } -if ${gl_cv_header_stdint_predates_cxx11_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - gl_cv_header_stdint_predates_cxx11_h=yes - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5 +printf "%s\n" "$gl_cv_func_itold_works" >&6; } + case "$gl_cv_func_itold_works" in + *no) + REPLACE_ITOLD=1 + GL_GENERATE_FLOAT_H=true + ;; + esac -#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ -#include + if $GL_GENERATE_FLOAT_H; then - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif -intmax_t im = INTMAX_MAX; -int32_t i32 = INT32_C (0x7fffffff); -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_stdint_predates_cxx11_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_predates_cxx11_h" >&5 -$as_echo "$gl_cv_header_stdint_predates_cxx11_h" >&6; } - if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then -$as_echo "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h + if test $gl_cv_have_include_next = yes; then + gl_cv_next_float_h='<'float.h'>' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +printf %s "checking absolute name of ... " >&6; } +if test ${gl_cv_next_float_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop -$as_echo "#define __STDC_LIMIT_MACROS 1" >>confdefs.h - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5 -$as_echo_n "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; } -if ${gl_cv_header_stdint_width+:} false; then : - $as_echo_n "(cached) " >&6 -else - gl_cv_header_stdint_width=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - - /* Work if build is not clean. */ - #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 - #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ - #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 - #endif - #include - - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif - - int iw = UINTMAX_WIDTH; - -int -main () -{ - - ; - return 0; -} +#include _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_stdint_width=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5 -$as_echo "$gl_cv_header_stdint_width" >&6; } - if test "$gl_cv_header_stdint_width" = yes; then - STDINT_H= - fi + case "$host_os" in + aix*) gl_absname_cpp="$ac_cpp -C" ;; + *) gl_absname_cpp="$ac_cpp" ;; + esac + + case "$host_os" in + mingw*) + gl_dirsep_regex='[/\\]' ;; *) - for ac_header in sys/inttypes.h sys/bitypes.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - if test $ac_cv_header_sys_inttypes_h = yes; then - HAVE_SYS_INTTYPES_H=1 - fi - if test $ac_cv_header_sys_bitypes_h = yes; then - HAVE_SYS_BITYPES_H=1 - fi - - - if test $APPLE_UNIVERSAL_BUILD = 0; then + gl_dirsep_regex='\/' + ;; + esac + gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' + gl_header_literal_regex=`echo 'float.h' \ + | sed -e "$gl_make_literal_regex_sed"` + gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ + s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ + s|^/[^/]|//&| + p + q + }' + gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | + sed -n "$gl_absolute_header_sed"` - for gltype in ptrdiff_t size_t ; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 -$as_echo_n "checking for bit size of $gltype... " >&6; } -if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif + gl_header=$gl_cv_absolute_float_h + gl_cv_next_float_h='"'$gl_header'"' -#include "; then : -else - result=unknown fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5 +printf "%s\n" "$gl_cv_next_float_h" >&6; } + fi + NEXT_FLOAT_H=$gl_cv_next_float_h - eval gl_cv_bitsizeof_${gltype}=\$result + if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' + gl_next_as_first_directive='<'float.h'>' + else + # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' + gl_next_as_first_directive=$gl_cv_next_float_h + fi + NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive -fi -eval ac_res=\$gl_cv_bitsizeof_${gltype} - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval result=\$gl_cv_bitsizeof_${gltype} - if test $result = unknown; then - result=0 - fi - GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` - cat >>confdefs.h <<_ACEOF -#define BITSIZEOF_${GLTYPE} $result -_ACEOF - eval BITSIZEOF_${GLTYPE}=\$result - done fi - for gltype in sig_atomic_t wchar_t wint_t ; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 -$as_echo_n "checking for bit size of $gltype... " >&6; } -if eval \${gl_cv_bitsizeof_${gltype}+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif - -#include "; then : - -else - result=unknown -fi - - eval gl_cv_bitsizeof_${gltype}=\$result - -fi -eval ac_res=\$gl_cv_bitsizeof_${gltype} - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval result=\$gl_cv_bitsizeof_${gltype} - if test $result = unknown; then - result=0 - fi - GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` - cat >>confdefs.h <<_ACEOF -#define BITSIZEOF_${GLTYPE} $result -_ACEOF - - eval BITSIZEOF_${GLTYPE}=\$result - done - - for gltype in sig_atomic_t wchar_t wint_t ; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5 -$as_echo_n "checking whether $gltype is signed... " >&6; } -if eval \${gl_cv_type_${gltype}_signed+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif + case "$GL_GENERATE_FLOAT_H" in + false) FLOAT_H='' ;; + true) + if test -z "$FLOAT_H"; then + FLOAT_H="${gl_source_base_prefix}float.h" + fi + ;; + *) echo "*** GL_GENERATE_FLOAT_H is not set correctly" 1>&2; exit 1 ;; + esac - int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - result=yes + if $GL_GENERATE_FLOAT_H; then + GL_GENERATE_FLOAT_H_TRUE= + GL_GENERATE_FLOAT_H_FALSE='#' else - result=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - eval gl_cv_type_${gltype}_signed=\$result - + GL_GENERATE_FLOAT_H_TRUE='#' + GL_GENERATE_FLOAT_H_FALSE= fi -eval ac_res=\$gl_cv_type_${gltype}_signed - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval result=\$gl_cv_type_${gltype}_signed - GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` - if test "$result" = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_SIGNED_${GLTYPE} 1 -_ACEOF - - eval HAVE_SIGNED_${GLTYPE}=1 - else - eval HAVE_SIGNED_${GLTYPE}=0 - fi - done +: + if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then + GL_GENERATE_FLOAT_H_TRUE='#' + GL_GENERATE_FLOAT_H_FALSE='#' + fi - gl_cv_type_ptrdiff_t_signed=yes - gl_cv_type_size_t_signed=no - if test $APPLE_UNIVERSAL_BUILD = 0; then - for gltype in ptrdiff_t size_t ; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 -$as_echo_n "checking for $gltype integer literal suffix... " >&6; } -if eval \${gl_cv_type_${gltype}_suffix+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval gl_cv_type_${gltype}_suffix=no - eval result=\$gl_cv_type_${gltype}_signed - if test "$result" = yes; then - glsufu= - else - glsufu=u - fi - for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do - case $glsuf in - '') gltype1='int';; - l) gltype1='long int';; - ll) gltype1='long long int';; - i64) gltype1='__int64';; - u) gltype1='unsigned int';; - ul) gltype1='unsigned long int';; - ull) gltype1='unsigned long long int';; - ui64)gltype1='unsigned __int64';; - esac - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif - extern $gltype foo; - extern $gltype1 foo; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval gl_cv_type_${gltype}_suffix=\$glsuf + if test $REPLACE_FLOAT_LDBL = 1; then + GL_COND_OBJ_FLOAT_TRUE= + GL_COND_OBJ_FLOAT_FALSE='#' +else + GL_COND_OBJ_FLOAT_TRUE='#' + GL_COND_OBJ_FLOAT_FALSE= fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - eval result=\$gl_cv_type_${gltype}_suffix - test "$result" != no && break - done +: + if test -z "${GL_COND_OBJ_FLOAT_TRUE}" && test -z "${GL_COND_OBJ_FLOAT_FALSE}"; then + GL_COND_OBJ_FLOAT_TRUE='#' + GL_COND_OBJ_FLOAT_FALSE='#' + fi + + + if test $REPLACE_ITOLD = 1; then + GL_COND_OBJ_ITOLD_TRUE= + GL_COND_OBJ_ITOLD_FALSE='#' +else + GL_COND_OBJ_ITOLD_TRUE='#' + GL_COND_OBJ_ITOLD_FALSE= fi -eval ac_res=\$gl_cv_type_${gltype}_suffix - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` - eval result=\$gl_cv_type_${gltype}_suffix - test "$result" = no && result= - eval ${GLTYPE}_SUFFIX=\$result - cat >>confdefs.h <<_ACEOF -#define ${GLTYPE}_SUFFIX $result -_ACEOF +: + if test -z "${GL_COND_OBJ_ITOLD_TRUE}" && test -z "${GL_COND_OBJ_ITOLD_FALSE}"; then + GL_COND_OBJ_ITOLD_TRUE='#' + GL_COND_OBJ_ITOLD_FALSE='#' + fi - done - fi - for gltype in sig_atomic_t wchar_t wint_t ; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 -$as_echo_n "checking for $gltype integer literal suffix... " >&6; } -if eval \${gl_cv_type_${gltype}_suffix+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval gl_cv_type_${gltype}_suffix=no - eval result=\$gl_cv_type_${gltype}_signed - if test "$result" = yes; then - glsufu= - else - glsufu=u - fi - for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do - case $glsuf in - '') gltype1='int';; - l) gltype1='long int';; - ll) gltype1='long long int';; - i64) gltype1='__int64';; - u) gltype1='unsigned int';; - ul) gltype1='unsigned long int';; - ull) gltype1='unsigned long long int';; - ui64)gltype1='unsigned __int64';; - esac - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* BSD/OS 4.0.1 has a bug: , and must be - included before . */ - #include - #include - #if HAVE_WCHAR_H - # include - # include - # include - #endif - extern $gltype foo; - extern $gltype1 foo; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval gl_cv_type_${gltype}_suffix=\$glsuf -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - eval result=\$gl_cv_type_${gltype}_suffix - test "$result" != no && break - done -fi -eval ac_res=\$gl_cv_type_${gltype}_suffix - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` - eval result=\$gl_cv_type_${gltype}_suffix - test "$result" = no && result= - eval ${GLTYPE}_SUFFIX=\$result - cat >>confdefs.h <<_ACEOF -#define ${GLTYPE}_SUFFIX $result -_ACEOF - done - if test $GNULIB_OVERRIDES_WINT_T = 1; then - BITSIZEOF_WINT_T=32 - fi + + + + + gl_cv_func_fprintf_posix=no + case "$gl_cv_func_printf_sizes_c99" in + *yes) + case "$gl_cv_func_printf_long_double" in + *yes) + case "$gl_cv_func_printf_infinite" in + *yes) + case "$gl_cv_func_printf_infinite_long_double" in + *yes) + case "$gl_cv_func_printf_directive_a" in + *yes) + case "$gl_cv_func_printf_directive_f" in + *yes) + case "$gl_cv_func_printf_directive_n" in + *yes) + case "$gl_cv_func_printf_directive_ls" in + *yes) + case "$gl_cv_func_printf_positions" in + *yes) + case "$gl_cv_func_printf_flag_grouping" in + *yes) + case "$gl_cv_func_printf_flag_leftadjust" in + *yes) + case "$gl_cv_func_printf_flag_zero" in + *yes) + case "$gl_cv_func_printf_precision" in + *yes) + case "$gl_cv_func_printf_enomem" in + *yes) + # fprintf exists and is + # already POSIX compliant. + gl_cv_func_fprintf_posix=yes + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + if test $gl_cv_func_fprintf_posix = no; then + + + + case "$gl_cv_func_printf_infinite" in + *yes) + ;; + *) + +printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h ;; esac - LIMITS_H='limits.h' - if test -n "$LIMITS_H"; then - GL_GENERATE_LIMITS_H_TRUE= - GL_GENERATE_LIMITS_H_FALSE='#' -else - GL_GENERATE_LIMITS_H_TRUE='#' - GL_GENERATE_LIMITS_H_FALSE= -fi + case "$gl_cv_func_printf_long_double" in + *yes) + case "$gl_cv_func_printf_infinite_long_double" in + *yes) + ;; + *) +printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h + ;; + esac + ;; + esac + case "$gl_cv_func_printf_directive_a" in + *yes) + ;; + *) - if test -n "$STDINT_H"; then - GL_GENERATE_STDINT_H_TRUE= - GL_GENERATE_STDINT_H_FALSE='#' -else - GL_GENERATE_STDINT_H_TRUE='#' - GL_GENERATE_STDINT_H_FALSE= -fi +printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 -$as_echo_n "checking for C/C++ restrict keyword... " >&6; } -if ${ac_cv_c_restrict+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_restrict=no - # The order here caters to the fact that C++ does not require restrict. - for ac_kw in __restrict __restrict__ _Restrict restrict; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -typedef int *int_ptr; - int foo (int_ptr $ac_kw ip) { return ip[0]; } - int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ - int bar (int ip[$ac_kw]) { return ip[0]; } -int -main () -{ -int s[1]; - int *$ac_kw t = s; - t[0] = 0; - return foo (t) + bar (t); + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo" >&5 +printf %s "checking for nl_langinfo... " >&6; } +if test ${gl_cv_onwards_func_nl_langinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + exec 9>&6 6>/dev/null + + case "$host_os" in + linux*-android*) + ac_fn_check_decl "$LINENO" "nl_langinfo" "ac_cv_have_decl_nl_langinfo" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_nl_langinfo" = xyes +then : - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_restrict=$ac_kw fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_restrict" != no && break - done + if test $ac_cv_have_decl_nl_langinfo = yes; then + ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" +if test "x$ac_cv_func_nl_langinfo" = xyes +then : fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 -$as_echo "$ac_cv_c_restrict" >&6; } - case $ac_cv_c_restrict in - restrict) ;; - no) $as_echo "#define restrict /**/" >>confdefs.h - ;; - *) cat >>confdefs.h <<_ACEOF -#define restrict $ac_cv_c_restrict -_ACEOF - ;; - esac + if test $ac_cv_func_nl_langinfo = yes; then + gl_cv_onwards_func_nl_langinfo=yes + else + gl_cv_onwards_func_nl_langinfo='future OS version' + fi + else + gl_cv_onwards_func_nl_langinfo='future OS version' + fi + ;; + *) + ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" +if test "x$ac_cv_func_nl_langinfo" = xyes +then : +fi + gl_cv_onwards_func_nl_langinfo=$ac_cv_func_nl_langinfo + ;; + esac + exec 6>&9 9>&- +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_onwards_func_nl_langinfo" >&5 +printf "%s\n" "$gl_cv_onwards_func_nl_langinfo" >&6; } + case "$gl_cv_onwards_func_nl_langinfo" in + future*) ac_cv_func_nl_langinfo=no ;; + *) ac_cv_func_nl_langinfo=$gl_cv_onwards_func_nl_langinfo ;; + esac + if test $ac_cv_func_nl_langinfo = yes; then +printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h + fi + ;; + esac + case "$gl_cv_func_printf_directive_f" in + *yes) + ;; + *) - if test $gl_cv_have_include_next = yes; then - gl_cv_next_string_h='<'string.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_string_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h + ;; + esac - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; + + case "$gl_cv_func_printf_directive_ls" in + *yes) + ;; + *) + +printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h + + ;; esac - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' + + + case "$gl_cv_func_printf_flag_grouping" in + *yes) ;; *) - gl_dirsep_regex='\/' + +printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h + + ;; + esac + + + + case "$gl_cv_func_printf_flag_leftadjust" in + *yes) + ;; + *) + +printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h + ;; esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'string.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_string_h - gl_cv_next_string_h='"'$gl_header'"' + case "$gl_cv_func_printf_flag_zero" in + *yes) + ;; + *) -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5 -$as_echo "$gl_cv_next_string_h" >&6; } - fi - NEXT_STRING_H=$gl_cv_next_string_h +printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'string.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_string_h - fi - NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive + ;; + esac + case "$gl_cv_func_printf_precision" in + *yes) + ;; + *) +printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h +printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h +printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h + ;; + esac -ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" -if test "x$ac_cv_type_pid_t" = xyes; then : -else + case "$gl_cv_func_printf_enomem" in + *yes) + ;; + *) -cat >>confdefs.h <<_ACEOF -#define pid_t int -_ACEOF +printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h -fi -ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" -if test "x$ac_cv_type_mode_t" = xyes; then : +printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h -else -cat >>confdefs.h <<_ACEOF -#define mode_t int -_ACEOF +printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h -fi + ;; + esac - WINDOWS_64_BIT_OFF_T=0 -$as_echo "#define _USE_STD_STAT 1" >>confdefs.h + gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" @@ -13140,65 +18825,19 @@ $as_echo "#define _USE_STD_STAT 1" >>confdefs.h - if test $gl_cv_have_include_next = yes; then - gl_cv_next_sys_types_h='<'sys/types.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_sys_types_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'sys/types.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_sys_types_h - gl_cv_next_sys_types_h='"'$gl_header'"' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5 -$as_echo "$gl_cv_next_sys_types_h" >&6; } - fi - NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'sys/types.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_sys_types_h - fi - NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive + + gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" + @@ -13207,11 +18846,14 @@ $as_echo "$gl_cv_next_sys_types_h" >&6; } + gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" + if test $ac_cv_func_vasnprintf = yes; then +printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h + fi - WINDOWS_STAT_INODES=0 @@ -13220,566 +18862,298 @@ $as_echo "$gl_cv_next_sys_types_h" >&6; } + ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = xyes +then : -gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} -i\ -0 -q -' -gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} -i\ -0 -q -' -gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} -i\ -0 -q -' +else $as_nop +printf "%s\n" "#define ptrdiff_t long" >>confdefs.h - if test "$HAVE_LIBUNISTRING" = yes; then - LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` - LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` - LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` - fi -ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" -if test "x$ac_cv_have_decl_vsnprintf" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_VSNPRINTF $ac_have_decl -_ACEOF - - - GNULIB_BTOWC=0; - GNULIB_WCTOB=0; - GNULIB_MBSINIT=0; - GNULIB_MBRTOWC=0; - GNULIB_MBRLEN=0; - GNULIB_MBSRTOWCS=0; - GNULIB_MBSNRTOWCS=0; - GNULIB_WCRTOMB=0; - GNULIB_WCSRTOMBS=0; - GNULIB_WCSNRTOMBS=0; - GNULIB_WCWIDTH=0; - GNULIB_WMEMCHR=0; - GNULIB_WMEMCMP=0; - GNULIB_WMEMCPY=0; - GNULIB_WMEMMOVE=0; - GNULIB_WMEMSET=0; - GNULIB_WCSLEN=0; - GNULIB_WCSNLEN=0; - GNULIB_WCSCPY=0; - GNULIB_WCPCPY=0; - GNULIB_WCSNCPY=0; - GNULIB_WCPNCPY=0; - GNULIB_WCSCAT=0; - GNULIB_WCSNCAT=0; - GNULIB_WCSCMP=0; - GNULIB_WCSNCMP=0; - GNULIB_WCSCASECMP=0; - GNULIB_WCSNCASECMP=0; - GNULIB_WCSCOLL=0; - GNULIB_WCSXFRM=0; - GNULIB_WCSDUP=0; - GNULIB_WCSCHR=0; - GNULIB_WCSRCHR=0; - GNULIB_WCSCSPN=0; - GNULIB_WCSSPN=0; - GNULIB_WCSPBRK=0; - GNULIB_WCSSTR=0; - GNULIB_WCSTOK=0; - GNULIB_WCSWIDTH=0; - GNULIB_WCSFTIME=0; - HAVE_BTOWC=1; - HAVE_MBSINIT=1; - HAVE_MBRTOWC=1; - HAVE_MBRLEN=1; - HAVE_MBSRTOWCS=1; - HAVE_MBSNRTOWCS=1; - HAVE_WCRTOMB=1; - HAVE_WCSRTOMBS=1; - HAVE_WCSNRTOMBS=1; - HAVE_WMEMCHR=1; - HAVE_WMEMCMP=1; - HAVE_WMEMCPY=1; - HAVE_WMEMMOVE=1; - HAVE_WMEMSET=1; - HAVE_WCSLEN=1; - HAVE_WCSNLEN=1; - HAVE_WCSCPY=1; - HAVE_WCPCPY=1; - HAVE_WCSNCPY=1; - HAVE_WCPNCPY=1; - HAVE_WCSCAT=1; - HAVE_WCSNCAT=1; - HAVE_WCSCMP=1; - HAVE_WCSNCMP=1; - HAVE_WCSCASECMP=1; - HAVE_WCSNCASECMP=1; - HAVE_WCSCOLL=1; - HAVE_WCSXFRM=1; - HAVE_WCSDUP=1; - HAVE_WCSCHR=1; - HAVE_WCSRCHR=1; - HAVE_WCSCSPN=1; - HAVE_WCSSPN=1; - HAVE_WCSPBRK=1; - HAVE_WCSSTR=1; - HAVE_WCSTOK=1; - HAVE_WCSWIDTH=1; - HAVE_WCSFTIME=1; - HAVE_DECL_WCTOB=1; - HAVE_DECL_WCWIDTH=1; - REPLACE_MBSTATE_T=0; - REPLACE_BTOWC=0; - REPLACE_WCTOB=0; - REPLACE_MBSINIT=0; - REPLACE_MBRTOWC=0; - REPLACE_MBRLEN=0; - REPLACE_MBSRTOWCS=0; - REPLACE_MBSNRTOWCS=0; - REPLACE_WCRTOMB=0; - REPLACE_WCSRTOMBS=0; - REPLACE_WCSNRTOMBS=0; - REPLACE_WCWIDTH=0; - REPLACE_WCSWIDTH=0; - REPLACE_WCSFTIME=0; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uses 'inline' correctly" >&5 -$as_echo_n "checking whether uses 'inline' correctly... " >&6; } -if ${gl_cv_header_wchar_h_correct_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - gl_cv_header_wchar_h_correct_inline=yes - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - #define wcstod renamed_wcstod -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be - included before . */ -#include -#include -#include -#include -extern int zero (void); -int main () { return zero(); } -_ACEOF - save_ac_compile="$ac_compile" - ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` - if echo '#include "conftest.c"' >conftest1.c && - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - #define wcstod renamed_wcstod -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be - included before . */ -#include -#include -#include -#include -int zero (void) { return 0; } -_ACEOF - ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` - if echo '#include "conftest.c"' >conftest2.c && - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then - : - else - gl_cv_header_wchar_h_correct_inline=no - fi - fi - fi - ac_compile="$save_ac_compile" - rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5 -$as_echo "$gl_cv_header_wchar_h_correct_inline" >&6; } - if test $gl_cv_header_wchar_h_correct_inline = no; then - as_fn_error $? " cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). -This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in -C99 mode. You have four options: - - Add the flag -fgnu89-inline to CC and reconfigure, or - - Fix your include files, using parts of - , or - - Use a gcc version older than 4.3, or - - Don't use the flags -std=c99 or -std=gnu99. -Configuration aborted." "$LINENO" 5 - fi - if test $ac_cv_header_crtdefs_h = yes; then - HAVE_CRTDEFS_H=1 - else - HAVE_CRTDEFS_H=0 - fi - GNULIB_ISWBLANK=0; - GNULIB_WCTYPE=0; - GNULIB_ISWCTYPE=0; - GNULIB_WCTRANS=0; - GNULIB_TOWCTRANS=0; - HAVE_ISWBLANK=1; - HAVE_WCTYPE_T=1; - HAVE_WCTRANS_T=1; - REPLACE_ISWBLANK=0; + gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext" + REPLACE_FPRINTF=1 +printf "%s\n" "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h + : + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - if false; then - GL_COND_LIBTOOL_TRUE= - GL_COND_LIBTOOL_FALSE='#' -else - GL_COND_LIBTOOL_TRUE='#' - GL_COND_LIBTOOL_FALSE= -fi - gl_cond_libtool=false - gl_libdeps= - gl_ltlibdeps= - gl_m4_base='gnulib_m4' + GL_GNULIB_FPRINTF_POSIX=1 +printf "%s\n" "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h - gl_source_base='lib' - if test $ac_cv_func_alloca_works = no; then - : - fi - # Define an additional variable used in the Makefile substitution. - if test $ac_cv_working_alloca_h = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5 -$as_echo_n "checking for alloca as a compiler built-in... " >&6; } -if ${gl_cv_rpl_alloca+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5 +printf %s "checking whether free is known to preserve errno... " >&6; } +if test ${gl_cv_func_free_preserves_errno+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include -#if defined __GNUC__ || defined _AIX || defined _MSC_VER - Need own alloca -#endif +int +main (void) +{ +#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__) + #elif defined __OpenBSD__ + #elif defined __sun + #else + #error "'free' is not known to preserve errno" + #endif + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Need own alloca" >/dev/null 2>&1; then : - gl_cv_rpl_alloca=yes -else - gl_cv_rpl_alloca=no +if ac_fn_c_try_compile "$LINENO" +then : + gl_cv_func_free_preserves_errno=yes +else $as_nop + gl_cv_func_free_preserves_errno=no fi -rm -f conftest* - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5 -$as_echo "$gl_cv_rpl_alloca" >&6; } - if test $gl_cv_rpl_alloca = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5 +printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; } -$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + case $gl_cv_func_free_preserves_errno in + *yes) - ALLOCA_H=alloca.h - else - ALLOCA_H= - fi - else - ALLOCA_H=alloca.h - fi +printf "%s\n" "#define HAVE_FREE_POSIX 1" >>confdefs.h - if test -n "$ALLOCA_H"; then - GL_GENERATE_ALLOCA_H_TRUE= - GL_GENERATE_ALLOCA_H_FALSE='#' + ;; + *) REPLACE_FREE=1 ;; + esac + + + if test $REPLACE_FREE = 1; then + GL_COND_OBJ_FREE_TRUE= + GL_COND_OBJ_FREE_FALSE='#' else - GL_GENERATE_ALLOCA_H_TRUE='#' - GL_GENERATE_ALLOCA_H_FALSE= + GL_COND_OBJ_FREE_TRUE='#' + GL_COND_OBJ_FREE_FALSE= fi +: + if test -z "${GL_COND_OBJ_FREE_TRUE}" && test -z "${GL_COND_OBJ_FREE_FALSE}"; then + GL_COND_OBJ_FREE_TRUE='#' + GL_COND_OBJ_FREE_FALSE='#' + fi + if test -z "$GL_COND_OBJ_FREE_TRUE"; then : + : +fi - FLOAT_H= - REPLACE_FLOAT_LDBL=0 - case "$host_os" in - aix* | beos* | openbsd* | mirbsd* | irix*) - FLOAT_H=float.h - ;; - freebsd* | dragonfly*) - case "$host_cpu" in - i[34567]86 ) - FLOAT_H=float.h - ;; - x86_64 ) - # On x86_64 systems, the C compiler may still be generating - # 32-bit code. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __LP64__ || defined __x86_64__ || defined __amd64__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : -else - FLOAT_H=float.h -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - esac - ;; - linux*) - case "$host_cpu" in - powerpc*) - FLOAT_H=float.h - ;; - esac - ;; - esac - case "$host_os" in - aix* | freebsd* | dragonfly* | linux*) - if test -n "$FLOAT_H"; then - REPLACE_FLOAT_LDBL=1 - fi - ;; - esac - REPLACE_ITOLD=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5 -$as_echo_n "checking whether conversion from 'int' to 'long double' works... " >&6; } -if ${gl_cv_func_itold_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host" in - sparc*-*-linux*) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined __LP64__ || defined __arch64__ - int ok; - #else - error fail - #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_func_itold_works="guessing no" -else - gl_cv_func_itold_works="guessing yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - # Guess yes on native Windows. - mingw*) gl_cv_func_itold_works="guessing yes" ;; - *) gl_cv_func_itold_works="guessing yes" ;; - esac + GL_GNULIB_FREE_POSIX=1 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int i = -1; -volatile long double ld; -int main () -{ - ld += i * 1.0L; - if (ld > 0) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_itold_works=yes -else - gl_cv_func_itold_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5 -$as_echo "$gl_cv_func_itold_works" >&6; } - case "$gl_cv_func_itold_works" in - *no) - REPLACE_ITOLD=1 - FLOAT_H=float.h - ;; - esac - if test -n "$FLOAT_H"; then +printf "%s\n" "#define GNULIB_TEST_FREE_POSIX 1" >>confdefs.h + if test $gl_cv_func_frexp_no_libm = yes; then - if test $gl_cv_have_include_next = yes; then - gl_cv_next_float_h='<'float.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_float_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 +printf %s "checking whether frexp works... " >&6; } +if test ${gl_cv_func_frexp_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + case "$host_os" in + netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; + mingw*) # Guess yes with MSVC, no with mingw. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _MSC_VER + Good +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Good" >/dev/null 2>&1 +then : + gl_cv_func_frexp_works="guessing yes" +else $as_nop + gl_cv_func_frexp_works="guessing no" +fi +rm -rf conftest* + ;; + *) gl_cv_func_frexp_works="guessing yes" ;; + esac +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #include +#include +#include +#if HAVE_DECL_ALARM +# include +# include +#endif +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. + ICC 10.0 has a bug when optimizing the expression -zero. + The expression -DBL_MIN * DBL_MIN does not work when cross-compiling + to PowerPC on Mac OS X 10.5. */ +#if defined __hpux || defined __sgi || defined __ICC +static double +compute_minus_zero (void) +{ + return -DBL_MIN * DBL_MIN; +} +# define minus_zero compute_minus_zero () +#else +double minus_zero = -0.0; +#endif +int main() +{ + int result = 0; + int i; + volatile double x; + double zero = 0.0; +#if HAVE_DECL_ALARM + /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite + number. Let the test fail in this case. */ + signal (SIGALRM, SIG_DFL); + alarm (5); +#endif + /* Test on denormalized numbers. */ + for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) + ; + if (x > 0.0) + { + int exp; + double y = frexp (x, &exp); + /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. + On NetBSD: y = 0.75. Correct: y = 0.5. */ + if (y != 0.5) + result |= 1; + } + /* Test on infinite numbers. */ + x = 1.0 / zero; + { + int exp; + double y = frexp (x, &exp); + if (y != x) + result |= 2; + } + /* Test on negative zero. */ + x = minus_zero; + { + int exp; + double y = frexp (x, &exp); + if (memcmp (&y, &x, sizeof x)) + result |= 4; + } + return result; +} _ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_frexp_works=yes +else $as_nop + gl_cv_func_frexp_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'float.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 +printf "%s\n" "$gl_cv_func_frexp_works" >&6; } + + case "$gl_cv_func_frexp_works" in + *yes) gl_func_frexp_no_libm=yes ;; + *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;; + esac + else + gl_func_frexp_no_libm=no + REPLACE_FREXP=1 + fi + if test $gl_func_frexp_no_libm = yes; then + +printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h - gl_header=$gl_cv_absolute_float_h - gl_cv_next_float_h='"'$gl_header'"' + fi + if test $gl_func_frexp_no_libm != yes; then -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5 -$as_echo "$gl_cv_next_float_h" >&6; } - fi - NEXT_FLOAT_H=$gl_cv_next_float_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'float.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_float_h - fi - NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive - fi - if test -n "$FLOAT_H"; then - GL_GENERATE_FLOAT_H_TRUE= - GL_GENERATE_FLOAT_H_FALSE='#' -else - GL_GENERATE_FLOAT_H_TRUE='#' - GL_GENERATE_FLOAT_H_FALSE= -fi + gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext" + fi - if test $REPLACE_FLOAT_LDBL = 1; then @@ -13788,294 +19162,556 @@ fi - gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext" + GL_GNULIB_FREXP=1 - fi - if test $REPLACE_ITOLD = 1; then +printf "%s\n" "#define GNULIB_TEST_FREXP 1" >>confdefs.h - gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext" - fi + ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_frexpl" = xyes +then : +else $as_nop + HAVE_DECL_FREXPL=0 +fi + if test $HAVE_DECL_FREXPL = 1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 +printf %s "checking whether frexpl() can be used without linking with libm... " >&6; } +if test ${gl_cv_func_frexpl_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + long double x; +int +main (void) +{ +int e; return frexpl (x, &e) > 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_frexpl_no_libm=yes +else $as_nop + gl_cv_func_frexpl_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 +printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; } + if test $gl_cv_func_frexpl_no_libm = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 +printf %s "checking whether frexpl works... " >&6; } +if test ${gl_cv_func_frexpl_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in + aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) + gl_cv_func_frexpl_works="guessing no";; + *) gl_cv_func_frexpl_works="guessing yes";; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +/* Override the values of , like done in float.in.h. */ +#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP (-16381) +#endif +#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP (-16381) +#endif +#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +#endif +#if defined __sgi && (LDBL_MANT_DIG >= 106) +# if defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +# endif +#endif +extern +#ifdef __cplusplus +"C" +#endif +long double frexpl (long double, int *); +long double zero = 0.0L; +int main() +{ + int result = 0; + volatile long double x; + /* Test on finite numbers that fails on AIX 5.1. */ + x = 16.0L; + { + int exp = -9999; + frexpl (x, &exp); + if (exp != 5) + result |= 1; + } + /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl + function returns an invalid (incorrectly normalized) value: it returns + y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } + but the correct result is + 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ + x = 1.01L; + { + int exp = -9999; + long double y = frexpl (x, &exp); + if (!(exp == 1 && y == 0.505L)) + result |= 2; + } + /* Test on large finite numbers. This fails on BeOS at i = 16322, while + LDBL_MAX_EXP = 16384. + In the loop end test, we test x against Infinity, rather than comparing + i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ + { + int i; + for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) + { + int exp = -9999; + frexpl (x, &exp); + if (exp != i) + { + result |= 4; + break; + } + } + } + /* Test on denormalized numbers. */ + { + int i; + for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) + ; + if (x > 0.0L) + { + int exp; + long double y = frexpl (x, &exp); + /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, + exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ + if (exp != LDBL_MIN_EXP - 1) + result |= 8; + } + } + /* Test on infinite numbers. */ + /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0. */ + x = 1.0L / zero; + { + int exp; + long double y = frexpl (x, &exp); + if (y != x) + result |= 16; + } + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_frexpl_works=yes +else $as_nop + gl_cv_func_frexpl_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 +printf "%s\n" "$gl_cv_func_frexpl_works" >&6; } - gl_cv_func_fprintf_posix=no - case "$gl_cv_func_printf_sizes_c99" in - *yes) - case "$gl_cv_func_printf_long_double" in - *yes) - case "$gl_cv_func_printf_infinite" in - *yes) - case "$gl_cv_func_printf_infinite_long_double" in - *yes) - case "$gl_cv_func_printf_directive_a" in - *yes) - case "$gl_cv_func_printf_directive_f" in - *yes) - case "$gl_cv_func_printf_directive_n" in - *yes) - case "$gl_cv_func_printf_directive_ls" in - *yes) - case "$gl_cv_func_printf_positions" in - *yes) - case "$gl_cv_func_printf_flag_grouping" in - *yes) - case "$gl_cv_func_printf_flag_leftadjust" in - *yes) - case "$gl_cv_func_printf_flag_zero" in - *yes) - case "$gl_cv_func_printf_precision" in - *yes) - case "$gl_cv_func_printf_enomem" in - *yes) - # fprintf exists and is - # already POSIX compliant. - gl_cv_func_fprintf_posix=yes - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; + case "$gl_cv_func_frexpl_works" in + *yes) gl_func_frexpl_no_libm=yes ;; + *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; esac - ;; - esac - if test $gl_cv_func_fprintf_posix = no; then + else + gl_func_frexpl_no_libm=no + REPLACE_FREXPL=1 + fi + if test $gl_func_frexpl_no_libm = yes; then +printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h + fi + fi - case "$gl_cv_func_printf_infinite" in - *yes) - ;; - *) + if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then -$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h - ;; - esac - case "$gl_cv_func_printf_long_double" in - *yes) - case "$gl_cv_func_printf_infinite_long_double" in - *yes) - ;; - *) -$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h - ;; - esac - ;; - esac + gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext" + fi - case "$gl_cv_func_printf_directive_a" in - *yes) - ;; - *) -$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h - for ac_func in nl_langinfo -do : - ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" -if test "x$ac_cv_func_nl_langinfo" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NL_LANGINFO 1 -_ACEOF -fi -done - ;; - esac - case "$gl_cv_func_printf_directive_f" in - *yes) - ;; - *) + GL_GNULIB_FREXPL=1 -$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h - ;; - esac - case "$gl_cv_func_printf_directive_ls" in - *yes) - ;; - *) +printf "%s\n" "#define GNULIB_TEST_FREXPL 1" >>confdefs.h -$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h - ;; - esac - case "$gl_cv_func_printf_flag_grouping" in - *yes) - ;; - *) -$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __fseterr" >&5 +printf %s "checking for __fseterr... " >&6; } +if test ${gl_cv_onwards_func___fseterr+y} +then : + printf %s "(cached) " >&6 +else $as_nop - ;; - esac + exec 9>&6 6>/dev/null + case "$host_os" in + linux*-android*) + ac_fn_check_decl "$LINENO" "__fseterr" "ac_cv_have_decl___fseterr" "#include + #include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl___fseterr" = xyes +then : - case "$gl_cv_func_printf_flag_leftadjust" in - *yes) - ;; - *) +fi + if test $ac_cv_have_decl___fseterr = yes; then + ac_fn_c_check_func "$LINENO" "__fseterr" "ac_cv_func___fseterr" +if test "x$ac_cv_func___fseterr" = xyes +then : -$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h +fi - ;; - esac + if test $ac_cv_func___fseterr = yes; then + gl_cv_onwards_func___fseterr=yes + else + gl_cv_onwards_func___fseterr='future OS version' + fi + else + gl_cv_onwards_func___fseterr='future OS version' + fi + ;; + *) + ac_fn_c_check_func "$LINENO" "__fseterr" "ac_cv_func___fseterr" +if test "x$ac_cv_func___fseterr" = xyes +then : +fi + gl_cv_onwards_func___fseterr=$ac_cv_func___fseterr + ;; + esac - case "$gl_cv_func_printf_flag_zero" in - *yes) - ;; - *) + exec 6>&9 9>&- -$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h - ;; +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_onwards_func___fseterr" >&5 +printf "%s\n" "$gl_cv_onwards_func___fseterr" >&6; } + case "$gl_cv_onwards_func___fseterr" in + future*) ac_cv_func___fseterr=no ;; + *) ac_cv_func___fseterr=$gl_cv_onwards_func___fseterr ;; esac + if test $ac_cv_func___fseterr = yes; then +printf "%s\n" "#define HAVE___FSETERR 1" >>confdefs.h + fi - case "$gl_cv_func_printf_precision" in - *yes) - ;; - *) - -$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h -$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h + if test $ac_cv_func___fseterr = no; then + GL_COND_OBJ_FSETERR_TRUE= + GL_COND_OBJ_FSETERR_FALSE='#' +else + GL_COND_OBJ_FSETERR_TRUE='#' + GL_COND_OBJ_FSETERR_FALSE= +fi +: + if test -z "${GL_COND_OBJ_FSETERR_TRUE}" && test -z "${GL_COND_OBJ_FSETERR_FALSE}"; then + GL_COND_OBJ_FSETERR_TRUE='#' + GL_COND_OBJ_FSETERR_FALSE='#' + fi -$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h - ;; - esac - case "$gl_cv_func_printf_enomem" in - *yes) - ;; - *) -$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h -$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h -$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5 +printf %s "checking whether isnan(double) can be used without linking with libm... " >&6; } +if test ${gl_cv_func_isnand_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - ;; - esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #if (__GNUC__ >= 4) || (__clang_major__ >= 4) + # undef isnand + # define isnand(x) __builtin_isnan ((double)(x)) + #else + # undef isnand + # define isnand(x) isnan ((double)(x)) + #endif + double x; +int +main (void) +{ +return isnand (x); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_isnand_no_libm=yes +else $as_nop + gl_cv_func_isnand_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5 +printf "%s\n" "$gl_cv_func_isnand_no_libm" >&6; } + gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm + if test $gl_cv_func_isnand_no_libm = yes; then +printf "%s\n" "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h + fi + if test $gl_func_isnand_no_libm != yes; then - gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" + gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext" + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5 +printf %s "checking whether isnan(float) can be used without linking with libm... " >&6; } +if test ${gl_cv_func_isnanf_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #if (__GNUC__ >= 4) || (__clang_major__ >= 4) + # undef isnanf + # define isnanf(x) __builtin_isnan ((float)(x)) + #elif defined isnan + # undef isnanf + # define isnanf(x) isnan ((float)(x)) + #endif + float x; +int +main (void) +{ +return isnanf (x); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_isnanf_no_libm=yes +else $as_nop + gl_cv_func_isnanf_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5 +printf "%s\n" "$gl_cv_func_isnanf_no_libm" >&6; } + if test $gl_cv_func_isnanf_no_libm = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5 +printf %s "checking whether isnan(float) works... " >&6; } +if test ${gl_cv_func_isnanf_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in + irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; + mingw*) # Guess yes on mingw, no on MSVC. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __MINGW32__ + Known +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_isnanf_works="guessing yes" +else $as_nop + gl_cv_func_isnanf_works="guessing no" +fi +rm -rf conftest* - gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" + ;; + *) gl_cv_func_isnanf_works="guessing yes" ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if (__GNUC__ >= 4) || (__clang_major__ >= 4) +# undef isnanf +# define isnanf(x) __builtin_isnan ((float)(x)) +#elif defined isnan +# undef isnanf +# define isnanf(x) isnan ((float)(x)) +#endif +/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ +#ifdef __DECC +static float +NaN () +{ + static float zero = 0.0f; + return zero / zero; +} +#else +# define NaN() (0.0f / 0.0f) +#endif +#define NWORDS \ + ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { unsigned int word[NWORDS]; float value; } memory_float; +int main() +{ + int result = 0; + if (isnanf (1.0f / 0.0f)) + result |= 1; + if (!isnanf (NaN ())) + result |= 2; +#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT + /* The isnanf function should be immune against changes in the sign bit and + in the mantissa bits. The xor operation twiddles a bit that can only be + a sign bit or a mantissa bit. */ + if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) + { + memory_float m; + m.value = NaN (); + /* Set the bits below the exponent to 01111...111. */ + m.word[0] &= -1U << FLT_EXPBIT0_BIT; + m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1; + if (!isnanf (m.value)) + result |= 4; + } +#endif + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_isnanf_works=yes +else $as_nop + gl_cv_func_isnanf_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi - gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5 +printf "%s\n" "$gl_cv_func_isnanf_works" >&6; } - if test $ac_cv_func_vasnprintf = yes; then + fi + if test $gl_cv_func_isnanf_no_libm = yes \ + && { case "$gl_cv_func_isnanf_works" in + *yes) true;; + *) false;; + esac + }; then + gl_func_isnanf_no_libm=yes -$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h +printf "%s\n" "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h + else + gl_func_isnanf_no_libm=no fi + if test $gl_func_isnanf_no_libm != yes; then @@ -14084,168 +19720,317 @@ $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h + gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext" - ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" -if test "x$ac_cv_type_ptrdiff_t" = xyes; then : -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 +printf %s "checking where to find the exponent in a 'float'... " >&6; } +if test ${gl_cv_cc_float_expbit0+y} +then : + printf %s "(cached) " >&6 +else $as_nop -$as_echo "#define ptrdiff_t long" >>confdefs.h + if test "$cross_compiling" = yes +then : + gl_cv_cc_float_expbit0="word 0 bit 23" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#define NWORDS \ + ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { float value; unsigned int word[NWORDS]; } memory_float; +static unsigned int ored_words[NWORDS]; +static unsigned int anded_words[NWORDS]; +static void add_to_ored_words (float x) +{ + memory_float m; + size_t i; + /* Clear it first, in case + sizeof (float) < sizeof (memory_float). */ + memset (&m, 0, sizeof (memory_float)); + m.value = x; + for (i = 0; i < NWORDS; i++) + { + ored_words[i] |= m.word[i]; + anded_words[i] &= m.word[i]; + } +} +int main () +{ + size_t j; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + for (j = 0; j < NWORDS; j++) + anded_words[j] = ~ (unsigned int) 0; + add_to_ored_words (0.25f); + add_to_ored_words (0.5f); + add_to_ored_words (1.0f); + add_to_ored_words (2.0f); + add_to_ored_words (4.0f); + /* Remove bits that are common (e.g. if representation of the first mantissa + bit is explicit). */ + for (j = 0; j < NWORDS; j++) + ored_words[j] &= ~anded_words[j]; + /* Now find the nonzero word. */ + for (j = 0; j < NWORDS; j++) + if (ored_words[j] != 0) + break; + if (j < NWORDS) + { + size_t i; + for (i = j + 1; i < NWORDS; i++) + if (ored_words[i] != 0) + { + fprintf (fp, "unknown"); + return (fclose (fp) != 0); + } + for (i = 0; ; i++) + if ((ored_words[j] >> i) & 1) + { + fprintf (fp, "word %d bit %d", (int) j, (int) i); + return (fclose (fp) != 0); + } + } + fprintf (fp, "unknown"); + return (fclose (fp) != 0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_float_expbit0=`cat conftest.out` +else $as_nop + gl_cv_cc_float_expbit0="unknown" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi + rm -f conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 +printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; } + case "$gl_cv_cc_float_expbit0" in + word*bit*) + word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` +printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h +printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h + ;; + esac - - - - - - - - - - gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext" - - REPLACE_FPRINTF=1 - -$as_echo "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h - - : - fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5 +printf %s "checking whether isnan(long double) can be used without linking with libm... " >&6; } +if test ${gl_cv_func_isnanl_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #if (__GNUC__ >= 4) || (__clang_major__ >= 4) + # undef isnanl + # define isnanl(x) __builtin_isnan ((long double)(x)) + #elif defined isnan + # undef isnanl + # define isnanl(x) isnan ((long double)(x)) + #endif + long double x; +int +main (void) +{ +return isnanl (x); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_isnanl_no_libm=yes +else $as_nop + gl_cv_func_isnanl_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5 +printf "%s\n" "$gl_cv_func_isnanl_no_libm" >&6; } + gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm + if test $gl_func_isnanl_no_libm = yes; then - GNULIB_FPRINTF_POSIX=1 - - - - - -$as_echo "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h - - - - - - - if test $gl_cv_func_frexp_no_libm = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 -$as_echo_n "checking whether frexp works... " >&6; } -if ${gl_cv_func_frexp_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5 +printf %s "checking whether isnanl works... " >&6; } +if test ${gl_cv_func_isnanl_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case "$host_os" in - netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; - mingw*) # Guess yes with MSVC, no with mingw. + mingw*) # Guess yes on mingw, no on MSVC. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef _MSC_VER - Good +#ifdef __MINGW32__ + Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Good" >/dev/null 2>&1; then : - gl_cv_func_frexp_works="guessing yes" -else - gl_cv_func_frexp_works="guessing no" + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_func_isnanl_works="guessing yes" +else $as_nop + gl_cv_func_isnanl_works="guessing no" fi -rm -f conftest* +rm -rf conftest* ;; - *) gl_cv_func_frexp_works="guessing yes" ;; + *) gl_cv_func_isnanl_works="guessing yes" ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #include -#include -#if HAVE_DECL_ALARM -# include -# include +#if (__GNUC__ >= 4) || (__clang_major__ >= 4) +# undef isnanl +# define isnanl(x) __builtin_isnan ((long double)(x)) +#elif defined isnan +# undef isnanl +# define isnanl(x) isnan ((long double)(x)) #endif -/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. - ICC 10.0 has a bug when optimizing the expression -zero. - The expression -DBL_MIN * DBL_MIN does not work when cross-compiling - to PowerPC on Mac OS X 10.5. */ -#if defined __hpux || defined __sgi || defined __ICC -static double -compute_minus_zero (void) +#define NWORDS \ + ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { unsigned int word[NWORDS]; long double value; } + memory_long_double; +/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the + runtime type conversion. */ +#ifdef __sgi +static long double NaNl () { - return -DBL_MIN * DBL_MIN; + double zero = 0.0; + return zero / zero; } -# define minus_zero compute_minus_zero () #else -double minus_zero = -0.0; +# define NaNl() (0.0L / 0.0L) #endif -int main() +int main () { int result = 0; - int i; - volatile double x; - double zero = 0.0; -#if HAVE_DECL_ALARM - /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite - number. Let the test fail in this case. */ - signal (SIGALRM, SIG_DFL); - alarm (5); -#endif - /* Test on denormalized numbers. */ - for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) - ; - if (x > 0.0) - { - int exp; - double y = frexp (x, &exp); - /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. - On NetBSD: y = 0.75. Correct: y = 0.5. */ - if (y != 0.5) - result |= 1; - } - /* Test on infinite numbers. */ - x = 1.0 / zero; + + if (!isnanl (NaNl ())) + result |= 1; + { - int exp; - double y = frexp (x, &exp); - if (y != x) + memory_long_double m; + unsigned int i; + + /* The isnanl function should be immune against changes in the sign bit and + in the mantissa bits. The xor operation twiddles a bit that can only be + a sign bit or a mantissa bit (since the exponent never extends to + bit 31). */ + m.value = NaNl (); + m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); + for (i = 0; i < NWORDS; i++) + m.word[i] |= 1; + if (!isnanl (m.value)) + result |= 1; + } + +#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE +/* Representation of an 80-bit 'long double' as an initializer for a sequence + of 'unsigned int' words. */ +# ifdef WORDS_BIGENDIAN +# define LDBL80_WORDS(exponent,manthi,mantlo) \ + { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ + ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ + (unsigned int) (mantlo) << 16 \ + } +# else +# define LDBL80_WORDS(exponent,manthi,mantlo) \ + { mantlo, manthi, exponent } +# endif + { /* Quiet NaN. */ + static memory_long_double x = + { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; + if (!isnanl (x.value)) result |= 2; } - /* Test on negative zero. */ - x = minus_zero; { - int exp; - double y = frexp (x, &exp); - if (memcmp (&y, &x, sizeof x)) + /* Signalling NaN. */ + static memory_long_double x = + { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; + if (!isnanl (x.value)) + result |= 2; + } + /* isnanl should return something even for noncanonical values. */ + { /* Pseudo-NaN. */ + static memory_long_double x = + { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; + if (isnanl (x.value) && !isnanl (x.value)) result |= 4; } + { /* Pseudo-Infinity. */ + static memory_long_double x = + { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; + if (isnanl (x.value) && !isnanl (x.value)) + result |= 8; + } + { /* Pseudo-Zero. */ + static memory_long_double x = + { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; + if (isnanl (x.value) && !isnanl (x.value)) + result |= 16; + } + { /* Unnormalized number. */ + static memory_long_double x = + { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; + if (isnanl (x.value) && !isnanl (x.value)) + result |= 32; + } + { /* Pseudo-Denormal. */ + static memory_long_double x = + { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; + if (isnanl (x.value) && !isnanl (x.value)) + result |= 64; + } +#endif + return result; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_frexp_works=yes -else - gl_cv_func_frexp_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_isnanl_works=yes +else $as_nop + gl_cv_func_isnanl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -14253,246 +20038,178 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 -$as_echo "$gl_cv_func_frexp_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5 +printf "%s\n" "$gl_cv_func_isnanl_works" >&6; } - case "$gl_cv_func_frexp_works" in - *yes) gl_func_frexp_no_libm=yes ;; - *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;; + case "$gl_cv_func_isnanl_works" in + *yes) ;; + *) gl_func_isnanl_no_libm=no ;; esac - else - gl_func_frexp_no_libm=no - REPLACE_FREXP=1 - fi - if test $gl_func_frexp_no_libm = yes; then - -$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h - fi + if test $gl_func_isnanl_no_libm = yes; then - if test $gl_func_frexp_no_libm != yes; then - - - - - - - - - gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext" +printf "%s\n" "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h fi + if test $gl_func_isnanl_no_libm != yes; then - GNULIB_FREXP=1 - - - - - -$as_echo "#define GNULIB_TEST_FREXP 1" >>confdefs.h + gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext" - ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include -" -if test "x$ac_cv_have_decl_frexpl" = xyes; then : -else - HAVE_DECL_FREXPL=0 -fi - if test $HAVE_DECL_FREXPL = 1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5 +printf %s "checking where to find the exponent in a 'long double'... " >&6; } +if test ${gl_cv_cc_long_double_expbit0+y} +then : + printf %s "(cached) " >&6 +else $as_nop - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 -$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; } -if ${gl_cv_func_frexpl_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test "$cross_compiling" = yes +then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + gl_cv_cc_long_double_expbit0="unknown" + case "$host_os" in + mingw*) # On native Windows (little-endian), we know the result + # in two cases: mingw, MSVC. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - long double x; -int -main () -{ -int e; return frexpl (x, &e) > 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_frexpl_no_libm=yes -else - gl_cv_func_frexpl_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 -$as_echo "$gl_cv_func_frexpl_no_libm" >&6; } +#ifdef __MINGW32__ + Known +#endif - if test $gl_cv_func_frexpl_no_libm = yes; then +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_cc_long_double_expbit0="word 2 bit 0" +fi +rm -rf conftest* + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 -$as_echo_n "checking whether frexpl works... " >&6; } -if ${gl_cv_func_frexpl_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +#ifdef _MSC_VER + Known +#endif - if test "$cross_compiling" = yes; then : +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Known" >/dev/null 2>&1 +then : + gl_cv_cc_long_double_expbit0="word 1 bit 20" +fi +rm -rf conftest* - case "$host_os" in - aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) - gl_cv_func_frexpl_works="guessing no";; - *) gl_cv_func_frexpl_works="guessing yes";; - esac + ;; + esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -#include -/* Override the values of , like done in float.in.h. */ -#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP (-16381) -#endif -#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP (-16381) -#endif -#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP DBL_MIN_EXP -#endif -#if defined __sgi && (LDBL_MANT_DIG >= 106) -# if defined __GNUC__ -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP DBL_MIN_EXP -# endif -#endif -extern -#ifdef __cplusplus -"C" -#endif -long double frexpl (long double, int *); -int main() +#include +#include +#include +#define NWORDS \ + ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { long double value; unsigned int word[NWORDS]; } + memory_long_double; +static unsigned int ored_words[NWORDS]; +static unsigned int anded_words[NWORDS]; +static void add_to_ored_words (long double *x) { - int result = 0; - volatile long double x; - /* Test on finite numbers that fails on AIX 5.1. */ - x = 16.0L; - { - int exp = -9999; - frexpl (x, &exp); - if (exp != 5) - result |= 1; - } - /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl - function returns an invalid (incorrectly normalized) value: it returns - y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } - but the correct result is - 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ - x = 1.01L; - { - int exp = -9999; - long double y = frexpl (x, &exp); - if (!(exp == 1 && y == 0.505L)) - result |= 2; - } - /* Test on large finite numbers. This fails on BeOS at i = 16322, while - LDBL_MAX_EXP = 16384. - In the loop end test, we test x against Infinity, rather than comparing - i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ - { - int i; - for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) - { - int exp = -9999; - frexpl (x, &exp); - if (exp != i) + memory_long_double m; + size_t i; + /* Clear it first, in case + sizeof (long double) < sizeof (memory_long_double). */ + memset (&m, 0, sizeof (memory_long_double)); + m.value = *x; + for (i = 0; i < NWORDS; i++) + { + ored_words[i] |= m.word[i]; + anded_words[i] &= m.word[i]; + } +} +int main () +{ + static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L }; + size_t j; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + for (j = 0; j < NWORDS; j++) + anded_words[j] = ~ (unsigned int) 0; + for (j = 0; j < 5; j++) + add_to_ored_words (&samples[j]); + /* Remove bits that are common (e.g. if representation of the first mantissa + bit is explicit). */ + for (j = 0; j < NWORDS; j++) + ored_words[j] &= ~anded_words[j]; + /* Now find the nonzero word. */ + for (j = 0; j < NWORDS; j++) + if (ored_words[j] != 0) + break; + if (j < NWORDS) + { + size_t i; + for (i = j + 1; i < NWORDS; i++) + if (ored_words[i] != 0) { - result |= 4; - break; + fprintf (fp, "unknown"); + return (fclose (fp) != 0); } - } - } - /* Test on denormalized numbers. */ - { - int i; - for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) - ; - if (x > 0.0L) - { - int exp; - long double y = frexpl (x, &exp); - /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, - exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ - if (exp != LDBL_MIN_EXP - 1) - result |= 8; - } - } - /* Test on infinite numbers. */ - x = 1.0L / 0.0L; - { - int exp; - long double y = frexpl (x, &exp); - if (y != x) - result |= 16; - } - return result; + for (i = 0; ; i++) + if ((ored_words[j] >> i) & 1) + { + fprintf (fp, "word %d bit %d", (int) j, (int) i); + return (fclose (fp) != 0); + } + } + fprintf (fp, "unknown"); + return (fclose (fp) != 0); } + _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_frexpl_works=yes -else - gl_cv_func_frexpl_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_long_double_expbit0=`cat conftest.out` +else $as_nop + gl_cv_cc_long_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi + rm -f conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 -$as_echo "$gl_cv_func_frexpl_works" >&6; } - - case "$gl_cv_func_frexpl_works" in - *yes) gl_func_frexpl_no_libm=yes ;; - *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; - esac - else - gl_func_frexpl_no_libm=no - REPLACE_FREXPL=1 - fi - if test $gl_func_frexpl_no_libm = yes; then - -$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h - - fi - fi - - if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then - - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5 +printf "%s\n" "$gl_cv_cc_long_double_expbit0" >&6; } + case "$gl_cv_cc_long_double_expbit0" in + word*bit*) + word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'` +printf "%s\n" "#define LDBL_EXPBIT0_WORD $word" >>confdefs.h +printf "%s\n" "#define LDBL_EXPBIT0_BIT $bit" >>confdefs.h + ;; + esac - gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext" fi @@ -14500,20 +20217,36 @@ $as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h - GNULIB_FREXPL=1 - - + case "$GL_GENERATE_LIMITS_H" in + false) LIMITS_H='' ;; + true) + if test -z "$LIMITS_H"; then + LIMITS_H="${gl_source_base_prefix}limits.h" + fi + ;; + *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;; + esac + if $GL_GENERATE_LIMITS_H; then + GL_GENERATE_LIMITS_H_TRUE= + GL_GENERATE_LIMITS_H_FALSE='#' +else + GL_GENERATE_LIMITS_H_TRUE='#' + GL_GENERATE_LIMITS_H_FALSE= +fi +: + if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then + GL_GENERATE_LIMITS_H_TRUE='#' + GL_GENERATE_LIMITS_H_FALSE='#' + fi -$as_echo "#define GNULIB_TEST_FREXPL 1" >>confdefs.h - if test $ac_cv_func___fseterr = no; then @@ -14521,58 +20254,44 @@ $as_echo "#define GNULIB_TEST_FREXPL 1" >>confdefs.h + LOCALCHARSET_TESTS_ENVIRONMENT= - gl_LIBOBJS="$gl_LIBOBJS fseterr.$ac_objext" - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5 -$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; } -if ${gl_cv_func_isnand_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #if __GNUC__ >= 4 - # undef isnand - # define isnand(x) __builtin_isnan ((double)(x)) - #else - # undef isnand - # define isnand(x) isnan ((double)(x)) - #endif - double x; -int -main () -{ -return isnand (x); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_isnand_no_libm=yes + + + + + if test $REPLACE_MEMCHR = 1; then + GL_COND_OBJ_MEMCHR_TRUE= + GL_COND_OBJ_MEMCHR_FALSE='#' else - gl_cv_func_isnand_no_libm=no + GL_COND_OBJ_MEMCHR_TRUE='#' + GL_COND_OBJ_MEMCHR_FALSE= fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +: + if test -z "${GL_COND_OBJ_MEMCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMCHR_FALSE}"; then + GL_COND_OBJ_MEMCHR_TRUE='#' + GL_COND_OBJ_MEMCHR_FALSE='#' + fi + + if test -z "$GL_COND_OBJ_MEMCHR_TRUE"; then : + + + ac_fn_c_check_header_compile "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default" +if test "x$ac_cv_header_bp_sym_h" = xyes +then : + printf "%s\n" "#define HAVE_BP_SYM_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5 -$as_echo "$gl_cv_func_isnand_no_libm" >&6; } - gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm - if test $gl_cv_func_isnand_no_libm = yes; then -$as_echo "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h - fi +fi - if test $gl_func_isnand_no_libm != yes; then @@ -14581,145 +20300,134 @@ $as_echo "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h - gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext" - fi + GL_GNULIB_MEMCHR=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5 -$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; } -if ${gl_cv_func_isnanf_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #if __GNUC__ >= 4 - # undef isnanf - # define isnanf(x) __builtin_isnanf ((float)(x)) - #elif defined isnan - # undef isnanf - # define isnanf(x) isnan ((float)(x)) - #endif - float x; -int -main () -{ -return isnanf (x); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_isnanf_no_libm=yes -else - gl_cv_func_isnanf_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5 -$as_echo "$gl_cv_func_isnanf_no_libm" >&6; } - if test $gl_cv_func_isnanf_no_libm = yes; then +printf "%s\n" "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5 -$as_echo_n "checking whether isnan(float) works... " >&6; } -if ${gl_cv_func_isnanf_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + + + + if test $gl_cv_func_frexp_no_libm = yes; then + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 +printf %s "checking whether frexp works... " >&6; } +if test ${gl_cv_func_frexp_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : case "$host_os" in - irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;; - mingw*) # Guess yes on mingw, no on MSVC. + netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; + mingw*) # Guess yes with MSVC, no with mingw. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __MINGW32__ - Known +#ifdef _MSC_VER + Good #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_isnanf_works="guessing yes" -else - gl_cv_func_isnanf_works="guessing no" + $EGREP "Good" >/dev/null 2>&1 +then : + gl_cv_func_frexp_works="guessing yes" +else $as_nop + gl_cv_func_frexp_works="guessing no" fi -rm -f conftest* +rm -rf conftest* ;; - *) gl_cv_func_isnanf_works="guessing yes" ;; + *) gl_cv_func_frexp_works="guessing yes" ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include #include -#if __GNUC__ >= 4 -# undef isnanf -# define isnanf(x) __builtin_isnanf ((float)(x)) -#elif defined isnan -# undef isnanf -# define isnanf(x) isnan ((float)(x)) +#include +#if HAVE_DECL_ALARM +# include +# include #endif -/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ -#ifdef __DECC -static float -NaN () +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. + ICC 10.0 has a bug when optimizing the expression -zero. + The expression -DBL_MIN * DBL_MIN does not work when cross-compiling + to PowerPC on Mac OS X 10.5. */ +#if defined __hpux || defined __sgi || defined __ICC +static double +compute_minus_zero (void) { - static float zero = 0.0f; - return zero / zero; + return -DBL_MIN * DBL_MIN; } +# define minus_zero compute_minus_zero () #else -# define NaN() (0.0f / 0.0f) +double minus_zero = -0.0; #endif -#define NWORDS \ - ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { unsigned int word[NWORDS]; float value; } memory_float; int main() { int result = 0; - - if (isnanf (1.0f / 0.0f)) - result |= 1; - - if (!isnanf (NaN ())) - result |= 2; - -#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT - /* The isnanf function should be immune against changes in the sign bit and - in the mantissa bits. The xor operation twiddles a bit that can only be - a sign bit or a mantissa bit. */ - if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0) + int i; + volatile double x; + double zero = 0.0; +#if HAVE_DECL_ALARM + /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite + number. Let the test fail in this case. */ + signal (SIGALRM, SIG_DFL); + alarm (5); +#endif + /* Test on denormalized numbers. */ + for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) + ; + if (x > 0.0) { - memory_float m; - - m.value = NaN (); - /* Set the bits below the exponent to 01111...111. */ - m.word[0] &= -1U << FLT_EXPBIT0_BIT; - m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1; - if (!isnanf (m.value)) - result |= 4; + int exp; + double y = frexp (x, &exp); + /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. + On NetBSD: y = 0.75. Correct: y = 0.5. */ + if (y != 0.5) + result |= 1; } -#endif - + /* Test on infinite numbers. */ + x = 1.0 / zero; + { + int exp; + double y = frexp (x, &exp); + if (y != x) + result |= 2; + } + /* Test on negative zero. */ + x = minus_zero; + { + int exp; + double y = frexp (x, &exp); + if (memcmp (&y, &x, sizeof x)) + result |= 4; + } return result; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_isnanf_works=yes -else - gl_cv_func_isnanf_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_frexp_works=yes +else $as_nop + gl_cv_func_frexp_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -14727,339 +20435,216 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5 -$as_echo "$gl_cv_func_isnanf_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 +printf "%s\n" "$gl_cv_func_frexp_works" >&6; } - fi - if test $gl_cv_func_isnanf_no_libm = yes \ - && { case "$gl_cv_func_isnanf_works" in - *yes) true;; - *) false;; - esac - }; then - gl_func_isnanf_no_libm=yes + case "$gl_cv_func_frexp_works" in + *yes) -$as_echo "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h +printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h - else - gl_func_isnanf_no_libm=no + ;; + esac fi - if test $gl_func_isnanf_no_libm != yes; then - - - - + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5 +printf %s "checking whether ldexp can be used without linking with libm... " >&6; } +if test ${gl_cv_func_ldexp_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - - - - gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext" - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5 -$as_echo_n "checking where to find the exponent in a 'float'... " >&6; } -if ${gl_cv_cc_float_expbit0+:} false; then : - $as_echo_n "(cached) " >&6 -else - - if test "$cross_compiling" = yes; then : - gl_cv_cc_float_expbit0="word 0 bit 23" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#include -#include -#include -#define NWORDS \ - ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { float value; unsigned int word[NWORDS]; } memory_float; -static unsigned int ored_words[NWORDS]; -static unsigned int anded_words[NWORDS]; -static void add_to_ored_words (float x) -{ - memory_float m; - size_t i; - /* Clear it first, in case - sizeof (float) < sizeof (memory_float). */ - memset (&m, 0, sizeof (memory_float)); - m.value = x; - for (i = 0; i < NWORDS; i++) - { - ored_words[i] |= m.word[i]; - anded_words[i] &= m.word[i]; - } -} -int main () -{ - size_t j; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - for (j = 0; j < NWORDS; j++) - anded_words[j] = ~ (unsigned int) 0; - add_to_ored_words (0.25f); - add_to_ored_words (0.5f); - add_to_ored_words (1.0f); - add_to_ored_words (2.0f); - add_to_ored_words (4.0f); - /* Remove bits that are common (e.g. if representation of the first mantissa - bit is explicit). */ - for (j = 0; j < NWORDS; j++) - ored_words[j] &= ~anded_words[j]; - /* Now find the nonzero word. */ - for (j = 0; j < NWORDS; j++) - if (ored_words[j] != 0) - break; - if (j < NWORDS) - { - size_t i; - for (i = j + 1; i < NWORDS; i++) - if (ored_words[i] != 0) - { - fprintf (fp, "unknown"); - return (fclose (fp) != 0); - } - for (i = 0; ; i++) - if ((ored_words[j] >> i) & 1) - { - fprintf (fp, "word %d bit %d", (int) j, (int) i); - return (fclose (fp) != 0); - } - } - fprintf (fp, "unknown"); - return (fclose (fp) != 0); +#include + double x; + int y; +int +main (void) +{ +return ldexp (x, y) < 1; + ; + return 0; } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_float_expbit0=`cat conftest.out` -else - gl_cv_cc_float_expbit0="unknown" -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_ldexp_no_libm=yes +else $as_nop + gl_cv_func_ldexp_no_libm=no fi - - rm -f conftest.out +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5 -$as_echo "$gl_cv_cc_float_expbit0" >&6; } - case "$gl_cv_cc_float_expbit0" in - word*bit*) - word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5 +printf "%s\n" "$gl_cv_func_ldexp_no_libm" >&6; } + if test $gl_cv_func_ldexp_no_libm = yes; then -cat >>confdefs.h <<_ACEOF -#define FLT_EXPBIT0_WORD $word -_ACEOF +printf "%s\n" "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h + fi -cat >>confdefs.h <<_ACEOF -#define FLT_EXPBIT0_BIT $bit -_ACEOF - ;; - esac - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5 -$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; } -if ${gl_cv_func_isnanl_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 +printf %s "checking whether frexpl() can be used without linking with libm... " >&6; } +if test ${gl_cv_func_frexpl_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - #if __GNUC__ >= 4 - # undef isnanl - # define isnanl(x) __builtin_isnanl ((long double)(x)) - #elif defined isnan - # undef isnanl - # define isnanl(x) isnan ((long double)(x)) - #endif long double x; int -main () +main (void) { -return isnanl (x); +int e; return frexpl (x, &e) > 0; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_isnanl_no_libm=yes -else - gl_cv_func_isnanl_no_libm=no +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_frexpl_no_libm=yes +else $as_nop + gl_cv_func_frexpl_no_libm=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5 -$as_echo "$gl_cv_func_isnanl_no_libm" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 +printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; } - gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm - if test $gl_func_isnanl_no_libm = yes; then - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5 -$as_echo_n "checking whether isnanl works... " >&6; } -if ${gl_cv_func_isnanl_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test $gl_cv_func_frexpl_no_libm = yes; then - if test "$cross_compiling" = yes; then : - case "$host_os" in - mingw*) # Guess yes on mingw, no on MSVC. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __MINGW32__ - Known -#endif + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 +printf %s "checking whether frexpl works... " >&6; } +if test ${gl_cv_func_frexpl_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_func_isnanl_works="guessing yes" -else - gl_cv_func_isnanl_works="guessing no" -fi -rm -f conftest* + if test "$cross_compiling" = yes +then : - ;; - *) gl_cv_func_isnanl_works="guessing yes" ;; + case "$host_os" in + aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) + gl_cv_func_frexpl_works="guessing no";; + *) gl_cv_func_frexpl_works="guessing yes";; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -#include #include -#if __GNUC__ >= 4 -# undef isnanl -# define isnanl(x) __builtin_isnanl ((long double)(x)) -#elif defined isnan -# undef isnanl -# define isnanl(x) isnan ((long double)(x)) +/* Override the values of , like done in float.in.h. */ +#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP (-16381) #endif -#define NWORDS \ - ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { unsigned int word[NWORDS]; long double value; } - memory_long_double; -/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the - runtime type conversion. */ -#ifdef __sgi -static long double NaNl () -{ - double zero = 0.0; - return zero / zero; -} -#else -# define NaNl() (0.0L / 0.0L) +#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP (-16381) #endif -int main () +#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +#endif +#if defined __sgi && (LDBL_MANT_DIG >= 106) +# if defined __GNUC__ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP DBL_MIN_EXP +# endif +#endif +extern +#ifdef __cplusplus +"C" +#endif +long double frexpl (long double, int *); +long double zero = 0.0L; +int main() { int result = 0; - - if (!isnanl (NaNl ())) - result |= 1; - + volatile long double x; + /* Test on finite numbers that fails on AIX 5.1. */ + x = 16.0L; { - memory_long_double m; - unsigned int i; - - /* The isnanl function should be immune against changes in the sign bit and - in the mantissa bits. The xor operation twiddles a bit that can only be - a sign bit or a mantissa bit (since the exponent never extends to - bit 31). */ - m.value = NaNl (); - m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); - for (i = 0; i < NWORDS; i++) - m.word[i] |= 1; - if (!isnanl (m.value)) + int exp = -9999; + frexpl (x, &exp); + if (exp != 5) result |= 1; } - -#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE -/* Representation of an 80-bit 'long double' as an initializer for a sequence - of 'unsigned int' words. */ -# ifdef WORDS_BIGENDIAN -# define LDBL80_WORDS(exponent,manthi,mantlo) \ - { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ - ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ - (unsigned int) (mantlo) << 16 \ - } -# else -# define LDBL80_WORDS(exponent,manthi,mantlo) \ - { mantlo, manthi, exponent } -# endif - { /* Quiet NaN. */ - static memory_long_double x = - { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; - if (!isnanl (x.value)) - result |= 2; - } + /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl + function returns an invalid (incorrectly normalized) value: it returns + y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } + but the correct result is + 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ + x = 1.01L; { - /* Signalling NaN. */ - static memory_long_double x = - { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; - if (!isnanl (x.value)) + int exp = -9999; + long double y = frexpl (x, &exp); + if (!(exp == 1 && y == 0.505L)) result |= 2; } - /* isnanl should return something even for noncanonical values. */ - { /* Pseudo-NaN. */ - static memory_long_double x = - { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; - if (isnanl (x.value) && !isnanl (x.value)) - result |= 4; + /* Test on large finite numbers. This fails on BeOS at i = 16322, while + LDBL_MAX_EXP = 16384. + In the loop end test, we test x against Infinity, rather than comparing + i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ + { + int i; + for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) + { + int exp = -9999; + frexpl (x, &exp); + if (exp != i) + { + result |= 4; + break; + } + } } - { /* Pseudo-Infinity. */ - static memory_long_double x = - { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; - if (isnanl (x.value) && !isnanl (x.value)) - result |= 8; + /* Test on denormalized numbers. */ + { + int i; + for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) + ; + if (x > 0.0L) + { + int exp; + long double y = frexpl (x, &exp); + /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, + exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ + if (exp != LDBL_MIN_EXP - 1) + result |= 8; + } } - { /* Pseudo-Zero. */ - static memory_long_double x = - { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; - if (isnanl (x.value) && !isnanl (x.value)) + /* Test on infinite numbers. */ + /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0. */ + x = 1.0L / zero; + { + int exp; + long double y = frexpl (x, &exp); + if (y != x) result |= 16; } - { /* Unnormalized number. */ - static memory_long_double x = - { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; - if (isnanl (x.value) && !isnanl (x.value)) - result |= 32; - } - { /* Pseudo-Denormal. */ - static memory_long_double x = - { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; - if (isnanl (x.value) && !isnanl (x.value)) - result |= 64; - } -#endif - return result; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_isnanl_works=yes -else - gl_cv_func_isnanl_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_frexpl_works=yes +else $as_nop + gl_cv_func_frexpl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -15067,1079 +20652,1077 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5 -$as_echo "$gl_cv_func_isnanl_works" >&6; } - - case "$gl_cv_func_isnanl_works" in - *yes) ;; - *) gl_func_isnanl_no_libm=no ;; - esac - fi - if test $gl_func_isnanl_no_libm = yes; then - -$as_echo "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h - - fi - - if test $gl_func_isnanl_no_libm != yes; then - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 +printf "%s\n" "$gl_cv_func_frexpl_works" >&6; } + case "$gl_cv_func_frexpl_works" in + *yes) gl_func_frexpl_no_libm=yes ;; + *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; + esac + else + gl_func_frexpl_no_libm=no + REPLACE_FREXPL=1 + fi + if test $gl_func_frexpl_no_libm = yes; then +printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_frexpl" = xyes +then : +else $as_nop + HAVE_DECL_FREXPL=0 +fi + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5 +printf %s "checking whether ldexpl() can be used without linking with libm... " >&6; } +if test ${gl_cv_func_ldexpl_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext" - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5 -$as_echo_n "checking where to find the exponent in a 'long double'... " >&6; } -if ${gl_cv_cc_long_double_expbit0+:} false; then : - $as_echo_n "(cached) " >&6 -else - - if test "$cross_compiling" = yes; then : - - gl_cv_cc_long_double_expbit0="unknown" - case "$host_os" in - mingw*) # On native Windows (little-endian), we know the result - # in two cases: mingw, MSVC. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#ifdef __MINGW32__ - Known -#endif - +#include + long double x; +int +main (void) +{ +return ldexpl (x, -1) > 0; + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_cc_long_double_expbit0="word 2 bit 0" +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_ldexpl_no_libm=yes +else $as_nop + gl_cv_func_ldexpl_no_libm=no fi -rm -f conftest* +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5 +printf "%s\n" "$gl_cv_func_ldexpl_no_libm" >&6; } -#ifdef _MSC_VER - Known -#endif + if test $gl_cv_func_ldexpl_no_libm = yes; then -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Known" >/dev/null 2>&1; then : - gl_cv_cc_long_double_expbit0="word 1 bit 20" -fi -rm -f conftest* - ;; - esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5 +printf %s "checking whether ldexpl works... " >&6; } +if test ${gl_cv_func_ldexpl_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop -else + if test "$cross_compiling" = yes +then : + + case "$host_os" in + aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_ldexpl_works="guessing yes" ;; + *) gl_cv_func_ldexpl_works="guessing yes" ;; + esac + +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#include -#define NWORDS \ - ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { long double value; unsigned int word[NWORDS]; } - memory_long_double; -static unsigned int ored_words[NWORDS]; -static unsigned int anded_words[NWORDS]; -static void add_to_ored_words (long double x) -{ - memory_long_double m; - size_t i; - /* Clear it first, in case - sizeof (long double) < sizeof (memory_long_double). */ - memset (&m, 0, sizeof (memory_long_double)); - m.value = x; - for (i = 0; i < NWORDS; i++) - { - ored_words[i] |= m.word[i]; - anded_words[i] &= m.word[i]; - } -} -int main () +#include +extern +#ifdef __cplusplus +"C" +#endif +long double ldexpl (long double, int); +int main() { - size_t j; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - for (j = 0; j < NWORDS; j++) - anded_words[j] = ~ (unsigned int) 0; - add_to_ored_words (0.25L); - add_to_ored_words (0.5L); - add_to_ored_words (1.0L); - add_to_ored_words (2.0L); - add_to_ored_words (4.0L); - /* Remove bits that are common (e.g. if representation of the first mantissa - bit is explicit). */ - for (j = 0; j < NWORDS; j++) - ored_words[j] &= ~anded_words[j]; - /* Now find the nonzero word. */ - for (j = 0; j < NWORDS; j++) - if (ored_words[j] != 0) - break; - if (j < NWORDS) - { - size_t i; - for (i = j + 1; i < NWORDS; i++) - if (ored_words[i] != 0) - { - fprintf (fp, "unknown"); - return (fclose (fp) != 0); - } - for (i = 0; ; i++) - if ((ored_words[j] >> i) & 1) - { - fprintf (fp, "word %d bit %d", (int) j, (int) i); - return (fclose (fp) != 0); - } - } - fprintf (fp, "unknown"); - return (fclose (fp) != 0); + int result = 0; + { + volatile long double x = 1.0; + volatile long double y = ldexpl (x, -1); + if (y != 0.5L) + result |= 1; + } + { + volatile long double x = 1.73205L; + volatile long double y = ldexpl (x, 0); + if (y != x) + result |= 2; + } + return result; } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_long_double_expbit0=`cat conftest.out` -else - gl_cv_cc_long_double_expbit0="unknown" +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_ldexpl_works=yes +else $as_nop + gl_cv_func_ldexpl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi - rm -f conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5 -$as_echo "$gl_cv_cc_long_double_expbit0" >&6; } - case "$gl_cv_cc_long_double_expbit0" in - word*bit*) - word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'` - -cat >>confdefs.h <<_ACEOF -#define LDBL_EXPBIT0_WORD $word -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5 +printf "%s\n" "$gl_cv_func_ldexpl_works" >&6; } + case "$gl_cv_func_ldexpl_works" in + *yes) -cat >>confdefs.h <<_ACEOF -#define LDBL_EXPBIT0_BIT $bit -_ACEOF - - ;; - esac - +printf "%s\n" "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ldexpl" = xyes +then : +else $as_nop + HAVE_DECL_LDEXPL=0 +fi + ;; + esac fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5 +printf %s "checking for signbit macro... " >&6; } +if test ${gl_cv_func_signbit+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;; + # Guess yes on musl systems. + *-musl*) gl_cv_func_signbit="guessing yes" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_signbit="guessing yes" ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_signbit="$gl_cross_guess_normal" ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +/* If signbit is defined as a function, don't use it, since calling it for + 'float' or 'long double' arguments would involve conversions. + If signbit is not declared at all but exists as a library function, don't + use it, since the prototype may not match. + If signbit is not declared at all but exists as a compiler built-in, don't + use it, since it's preferable to use __builtin_signbit* (no warnings, + no conversions). */ +#ifndef signbit +# error "signbit should be a macro" +#endif +#include - LOCALCHARSET_TESTS_ENVIRONMENT= - - - - - - - +/* Global variables. + Needed because GCC 4 constant-folds __builtin_signbitl (literal) + but cannot constant-fold __builtin_signbitl (variable). */ +float vf; +double vd; +long double vl; +int main () +{ +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. + So we use -p0f and -p0d instead. */ +float p0f = 0.0f; +float m0f = -p0f; +double p0d = 0.0; +double m0d = -p0d; +/* On HP-UX 10.20, negating 0.0L does not yield -0.0L. + So we use another constant expression instead. + But that expression does not work on other platforms, such as when + cross-compiling to PowerPC on Mac OS X 10.5. */ +long double p0l = 0.0L; +#if defined __hpux || defined __sgi +long double m0l = -LDBL_MIN * LDBL_MIN; +#else +long double m0l = -p0l; +#endif + int result = 0; + if (signbit (vf)) /* link check */ + vf++; + { + float plus_inf = 1.0f / p0f; + float minus_inf = -1.0f / p0f; + if (!(!signbit (255.0f) + && signbit (-255.0f) + && !signbit (p0f) + && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) + && !signbit (plus_inf) + && signbit (minus_inf))) + result |= 1; + } + if (signbit (vd)) /* link check */ + vd++; + { + double plus_inf = 1.0 / p0d; + double minus_inf = -1.0 / p0d; + if (!(!signbit (255.0) + && signbit (-255.0) + && !signbit (p0d) + && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) + && !signbit (plus_inf) + && signbit (minus_inf))) + result |= 2; + } + if (signbit (vl)) /* link check */ + vl++; + { + long double plus_inf = 1.0L / p0l; + long double minus_inf = -1.0L / p0l; + if (signbit (255.0L)) + result |= 4; + if (!signbit (-255.0L)) + result |= 4; + if (signbit (p0l)) + result |= 8; + if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) + result |= 16; + if (signbit (plus_inf)) + result |= 32; + if (!signbit (minus_inf)) + result |= 64; + } + return result; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_signbit=yes +else $as_nop + gl_cv_func_signbit=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5 +printf "%s\n" "$gl_cv_func_signbit" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5 +printf %s "checking for signbit compiler built-ins... " >&6; } +if test ${gl_cv_func_signbit_builtins+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test $gl_cv_have_include_next = yes; then - gl_cv_next_math_h='<'math.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_math_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;; + # Guess yes on musl systems. + *-musl*) gl_cv_func_signbit_builtins="guessing yes" ;; + # Guess yes on mingw, no on MSVC. + mingw*) if test -n "$GCC"; then + gl_cv_func_signbit_builtins="guessing yes" + else + gl_cv_func_signbit_builtins="guessing no" + fi + ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;; + esac - if test $ac_cv_header_math_h = yes; then +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if (__GNUC__ >= 4) || (__clang_major__ >= 4) +# define signbit(x) \ + (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ + sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ + __builtin_signbitf (x)) +#else +# error "signbit should be three compiler built-ins" +#endif +#include +/* Global variables. + Needed because GCC 4 constant-folds __builtin_signbitl (literal) + but cannot constant-fold __builtin_signbitl (variable). */ +float vf; +double vd; +long double vl; +int main () +{ +/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. + So we use -p0f and -p0d instead. */ +float p0f = 0.0f; +float m0f = -p0f; +double p0d = 0.0; +double m0d = -p0d; +/* On HP-UX 10.20, negating 0.0L does not yield -0.0L. + So we use another constant expression instead. + But that expression does not work on other platforms, such as when + cross-compiling to PowerPC on Mac OS X 10.5. */ +long double p0l = 0.0L; +#if defined __hpux || defined __sgi +long double m0l = -LDBL_MIN * LDBL_MIN; +#else +long double m0l = -p0l; +#endif + int result = 0; + if (signbit (vf)) /* link check */ + vf++; + { + float plus_inf = 1.0f / p0f; + float minus_inf = -1.0f / p0f; + if (!(!signbit (255.0f) + && signbit (-255.0f) + && !signbit (p0f) + && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) + && !signbit (plus_inf) + && signbit (minus_inf))) + result |= 1; + } + if (signbit (vd)) /* link check */ + vd++; + { + double plus_inf = 1.0 / p0d; + double minus_inf = -1.0 / p0d; + if (!(!signbit (255.0) + && signbit (-255.0) + && !signbit (p0d) + && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) + && !signbit (plus_inf) + && signbit (minus_inf))) + result |= 2; + } + if (signbit (vl)) /* link check */ + vl++; + { + long double plus_inf = 1.0L / p0l; + long double minus_inf = -1.0L / p0l; + if (signbit (255.0L)) + result |= 4; + if (!signbit (-255.0L)) + result |= 4; + if (signbit (p0l)) + result |= 8; + if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) + result |= 16; + if (signbit (plus_inf)) + result |= 32; + if (!signbit (minus_inf)) + result |= 64; + } + return result; +} - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include _ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_signbit_builtins=yes +else $as_nop + gl_cv_func_signbit_builtins=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_builtins" >&5 +printf "%s\n" "$gl_cv_func_signbit_builtins" >&6; } + case "$gl_cv_func_signbit_builtins" in + *yes) + REPLACE_SIGNBIT_USING_BUILTINS=1 ;; *) - gl_dirsep_regex='\/' + case "$gl_cv_func_signbit" in + *yes) ;; + *) + REPLACE_SIGNBIT=1 + ;; + esac ;; esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'math.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - - gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - - gl_header=$gl_cv_absolute_math_h - gl_cv_next_math_h='"'$gl_header'"' - else - gl_cv_next_math_h='<'math.h'>' - fi - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5 -$as_echo "$gl_cv_next_math_h" >&6; } - fi - NEXT_MATH_H=$gl_cv_next_math_h - - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'math.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_math_h - fi - NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive + case "$host_os" in + solaris*) + REPLACE_SIGNBIT=1 + ;; + esac + if test $REPLACE_SIGNBIT = 1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5 +printf %s "checking where to find the sign bit in a 'float'... " >&6; } +if test ${gl_cv_cc_float_signbit+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + gl_cv_cc_float_signbit="unknown" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5 -$as_echo_n "checking whether NAN macro works... " >&6; } -if ${gl_cv_header_math_nan_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -/* Solaris 10 has a broken definition of NAN. Other platforms - fail to provide NAN, or provide it only in C99 mode; this - test only needs to fail when NAN is provided but wrong. */ - float f = 1.0f; -#ifdef NAN - f = NAN; -#endif - return f == 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_math_nan_works=yes -else - gl_cv_header_math_nan_works=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5 -$as_echo "$gl_cv_header_math_nan_works" >&6; } - if test $gl_cv_header_math_nan_works = no; then - REPLACE_NAN=1 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5 -$as_echo_n "checking whether HUGE_VAL works... " >&6; } -if ${gl_cv_header_math_huge_val_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -int -main () + +#include +#include +#define NWORDS \ + ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { float value; unsigned int word[NWORDS]; } + memory_float; +static memory_float plus = { 1.0f }; +static memory_float minus = { -1.0f }; +int main () { -/* Solaris 10 has a broken definition of HUGE_VAL. */ - double d = HUGE_VAL; - return d == 0; - ; + size_t j, k, i; + unsigned int m; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + /* Find the different bit. */ + k = 0; m = 0; + for (j = 0; j < NWORDS; j++) + { + unsigned int x = plus.word[j] ^ minus.word[j]; + if ((x & (x - 1)) || (x && m)) + { + /* More than one bit difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 2; + } + if (x) + { + k = j; + m = x; + } + } + if (m == 0) + { + /* No difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 3; + } + /* Now m = plus.word[k] ^ ~minus.word[k]. */ + if (plus.word[k] & ~minus.word[k]) + { + /* Oh? The sign bit is set in the positive and cleared in the negative + numbers? */ + fprintf (fp, "unknown"); + fclose (fp); + return 4; + } + for (i = 0; ; i++) + if ((m >> i) & 1) + break; + fprintf (fp, "word %d bit %d", (int) k, (int) i); + if (fclose (fp) != 0) + return 5; return 0; } + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_header_math_huge_val_works=yes -else - gl_cv_header_math_huge_val_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_float_signbit=`cat conftest.out` +else $as_nop + gl_cv_cc_float_signbit="unknown" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5 -$as_echo "$gl_cv_header_math_huge_val_works" >&6; } - if test $gl_cv_header_math_huge_val_works = no; then - REPLACE_HUGE_VAL=1 - fi - + rm -f conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5 +printf "%s\n" "$gl_cv_cc_float_signbit" >&6; } + case "$gl_cv_cc_float_signbit" in + word*bit*) + word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'` +printf "%s\n" "#define FLT_SIGNBIT_WORD $word" >>confdefs.h - if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then +printf "%s\n" "#define FLT_SIGNBIT_BIT $bit" >>confdefs.h + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5 +printf %s "checking where to find the sign bit in a 'double'... " >&6; } +if test ${gl_cv_cc_double_signbit+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + gl_cv_cc_double_signbit="unknown" - gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#define NWORDS \ + ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { double value; unsigned int word[NWORDS]; } + memory_float; +static memory_float plus = { 1.0 }; +static memory_float minus = { -1.0 }; +int main () +{ + size_t j, k, i; + unsigned int m; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + /* Find the different bit. */ + k = 0; m = 0; + for (j = 0; j < NWORDS; j++) + { + unsigned int x = plus.word[j] ^ minus.word[j]; + if ((x & (x - 1)) || (x && m)) + { + /* More than one bit difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 2; + } + if (x) + { + k = j; + m = x; + } + } + if (m == 0) + { + /* No difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 3; + } + /* Now m = plus.word[k] ^ ~minus.word[k]. */ + if (plus.word[k] & ~minus.word[k]) + { + /* Oh? The sign bit is set in the positive and cleared in the negative + numbers? */ + fprintf (fp, "unknown"); + fclose (fp); + return 4; + } + for (i = 0; ; i++) + if ((m >> i) & 1) + break; + fprintf (fp, "word %d bit %d", (int) k, (int) i); + if (fclose (fp) != 0) + return 5; + return 0; +} - for ac_header in bp-sym.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default" -if test "x$ac_cv_header_bp_sym_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BP_SYM_H 1 _ACEOF - +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_double_signbit=`cat conftest.out` +else $as_nop + gl_cv_cc_double_signbit="unknown" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -done - - - fi - - - - - - GNULIB_MEMCHR=1 - - - - - -$as_echo "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h - - - + rm -f conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5 +printf "%s\n" "$gl_cv_cc_double_signbit" >&6; } + case "$gl_cv_cc_double_signbit" in + word*bit*) + word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'` +printf "%s\n" "#define DBL_SIGNBIT_WORD $word" >>confdefs.h - if test $gl_cv_func_frexp_no_libm = yes; then +printf "%s\n" "#define DBL_SIGNBIT_BIT $bit" >>confdefs.h + ;; + esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5 -$as_echo_n "checking whether frexp works... " >&6; } -if ${gl_cv_func_frexp_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;; - mingw*) # Guess yes with MSVC, no with mingw. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef _MSC_VER - Good -#endif + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5 +printf %s "checking where to find the sign bit in a 'long double'... " >&6; } +if test ${gl_cv_cc_long_double_signbit+y} +then : + printf %s "(cached) " >&6 +else $as_nop -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Good" >/dev/null 2>&1; then : - gl_cv_func_frexp_works="guessing yes" -else - gl_cv_func_frexp_works="guessing no" -fi -rm -f conftest* + if test "$cross_compiling" = yes +then : - ;; - *) gl_cv_func_frexp_works="guessing yes" ;; - esac + gl_cv_cc_long_double_signbit="unknown" -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#if HAVE_DECL_ALARM -# include -# include -#endif -/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. - ICC 10.0 has a bug when optimizing the expression -zero. - The expression -DBL_MIN * DBL_MIN does not work when cross-compiling - to PowerPC on Mac OS X 10.5. */ -#if defined __hpux || defined __sgi || defined __ICC -static double -compute_minus_zero (void) -{ - return -DBL_MIN * DBL_MIN; -} -# define minus_zero compute_minus_zero () -#else -double minus_zero = -0.0; -#endif -int main() +#include +#include +#define NWORDS \ + ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) +typedef union { long double value; unsigned int word[NWORDS]; } + memory_float; +static memory_float plus = { 1.0L }; +static memory_float minus = { -1.0L }; +int main () { - int result = 0; - int i; - volatile double x; - double zero = 0.0; -#if HAVE_DECL_ALARM - /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite - number. Let the test fail in this case. */ - signal (SIGALRM, SIG_DFL); - alarm (5); -#endif - /* Test on denormalized numbers. */ - for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) - ; - if (x > 0.0) + size_t j, k, i; + unsigned int m; + FILE *fp = fopen ("conftest.out", "w"); + if (fp == NULL) + return 1; + /* Find the different bit. */ + k = 0; m = 0; + for (j = 0; j < NWORDS; j++) { - int exp; - double y = frexp (x, &exp); - /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. - On NetBSD: y = 0.75. Correct: y = 0.5. */ - if (y != 0.5) - result |= 1; + unsigned int x = plus.word[j] ^ minus.word[j]; + if ((x & (x - 1)) || (x && m)) + { + /* More than one bit difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 2; + } + if (x) + { + k = j; + m = x; + } } - /* Test on infinite numbers. */ - x = 1.0 / zero; - { - int exp; - double y = frexp (x, &exp); - if (y != x) - result |= 2; - } - /* Test on negative zero. */ - x = minus_zero; - { - int exp; - double y = frexp (x, &exp); - if (memcmp (&y, &x, sizeof x)) - result |= 4; - } - return result; + if (m == 0) + { + /* No difference. */ + fprintf (fp, "unknown"); + fclose (fp); + return 3; + } + /* Now m = plus.word[k] ^ ~minus.word[k]. */ + if (plus.word[k] & ~minus.word[k]) + { + /* Oh? The sign bit is set in the positive and cleared in the negative + numbers? */ + fprintf (fp, "unknown"); + fclose (fp); + return 4; + } + for (i = 0; ; i++) + if ((m >> i) & 1) + break; + fprintf (fp, "word %d bit %d", (int) k, (int) i); + if (fclose (fp) != 0) + return 5; + return 0; } + _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_frexp_works=yes -else - gl_cv_func_frexp_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_cc_long_double_signbit=`cat conftest.out` +else $as_nop + gl_cv_cc_long_double_signbit="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi + rm -f conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5 -$as_echo "$gl_cv_func_frexp_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5 +printf "%s\n" "$gl_cv_cc_long_double_signbit" >&6; } + case "$gl_cv_cc_long_double_signbit" in + word*bit*) + word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` + bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'` - case "$gl_cv_func_frexp_works" in - *yes) +printf "%s\n" "#define LDBL_SIGNBIT_WORD $word" >>confdefs.h + + +printf "%s\n" "#define LDBL_SIGNBIT_BIT $bit" >>confdefs.h + + ;; + esac -$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h - ;; - esac - fi + if test "$gl_cv_cc_float_signbit" = unknown; then + ac_fn_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_copysignf" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_COPYSIGNF $ac_have_decl" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5 -$as_echo_n "checking whether ldexp can be used without linking with libm... " >&6; } -if ${gl_cv_func_ldexp_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test "$ac_cv_have_decl_copysignf" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5 +printf %s "checking whether copysignf can be used without linking with libm... " >&6; } +if test ${gl_cv_func_copysignf_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - double x; - int y; + float x, y; int -main () +main (void) { -return ldexp (x, y) < 1; +return copysignf (x, y) < 0; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_ldexp_no_libm=yes -else - gl_cv_func_ldexp_no_libm=no +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_copysignf_no_libm=yes +else $as_nop + gl_cv_func_copysignf_no_libm=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5 -$as_echo "$gl_cv_func_ldexp_no_libm" >&6; } - if test $gl_cv_func_ldexp_no_libm = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5 +printf "%s\n" "$gl_cv_func_copysignf_no_libm" >&6; } + if test $gl_cv_func_copysignf_no_libm = yes; then -$as_echo "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h +printf "%s\n" "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h - fi + fi + fi + fi + if test "$gl_cv_cc_double_signbit" = unknown; then + ac_fn_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_copysign" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_COPYSIGN $ac_have_decl" >>confdefs.h + if test "$ac_cv_have_decl_copysign" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5 +printf %s "checking whether copysign can be used without linking with libm... " >&6; } +if test ${gl_cv_func_copysign_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + double x, y; +int +main (void) +{ +return copysign (x, y) < 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_copysign_no_libm=yes +else $as_nop + gl_cv_func_copysign_no_libm=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5 +printf "%s\n" "$gl_cv_func_copysign_no_libm" >&6; } + if test $gl_cv_func_copysign_no_libm = yes; then +printf "%s\n" "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h + fi + fi + fi + if test "$gl_cv_cc_long_double_signbit" = unknown; then + ac_fn_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_copysignl" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_COPYSIGNL $ac_have_decl" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5 -$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; } -if ${gl_cv_func_frexpl_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test "$ac_cv_have_decl_copysignl" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5 +printf %s "checking whether copysignl can be used without linking with libm... " >&6; } +if test ${gl_cv_func_copysignl_no_libm+y} +then : + printf %s "(cached) " >&6 +else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - long double x; + long double x, y; int -main () +main (void) { -int e; return frexpl (x, &e) > 0; +return copysignl (x, y) < 0; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_frexpl_no_libm=yes -else - gl_cv_func_frexpl_no_libm=no +if ac_fn_c_try_link "$LINENO" +then : + gl_cv_func_copysignl_no_libm=yes +else $as_nop + gl_cv_func_copysignl_no_libm=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5 -$as_echo "$gl_cv_func_frexpl_no_libm" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5 +printf "%s\n" "$gl_cv_func_copysignl_no_libm" >&6; } + if test $gl_cv_func_copysignl_no_libm = yes; then - if test $gl_cv_func_frexpl_no_libm = yes; then +printf "%s\n" "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h + + fi + fi + fi + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5 -$as_echo_n "checking whether frexpl works... " >&6; } -if ${gl_cv_func_frexpl_works+:} false; then : - $as_echo_n "(cached) " >&6 + if test $REPLACE_SIGNBIT = 1; then + GL_COND_OBJ_SIGNBIT3_TRUE= + GL_COND_OBJ_SIGNBIT3_FALSE='#' else + GL_COND_OBJ_SIGNBIT3_TRUE='#' + GL_COND_OBJ_SIGNBIT3_FALSE= +fi +: + if test -z "${GL_COND_OBJ_SIGNBIT3_TRUE}" && test -z "${GL_COND_OBJ_SIGNBIT3_FALSE}"; then + GL_COND_OBJ_SIGNBIT3_TRUE='#' + GL_COND_OBJ_SIGNBIT3_FALSE='#' + fi - if test "$cross_compiling" = yes; then : - case "$host_os" in - aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*) - gl_cv_func_frexpl_works="guessing no";; - *) gl_cv_func_frexpl_works="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -/* Override the values of , like done in float.in.h. */ -#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP (-16381) -#endif -#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__) -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP (-16381) -#endif -#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__ -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP DBL_MIN_EXP -#endif -#if defined __sgi && (LDBL_MANT_DIG >= 106) -# if defined __GNUC__ -# undef LDBL_MIN_EXP -# define LDBL_MIN_EXP DBL_MIN_EXP -# endif -#endif -extern -#ifdef __cplusplus -"C" -#endif -long double frexpl (long double, int *); -int main() -{ - int result = 0; - volatile long double x; - /* Test on finite numbers that fails on AIX 5.1. */ - x = 16.0L; - { - int exp = -9999; - frexpl (x, &exp); - if (exp != 5) - result |= 1; - } - /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl - function returns an invalid (incorrectly normalized) value: it returns - y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 } - but the correct result is - 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */ - x = 1.01L; - { - int exp = -9999; - long double y = frexpl (x, &exp); - if (!(exp == 1 && y == 0.505L)) - result |= 2; - } - /* Test on large finite numbers. This fails on BeOS at i = 16322, while - LDBL_MAX_EXP = 16384. - In the loop end test, we test x against Infinity, rather than comparing - i with LDBL_MAX_EXP, because BeOS has a wrong LDBL_MAX_EXP. */ - { - int i; - for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L) - { - int exp = -9999; - frexpl (x, &exp); - if (exp != i) - { - result |= 4; - break; - } - } - } - /* Test on denormalized numbers. */ - { - int i; - for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L) - ; - if (x > 0.0L) - { - int exp; - long double y = frexpl (x, &exp); - /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, - exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ - if (exp != LDBL_MIN_EXP - 1) - result |= 8; - } - } - /* Test on infinite numbers. */ - x = 1.0L / 0.0L; - { - int exp; - long double y = frexpl (x, &exp); - if (y != x) - result |= 16; - } - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_frexpl_works=yes -else - gl_cv_func_frexpl_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5 -$as_echo "$gl_cv_func_frexpl_works" >&6; } - case "$gl_cv_func_frexpl_works" in - *yes) gl_func_frexpl_no_libm=yes ;; - *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;; - esac - else - gl_func_frexpl_no_libm=no - REPLACE_FREXPL=1 - fi - if test $gl_func_frexpl_no_libm = yes; then -$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h - ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include -" -if test "x$ac_cv_have_decl_frexpl" = xyes; then : -else - HAVE_DECL_FREXPL=0 -fi + GL_GNULIB_SIGNBIT=1 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5 -$as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; } -if ${gl_cv_func_ldexpl_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - long double x; -int -main () -{ -return ldexpl (x, -1) > 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_ldexpl_no_libm=yes -else - gl_cv_func_ldexpl_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5 -$as_echo "$gl_cv_func_ldexpl_no_libm" >&6; } +printf "%s\n" "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h - if test $gl_cv_func_ldexpl_no_libm = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5 -$as_echo_n "checking whether ldexpl works... " >&6; } -if ${gl_cv_func_ldexpl_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h - case "$host_os" in - aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;; - # Guess yes on native Windows. - mingw*) gl_cv_func_ldexpl_works="guessing yes" ;; - *) gl_cv_func_ldexpl_works="guessing yes" ;; - esac +fi -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 +printf %s "checking for SIZE_MAX... " >&6; } +if test ${gl_cv_size_max+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + gl_cv_size_max=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -extern -#ifdef __cplusplus -"C" +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it #endif -long double ldexpl (long double, int); -int main() -{ - int result = 0; - { - volatile long double x = 1.0; - volatile long double y = ldexpl (x, -1); - if (y != 0.5L) - result |= 1; - } - { - volatile long double x = 1.73205L; - volatile long double y = ldexpl (x, 0); - if (y != x) - result |= 2; - } - return result; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_ldexpl_works=yes -else - gl_cv_func_ldexpl_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Found it" >/dev/null 2>&1 +then : + gl_cv_size_max=yes fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5 -$as_echo "$gl_cv_func_ldexpl_works" >&6; } +rm -rf conftest* - case "$gl_cv_func_ldexpl_works" in - *yes) + if test $gl_cv_size_max != yes; then + if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include +#include " +then : -$as_echo "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h +else $as_nop + size_t_bits_minus_1= +fi - ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include -" -if test "x$ac_cv_have_decl_ldexpl" = xyes; then : + if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include " +then : -else - HAVE_DECL_LDEXPL=0 +else $as_nop + fits_in_uint= fi - ;; - esac - fi + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + extern size_t foo; + extern unsigned long foo; +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + fits_in_uint=0 +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $fits_in_uint = 1; then + gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" + else + gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" + fi + else + gl_cv_size_max='((size_t)~(size_t)0)' + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5 +printf "%s\n" "$gl_cv_size_max" >&6; } + if test "$gl_cv_size_max" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5 -$as_echo_n "checking for signbit macro... " >&6; } -if ${gl_cv_func_signbit+:} false; then : - $as_echo_n "(cached) " >&6 -else +printf "%s\n" "#define SIZE_MAX $gl_cv_size_max" >>confdefs.h - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;; - # Guess yes on native Windows. - mingw*) gl_cv_func_signbit="guessing yes" ;; - # If we don't know, assume the worst. - *) gl_cv_func_signbit="guessing no" ;; - esac + fi -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -/* If signbit is defined as a function, don't use it, since calling it for - 'float' or 'long double' arguments would involve conversions. - If signbit is not declared at all but exists as a library function, don't - use it, since the prototype may not match. - If signbit is not declared at all but exists as a compiler built-in, don't - use it, since it's preferable to use __builtin_signbit* (no warnings, - no conversions). */ -#ifndef signbit -# error "signbit should be a macro" -#endif -#include -/* Global variables. - Needed because GCC 4 constant-folds __builtin_signbitl (literal) - but cannot constant-fold __builtin_signbitl (variable). */ -float vf; -double vd; -long double vl; -int main () -{ -/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. - So we use -p0f and -p0d instead. */ -float p0f = 0.0f; -float m0f = -p0f; -double p0d = 0.0; -double m0d = -p0d; -/* On HP-UX 10.20, negating 0.0L does not yield -0.0L. - So we use another constant expression instead. - But that expression does not work on other platforms, such as when - cross-compiling to PowerPC on Mac OS X 10.5. */ -long double p0l = 0.0L; -#if defined __hpux || defined __sgi -long double m0l = -LDBL_MIN * LDBL_MIN; -#else -long double m0l = -p0l; -#endif - int result = 0; - if (signbit (vf)) /* link check */ - vf++; - { - float plus_inf = 1.0f / p0f; - float minus_inf = -1.0f / p0f; - if (!(!signbit (255.0f) - && signbit (-255.0f) - && !signbit (p0f) - && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) - && !signbit (plus_inf) - && signbit (minus_inf))) - result |= 1; - } - if (signbit (vd)) /* link check */ - vd++; - { - double plus_inf = 1.0 / p0d; - double minus_inf = -1.0 / p0d; - if (!(!signbit (255.0) - && signbit (-255.0) - && !signbit (p0d) - && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) - && !signbit (plus_inf) - && signbit (minus_inf))) - result |= 2; - } - if (signbit (vl)) /* link check */ - vl++; - { - long double plus_inf = 1.0L / p0l; - long double minus_inf = -1.0L / p0l; - if (signbit (255.0L)) - result |= 4; - if (!signbit (-255.0L)) - result |= 4; - if (signbit (p0l)) - result |= 8; - if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) - result |= 16; - if (signbit (plus_inf)) - result |= 32; - if (!signbit (minus_inf)) - result |= 64; - } - return result; -} + gl_cv_func_snprintf_usable=no + ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = xyes +then : + printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_signbit=yes -else - gl_cv_func_signbit=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext fi + if test $ac_cv_func_snprintf = yes; then + -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5 -$as_echo "$gl_cv_func_signbit" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5 -$as_echo_n "checking for signbit compiler built-ins... " >&6; } -if ${gl_cv_func_signbit_gcc+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 +printf %s "checking whether snprintf respects a size of 1... " >&6; } +if test ${gl_cv_func_snprintf_size1+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : case "$host_os" in - # Guess yes on glibc systems. - *-gnu* | gnu*) gl_cv_func_signbit_gcc="guessing yes" ;; - # Guess yes on mingw, no on MSVC. - mingw*) if test -n "$GCC"; then - gl_cv_func_signbit_gcc="guessing yes" - else - gl_cv_func_signbit_gcc="guessing no" - fi - ;; - # If we don't know, assume the worst. - *) gl_cv_func_signbit_gcc="guessing no" ;; + # Guess yes on Android. + linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; + *) gl_cv_func_snprintf_size1="guessing yes" ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#if __GNUC__ >= 4 -# define signbit(x) \ - (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ - sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ - __builtin_signbitf (x)) +#include +#if HAVE_SNPRINTF +# define my_snprintf snprintf #else -# error "signbit should be three compiler built-ins" -#endif -#include - -/* Global variables. - Needed because GCC 4 constant-folds __builtin_signbitl (literal) - but cannot constant-fold __builtin_signbitl (variable). */ -float vf; -double vd; -long double vl; -int main () +# include +static int my_snprintf (char *buf, int size, const char *format, ...) { -/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. - So we use -p0f and -p0d instead. */ -float p0f = 0.0f; -float m0f = -p0f; -double p0d = 0.0; -double m0d = -p0d; -/* On HP-UX 10.20, negating 0.0L does not yield -0.0L. - So we use another constant expression instead. - But that expression does not work on other platforms, such as when - cross-compiling to PowerPC on Mac OS X 10.5. */ -long double p0l = 0.0L; -#if defined __hpux || defined __sgi -long double m0l = -LDBL_MIN * LDBL_MIN; -#else -long double m0l = -p0l; + va_list args; + int ret; + va_start (args, format); + ret = vsnprintf (buf, size, format, args); + va_end (args); + return ret; +} #endif - int result = 0; - if (signbit (vf)) /* link check */ - vf++; - { - float plus_inf = 1.0f / p0f; - float minus_inf = -1.0f / p0f; - if (!(!signbit (255.0f) - && signbit (-255.0f) - && !signbit (p0f) - && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f)) - && !signbit (plus_inf) - && signbit (minus_inf))) - result |= 1; - } - if (signbit (vd)) /* link check */ - vd++; - { - double plus_inf = 1.0 / p0d; - double minus_inf = -1.0 / p0d; - if (!(!signbit (255.0) - && signbit (-255.0) - && !signbit (p0d) - && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d)) - && !signbit (plus_inf) - && signbit (minus_inf))) - result |= 2; - } - if (signbit (vl)) /* link check */ - vl++; - { - long double plus_inf = 1.0L / p0l; - long double minus_inf = -1.0L / p0l; - if (signbit (255.0L)) - result |= 4; - if (!signbit (-255.0L)) - result |= 4; - if (signbit (p0l)) - result |= 8; - if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))) - result |= 16; - if (signbit (plus_inf)) - result |= 32; - if (!signbit (minus_inf)) - result |= 64; - } - return result; +int main() +{ + static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; + my_snprintf (buf, 1, "%d", 12345); + return buf[1] != 'E'; } - - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_signbit_gcc=yes -else - gl_cv_func_signbit_gcc=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_snprintf_size1=yes +else $as_nop + gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -16147,503 +21730,368 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_gcc" >&5 -$as_echo "$gl_cv_func_signbit_gcc" >&6; } - case "$gl_cv_func_signbit_gcc" in - *yes) - REPLACE_SIGNBIT_USING_GCC=1 - ;; - *) - case "$gl_cv_func_signbit" in - *yes) ;; - *) - REPLACE_SIGNBIT=1 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 +printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; } + case "$gl_cv_func_snprintf_size1" in + *yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5 -$as_echo_n "checking where to find the sign bit in a 'float'... " >&6; } -if ${gl_cv_cc_float_signbit+:} false; then : - $as_echo_n "(cached) " >&6 -else + case "$gl_cv_func_snprintf_retval_c99" in + *yes) - if test "$cross_compiling" = yes; then : - gl_cv_cc_float_signbit="unknown" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 +printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } +if test ${gl_cv_func_printf_positions+y} +then : + printf %s "(cached) " >&6 +else $as_nop -else + if test "$cross_compiling" = yes +then : + + case "$host_os" in + netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) + gl_cv_func_printf_positions="guessing no";; + beos*) gl_cv_func_printf_positions="guessing no";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_positions="guessing yes";; + # Guess no on native Windows. + mingw* | pw*) gl_cv_func_printf_positions="guessing no";; + *) gl_cv_func_printf_positions="guessing yes";; + esac + +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include #include -#define NWORDS \ - ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { float value; unsigned int word[NWORDS]; } - memory_float; -static memory_float plus = { 1.0f }; -static memory_float minus = { -1.0f }; +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; int main () { - size_t j, k, i; - unsigned int m; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - /* Find the different bit. */ - k = 0; m = 0; - for (j = 0; j < NWORDS; j++) - { - unsigned int x = plus.word[j] ^ minus.word[j]; - if ((x & (x - 1)) || (x && m)) - { - /* More than one bit difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 2; - } - if (x) - { - k = j; - m = x; - } - } - if (m == 0) - { - /* No difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 3; - } - /* Now m = plus.word[k] ^ ~minus.word[k]. */ - if (plus.word[k] & ~minus.word[k]) - { - /* Oh? The sign bit is set in the positive and cleared in the negative - numbers? */ - fprintf (fp, "unknown"); - fclose (fp); - return 4; - } - for (i = 0; ; i++) - if ((m >> i) & 1) - break; - fprintf (fp, "word %d bit %d", (int) k, (int) i); - if (fclose (fp) != 0) - return 5; - return 0; + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_float_signbit=`cat conftest.out` -else - gl_cv_cc_float_signbit="unknown" +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_positions=yes +else $as_nop + gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi - rm -f conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5 -$as_echo "$gl_cv_cc_float_signbit" >&6; } - case "$gl_cv_cc_float_signbit" in - word*bit*) - word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 +printf "%s\n" "$gl_cv_func_printf_positions" >&6; } -cat >>confdefs.h <<_ACEOF -#define FLT_SIGNBIT_WORD $word -_ACEOF + case "$gl_cv_func_printf_positions" in + *yes) + gl_cv_func_snprintf_usable=yes + ;; + esac + ;; + esac + ;; + esac + fi + if test $gl_cv_func_snprintf_usable = no; then -cat >>confdefs.h <<_ACEOF -#define FLT_SIGNBIT_BIT $bit -_ACEOF - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5 -$as_echo_n "checking where to find the sign bit in a 'double'... " >&6; } -if ${gl_cv_cc_double_signbit+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - gl_cv_cc_double_signbit="unknown" -else + gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" + + if test $ac_cv_func_snprintf = yes; then + REPLACE_SNPRINTF=1 + else + + if test $ac_cv_have_decl_snprintf = yes; then + REPLACE_SNPRINTF=1 + fi + fi + : + + fi + + if test $ac_cv_have_decl_snprintf = no; then + HAVE_DECL_SNPRINTF=0 + fi + + + + + + + + + + + GL_GNULIB_SNPRINTF=1 + + + + + +printf "%s\n" "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h + + + + + +printf "%s\n" "#define GNULIB_SNPRINTF 1" >>confdefs.h + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 +printf %s "checking for ssize_t... " >&6; } +if test ${gt_cv_ssize_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#include -#define NWORDS \ - ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { double value; unsigned int word[NWORDS]; } - memory_float; -static memory_float plus = { 1.0 }; -static memory_float minus = { -1.0 }; -int main () +#include +int +main (void) { - size_t j, k, i; - unsigned int m; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - /* Find the different bit. */ - k = 0; m = 0; - for (j = 0; j < NWORDS; j++) - { - unsigned int x = plus.word[j] ^ minus.word[j]; - if ((x & (x - 1)) || (x && m)) - { - /* More than one bit difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 2; - } - if (x) - { - k = j; - m = x; - } - } - if (m == 0) - { - /* No difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 3; - } - /* Now m = plus.word[k] ^ ~minus.word[k]. */ - if (plus.word[k] & ~minus.word[k]) - { - /* Oh? The sign bit is set in the positive and cleared in the negative - numbers? */ - fprintf (fp, "unknown"); - fclose (fp); - return 4; - } - for (i = 0; ; i++) - if ((m >> i) & 1) - break; - fprintf (fp, "word %d bit %d", (int) k, (int) i); - if (fclose (fp) != 0) - return 5; +int x = sizeof (ssize_t *) + sizeof (ssize_t); + return !x; + ; return 0; } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_double_signbit=`cat conftest.out` -else - gl_cv_cc_double_signbit="unknown" +if ac_fn_c_try_compile "$LINENO" +then : + gt_cv_ssize_t=yes +else $as_nop + gt_cv_ssize_t=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 +printf "%s\n" "$gt_cv_ssize_t" >&6; } + if test $gt_cv_ssize_t = no; then + +printf "%s\n" "#define ssize_t int" >>confdefs.h + + fi + + + + + + if test "$ac_cv_header_stdbool_h" = yes; then + case "$host_os" in + solaris*) + if test -z "$GCC"; then + GL_GENERATE_STDBOOL_H=true + else + GL_GENERATE_STDBOOL_H=false + fi + ;; + *) + GL_GENERATE_STDBOOL_H=false + ;; + esac + else + GL_GENERATE_STDBOOL_H=true + fi + + if test "$ac_cv_type__Bool" = yes; then + HAVE__BOOL=1 + else + HAVE__BOOL=0 + fi + + + + + + + case "$GL_GENERATE_STDBOOL_H" in + false) STDBOOL_H='' ;; + true) + if test -z "$STDBOOL_H"; then + STDBOOL_H="${gl_source_base_prefix}stdbool.h" + fi + ;; + *) echo "*** GL_GENERATE_STDBOOL_H is not set correctly" 1>&2; exit 1 ;; + esac + + + if $GL_GENERATE_STDBOOL_H; then + GL_GENERATE_STDBOOL_H_TRUE= + GL_GENERATE_STDBOOL_H_FALSE='#' +else + GL_GENERATE_STDBOOL_H_TRUE='#' + GL_GENERATE_STDBOOL_H_FALSE= fi +: + if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then + GL_GENERATE_STDBOOL_H_TRUE='#' + GL_GENERATE_STDBOOL_H_FALSE='#' + fi + + - rm -f conftest.out -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5 -$as_echo "$gl_cv_cc_double_signbit" >&6; } - case "$gl_cv_cc_double_signbit" in - word*bit*) - word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'` -cat >>confdefs.h <<_ACEOF -#define DBL_SIGNBIT_WORD $word -_ACEOF -cat >>confdefs.h <<_ACEOF -#define DBL_SIGNBIT_BIT $bit -_ACEOF - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5 -$as_echo_n "checking where to find the sign bit in a 'long double'... " >&6; } -if ${gl_cv_cc_long_double_signbit+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - gl_cv_cc_long_double_signbit="unknown" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#define NWORDS \ - ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) -typedef union { long double value; unsigned int word[NWORDS]; } - memory_float; -static memory_float plus = { 1.0L }; -static memory_float minus = { -1.0L }; -int main () -{ - size_t j, k, i; - unsigned int m; - FILE *fp = fopen ("conftest.out", "w"); - if (fp == NULL) - return 1; - /* Find the different bit. */ - k = 0; m = 0; - for (j = 0; j < NWORDS; j++) - { - unsigned int x = plus.word[j] ^ minus.word[j]; - if ((x & (x - 1)) || (x && m)) - { - /* More than one bit difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 2; - } - if (x) - { - k = j; - m = x; - } - } - if (m == 0) - { - /* No difference. */ - fprintf (fp, "unknown"); - fclose (fp); - return 3; - } - /* Now m = plus.word[k] ^ ~minus.word[k]. */ - if (plus.word[k] & ~minus.word[k]) - { - /* Oh? The sign bit is set in the positive and cleared in the negative - numbers? */ - fprintf (fp, "unknown"); - fclose (fp); - return 4; - } - for (i = 0; ; i++) - if ((m >> i) & 1) - break; - fprintf (fp, "word %d bit %d", (int) k, (int) i); - if (fclose (fp) != 0) - return 5; - return 0; -} + case "$GL_GENERATE_STDDEF_H" in + false) STDDEF_H='' ;; + true) + if test -z "$STDDEF_H"; then + STDDEF_H="${gl_source_base_prefix}stddef.h" + fi + ;; + *) echo "*** GL_GENERATE_STDDEF_H is not set correctly" 1>&2; exit 1 ;; + esac -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_cc_long_double_signbit=`cat conftest.out` + + if $GL_GENERATE_STDDEF_H; then + GL_GENERATE_STDDEF_H_TRUE= + GL_GENERATE_STDDEF_H_FALSE='#' else - gl_cv_cc_long_double_signbit="unknown" -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + GL_GENERATE_STDDEF_H_TRUE='#' + GL_GENERATE_STDDEF_H_FALSE= fi +: + if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then + GL_GENERATE_STDDEF_H_TRUE='#' + GL_GENERATE_STDDEF_H_FALSE='#' + fi - rm -f conftest.out -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5 -$as_echo "$gl_cv_cc_long_double_signbit" >&6; } - case "$gl_cv_cc_long_double_signbit" in - word*bit*) - word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'` - bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'` -cat >>confdefs.h <<_ACEOF -#define LDBL_SIGNBIT_WORD $word -_ACEOF -cat >>confdefs.h <<_ACEOF -#define LDBL_SIGNBIT_BIT $bit -_ACEOF + + + + + + case "$GL_GENERATE_STDINT_H" in + false) STDINT_H='' ;; + true) + if test -z "$STDINT_H"; then + STDINT_H="${gl_source_base_prefix}stdint.h" + fi ;; + *) echo "*** GL_GENERATE_STDINT_H is not set correctly" 1>&2; exit 1 ;; esac - if test "$gl_cv_cc_float_signbit" = unknown; then - ac_fn_c_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include -" -if test "x$ac_cv_have_decl_copysignf" = xyes; then : - ac_have_decl=1 + if $GL_GENERATE_STDINT_H; then + GL_GENERATE_STDINT_H_TRUE= + GL_GENERATE_STDINT_H_FALSE='#' else - ac_have_decl=0 + GL_GENERATE_STDINT_H_TRUE='#' + GL_GENERATE_STDINT_H_FALSE= fi +: + if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then + GL_GENERATE_STDINT_H_TRUE='#' + GL_GENERATE_STDINT_H_FALSE='#' + fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_COPYSIGNF $ac_have_decl -_ACEOF - if test "$ac_cv_have_decl_copysignf" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5 -$as_echo_n "checking whether copysignf can be used without linking with libm... " >&6; } -if ${gl_cv_func_copysignf_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - float x, y; -int -main () -{ -return copysignf (x, y) < 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_copysignf_no_libm=yes -else - gl_cv_func_copysignf_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5 -$as_echo "$gl_cv_func_copysignf_no_libm" >&6; } - if test $gl_cv_func_copysignf_no_libm = yes; then -$as_echo "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h - fi - fi - fi - if test "$gl_cv_cc_double_signbit" = unknown; then - ac_fn_c_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include -" -if test "x$ac_cv_have_decl_copysign" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_COPYSIGN $ac_have_decl -_ACEOF - if test "$ac_cv_have_decl_copysign" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5 -$as_echo_n "checking whether copysign can be used without linking with libm... " >&6; } -if ${gl_cv_func_copysign_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - double x, y; -int -main () -{ -return copysign (x, y) < 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_copysign_no_libm=yes + case "$GL_GENERATE_LIMITS_H" in + false) LIMITS_H='' ;; + true) + if test -z "$LIMITS_H"; then + LIMITS_H="${gl_source_base_prefix}limits.h" + fi + ;; + *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;; + esac + + + if $GL_GENERATE_LIMITS_H; then + GL_GENERATE_LIMITS_H_TRUE= + GL_GENERATE_LIMITS_H_FALSE='#' else - gl_cv_func_copysign_no_libm=no + GL_GENERATE_LIMITS_H_TRUE='#' + GL_GENERATE_LIMITS_H_FALSE= fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +: + if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then + GL_GENERATE_LIMITS_H_TRUE='#' + GL_GENERATE_LIMITS_H_FALSE='#' + fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5 -$as_echo "$gl_cv_func_copysign_no_libm" >&6; } - if test $gl_cv_func_copysign_no_libm = yes; then -$as_echo "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h - fi - fi - fi - if test "$gl_cv_cc_long_double_signbit" = unknown; then - ac_fn_c_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include -" -if test "x$ac_cv_have_decl_copysignl" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_COPYSIGNL $ac_have_decl -_ACEOF - if test "$ac_cv_have_decl_copysignl" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5 -$as_echo_n "checking whether copysignl can be used without linking with libm... " >&6; } -if ${gl_cv_func_copysignl_no_libm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - long double x, y; -int -main () -{ -return copysignl (x, y) < 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - gl_cv_func_copysignl_no_libm=yes -else - gl_cv_func_copysignl_no_libm=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5 -$as_echo "$gl_cv_func_copysignl_no_libm" >&6; } - if test $gl_cv_func_copysignl_no_libm = yes; then -$as_echo "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h - fi - fi - fi - ;; - esac - ;; - esac - if test $REPLACE_SIGNBIT = 1; then + if test $REPLACE_STDIO_READ_FUNCS = 1; then + GL_COND_OBJ_STDIO_READ_TRUE= + GL_COND_OBJ_STDIO_READ_FALSE='#' +else + GL_COND_OBJ_STDIO_READ_TRUE='#' + GL_COND_OBJ_STDIO_READ_FALSE= +fi +: + if test -z "${GL_COND_OBJ_STDIO_READ_TRUE}" && test -z "${GL_COND_OBJ_STDIO_READ_FALSE}"; then + GL_COND_OBJ_STDIO_READ_TRUE='#' + GL_COND_OBJ_STDIO_READ_FALSE='#' + fi + if test $REPLACE_STDIO_WRITE_FUNCS = 1; then + GL_COND_OBJ_STDIO_WRITE_TRUE= + GL_COND_OBJ_STDIO_WRITE_FALSE='#' +else + GL_COND_OBJ_STDIO_WRITE_TRUE='#' + GL_COND_OBJ_STDIO_WRITE_FALSE= +fi +: + if test -z "${GL_COND_OBJ_STDIO_WRITE_TRUE}" && test -z "${GL_COND_OBJ_STDIO_WRITE_FALSE}"; then + GL_COND_OBJ_STDIO_WRITE_TRUE='#' + GL_COND_OBJ_STDIO_WRITE_FALSE='#' + fi - gl_LIBOBJS="$gl_LIBOBJS signbitf.$ac_objext" @@ -16652,266 +22100,83 @@ $as_echo "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h + GL_GNULIB_FSCANF=1 - gl_LIBOBJS="$gl_LIBOBJS signbitd.$ac_objext" +printf "%s\n" "#define GNULIB_TEST_FSCANF 1" >>confdefs.h - gl_LIBOBJS="$gl_LIBOBJS signbitl.$ac_objext" +printf "%s\n" "#define GNULIB_FSCANF 1" >>confdefs.h - fi - GNULIB_SIGNBIT=1 -$as_echo "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h + GL_GNULIB_SCANF=1 - for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 -_ACEOF -fi +printf "%s\n" "#define GNULIB_TEST_SCANF 1" >>confdefs.h -done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 -$as_echo_n "checking for SIZE_MAX... " >&6; } -if ${gl_cv_size_max+:} false; then : - $as_echo_n "(cached) " >&6 -else - gl_cv_size_max= - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if HAVE_STDINT_H -#include -#endif -#ifdef SIZE_MAX -Found it -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Found it" >/dev/null 2>&1; then : - gl_cv_size_max=yes -fi -rm -f conftest* +printf "%s\n" "#define GNULIB_SCANF 1" >>confdefs.h + - if test -z "$gl_cv_size_max"; then - if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include -#include "; then : -else - size_t_bits_minus_1= -fi - if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : -else - fits_in_uint= -fi - if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then - if test $fits_in_uint = 1; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - extern size_t foo; - extern unsigned long foo; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - fits_in_uint=0 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $fits_in_uint = 1; then - gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" - else - gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" - fi - else - gl_cv_size_max='((size_t)~(size_t)0)' - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5 -$as_echo "$gl_cv_size_max" >&6; } - if test "$gl_cv_size_max" != yes; then -cat >>confdefs.h <<_ACEOF -#define SIZE_MAX $gl_cv_size_max -_ACEOF - fi + GL_GNULIB_FGETC=1 - gl_cv_func_snprintf_usable=no - for ac_func in snprintf -do : - ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" -if test "x$ac_cv_func_snprintf" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SNPRINTF 1 -_ACEOF -fi -done +printf "%s\n" "#define GNULIB_TEST_FGETC 1" >>confdefs.h - if test $ac_cv_func_snprintf = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 -$as_echo_n "checking whether snprintf respects a size of 1... " >&6; } -if ${gl_cv_func_snprintf_size1+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on native Windows. - mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; - *) gl_cv_func_snprintf_size1="guessing yes" ;; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if HAVE_SNPRINTF -# define my_snprintf snprintf -#else -# include -static int my_snprintf (char *buf, int size, const char *format, ...) -{ - va_list args; - int ret; - va_start (args, format); - ret = vsnprintf (buf, size, format, args); - va_end (args); - return ret; -} -#endif -int main() -{ - static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; - my_snprintf (buf, 1, "%d", 12345); - return buf[1] != 'E'; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_snprintf_size1=yes -else - gl_cv_func_snprintf_size1=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 -$as_echo "$gl_cv_func_snprintf_size1" >&6; } - case "$gl_cv_func_snprintf_size1" in - *yes) - case "$gl_cv_func_snprintf_retval_c99" in - *yes) + GL_GNULIB_GETC=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 -$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } -if ${gl_cv_func_printf_positions+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) - gl_cv_func_printf_positions="guessing no";; - beos*) gl_cv_func_printf_positions="guessing no";; - # Guess no on native Windows. - mingw* | pw*) gl_cv_func_printf_positions="guessing no";; - *) gl_cv_func_printf_positions="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -/* The string "%2$d %1$d", with dollar characters protected from the shell's - dollar expansion (possibly an autoconf bug). */ -static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; -static char buf[100]; -int main () -{ - sprintf (buf, format, 33, 55); - return (strcmp (buf, "55 33") != 0); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_positions=yes -else - gl_cv_func_printf_positions=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi +printf "%s\n" "#define GNULIB_TEST_GETC 1" >>confdefs.h -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 -$as_echo "$gl_cv_func_printf_positions" >&6; } - case "$gl_cv_func_printf_positions" in - *yes) - gl_cv_func_snprintf_usable=yes - ;; - esac - ;; - esac - ;; - esac - fi - if test $gl_cv_func_snprintf_usable = no; then @@ -16921,169 +22186,53 @@ $as_echo "$gl_cv_func_printf_positions" >&6; } + GL_GNULIB_GETCHAR=1 - gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" - if test $ac_cv_func_snprintf = yes; then - REPLACE_SNPRINTF=1 - else - if test $ac_cv_have_decl_snprintf = yes; then - REPLACE_SNPRINTF=1 - fi - fi - : - fi - if test $ac_cv_have_decl_snprintf = no; then - HAVE_DECL_SNPRINTF=0 - fi +printf "%s\n" "#define GNULIB_TEST_GETCHAR 1" >>confdefs.h - GNULIB_SNPRINTF=1 -$as_echo "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h + GL_GNULIB_FGETS=1 -cat >>confdefs.h <<_ACEOF -#define GNULIB_SNPRINTF 1 -_ACEOF +printf "%s\n" "#define GNULIB_TEST_FGETS 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 -$as_echo_n "checking for ssize_t... " >&6; } -if ${gt_cv_ssize_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int x = sizeof (ssize_t *) + sizeof (ssize_t); - return !x; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gt_cv_ssize_t=yes -else - gt_cv_ssize_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 -$as_echo "$gt_cv_ssize_t" >&6; } - if test $gt_cv_ssize_t = no; then -$as_echo "#define ssize_t int" >>confdefs.h - fi - STDDEF_H= - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5 -$as_echo_n "checking for good max_align_t... " >&6; } -if ${gl_cv_type_max_align_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - unsigned int s = sizeof (max_align_t); - #if defined __GNUC__ || defined __IBM__ALIGNOF__ - int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; - int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; - #endif -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_type_max_align_t=yes -else - gl_cv_type_max_align_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5 -$as_echo "$gl_cv_type_max_align_t" >&6; } - if test $gl_cv_type_max_align_t = no; then - HAVE_MAX_ALIGN_T=0 - STDDEF_H=stddef.h - fi + GL_GNULIB_FREAD=1 - if test $gt_cv_c_wchar_t = no; then - HAVE_WCHAR_T=0 - STDDEF_H=stddef.h - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 -$as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; } -if ${gl_cv_decl_null_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - int test[2 * (sizeof NULL == sizeof (void *)) -1]; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_decl_null_works=yes -else - gl_cv_decl_null_works=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 -$as_echo "$gl_cv_decl_null_works" >&6; } - if test $gl_cv_decl_null_works = no; then - REPLACE_NULL=1 - STDDEF_H=stddef.h - fi +printf "%s\n" "#define GNULIB_TEST_FREAD 1" >>confdefs.h - if test -n "$STDDEF_H"; then - GL_GENERATE_STDDEF_H_TRUE= - GL_GENERATE_STDDEF_H_FALSE='#' -else - GL_GENERATE_STDDEF_H_TRUE='#' - GL_GENERATE_STDDEF_H_FALSE= -fi - if test -n "$STDDEF_H"; then @@ -17092,224 +22241,72 @@ fi - if test $gl_cv_have_include_next = yes; then - gl_cv_next_stddef_h='<'stddef.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_stddef_h+:} false; then : - $as_echo_n "(cached) " >&6 -else + GL_GNULIB_FPRINTF=1 - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'stddef.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_stddef_h - gl_cv_next_stddef_h='"'$gl_header'"' +printf "%s\n" "#define GNULIB_TEST_FPRINTF 1" >>confdefs.h -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 -$as_echo "$gl_cv_next_stddef_h" >&6; } - fi - NEXT_STDDEF_H=$gl_cv_next_stddef_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'stddef.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_stddef_h - fi - NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive - fi - $as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h + GL_GNULIB_PRINTF=1 +printf "%s\n" "#define GNULIB_TEST_PRINTF 1" >>confdefs.h - if test $gl_cv_have_include_next = yes; then - gl_cv_next_stdio_h='<'stdio.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_stdio_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'stdio.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_stdio_h - gl_cv_next_stdio_h='"'$gl_header'"' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5 -$as_echo "$gl_cv_next_stdio_h" >&6; } - fi - NEXT_STDIO_H=$gl_cv_next_stdio_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'stdio.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_stdio_h - fi - NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive + GL_GNULIB_VFPRINTF=1 + +printf "%s\n" "#define GNULIB_TEST_VFPRINTF 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5 -$as_echo_n "checking which flavor of printf attribute matches inttypes macros... " >&6; } -if ${gl_cv_func_printf_attribute_flavor+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - #define __STDC_FORMAT_MACROS 1 - #include - #include - /* For non-mingw systems, compilation will trivially succeed. - For mingw, compilation will succeed for older mingw (system - printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ - #if (defined _WIN32 && ! defined __CYGWIN__) && \ - (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) - extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; - #endif -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_func_printf_attribute_flavor=system -else - gl_cv_func_printf_attribute_flavor=gnu -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5 -$as_echo "$gl_cv_func_printf_attribute_flavor" >&6; } - if test "$gl_cv_func_printf_attribute_flavor" = gnu; then -$as_echo "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h - fi - GNULIB_FSCANF=1 -cat >>confdefs.h <<_ACEOF -#define GNULIB_FSCANF 1 -_ACEOF - GNULIB_SCANF=1 + GL_GNULIB_VPRINTF=1 -cat >>confdefs.h <<_ACEOF -#define GNULIB_SCANF 1 -_ACEOF - GNULIB_FGETC=1 - GNULIB_GETC=1 - GNULIB_GETCHAR=1 - GNULIB_FGETS=1 - GNULIB_FREAD=1 - GNULIB_FPRINTF=1 - GNULIB_PRINTF=1 - GNULIB_VFPRINTF=1 - GNULIB_VPRINTF=1 - GNULIB_FPUTC=1 - GNULIB_PUTC=1 - GNULIB_PUTCHAR=1 - GNULIB_FPUTS=1 - GNULIB_PUTS=1 - GNULIB_FWRITE=1 +printf "%s\n" "#define GNULIB_TEST_VPRINTF 1" >>confdefs.h @@ -17322,115 +22319,70 @@ _ACEOF + GL_GNULIB_FPUTC=1 - if { test "$HAVE_LIBUNISTRING" != yes \ - || { - test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ - || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ - && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ - || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ - && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 - } - } - } +printf "%s\n" "#define GNULIB_TEST_FPUTC 1" >>confdefs.h - } - }; then - LIBUNISTRING_UNITYPES_H='unitypes.h' - else - LIBUNISTRING_UNITYPES_H= - fi - if { test "$HAVE_LIBUNISTRING" != yes \ - || { - test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ - || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ - && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ - || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ - && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4 - } - } - } + GL_GNULIB_PUTC=1 - } - }; then - LIBUNISTRING_UNIWIDTH_H='uniwidth.h' - else - LIBUNISTRING_UNIWIDTH_H= - fi +printf "%s\n" "#define GNULIB_TEST_PUTC 1" >>confdefs.h - if { test "$HAVE_LIBUNISTRING" != yes \ - || { - test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ - || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ - && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ - || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ - && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8 - } - } - } - } - }; then - LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE= - LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' -else - LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' - LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE= -fi + GL_GNULIB_PUTCHAR=1 - if test $ac_cv_func_vasnprintf = no; then +printf "%s\n" "#define GNULIB_TEST_PUTCHAR 1" >>confdefs.h - gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" + GL_GNULIB_FPUTS=1 - gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" +printf "%s\n" "#define GNULIB_TEST_FPUTS 1" >>confdefs.h @@ -17438,23 +22390,20 @@ fi - gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" + GL_GNULIB_PUTS=1 - gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" - if test $ac_cv_func_vasnprintf = yes; then +printf "%s\n" "#define GNULIB_TEST_PUTS 1" >>confdefs.h -$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h - fi @@ -17465,16 +22414,13 @@ $as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h + GL_GNULIB_FWRITE=1 - ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" -if test "x$ac_cv_type_ptrdiff_t" = xyes; then : -else -$as_echo "#define ptrdiff_t long" >>confdefs.h -fi +printf "%s\n" "#define GNULIB_TEST_FWRITE 1" >>confdefs.h @@ -17482,144 +22428,30 @@ fi - fi - gl_cv_func_vsnprintf_usable=no - for ac_func in vsnprintf -do : - ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" -if test "x$ac_cv_func_vsnprintf" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VSNPRINTF 1 -_ACEOF -fi -done - if test $ac_cv_func_vsnprintf = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 -$as_echo_n "checking whether snprintf respects a size of 1... " >&6; } -if ${gl_cv_func_snprintf_size1+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on native Windows. - mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; - *) gl_cv_func_snprintf_size1="guessing yes" ;; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if HAVE_SNPRINTF -# define my_snprintf snprintf -#else -# include -static int my_snprintf (char *buf, int size, const char *format, ...) -{ - va_list args; - int ret; - va_start (args, format); - ret = vsnprintf (buf, size, format, args); - va_end (args); - return ret; -} -#endif -int main() -{ - static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; - my_snprintf (buf, 1, "%d", 12345); - return buf[1] != 'E'; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_snprintf_size1=yes -else - gl_cv_func_snprintf_size1=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 -$as_echo "$gl_cv_func_snprintf_size1" >&6; } - case "$gl_cv_func_snprintf_size1" in - *yes) - case "$gl_cv_func_snprintf_retval_c99" in - *yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 -$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } -if ${gl_cv_func_printf_positions+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - case "$host_os" in - netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) - gl_cv_func_printf_positions="guessing no";; - beos*) gl_cv_func_printf_positions="guessing no";; - # Guess no on native Windows. - mingw* | pw*) gl_cv_func_printf_positions="guessing no";; - *) gl_cv_func_printf_positions="guessing yes";; - esac -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -/* The string "%2$d %1$d", with dollar characters protected from the shell's - dollar expansion (possibly an autoconf bug). */ -static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; -static char buf[100]; -int main () -{ - sprintf (buf, format, 33, 55); - return (strcmp (buf, "55 33") != 0); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_printf_positions=yes -else - gl_cv_func_printf_positions=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 -$as_echo "$gl_cv_func_printf_positions" >&6; } - case "$gl_cv_func_printf_positions" in - *yes) - gl_cv_func_vsnprintf_usable=yes - ;; - esac - ;; - esac - ;; - esac - fi - if test $gl_cv_func_vsnprintf_usable = no; then @@ -17627,25 +22459,30 @@ $as_echo "$gl_cv_func_printf_positions" >&6; } + if { test "$HAVE_LIBUNISTRING" != yes \ + || { - gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext" + test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ + || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ + && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ + || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ + && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11 + } + } + } - if test $ac_cv_func_vsnprintf = yes; then - REPLACE_VSNPRINTF=1 - else - if test $ac_cv_have_decl_vsnprintf = yes; then - REPLACE_VSNPRINTF=1 - fi - fi - : - fi - if test $ac_cv_have_decl_vsnprintf = no; then - HAVE_DECL_VSNPRINTF=0 + } + }; then + if test -z "$LIBUNISTRING_UNITYPES_H"; then + LIBUNISTRING_UNITYPES_H="${gl_source_base_prefix}unitypes.h" + fi + else + LIBUNISTRING_UNITYPES_H= fi @@ -17653,112 +22490,94 @@ $as_echo "$gl_cv_func_printf_positions" >&6; } - GNULIB_VSNPRINTF=1 + if { test "$HAVE_LIBUNISTRING" != yes \ + || { + test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ + || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ + && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ + || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ + && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11 + } + } + } -$as_echo "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h + } + }; then + if test -z "$LIBUNISTRING_UNIWIDTH_H"; then + LIBUNISTRING_UNIWIDTH_H="${gl_source_base_prefix}uniwidth.h" + fi + else + LIBUNISTRING_UNIWIDTH_H= + fi + if { test "$HAVE_LIBUNISTRING" != yes \ + || { + test $LIBUNISTRING_VERSION_MAJOR -lt 1 \ + || { test $LIBUNISTRING_VERSION_MAJOR -eq 1 \ + && { test $LIBUNISTRING_VERSION_MINOR -lt 1 \ + || { test $LIBUNISTRING_VERSION_MINOR -eq 1 \ + && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0 + } + } + } - if test $gl_cv_have_include_next = yes; then - gl_cv_next_wchar_h='<'wchar.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_wchar_h+:} false; then : - $as_echo_n "(cached) " >&6 + } + }; then + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE= + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' else + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE= +fi +: + if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' + LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' + fi - if test $ac_cv_header_wchar_h = yes; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac + if test $ac_cv_func_vasnprintf = no; then + + + + - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'wchar.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` - gl_header=$gl_cv_absolute_wchar_h - gl_cv_next_wchar_h='"'$gl_header'"' - else - gl_cv_next_wchar_h='<'wchar.h'>' - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5 -$as_echo "$gl_cv_next_wchar_h" >&6; } - fi - NEXT_WCHAR_H=$gl_cv_next_wchar_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'wchar.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_wchar_h - fi - NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive + gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" - if test $ac_cv_header_wchar_h = yes; then - HAVE_WCHAR_H=1 - else - HAVE_WCHAR_H=0 - fi - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else - HAVE_WINT_T=0 - fi + gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" @@ -17768,22 +22587,22 @@ $as_echo "$gl_cv_next_wchar_h" >&6; } + gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" - if test $ac_cv_func_iswcntrl = yes; then - HAVE_ISWCNTRL=1 - else - HAVE_ISWCNTRL=0 - fi - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else - HAVE_WINT_T=0 + + + gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" + + if test $ac_cv_func_vasnprintf = yes; then + +printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h + fi @@ -17794,129 +22613,146 @@ $as_echo "$gl_cv_next_wchar_h" >&6; } + ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = xyes +then : +else $as_nop +printf "%s\n" "#define ptrdiff_t long" >>confdefs.h - if test $gl_cv_have_include_next = yes; then - gl_cv_next_wctype_h='<'wctype.h'>' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 -$as_echo_n "checking absolute name of ... " >&6; } -if ${gl_cv_next_wctype_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +fi - if test $ac_cv_header_wctype_h = yes; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF - case "$host_os" in - aix*) gl_absname_cpp="$ac_cpp -C" ;; - *) gl_absname_cpp="$ac_cpp" ;; - esac - case "$host_os" in - mingw*) - gl_dirsep_regex='[/\\]' - ;; - *) - gl_dirsep_regex='\/' - ;; - esac - gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' - gl_header_literal_regex=`echo 'wctype.h' \ - | sed -e "$gl_make_literal_regex_sed"` - gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ - s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ - s|^/[^/]|//&| - p - q - }' - gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | - sed -n "$gl_absolute_header_sed"` + fi + - gl_header=$gl_cv_absolute_wctype_h - gl_cv_next_wctype_h='"'$gl_header'"' - else - gl_cv_next_wctype_h='<'wctype.h'>' - fi + gl_cv_func_vsnprintf_usable=no + ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = xyes +then : + printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5 -$as_echo "$gl_cv_next_wctype_h" >&6; } - fi - NEXT_WCTYPE_H=$gl_cv_next_wctype_h - if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' - gl_next_as_first_directive='<'wctype.h'>' - else - # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' - gl_next_as_first_directive=$gl_cv_next_wctype_h - fi - NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive + if test $ac_cv_func_vsnprintf = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 +printf %s "checking whether snprintf respects a size of 1... " >&6; } +if test ${gl_cv_func_snprintf_size1+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test $ac_cv_header_wctype_h = yes; then - if test $ac_cv_func_iswcntrl = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5 -$as_echo_n "checking whether iswcntrl works... " >&6; } -if ${gl_cv_func_iswcntrl_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test "$cross_compiling" = yes +then : + case "$host_os" in + # Guess yes on Android. + linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; + *) gl_cv_func_snprintf_size1="guessing yes" ;; + esac - if test "$cross_compiling" = yes; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - #if __GNU_LIBRARY__ == 1 - Linux libc5 i18n is broken. - #endif -int -main () -{ - ; - return 0; +#include +#if HAVE_SNPRINTF +# define my_snprintf snprintf +#else +# include +static int my_snprintf (char *buf, int size, const char *format, ...) +{ + va_list args; + int ret; + va_start (args, format); + ret = vsnprintf (buf, size, format, args); + va_end (args); + return ret; +} +#endif +int main() +{ + static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; + my_snprintf (buf, 1, "%d", 12345); + return buf[1] != 'E'; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_func_iswcntrl_works="guessing yes" -else - gl_cv_func_iswcntrl_works="guessing no" +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_snprintf_size1=yes +else $as_nop + gl_cv_func_snprintf_size1=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 +printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; } + + case "$gl_cv_func_snprintf_size1" in + *yes) + + case "$gl_cv_func_snprintf_retval_c99" in + *yes) + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 +printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } +if test ${gl_cv_func_printf_positions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + if test "$cross_compiling" = yes +then : + + case "$host_os" in + netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) + gl_cv_func_printf_positions="guessing no";; + beos*) gl_cv_func_printf_positions="guessing no";; + # Guess yes on Android. + linux*-android*) gl_cv_func_printf_positions="guessing yes";; + # Guess no on native Windows. + mingw* | pw*) gl_cv_func_printf_positions="guessing no";; + *) gl_cv_func_printf_positions="guessing yes";; + esac + +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - /* Tru64 with Desktop Toolkit C has a bug: must be - included before . - BSD/OS 4.0.1 has a bug: , and - must be included before . */ - #include - #include - #include - #include - #include - int main () { return iswprint ('x') == 0; } - +#include +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_iswcntrl_works=yes -else - gl_cv_func_iswcntrl_works=no +if ac_fn_c_try_run "$LINENO" +then : + gl_cv_func_printf_positions=yes +else $as_nop + gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -17924,159 +22760,79 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5 -$as_echo "$gl_cv_func_iswcntrl_works" >&6; } - fi - HAVE_WCTYPE_H=1 - else - HAVE_WCTYPE_H=0 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 +printf "%s\n" "$gl_cv_func_printf_positions" >&6; } + + case "$gl_cv_func_printf_positions" in + *yes) + gl_cv_func_vsnprintf_usable=yes + ;; + esac + ;; + esac + ;; + esac fi + if test $gl_cv_func_vsnprintf_usable = no; then - case "$gl_cv_func_iswcntrl_works" in - *yes) REPLACE_ISWCNTRL=0 ;; - *) REPLACE_ISWCNTRL=1 ;; - esac - if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then - : - fi - if test $REPLACE_ISWCNTRL = 1; then - REPLACE_TOWLOWER=1 - else - for ac_func in towlower -do : - ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" -if test "x$ac_cv_func_towlower" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TOWLOWER 1 -_ACEOF -fi -done - if test $ac_cv_func_towlower = yes; then - REPLACE_TOWLOWER=0 - else - ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: must be - included before . - BSD/OS 4.0.1 has a bug: , and - must be included before . */ - #include - #include - #include - #include - #if HAVE_WCTYPE_H - # include - #endif -" -if test "x$ac_cv_have_decl_towlower" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_TOWLOWER $ac_have_decl -_ACEOF - if test $ac_cv_have_decl_towlower = yes; then - REPLACE_TOWLOWER=1 - else - REPLACE_TOWLOWER=0 - fi + gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext" + + if test $ac_cv_func_vsnprintf = yes; then + REPLACE_VSNPRINTF=1 + else + + if test $ac_cv_have_decl_vsnprintf = yes; then + REPLACE_VSNPRINTF=1 fi fi + : + + fi + + if test $ac_cv_have_decl_vsnprintf = no; then + HAVE_DECL_VSNPRINTF=0 + fi + + + + + + + + + + + GL_GNULIB_VSNPRINTF=1 + + + + + +printf "%s\n" "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h + + + + + - if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then - : - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5 -$as_echo_n "checking for wctype_t... " >&6; } -if ${gl_cv_type_wctype_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Tru64 with Desktop Toolkit C has a bug: must be - included before . - BSD/OS 4.0.1 has a bug: , and - must be included before . */ - #include - #include - #include - #include - #if HAVE_WCTYPE_H - # include - #endif - wctype_t a; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_type_wctype_t=yes -else - gl_cv_type_wctype_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5 -$as_echo "$gl_cv_type_wctype_t" >&6; } - if test $gl_cv_type_wctype_t = no; then - HAVE_WCTYPE_T=0 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5 -$as_echo_n "checking for wctrans_t... " >&6; } -if ${gl_cv_type_wctrans_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Tru64 with Desktop Toolkit C has a bug: must be - included before . - BSD/OS 4.0.1 has a bug: , and - must be included before . */ - #include - #include - #include - #include - #include - wctrans_t a; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_type_wctrans_t=yes -else - gl_cv_type_wctrans_t=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5 -$as_echo "$gl_cv_type_wctrans_t" >&6; } - if test $gl_cv_type_wctrans_t = no; then - HAVE_WCTRANS_T=0 - fi @@ -18093,39 +22849,31 @@ $as_echo "$gl_cv_type_wctrans_t" >&6; } - ac_fn_c_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" " -/* AIX 3.2.5 declares wcwidth in . */ -#include -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be included - before . */ -#include -#include -#include -#include -" -if test "x$ac_cv_have_decl_wcwidth" = xyes; then : + + ac_fn_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" " + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_wcwidth" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_WCWIDTH $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DECL_WCWIDTH $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_wcwidth != yes; then HAVE_DECL_WCWIDTH=0 fi if test $ac_cv_func_wcwidth != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5 -$as_echo_n "checking whether wcwidth is a macro... " >&6; } -if ${gl_cv_func_wcwidth_macro+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5 +printf %s "checking whether wcwidth is a macro... " >&6; } +if test ${gl_cv_func_wcwidth_macro+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18135,49 +22883,47 @@ else #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1; then : + $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1 +then : gl_cv_func_wcwidth_macro=yes -else +else $as_nop gl_cv_func_wcwidth_macro=no fi -rm -f conftest* +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5 -$as_echo "$gl_cv_func_wcwidth_macro" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5 +printf "%s\n" "$gl_cv_func_wcwidth_macro" >&6; } fi if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then HAVE_WCWIDTH=1 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5 -$as_echo_n "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; } -if ${gl_cv_func_wcwidth_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5 +printf %s "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; } +if test ${gl_cv_func_wcwidth_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case "$host_os" in - # Guess yes on glibc and AIX 7 systems. - *-gnu* | gnu* | aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; - *) gl_cv_func_wcwidth_works="guessing no";; + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";; + # Guess yes on musl systems. + *-musl*) gl_cv_func_wcwidth_works="guessing yes";; + # Guess yes on AIX 7 systems. + aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; + *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -/* AIX 3.2.5 declares wcwidth in . */ -#include -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be included - before . */ -#include -#include -#include #include #if !HAVE_DECL_WCWIDTH extern @@ -18189,7 +22935,7 @@ int wcwidth (int); int main () { int result = 0; - if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL) + if (setlocale (LC_ALL, "en_US.UTF-8") != NULL) { if (wcwidth (0x0301) > 0) result |= 1; @@ -18199,13 +22945,16 @@ int main () result |= 4; if (wcwidth (0xFF1A) == 0) result |= 8; + if (wcwidth (0x2202) > 1) + result |= 16; } return result; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : gl_cv_func_wcwidth_works=yes -else +else $as_nop gl_cv_func_wcwidth_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -18214,8 +22963,8 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5 -$as_echo "$gl_cv_func_wcwidth_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5 +printf "%s\n" "$gl_cv_func_wcwidth_works" >&6; } case "$gl_cv_func_wcwidth_works" in *yes) ;; *no) REPLACE_WCWIDTH=1 ;; @@ -18224,50 +22973,60 @@ $as_echo "$gl_cv_func_wcwidth_works" >&6; } HAVE_WCWIDTH=0 fi - if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then + + if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then + GL_COND_OBJ_WCWIDTH_TRUE= + GL_COND_OBJ_WCWIDTH_FALSE='#' +else + GL_COND_OBJ_WCWIDTH_TRUE='#' + GL_COND_OBJ_WCWIDTH_FALSE= +fi +: + if test -z "${GL_COND_OBJ_WCWIDTH_TRUE}" && test -z "${GL_COND_OBJ_WCWIDTH_FALSE}"; then + GL_COND_OBJ_WCWIDTH_TRUE='#' + GL_COND_OBJ_WCWIDTH_FALSE='#' + fi + + if test -z "$GL_COND_OBJ_WCWIDTH_TRUE"; then : + : +fi - gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext" - : - fi - GNULIB_WCWIDTH=1 + GL_GNULIB_WCWIDTH=1 -$as_echo "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h +printf "%s\n" "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h - for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 -_ACEOF -fi -done + ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h + +fi # End of code from modules @@ -18280,6 +23039,8 @@ done + + gltests_libdeps= gltests_ltlibdeps= @@ -18291,7 +23052,11 @@ done + + + gl_source_base='tests' + gl_source_base_prefix= gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gltests_WITNESS @@ -18304,6 +23069,9 @@ done + + + LIBGNU_LIBDEPS="$gl_libdeps" LIBGNU_LTLIBDEPS="$gl_ltlibdeps" @@ -18318,12 +23086,13 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$cross_compiling" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking that C++ compiler can compile simple program" >&5 -$as_echo_n "checking that C++ compiler can compile simple program... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that C++ compiler can compile simple program" >&5 +printf %s "checking that C++ compiler can compile simple program... " >&6; } fi - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : : -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18336,12 +23105,13 @@ int main() { _ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_cxx_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "a working C++ compiler is required" "$LINENO" 5 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -18350,12 +23120,13 @@ fi if test "$cross_compiling" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking that C++ static constructors and destructors are called" >&5 -$as_echo_n "checking that C++ static constructors and destructors are called... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that C++ static constructors and destructors are called" >&5 +printf %s "checking that C++ static constructors and destructors are called... " >&6; } fi - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : : -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18382,12 +23153,13 @@ int main() _ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_cxx_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "a working C++ compiler is required" "$LINENO" 5 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -18395,8 +23167,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking that header files support C++" >&5 -$as_echo_n "checking that header files support C++... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that header files support C++" >&5 +printf %s "checking that header files support C++... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18406,7 +23178,7 @@ $as_echo_n "checking that header files support C++... " >&6; } int -main () +main (void) { @@ -18418,17 +23190,18 @@ fopen(0, 0); } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_cxx_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "header files do not support C++ (if you are using a version of gcc/g++ earlier than 2.5, you should install libg++)" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -18436,8 +23209,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether character set is EBCDIC" >&5 -$as_echo_n "checking whether character set is EBCDIC... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether character set is EBCDIC" >&5 +printf %s "checking whether character set is EBCDIC... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18452,7 +23225,7 @@ make an error "Character set is not EBCDIC" int -main () +main (void) { ; @@ -18460,56 +23233,58 @@ main () } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : groff_cv_ebcdic="yes" TTYDEVDIRS="font/devcp1047" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define IS_EBCDIC_HOST 1" >>confdefs.h +printf "%s\n" "#define IS_EBCDIC_HOST 1" >>confdefs.h -else +else $as_nop groff_cv_ebcdic="no" TTYDEVDIRS="font/devascii font/devlatin1" OTHERDEVDIRS="font/devlj4 font/devlbp" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test "$groff_cv_ebcdic" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OS/390 Unix" >&5 -$as_echo_n "checking for OS/390 Unix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OS/390 Unix" >&5 +printf %s "checking for OS/390 Unix... " >&6; } case `uname` in OS/390) CFLAGS="$CFLAGS -D_ALL_SOURCE" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install .cmd wrapper scripts for Windows" >&5 -$as_echo_n "checking whether to install .cmd wrapper scripts for Windows... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to install .cmd wrapper scripts for Windows" >&5 +printf %s "checking whether to install .cmd wrapper scripts for Windows... " >&6; } case "$host_os" in *mingw*) make_winscripts=winscripts - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; *) make_winscripts= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 -$as_echo_n "checking for X... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +printf %s "checking for X... " >&6; } # Check whether --with-x was given. -if test "${with_x+set}" = set; then : +if test ${with_x+y} +then : withval=$with_x; fi @@ -18520,12 +23295,41 @@ if test "x$with_x" = xno; then else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( - *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : - $as_echo_n "(cached) " >&6 -else + *,NONE | NONE,*) if test ${ac_cv_have_x+y} +then : + printf %s "(cached) " >&6 +else $as_nop # One or both of the vars are not set, and there is no cached value. -ac_x_includes=no ac_x_libraries=no -rm -f -r conftest.dir +ac_x_includes=no +ac_x_libraries=no +# Do we need to do anything special at all? +ac_save_LIBS=$LIBS +LIBS="-lX11 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + # We can compile and link X programs with no special options. + ac_x_includes= + ac_x_libraries= +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS="$ac_save_LIBS" +# If that didn't work, only try xmkmf and file system searches +# for native compilation. +if test x"$ac_x_includes" = xno && test "$cross_compiling" = no +then : + rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' @@ -18564,7 +23368,7 @@ _ACEOF rm -f -r conftest.dir fi -# Standard set of common directories for X headers. + # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include @@ -18591,6 +23395,8 @@ ac_x_header_dirs=' /usr/local/include/X11R5 /usr/local/include/X11R4 +/opt/X11/include + /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 @@ -18612,10 +23418,11 @@ if test "$ac_x_includes" = no; then /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : # We can compile using X headers with no special include directory. ac_x_includes= -else +else $as_nop for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir @@ -18636,20 +23443,21 @@ if test "$ac_x_libraries" = no; then /* end confdefs.h. */ #include int -main () +main (void) { XrmInitialize () ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= -else +else $as_nop LIBS=$ac_save_LIBS -for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +for ac_dir in `printf "%s\n" "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do @@ -18660,19 +23468,21 @@ do done done fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no +fi +# Record the results. case $ac_x_includes,$ac_x_libraries in #( - no,* | *,no | *\'*) + no,* | *,no | *\'*) : # Didn't find X, or a directory has "'" in its name. - ac_cv_have_x="have_x=no";; #( - *) + ac_cv_have_x="have_x=no" ;; #( + *) : # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ - ac_x_libraries='$ac_x_libraries'" + ac_x_libraries='$ac_x_libraries'" ;; esac fi ;; #( @@ -18682,8 +23492,8 @@ fi fi # $with_x != no if test "$have_x" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 -$as_echo "$have_x" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +printf "%s\n" "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. @@ -18693,14 +23503,14 @@ else ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 -$as_echo "libraries $x_libraries, headers $x_includes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +printf "%s\n" "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. -$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h +printf "%s\n" "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else @@ -18713,8 +23523,8 @@ else X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 -$as_echo_n "checking whether -R must be followed by a space... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +printf %s "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes @@ -18722,42 +23532,44 @@ $as_echo_n "checking whether -R must be followed by a space... " >&6; } /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" -else +else $as_nop LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 -$as_echo "neither works" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +printf "%s\n" "neither works" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS @@ -18780,26 +23592,25 @@ rm -f core conftest.err conftest.$ac_objext \ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char XOpenDisplay (); int -main () +main (void) { return XOpenDisplay (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } -if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +printf %s "checking for dnet_ntoa in -ldnet... " >&6; } +if test ${ac_cv_lib_dnet_dnet_ntoa+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18808,39 +23619,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dnet_ntoa (); int -main () +main (void) { return dnet_ntoa (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dnet_dnet_ntoa=yes -else +else $as_nop ac_cv_lib_dnet_dnet_ntoa=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +printf "%s\n" "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } -if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +printf %s "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if test ${ac_cv_lib_dnet_stub_dnet_ntoa+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18849,36 +23660,35 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dnet_ntoa (); int -main () +main (void) { return dnet_ntoa (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dnet_stub_dnet_ntoa=yes -else +else $as_nop ac_cv_lib_dnet_stub_dnet_ntoa=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +printf "%s\n" "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" @@ -18891,16 +23701,18 @@ rm -f core conftest.err conftest.$ac_objext \ # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = xyes; then : +if test "x$ac_cv_func_gethostbyname" = xyes +then : fi if test $ac_cv_func_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if ${ac_cv_lib_nsl_gethostbyname+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +printf %s "checking for gethostbyname in -lnsl... " >&6; } +if test ${ac_cv_lib_nsl_gethostbyname+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18909,39 +23721,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char gethostbyname (); int -main () +main (void) { return gethostbyname (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_nsl_gethostbyname=yes -else +else $as_nop ac_cv_lib_nsl_gethostbyname=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +printf "%s\n" "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 -$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } -if ${ac_cv_lib_bsd_gethostbyname+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +printf %s "checking for gethostbyname in -lbsd... " >&6; } +if test ${ac_cv_lib_bsd_gethostbyname+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18950,30 +23762,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char gethostbyname (); int -main () +main (void) { return gethostbyname (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_bsd_gethostbyname=yes -else +else $as_nop ac_cv_lib_bsd_gethostbyname=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 -$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } -if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +printf "%s\n" "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi @@ -18988,16 +23799,18 @@ fi # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" -if test "x$ac_cv_func_connect" = xyes; then : +if test "x$ac_cv_func_connect" = xyes +then : fi if test $ac_cv_func_connect = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 -$as_echo_n "checking for connect in -lsocket... " >&6; } -if ${ac_cv_lib_socket_connect+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +printf %s "checking for connect in -lsocket... " >&6; } +if test ${ac_cv_lib_socket_connect+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -19006,30 +23819,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char connect (); int -main () +main (void) { return connect (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_socket_connect=yes -else +else $as_nop ac_cv_lib_socket_connect=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 -$as_echo "$ac_cv_lib_socket_connect" >&6; } -if test "x$ac_cv_lib_socket_connect" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +printf "%s\n" "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes +then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi @@ -19037,16 +23849,18 @@ fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" -if test "x$ac_cv_func_remove" = xyes; then : +if test "x$ac_cv_func_remove" = xyes +then : fi if test $ac_cv_func_remove = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 -$as_echo_n "checking for remove in -lposix... " >&6; } -if ${ac_cv_lib_posix_remove+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +printf %s "checking for remove in -lposix... " >&6; } +if test ${ac_cv_lib_posix_remove+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -19055,30 +23869,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char remove (); int -main () +main (void) { return remove (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_posix_remove=yes -else +else $as_nop ac_cv_lib_posix_remove=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 -$as_echo "$ac_cv_lib_posix_remove" >&6; } -if test "x$ac_cv_lib_posix_remove" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +printf "%s\n" "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi @@ -19086,16 +23899,18 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = xyes; then : +if test "x$ac_cv_func_shmat" = xyes +then : fi if test $ac_cv_func_shmat = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 -$as_echo_n "checking for shmat in -lipc... " >&6; } -if ${ac_cv_lib_ipc_shmat+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +printf %s "checking for shmat in -lipc... " >&6; } +if test ${ac_cv_lib_ipc_shmat+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -19104,30 +23919,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char shmat (); int -main () +main (void) { return shmat (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_ipc_shmat=yes -else +else $as_nop ac_cv_lib_ipc_shmat=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 -$as_echo "$ac_cv_lib_ipc_shmat" >&6; } -if test "x$ac_cv_lib_ipc_shmat" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +printf "%s\n" "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes +then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi @@ -19143,11 +23957,12 @@ fi # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 -$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } -if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +printf %s "checking for IceConnectionNumber in -lICE... " >&6; } +if test ${ac_cv_lib_ICE_IceConnectionNumber+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -19156,30 +23971,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char IceConnectionNumber (); int -main () +main (void) { return IceConnectionNumber (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_ICE_IceConnectionNumber=yes -else +else $as_nop ac_cv_lib_ICE_IceConnectionNumber=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 -$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } -if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +printf "%s\n" "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes +then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi @@ -19188,19 +24002,21 @@ fi fi - groff_no_x=$no_x - if test -z "$groff_no_x"; then - OLDCFLAGS=$CFLAGS - OLDLDFLAGS=$LDFLAGS - OLDLIBS=$LIBS - CFLAGS="$CFLAGS $X_CFLAGS" - LDFLAGS="$LDFLAGS $X_LIBS" - LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" - LIBS="$LIBS -lXaw" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xaw library and header files" >&5 -$as_echo_n "checking for Xaw library and header files... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + groff_no_x=$no_x + if test -z "$groff_no_x" + then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xaw library and header files" >&5 +printf %s "checking for Xaw library and header files... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19210,7 +24026,7 @@ $as_echo_n "checking for Xaw library and header files... " >&6; } int -main () +main (void) { ; @@ -19218,21 +24034,22 @@ main () } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - groff_no_x="yes" +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + groff_no_x=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LIBS="$LIBS -lXmu" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xmu library and header files" >&5 -$as_echo_n "checking for Xmu library and header files... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + LIBS="$LIBS -lXmu" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xmu library and header files" >&5 +printf %s "checking for Xmu library and header files... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19242,7 +24059,7 @@ $as_echo_n "checking for Xmu library and header files... " >&6; } int -main () +main (void) { ; @@ -19250,77 +24067,67 @@ main () } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - groff_no_x="yes" +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + groff_no_x=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - CFLAGS=$OLDCFLAGS - LDFLAGS=$OLDLDFLAGS - LIBS=$OLDLIBS - fi + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if ! test "$groff_no_x" = yes + then + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + - if test "x$groff_no_x" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: gxditview and xtotroff won't be built" >&5 -$as_echo "$as_me: gxditview and xtotroff won't be built" >&6;} - else - XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" - XPROGDIRS="src/devices/xditview src/utils/xtotroff" - XLIBDIRS="src/libs/libxutil" - fi -# Check whether --with-appresdir was given. -if test "${with_appresdir+set}" = set; then : - withval=$with_appresdir; +# Check whether --with-appdefdir was given. +if test ${with_appdefdir+y} +then : + withval=$with_appdefdir; fi + if test -z "$groff_no_x"; then - if test "x$with_appresdir" = "x"; then - if test "x$prefix" = "xNONE"; then - appresdir=$ac_default_prefix/lib/X11/app-defaults + if test -z "$with_appdefdir"; then + if test "$prefix" = NONE; then + appdefdir=$ac_default_prefix/lib/X11/app-defaults else - appresdir=$prefix/lib/X11/app-defaults + appdefdir=$prefix/lib/X11/app-defaults fi else - appresdir=$with_appresdir + appdefdir=$with_appdefdir fi fi libprogramdir=$libdir/groff - -# Check whether --with-grofferdir was given. -if test "${with_grofferdir+set}" = set; then : - withval=$with_grofferdir; -fi - -if test "x$with_grofferdir" = "x"; then - groffer_dir=$libprogramdir/groffer - else - groffer_dir=$with_grofferdir - fi - glilypond_dir=$libprogramdir/glilypond gpinyin_dir=$libprogramdir/gpinyin -grog_dir=$libprogramdir/grog - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -19334,10 +24141,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -19346,13 +24158,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" + printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -19380,19 +24192,21 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed -PERLVERSION=v5.6.1 - # Extract the first word of "perl", so it can be a program name with args. + + PERLVERSION=v5.6.1 + # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PERL+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. @@ -19402,11 +24216,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19419,27 +24237,29 @@ esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 -$as_echo "$PERL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +printf "%s\n" "$PERL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$PERL" = "xno"; then - as_fn_error 1 "perl binary not found" "$LINENO" 5 - fi + if test "$PERL" = no + then + as_fn_error 1 "perl binary not found" "$LINENO" 5 + fi - if test -n "$PERL"; then : + if test -n "$PERL" +then : ax_perl_version="$PERLVERSION" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl version" >&5 -$as_echo_n "checking for perl version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for perl version" >&5 +printf %s "checking for perl version... " >&6; } perl_version=`$PERL --version 2>&1 \ | $SED -n -e '/This is perl/b inspect @@ -19447,8 +24267,8 @@ b : inspect s/.* (\{0,1\}v\([0-9]*\.[0-9]*\.[0-9]*\))\{0,1\} .*/\1/;p'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_version" >&5 -$as_echo "$perl_version" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $perl_version" >&5 +printf "%s\n" "$perl_version" >&6; } PERL_VERSION=$perl_version @@ -19491,31 +24311,34 @@ x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A} else : - \ - as_fn_error 1 "perl version is too old" "$LINENO" 5 + as_fn_error 1 "perl version is too old" "$LINENO" 5 fi -else +else $as_nop - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find the perl interpreter" >&5 -$as_echo "$as_me: WARNING: could not find the perl interpreter" >&2;} - \ - as_fn_error 1 "perl version is too old" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: could not find the perl interpreter" >&5 +printf "%s\n" "$as_me: WARNING: could not find the perl interpreter" >&2;} + as_fn_error 1 "perl version is too old" "$LINENO" 5 fi -if test -z "$PSPRINT"; then - for ac_prog in lpr + + + groff_have_spooler=no + if test -z "$PSPRINT" + then + for ac_prog in lpr do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LPR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LPR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LPR"; then ac_cv_prog_LPR="$LPR" # Let the user override the test. else @@ -19523,11 +24346,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LPR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19538,26 +24365,27 @@ fi fi LPR=$ac_cv_prog_LPR if test -n "$LPR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LPR" >&5 -$as_echo "$LPR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LPR" >&5 +printf "%s\n" "$LPR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -n "$LPR" && break done - for ac_prog in lp + for ac_prog in lp do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LP"; then ac_cv_prog_LP="$LP" # Let the user override the test. else @@ -19565,11 +24393,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19580,30 +24412,32 @@ fi fi LP=$ac_cv_prog_LP if test -n "$LP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LP" >&5 -$as_echo "$LP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LP" >&5 +printf "%s\n" "$LP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -n "$LP" && break done - if test -n "$LPR" && test -n "$LP"; then - # HP-UX provides an lpr command that emulates lpr using lp, - # but it doesn't have lpq; in this case we want to use lp - # rather than lpr. - for ac_prog in lpq + if test -n "$LPR" && test -n "$LP" + then + # HP-UX provides an lpr command that emulates lpr using lp, + # but it doesn't have lpq; in this case we want to use lp + # rather than lpr. + for ac_prog in lpq do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LPQ+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LPQ+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LPQ"; then ac_cv_prog_LPQ="$LPQ" # Let the user override the test. else @@ -19611,11 +24445,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LPQ="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19626,52 +24464,60 @@ fi fi LPQ=$ac_cv_prog_LPQ if test -n "$LPQ"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LPQ" >&5 -$as_echo "$LPQ" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LPQ" >&5 +printf "%s\n" "$LPQ" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -n "$LPQ" && break done - test -n "$LPQ" || LPR= - fi - if test -n "$LPR"; then - PSPRINT="$LPR" - elif test -n "$LP"; then - PSPRINT="$LP" - fi - fi + test -n "$LPQ" || LPR= + fi + if test -n "$LPR" + then + PSPRINT="$LPR" + elif test -n "$LP" + then + PSPRINT="$LP" + fi + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for command to use for printing PostScript files" >&5 -$as_echo_n "checking for command to use for printing PostScript files... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PSPRINT" >&5 -$as_echo "$PSPRINT" >&6; } - - # Figure out DVIPRINT from PSPRINT. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for command to use for printing dvi files" >&5 -$as_echo_n "checking for command to use for printing dvi files... " >&6; } - if test -n "$PSPRINT" && test -z "$DVIPRINT"; then - if test "x$PSPRINT" = "xlpr"; then - DVIPRINT="lpr -d" - else - DVIPRINT="$PSPRINT" - fi - fi + if test -n "$PSPRINT" + then + groff_have_spooler="$PSPRINT" + + # Figure out DVIPRINT from PSPRINT. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking option to use when spooling DVI files" >&5 +printf %s "checking option to use when spooling DVI files... " >&6; } + spooler_option=none + if test -n "$PSPRINT" && test -z "$DVIPRINT" + then + if test "$PSPRINT" = lpr + then + spooler_option=-d + DVIPRINT="$PSPRINT $spooler_option" + else + DVIPRINT="$PSPRINT" + fi + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $spooler_option" >&5 +printf "%s\n" "$spooler_option" >&6; } + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DVIPRINT" >&5 -$as_echo "$DVIPRINT" >&6; } # GROFF_REFER referdir=$libprogramdir/refer -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else @@ -19682,10 +24528,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP @@ -19694,13 +24545,13 @@ case `"$ac_path_EGREP" --version 2>&1` in ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -19729,32 +24580,95 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -for ac_prog in byacc 'bison -y' yacc + + for ac_prog in byacc 'bison -y' yacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_YACC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +printf "%s\n" "$YACC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="missing" + + if ! test -f "$srcdir"/.tarball-version + then + if test "$YACC" = missing + then + as_fn_error 1 "could not find 'byacc', 'bison', or 'yacc'" "$LINENO" 5 + fi + fi + + + for ac_prog in m4 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_YACC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_M4+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$M4"; then + ac_cv_prog_M4="$M4" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_YACC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_M4="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19763,110 +24677,39 @@ IFS=$as_save_IFS fi fi -YACC=$ac_cv_prog_YACC -if test -n "$YACC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 -$as_echo "$YACC" >&6; } +M4=$ac_cv_prog_M4 +if test -n "$M4"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $M4" >&5 +printf "%s\n" "$M4" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - test -n "$YACC" && break + test -n "$M4" && break done -test -n "$YACC" || YACC="missing" - - if test "x$YACC" = "xmissing" -a -d ${srcdir}/.git; then - as_fn_error 1 "Could not find 'yacc' or 'bison'" "$LINENO" 5 - fi - - -# Check whether --with-doc was given. -if test "${with_doc+set}" = set; then : - withval=$with_doc; doc="$withval" -else - doc=yes -fi +test -n "$M4" || M4="missing" - test "x$doc" = xno && doc='' - if test "x$doc" = xyes; then - doc_dist_target_ok=yes - docadd_html=yes - docadd_info=yes - docadd_other=yes - docadd_pdf=yes - docadd_examples=yes - else - # Don't use case/esac, verify input. - doc_dist_target_ok=no - docadd_html=no - docadd_info=no - docadd_other=no - docadd_pdf=no - docadd_examples=no - OFS=$IFS - IFS=',' - set -- $doc - IFS=$OFS - for i - do - test "x$i" = xhtml && { docadd_html=yes; continue; } - test "x$i" = xinfo && { docadd_info=yes; continue; } - test "x$i" = xother && { docadd_other=yes; continue; } - test "x$i" = xpdf && { docadd_pdf=yes; continue; } - test "x$i" = xexamples && { docadd_examples=yes; continue; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid '--with-doc' argument: $i" >&5 -$as_echo "$as_me: WARNING: Invalid '--with-doc' argument: $i" >&2;} - done - fi - if test $docadd_html = yes; then - make_install_shipped_htmldoc=install_shipped_htmldoc - make_uninstall_shipped_htmldoc=uninstall_shipped_htmldoc - else - make_install_shipped_htmldoc= - make_uninstall_shipped_htmldoc= - fi - if test $docadd_other = yes; then - make_otherdoc=otherdoc - make_install_otherdoc=install_otherdoc - make_uninstall_otherdoc=uninstall_otherdoc - else - make_otherdoc= - make_install_otherdoc= - make_uninstall_otherdoc= - fi - if test $docadd_examples = yes; then - make_examples=examples - make_install_examples=install_examples - make_uninstall_examples=uninstall_examples - else - make_examples= - make_install_examples= - make_uninstall_examples= + if test "$M4" = missing + then + as_fn_error 1 "could not find 'm4'" "$LINENO" 5 fi - - - - - - - -# By default automake will set MAKEINFO to MAKEINFO = ${SHELL} /build-aux/missing makeinfo.As we need a more precise + # By default automake will set MAKEINFO to MAKEINFO = ${SHELL} /build-aux/missing makeinfo. As we need a more precise # check of makeinfo version, we don't use it. MAKEINFO= - if test $docadd_info = yes; then - missing= - # Extract the first word of "makeinfo", so it can be a program name with args. + missing= + # Extract the first word of "makeinfo", so it can be a program name with args. set dummy makeinfo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MAKEINFO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MAKEINFO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MAKEINFO"; then ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. else @@ -19874,11 +24717,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MAKEINFO="makeinfo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19889,72 +24736,61 @@ fi fi MAKEINFO=$ac_cv_prog_MAKEINFO if test -n "$MAKEINFO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 -$as_echo "$MAKEINFO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 +printf "%s\n" "$MAKEINFO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test -z "$MAKEINFO"; then - missing="'makeinfo' is missing." - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for makeinfo version" >&5 -$as_echo_n "checking for makeinfo version... " >&6; } - # We need an additional level of quoting to make sed's regexps work. - makeinfo_version=`$MAKEINFO --version 2>&1 \ - | sed -e 's/^.* \([^ ][^ ]*\)$/\1/' -e '1q'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $makeinfo_version" >&5 -$as_echo "$makeinfo_version" >&6; } - # Consider only the first two numbers in version number string. - makeinfo_version_major=`IFS=.; set x $makeinfo_version; echo 0${2}` - makeinfo_version_minor=`IFS=.; set x $makeinfo_version; echo 0${3}` - makeinfo_version_numeric=` - expr ${makeinfo_version_major}000 \+ ${makeinfo_version_minor}` - if test $makeinfo_version_numeric -lt 4008; then - missing="'makeinfo' is too old." - fi - fi - - if test -n "$missing"; then - infofile=doc/groff.info - test -f ${infofile} || infofile=${srcdir}/${infofile} - if test ! -f ${infofile} \ - || test ${srcdir}/doc/groff.texi -nt ${infofile}; then - as_fn_error $? "$missing -Get the 'texinfo' package version 4.8 or newer." "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $missing -Get the 'texinfo' package version 4.8 or newer if you want to convert -'groff.texi' into a PDF or HTML document." >&5 -$as_echo "$as_me: WARNING: $missing -Get the 'texinfo' package version 4.8 or newer if you want to convert -'groff.texi' into a PDF or HTML document." >&2;} - fi - fi - - make_infodoc=infodoc - make_install_infodoc=install_infodoc - make_uninstall_infodoc=uninstall_infodoc - else - make_infodoc= - make_install_infodoc= - make_uninstall_infodoc= - MAKEINFO= - fi + if test -z "$MAKEINFO" + then + missing="missing 'makeinfo'" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for makeinfo version" >&5 +printf %s "checking for makeinfo version... " >&6; } + # We need an additional level of quoting to make sed's regexps + # work. + makeinfo_version=`$MAKEINFO --version 2>&1 \ + | sed -e 's/^.* \([^ ][^ ]*\)$/\1/' -e '1q'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $makeinfo_version" >&5 +printf "%s\n" "$makeinfo_version" >&6; } + # Consider only the first two numbers in version number string. + makeinfo_version_major=`IFS=.; set x $makeinfo_version; echo ${2}` + makeinfo_version_minor=`IFS=.; set x $makeinfo_version; echo ${3}` + makeinfo_version_numeric=` + expr ${makeinfo_version_major}000 + $makeinfo_version_minor` + if test $makeinfo_version_numeric -lt 5000 + then + missing="'makeinfo' is too old." + MAKEINFO= + fi + fi + if test -n "$missing" + then + infofile=doc/groff.info + test -f $infofile || infofile="$srcdir"/$infofile + if test ! -f $infofile \ + || test "$srcdir"/doc/groff.texi -nt $infofile + then + as_fn_error $? "$missing +Get the 'texinfo' package version 5.0 or newer." "$LINENO" 5 + fi + fi -# Extract the first word of "texi2dvi", so it can be a program name with args. + # Extract the first word of "texi2dvi", so it can be a program name with args. set dummy texi2dvi; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PROG_TEXI2DVI+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PROG_TEXI2DVI+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$PROG_TEXI2DVI"; then ac_cv_prog_PROG_TEXI2DVI="$PROG_TEXI2DVI" # Let the user override the test. else @@ -19962,11 +24798,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PROG_TEXI2DVI="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PROG_TEXI2DVI="texi2dvi" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19978,28 +24818,77 @@ fi fi PROG_TEXI2DVI=$ac_cv_prog_PROG_TEXI2DVI if test -n "$PROG_TEXI2DVI"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_TEXI2DVI" >&5 -$as_echo "$PROG_TEXI2DVI" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROG_TEXI2DVI" >&5 +printf "%s\n" "$PROG_TEXI2DVI" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$PROG_TEXI2DVI" = "xfound"; then - groff_have_texi2dvi=yes; - else - groff_have_texi2dvi=no; - fi + groff_have_texi2dvi=no + if test "$PROG_TEXI2DVI" != missing && test -n "$MAKEINFO" + then + groff_have_texi2dvi=yes + fi + + + + # Extract the first word of "tex", so it can be a program name with args. +set dummy tex; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PROG_TEX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PROG_TEX"; then + ac_cv_prog_PROG_TEX="$PROG_TEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PROG_TEX="found" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_PROG_TEX" && ac_cv_prog_PROG_TEX="missing" +fi +fi +PROG_TEX=$ac_cv_prog_PROG_TEX +if test -n "$PROG_TEX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROG_TEX" >&5 +printf "%s\n" "$PROG_TEX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + groff_use_tex=no + test "$PROG_TEX" = found && groff_use_tex=yes if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -20007,11 +24896,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20022,11 +24915,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20035,11 +24928,12 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -20047,11 +24941,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20062,11 +24960,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -20074,8 +24972,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -20087,16 +24985,16 @@ fi ac_dir=`cd $ac_aux_dir; pwd` ac_install_sh="$ac_dir/install-sh -c" -if test $docadd_info = yes; then - for ac_prog in install-info +for ac_prog in install-info do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_INSTALL_INFO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_INSTALL_INFO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$INSTALL_INFO"; then ac_cv_prog_INSTALL_INFO="$INSTALL_INFO" # Let the user override the test. else @@ -20104,11 +25002,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_INSTALL_INFO="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20119,11 +25021,11 @@ fi fi INSTALL_INFO=$ac_cv_prog_INSTALL_INFO if test -n "$INSTALL_INFO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL_INFO" >&5 -$as_echo "$INSTALL_INFO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL_INFO" >&5 +printf "%s\n" "$INSTALL_INFO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20131,27 +25033,27 @@ fi done test -n "$INSTALL_INFO" || INSTALL_INFO=":" - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi # Extract the first word of "xpmtoppm", so it can be a program name with args. set dummy xpmtoppm; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_XPMTOPPM+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_XPMTOPPM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$XPMTOPPM"; then ac_cv_prog_XPMTOPPM="$XPMTOPPM" # Let the user override the test. else @@ -20159,11 +25061,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_XPMTOPPM="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20175,11 +25081,11 @@ fi fi XPMTOPPM=$ac_cv_prog_XPMTOPPM if test -n "$XPMTOPPM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPMTOPPM" >&5 -$as_echo "$XPMTOPPM" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XPMTOPPM" >&5 +printf "%s\n" "$XPMTOPPM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20194,11 +25100,12 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. @@ -20208,11 +25115,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20224,11 +25135,11 @@ esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +printf "%s\n" "$PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20237,11 +25148,12 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. @@ -20251,11 +25163,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20267,11 +25183,11 @@ esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then @@ -20279,8 +25195,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG @@ -20292,37 +25208,40 @@ fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi + # Check whether --with-uchardet was given. -if test "${with_uchardet+set}" = set; then : +if test ${with_uchardet+y} +then : withval=$with_uchardet; fi - if test "x$with_uchardet" != "xno"; then : + if test "$with_uchardet" != no +then : pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for UCHARDET" >&5 -$as_echo_n "checking for UCHARDET... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for UCHARDET" >&5 +printf %s "checking for UCHARDET... " >&6; } if test -n "$UCHARDET_CFLAGS"; then pkg_cv_UCHARDET_CFLAGS="$UCHARDET_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "uchardet >= 0.0.1") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UCHARDET_CFLAGS=`$PKG_CONFIG --cflags "uchardet >= 0.0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -20336,10 +25255,10 @@ if test -n "$UCHARDET_LIBS"; then pkg_cv_UCHARDET_LIBS="$UCHARDET_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uchardet >= 0.0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "uchardet >= 0.0.1") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UCHARDET_LIBS=`$PKG_CONFIG --libs "uchardet >= 0.0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -20353,8 +25272,8 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20369,172 +25288,46 @@ fi # Put the nasty error message in config.log where it belongs echo "$UCHARDET_PKG_ERRORS" >&5 - if test "x$with_uchardet" = "xyes"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "Could not found uchardet library + + if test "$with_uchardet" = yes + then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "could not find uchardet library See \`config.log' for more details" "$LINENO" 5; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: uchardet library not found, preconv \ -might not work properly" >&5 -$as_echo "$as_me: WARNING: uchardet library not found, preconv \ -might not work properly" >&2;} - fi - groff_have_uchardet=no + fi + groff_have_uchardet=no elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - if test "x$with_uchardet" = "xyes"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "Could not found uchardet library + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + if test "$with_uchardet" = yes + then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "could not find uchardet library See \`config.log' for more details" "$LINENO" 5; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: uchardet library not found, preconv \ -might not work properly" >&5 -$as_echo "$as_me: WARNING: uchardet library not found, preconv \ -might not work properly" >&2;} - fi - groff_have_uchardet=no + fi + groff_have_uchardet=no else UCHARDET_CFLAGS=$pkg_cv_UCHARDET_CFLAGS UCHARDET_LIBS=$pkg_cv_UCHARDET_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_UCHARDET 1" >>confdefs.h +printf "%s\n" "#define HAVE_UCHARDET 1" >>confdefs.h - groff_have_uchardet=yes + groff_have_uchardet=yes fi -else +else $as_nop groff_have_uchardet=no - -fi -# Extract the first word of "pdfinfo", so it can be a program name with args. -set dummy pdfinfo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PDFINFO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PDFINFO"; then - ac_cv_prog_PDFINFO="$PDFINFO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PDFINFO="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_PDFINFO" && ac_cv_prog_PDFINFO="missing" -fi -fi -PDFINFO=$ac_cv_prog_PDFINFO -if test -n "$PDFINFO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFINFO" >&5 -$as_echo "$PDFINFO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - # Extract the first word of "pdffonts", so it can be a program name with args. -set dummy pdffonts; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PDFFONTS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PDFFONTS"; then - ac_cv_prog_PDFFONTS="$PDFFONTS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PDFFONTS="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_PDFFONTS" && ac_cv_prog_PDFFONTS="missing" -fi -fi -PDFFONTS=$ac_cv_prog_PDFFONTS -if test -n "$PDFFONTS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFFONTS" >&5 -$as_echo "$PDFFONTS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - # Extract the first word of "pdfimages", so it can be a program name with args. -set dummy pdfimages; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PDFIMAGES+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PDFIMAGES"; then - ac_cv_prog_PDFIMAGES="$PDFIMAGES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PDFIMAGES="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_PDFIMAGES" && ac_cv_prog_PDFIMAGES="missing" -fi -fi -PDFIMAGES=$ac_cv_prog_PDFIMAGES -if test -n "$PDFIMAGES"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFIMAGES" >&5 -$as_echo "$PDFIMAGES" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi - if test "x$PDFINFO" = "xfound" -a "x$PDFFONTS" = "xfound" -a "x$PDFIMAGES" = "xfound"; then - groff_have_pdftools=yes; - else - groff_have_pdftools=no; - fi - - # use a dummy substitution if no csh hack is necessary to avoid errors # with non-GNU sed programs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for csh hash hack" >&5 -$as_echo_n "checking for csh hash hack... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for csh hash hack" >&5 +printf %s "checking for csh hash hack... " >&6; } cat <conftest.sh #! /bin/sh @@ -20545,47 +25338,112 @@ EOF chmod +x conftest.sh if echo ./conftest.sh | (csh >/dev/null 2>&1) >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } SH_SCRIPT_SED_CMD='1s/.*/:/' else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } SH_SCRIPT_SED_CMD='1s/a/a/' fi rm -f conftest.sh # checks for headers -for ac_header in stddef.h stdlib.h unistd.h dirent.h limits.h sys/dir.h \ - string.h strings.h math.h sys/time.h direct.h process.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default" +if test "x$ac_cv_header_stdbool_h" = xyes +then : + printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" +if test "x$ac_cv_header_stddef_h" = xyes +then : + printf "%s\n" "#define HAVE_STDDEF_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISC 3.x or 4.x" >&5 -$as_echo_n "checking for ISC 3.x or 4.x... " >&6; } +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +if test "x$ac_cv_header_dirent_h" = xyes +then : + printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/dir.h" "ac_cv_header_sys_dir_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_dir_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_DIR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes +then : + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +if test "x$ac_cv_header_math_h" = xyes +then : + printf "%s\n" "#define HAVE_MATH_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "direct.h" "ac_cv_header_direct_h" "$ac_includes_default" +if test "x$ac_cv_header_direct_h" = xyes +then : + printf "%s\n" "#define HAVE_DIRECT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default" +if test "x$ac_cv_header_process_h" = xyes +then : + printf "%s\n" "#define HAVE_PROCESS_H 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ISC 3.x or 4.x" >&5 +printf %s "checking for ISC 3.x or 4.x... " >&6; } if grep '[34]\.' /usr/options/cb.name >/dev/null 2>&1 then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define _SYSV3 1" >>confdefs.h +printf "%s\n" "#define _SYSV3 1" >>confdefs.h else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -D_POSIX_SOURCE is necessary" >&5 -$as_echo_n "checking whether -D_POSIX_SOURCE is necessary... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -D_POSIX_SOURCE is necessary" >&5 +printf %s "checking whether -D_POSIX_SOURCE is necessary... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20602,7 +25460,7 @@ extern "C" { void fileno(int); } int -main () +main (void) { ; @@ -20610,17 +25468,18 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h +printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20635,8 +25494,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for return type of srand" >&5 -$as_echo_n "checking for return type of srand... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for return type of srand" >&5 +printf %s "checking for return type of srand... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20647,7 +25506,7 @@ extern "C" { void srand(unsigned int); } int -main () +main (void) { ; @@ -20655,34 +25514,36 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: void" >&5 -$as_echo "void" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: void" >&5 +printf "%s\n" "void" >&6; } -$as_echo "#define RET_TYPE_SRAND_IS_VOID 1" >>confdefs.h +printf "%s\n" "#define RET_TYPE_SRAND_IS_VOID 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 -$as_echo "int" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5 +printf "%s\n" "int" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday must be declared" >&5 -$as_echo_n "checking whether gettimeofday must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday must be declared" >&5 +printf %s "checking whether gettimeofday must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_gettimeofday+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_gettimeofday+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20710,7 +25571,7 @@ else int -main () +main (void) { @@ -20724,19 +25585,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_gettimeofday=no -else +else $as_nop groff_cv_decl_needed_gettimeofday=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_gettimeofday" >&5 -$as_echo "$groff_cv_decl_needed_gettimeofday" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_gettimeofday" >&5 +printf "%s\n" "$groff_cv_decl_needed_gettimeofday" >&6; } if test $groff_cv_decl_needed_gettimeofday = yes; then -$as_echo "#define NEED_DECLARATION_GETTIMEOFDAY 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_GETTIMEOFDAY 1" >>confdefs.h fi ac_ext=c @@ -20745,17 +25607,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether popen must be declared" >&5 -$as_echo_n "checking whether popen must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether popen must be declared" >&5 +printf %s "checking whether popen must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_popen+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_popen+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20783,7 +25646,7 @@ else int -main () +main (void) { @@ -20797,19 +25660,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_popen=no -else +else $as_nop groff_cv_decl_needed_popen=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_popen" >&5 -$as_echo "$groff_cv_decl_needed_popen" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_popen" >&5 +printf "%s\n" "$groff_cv_decl_needed_popen" >&6; } if test $groff_cv_decl_needed_popen = yes; then -$as_echo "#define NEED_DECLARATION_POPEN 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_POPEN 1" >>confdefs.h fi ac_ext=c @@ -20818,17 +25682,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pclose must be declared" >&5 -$as_echo_n "checking whether pclose must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pclose must be declared" >&5 +printf %s "checking whether pclose must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_pclose+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_pclose+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20856,7 +25721,7 @@ else int -main () +main (void) { @@ -20870,19 +25735,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_pclose=no -else +else $as_nop groff_cv_decl_needed_pclose=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_pclose" >&5 -$as_echo "$groff_cv_decl_needed_pclose" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_pclose" >&5 +printf "%s\n" "$groff_cv_decl_needed_pclose" >&6; } if test $groff_cv_decl_needed_pclose = yes; then -$as_echo "#define NEED_DECLARATION_PCLOSE 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_PCLOSE 1" >>confdefs.h fi ac_ext=c @@ -20891,17 +25757,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether putenv must be declared" >&5 -$as_echo_n "checking whether putenv must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether putenv must be declared" >&5 +printf %s "checking whether putenv must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_putenv+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_putenv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20929,7 +25796,7 @@ else int -main () +main (void) { @@ -20943,19 +25810,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_putenv=no -else +else $as_nop groff_cv_decl_needed_putenv=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_putenv" >&5 -$as_echo "$groff_cv_decl_needed_putenv" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_putenv" >&5 +printf "%s\n" "$groff_cv_decl_needed_putenv" >&6; } if test $groff_cv_decl_needed_putenv = yes; then -$as_echo "#define NEED_DECLARATION_PUTENV 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_PUTENV 1" >>confdefs.h fi ac_ext=c @@ -20964,17 +25832,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rand must be declared" >&5 -$as_echo_n "checking whether rand must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rand must be declared" >&5 +printf %s "checking whether rand must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_rand+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_rand+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21002,7 +25871,7 @@ else int -main () +main (void) { @@ -21016,19 +25885,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_rand=no -else +else $as_nop groff_cv_decl_needed_rand=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_rand" >&5 -$as_echo "$groff_cv_decl_needed_rand" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_rand" >&5 +printf "%s\n" "$groff_cv_decl_needed_rand" >&6; } if test $groff_cv_decl_needed_rand = yes; then -$as_echo "#define NEED_DECLARATION_RAND 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_RAND 1" >>confdefs.h fi ac_ext=c @@ -21037,17 +25907,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether srand must be declared" >&5 -$as_echo_n "checking whether srand must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether srand must be declared" >&5 +printf %s "checking whether srand must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_srand+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_srand+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21075,7 +25946,7 @@ else int -main () +main (void) { @@ -21089,19 +25960,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_srand=no -else +else $as_nop groff_cv_decl_needed_srand=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_srand" >&5 -$as_echo "$groff_cv_decl_needed_srand" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_srand" >&5 +printf "%s\n" "$groff_cv_decl_needed_srand" >&6; } if test $groff_cv_decl_needed_srand = yes; then -$as_echo "#define NEED_DECLARATION_SRAND 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_SRAND 1" >>confdefs.h fi ac_ext=c @@ -21110,17 +25982,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strcasecmp must be declared" >&5 -$as_echo_n "checking whether strcasecmp must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strcasecmp must be declared" >&5 +printf %s "checking whether strcasecmp must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_strcasecmp+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_strcasecmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21148,7 +26021,7 @@ else int -main () +main (void) { @@ -21162,19 +26035,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_strcasecmp=no -else +else $as_nop groff_cv_decl_needed_strcasecmp=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strcasecmp" >&5 -$as_echo "$groff_cv_decl_needed_strcasecmp" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strcasecmp" >&5 +printf "%s\n" "$groff_cv_decl_needed_strcasecmp" >&6; } if test $groff_cv_decl_needed_strcasecmp = yes; then -$as_echo "#define NEED_DECLARATION_STRCASECMP 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_STRCASECMP 1" >>confdefs.h fi ac_ext=c @@ -21183,17 +26057,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strncasecmp must be declared" >&5 -$as_echo_n "checking whether strncasecmp must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strncasecmp must be declared" >&5 +printf %s "checking whether strncasecmp must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_strncasecmp+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_strncasecmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21221,7 +26096,7 @@ else int -main () +main (void) { @@ -21235,19 +26110,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_strncasecmp=no -else +else $as_nop groff_cv_decl_needed_strncasecmp=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strncasecmp" >&5 -$as_echo "$groff_cv_decl_needed_strncasecmp" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_strncasecmp" >&5 +printf "%s\n" "$groff_cv_decl_needed_strncasecmp" >&6; } if test $groff_cv_decl_needed_strncasecmp = yes; then -$as_echo "#define NEED_DECLARATION_STRNCASECMP 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_STRNCASECMP 1" >>confdefs.h fi ac_ext=c @@ -21256,17 +26132,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfprintf must be declared" >&5 -$as_echo_n "checking whether vfprintf must be declared... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether vfprintf must be declared" >&5 +printf %s "checking whether vfprintf must be declared... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - if ${groff_cv_decl_needed_vfprintf+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${groff_cv_decl_needed_vfprintf+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21294,7 +26171,7 @@ else int -main () +main (void) { @@ -21308,19 +26185,20 @@ main () } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_decl_needed_vfprintf=no -else +else $as_nop groff_cv_decl_needed_vfprintf=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_vfprintf" >&5 -$as_echo "$groff_cv_decl_needed_vfprintf" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_decl_needed_vfprintf" >&5 +printf "%s\n" "$groff_cv_decl_needed_vfprintf" >&6; } if test $groff_cv_decl_needed_vfprintf = yes; then -$as_echo "#define NEED_DECLARATION_VFPRINTF 1" >>confdefs.h +printf "%s\n" "#define NEED_DECLARATION_VFPRINTF 1" >>confdefs.h fi ac_ext=c @@ -21335,8 +26213,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_nerr in , , or " >&5 -$as_echo_n "checking for sys_nerr in , , or ... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys_nerr in , , or " >&5 +printf %s "checking for sys_nerr in , , or ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21348,7 +26226,7 @@ $as_echo_n "checking for sys_nerr in , , or ... " >& int -main () +main (void) { @@ -21361,25 +26239,26 @@ k = sys_nerr; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_SYS_NERR 1" >>confdefs.h +printf "%s\n" "#define HAVE_SYS_NERR 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_errlist in , , or " >&5 -$as_echo_n "checking for sys_errlist in , , or ... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys_errlist in , , or " >&5 +printf %s "checking for sys_errlist in , , or ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21391,7 +26270,7 @@ $as_echo_n "checking for sys_errlist in , , or ... " int -main () +main (void) { @@ -21404,25 +26283,26 @@ k = (int)sys_errlist[0]; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_SYS_ERRLIST 1" >>confdefs.h +printf "%s\n" "#define HAVE_SYS_ERRLIST 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 -$as_echo_n "checking C++ ... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 +printf %s "checking C++ ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21432,7 +26312,7 @@ $as_echo_n "checking C++ ... " >&6; } int -main () +main (void) { @@ -21445,17 +26325,18 @@ open(0, 0); } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_CC_OSFCN_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_CC_OSFCN_H 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21468,8 +26349,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 -$as_echo_n "checking C++ ... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 +printf %s "checking C++ ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21479,7 +26360,7 @@ $as_echo_n "checking C++ ... " >&6; } int -main () +main (void) { @@ -21493,17 +26374,18 @@ int z = UCHAR_MAX; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_CC_LIMITS_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_CC_LIMITS_H 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21516,8 +26398,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 -$as_echo_n "checking C++ ... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C++ " >&5 +printf %s "checking C++ ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21528,7 +26410,7 @@ $as_echo_n "checking C++ ... " >&6; } int -main () +main (void) { @@ -21540,17 +26422,18 @@ uintmax_t i = (uintmax_t)-1; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : groff_cv_header_inttypes_h=yes -$as_echo "#define HAVE_CC_INTTYPES_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_CC_INTTYPES_H 1" >>confdefs.h -else +else $as_nop groff_cv_header_inttypes_h=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_header_inttypes_h" >&5 -$as_echo "$groff_cv_header_inttypes_h" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_header_inttypes_h" >&5 +printf "%s\n" "$groff_cv_header_inttypes_h" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21565,8 +26448,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 -$as_echo_n "checking for unsigned long long... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 +printf %s "checking for unsigned long long... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21578,7 +26461,7 @@ unsigned long long ullmax = (unsigned long long)-1; int -main () +main (void) { @@ -21590,15 +26473,16 @@ return ull << i | ull >> i | ullmax / ull | ullmax % ull; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO" +then : groff_cv_type_unsigned_long_long=yes -else +else $as_nop groff_cv_type_unsigned_long_long=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_cv_type_unsigned_long_long" >&5 -$as_echo "$groff_cv_type_unsigned_long_long" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_cv_type_unsigned_long_long" >&5 +printf "%s\n" "$groff_cv_type_unsigned_long_long" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21612,9 +26496,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu && ac_type='unsigned long long' \ || ac_type='unsigned long' -cat >>confdefs.h <<_ACEOF -#define uintmax_t $ac_type -_ACEOF +printf "%s\n" "#define uintmax_t $ac_type" >>confdefs.h fi ac_ext=cpp @@ -21623,8 +26505,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for declaration of time_t" >&5 -$as_echo_n "checking for declaration of time_t... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for declaration of time_t" >&5 +printf %s "checking for declaration of time_t... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21634,7 +26516,7 @@ $as_echo_n "checking for declaration of time_t... " >&6; } int -main () +main (void) { @@ -21647,25 +26529,26 @@ struct tm *p = localtime(&t); } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } -$as_echo "#define LONG_FOR_TIME_T 1" >>confdefs.h +printf "%s\n" "#define LONG_FOR_TIME_T 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for return type of signal handlers" >&5 -$as_echo_n "checking for return type of signal handlers... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for return type of signal handlers" >&5 +printf %s "checking for return type of signal handlers... " >&6; } for groff_declaration in \ 'extern "C" void (*signal (int, void (*)(int)))(int);' \ 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ @@ -21685,7 +26568,7 @@ $groff_declaration int -main () +main (void) { @@ -21697,29 +26580,30 @@ int i; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : break -else +else $as_nop continue fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done if test -n "$groff_declaration"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: void" >&5 -$as_echo "void" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: void" >&5 +printf "%s\n" "void" >&6; } -$as_echo "#define RETSIGTYPE void" >>confdefs.h +printf "%s\n" "#define RETSIGTYPE void" >>confdefs.h else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 -$as_echo "int" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5 +printf "%s\n" "int" >&6; } -$as_echo "#define RETSIGTYPE int" >>confdefs.h +printf "%s\n" "#define RETSIGTYPE int" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking struct exception" >&5 -$as_echo_n "checking struct exception... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking struct exception" >&5 +printf %s "checking struct exception... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21729,7 +26613,7 @@ $as_echo_n "checking struct exception... " >&6; } int -main () +main (void) { @@ -21741,24 +26625,26 @@ struct exception e; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_STRUCT_EXCEPTION 1" >>confdefs.h +printf "%s\n" "#define HAVE_STRUCT_EXCEPTION 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # check endianness - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -21769,7 +26655,8 @@ else typedef int dummy; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. @@ -21793,7 +26680,7 @@ if ac_fn_c_try_compile "$LINENO"; then : fi done fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -21802,7 +26689,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ @@ -21814,7 +26701,8 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21822,7 +26710,7 @@ if ac_fn_c_try_compile "$LINENO"; then : #include int -main () +main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian @@ -21832,14 +26720,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). @@ -21848,7 +26737,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros @@ -21858,14 +26747,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { #ifndef _BIG_ENDIAN not big endian @@ -21875,31 +26765,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -short int ascii_mm[] = +unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = + unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } - short int ebcdic_ii[] = + unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = + unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; @@ -21907,14 +26799,15 @@ short int ascii_mm[] = extern int foo; int -main () +main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi @@ -21927,13 +26820,13 @@ if ac_fn_c_try_compile "$LINENO"; then : fi fi fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { /* Are we little or big endian? From Harbison&Steele. */ @@ -21949,9 +26842,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_c_bigendian=no -else +else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -21960,17 +26854,17 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) @@ -21980,11 +26874,12 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h # checks for libraries -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lc" >&5 -$as_echo_n "checking for main in -lc... " >&6; } -if ${ac_cv_lib_c_main+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lc" >&5 +printf %s "checking for main in -lc... " >&6; } +if test ${ac_cv_lib_c_main+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -21992,34 +26887,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext int -main () +main (void) { return main (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_c_main=yes -else +else $as_nop ac_cv_lib_c_main=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_main" >&5 -$as_echo "$ac_cv_lib_c_main" >&6; } -if test "x$ac_cv_lib_c_main" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_main" >&5 +printf "%s\n" "$ac_cv_lib_c_main" >&6; } +if test "x$ac_cv_lib_c_main" = xyes +then : LIBC=-lc fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 -$as_echo_n "checking for sin in -lm... " >&6; } -if ${ac_cv_lib_m_sin+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 +printf %s "checking for sin in -lm... " >&6; } +if test ${ac_cv_lib_m_sin+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -22028,30 +26926,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char sin (); int -main () +main (void) { return sin (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_m_sin=yes -else +else $as_nop ac_cv_lib_m_sin=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 -$as_echo "$ac_cv_lib_m_sin" >&6; } -if test "x$ac_cv_lib_m_sin" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 +printf "%s\n" "$ac_cv_lib_m_sin" >&6; } +if test "x$ac_cv_lib_m_sin" = xyes +then : LIBM=-lm fi @@ -22082,9 +26979,10 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi @@ -22104,8 +27002,8 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -22134,15 +27032,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${acl_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${acl_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -22171,18 +27070,19 @@ fi LD="$acl_cv_path_LD" if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${acl_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${acl_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$acl_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 +printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 -$as_echo_n "checking for shared library run path origin... " >&6; } -if ${acl_cv_rpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +printf %s "checking for shared library run path origin... " >&6; } +if test ${acl_cv_rpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh @@ -22213,8 +27115,8 @@ else acl_cv_rpath=done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 -$as_echo "$acl_cv_rpath" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +printf "%s\n" "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" @@ -22225,9 +27127,10 @@ $as_echo "$acl_cv_rpath" >&6; } acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. -if test "${enable_rpath+set}" = set; then : +if test ${enable_rpath+y} +then : enableval=$enable_rpath; : -else +else $as_nop enable_rpath=yes fi @@ -22237,36 +27140,32 @@ ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -22278,10 +27177,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -22291,7 +27191,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : break fi @@ -22303,29 +27204,24 @@ fi else ac_cv_prog_CXXCPP=$CXXCPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -22337,10 +27233,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -22350,11 +27247,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi @@ -22372,11 +27270,12 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu acl_libdirstem2= case "$host_os" in solaris*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 -$as_echo_n "checking for 64-bit host... " >&6; } -if ${gl_cv_solaris_64bit+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 +printf %s "checking for 64-bit host... " >&6; } +if test ${gl_cv_solaris_64bit+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -22386,17 +27285,18 @@ sixtyfour bits _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "sixtyfour bits" >/dev/null 2>&1; then : + $EGREP "sixtyfour bits" >/dev/null 2>&1 +then : gl_cv_solaris_64bit=yes -else +else $as_nop gl_cv_solaris_64bit=no fi -rm -f conftest* +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 -$as_echo "$gl_cv_solaris_64bit" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 +printf "%s\n" "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in @@ -22455,7 +27355,8 @@ $as_echo "$gl_cv_solaris_64bit" >&6; } # Check whether --with-libiconv-prefix was given. -if test "${with_libiconv_prefix+set}" = set; then : +if test ${with_libiconv_prefix+y} +then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -22925,11 +27826,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 -$as_echo_n "checking for iconv... " >&6; } -if ${am_cv_func_iconv+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +printf %s "checking for iconv... " >&6; } +if test ${am_cv_func_iconv+y} +then : + printf %s "(cached) " >&6 +else $as_nop am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no @@ -22940,7 +27842,7 @@ else #include int -main () +main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); @@ -22949,10 +27851,11 @@ iconv_t cd = iconv_open("",""); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO" +then : am_cv_func_iconv=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" @@ -22964,7 +27867,7 @@ rm -f core conftest.err conftest.$ac_objext \ #include int -main () +main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); @@ -22973,24 +27876,26 @@ iconv_t cd = iconv_open("",""); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO" +then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 -$as_echo "$am_cv_func_iconv" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +printf "%s\n" "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 -$as_echo_n "checking for working iconv... " >&6; } -if ${am_cv_func_iconv_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +printf %s "checking for working iconv... " >&6; } +if test ${am_cv_func_iconv_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then @@ -22998,12 +27903,13 @@ else fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -23015,7 +27921,7 @@ else #endif int -main () +main (void) { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful @@ -23115,7 +28021,8 @@ int result = 0; return 0; } _ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : +if ac_fn_cxx_try_run "$LINENO" +then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -23127,8 +28034,8 @@ fi LIBS="$am_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 -$as_echo "$am_cv_func_iconv_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +printf "%s\n" "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; @@ -23138,14 +28045,14 @@ $as_echo "$am_cv_func_iconv_works" >&6; } fi if test "$am_func_iconv" = yes; then -$as_echo "#define HAVE_ICONV 1" >>confdefs.h +printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 -$as_echo_n "checking how to link with libiconv... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 -$as_echo "$LIBICONV" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +printf %s "checking how to link with libiconv... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +printf "%s\n" "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= @@ -23155,11 +28062,12 @@ $as_echo "$LIBICONV" >&6; } if test "$am_cv_func_iconv" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 -$as_echo_n "checking for iconv declaration... " >&6; } - if ${am_cv_proto_iconv+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 +printf %s "checking for iconv declaration... " >&6; } + if test ${am_cv_proto_iconv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -23177,31 +28085,30 @@ size_t iconv(); #endif int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : am_cv_proto_iconv_arg1="" -else +else $as_nop am_cv_proto_iconv_arg1="const" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_proto_iconv" >&5 -$as_echo " +printf "%s\n" " $am_cv_proto_iconv" >&6; } -cat >>confdefs.h <<_ACEOF -#define ICONV_CONST $am_cv_proto_iconv_arg1 -_ACEOF +printf "%s\n" "#define ICONV_CONST $am_cv_proto_iconv_arg1" >>confdefs.h fi @@ -23222,26 +28129,21 @@ LIBEXT=$acl_libext - -for ac_func in getpagesize -do : - ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" -if test "x$ac_cv_func_getpagesize" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPAGESIZE 1 -_ACEOF - -fi -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 -$as_echo_n "checking for working mmap... " >&6; } -if ${ac_cv_func_mmap_fixed_mapped+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_mmap_fixed_mapped=no -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +printf %s "checking for working mmap... " >&6; } +if test ${ac_cv_func_mmap_fixed_mapped+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on platforms where we know the result. + linux*) ac_cv_func_mmap_fixed_mapped=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_mmap_fixed_mapped=no ;; + esac +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default @@ -23273,10 +28175,6 @@ $ac_includes_default #include #include -#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H -char *malloc (); -#endif - /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE @@ -23310,7 +28208,7 @@ char *malloc (); #endif /* no HAVE_GETPAGESIZE */ int -main () +main (void) { char *data, *data2, *data3; const char *cdata2; @@ -23378,12 +28276,15 @@ main () if (*(data + i) != *(data3 + i)) return 14; close (fd); + free (data); + free (data3); return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_mmap_fixed_mapped=yes -else +else $as_nop ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -23391,11 +28292,11 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 -$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then -$as_echo "#define HAVE_MMAP 1" >>confdefs.h +printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt @@ -23403,10 +28304,11 @@ rm -f conftest.mmap conftest.txt saved_libs="$LIBS" LIBS="$LIBS $LIBC $LIBM" ac_fn_c_check_func "$LINENO" "fmod" "ac_cv_func_fmod" -if test "x$ac_cv_func_fmod" = xyes; then : - $as_echo "#define HAVE_FMOD 1" >>confdefs.h +if test "x$ac_cv_func_fmod" = xyes +then : + printf "%s\n" "#define HAVE_FMOD 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" fmod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS fmod.$ac_objext" @@ -23414,12 +28316,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = xyes; then : - $as_echo "#define HAVE_GETCWD 1" >>confdefs.h +if test "x$ac_cv_func_getcwd" = xyes +then : + printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" getcwd.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getcwd.$ac_objext" @@ -23427,12 +28329,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" -if test "x$ac_cv_func_putenv" = xyes; then : - $as_echo "#define HAVE_PUTENV 1" >>confdefs.h +if test "x$ac_cv_func_putenv" = xyes +then : + printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" putenv.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS putenv.$ac_objext" @@ -23440,12 +28342,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" -if test "x$ac_cv_func_strcasecmp" = xyes; then : - $as_echo "#define HAVE_STRCASECMP 1" >>confdefs.h +if test "x$ac_cv_func_strcasecmp" = xyes +then : + printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" strcasecmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" @@ -23453,12 +28355,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" -if test "x$ac_cv_func_strerror" = xyes; then : - $as_echo "#define HAVE_STRERROR 1" >>confdefs.h +if test "x$ac_cv_func_strerror" = xyes +then : + printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" strerror.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strerror.$ac_objext" @@ -23466,12 +28368,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" -if test "x$ac_cv_func_strncasecmp" = xyes; then : - $as_echo "#define HAVE_STRNCASECMP 1" >>confdefs.h +if test "x$ac_cv_func_strncasecmp" = xyes +then : + printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" strncasecmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext" @@ -23479,12 +28381,12 @@ else esac fi - ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" -if test "x$ac_cv_func_strtol" = xyes; then : - $as_echo "#define HAVE_STRTOL 1" >>confdefs.h +if test "x$ac_cv_func_strtol" = xyes +then : + printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h -else +else $as_nop case " $LIBOBJS " in *" strtol.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtol.$ac_objext" @@ -23493,22 +28395,52 @@ esac fi - LIBS="$saved_libs" -for ac_func in gettimeofday isatty kill rename setlocale strsep -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : + printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h fi -done +ac_fn_c_check_func "$LINENO" "isatty" "ac_cv_func_isatty" +if test "x$ac_cv_func_isatty" = xyes +then : + printf "%s\n" "#define HAVE_ISATTY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill" +if test "x$ac_cv_func_kill" = xyes +then : + printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "rename" "ac_cv_func_rename" +if test "x$ac_cv_func_rename" = xyes +then : + printf "%s\n" "#define HAVE_RENAME 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes +then : + printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" +if test "x$ac_cv_func_strdup" = xyes +then : + printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" +if test "x$ac_cv_func_strsep" = xyes +then : + printf "%s\n" "#define HAVE_STRSEP 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mkstemp" >&5 -$as_echo_n "checking for mkstemp... " >&6; } +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mkstemp" >&5 +printf %s "checking for mkstemp... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23527,7 +28459,7 @@ int (*f) (char *); int -main () +main (void) { @@ -23539,15 +28471,16 @@ f = mkstemp; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define HAVE_MKSTEMP 1" >>confdefs.h +printf "%s\n" "#define HAVE_MKSTEMP 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } case " $LIBOBJS " in *" mkstemp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext" @@ -23555,7 +28488,7 @@ $as_echo "no" >&6; } esac fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -23563,58 +28496,73 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_fn_c_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" "$ac_includes_default" -if test "x$ac_cv_have_decl_sys_siglist" = xyes; then : +ac_fn_check_decl "$LINENO" "strsignal" "ac_cv_have_decl_strsignal" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strsignal" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SYS_SIGLIST $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" -if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then : +printf "%s\n" "#define HAVE_DECL_STRSIGNAL $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getc_unlocked" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl -_ACEOF +ac_fn_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_sys_siglist" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_SYS_SIGLIST $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getc_unlocked" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 -$as_echo_n "checking for nl_langinfo and CODESET... " >&6; } -if ${am_cv_langinfo_codeset+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 +printf %s "checking for nl_langinfo and CODESET... " >&6; } +if test ${am_cv_langinfo_codeset+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char* cs = nl_langinfo(CODESET); return !cs; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : am_cv_langinfo_codeset=yes -else +else $as_nop am_cv_langinfo_codeset=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 -$as_echo "$am_cv_langinfo_codeset" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 +printf "%s\n" "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then -$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h +printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi @@ -23626,14 +28574,14 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ANSI array delete syntax is supported" >&5 -$as_echo_n "checking whether ANSI array delete syntax is supported... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ISO C++98 array deletion syntax is supported" >&5 +printf %s "checking whether ISO C++98 array deletion syntax is supported... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { @@ -23646,17 +28594,16 @@ delete [] p; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define ARRAY_DELETE_NEEDS_SIZE 1" >>confdefs.h - +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "an ISO C++98-conformant compiler is required" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23669,8 +28616,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking traditional preprocessor" >&5 -$as_echo_n "checking traditional preprocessor... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C preprocessor uses pre-ISO C90 syntax" >&5 +printf %s "checking whether C preprocessor uses pre-ISO C90 syntax... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -23680,7 +28627,7 @@ $as_echo_n "checking traditional preprocessor... " >&6; } int -main () +main (void) { @@ -23692,17 +28639,16 @@ int name2(foo, bar); } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define TRADITIONAL_CPP 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + as_fn_error $? "an ISO C90-conformant C preprocessor is required" "$LINENO" 5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23711,12 +28657,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # checks for operating system services -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking w_coredump" >&5 -$as_echo_n "checking w_coredump... " >&6; } - if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking w_coredump" >&5 +printf %s "checking w_coredump... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -23727,7 +28674,7 @@ else int -main () +main (void) { @@ -23748,15 +28695,16 @@ main() } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define WCOREFLAG 0200" >>confdefs.h +printf "%s\n" "#define WCOREFLAG 0200" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -23765,94 +28713,130 @@ fi # URW fonts extra dir + # Check whether --with-urw-fonts-dir was given. -if test "${with_urw_fonts_dir+set}" = set; then : +if test ${with_urw_fonts_dir+y} +then : withval=$with_urw_fonts_dir; urwfontsdir="$withval" fi +# use groff's own malloc-based allocator for C++ new/delete operators + + # Check whether --enable-groff-allocator was given. +if test ${enable_groff_allocator+y} +then : + enableval=$enable_groff_allocator; test "$enableval" = yes && groff_use_own_allocator=yes +else $as_nop + groff_use_own_allocator=no +fi + + + # other random stuff -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking default value for grops -b option" >&5 -$as_echo_n "checking default value for grops -b option... " >&6; } - test -n "${BROKEN_SPOOLER_FLAGS}" || BROKEN_SPOOLER_FLAGS=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BROKEN_SPOOLER_FLAGS" >&5 -$as_echo "$BROKEN_SPOOLER_FLAGS" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking default paper size" >&5 -$as_echo_n "checking default paper size... " >&6; } - groff_prefix=$prefix - test "x$prefix" = "xNONE" && groff_prefix=$ac_default_prefix - if test -z "$PAGE" && test -r /etc/papersize; then - PAGE=`cat /etc/papersize | sed -e 's/^ *#.*//g' | tr -d "\n" | awk '{ print }'` - fi - if test -z "$PAGE"; then - descfile= - if test -r "$groff_prefix"/share/groff/font/devps/DESC; then - descfile=$groff_prefix/share/groff/font/devps/DESC - elif test -r "$groff_prefix"/lib/groff/font/devps/DESC; then - descfile=$groff_prefix/lib/groff/font/devps/DESC - else - for f in "$groff_prefix"/share/groff/*/font/devps/DESC; do - if test -r "$f"; then - descfile=$f - break - fi - done - fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking default value for grops -b option" >&5 +printf %s "checking default value for grops -b option... " >&6; } + test -n "$BROKEN_SPOOLER_FLAGS" || BROKEN_SPOOLER_FLAGS=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BROKEN_SPOOLER_FLAGS" >&5 +printf "%s\n" "$BROKEN_SPOOLER_FLAGS" >&6; } + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking default paper format" >&5 +printf %s "checking default paper format... " >&6; } + groff_prefix=$prefix + test "$prefix" = NONE && groff_prefix=$ac_default_prefix + if test -z "$PAGE" && test -r /etc/papersize + then + sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;p' + PAGE=`sed -n "$sedexpr" /etc/papersize` + fi + if test -z "$PAGE" + then + descfile= + if test -r "$groff_prefix"/share/groff/font/devps/DESC + then + descfile=$groff_prefix/share/groff/font/devps/DESC + elif test -r "$groff_prefix"/lib/groff/font/devps/DESC + then + descfile=$groff_prefix/lib/groff/font/devps/DESC + else + for f in "$groff_prefix"/share/groff/*/font/devps/DESC + do + if test -r "$f" + then + descfile=$f + break + fi + done + fi - if test -n "$descfile"; then - if grep '^paperlength[ ]\+841890' "$descfile" >/dev/null 2>&1; then - PAGE=A4 - elif grep '^papersize[ ]\+[aA]4' "$descfile" >/dev/null 2>&1; then - PAGE=A4 - fi - fi - fi + if test -n "$descfile" + then + if grep -q '^paperlength[ ]\+841890' "$descfile" + then + PAGE=A4 + elif grep -q '^papersize[ ]\+[aA]4' "$descfile" + then + PAGE=A4 + fi + fi + fi - if test -z "$PAGE"; then - dom=`awk '($1 == "dom" || $1 == "search") { print $2; exit}' \ - /etc/resolv.conf 2>/dev/null` - if test -z "$dom"; then - dom=`(domainname) 2>/dev/null | tr -d '+'` - if test -z "$dom" \ - || test "$dom" = '(none)'; then - dom=`(hostname) 2>/dev/null | grep '\.'` - fi - fi - # If the top-level domain is two letters and it's not 'us' or 'ca' - # then they probably use A4 paper. - case "$dom" in - *.[Uu][Ss]|*.[Cc][Aa]) - ;; - *.[A-Za-z][A-Za-z]) - PAGE=A4 ;; - esac - fi + if test -z "$PAGE" + then + domains= + if test -r /etc/resolv.conf + then + sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d; +/^\(domain\|search\)/!d;s/\(domain\|search\) //;p' + domains=`sed -n "$sedexpr" /etc/resolv.conf` + fi + if test -z "$domains" + then + domains=`(domainname) 2>/dev/null | tr -d '+'` + if test -z "$domains" || test "$domains" = '(none)' + then + domains=`(hostname) 2>/dev/null | grep '\.'` + fi + fi + # resolv.conf's "search" directive might return multiple domains. + # If any top-level domain is two letters and it's not 'us' or 'ca', + # assume the system uses A4 paper. + for d in $domains + do + case "$d" in + *.[Uu][Ss]|*.[Cc][Aa]) + ;; + *.[A-Za-z][A-Za-z]) + PAGE=A4 ;; + esac + done + fi - test -n "$PAGE" || PAGE=letter - if test "x$PAGE" = "xA4"; then + test -n "$PAGE" || PAGE=letter + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PAGE" >&5 +printf "%s\n" "$PAGE" >&6; } -$as_echo "#define PAGEA4 1" >>confdefs.h - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAGE" >&5 -$as_echo "$PAGE" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for existing troff installation" >&5 -$as_echo_n "checking for existing troff installation... " >&6; } - if test "x`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) 2>/dev/null`" = x0; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - g=g - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - g= - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for prefix of system macro packages" >&5 -$as_echo_n "checking for prefix of system macro packages... " >&6; } + g= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for existing troff installation" >&5 +printf %s "checking for existing troff installation... " >&6; } + if test "`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) \ + 2>/dev/null`" = 0 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + g=g + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for prefix of system macro packages" >&5 +printf %s "checking for prefix of system macro packages... " >&6; } sys_tmac_prefix= sys_tmac_file_prefix= for d in /usr/share/lib/tmac /usr/lib/tmac; do @@ -23868,14 +28852,17 @@ $as_echo_n "checking for prefix of system macro packages... " >&6; } done done done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sys_tmac_prefix" >&5 -$as_echo "$sys_tmac_prefix" >&6; } + sys_tmac_prefix_result=none + test -z "$sys_tmac_prefix" \ + || sys_tmac_prefix_result="$sys_tmac_prefix" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $sys_tmac_prefix_result" >&5 +printf "%s\n" "$sys_tmac_prefix_result" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which system macro packages should be made available" >&5 -$as_echo_n "checking which system macro packages should be made available... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which system macro packages should be made available" >&5 +printf %s "checking which system macro packages should be made available... " >&6; } tmac_wrap= - if test "x$sys_tmac_file_prefix" = "xtmac."; then + if test "$sys_tmac_file_prefix" = tmac.; then for f in $sys_tmac_prefix*; do suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` case "$suff" in @@ -23915,41 +28902,44 @@ $as_echo_n "checking which system macro packages should be made available... " > done rm -f conftest.sol fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tmac_wrap" >&5 -$as_echo "$tmac_wrap" >&6; } + tmac_wrap_result="none found" + test -z "$tmac_wrap" || tmac_wrap_result="$tmac_wrap" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tmac_wrap_result" >&5 +printf "%s\n" "$tmac_wrap_result" >&6; } # Check whether --with-compatibility-wrappers was given. -if test "${with_compatibility_wrappers+set}" = set; then : +if test ${with_compatibility_wrappers+y} +then : withval=$with_compatibility_wrappers; compatibility_wrappers="$withval" -else +else $as_nop compatibility_wrappers="check" fi - if test "x$compatibility_wrappers" != "xcheck" -a \ - "x$compatibility_wrappers" != "xyes" -a \ - "x$compatibility_wrappers" != "xno" -a \ - "x$compatibility_wrappers" != "xmanual" + if test "$compatibility_wrappers" != check \ + && test "$compatibility_wrappers" != yes \ + && test "$compatibility_wrappers" != no \ + && test "$compatibility_wrappers" != manual then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&5 -$as_echo "$as_me: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&5 +printf "%s\n" "$as_me: WARNING: Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested." >&2;} compatibility_wrappers="check" fi - if test "x$tmac_wrap" = "x" + if test -z "$tmac_wrap" then # No Operating System Macro Sets Present - if test "x$compatibility_wrappers" = "xcheck" + if test "$compatibility_wrappers" = check then compatibility_wrappers="no" - elif test "x$compatibility_wrappers" = "xyes" + elif test "$compatibility_wrappers" = yes then as_fn_error $? "No non-GNU macro sets found - cannot create and install compatibility wrappers" "$LINENO" 5 - elif test "x$compatibility_wrappers" = "xno" + elif test "$compatibility_wrappers" = no then : # No action required - elif test "x$compatibility_wrappers" = "xmanual" + elif test "$compatibility_wrappers" = manual then # 'manual' allows quiet conversion to 'no' to support # cross-platform build instructions @@ -23957,7 +28947,7 @@ $as_echo "$as_me: WARNING: Invalid '--with-compatibility-wrappers' argument: '$c fi else # One or more Operating System Macro Sets Present - if test "x$compatibility_wrappers" = "xcheck" + if test "$compatibility_wrappers" = check then compatibility_wrappers="yes" fi @@ -23966,9 +28956,9 @@ $as_echo "$as_me: WARNING: Invalid '--with-compatibility-wrappers' argument: '$c # Now compatibility_wrappers can only be yes, no or manual -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking separator character to use in groff search paths" >&5 -$as_echo_n "checking separator character to use in groff search paths... " >&6; } - cp ${srcdir}/src/include/nonposix.h conftest.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking separator character to use in groff search paths" >&5 +printf %s "checking separator character to use in groff search paths... " >&6; } + cp "$srcdir"/src/include/nonposix.h conftest.h cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -23979,7 +28969,7 @@ $as_echo_n "checking separator character to use in groff search paths... " >&6; int -main () +main (void) { @@ -23993,20 +28983,22 @@ make an error "Path separator is ';'" } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : GROFF_PATH_SEPARATOR=":" -else +else $as_nop GROFF_PATH_SEPARATOR=";" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF_PATH_SEPARATOR" >&5 -$as_echo "$GROFF_PATH_SEPARATOR" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GROFF_PATH_SEPARATOR" >&5 +printf "%s\n" "$GROFF_PATH_SEPARATOR" >&6; } # Check whether --with-alt-gs was given. -if test "${with_alt_gs+set}" = set; then : +if test ${with_alt_gs+y} +then : withval=$with_alt_gs; ALT_GHOSTSCRIPT_PROGS="$withval" -else +else $as_nop ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2" fi @@ -24014,19 +29006,21 @@ fi # Check whether --with-gs was given. -if test "${with_gs+set}" = set; then : +if test ${with_gs+y} +then : withval=$with_gs; GHOSTSCRIPT=$withval -else +else $as_nop if test -n "$ac_tool_prefix"; then for ac_prog in $ALT_GHOSTSCRIPT_PROGS do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_GHOSTSCRIPT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_GHOSTSCRIPT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$GHOSTSCRIPT"; then ac_cv_prog_GHOSTSCRIPT="$GHOSTSCRIPT" # Let the user override the test. else @@ -24034,11 +29028,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_GHOSTSCRIPT="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24049,11 +29047,11 @@ fi fi GHOSTSCRIPT=$ac_cv_prog_GHOSTSCRIPT if test -n "$GHOSTSCRIPT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GHOSTSCRIPT" >&5 -$as_echo "$GHOSTSCRIPT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GHOSTSCRIPT" >&5 +printf "%s\n" "$GHOSTSCRIPT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -24066,11 +29064,12 @@ if test -z "$GHOSTSCRIPT"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_GHOSTSCRIPT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_GHOSTSCRIPT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_GHOSTSCRIPT"; then ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_ct_GHOSTSCRIPT" # Let the user override the test. else @@ -24078,11 +29077,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24093,11 +29096,11 @@ fi fi ac_ct_GHOSTSCRIPT=$ac_cv_prog_ac_ct_GHOSTSCRIPT if test -n "$ac_ct_GHOSTSCRIPT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GHOSTSCRIPT" >&5 -$as_echo "$ac_ct_GHOSTSCRIPT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GHOSTSCRIPT" >&5 +printf "%s\n" "$ac_ct_GHOSTSCRIPT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -24109,8 +29112,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac GHOSTSCRIPT=$ac_ct_GHOSTSCRIPT @@ -24119,103 +29122,117 @@ fi fi - test "$GHOSTSCRIPT" = "no" && GHOSTSCRIPT=missing -make_htmldoc= - make_install_htmldoc= - make_uninstall_htmldoc= - make_htmlexamples= - make_install_htmlexamples= - make_uninstall_htmlexamples= + test "$GHOSTSCRIPT" = no && GHOSTSCRIPT=missing - missing= - # Extract the first word of "pnmcut", so it can be a program name with args. -set dummy pnmcut; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_pnmcut+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$pnmcut"; then - ac_cv_prog_pnmcut="$pnmcut" # Let the user override the test. + + make_htmldoc=no + missing= + + # Extract the first word of "pnmcrop", so it can be a program name with args. +set dummy pnmcrop; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_pnmcrop+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$pnmcrop"; then + ac_cv_prog_pnmcrop="$pnmcrop" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_pnmcut="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmcrop="found" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS - test -z "$ac_cv_prog_pnmcut" && ac_cv_prog_pnmcut="missing" + test -z "$ac_cv_prog_pnmcrop" && ac_cv_prog_pnmcrop="missing" fi fi -pnmcut=$ac_cv_prog_pnmcut -if test -n "$pnmcut"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pnmcut" >&5 -$as_echo "$pnmcut" >&6; } +pnmcrop=$ac_cv_prog_pnmcrop +if test -n "$pnmcrop"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmcrop" >&5 +printf "%s\n" "$pnmcrop" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $pnmcut = missing; then - missing="$missing 'pnmcut'" - fi;# Extract the first word of "pnmcrop", so it can be a program name with args. -set dummy pnmcrop; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_pnmcrop+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$pnmcrop"; then - ac_cv_prog_pnmcrop="$pnmcrop" # Let the user override the test. + if test $pnmcrop = missing + then + missing="$missing 'pnmcrop'" + fi + + # Extract the first word of "pnmcut", so it can be a program name with args. +set dummy pnmcut; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_pnmcut+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$pnmcut"; then + ac_cv_prog_pnmcut="$pnmcut" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_pnmcrop="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmcut="found" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS - test -z "$ac_cv_prog_pnmcrop" && ac_cv_prog_pnmcrop="missing" + test -z "$ac_cv_prog_pnmcut" && ac_cv_prog_pnmcut="missing" fi fi -pnmcrop=$ac_cv_prog_pnmcrop -if test -n "$pnmcrop"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pnmcrop" >&5 -$as_echo "$pnmcrop" >&6; } +pnmcut=$ac_cv_prog_pnmcut +if test -n "$pnmcut"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmcut" >&5 +printf "%s\n" "$pnmcut" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $pnmcrop = missing; then - missing="$missing 'pnmcrop'" - fi;# Extract the first word of "pnmtopng", so it can be a program name with args. + if test $pnmcut = missing + then + missing="$missing 'pnmcut'" + fi + + # Extract the first word of "pnmtopng", so it can be a program name with args. set dummy pnmtopng; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_pnmtopng+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_pnmtopng+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$pnmtopng"; then ac_cv_prog_pnmtopng="$pnmtopng" # Let the user override the test. else @@ -24223,11 +29240,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_pnmtopng="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24239,158 +29260,160 @@ fi fi pnmtopng=$ac_cv_prog_pnmtopng if test -n "$pnmtopng"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pnmtopng" >&5 -$as_echo "$pnmtopng" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmtopng" >&5 +printf "%s\n" "$pnmtopng" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $pnmtopng = missing; then - missing="$missing 'pnmtopng'" - fi;# Extract the first word of "psselect", so it can be a program name with args. -set dummy psselect; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_psselect+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$psselect"; then - ac_cv_prog_psselect="$psselect" # Let the user override the test. + if test $pnmtopng = missing + then + missing="$missing 'pnmtopng'" + fi + + # Extract the first word of "pnmtops", so it can be a program name with args. +set dummy pnmtops; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_pnmtops+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$pnmtops"; then + ac_cv_prog_pnmtops="$pnmtops" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_psselect="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmtops="found" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS - test -z "$ac_cv_prog_psselect" && ac_cv_prog_psselect="missing" + test -z "$ac_cv_prog_pnmtops" && ac_cv_prog_pnmtops="missing" fi fi -psselect=$ac_cv_prog_psselect -if test -n "$psselect"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $psselect" >&5 -$as_echo "$psselect" >&6; } +pnmtops=$ac_cv_prog_pnmtops +if test -n "$pnmtops"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pnmtops" >&5 +printf "%s\n" "$pnmtops" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $psselect = missing; then - missing="$missing 'psselect'" - fi;# Extract the first word of "pnmtops", so it can be a program name with args. -set dummy pnmtops; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_pnmtops+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$pnmtops"; then - ac_cv_prog_pnmtops="$pnmtops" # Let the user override the test. + if test $pnmtops = missing + then + missing="$missing 'pnmtops'" + fi + + # Extract the first word of "psselect", so it can be a program name with args. +set dummy psselect; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_psselect+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$psselect"; then + ac_cv_prog_psselect="$psselect" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_pnmtops="found" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_psselect="found" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS - test -z "$ac_cv_prog_pnmtops" && ac_cv_prog_pnmtops="missing" + test -z "$ac_cv_prog_psselect" && ac_cv_prog_psselect="missing" fi fi -pnmtops=$ac_cv_prog_pnmtops -if test -n "$pnmtops"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pnmtops" >&5 -$as_echo "$pnmtops" >&6; } +psselect=$ac_cv_prog_psselect +if test -n "$psselect"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $psselect" >&5 +printf "%s\n" "$psselect" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $pnmtops = missing; then - missing="$missing 'pnmtops'" - fi; - - test "$GHOSTSCRIPT" = "missing" && missing="$missing 'gs'" + if test $psselect = missing + then + missing="$missing 'psselect'" + fi - if test -z "$missing"; then - if test $docadd_html = yes; then - make_htmldoc=htmldoc - make_install_htmldoc=install_htmldoc - make_uninstall_htmldoc=uninstall_htmldoc - if test $docadd_examples = yes; then - make_htmlexamples=html_examples - make_install_htmlexamples=install_htmlexamples - make_uninstall_htmlexamples=uninstall_htmlexamples - fi - fi - else - plural=`set $missing; test $# -gt 1 && echo s` - missing=`set $missing - missing="" - while test $# -gt 0 - do - case $# in - 1) missing="$missing$1" ;; - 2) missing="$missing$1 and " ;; - *) missing="$missing$1, " ;; - esac - shift - done - echo $missing` - - docnote=. - test $docadd_html = yes && docnote='; - therefore, it will neither be possible to prepare, nor to install, - documentation in HTML format.' - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: missing program$plural: - - The program$plural - $missing - cannot be found in the PATH. - Consequently, groff's HTML backend (grohtml) will not work properly$docnote - " >&5 -$as_echo "$as_me: WARNING: missing program$plural: - - The program$plural - $missing - cannot be found in the PATH. - Consequently, groff's HTML backend (grohtml) will not work properly$docnote - " >&2;} - doc_dist_target_ok=no - fi + test "$GHOSTSCRIPT" = "missing" && missing="'gs' $missing" + if test -z "$missing" + then + make_htmldoc=yes + else + plural=`set $missing; test $# -gt 1 && echo s` + oxford=`set $missing; test $# -gt 2 && echo ,` + missing=`set $missing + missing= + while test $# -gt 0 + do + case $# in + 1) missing="$missing$1" ;; + 2) missing="$missing$1$oxford and " ;; + *) missing="$missing$1, " ;; + esac + shift + done + echo $missing` + verb=`set $missing + if test $# -gt 1 + then + echo were + else + echo was + fi` + grohtml_notice="The program$plural $missing $verb not found in \ +\$PATH. + Consequently, groff's HTML output driver, 'grohtml', will not work + properly. It will not be possible to prepare or install + groff-generated documentation in HTML format. +" + fi # Check whether --with-alt-awk was given. -if test "${with_alt_awk+set}" = set; then : +if test ${with_alt_awk+y} +then : withval=$with_alt_awk; ALT_AWK_PROGS="$withval" -else +else $as_nop ALT_AWK_PROGS="gawk mawk nawk awk" fi @@ -24398,19 +29421,21 @@ fi # Check whether --with-awk was given. -if test "${with_awk+set}" = set; then : +if test ${with_awk+y} +then : withval=$with_awk; AWK=$withval -else +else $as_nop if test -n "$ac_tool_prefix"; then for ac_prog in $ALT_AWK_PROGS do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -24418,11 +29443,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24433,11 +29462,11 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -24450,11 +29479,12 @@ if test -z "$AWK"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AWK"; then ac_cv_prog_ac_ct_AWK="$ac_ct_AWK" # Let the user override the test. else @@ -24462,128 +29492,207 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done -IFS=$as_save_IFS +IFS=$as_save_IFS + +fi +fi +ac_ct_AWK=$ac_cv_prog_ac_ct_AWK +if test -n "$ac_ct_AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AWK" >&5 +printf "%s\n" "$ac_ct_AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AWK" && break +done + + if test "x$ac_ct_AWK" = x; then + AWK="missing" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AWK=$ac_ct_AWK + fi +fi + +fi + + test "$AWK" = no && AWK=missing + + + + + use_pdfroff=no + pdfroff_missing_deps= + + test "$AWK" = missing && pdfroff_missing_deps="awk" + + if test "$GHOSTSCRIPT" = missing + then + verb=is + + if test -n "$pdfroff_missing_deps" + then + pdfroff_missing_deps="$pdfroff_missing_deps and " + verb=are + fi + pdfroff_missing_deps="${pdfroff_missing_deps}Ghostscript $verb" + fi + + if test -z "$pdfroff_missing_deps" + then + use_pdfroff=yes + fi + + + + + + + groff_have_urw_fonts=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for URW fonts in Type 1/PFB format" >&5 +printf %s "checking for URW fonts in Type 1/PFB format... " >&6; } + + _list_paths="\ + /usr/share/fonts/type1/gsfonts/ \ + /usr/share/fonts/default/Type1/ \ + /usr/share/fonts/default/Type1/adobestd35/ \ + /usr/share/fonts/type1/urw-base35/ \ + /opt/local/share/fonts/urw-fonts/ \ + /usr/local/share/fonts/ghostscript/" + + if test -n "$urwfontsdir" + then + _list_paths="$urwfontsdir" + fi + + for k in $_list_paths + do + for _font_file in \ + URWGothic-Book \ + URWGothic-Book.t1 \ + URWGothic-Book.pfb \ + URWGothicL-Book.pfb \ + a010013l.pfb + do + if test -f $k/$_font_file + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found in $k" >&5 +printf "%s\n" "found in $k" >&6; } + groff_have_urw_fonts=yes + urwfontsdir=$k + break 2 + fi + done + done -fi -fi -ac_ct_AWK=$ac_cv_prog_ac_ct_AWK -if test -n "$ac_ct_AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AWK" >&5 -$as_echo "$ac_ct_AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi + if test $groff_have_urw_fonts = no + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none found" >&5 +printf "%s\n" "none found" >&6; } + urwfontsdir= + fi - test -n "$ac_ct_AWK" && break -done - if test "x$ac_ct_AWK" = x; then - AWK="missing" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AWK=$ac_ct_AWK + + + + + + use_gropdf=no + gropdf_missing_deps= + + if test "$GHOSTSCRIPT" != missing \ + || test "$groff_have_urw_fonts" = yes + then + use_gropdf=yes fi -fi -fi - test "$AWK" = "no" && AWK=missing -make_pdfdoc= - make_install_pdfdoc= - make_uninstall_pdfdoc= - make_pdfexamples= - make_install_pdfexamples= - make_uninstall_pdfexamples= - missing="" - test "$AWK" = missing && missing="'awk'" - test "$GHOSTSCRIPT" = missing && missing="$missing 'gs'" - if test -z "$missing"; then - if test $docadd_pdf = yes; then - make_pdfdoc=pdfdoc - make_install_pdfdoc=install_pdfdoc - make_uninstall_pdfdoc=uninstall_pdfdoc - if test $docadd_examples = yes; then - make_pdfexamples=pdfexamples - make_install_pdfexamples=install_pdfexamples - make_uninstall_pdfexamples=uninstall_pdfexamples - fi - fi - else - plural=`set $missing; test $# -eq 2 && echo s` - test x$plural = xs \ - && missing=`set $missing; echo "$1 and $2"` \ - || missing=`echo $missing` - - docnote=. - test $docadd_pdf = yes && docnote='; - therefore, it will neither be possible to prepare, nor to install, - documentation and most of the examples in PDF format.' - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: missing program$plural: - - The program$plural $missing cannot be found in the PATH. - Consequently, groff's PDF formatter (pdfroff) will not work properly$docnote - " >&5 -$as_echo "$as_me: WARNING: missing program$plural: - - The program$plural $missing cannot be found in the PATH. - Consequently, groff's PDF formatter (pdfroff) will not work properly$docnote - " >&2;} - doc_dist_target_ok=no - fi + pnmtools_quiet= + if test "$make_htmldoc" = yes + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether PNM tools accept the '-quiet' option" >&5 +printf %s "checking whether PNM tools accept the '-quiet' option... " >&6; } + if echo P2 2 2 255 0 1 2 0 | pnmtops -quiet > /dev/null 2>&1 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + pnmtools_quiet=-quiet + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pnmtops can handle the -nosetpage option" >&5 -$as_echo_n "checking whether pnmtops can handle the -nosetpage option... " >&6; } - if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1 ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - pnmtops_nosetpage="pnmtops -nosetpage" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - pnmtops_nosetpage="pnmtops" - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether make has builtin variable RM" >&5 -$as_echo_n "checking whether make has builtin variable RM... " >&6; } -cat < test_make_rm.mk + pnmtops_nosetpage="pnmtops $pnmtools_quiet" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pnmtops accepts the '-nosetpage' option" >&5 +printf %s "checking whether pnmtops accepts the '-nosetpage' option... " >&6; } + if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + pnmtops_nosetpage="pnmtops $pnmtools_quiet -nosetpage" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether make defines 'RM'" >&5 +printf %s "checking whether make defines 'RM'... " >&6; } + make=make + if test -n "$MAKE" + then + make=$MAKE + fi + cat < test_make_rm.mk all: - @if test -n "\$(RM)"; then \ - echo "yes"; \ + @if test -n "\$(RM)"; \ + then \ + echo yes; \ else \ - echo "no"; \ + echo no; \ fi EOF - groff_is_rm_defined=`make -sf test_make_rm.mk` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_is_rm_defined" >&5 -$as_echo "$groff_is_rm_defined" >&6; } + groff_make_defines_rm=`"$make" -sf test_make_rm.mk` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_make_defines_rm" >&5 +printf "%s\n" "$groff_make_defines_rm" >&6; } rm -f test_make_rm.mk -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a diff program that supports option -D" >&5 -$as_echo_n "checking for a diff program that supports option -D... " >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a diff program that supports option -D" >&5 +printf %s "checking for a diff program that supports option -D... " >&6; } groff_has_diff_d_option=no DIFF_PROG=diff diff -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes @@ -24592,11 +29701,12 @@ $as_echo_n "checking for a diff program that supports option -D... " >&6; } do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_GDIFF+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_GDIFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$GDIFF"; then ac_cv_prog_GDIFF="$GDIFF" # Let the user override the test. else @@ -24604,11 +29714,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_GDIFF="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24619,11 +29733,11 @@ fi fi GDIFF=$ac_cv_prog_GDIFF if test -n "$GDIFF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDIFF" >&5 -$as_echo "$GDIFF" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GDIFF" >&5 +printf "%s\n" "$GDIFF" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -24637,25 +29751,26 @@ done fi fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $groff_has_diff_d_option" >&5 -$as_echo "$groff_has_diff_d_option" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $groff_has_diff_d_option" >&5 +printf "%s\n" "$groff_has_diff_d_option" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether test supports option -ef" >&5 -$as_echo_n "checking whether test supports option -ef... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether test supports option -ef" >&5 +printf %s "checking whether test supports option -ef... " >&6; } HAVE_TEST_EF_OPTION=no test /dev/null -ef /dev/null > /dev/null 2>&1 && HAVE_TEST_EF_OPTION=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_TEST_EF_OPTION" >&5 -$as_echo "$HAVE_TEST_EF_OPTION" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_TEST_EF_OPTION" >&5 +printf "%s\n" "$HAVE_TEST_EF_OPTION" >&6; } for ac_prog in bash do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_BASH_PROG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_BASH_PROG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $BASH_PROG in [\\/]* | ?:[\\/]*) ac_cv_path_BASH_PROG="$BASH_PROG" # Let the user override the test with a path. @@ -24665,11 +29780,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_BASH_PROG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_BASH_PROG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -24681,11 +29800,11 @@ esac fi BASH_PROG=$ac_cv_path_BASH_PROG if test -n "$BASH_PROG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH_PROG" >&5 -$as_echo "$BASH_PROG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BASH_PROG" >&5 +printf "%s\n" "$BASH_PROG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -24693,16 +29812,77 @@ fi done test -n "$BASH_PROG" || BASH_PROG="no" - if test x$BASH_PROG = xno; then + if test "$BASH_PROG" = no; then BASH_PROG=/bin/sh fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5 -$as_echo_n "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; } -if ${ac_cv_gnu_library_2_1+:} false; then : - $as_echo_n "(cached) " >&6 -else + + + if test "$GHOSTSCRIPT" != missing + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gs version with good left sidebearing handling" >&5 +printf %s "checking for gs version with good left sidebearing handling... " >&6; } + ghostscript_notice= + ghostscript_version_good= + ghostscript_v_string=`"$GHOSTSCRIPT" -v | sed 1q` + # Get first word. + ghostscript_words=`echo "$ghostscript_v_string" | cut -d\ -f1-` + + # If the first word is "GPL", discard it. + if expr "$ghostscript_words" : "GPL" > /dev/null + then + ghostscript_words=`echo "$ghostscript_words" | cut -d\ -f2-` + fi + + # Only do a version check if the program calls itself Ghostscript. + if expr "$ghostscript_words" : "Ghostscript" > /dev/null + then + ghostscript_version_good=no + ghostscript_version=`echo "$ghostscript_words" | cut -d\ -f2` + ghostscript_major=`echo "$ghostscript_version" | cut -d. -f1` + ghostscript_minor=`echo "$ghostscript_version" | cut -d. -f2` + + if test "$ghostscript_major" -lt 9 + then + ghostscript_version_good=yes + elif test "$ghostscript_major" -ge 10 + then + ghostscript_version_good=yes + elif test "$ghostscript_minor" -ge 54 + then + ghostscript_version_good=yes + fi + fi + + if test "$ghostscript_version_good" = yes + then + ghostscript_version="$ghostscript_version (good)" + elif test "$ghostscript_version_good" = no + then + ghostscript_version="$ghostscript_version (buggy)" + ghostscript_notice="Buggy version of Ghostscript detected." + else + ghostscript_notice="Unable to determine version of Ghostscript." + fi + + if test -n "$ghostscript_version" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: got $ghostscript_version" >&5 +printf "%s\n" "got $ghostscript_version" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unable to determine" >&5 +printf "%s\n" "unable to determine" >&6; } + fi + fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library >= 2.1 or uClibc" >&5 +printf %s "checking whether we are using the GNU C Library >= 2.1 or uClibc... " >&6; } +if test ${ac_cv_gnu_library_2_1+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -24718,18 +29898,19 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Lucky" >/dev/null 2>&1; then : + $EGREP "Lucky" >/dev/null 2>&1 +then : ac_cv_gnu_library_2_1=yes -else +else $as_nop ac_cv_gnu_library_2_1=no fi -rm -f conftest* +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 -$as_echo "$ac_cv_gnu_library_2_1" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 +printf "%s\n" "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" @@ -24743,39 +29924,6 @@ $as_echo "$ac_cv_gnu_library_2_1" >&6; } -# checks for presence of URW fonts (requires ghostscript, which is -# checked in GROFF_HTML_PROGRAMS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether URW fonts in pfb format are available" >&5 -$as_echo_n "checking whether URW fonts in pfb format are available... " >&6; } - - - groff_have_urw_fonts=no - if test "$AWK" = "missing" -o "$GHOSTSCRIPT" = "missing"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: awk and gs are required, can't look for URW fonts" >&5 -$as_echo "$as_me: WARNING: awk and gs are required, can't look for URW fonts" >&2;} - else - _list_paths=`$GHOSTSCRIPT -h | $AWK 'BEGIN { found = 0 } /Search path:/ { found = 1 } /^ *\// { print $'0' }'| tr : ' '` - _list_paths="$_list_paths /usr/share/fonts/type1/gsfonts/ \ - /opt/local/share/fonts/urw-fonts/" - if test -n "$urwfontsdir"; then - _list_paths="$ _list_paths $urwfontsdir" - fi - for k in $_list_paths; do - if test -f $k/a010013l.pfb; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $k" >&5 -$as_echo "found in $k" >&6; } - groff_have_urw_fonts=yes - break - fi - done - fi - if test $groff_have_urw_fonts = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - - - if test -n "$make_winscripts"; then BUILD_WINSCRIPTS_TRUE= BUILD_WINSCRIPTS_FALSE='#' @@ -24793,7 +29941,7 @@ fi # src/devices/xditview # src/utils/xtotroff # src/libs/libxutil - if test "x$groff_no_x" = "xyes"; then + if test "$groff_no_x" = yes; then WITHOUT_X11_TRUE= WITHOUT_X11_FALSE='#' else @@ -24802,18 +29950,18 @@ else fi -# make builtin variable RM - if test "x$groff_is_rm_defined" = "xno"; then - MAKE_DONT_HAVE_RM_TRUE= - MAKE_DONT_HAVE_RM_FALSE='#' + if test "$groff_make_defines_rm" = yes; then + MAKE_DEFINES_RM_TRUE= + MAKE_DEFINES_RM_FALSE='#' else - MAKE_DONT_HAVE_RM_TRUE='#' - MAKE_DONT_HAVE_RM_FALSE= + MAKE_DEFINES_RM_TRUE='#' + MAKE_DEFINES_RM_FALSE= fi -# Some programs have a "g" prefix if an existing groff installation is detected - if test x$g = xg; then +# Some programs have a "g" prefix if an existing troff installation is +# detected. + if test "$g" = g; then USEPROGRAMPREFIX_TRUE= USEPROGRAMPREFIX_FALSE='#' else @@ -24822,79 +29970,56 @@ else fi - if test -n "$make_infodoc"; then - BUILD_INFODOC_TRUE= - BUILD_INFODOC_FALSE='#' -else - BUILD_INFODOC_TRUE='#' - BUILD_INFODOC_FALSE= -fi - - if test -n "$make_htmldoc"; then - BUILD_HTML_TRUE= - BUILD_HTML_FALSE='#' -else - BUILD_HTML_TRUE='#' - BUILD_HTML_FALSE= -fi - - if test -n "$make_htmlexamples"; then - BUILD_HTMLEXAMPLES_TRUE= - BUILD_HTMLEXAMPLES_FALSE='#' -else - BUILD_HTMLEXAMPLES_TRUE='#' - BUILD_HTMLEXAMPLES_FALSE= -fi - - if test -n "$make_pdfdoc"; then - BUILD_PDFDOC_TRUE= - BUILD_PDFDOC_FALSE='#' + if test "$use_grohtml" = yes; then + USE_GROHTML_TRUE= + USE_GROHTML_FALSE='#' else - BUILD_PDFDOC_TRUE='#' - BUILD_PDFDOC_FALSE= + USE_GROHTML_TRUE='#' + USE_GROHTML_FALSE= fi - if test -n "$make_pdfexamples"; then - BUILD_PDFEXAMPLES_TRUE= - BUILD_PDFEXAMPLES_FALSE='#' + if test "$use_pdfroff" = yes; then + USE_PDFROFF_TRUE= + USE_PDFROFF_FALSE='#' else - BUILD_PDFEXAMPLES_TRUE='#' - BUILD_PDFEXAMPLES_FALSE= + USE_PDFROFF_TRUE='#' + USE_PDFROFF_FALSE= fi - if test -n "$make_otherdoc"; then - BUILD_OTHERDOC_TRUE= - BUILD_OTHERDOC_FALSE='#' + if test "$use_gropdf" = yes; then + USE_GROPDF_TRUE= + USE_GROPDF_FALSE='#' else - BUILD_OTHERDOC_TRUE='#' - BUILD_OTHERDOC_FALSE= + USE_GROPDF_TRUE='#' + USE_GROPDF_FALSE= fi - if test -n "$make_examples"; then - BUILD_EXAMPLES_TRUE= - BUILD_EXAMPLES_FALSE='#' + if test "$groff_use_own_allocator" = yes; then + USE_GROFF_ALLOCATOR_TRUE= + USE_GROFF_ALLOCATOR_FALSE='#' else - BUILD_EXAMPLES_TRUE='#' - BUILD_EXAMPLES_FALSE= + USE_GROFF_ALLOCATOR_TRUE='#' + USE_GROFF_ALLOCATOR_FALSE= fi - if test -n "$make_install_shipped_htmldoc"; then - INSTALL_SHIPPED_HTML_TRUE= - INSTALL_SHIPPED_HTML_FALSE='#' + if test "$GHOSTSCRIPT" != no \ + && test "$GHOSTSCRIPT" != missing; then + HAVE_GHOSTSCRIPT_TRUE= + HAVE_GHOSTSCRIPT_FALSE='#' else - INSTALL_SHIPPED_HTML_TRUE='#' - INSTALL_SHIPPED_HTML_FALSE= + HAVE_GHOSTSCRIPT_TRUE='#' + HAVE_GHOSTSCRIPT_FALSE= fi - if test "x$groff_have_pdftools" = "xyes" ; then - HAVE_PDFTOOLS_TRUE= - HAVE_PDFTOOLS_FALSE='#' + if test "$groff_have_urw_fonts" = yes ; then + HAVE_URW_FONTS_TRUE= + HAVE_URW_FONTS_FALSE='#' else - HAVE_PDFTOOLS_TRUE='#' - HAVE_PDFTOOLS_FALSE= + HAVE_URW_FONTS_TRUE='#' + HAVE_URW_FONTS_FALSE= fi - if test "x$groff_have_texi2dvi" = "xyes" ; then + if test "$groff_have_texi2dvi" = yes ; then HAVE_TEXI2DVI_TRUE= HAVE_TEXI2DVI_FALSE='#' else @@ -24902,6 +30027,14 @@ else HAVE_TEXI2DVI_FALSE= fi + if test "$groff_use_tex" = yes ; then + USE_TEX_TRUE= + USE_TEX_FALSE='#' +else + USE_TEX_TRUE='#' + USE_TEX_FALSE= +fi + ac_config_files="$ac_config_files Makefile" @@ -24934,8 +30067,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -24965,15 +30098,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -24987,8 +30120,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -25005,7 +30138,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -25016,14 +30149,14 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -25048,96 +30181,61 @@ if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_FLOAT_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - - -if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - - - - # Tell AC_LIBSOURCES where to find source files like alloca.c. - - # This hack originated in bison. It is required when using non-recursive - # automake rules to build from gnulib-provided lib/ sources. Hence, LIB_DIR - # is usually simply "lib". Those rules use the list of names like "fchdir.o" - # and "strstr.o" in gl_LIBOBJS. With non-recursive make, we must prefix each - # such file name with the "lib/" prefix. See also build-aux/prefix-gnulib-mk. - gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, , lib/,g'` - # Listing the names of the variables to prefix is error-prone. - # Rather, adjust each AC_SUBST'd variable whose name ends in '_H' - # and whose value ends in '.h'. - for ac_var in $ac_subst_vars - do - eval "ac_val=\$$ac_var" - case $ac_var:$ac_val in - *_H:*.h) eval "$ac_var=lib/\$$ac_var";; - esac - done - - -if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then - as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then - as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi gl_libobjs= gl_ltlibobjs= + gl_libobjdeps= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' + sed_dirname1='s,//*,/,g' + sed_dirname2='s,\(.\)/$,\1,' + sed_dirname3='s,^[^/]*$,.,' + sed_dirname4='s,\(.\)/[^/]*$,\1,' + sed_basename1='s,.*/,,' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do - gl_libobjs="$gl_libobjs $i.$ac_objext" - gl_ltlibobjs="$gl_ltlibobjs $i.lo" + gl_libobjs="$gl_libobjs lib/$i.$ac_objext" + gl_ltlibobjs="$gl_ltlibobjs lib/$i.lo" + i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` + i_base=`echo "$i" | sed -e "$sed_basename1"` + gl_libobjdeps="$gl_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po" done fi gl_LIBOBJS=$gl_libobjs gl_LTLIBOBJS=$gl_ltlibobjs + gl_LIBOBJDEPS=$gl_libobjdeps + gltests_libobjs= gltests_ltlibobjs= + gltests_libobjdeps= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' + sed_dirname1='s,//*,/,g' + sed_dirname2='s,\(.\)/$,\1,' + sed_dirname3='s,^[^/]*$,.,' + sed_dirname4='s,\(.\)/[^/]*$,\1,' + sed_basename1='s,.*/,,' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do - gltests_libobjs="$gltests_libobjs $i.$ac_objext" - gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" + gltests_libobjs="$gltests_libobjs lib/$i.$ac_objext" + gltests_ltlibobjs="$gltests_ltlibobjs lib/$i.lo" + i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` + i_base=`echo "$i" | sed -e "$sed_basename1"` + gltests_libobjdeps="$gltests_libobjdeps lib/$i_dir/\$(DEPDIR)/$i_base.Po" done fi gltests_LIBOBJS=$gltests_libobjs gltests_LTLIBOBJS=$gltests_ltlibobjs + gltests_LIBOBJDEPS=$gltests_libobjdeps + if test -z "${BUILD_WINSCRIPTS_TRUE}" && test -z "${BUILD_WINSCRIPTS_FALSE}"; then @@ -25148,61 +30246,53 @@ if test -z "${WITHOUT_X11_TRUE}" && test -z "${WITHOUT_X11_FALSE}"; then as_fn_error $? "conditional \"WITHOUT_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${MAKE_DONT_HAVE_RM_TRUE}" && test -z "${MAKE_DONT_HAVE_RM_FALSE}"; then - as_fn_error $? "conditional \"MAKE_DONT_HAVE_RM\" was never defined. +if test -z "${MAKE_DEFINES_RM_TRUE}" && test -z "${MAKE_DEFINES_RM_FALSE}"; then + as_fn_error $? "conditional \"MAKE_DEFINES_RM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USEPROGRAMPREFIX_TRUE}" && test -z "${USEPROGRAMPREFIX_FALSE}"; then as_fn_error $? "conditional \"USEPROGRAMPREFIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${BUILD_INFODOC_TRUE}" && test -z "${BUILD_INFODOC_FALSE}"; then - as_fn_error $? "conditional \"BUILD_INFODOC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_HTML_TRUE}" && test -z "${BUILD_HTML_FALSE}"; then - as_fn_error $? "conditional \"BUILD_HTML\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_HTMLEXAMPLES_TRUE}" && test -z "${BUILD_HTMLEXAMPLES_FALSE}"; then - as_fn_error $? "conditional \"BUILD_HTMLEXAMPLES\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_PDFDOC_TRUE}" && test -z "${BUILD_PDFDOC_FALSE}"; then - as_fn_error $? "conditional \"BUILD_PDFDOC\" was never defined. +if test -z "${USE_GROHTML_TRUE}" && test -z "${USE_GROHTML_FALSE}"; then + as_fn_error $? "conditional \"USE_GROHTML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${BUILD_PDFEXAMPLES_TRUE}" && test -z "${BUILD_PDFEXAMPLES_FALSE}"; then - as_fn_error $? "conditional \"BUILD_PDFEXAMPLES\" was never defined. +if test -z "${USE_PDFROFF_TRUE}" && test -z "${USE_PDFROFF_FALSE}"; then + as_fn_error $? "conditional \"USE_PDFROFF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${BUILD_OTHERDOC_TRUE}" && test -z "${BUILD_OTHERDOC_FALSE}"; then - as_fn_error $? "conditional \"BUILD_OTHERDOC\" was never defined. +if test -z "${USE_GROPDF_TRUE}" && test -z "${USE_GROPDF_FALSE}"; then + as_fn_error $? "conditional \"USE_GROPDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then - as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. +if test -z "${USE_GROFF_ALLOCATOR_TRUE}" && test -z "${USE_GROFF_ALLOCATOR_FALSE}"; then + as_fn_error $? "conditional \"USE_GROFF_ALLOCATOR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${INSTALL_SHIPPED_HTML_TRUE}" && test -z "${INSTALL_SHIPPED_HTML_FALSE}"; then - as_fn_error $? "conditional \"INSTALL_SHIPPED_HTML\" was never defined. +if test -z "${HAVE_GHOSTSCRIPT_TRUE}" && test -z "${HAVE_GHOSTSCRIPT_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GHOSTSCRIPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${HAVE_PDFTOOLS_TRUE}" && test -z "${HAVE_PDFTOOLS_FALSE}"; then - as_fn_error $? "conditional \"HAVE_PDFTOOLS\" was never defined. +if test -z "${HAVE_URW_FONTS_TRUE}" && test -z "${HAVE_URW_FONTS_FALSE}"; then + as_fn_error $? "conditional \"HAVE_URW_FONTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_TEXI2DVI_TRUE}" && test -z "${HAVE_TEXI2DVI_FALSE}"; then as_fn_error $? "conditional \"HAVE_TEXI2DVI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${USE_TEX_TRUE}" && test -z "${USE_TEX_FALSE}"; then + as_fn_error $? "conditional \"USE_TEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -25225,14 +30315,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -25242,46 +30334,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -25290,13 +30382,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -25305,8 +30390,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -25318,30 +30407,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -25354,13 +30423,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -25387,18 +30457,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -25410,12 +30482,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -25446,7 +30519,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -25468,6 +30541,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -25481,6 +30558,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -25522,7 +30605,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -25531,7 +30614,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -25593,8 +30676,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by GNU Troff $as_me 1.22.4, which was -generated by GNU Autoconf 2.69. Invocation command line was +This file was extended by GNU roff $as_me 1.23.0, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -25654,18 +30737,20 @@ Configuration commands: $config_commands Report bugs to . -GNU Troff home page: . -General help using GNU software: ." +GNU roff home page: . +General help using GNU software: ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -GNU Troff config.status 1.22.4 -configured by $0, generated by GNU Autoconf 2.69, +GNU roff config.status 1.23.0 +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -25705,15 +30790,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -25721,7 +30806,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -25730,7 +30815,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -25758,7 +30843,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -25772,7 +30857,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -25805,9 +30890,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -26143,7 +31228,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -26151,17 +31236,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -26178,7 +31263,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -26202,9 +31287,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -26266,8 +31351,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -26311,9 +31396,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -26329,20 +31414,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi @@ -26362,7 +31447,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -26382,8 +31467,8 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -26409,7 +31494,7 @@ esac for am_mf do # Strip MF so we end up with the name of the file. - am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line @@ -26421,7 +31506,7 @@ $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$am_mf" | +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -26443,7 +31528,7 @@ $as_echo X"$am_mf" | $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$am_mf" | +printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -26468,10 +31553,12 @@ $as_echo X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } @@ -26518,135 +31605,314 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " -${PACKAGE_NAME} version ${PACKAGE_VERSION} +$PACKAGE_NAME version $PACKAGE_VERSION ---------------------------------------------------------------------- - Prefix : ${prefix} - Compiler : ${CC} ${CFLAGS} ${CPPFLAGS}" -if test "x$groff_no_x" = "xyes"; then -echo "\ - X11 support : no" -else -echo "\ - X11 support : yes - X11 resources dir : $appresdir" + installation directory prefix : $prefix" +if test -n "$g" +then + echo "\ + command name prefix : $g" + if test -n "$tmac_wrap" + then + echo "\ + prefix used for macro packages : $tmac_wrap" + fi fi -if test "x$doc" = x; then echo "\ - Doc build : no" + C++ compiler and options : $CXX $CXXFLAGS $CPPFLAGS + use libgroff's memory allocator : $groff_use_own_allocator + C compiler and options : $CC $CFLAGS $CPPFLAGS + Perl interpreter version : $perl_version" +if test "$groff_no_x" = yes +then + echo "\ + X11 support : disabled" else -echo "\ - Doc build : ${doc} " + echo "\ + X11 support : enabled + X11 app defaults directory : $appdefdir" fi echo "\ - URW fonts for pdf : $groff_have_urw_fonts - Use uchardet library for preconv: $groff_have_uchardet - pdftools for distcheck : $groff_have_pdftools" + 'groff -l' uses print spooler : $groff_have_spooler + use URW fonts for PDF output : $groff_have_urw_fonts" +if test "$groff_have_urw_fonts" = yes +then + echo "\ + URW fonts directory : $urwfontsdir" +fi echo "\ + preconv can use uchardet library : $groff_have_uchardet + can build groff.dvi, groff.pdf : $groff_use_tex ----------------------------------------------------------------------" if test -z "$groff_no_x"; then - if test "x$with_appresdir" = "x"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: - The application resource files for gxditview (GXditview and - GXditview-color) will be installed in: - - $appresdir - - (existing files will be saved by appending '.old' to the file - name). - - To install them into a different directory, say, - '/etc/X11/app-defaults', add - '--with-appresdir=/etc/X11/app-defaults' to the configure script - command-line options and rerun it ('prefix' value has no effect on - a --with-appresdir option). - - If the gxditview resources are installed in a directory that is not - one of the default X11 resources directories (common default - directories are /usr/lib/X11/app-defaults, - /usr/share/X11/app-defaults and /etc/X11/app-defaults), you will - have to set the environment variable XFILESEARCHPATH to this - path. More details can be found in the X(7) manual page, or in \"X - Toolkit Intrinsics - C Language Interface manual\". + if test -z "$with_appdefdir"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Default X11 application defaults directory \ +assumed. + + The application defaults files for gxditview (GXditview and + GXditview-color) will be installed in the following directory. + + $appdefdir + + To install elsewhere, say, '/etc/X11/app-defaults', add + '--with-appdefdir=/etc/X11/app-defaults' to the configure script + command-line options and rerun it (the 'prefix' value has no effect on + a --with-appdefdir option). + + If the gxditview app-defaults are installed in a directory that is not + one of the default X11 directories for this purpose (common defaults + are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and + /etc/X11/app-defaults), you will have to set the environment variable + XFILESEARCHPATH to this path. More details can be found in the X(7) + manual page, or in the document \"X Toolkit Intrinsics - C Language + Interface manual\". " >&5 -$as_echo "$as_me: - The application resource files for gxditview (GXditview and - GXditview-color) will be installed in: - - $appresdir - - (existing files will be saved by appending '.old' to the file - name). - - To install them into a different directory, say, - '/etc/X11/app-defaults', add - '--with-appresdir=/etc/X11/app-defaults' to the configure script - command-line options and rerun it ('prefix' value has no effect on - a --with-appresdir option). - - If the gxditview resources are installed in a directory that is not - one of the default X11 resources directories (common default - directories are /usr/lib/X11/app-defaults, - /usr/share/X11/app-defaults and /etc/X11/app-defaults), you will - have to set the environment variable XFILESEARCHPATH to this - path. More details can be found in the X(7) manual page, or in \"X - Toolkit Intrinsics - C Language Interface manual\". +printf "%s\n" "$as_me: Default X11 application defaults directory \ +assumed. + + The application defaults files for gxditview (GXditview and + GXditview-color) will be installed in the following directory. + + $appdefdir + + To install elsewhere, say, '/etc/X11/app-defaults', add + '--with-appdefdir=/etc/X11/app-defaults' to the configure script + command-line options and rerun it (the 'prefix' value has no effect on + a --with-appdefdir option). + + If the gxditview app-defaults are installed in a directory that is not + one of the default X11 directories for this purpose (common defaults + are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and + /etc/X11/app-defaults), you will have to set the environment variable + XFILESEARCHPATH to this path. More details can be found in the X(7) + manual page, or in the document \"X Toolkit Intrinsics - C Language + Interface manual\". " >&6;} fi fi -if test "$groff_have_urw_fonts" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: - No URW fonts in .pfb format were found on your system, URW fonts - generation for 'devpdf' will not work properly. These fonts can be - downloaded here: - - http://downloads.ghostscript.com/public/fonts/urw-base35-v1.10.zip - - By default groff will search these fonts in the paths given by \`gs - -h' and in these 2 default directories: - '/usr/share/fonts/type1/gsfonts/' and - '/opt/local/share/fonts/urw-fonts/' (paths used by - font/devpdf/Foundry.in). You can also pass the option - '--with-urw-fonts-dir=DIR' to 'configure' to set a custom path. You - would need to re-run the 'configure' script after installing these - fonts. - " >&5 -$as_echo "$as_me: - No URW fonts in .pfb format were found on your system, URW fonts - generation for 'devpdf' will not work properly. These fonts can be - downloaded here: - - http://downloads.ghostscript.com/public/fonts/urw-base35-v1.10.zip - - By default groff will search these fonts in the paths given by \`gs - -h' and in these 2 default directories: - '/usr/share/fonts/type1/gsfonts/' and - '/opt/local/share/fonts/urw-fonts/' (paths used by - font/devpdf/Foundry.in). You can also pass the option - '--with-urw-fonts-dir=DIR' to 'configure' to set a custom path. You - would need to re-run the 'configure' script after installing these - fonts. + + awk_names=awk + if test -n "$ALT_AWK_PROGS" + then + awk_names="$ALT_AWK_PROGS" + fi + + if test "$AWK" = missing + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No awk program was found in \$PATH. + + It was sought under the name(s) \"$awk_names\". + " >&5 +printf "%s\n" "$as_me: No awk program was found in \$PATH. + + It was sought under the name(s) \"$awk_names\". + " >&6;} + fi + + + + + gs_names=gs + if test -n "$ALT_GHOSTSCRIPT_PROGS" + then + gs_names="$ALT_GHOSTSCRIPT_PROGS" + fi + + if test "$GHOSTSCRIPT" = missing + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No Ghostscript program was found in \$PATH. + + It was sought under the name(s) \"$gs_names\". + + groff documentation will not be available in HTML. + + 'grohtml' will have reduced function, being unable to produce + documents using the 'tbl' preprocessor. + " >&5 +printf "%s\n" "$as_me: No Ghostscript program was found in \$PATH. + + It was sought under the name(s) \"$gs_names\". + + groff documentation will not be available in HTML. + + 'grohtml' will have reduced function, being unable to produce + documents using the 'tbl' preprocessor. + " >&6;} + fi + + + if test -n "$ghostscript_notice" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ghostscript_notice + + Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch + that affects the AT&T troff (and groff) special character '\(lh'; see + . If your + version of Ghostscript has not been patched to fix this problem, you + may need to work around it in groff documents you render for the + PostScript (and, for tbl(1) tables, HTML) output devices. + " >&5 +printf "%s\n" "$as_me: $ghostscript_notice + + Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch + that affects the AT&T troff (and groff) special character '\(lh'; see + . If your + version of Ghostscript has not been patched to fix this problem, you + may need to work around it in groff documents you render for the + PostScript (and, for tbl(1) tables, HTML) output devices. " >&6;} fi -if test "x$groff_have_uchardet" = "xno" -a "x$with_uchardet" != "xno"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: - uchardet library was not found; preprocessor 'preconv', which uses it to detect - the input file encoding, might not work properly (to check how and in which - order 'preconv' tries to determine the file encoding, see its man page). + + if test "$groff_have_urw_fonts" = no + then + gs_verbiage= + if test "$GHOSTSCRIPT" != missing + then + gs_verbiage=' as well as the search path shown by the + "'"$GHOSTSCRIPT"' -h" command (if available)' + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: URW fonts in Type 1/PFB format were not found. + + groff font description files for the URW fonts, used by the 'gropdf' + output driver, will not be available. Use and embedding of fonts from + the 'U' foundry in PDF documents generated by groff will not be + possible. + + You can obtain the URW base 35 fonts from their GitHub project. As of + this writing (2023-02-15), you can find them in the 'fonts' directory + of the following archives (choose one). + + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.zip + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.tar.gz + + You may wish to check for a newer release. + + https://github.com/ArtifexSoftware/urw-base35-fonts/releases + + 'gropdf' looks for these fonts in several directories specified in + font/devpdf/Foundry.in$gs_verbiage. + + You will need to \"make distclean\" and re-run the 'configure' script + after installing the URW fonts. + + Alternatively, you can pass the option '--with-urw-fonts-dir=DIR' + to 'configure' to look for them in the directory DIR you specify. + If found, the 'U' foundry will be available via the '-y' option to + 'gropdf' (accessed via the 'groff' command with the option '-P -y'). + " >&5 +printf "%s\n" "$as_me: URW fonts in Type 1/PFB format were not found. + + groff font description files for the URW fonts, used by the 'gropdf' + output driver, will not be available. Use and embedding of fonts from + the 'U' foundry in PDF documents generated by groff will not be + possible. + + You can obtain the URW base 35 fonts from their GitHub project. As of + this writing (2023-02-15), you can find them in the 'fonts' directory + of the following archives (choose one). + + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.zip + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.tar.gz + + You may wish to check for a newer release. + + https://github.com/ArtifexSoftware/urw-base35-fonts/releases + + 'gropdf' looks for these fonts in several directories specified in + font/devpdf/Foundry.in$gs_verbiage. + + You will need to \"make distclean\" and re-run the 'configure' script + after installing the URW fonts. + + Alternatively, you can pass the option '--with-urw-fonts-dir=DIR' + to 'configure' to look for them in the directory DIR you specify. + If found, the 'U' foundry will be available via the '-y' option to + 'gropdf' (accessed via the 'groff' command with the option '-P -y'). + " >&6;} + fi + + + if test "$groff_have_uchardet" = no && test "$with_uchardet" != no + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: The uchardet library was not found. + + The 'preconv' preprocessor program will be unable to attempt automatic + inference of an input file's character encoding. See the preconv(1) + man page. " >&5 -$as_echo "$as_me: WARNING: - uchardet library was not found; preprocessor 'preconv', which uses it to detect - the input file encoding, might not work properly (to check how and in which - order 'preconv' tries to determine the file encoding, see its man page). - " >&2;} +printf "%s\n" "$as_me: The uchardet library was not found. + + The 'preconv' preprocessor program will be unable to attempt automatic + inference of an input file's character encoding. See the preconv(1) + man page. + " >&6;} + fi + + + + + if test "$make_htmldoc" = no + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $grohtml_notice" >&5 +printf "%s\n" "$as_me: $grohtml_notice" >&6;} + fi + + + + + if test "$use_pdfroff" = no + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: 'pdfroff' will not be functional. + + Because $pdfroff_missing_deps missing, 'pdfroff' will not operate + and the 'pdfmark.pdf' document will not be available. +" >&5 +printf "%s\n" "$as_me: 'pdfroff' will not be functional. + + Because $pdfroff_missing_deps missing, 'pdfroff' will not operate + and the 'pdfmark.pdf' document will not be available. +" >&6;} + fi + + + + + if test "$use_gropdf" = no + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: 'gropdf' will have reduced function. + + Neither Ghostscript nor URW fonts are available; groff documentation + thus will not be available in PDF. + + 'gropdf' will be able to handle only documents using the standard PDF + base 14 fonts, plus the 'EURO' font groff supplies, and font embedding + with its '-e' option (accessed via the 'groff' command with the option + '-P -e') will not be possible. +" >&5 +printf "%s\n" "$as_me: 'gropdf' will have reduced function. + + Neither Ghostscript nor URW fonts are available; groff documentation + thus will not be available in PDF. + + 'gropdf' will be able to handle only documents using the standard PDF + base 14 fonts, plus the 'EURO' font groff supplies, and font embedding + with its '-e' option (accessed via the 'groff' command with the option + '-P -e') will not be possible. +" >&6;} fi + diff --git a/configure.ac b/configure.ac index 28e75f1..4b1e92f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ # Autoconf configuration file for groff. -# Copyright (C) 1989-2018 Free Software Foundation, Inc. +# Copyright (C) 1989-2023 Free Software Foundation, Inc. # # This file is part of groff. # @@ -8,8 +8,8 @@ # Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -18,21 +18,22 @@ # # Process this file with autoconf to produce a configure script. -AC_INIT([GNU Troff], +AC_INIT([GNU roff], m4_esyscmd([build-aux/git-version-gen --prefix "" .tarball-version]), http://savannah.gnu.org/bugs/?group=groff, [groff]) -AC_PREREQ([2.62]) +AC_PREREQ([2.64]) -# SHORT_VERSION contains only the number of REVISION before the first '.', -# e.g. if REVISION is '3.real.434-5aafd' then SHORT_VERSION is 'x.yy.3', -# where x and yy are MAJOR_VERSION and MINOR_VERSION, respectively. +# SHORT_VERSION contains only the number of REVISION before the first +# '.'; e.g., if REVISION is '3.real.434-5aafd' then SHORT_VERSION is +# 'x.yy.3', where x and yy are MAJOR_VERSION and MINOR_VERSION, +# respectively. AC_SUBST([SHORT_VERSION], m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\.\w+\.\w+\).*$],[\1])) -# Directories where the helper scripts should be found. This must be consistent -# with the variable build_aux in bootstrap.conf +# Directories where the helper scripts should be found. This must be +# consistent with the variable build_aux in bootstrap.conf. AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([src/include/config.h:src/include/config.hin]) @@ -54,23 +55,21 @@ GROFF_EBCDIC GROFF_OS390 GROFF_CMD_FILES GROFF_X11 -GROFF_APPRESDIR_OPTION -GROFF_APPRESDIR_DEFAULT +GROFF_APPDEFDIR_OPTION +GROFF_APPDEFDIR_DEFAULT GROFF_LIBPROGRAMDIR_DEFAULT -GROFF_GROFFERDIR_OPTION -GROFF_GROFFERDIR_DEFAULT GROFF_GLILYPONDDIR_DEFAULT GROFF_GPINYINDIR_DEFAULT -GROFF_GROGDIR_DEFAULT GROFF_PERL GROFF_PRINT # GROFF_REFER GROFF_REFERDIR_DEFAULT AC_PROG_EGREP GROFF_PROG_YACC -GROFF_DOC_CHECK -GROFF_MAKEINFO -GROFF_TEXI2DVI +GROFF_PROG_M4 +GROFF_PROG_MAKEINFO +GROFF_PROG_TEXI2DVI +GROFF_USE_TEX_CHECK AC_PROG_RANLIB GROFF_INSTALL_SH GROFF_INSTALL_INFO @@ -80,16 +79,17 @@ AC_PROG_MKDIR_P GROFF_PROG_XPMTOPPM PKG_PROG_PKG_CONFIG GROFF_UCHARDET -GROFF_PDFTOOLS # use a dummy substitution if no csh hack is necessary to avoid errors # with non-GNU sed programs -GROFF_CSH_HACK([SH_SCRIPT_SED_CMD='1s/.*/:/'], [SH_SCRIPT_SED_CMD='1s/a/a/']) +GROFF_CSH_HACK([SH_SCRIPT_SED_CMD='1s/.*/:/'], + [SH_SCRIPT_SED_CMD='1s/a/a/']) AC_SUBST([SH_SCRIPT_SED_CMD]) # checks for headers -AC_CHECK_HEADERS([stddef.h stdlib.h unistd.h dirent.h limits.h sys/dir.h \ - string.h strings.h math.h sys/time.h direct.h process.h]) +AC_CHECK_HEADERS([stdbool.h stddef.h stdlib.h unistd.h dirent.h \ + limits.h sys/dir.h string.h strings.h math.h \ + sys/time.h direct.h process.h]) GROFF_ISC_SYSV3 GROFF_POSIX @@ -138,8 +138,10 @@ LIBS="$LIBS $LIBC $LIBM" AC_REPLACE_FUNCS([fmod getcwd putenv strcasecmp \ strerror strncasecmp strtol]) LIBS="$saved_libs" -AC_CHECK_FUNCS([gettimeofday isatty kill rename setlocale strsep]) +AC_CHECK_FUNCS([gettimeofday isatty kill rename setlocale strdup \ + strsep]) GROFF_MKSTEMP +AC_CHECK_DECLS([strsignal, getc_unlocked]) AC_CHECK_DECLS([sys_siglist, getc_unlocked]) AM_LANGINFO_CODESET @@ -153,6 +155,9 @@ GROFF_WCOREFLAG # URW fonts extra dir GROFF_URW_FONTS_PATH +# use groff's own malloc-based allocator for C++ new/delete operators +GROFF_USE_GROFF_ALLOCATOR + # other random stuff GROFF_BROKEN_SPOOLER_FLAGS GROFF_PAGE @@ -160,80 +165,99 @@ GROFF_G GROFF_TMAC GROFF_WITH_COMPATIBILITY_WRAPPERS GROFF_TARGET_PATH_SEPARATOR -GROFF_HTML_PROGRAMS -GROFF_PDFDOC_PROGRAMS +GROFF_CHECK_GROHTML_PROGRAMS +GROFF_PDFROFF_DEPENDENCIES_CHECK +GROFF_GROPDF_DEPENDENCIES_CHECK +GROFF_PNMTOOLS_CAN_BE_QUIET GROFF_PNMTOPS_NOSETPAGE -GROFF_MAKE_RM +GROFF_MAKE_DEFINES_RM GROFF_DIFF_D GROFF_HAVE_TEST_EF_OPTION GROFF_BASH +GROFF_GHOSTSCRIPT_VERSION_CHECK gl_GLIBC21 gl_LOCALCHARSET -# checks for presence of URW fonts (requires ghostscript, which is -# checked in GROFF_HTML_PROGRAMS -GROFF_URW_FONTS - AM_CONDITIONAL([BUILD_WINSCRIPTS], [test -n "$make_winscripts"]) # If X11 is not available, don't build: -# font/devX75 +# font/devX75 # font/devX75-12 # font/devX100 # font/devX100-12 -# src/devices/xditview +# src/devices/xditview # src/utils/xtotroff # src/libs/libxutil -AM_CONDITIONAL([WITHOUT_X11], [test "x$groff_no_x" = "xyes"]) +AM_CONDITIONAL([WITHOUT_X11], [test "$groff_no_x" = yes]) -# make builtin variable RM -AM_CONDITIONAL([MAKE_DONT_HAVE_RM], [test "x$groff_is_rm_defined" = "xno"]) +AM_CONDITIONAL([MAKE_DEFINES_RM], [test "$groff_make_defines_rm" = yes]) -# Some programs have a "g" prefix if an existing groff installation is detected -AM_CONDITIONAL([USEPROGRAMPREFIX], [test x$g = xg]) +# Some programs have a "g" prefix if an existing troff installation is +# detected. +AM_CONDITIONAL([USEPROGRAMPREFIX], [test "$g" = g]) -AM_CONDITIONAL([BUILD_INFODOC], [test -n "$make_infodoc"]) -AM_CONDITIONAL([BUILD_HTML], [test -n "$make_htmldoc"]) -AM_CONDITIONAL([BUILD_HTMLEXAMPLES], [test -n "$make_htmlexamples"]) -AM_CONDITIONAL([BUILD_PDFDOC], [test -n "$make_pdfdoc"]) -AM_CONDITIONAL([BUILD_PDFEXAMPLES], [test -n "$make_pdfexamples"]) -AM_CONDITIONAL([BUILD_OTHERDOC], [test -n "$make_otherdoc"]) -AM_CONDITIONAL([BUILD_EXAMPLES], [test -n "$make_examples"]) -AM_CONDITIONAL([INSTALL_SHIPPED_HTML], [test -n "$make_install_shipped_htmldoc"]) -AM_CONDITIONAL([HAVE_PDFTOOLS], [test "x$groff_have_pdftools" = "xyes" ]) -AM_CONDITIONAL([HAVE_TEXI2DVI], [test "x$groff_have_texi2dvi" = "xyes" ]) +AM_CONDITIONAL([USE_GROHTML], [test "$use_grohtml" = yes]) +AM_CONDITIONAL([USE_PDFROFF], [test "$use_pdfroff" = yes]) +AM_CONDITIONAL([USE_GROPDF], [test "$use_gropdf" = yes]) +AM_CONDITIONAL([USE_GROFF_ALLOCATOR], + [test "$groff_use_own_allocator" = yes]) +AM_CONDITIONAL([HAVE_GHOSTSCRIPT], [test "$GHOSTSCRIPT" != no \ + && test "$GHOSTSCRIPT" != missing]) +AM_CONDITIONAL([HAVE_URW_FONTS], [test "$groff_have_urw_fonts" = yes ]) +AM_CONDITIONAL([HAVE_TEXI2DVI], [test "$groff_have_texi2dvi" = yes ]) +AM_CONDITIONAL([USE_TEX], [test "$groff_use_tex" = yes ]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([test-groff], [chmod +x test-groff]) AC_OUTPUT echo " -${PACKAGE_NAME} version ${PACKAGE_VERSION} +$PACKAGE_NAME version $PACKAGE_VERSION ---------------------------------------------------------------------- - Prefix : ${prefix} - Compiler : ${CC} ${CFLAGS} ${CPPFLAGS}" -if test "x$groff_no_x" = "xyes"; then -echo "\ - X11 support : no" -else -echo "\ - X11 support : yes - X11 resources dir : $appresdir" + installation directory prefix : $prefix" +if test -n "$g" +then + echo "\ + command name prefix : $g" + if test -n "$tmac_wrap" + then + echo "\ + prefix used for macro packages : $tmac_wrap" + fi fi -if test "x$doc" = x; then echo "\ - Doc build : no" + C++ compiler and options : $CXX $CXXFLAGS $CPPFLAGS + use libgroff's memory allocator : $groff_use_own_allocator + C compiler and options : $CC $CFLAGS $CPPFLAGS + Perl interpreter version : $perl_version" +if test "$groff_no_x" = yes +then + echo "\ + X11 support : disabled" else -echo "\ - Doc build : ${doc} " + echo "\ + X11 support : enabled + X11 app defaults directory : $appdefdir" fi echo "\ - URW fonts for pdf : $groff_have_urw_fonts - Use uchardet library for preconv: $groff_have_uchardet - pdftools for distcheck : $groff_have_pdftools" + 'groff -l' uses print spooler : $groff_have_spooler + use URW fonts for PDF output : $groff_have_urw_fonts" +if test "$groff_have_urw_fonts" = yes +then + echo "\ + URW fonts directory : $urwfontsdir" +fi echo "\ + preconv can use uchardet library : $groff_have_uchardet + can build groff.dvi, groff.pdf : $groff_use_tex ----------------------------------------------------------------------" -GROFF_APPRESDIR_CHECK -GROFF_URW_FONTS_CHECK -GROFF_UCHARDET_CHECK +GROFF_APPDEFDIR_NOTICE +GROFF_AWK_NOTICE +GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE +GROFF_GHOSTSCRIPT_VERSION_NOTICE +GROFF_URW_FONTS_NOTICE +GROFF_UCHARDET_NOTICE +GROFF_GROHTML_PROGRAM_NOTICE +GROFF_PDFROFF_PROGRAM_NOTICE +GROFF_GROPDF_PROGRAM_NOTICE diff --git a/contrib/chem/ChangeLog b/contrib/chem/ChangeLog index 02f4c07..ad40944 100644 --- a/contrib/chem/ChangeLog +++ b/contrib/chem/ChangeLog @@ -1,3 +1,57 @@ +2022-08-18 G. Branden Robinson + + * chem.pl: Refactor. + - Rename scalars. + Copyright -> copyright + Program_Version -> chem_version + Groff_Version -> groff_version + Chem_Name -> chem + before_make -> is_in_source_tree + - Rename hash. + at_at -> makevar + - Drop unused hash member `$makevar{'BINDIR'}`. + - Drop scalar `Groff_Version_Preset`, which apparently hadn't + been updated since groff 1.20. Instead, follow grog(1) and + set the `groff_version` scalar to "DEVELOPMENT" if this is + the version from the groff source tree. Overwrite its value + with that determined by make(1) if available. + - Tighten usage and version messages; make the latter more + conformant with the format recommended in the GNU Coding + Standards. Explicitly identify license as GNU GPLv2. + (usage): Refer to "pic" with its command prefix if it is known + to have one. (If running "unbuilt", we have no way to know.) + +2022-08-18 G. Branden Robinson + + * chem.pl: Stop copying "pic.tmac" (fallback troff macro + definitions) into the output. It might not be necessary and it + is inappropriate to do so if a macro package offers its own + definitions or the user has made other arrangements on the + command line. (The same thing can be achieved with the "-mpic" + argument to the formatter or a front end.) Bump version number. + +2022-06-15 G. Branden Robinson + + * chem.1.man: Fix markup nits. Use idiomatic input style, + placing newlines after sentences and commas. Also put an empty + request between sentences. + + Fixes . + +2022-04-12 Ingo Schwarze + + Delete the harmful, ill-designed, buggy, and essentially + unmaintained and untested --with-doc option of the configure + script. See the NEWS file for more details on the rationale. + + * chem.am: Delete three BUILD_EXAMPLES conditionals. + +2020-04-22 G. Branden Robinson + + * chem.1.man: + * examples/122/README.txt: + * examples/README.txt: Delete references to groffer. + 2018-02-28 Werner LEMBERG * chem.am (chem, README): Use $(AM_V_GEN) to silence file generation. @@ -303,7 +357,7 @@ ________________________________________________________________ License -Copyright (C) 2006-2018 Free Software Foundation, Inc. +Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bernd Warken . Copying and distribution of this file, with or without @@ -313,7 +367,7 @@ notice are preserved. This file is part of `chem', which is part of the `groff' project. -####### Emacs settings +##### Editor settings Local Variables: mode: change-log End: diff --git a/contrib/chem/README.txt b/contrib/chem/README.txt index 000c470..06baed2 100644 --- a/contrib/chem/README.txt +++ b/contrib/chem/README.txt @@ -24,7 +24,7 @@ are written in the 'chem' language. The file names end with .chem. ####### License -Copyright (C) 2006-2018 Free Software Foundation, Inc. +Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bernd Warken . This file is part of 'chem', which is part of 'groff'. @@ -42,7 +42,9 @@ The GPL2 license text is available in the internet at . -####### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/contrib/chem/chem.1.man b/contrib/chem/chem.1.man index d6574ce..a02242f 100644 --- a/contrib/chem/chem.1.man +++ b/contrib/chem/chem.1.man @@ -1,17 +1,15 @@ -.TH @G@CHEM @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -@g@chem \- groff preprocessor for producing chemical structure diagrams -. -.\" @g@chem.1 - man page for @g@chem (section 1). -.\" Source file position: /contrib/chem/chem.man -.\" Installed position: $prefix/share/man/man1/@g@chem.1 +.TH @g@chem @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +@g@chem \- embed chemical structure diagrams in +.I groff +documents . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2006-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2006-2020 Free Software Foundation, Inc. .\" .\" This file is part of chem, which is part of groff, a free software .\" project. @@ -24,51 +22,54 @@ .\" . . . -.\" ==================================================================== -.\" Setup -.\" ==================================================================== -. -. .\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr chem_C \n[.C] +.do nr *groff_chem_1_man_C \n[.cp] .cp 0 . -. -.\" ==================================================================== -.\" Characters -.\" ==================================================================== -. -.\" Ellipsis ... -.ie t .ds EL \fS\N'188'\fP\" -.el .ds EL \&.\|.\|.\&\" -.\" called with \*(EL +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback . . .\" ==================================================================== -.SH "SYNOPSIS" +.SH Synopsis .\" ==================================================================== . .SY @g@chem -.OP \-\- -.RI [ filespec -\*(EL] +.RB [ \-\- ] +.RI [ file\~ .\|.\|.] .YS . +. .SY @g@chem .B \-h +. .SY @g@chem .B \-\-help .YS . +. .SY @g@chem .B \-v +. .SY @g@chem .B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . .I chem @@ -77,13 +78,13 @@ produces chemical structure diagrams. Today's version is best suited for organic chemistry (bonds, rings). . The -.B @g@chem +.I @g@chem program is a -.B groff +.I groff preprocessor like -.BR @g@eqn , -.BR @g@pic , -.BR @g@tbl , +.IR @g@eqn , +.IR @g@pic , +.IR @g@tbl , etc. . It generates @@ -96,15 +97,13 @@ language. . . .P -A -.I filespec -argument is either a file name of an existing file or a minus -character -.BR \- , -meaning standard input. -. -If no argument is specified then standard input is taken -automatically. +If no operands are given, +or if +.I file +is +.RB \[lq] \- \[rq], +.I @g@chem +reads the standard input stream. . .B \-h and @@ -120,12 +119,12 @@ all exit. . .P The program -.B @g@chem +.I @g@chem originates from the Perl source file .IR chem.pl . . It tells -.B @g@pic +.I @g@pic to include a copy of the macro file .IR chem.pic . . @@ -153,13 +152,11 @@ lines looks like this . . .IP -.nf -.ft B +.EX \&.cstart -\fIchem data\fP +.I chem data \&.cend -.ft -.fi +.EE . . .P @@ -168,7 +165,7 @@ Lines containing the keywords and .B .cend start and end the input for -.BR @g@chem , +.IR @g@chem , respectively. . In @@ -195,15 +192,13 @@ commands to draw the diagram. As an example, . .IP -.nf -.ft B +.EX \&.cstart CH3 bond CH3 \&.cend -.ft -.fi +.EE . . .P @@ -213,45 +208,43 @@ groups with a bond between them. . . .P -To actually view this, you must run -.B @g@chem -followed by -.BR groffer : -. -.IP -.B @g@chem [file \*(EL] | groffer -. -.P If you want to create just -.B groff +.I groff output, you must run -.B @g@chem +.I @g@chem followed by -.B groff +.I groff with the option .B \-p for the activation of -.BR @g@pic : +.IR @g@pic : .IP -.B @g@chem [file \*(EL] | groff \-p \*(EL +.I @g@chem +.RI [ file\~ .\|.\|.\&] +.BR "| groff \-p\~" .\|.\|. . . .\" ==================================================================== -.SH THE LANGUAGE +.SH Language .\" ==================================================================== . The .I chem -input language is rather small. It provides rings of several styles -and a way to glue them together as desired, bonds of several styles, -moieties (e.g., +input language is rather small. +. +It provides rings of several styles and a way to glue them together as +desired, +bonds of several styles, +moieties +(e.g., .BR C , .BR NH3 , -\*(EL, and strings. +\&.\|.\|., +and strings. . . .\" ==================================================================== -.SS Setting Variables +.SS "Setting variables" .\" ==================================================================== . There are some variables that can be set by commands. @@ -389,11 +382,11 @@ place. .SS Rings .\" ==================================================================== . -There are lots of rings, but only 5 and 6-sided rings get -much support. +There are lots of rings, +but only five- and six-sided rings get much support. . .B ring -by itself is a 6-sided ring; +by itself is a six-sided ring; .B benzene is the benzene ring with a circle inside. .B aromatic @@ -407,14 +400,14 @@ puts a circle into any kind of ring. .RB [ \%double\ \c .IR i , j\ \/\c .IR k , l\ \/\c -\*(EL +\&.\|.\|.\& .RI [ picstuff ] .YS .RE . . .P -The vertices of a ring are numbered 1, 2, \*(EL from the +The vertices of a ring are numbered 1, 2, \&.\|.\|.\& from the vertex that points in the natural compass direction. . So for a hexagonal ring with the point at the top, the top vertex @@ -424,18 +417,16 @@ vertex\~1. This is expressed as . .IP -.ft B -.nf +.EX R1: ring pointing up R2: ring pointing right -.fi -.ft +.EE . . .P The ring vertices are named .BR .V1 , -\*(EL, +\&.\|.\|., .BI .V n\fR,\fP with .B .V1 @@ -459,23 +450,26 @@ is the rightmost vertex and .B R2.V4 the leftmost. . -These vertex names are used for connecting bonds or other rings. For -example, +These vertex names are used for connecting bonds or other rings. +. +For example, . .IP -.ft B -.nf +.EX R1: benzene pointing right R2: benzene pointing right with .V6 at R1.V2 -.fi -.ft +.EE +. +. .P creates two benzene rings connected along a side. . . .P Interior double bonds are specified as -.BI \%double\ n1 , n2\ n3 , n4\ \fR\*(EL;\fP +.B \%double +.IB n1 , "n2 n3" , n4 +.RB .\|.\|. ; each number pair adds an interior bond. . So the alternate form of a benzene ring is @@ -506,16 +500,16 @@ and . . .P -There are two 5-sided rings. +There are two five-sided rings. . .B ring5 -is pentagonal with a side that matches the 6-sided ring; it has four -natural directions. +is pentagonal with a side that matches the six-sided ring; +it has four natural directions. . A .B \%flatring -is a 5-sided ring created by chopping one corner of a 6-sided ring so -that it exactly matches the 6-sided rings. +is a five-sided ring created by chopping one corner of a six-sided ring +so that it exactly matches the six-sided rings. . . .P @@ -523,7 +517,7 @@ The description of a ring has to fit on a single line. . . .\" ==================================================================== -.SS Moieties and Strings +.SS "Moieties and strings" .\" ==================================================================== . A moiety is a string of characters beginning with a capital letter, @@ -612,8 +606,10 @@ command. . It represents a string that should be printed (without the quotes). . -Text within quotes \(dq\*(EL\(dq is treated more or less -like a moiety except that no changes are made to the quoted part. +Text within quotes +.BR \(dq .\|.\|.\& \(dq +is treated more or less like a moiety except that no changes are made to +the quoted part. . . .\" ==================================================================== @@ -632,7 +628,7 @@ A name is just . .IP .IB Name : -\*(EL +\&.\|.\|. . . .P @@ -661,17 +657,15 @@ only letters and numbers is valid: The specific construction .RS .TP -.BR bond\ \*(EL " ; moiety" +.BR bond \~.\|.\|.\&\~ "; moiety" .RE .P is equivalent to .IP -.ft B -.nf +.EX bond moiety -.fi -.ft +.EE . . .P @@ -684,7 +678,7 @@ the commands. A period character .B .\& or a single quote -.B ' +.B \[aq] in the first column of a line signals a .I troff command, which is copied through as-is. @@ -725,9 +719,9 @@ code, which is copied through with a label. . .P Since -.B @g@chem +.I @g@chem is a -.B @g@pic +.I @g@pic preprocessor, it is possible to include .I pic statements in the middle of a diagram to draw things not provided for @@ -787,7 +781,7 @@ command as well. . . .\" ==================================================================== -.SS WISH LIST +.SS "Wish list" .\" ==================================================================== . .P @@ -813,8 +807,12 @@ properties of built-in objects. . . .P -There is no in-line chemistry yet (e.g., analogous to the $\*(EL$ -construct of eqn). +There is no in-line chemistry yet +(e.g., +analogous to the +.BR $ .\|.\|. $ +construct of +.IR eqn ). . . .P @@ -843,99 +841,85 @@ A squiggle bond is needed. . . .\" ==================================================================== -.SH "FILES" +.SH Files .\" ==================================================================== . .TP -.I @DATASUBDIR@/pic/chem.pic +.I @DATASUBDIR@/\:pic/\:chem\:.pic A collection of .I pic macros needed by -.BR @g@chem . +.IR @g@chem . . .TP -.I @MACRODIR@/pic.tmac +.I @MACRODIR@/\:pic\:.tmac A macro file which redefines -.B .PS +.BR .PS , +.BR .PE , and -.B .PE +.B .PF to center .I pic diagrams. . .TP -.IR @DOCDIR@/examples/chem/ * .chem +.IR @DOCDIR@/\:\%examples/\:chem/\: * .chem Example files for .IR chem . . .TP -.IR @DOCDIR@/examples/chem/122/ * .chem -Example files from the classical +.IR @DOCDIR@/\:\%examples/\:chem/\:122/\: * .chem +Example files from the .I chem -article -.I "CHEM \[en] A Program for Typesetting Chemical Structure Diagrams" -[CSTR\~#122]. +article by its authors, +\[lq]CHEM\[em]A Program for Typesetting Chemical Structure Diagrams: +User Manual\[rq] +(CSTR\~#122). . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== . The GNU version of -.B chem +.I chem was written by -.MT groff\-bernd.warken\-72@\:web.de +.MT groff\-bernd\:.warken\-72@\:web\:.de Bernd Warken .ME . . It is based on the documentation of Brian Kernighan's original .I awk version of -.I chem -at -.UR http://\:cm.bell\-labs.com/\:cm/\:cs/\:who/\:bwk/\:index.html -.UE . +.IR chem . . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.BR \%groff (@MAN1EXT@), -.BR \%@g@pic (@MAN1EXT@), -.BR \%groffer (@MAN1EXT@). +\[lq]CHEM\[em]A Program for Typesetting Chemical Diagrams: User +Manual\[rq] +by Jon L.\& Bentley, +Lynn W.\& Jelinski, +and +Brian W.\& Kernighan, +1992, +AT&T Bell Laboratories Computing Science Technical Report No.\& 122 . . .P -You can still get the original -.UR http://\:cm.bell\-labs.com/\:netlib/\:typesetting/\:chem.gz -chem awk source -.UE . -. -Its -.B README -file was used for this manual page. -. -. -.P -The other classical document on -.I chem -is -.UR http://\:cm.bell\-labs.com/\:cm/\:cs/\:cstr/\:122.ps.gz -.I "CHEM \[en] A Program for Typesetting Chemical Structure Diagrams" -[CSTR\~#122] -.UE . +.MR groff @MAN1EXT@ , +.MR @g@pic @MAN1EXT@ . . .\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[chem_C] -. +.cp \n[*groff_chem_1_man_C] +.do rr *groff_chem_1_man_C . -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/chem/chem.am b/contrib/chem/chem.am index 89d16d9..abee480 100644 --- a/contrib/chem/chem.am +++ b/contrib/chem/chem.am @@ -1,13 +1,9 @@ # Automake rules for 'chem' -# File position: /contrib/chem/chem.am - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Moved to automake by Bertrand Garrigues # -# Last update: 22 Aug 2015 -# # This file is part of 'chem' which is part of 'groff'. # # 'groff' is free software; you can redistribute it and/or modify it @@ -42,7 +38,6 @@ CHEM_EXAMPLES = \ contrib/chem/examples/penicillin.chem \ contrib/chem/examples/reserpine.chem -if BUILD_EXAMPLES # Files installed in $(exampledir)/chem chemexampledir = $(exampledir)/chem nodist_chemexample_DATA = $(CHEM_GENEXAMPLES) @@ -52,7 +47,6 @@ dist_chemexample_DATA = $(CHEM_EXAMPLES) # lazily installed by the local install target chemexample122dir = $(chemexampledir)/122 nodist_chemexample122_DATA = contrib/chem/examples/122/README -endif EXTRA_DIST += \ contrib/chem/ChangeLog \ contrib/chem/chem.1.man \ @@ -66,7 +60,7 @@ man1_MANS += contrib/chem/chem.1 MOSTLYCLEANFILES += $(CHEM_GENEXAMPLES) $(nodist_chemexample122_DATA) \ contrib/chem/README -# This is strangly built but not installed +# This is strangely built but not installed all: contrib/chem/README contrib/chem/README: $(chem_srcdir)/README.txt @@ -96,23 +90,19 @@ chem: $(chem_srcdir)/chem.pl $(SH_DEPS_SED_SCRIPT) install-data-local: install_chem_extra install_chem_extra: -if BUILD_EXAMPLES -test -d $(DESTDIR)$(chemexample122dir) \ || $(mkinstalldirs) $(DESTDIR)$(chemexample122dir); for i in $(chem_srcdir)/examples/122/*.chem; do \ n=`echo $$i | sed 's|$(chem_srcdir)/examples/122/||g'`; \ $(INSTALL_DATA) $$i $(DESTDIR)$(chemexample122dir)/$$n; \ done -endif uninstall-local: uninstall_chem_extra uninstall_chem_extra: -if BUILD_EXAMPLES $(RM) $(DESTDIR)$(exampledir)/chem/122/* -rmdir $(DESTDIR)$(exampledir)/chem/122 $(RM) $(DESTDIR)$(exampledir)/chem/* -rmdir $(DESTDIR)$(exampledir)/chem -endif -rmdir $(DESTDIR)$(datasubdir)/pic dist-hook: dist_chem @@ -123,12 +113,8 @@ dist_chem: done -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/chem/chem.pic b/contrib/chem/chem.pic index 6f4ee81..33e932c 100644 --- a/contrib/chem/chem.pic +++ b/contrib/chem/chem.pic @@ -1,9 +1,6 @@ # macros for chem -# Source file position: /contrib/chem/chem.pic -# Installed position: /share/groff//pic - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Brian Kernighan , # modified by Bernd Warken . @@ -87,7 +84,6 @@ define frontbond { line <- from V1 to V2 arrowht = ah; arrowwid = aw; arrowhead = ahead } -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/chem.pl b/contrib/chem/chem.pl index 883907b..5ca3fa2 100755 --- a/contrib/chem/chem.pl +++ b/contrib/chem/chem.pl @@ -2,10 +2,8 @@ # chem - a groff preprocessor for producing chemical structure diagrams -# Source file position: /contrib/chem/chem.pl -# Installed position: /bin/chem - -my $Copyright = 'Copyright (C) 2006-2014 Free Software Foundation, Inc.'; +my $copyright = 'Copyright (C) 2006-2014, 2022' + . ' Free Software Foundation, Inc.'; # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -26,13 +24,9 @@ my $Copyright = 'Copyright (C) 2006-2014 Free Software Foundation, Inc.'; # settings ######################################################################## -my $Program_Version = '1.0.5'; - -# this setting of the groff version is only used before make is run, -# otherwise @VERSION@ will set it. -my $Groff_Version_Preset='1.20preset'; +my $chem_version = '1.0.6'; +my $groff_version = 'DEVELOPMENT'; -# test on Perl version require v5.6; @@ -50,41 +44,27 @@ use File::Spec; # $Bin is the directory where this script is located use FindBin; -my $Chem_Name; -my $Groff_Version; +my $chem; my $File_chem_pic; -my $File_pic_tmac; - -BEGIN { - { - my $before_make; # script before run of 'make' - { - my $at = '@'; - $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}"; - } - my %at_at; +my $is_in_source_tree; +{ + $is_in_source_tree = 1 if '@VERSION@' eq '@' . 'VERSION' . '@'; +} - if ($before_make) { - my $chem_dir = $FindBin::Bin; - $at_at{'BINDIR'} = $chem_dir; - $at_at{'G'} = ''; - $File_chem_pic = File::Spec->catfile($chem_dir, 'chem.pic'); - $File_pic_tmac = File::Spec->catfile($chem_dir, '..', 'pic.tmac'); - $Groff_Version = ''; - $Chem_Name = 'chem'; - } else { - $Groff_Version = '@VERSION@'; - $at_at{'BINDIR'} = '@BINDIR@'; - $at_at{'G'} = '@g@'; - $at_at{'PICDIR'} = '@PICDIR@'; - $at_at{'TMACDIR'} = '@MACRODIR@'; - $File_chem_pic = - File::Spec->catfile($at_at{'PICDIR'}, 'chem.pic'); - $File_pic_tmac = File::Spec->catfile($at_at{'TMACDIR'}, 'pic.tmac'); - $Chem_Name = $at_at{'G'} . 'chem'; - } - } +my %makevar; + +if ($is_in_source_tree) { + my $chem_dir = $FindBin::Bin; + $makevar{'G'} = ''; + $File_chem_pic = File::Spec->catfile($chem_dir, 'chem.pic'); + $chem = 'chem'; +} else { + $groff_version = '@VERSION@'; + $makevar{'G'} = '@g@'; + $makevar{'PICDIR'} = '@PICDIR@'; + $File_chem_pic = File::Spec->catfile($makevar{'PICDIR'}, 'chem.pic'); + $chem = $makevar{'G'} . 'chem'; } @@ -212,10 +192,6 @@ my $Line = ''; my @stdin = (); my $stdin = 0; - # for centralizing the pic code - open TMAC, "<$File_pic_tmac" and print ; - close TMAC; - foreach (@ARGV) { $count_minus++ if /^-$/; } @@ -408,7 +384,7 @@ my $Line = ''; } if ($Words[0] eq 'pic') { - # pic pass-thru + # pic pass-through return 1 if $#Words == 0; my $s = $line; $s =~ /^\s*pic\s*(.*)$/; @@ -1218,53 +1194,38 @@ sub setparams { } # setparams() -########## -# usage() -# -# Print usage information for --help. -# sub usage { - print "\n"; - &version(); print < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. EOF -} # version() +} 1; -### Emacs settings + # Local Variables: +# fill-column: 72 # mode: CPerl # End: +# vim: set cindent noexpandtab shiftwidth=2 softtabstop=2 textwidth=72: diff --git a/contrib/chem/examples/122/README.txt b/contrib/chem/examples/122/README.txt index 4030a59..6f3809b 100644 --- a/contrib/chem/examples/122/README.txt +++ b/contrib/chem/examples/122/README.txt @@ -24,29 +24,12 @@ example. You can view the graphical display of the examples by calling - groffer - -'groffer' calls 'chem' automatically. - -If you want to transform example files to a different format use the -'roff2*' programs: - -'roff2dvi' prints dvi format to standard output, -'roff2html' generates html output, -'roff2pdf' outputs pdf mode, -'roff2ps' produces PostScript output, -'roff2text' generates text output in the groff device 'latin1', -'roff2x' prints the output in the groff device X that is - suitable for programs like 'gxditview' or 'xditview'. - -To get a suitable 'groff' output run - @g@chem | groff -p ... ####### License -Copyright (C) 2006-2018 Free Software Foundation, Inc. +Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bernd Warken . This file is part of 'chem', which is part of 'groff'. @@ -67,7 +50,7 @@ The GPL2 license text is available in the internet at . -####### Emacs settings +##### Editor settings Local Variables: mode: text diff --git a/contrib/chem/examples/122/ch2a_ethyl.chem b/contrib/chem/examples/122/ch2a_ethyl.chem index c0f0c2c..089de73 100644 --- a/contrib/chem/examples/122/ch2a_ethyl.chem +++ b/contrib/chem/examples/122/ch2a_ethyl.chem @@ -9,7 +9,7 @@ ch2a_ethyl.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -35,9 +35,9 @@ ch2a_ethyl.chem: CH2 bond -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/122/ch2b_benzene.chem b/contrib/chem/examples/122/ch2b_benzene.chem index 0342d1f..0af1c9f 100644 --- a/contrib/chem/examples/122/ch2b_benzene.chem +++ b/contrib/chem/examples/122/ch2b_benzene.chem @@ -9,7 +9,7 @@ ch2b_benzene.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch2b_benzene.chem: benzene -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch2c_benzene_right.chem b/contrib/chem/examples/122/ch2c_benzene_right.chem index 5026ef6..d9f29b5 100644 --- a/contrib/chem/examples/122/ch2c_benzene_right.chem +++ b/contrib/chem/examples/122/ch2c_benzene_right.chem @@ -9,7 +9,7 @@ ch2c_benzene_right.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License (GPL) version 2 as @@ -30,8 +30,6 @@ ch2c_benzene_right.chem: benzene pointing right # a rotated benzene ring -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4a_stick.chem b/contrib/chem/examples/122/ch4a_stick.chem index 732cbad..f4caef3 100644 --- a/contrib/chem/examples/122/ch4a_stick.chem +++ b/contrib/chem/examples/122/ch4a_stick.chem @@ -9,7 +9,7 @@ ch4a_stick.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -37,9 +37,9 @@ ch4a_stick.chem: bond 120 bond down -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/122/ch4b_methyl_acetate.chem b/contrib/chem/examples/122/ch4b_methyl_acetate.chem index cd5be9d..31625a3 100644 --- a/contrib/chem/examples/122/ch4b_methyl_acetate.chem +++ b/contrib/chem/examples/122/ch4b_methyl_acetate.chem @@ -9,7 +9,7 @@ ch4b_methyl_acetate.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -41,8 +41,6 @@ O bond right CH3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4c_colon.chem b/contrib/chem/examples/122/ch4c_colon.chem index db50c03..5e42f6b 100644 --- a/contrib/chem/examples/122/ch4c_colon.chem +++ b/contrib/chem/examples/122/ch4c_colon.chem @@ -9,7 +9,7 @@ ch4c_colon.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -36,8 +36,6 @@ ch4c_colon.chem: bond 120 from C ; O bond right ; CH3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4d_HCl.H2O.chem b/contrib/chem/examples/122/ch4d_HCl.H2O.chem index 71e4f88..b6ac99d 100644 --- a/contrib/chem/examples/122/ch4d_HCl.H2O.chem +++ b/contrib/chem/examples/122/ch4d_HCl.H2O.chem @@ -9,7 +9,7 @@ ch4d_HCl.H2O.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch4d_HCl.H2O.chem: HCl.H2O -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem b/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem index 1f820c0..b2f8bc0 100644 --- a/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem +++ b/contrib/chem/examples/122/ch4e_CaSO4.2H2O.chem @@ -9,7 +9,7 @@ ch4e_CaSO4.2H2O.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch4e_CaSO4.2H2O.chem: CaSO4.2H2O -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4f_C.chem b/contrib/chem/examples/122/ch4f_C.chem index 9b749c0..d54461f 100644 --- a/contrib/chem/examples/122/ch4f_C.chem +++ b/contrib/chem/examples/122/ch4f_C.chem @@ -9,7 +9,7 @@ ch4f_C.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -42,8 +42,6 @@ ch4f_C.chem: bond right from C -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4g_BP.chem b/contrib/chem/examples/122/ch4g_BP.chem index 41b8582..9c6af4b 100644 --- a/contrib/chem/examples/122/ch4g_BP.chem +++ b/contrib/chem/examples/122/ch4g_BP.chem @@ -9,7 +9,7 @@ ch4g_BP.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -42,8 +42,6 @@ ch4g_BP.chem: bond right from BP bond down from BP -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4h_methacrylate.chem b/contrib/chem/examples/122/ch4h_methacrylate.chem index 63c90ab..8300d25 100644 --- a/contrib/chem/examples/122/ch4h_methacrylate.chem +++ b/contrib/chem/examples/122/ch4h_methacrylate.chem @@ -9,7 +9,7 @@ ch4h_methacrylate.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -59,8 +59,6 @@ ch4h_methacrylate.chem: bond right from BP bond dotted -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4i_cyclo.chem b/contrib/chem/examples/122/ch4i_cyclo.chem index b4b8888..866e6f7 100644 --- a/contrib/chem/examples/122/ch4i_cyclo.chem +++ b/contrib/chem/examples/122/ch4i_cyclo.chem @@ -9,7 +9,7 @@ ch4i_cyclo.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -39,8 +39,6 @@ R7: ring7 at B + (.75,0) R8: ring8 at R7 + (.75,0) -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4j_ring4.chem b/contrib/chem/examples/122/ch4j_ring4.chem index fcd94ad..9caf718 100644 --- a/contrib/chem/examples/122/ch4j_ring4.chem +++ b/contrib/chem/examples/122/ch4j_ring4.chem @@ -9,7 +9,7 @@ ch4j_ring4.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,9 +32,9 @@ ch4j_ring4.chem: ring4 pointing 45 -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/122/ch4k_ring3.chem b/contrib/chem/examples/122/ch4k_ring3.chem index c51a521..2a2d856 100644 --- a/contrib/chem/examples/122/ch4k_ring3.chem +++ b/contrib/chem/examples/122/ch4k_ring3.chem @@ -9,7 +9,7 @@ ch4k_ring3.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -34,8 +34,6 @@ R: ring3 back bond 120 from R.V2 ; C2H5 front bond -120 from R.V3 ; HO -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4l_vertex.chem b/contrib/chem/examples/122/ch4l_vertex.chem index 08f1768..d9fcb07 100644 --- a/contrib/chem/examples/122/ch4l_vertex.chem +++ b/contrib/chem/examples/122/ch4l_vertex.chem @@ -9,7 +9,7 @@ ch4l_vertex.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -39,8 +39,6 @@ R: benzene pointing right bond 45 ; C2H5 bond 135 from N ; C2H5 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4m_double.chem b/contrib/chem/examples/122/ch4m_double.chem index e1202a8..c5b1373 100644 --- a/contrib/chem/examples/122/ch4m_double.chem +++ b/contrib/chem/examples/122/ch4m_double.chem @@ -9,7 +9,7 @@ ch4m_double.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch4m_double.chem: ring double 1,2 3,4 5,6 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4n_triple.chem b/contrib/chem/examples/122/ch4n_triple.chem index e622c46..5766f85 100644 --- a/contrib/chem/examples/122/ch4n_triple.chem +++ b/contrib/chem/examples/122/ch4n_triple.chem @@ -9,7 +9,7 @@ ch4n_triple.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch4n_triple.chem: ring8 triple 3,4 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4o_aromatic.chem b/contrib/chem/examples/122/ch4o_aromatic.chem index 919f84c..aa303c7 100644 --- a/contrib/chem/examples/122/ch4o_aromatic.chem +++ b/contrib/chem/examples/122/ch4o_aromatic.chem @@ -9,7 +9,7 @@ ch4o_aromatic.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # 'groff' is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License (GPL) version 2 as @@ -31,8 +31,6 @@ ch4o_aromatic.chem: R: aromatic ring7 "+" at R -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4p_cholestanol.chem b/contrib/chem/examples/122/ch4p_cholestanol.chem index 717481f..e292bea 100644 --- a/contrib/chem/examples/122/ch4p_cholestanol.chem +++ b/contrib/chem/examples/122/ch4p_cholestanol.chem @@ -9,7 +9,7 @@ ch4p_cholestanol.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -54,8 +54,6 @@ R4: flatring with .V5 at R3.V2 bond down from BP bond 60 from BP -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4q_rings.chem b/contrib/chem/examples/122/ch4q_rings.chem index 3bbf3e0..bafdd92 100644 --- a/contrib/chem/examples/122/ch4q_rings.chem +++ b/contrib/chem/examples/122/ch4q_rings.chem @@ -9,7 +9,7 @@ ch4q_rings.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -40,8 +40,6 @@ R6: ring6 pointing 54 with .V6 at R5.V5 "5" at R5 "6" at R6 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4r_spiro.chem b/contrib/chem/examples/122/ch4r_spiro.chem index a98509b..24ec050 100644 --- a/contrib/chem/examples/122/ch4r_spiro.chem +++ b/contrib/chem/examples/122/ch4r_spiro.chem @@ -9,7 +9,7 @@ ch4r_spiro.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -36,8 +36,6 @@ R3: ring5 with .V5 at R2.V3 back bond 60 from R3.V2 ; OH front bond 150 from R3.V3 ; OH -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4s_heteroatoms.chem b/contrib/chem/examples/122/ch4s_heteroatoms.chem index 13f935e..7dc8ba7 100644 --- a/contrib/chem/examples/122/ch4s_heteroatoms.chem +++ b/contrib/chem/examples/122/ch4s_heteroatoms.chem @@ -9,7 +9,7 @@ ch4s_heteroatoms.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -32,8 +32,6 @@ ch4s_heteroatoms.chem: ring put N at 2 put S at 4 double 2,3 4,5 6,1 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4t_polycyclic.chem b/contrib/chem/examples/122/ch4t_polycyclic.chem index 7a50d82..fc6b580 100644 --- a/contrib/chem/examples/122/ch4t_polycyclic.chem +++ b/contrib/chem/examples/122/ch4t_polycyclic.chem @@ -9,7 +9,7 @@ ch4t_polycyclic.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -43,8 +43,6 @@ B2: bond right from R2.V1 R5: benzene with .V5 at B2.end ring6 put N at 4 double 1,2 3,4 with .V5 at R5.V3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4u_nicotine.chem b/contrib/chem/examples/122/ch4u_nicotine.chem index ee37e19..d38a7c8 100644 --- a/contrib/chem/examples/122/ch4u_nicotine.chem +++ b/contrib/chem/examples/122/ch4u_nicotine.chem @@ -9,7 +9,7 @@ ch4u_nicotine.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -36,8 +36,6 @@ ch4u_nicotine.chem: bond down from .N ; CH3 # or .V1 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4v_histidine.chem b/contrib/chem/examples/122/ch4v_histidine.chem index b8cea27..33a4e9d 100644 --- a/contrib/chem/examples/122/ch4v_histidine.chem +++ b/contrib/chem/examples/122/ch4v_histidine.chem @@ -9,7 +9,7 @@ ch4v_histidine.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -38,8 +38,6 @@ R1: flatring pointing down put N at 2 put N at 5 double 1,2 3,4 bond down from C ; NH2 bond right from C ; CO2H -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4w_lsd.chem b/contrib/chem/examples/122/ch4w_lsd.chem index cca2e12..aa68b00 100644 --- a/contrib/chem/examples/122/ch4w_lsd.chem +++ b/contrib/chem/examples/122/ch4w_lsd.chem @@ -9,7 +9,7 @@ ch4w_lsd.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -44,8 +44,6 @@ W: ring pointing right with .V2 at R.V6 put N at 1 double 3,4 bond 45 from N ; C2H5 bond 135 from N ; C2H5 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4x_anisole.chem b/contrib/chem/examples/122/ch4x_anisole.chem index a729a03..ec78417 100644 --- a/contrib/chem/examples/122/ch4x_anisole.chem +++ b/contrib/chem/examples/122/ch4x_anisole.chem @@ -9,7 +9,7 @@ ch4x_anisole.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -36,8 +36,6 @@ R2: benzene at R1 + (1.5,0) bond down from R2.V4 ; O CH3 right of O -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4y_reserpine.chem b/contrib/chem/examples/122/ch4y_reserpine.chem index 4ff18fc..fb5d1ca 100644 --- a/contrib/chem/examples/122/ch4y_reserpine.chem +++ b/contrib/chem/examples/122/ch4y_reserpine.chem @@ -10,7 +10,7 @@ ch4y_reserpine.chem: # . # Some corrections were added. -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -56,8 +56,6 @@ B: benzene pointing right bond right from B.V1 ; OCH3 bond 150 from B.V2 ; OCH3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem b/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem index 685fc30..6cecd7c 100644 --- a/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem +++ b/contrib/chem/examples/122/ch4z1_eqn_glutamic.chem @@ -13,7 +13,7 @@ delim $$ # . # Some corrections were added. -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -69,8 +69,6 @@ delim $$ bond 60 from C ; O bond right ; CH2C6H5 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch4z2_text.chem b/contrib/chem/examples/122/ch4z2_text.chem index 4397127..2000636 100644 --- a/contrib/chem/examples/122/ch4z2_text.chem +++ b/contrib/chem/examples/122/ch4z2_text.chem @@ -9,7 +9,7 @@ ch4z2_text.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -47,8 +47,6 @@ ch4z2_text.chem: bond 60 length .5 from BP bond 60 dotted -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch5a_size.chem b/contrib/chem/examples/122/ch5a_size.chem index 5eeca02..d4eb33f 100644 --- a/contrib/chem/examples/122/ch5a_size.chem +++ b/contrib/chem/examples/122/ch5a_size.chem @@ -9,7 +9,7 @@ ch5a_size.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -39,8 +39,6 @@ R: ring6 put O at 1 put C at 2 put O at 3 put C at 4 put O at 5 put C at 6 size 10 # if you are doing more than one .ps 10 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch6a_pic.chem b/contrib/chem/examples/122/ch6a_pic.chem index 4351b00..ad6dea6 100644 --- a/contrib/chem/examples/122/ch6a_pic.chem +++ b/contrib/chem/examples/122/ch6a_pic.chem @@ -9,7 +9,7 @@ ch6a_pic.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -37,8 +37,6 @@ R: ring double 2,3 X2: 1/2 bond from X1 to X2 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/ch6b_dna.chem b/contrib/chem/examples/122/ch6b_dna.chem index 73709b0..00abbba 100644 --- a/contrib/chem/examples/122/ch6b_dna.chem +++ b/contrib/chem/examples/122/ch6b_dna.chem @@ -9,7 +9,7 @@ ch6b_dna.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -53,8 +53,6 @@ R3: ring6 put N at 3 put N at 5 double 1,2 bond from Q.O.sw to P.H.ne dotted bond from Q.H.sw to P.Conn dotted -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAa_polymer.chem b/contrib/chem/examples/122/chAa_polymer.chem index 995fba4..3293454 100644 --- a/contrib/chem/examples/122/chAa_polymer.chem +++ b/contrib/chem/examples/122/chAa_polymer.chem @@ -9,7 +9,7 @@ chAa_polymer.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -66,8 +66,6 @@ R2: benzene bond right length .1 from N bond down length .1 from N -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAb_vinyl_chloro.chem b/contrib/chem/examples/122/chAb_vinyl_chloro.chem index a7aa46c..dff97fc 100644 --- a/contrib/chem/examples/122/chAb_vinyl_chloro.chem +++ b/contrib/chem/examples/122/chAb_vinyl_chloro.chem @@ -9,7 +9,7 @@ chAb_vinyl_chloro.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -56,8 +56,6 @@ R2: ring6 double 1,2 3,4 5,6 with .V2 at BP bond down length .1 from R2.V4 ; H bond 120 length .1 from R2.V3 ; H -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAc_morphine.chem b/contrib/chem/examples/122/chAc_morphine.chem index 5d43cdb..c9fbf10 100644 --- a/contrib/chem/examples/122/chAc_morphine.chem +++ b/contrib/chem/examples/122/chAc_morphine.chem @@ -9,7 +9,7 @@ chAc_morphine.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -46,8 +46,6 @@ B1: bond up length .33 from R1.V4 bond to BP -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAd_chlorophyll.chem b/contrib/chem/examples/122/chAd_chlorophyll.chem index 40e9fa2..e2acb22 100644 --- a/contrib/chem/examples/122/chAd_chlorophyll.chem +++ b/contrib/chem/examples/122/chAd_chlorophyll.chem @@ -9,7 +9,7 @@ chAd_chlorophyll.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -63,8 +63,6 @@ R5: ring5 pointing 72 with .V5 at R2.V2 double bond -150 length .3 from R4.V4 bond to R3.V3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAe_chair.chem b/contrib/chem/examples/122/chAe_chair.chem index 30612a3..27b046a 100644 --- a/contrib/chem/examples/122/chAe_chair.chem +++ b/contrib/chem/examples/122/chAe_chair.chem @@ -9,7 +9,7 @@ chAe_chair.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -43,8 +43,6 @@ R2: chair with .V1 at R1.V4.start bond 60 from R2.V4.start ; CH3 bond down from R2.V4.start ; OH -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAf_arrow.chem b/contrib/chem/examples/122/chAf_arrow.chem index 83685b8..f135ecb 100644 --- a/contrib/chem/examples/122/chAf_arrow.chem +++ b/contrib/chem/examples/122/chAf_arrow.chem @@ -12,7 +12,7 @@ delim $$ # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -59,8 +59,6 @@ delim $$ bond left "$n$" with .w at BP.se -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAg_circle.chem b/contrib/chem/examples/122/chAg_circle.chem index 6c70226..576c926 100644 --- a/contrib/chem/examples/122/chAg_circle.chem +++ b/contrib/chem/examples/122/chAg_circle.chem @@ -9,7 +9,7 @@ chAg_circle.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -48,8 +48,6 @@ bond down ; Cl bond 60 from C ; C bond 120 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAh_brackets.chem b/contrib/chem/examples/122/chAh_brackets.chem index 3db3581..7605a38 100644 --- a/contrib/chem/examples/122/chAh_brackets.chem +++ b/contrib/chem/examples/122/chAh_brackets.chem @@ -12,7 +12,7 @@ delim $$ # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -51,8 +51,6 @@ delim $$ bond 60 ; CH3 ] -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem b/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem index 71f9c6a..e4539bb 100644 --- a/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem +++ b/contrib/chem/examples/122/chAi_poly_vinyl_chloride.chem @@ -10,7 +10,7 @@ chAi_poly_vinyl_chloride.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -134,8 +134,6 @@ E: [ arrow from E.ne to A.sw arrow from E.se to C.nw -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chBa_jump.chem b/contrib/chem/examples/122/chBa_jump.chem index db0e2da..cd40a3a 100644 --- a/contrib/chem/examples/122/chBa_jump.chem +++ b/contrib/chem/examples/122/chBa_jump.chem @@ -9,7 +9,7 @@ chBa_jump.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -35,8 +35,6 @@ move right 1 CH3CH2NH2.HCl # name = CH3CH2NH2HCl -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chBb_bonds.chem b/contrib/chem/examples/122/chBb_bonds.chem index acb02fc..bc29895 100644 --- a/contrib/chem/examples/122/chBb_bonds.chem +++ b/contrib/chem/examples/122/chBb_bonds.chem @@ -9,7 +9,7 @@ chBb_bonds.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -36,8 +36,6 @@ backbond 10 from C ; CO2H bond left length .15 from C ; H2N bond right from C ; CH3 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/122/chBc_rings.chem b/contrib/chem/examples/122/chBc_rings.chem index c04623d..950cd0b 100644 --- a/contrib/chem/examples/122/chBc_rings.chem +++ b/contrib/chem/examples/122/chBc_rings.chem @@ -9,7 +9,7 @@ chBc_rings.chem: # by Jon L. Bentley, Lynn W. Jelinski, Brian W. Kernighan # . -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # This file is part of 'chem', which is part of 'groff'. @@ -37,8 +37,6 @@ R3: aromatic ring6 put N at 4 put S at 2 at R2 + (.75,0) R4: ring5 pointing left at R3 + (.75,0) label R4 -######################################################################## -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/README.txt b/contrib/chem/examples/README.txt index d00130e..6786705 100644 --- a/contrib/chem/examples/README.txt +++ b/contrib/chem/examples/README.txt @@ -2,23 +2,6 @@ This directory contains examples for the 'chem' language. You can view the graphical display of the examples by calling - groffer - -'groffer' calls 'chem' automatically. - -If you want to transform example files to a different format use the -'roff2*' programs: - -'roff2dvi' prints dvi format to standard output, -'roff2html' generates html output, -'roff2pdf' outputs pdf mode, -'roff2ps' produces PostScript output, -'roff2text' generates text output in the groff device 'latin1', -'roff2x' prints the output in the groff device X that is - suitable for programs like 'gxditview' or 'xditview'. - -To get a suitable 'groff' output run - @g@chem | groff -p ... On the displays, you can see rings consisting of several lines and @@ -37,7 +20,7 @@ chemically. ####### License -Copyright (C) 2006-2018 Free Software Foundation, Inc. +Copyright (C) 2006-2020 Free Software Foundation, Inc. Written by Bernd Warken . This file is part of 'chem', which is part of 'groff'. @@ -56,7 +39,9 @@ The GPL2 license text is available in the internet at . -####### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/contrib/chem/examples/atp.chem b/contrib/chem/examples/atp.chem index dbc59f4..738c4da 100644 --- a/contrib/chem/examples/atp.chem +++ b/contrib/chem/examples/atp.chem @@ -8,10 +8,7 @@ atp.chem: # Found at http://www.chemindustry.com/apps/chemicals. -# Source file position: /contrib/chem/example/atp.chem -# Installed position: /share/doc/groff/example/chem/atp.chem - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -53,8 +50,9 @@ R2: ring5 pointing down with .V2 put O at 1 bond down from P ; OH bond right from P ; OH -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/cholesterin.chem b/contrib/chem/examples/cholesterin.chem index d5dd046..12ac076 100644 --- a/contrib/chem/examples/cholesterin.chem +++ b/contrib/chem/examples/cholesterin.chem @@ -6,10 +6,7 @@ cholesterin.chem: # 10,13-dimethyl-17-(6-methylheptan-2-yl)-2,3,4,5,6,9,11,12,14,15,16,17- # dodecahydro-1H-cyclopenta[a]phenanthren-3-ol -# Source file position: /contrib/chem/example/cholesterin.p -# Installed position: /share/doc/groff/example/chem/cholesterin.p - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -42,8 +39,9 @@ B1: bond -60 B2: bond 60 bond down at B2.start -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/ethamivan.chem b/contrib/chem/examples/ethamivan.chem index 4de4c15..a0a8aa2 100644 --- a/contrib/chem/examples/ethamivan.chem +++ b/contrib/chem/examples/ethamivan.chem @@ -5,10 +5,7 @@ ethamivan.chem: # Ethamivan or Analepticon or C12_H17_N_O3 or # N,N-diethyl-4-hydroxy-3-methoxy-benzamide -# Source file position: /contrib/chem/example/ethamivan.chem -# Installed position: /share/doc/groff/example/chem/ethamivan.chem - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -38,8 +35,9 @@ B1: double bond up ; O bond 135 from N bond right -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/lsd.chem b/contrib/chem/examples/lsd.chem index 2f23dd8..4879ea8 100644 --- a/contrib/chem/examples/lsd.chem +++ b/contrib/chem/examples/lsd.chem @@ -5,10 +5,7 @@ lsd.chem: # LSD or Lysergic acid dethylamide or C20_H25_N3O or # 9,10-Didehydro-N,N-diethyl-6-methyl-ergoline-8-beta-carboxamide -# Source file position: /contrib/chem/example/lsd.p -# Installed position: /share/doc/groff/example/chem/lsd.p - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -41,8 +38,9 @@ B1: double bond up ; O bond 135 from N bond right -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: .cend diff --git a/contrib/chem/examples/morphine.chem b/contrib/chem/examples/morphine.chem index e994ead..5c236ca 100644 --- a/contrib/chem/examples/morphine.chem +++ b/contrib/chem/examples/morphine.chem @@ -7,10 +7,7 @@ morphine.chem: # Found at http://www.chemindustry.com/apps/chemicals. -# Source file position: /contrib/chem/example/morphine.chem -# Installed position: /share/doc/groff/example/chem/morphine.chem - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -48,7 +45,6 @@ B1: backbond -120 bond -120 at N bond -60 -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/penicillin.chem b/contrib/chem/examples/penicillin.chem index afe2786..ef522bc 100644 --- a/contrib/chem/examples/penicillin.chem +++ b/contrib/chem/examples/penicillin.chem @@ -8,10 +8,7 @@ penicillin.chem: # Found at http://www.chemindustry.com/apps/chemicals. -# Source file position: /contrib/chem/example/morphine.chem -# Installed position: /share/doc/groff/example/chem/morphine.chem - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -49,7 +46,6 @@ D2: doublebond down ; O bond -120 benzene -### Emacs settings # Local Variables: # mode: Nroff # End: diff --git a/contrib/chem/examples/reserpine.chem b/contrib/chem/examples/reserpine.chem index 188ac9c..d1b4046 100644 --- a/contrib/chem/examples/reserpine.chem +++ b/contrib/chem/examples/reserpine.chem @@ -5,10 +5,7 @@ begin chem # Example file for 'chem': # Reserpine or C33H40N2O9 -# Source file position: /contrib/chem/example/reserpine.chem -# Installed position: /share/doc/groff/example/chem/reserpine.chem - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # This file is part of 'chem', which is part of 'groff'. @@ -57,9 +54,10 @@ B: benzene pointing right bond 135 from B.V2 ; O bond right -### Emacs settings # Local Variables: +# fill-column: 72 # mode: Nroff # End: +# vim: set textwidth=72: end .PE diff --git a/contrib/eqn2graph/eqn2graph.1.man b/contrib/eqn2graph/eqn2graph.1.man index 8113227..c059190 100644 --- a/contrib/eqn2graph/eqn2graph.1.man +++ b/contrib/eqn2graph/eqn2graph.1.man @@ -1,6 +1,8 @@ -.TH EQN2GRAPH @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -eqn2graph \- convert an EQN equation into a cropped image +.TH eqn2graph @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +eqn2graph \- convert an +.I eqn \" generic +equation into a cropped image . . .\" ==================================================================== @@ -10,33 +12,57 @@ eqn2graph \- convert an EQN equation into a cropped image .\" This documentation is released to the public domain. . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_eqn2graph_1_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY eqn2graph -.OP \-format output-format -.RI [ convert-arguments ] +.RB [ \-format\~\c +.IR output-format ] +.RI [ convert-argument \~.\|.\|.] .YS . +. .SY eqn2graph .B \-\-help .YS . +. .SY eqn2graph .B \-v +. .SY eqn2graph .B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . .I eqn2graph reads a one-line -.IR @g@eqn (@MAN1EXT@) +.MR @g@eqn @MAN1EXT@ equation from the standard input and writes an image file, by default in Portable Network Graphics (PNG) format, to the standard output. @@ -46,9 +72,9 @@ to the standard output. The input EQN code should .I not be preceded by the -.B \&.EQ +.B .EQ macro that normally precedes it within -.IR groff (@MAN1EXT@) +.MR groff @MAN1EXT@ macros; nor do you need to have dollar-sign or other delimiters around the equation. @@ -64,7 +90,7 @@ equation. Arguments not recognized by .I eqn2graph are passed to the ImageMagick or GraphicsMagick program -.IR \%convert (1). +.MR convert 1 . . . By specifying these, you can give your image a border, @@ -83,11 +109,21 @@ pixels. . . .\" ==================================================================== -.SH OPTIONS +.SH Options .\" ==================================================================== . +.B \-\-help +displays a usage message, +while +.B \-v +and +.B \-\-version +show version information; +all exit afterward. +. +. .TP -.BI "\-format " output-format +.BI \-format\~ output-format Write the image in .IR output-format , which must be understood by @@ -95,20 +131,8 @@ which must be understood by the default is PNG. . . -.TP -.B \-\-help -Display a usage message and exit. -. -. -.TP -.B \-v -.TQ -.B \-\-version -Display version information and exit. -. -. .\" ==================================================================== -.SH ENVIRONMENT +.SH Environment .\" ==================================================================== . .TP @@ -128,31 +152,37 @@ is used. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== . .I eqn2graph was written by -.MT esr@\:thyrsus.com +.MT esr@\:thyrsus\:.com Eric S.\& Raymond .ME , based on a recipe for -.IR pic2graph (@MAN1EXT@), +.MR pic2graph @MAN1EXT@ , by W.\& Richard Stevens. . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.IR pic2graph (@MAN1EXT@), -.IR grap2graph (@MAN1EXT@), -.IR @g@eqn (@MAN1EXT@), -.IR groff (@MAN1EXT@), -.IR \%convert (1) +.MR pic2graph @MAN1EXT@ , +.MR grap2graph @MAN1EXT@ , +.MR @g@eqn @MAN1EXT@ , +.MR groff @MAN1EXT@ , +.MR convert 1 +. +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_eqn2graph_1_man_C] +.do rr *groff_eqn2graph_1_man_C . . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/eqn2graph/eqn2graph.am b/contrib/eqn2graph/eqn2graph.am index 79a8ad1..2870d13 100644 --- a/contrib/eqn2graph/eqn2graph.am +++ b/contrib/eqn2graph/eqn2graph.am @@ -1,6 +1,4 @@ -# Copyright (C) 2002-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -35,8 +33,8 @@ eqn2graph: $(top_srcdir)/contrib/eqn2graph/eqn2graph.sh && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/gdiffmk/ChangeLog b/contrib/gdiffmk/ChangeLog index 5237cd4..bc968bb 100644 --- a/contrib/gdiffmk/ChangeLog +++ b/contrib/gdiffmk/ChangeLog @@ -1,3 +1,42 @@ +2023-02-09 G. Branden Robinson + + Revise test regime. Reduce amount of indirection required to + run a test, and directly use the same script for standalone and + Automake-integrated testing. + + * tests/gdiffmk_tests.sh: Delete. + * tests/runtests.sh: Revise to search for test artifact input + and output directories (source vs. build). Drop argument + processing, converting two modes ("run" and "clean") into one + {run, with cleaning afterward}. Also ensure we use the build + directory to construct "tmp_file.7". Update authorship credit + so that Mike Bianchi isn't asked to support it. + + * tests/baseline.7: Update expected test output. + + * gdiffmk.am (TESTS): Run "runtests.sh" instead of + "gdiffmk_tests.sh". + (clean-local, clean_gdiffmk_check): Drop targets now that the + test script cleans up after itself. + +2023-02-06 G. Branden Robinson + + * tests/runtests.sh: Refactor file handling. Use narrower globs + to match the file names actually used; they are suffixed with a + dot and a number, not a number alone. Honor $TMPDIR when + creating the even-more-temporary file. Revise trap setup so + that the trap handler cannot be interrupted if it is already + running. Call the handler, then commit suicide with SIGINT. + Use symbolic names for signals, not numbers. Call new CleanUp + function before exiting normally. + (CleanUp): Pull temporary file clean-up logic into new function. + Also delete the even-more-temporary file used in test 1. + +2022-10-18 G. Branden Robinson + + * gdiffmk.sh: Drop "GNU" from version information, since this + program resides in groff's "contrib" directory. + 2018-02-28 Werner LEMBERG * gdiffmk.am (gdiffmk): Use $(AM_V_GEN) to silence file generation. @@ -159,15 +198,15 @@ First import of gdiffmk files. -Copyright 2004-2009, 2014-2015 - Free Software Foundation, Inc. +Copyright 2004-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never +fill-column: 72 mode: change-log -coding: latin-1 +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/gdiffmk/README b/contrib/gdiffmk/README index d0b8e21..d2214dd 100644 --- a/contrib/gdiffmk/README +++ b/contrib/gdiffmk/README @@ -25,7 +25,7 @@ argument gives the usage. ---------------------------------------------------------------------------- -Copyright (C) 2004-2018 Free Software Foundation, Inc. +Copyright (C) 2004-2020 Free Software Foundation, Inc. Written by Mike Bianchi > This file is part of the gdiffmk utility, which is part of groff. @@ -45,7 +45,9 @@ along with groff; see the files COPYING and LICENSE in the top directory of the groff source. If not, write to the Free Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. -# Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: text End: +vim: set textwidth=72: diff --git a/contrib/gdiffmk/gdiffmk.1.man b/contrib/gdiffmk/gdiffmk.1.man index 1e20d47..36f30b7 100644 --- a/contrib/gdiffmk/gdiffmk.1.man +++ b/contrib/gdiffmk/gdiffmk.1.man @@ -1,13 +1,15 @@ -.TH GDIFFMK @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -gdiffmk \- mark differences between groff/nroff/troff files +.TH gdiffmk @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +gdiffmk \- mark differences between +.IR groff / nroff / troff +files . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2004-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2004-2020 Free Software Foundation, Inc. .\" .\" This file is part of gdiffmk, which is part of groff, the GNU roff .\" type-setting system. @@ -27,143 +29,175 @@ gdiffmk \- mark differences between groff/nroff/troff files .\" . . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_gdiffmk_1_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY gdiffmk -.OP \-a addmark -.OP \-c changemark -.OP \-d deletemark +.RB [ \-a\~\c +.IR add-mark ] +.RB [ \-c\~\c +.IR change-mark ] +.RB [ \-d\~\c +.IR delete-mark ] +.RB [ \-x\~\c +.IR diff-command ] .RB [ \-D .RB [ \-B ] .RB [ \-M .IR "mark1 mark2" ]] -.OP \-x diffcmd -.OP \-\- +.RB [ \-\- ] .I file1 .I file2 .RI [ output ] .YS . +. .SY gdiffmk .B \-\-help .YS . +. .SY gdiffmk .B \-\-version .YS . +. .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . -.B gdiffmk +.I gdiffmk compares two -.BR groff (1), -.BR nroff (1), -or -.BR troff (1) +.MR roff @MAN7EXT@ documents, .I file1 and .IR file2 , -and creates an output which is +and creates a +.I roff +document consisting of .I file2 -with added \[lq]margin character\[rq] (.mc) commands that indicate the -differences. +with added margin character +.RB ( .mc ) +requests indicating output lines that differ from +.I file1. . -. -.LP -If the -.I output -filename is present, -the output is written there. -. -If it is -.B \- -or absent the output is written to the standard output. -. -. -.LP If the .I file1 or .I file2 argument is -.B \- -the standard input is read for that input. -. -Clearly both cannot be -.BR \- . +.RB \[lq] \- \[rq], +.I gdiffmk +reads the standard input stream for that input. . +If the +.I output +operand is present, +.I gdiffmk +writes output to a file of that name. . -.LP -Note that the output is not necessarily compatible with all macro packages -and all preprocessors. +If it is +.RB \[lq] \- \[rq] +or absent, +.I gdiffmk +writes output to the standard output stream. . -See section \(lqBugs\(rq below. +.RB \[lq] \- \[rq] +cannot be both an input and output operand. . . .\" ==================================================================== -.SH OPTIONS +.SH Options .\" ==================================================================== . +.B \-\-help +displays a usage message +and +.B \-\-version +shows version information; +both exit afterward. +. +. .TP -.BI \-a addmark -Use the -.I addmark +.BI \-a\~ add-mark +Use +.I add-mark for source lines not in .I file1 but present in .IR file2 . . Default: -.BR + . +.RB \[lq] + \[rq]. +. . .TP .B \-B -By default, the deleted texts marked by the +By default, +the deleted texts marked by the .B \-D -option end -with an added troff break command, +option end with an added +.I roff +break request, .BR .br , to ensure that the deletions are marked properly. . This is the only way to guarantee that deletions and small changes get flagged. . -This option directs the program not to insert these breaks; it makes -no sense to use it without +This option directs the program not to insert these breaks; +it makes no sense to use it without .BR \-D . . +. .TP -.BI \-c changemark -Use the -.I changemark +.BI \-c\~ change-mark +Use +.I change-mark for changed source lines. . Default: -.BR | . +.RB \[lq] | \[rq]. +. . .TP -.BI \-d deletemark +.BI \-d\~ delete-mark Use the -.I deletemark +.I delete-mark for deleted source lines. . Default: -.BR * . +.RB \[lq] * \[rq]. . .TP .B \-D Show the deleted portions from changed and deleted text. . -Default delimiting marks: -.BR "[[" " \&.\|.\|.\& " "]]" . . .TP -.BI \-M "mark1 mark2" +.BI \-M\~ "mark1 mark2" Change the delimiting marks for the .B \-D option. @@ -171,90 +205,100 @@ option. It makes no sense to use this option without .BR \-D . . +Default delimiting marks: +.RB \[lq] [[ "\[rq] .\|.\|.\& \[lq]" ]] \[rq]. +. +. .TP -.BI \-x diffcmd +.BI \-x\~ diff-command Use the -.I diffcmd +.I diff-command command to perform the comparison of .I file1 and .IR file2 . . In particular, -.I diffcmd +.I diff-command should accept the GNU -.B diff -.BI \-D name +.MR diff 1 +.B \-D option. . Default: -.BR diff (1). +.BR diff . +. . .TP .B \-\- -All the following arguments are treated as file names, +Treat all subsequent arguments as file names, even if they begin with -.BR \- . -. -.TP -.B \-\-help -Print a usage message on standard error output and exit. -. -.TP -.B \-\-version -Print version information on the standard output and exit. +.RB \[lq] \- \[rq]. . . .\" ==================================================================== -.SH BUGS +.SH Bugs .\" ==================================================================== . The output is not necessarily compatible with all macro packages and all preprocessors. . -A workaround that is often successful against preprocessor problems is -to run -.B gdiffmk +A workaround that often overcomes preprocessor problems is to run +.I gdiffmk on the output of all the preprocessors instead of the input source. . . .LP -.B gdiffmk +.I gdiffmk relies on the -.BI \-D name +.B \-D option of GNU -.BR diff (1) +.I diff to make a merged \[lq]#ifdef\[rq] output format. . -It hasn't been tested whether other versions of -.BR diff (1) -do support this option. +Busybox +.I diff +is known to not support it. . -See also the -.BI \-x diffcmd +Also see the +.BI \-x\~ diff-command option. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== -.B gdiffmk -was written and is maintained by -.MT MBianchi@\:Foveal.com +. +.I gdiffmk +was written by +.MT MBianchi@\:Foveal\:.com Mike Bianchi -.ME . +.ME , +now retired. +. +It is maintained by the +.I groff +developers. . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.BR groff (@MAN1EXT@), -.BR nroff (@MAN1EXT@), -.BR gtroff (@MAN1EXT@), -.BR diff (@MAN1EXT@) +.MR groff @MAN1EXT@ , +.MR nroff @MAN1EXT@ , +.MR gtroff @MAN1EXT@ , +.MR roff @MAN7EXT@ , +.MR diff @MAN1EXT@ +. +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_gdiffmk_1_man_C] +.do rr *groff_gdiffmk_1_man_C +. . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/gdiffmk/gdiffmk.am b/contrib/gdiffmk/gdiffmk.am index 325948e..46f224b 100644 --- a/contrib/gdiffmk/gdiffmk.am +++ b/contrib/gdiffmk/gdiffmk.am @@ -1,13 +1,9 @@ # Automake rules for 'gdiffmk' (integration into the groff source tree) # -# File position: /contrib/gdiffmk/gdiffmk.am -# -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # Written by Mike Bianchi > # Automake migration by Bertrand Garrigues # -# Last update: 20 Aug 2015 -# # This file is part of the gdiffmk utility, which is part of groff. # # groff is free software; you can redistribute it and/or modify it @@ -26,14 +22,13 @@ ######################################################################## gdiffmk_srcdir = $(top_srcdir)/contrib/gdiffmk bin_SCRIPTS += gdiffmk -TESTS += contrib/gdiffmk/tests/gdiffmk_tests.sh +TESTS += contrib/gdiffmk/tests/runtests.sh man1_MANS += contrib/gdiffmk/gdiffmk.1 EXTRA_DIST += \ contrib/gdiffmk/gdiffmk.1.man \ contrib/gdiffmk/ChangeLog \ contrib/gdiffmk/README \ contrib/gdiffmk/gdiffmk.sh \ - contrib/gdiffmk/tests/gdiffmk_tests.sh \ contrib/gdiffmk/tests/runtests.sh \ contrib/gdiffmk/tests/baseline \ contrib/gdiffmk/tests/baseline.6 \ @@ -56,20 +51,9 @@ gdiffmk: $(gdiffmk_srcdir)/gdiffmk.sh >$@ \ && chmod +x $@ -clean-local: clean_gdiffmk_check -clean_gdiffmk_check: - if test -d $(top_builddir)/contrib/gdiffmk/tests; then \ - cd $(top_builddir)/contrib/gdiffmk/tests && \ - $(abs_top_srcdir)/contrib/gdiffmk/tests/runtests.sh clean; \ - fi - -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/gdiffmk/gdiffmk.sh b/contrib/gdiffmk/gdiffmk.sh index 5ce931e..2473fb1 100644 --- a/contrib/gdiffmk/gdiffmk.sh +++ b/contrib/gdiffmk/gdiffmk.sh @@ -1,5 +1,5 @@ #!@BASH_PROG@ -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # Written by Mike Bianchi > # Thanks to Peter Bray for debugging. @@ -217,7 +217,7 @@ do shift ;; --version) - echo "GNU ${CMD} (groff) version @VERSION@" + echo "${CMD} (groff) version @VERSION@" exit 0 ;; --help) diff --git a/contrib/gdiffmk/tests/baseline.7 b/contrib/gdiffmk/tests/baseline.7 index df23363..4a83af6 100644 --- a/contrib/gdiffmk/tests/baseline.7 +++ b/contrib/gdiffmk/tests/baseline.7 @@ -1,2 +1,2 @@ gdiffmk: The FILE2 and OUTPUT arguments both point to the same file, -gdiffmk: 'tmp_file.7', and it would be overwritten. +gdiffmk: './contrib/gdiffmk/tests/tmp_file.7', and it would be overwritten. diff --git a/contrib/gdiffmk/tests/gdiffmk_tests.sh b/contrib/gdiffmk/tests/gdiffmk_tests.sh deleted file mode 100755 index e74d594..0000000 --- a/contrib/gdiffmk/tests/gdiffmk_tests.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# Execute runtests.sh in the builddir - -set -e - -mkdir -p ${abs_top_builddir}/contrib/gdiffmk/tests -cd ${abs_top_builddir}/contrib/gdiffmk/tests -${abs_top_srcdir}/contrib/gdiffmk/tests/runtests.sh run diff --git a/contrib/gdiffmk/tests/runtests.sh b/contrib/gdiffmk/tests/runtests.sh index 0f7c3b6..51cf855 100755 --- a/contrib/gdiffmk/tests/runtests.sh +++ b/contrib/gdiffmk/tests/runtests.sh @@ -2,8 +2,9 @@ # # A very simple function test for gdiffmk.sh. # -# Copyright (C) 2004-2018 Free Software Foundation, Inc. -# Written by Mike Bianchi > +# Copyright (C) 2004-2020, 2023 Free Software Foundation, Inc. +# Written by Mike Bianchi . +# Subsequent modifications by G. Branden Robinson. # This file is part of the gdiffmk utility, which is part of groff. @@ -21,34 +22,60 @@ # along with this program. If not, see . # This file is part of GNU gdiffmk. -# abs_top_srcdir and abs_top_builddir are set by AM_TESTS_ENVIRONMENT -# (defined in Makefile.am) when running make check - -srcdir=${abs_top_srcdir}/contrib/gdiffmk/tests - -command=${abs_top_builddir}/gdiffmk - -# Test the number of arguments and the first argument. -case "$#-$1" in -1-clean ) - rm -fv result* tmp_file* - exit 0 - ;; -1-run ) - ;; -* ) - echo >&2 "$0 [ clean | run ] -Run a few simple tests on '${command}'."' - -clean Remove the result? and tmp_file? files. -run Run the tests. -' - exit 255 - ;; -esac +# abs_top_out_dir is set by AM_TESTS_ENVIRONMENT (defined in +# Makefile.am) when running "make check". + +gdiffmk=${abs_top_out_dir:-.}/gdiffmk + +# Locate directory containing our test artifacts. +in_dir= + +for srcroot in . .. ../.. +do + # Look for a source file characteristic of the groff source tree. + if ! [ -f "$srcroot"/ChangeLog.115 ] + then + continue + fi + + d=$srcroot/contrib/gdiffmk/tests + if [ -d "$d" ] + then + in_dir=$d + break + fi +done + +# If we can't find it, we can't test. +if [ -z "$in_dir" ] +then + echo "$0: cannot locate test artifact input directory" >&2 + exit 77 # skip +fi + +# Locate directory where we'll put the test output. +out_dir= + +for buildroot in . .. ../.. +do + d=$buildroot/contrib/gdiffmk/tests + if [ -d "$d" ] + then + out_dir=$d + break + fi +done + +# If we can't find it, we can't test. +if [ -z "$out_dir" ] +then + echo "$0: cannot locate test artifact output directory" >&2 + exit 77 # skip +fi exit_code=0 # Success failure_count=0 + TestResult () { if cmp -s $1 $2 then @@ -63,92 +90,98 @@ TestResult () { fi } -tmpfile=/tmp/$$ -trap 'rm -f ${tmpfile}' 0 1 2 3 15 +CleanUp () { + rm -f ${out_dir}/result.* ${out_dir}/tmp_file.* ${tmpfile} +} + +tmpfile=${TMPDIR:-/tmp}/$$ +trap 'trap "" HUP INT QUIT TERM; CleanUp; kill -s INT $$' \ + HUP INT QUIT TERM # Run tests. # 3 file arguments -ResultFile=result.1 -${command} ${srcdir}/file1 ${srcdir}/file2 ${ResultFile} 2>${tmpfile} +ResultFile=${out_dir}/result.1 +${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 ${ResultFile} 2>${tmpfile} cat ${tmpfile} >>${ResultFile} -TestResult ${srcdir}/baseline ${ResultFile} - +TestResult ${in_dir}/baseline ${ResultFile} # OUTPUT to stdout by default -ResultFile=result.2 -${command} ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline ${ResultFile} - +ResultFile=${out_dir}/result.2 +${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline ${ResultFile} # OUTPUT to stdout via - argument -ResultFile=result.3 -${command} ${srcdir}/file1 ${srcdir}/file2 - >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline ${ResultFile} - +ResultFile=${out_dir}/result.3 +${gdiffmk} ${in_dir}/file1 ${in_dir}/file2 - >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline ${ResultFile} # FILE1 from standard input via - argument -ResultFile=result.4 -${command} - ${srcdir}/file2 <${srcdir}/file1 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline ${ResultFile} +ResultFile=${out_dir}/result.4 +${gdiffmk} - ${in_dir}/file2 <${in_dir}/file1 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline ${ResultFile} # FILE2 from standard input via - argument -ResultFile=result.5 -${command} ${srcdir}/file1 - <${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline ${ResultFile} +ResultFile=${out_dir}/result.5 +${gdiffmk} ${in_dir}/file1 - <${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline ${ResultFile} # Different values for addmark, changemark, deletemark -ResultFile=result.6 -${command} -aA -cC -dD ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.6 ${ResultFile} +ResultFile=${out_dir}/result.6 +${gdiffmk} -aA -cC -dD ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.6 ${ResultFile} # Different values for addmark, changemark, deletemark # Alternate format of -a -c and -d flag arguments -ResultFile=result.6a -${command} -a A -c C -d D ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.6a ${ResultFile} +ResultFile=${out_dir}/result.6a +${gdiffmk} -a A -c C -d D ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.6a ${ResultFile} # Test for accidental file overwrite. -ResultFile=result.7 -cp ${srcdir}/file2 tmp_file.7 -${command} -aA -dD -cC ${srcdir}/file1 tmp_file.7 tmp_file.7 \ +ResultFile=${out_dir}/result.7 +TempFile=${out_dir}/tmp_file.7 +cp ${in_dir}/file2 "$TempFile" +${gdiffmk} -aA -dD -cC ${in_dir}/file1 "$TempFile" "$TempFile" \ >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.7 ${ResultFile} +TestResult ${in_dir}/baseline.7 ${ResultFile} # Test -D option -ResultFile=result.8 -${command} -D ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.8 ${ResultFile} +ResultFile=${out_dir}/result.8 +${gdiffmk} -D ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.8 ${ResultFile} # Test -D and -M options -ResultFile=result.9 -${command} -D -M '<<<<' '>>>>' \ - ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.9 ${ResultFile} +ResultFile=${out_dir}/result.9 +${gdiffmk} -D -M '<<<<' '>>>>' \ + ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.9 ${ResultFile} # Test -D and -M options # Alternate format of -M argument. -ResultFile=result.9a -${command} -D -M'<<<<' '>>>>' \ - ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.9a ${ResultFile} +ResultFile=${out_dir}/result.9a +${gdiffmk} -D -M'<<<<' '>>>>' \ + ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.9a ${ResultFile} # Test -D and -B options -ResultFile=result.10 -${command} -D -B ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 -TestResult ${srcdir}/baseline.10 ${ResultFile} +ResultFile=${out_dir}/result.10 +${gdiffmk} -D -B ${in_dir}/file1 ${in_dir}/file2 >${ResultFile} 2>&1 +TestResult ${in_dir}/baseline.10 ${ResultFile} echo failure_count ${failure_count} +# You can comment out the following line to examine failing cases. +CleanUp + exit ${exit_code} -# EOF +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/glilypond/ChangeLog b/contrib/glilypond/ChangeLog index 16e193f..c218610 100644 --- a/contrib/glilypond/ChangeLog +++ b/contrib/glilypond/ChangeLog @@ -1,3 +1,57 @@ +2022-10-19 G. Branden Robinson + + * glilypond.pl (version): Report version information in format + recommended by GNU coding standards. Bump micro version number + to reflect this and the restructuring immediately previous. + +2022-10-19 G. Branden Robinson + + Make glilypond script stand alone. + + * args.pl: + * oop_fh.pl + * subs.pl: Delete, moving their content into... + * glilypond.pl: ...here. Also bump overall license to GPLv3 + from GPLv2 because all of the deleted files were GPLv3. + * glilypond.am (dist_glilypond_DATA): Delete. + +2022-05-03 G. Branden Robinson + + * glilypond.am (glilypond): Spell dependency on + `$(SH_DEPS_SED_SCRIPT)` using that macro expansion instead of a + literal file name. See groff's doc/automake.mom. + +2021-01-06 Colin Watson + + * glilypond.pl: Avoid Perl's unsafe "<>" operator. + + The "<>" operator is implemented using the two-argument form of + "open", which interprets magic such as pipe characters, allowing + execution of arbitrary commands which is unlikely to be + expected. Perl >= 5.22 has a "<<>>" operator which avoids this, + but also forbids the use of "-" to mean the standard input, + which is a facility that the affected groff programs document. + + ARGV::readonly would probably also fix this, but I fundamentally + dislike the approach of escaping data in preparation for a + language facility to unescape it, especially when the required + escaping is as non-obvious as it is here. (For the same reason, + I prefer to use subprocess invocation facilities that allow + passing the argument list as a list rather than as a string to + be interpreted by the shell.) So I've abandoned this dubious + convenience and changed the affected programs to iterate over + command-line arguments manually using the three-argument form of + open. + + glilypond doesn't need the initial unshift since that's already + handled in args.pl. + + Fixes . + +2020-04-22 G. Branden Robinson + + * glilypond.1.man: Delete references to groffer. + 2018-02-28 Werner LEMBERG * glilypond.am (glilypond): Use $(AM_V_GEN) to silence file generation. @@ -222,13 +276,15 @@ ######################################################################## -Copyright 2013-2018 Free Software Foundation, Inc. +Copyright 2013-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never +fill-column: 72 mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/glilypond/ChangeLog.0x b/contrib/glilypond/ChangeLog.0x index 10f45e7..b1dc833 100644 --- a/contrib/glilypond/ChangeLog.0x +++ b/contrib/glilypond/ChangeLog.0x @@ -89,14 +89,16 @@ * groff_lilypond.pl: Program written in Perl, version v0.1 * groff_lilypond.man: Corresponding man-page -Copyright 2013-2018 Free Software Foundation, Inc. +Copyright 2013-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never -mode: change-log-mode coding: utf-8 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/glilypond/README.txt b/contrib/glilypond/README.txt index 0b976f1..f47e824 100644 --- a/contrib/glilypond/README.txt +++ b/contrib/glilypond/README.txt @@ -1,4 +1,4 @@ - Copyright (C) 2013-2018 Free Software Foundation, Inc. + Copyright (C) 2013-2020 Free Software Foundation, Inc. Written by Bernd Warken @@ -28,16 +28,16 @@ Add 'AC_DEFUN([GROFF_GROFFERDIR_DEFAULT])'. Add 'GROFF_GROFFERDIR_DEFAULT'. 3) /Makefile.in: -Add several informations of 'glilypond_dir' +Add several information of 'glilypond_dir' With that, the program 'autoconf' can be run in order to update the configure files and Makefile's. Now '$glilypond_dir' can be used as libdir. - -######################################################################## -### Emacs settings -# Local Variables: -# mode: text -# End: +##### Editor settings +Local Variables: +fill-column: 72 +mode: text +End: +vim: set textwidth=72: diff --git a/contrib/glilypond/args.pl b/contrib/glilypond/args.pl deleted file mode 100644 index 038b004..0000000 --- a/contrib/glilypond/args.pl +++ /dev/null @@ -1,504 +0,0 @@ -######################################################################## -# Legalese -######################################################################## - -my $License = q* -groff_lilypond - integrate 'lilypond' into 'groff' files - -Source file position: '/contrib/glilypond/args.pl' -Installed position: '/lib/groff/glilypond' - -Copyright (C) 2013-2018 Free Software Foundation, Inc. - Written by Bernd Warken - -Last update: 10 Sep 2015 - -This file is part of 'GNU groff'. - - 'GNU groff' is free software: you can redistribute it and/or modify it -under the terms of the 'GNU General Public License' as published by the -'Free Software Foundation', either version 3 of the License, or (at your -option) any later version. - - 'GNU groff' is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 'GNU -General Public License' for more details. - - You should have received a copy of the 'GNU General Public License' -along with 'groff', see the files 'COPYING' and 'LICENSE' in the top -directory of the 'groff' source package. If not, see -. -*; - -##### end legalese - - -# use strict; -# use warnings; -# use diagnostics; - -use integer; - -our ( $Globals, $Args, $stderr, $v, $out ); - -# ---------- -# subs for second run, for remaining long options after splitting and -# transfer -# ---------- - -my %opts_with_arg = - ( - - '--eps_dir' => sub { - $Args->{'eps_dir'} = shift; - }, - - '--output' => sub { - $Args->{'output'} = shift; - }, - - '--prefix' => sub { - $Args->{'prefix'} = shift; - }, - - '--temp_dir' => sub { - $Args->{'temp_dir'} = shift; - }, - - ); # end of %opts_with_arg - - -my %opts_noarg = - ( - - '--help' => sub { - &usage; - exit; - }, - - '--keep_all' => sub { - $Args->{'keep_all'} = TRUE; - }, - - '--license' => sub { - &license; - exit; - }, - - '--ly2eps' => sub { - $Args->{'eps_func'} = 'ly'; - }, - - '--pdf2eps' => sub { - $Args->{'eps_func'} = 'pdf'; - }, - - '--verbose' => sub { - $Args->{'verbose'} = TRUE; - }, - - '--version' => sub { - &version; - exit; - }, - - ); # end of %opts_noarg - - -# used variables in both runs - -my @files = EMPTYARRAY; - - -#---------- -# first run for command-line arguments -#---------- - -# global variables for first run - -my @splitted_args; -my $double_minus = FALSE; -my $arg = EMPTYSTRING; -my $has_arg = FALSE; - - -# Split short option collections and transfer these to suitable long -# options from above. Note that '-v' now means '--verbose' in version -# 'v1.1', earlier versions had '--version' for '-v'. - -my %short_opts = - ( - '?' => '--help', - 'e' => '--eps_dir', - 'h' => '--help', - 'l' => '--license', - 'k' => '--keep_all', - 'o' => '--output', - 'p' => '--prefix', - 't' => '--temp_dir', - 'v' => '--verbose', - 'V' => '--verbose', - ); - - -# transfer long option abbreviations to the long options from above - -my @long_opts; - -$long_opts[3] = - { # option abbreviations of 3 characters - '--e' => '--eps_dir', - '--f' => '--prefix', # --f for --file_prefix - '--h' => '--help', - '--k' => '--keep_all', # and --keep_files - '--o' => '--output', - '--p' => '--prefix', # and --file_prefix - '--t' => '--temp_dir', - '--u' => '--help', # '--usage' is mapped to '--help' - }; - -$long_opts[4] = - { # option abbreviations of 4 characters - '--li' => '--license', - '--ly' => '--ly2eps', - '--pd' => '--pdf2eps', - '--pr' => '--prefix', - }; - -$long_opts[6] = - { # option abbreviations of 6 characters - '--verb' => '--verbose', - '--vers' => '--version', - }; - - -# subs for short splitting and replacing long abbreviations - -my $split_short = sub { - - my @chars = split //, $1; # omit leading dash - - # if result is TRUE: run 'next SPLIT' afterwards - - CHARS: while ( @chars ) { - my $c = shift @chars; - - unless ( exists $short_opts{$c} ) { - $stderr->print( "Unknown short option '-$c'." ); - next CHARS; - } - - # short option exists - - # map or transfer to special long option from above - my $transopt = $short_opts{$c}; - - if ( exists $opts_noarg{$transopt} ) { - push @splitted_args, $transopt; - $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' ); - next CHARS; - } - - if ( exists $opts_with_arg{$transopt} ) { - push @splitted_args, $transopt; - - if ( @chars ) { - # if @chars is not empty, option $transopt has argument - # in this arg, the rest of characters in @chars - push @splitted_args, join "", @chars; - @chars = EMPTYARRAY; - return TRUE; # use 'next SPLIT' afterwards - } - - # optarg is the next argument - $has_arg = $transopt; - return TRUE; # use 'next SPLIT' afterwards - } # end of if %opts_with_arg - } # end of while CHARS - return FALSE; # do not do anything -}; # end of sub for short_opt_collection - - -my $split_long = sub { - my $from_arg = shift; - $from_arg =~ /^([^=]+)/; - my $opt_part = lc($1); - my $optarg = undef; - if ( $from_arg =~ /=(.*)$/ ) { - $optarg = $1; - } - - N: for my $n ( qw/6 4 3/ ) { - $opt_part =~ / # match $n characters - ^ - ( - .{$n} - ) - /x; - my $argn = $1; # get the first $n characters - - # no match, so luck for fewer number of chars - next N unless ( $argn ); - - next N unless ( exists $long_opts[$n]->{$argn} ); - # not in $n hash, so go on to next loop for $n - - # now $n-hash has arg - - # map or transfer to special long opt from above - my $transopt = $long_opts[$n]->{$argn}; - - # test on option without arg - if ( exists $opts_noarg{$transopt} ) { # opt has no arg - $stderr->print( 'Option ' . $transopt . 'has no argument: ' . - $from_arg . '.' ) if ( defined($optarg) ); - push @splitted_args, $transopt; - $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' ); - return TRUE; # use 'next SPLIT' afterwards - } # end of if %opts_noarg - - # test on option with arg - if ( exists $opts_with_arg{$transopt} ) { # opt has arg - push @splitted_args, $transopt; - - # test on optarg in arg - if ( defined($optarg) ) { - push @splitted_args, $1; - return TRUE; # use 'next SPLIT' afterwards - } # end of if optarg in arg - - # has optarg in next arg - $has_arg = $transopt; - return TRUE; # use 'next SPLIT' afterwards - } # end of if %opts_with_arg - - # not with and without option, so is not permitted - $stderr->print( "'" . $transopt . - "' is unknown long option from '" . $from_arg . "'" ); - return TRUE; # use 'next SPLIT' afterwards - } # end of for N - return FALSE; # do nothing -}; # end of split_long() - - -#---------- -# do split and transfer arguments -#---------- -sub run_first { - - SPLIT: foreach (@ARGV) { - # Transform long and short options into some given long options. - # Split long opts with arg into 2 args (no '='). - # Transform short option collections into given long options. - chomp; - - if ( $has_arg ) { - push @splitted_args, $_; - $has_arg = EMPTYSTRING; - next SPLIT; - } - - if ( $double_minus ) { - push @files, $_; - next SPLIT; - } - - if ( $_ eq '-' ) { # file arg '-' - push @files, $_; - next SPLIT; - } - - if ( $_ eq '--' ) { # POSIX arg '--' - push @splitted_args, $_; - $double_minus = TRUE; - next SPLIT; - } - - if ( / # short option or collection of short options - ^ - - - ( - [^-] - .* - ) - $ - /x ) { - $split_short->($1); - next SPLIT; - } # end of short option - - if ( /^--/ ) { # starts with 2 dashes, a long option - $split_long->($_); - next SPLIT; - } # end of long option - - # unknown option without leading dash is a file name - push @files, $_; - next SPLIT; - } # end of foreach SPLIT - - # all args are considered - $stderr->print( "Option '$has_arg' needs an argument." ) - if ( $has_arg ); - - - push @files, '-' unless ( @files ); - @ARGV = @splitted_args; - -}; # end of first run, splitting with map or transfer - - -#---------- -# open or ignore verbose output -#---------- -sub install_verbose { - if ( $Args->{'verbose'} ) { # '--verbose' was used - # make verbose output into $v - my $s = $v->get(); # get content of string so far as array ref, close - - $v = new FH_STDERR(); # make verbose output into STDERR - if ( $s ) { - for ( @$s ) { - # print the file content into new verbose output - $v->print($_); - } - } - # verbose output is now active (into STDERR) - $v->print( "Option '-v' means '--verbose'." ); - $v->print( "Version information is printed by option '--version'." ); - $v->print( "#" x 72 ); - - } else { # '--verbose' was not used - # do not be verbose, make verbose invisible - - $v->close(); # close and ignore the string content - - $v = new FH_NULL(); - # this is either into /dev/null or in an ignored string - - } # end if-else about verbose - # '$v->print' works now in any case - - $v->print( "Verbose output was chosen." ); - - my $s = $Globals->{'prog_is_installed'} ? '' : ' not'; - $v->print( $Globals->{'prog'} . " is" . $s . - " installed." ); - - $v->print( 'The command-line options are:' ); - - $s = " options:"; - $s .= " '" . $_ . "'" for ( @ARGV ); - $v->print( $s ); - - $s = " file names:"; - $s .= " '" . $_ . "'\n" for ( @files ); - $v->print( $s ); -} # end install_verbose() - - -#---------- -# second run of command-line arguments -#---------- -sub run_second { - # Second run of args with new @ARGV from the former splitting. - # Arguments are now splitted and transformed into special long options. - - my $double_minus = FALSE; - my $has_arg = FALSE; - - ARGS: for my $arg ( @ARGV ) { - - # ignore '--', file names are handled later on - last ARGS if ( $arg eq '--' ); - - if ( $has_arg ) { - unless ( exists $opts_with_arg{$has_arg} ) { - $stderr->print( "'\%opts_with_args' does not have key '" . - $has_arg . "'." ); - next ARGS; - } - - $opts_with_arg{$has_arg}->($arg); - $has_arg = FALSE; - next ARGS; - } # end of $has_arg - - if ( exists $opts_with_arg{$arg} ) { - $has_arg = $arg; - next ARGS; - } - - if ( exists $opts_noarg{$arg} ) { - $opts_noarg{$arg}->(); - next ARGS; - } - - # not a suitable option - $stderr->print( "Wrong option '" . $arg . "'." ); - next ARGS; - - } # end of for ARGS: - - - if ( $has_arg ) { # after last argument - die "Option '$has_arg' needs an argument."; - } - - }; # end of second run - - -sub handle_args { - # handling the output of args - - if ( $Args->{'output'} ) { # '--output' was set in the arguments - my $out_path = &path2abs($Args->{'output'}); - die "Output file name $Args->{'output'} cannot be used." - unless ( $out_path ); - - my ( $file, $dir ); - ( $file, $dir ) = File::Basename::fileparse($out_path) - or die "Could not handle output file path '" . $out_path . "': " . - "directory name '" . $dir . "' and file name '" . $file . "'."; - - die "Could not find output directory for '" . $Args->{'output'} . "'" - unless ( $dir ); - die "Could not find output file: '" . $Args->{'output'} . - "'" unless ( $file ); - - if ( -d $dir ) { - die "Could not write to output directory '" . $dir . "'." - unless ( -w $dir ); - } else { - $dir = &make_dir($dir); - die "Could not create output directory in: '" . $out_path . "'." - unless ( $dir ); - } - - # now $dir is a writable directory - - if ( -e $out_path ) { - die "Could not write to output file '" . $out_path . "'." - unless ( -w $out_path ); - } - - $out = new FH_FILE( $out_path ); - $v->print( "Output goes to file '" . $out_path . "'." ); - } else { # '--output' was not set - $out = new FH_STDOUT(); - } - # no $out is the right behavior for standard output - -# $Args->{'prefix'} .= '_' . $Args->{'eps_func'} . '2eps'; - - @ARGV = @files; -} - - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/glilypond/examples/example.groff b/contrib/glilypond/examples/example.groff index 59d53f6..856474e 100644 --- a/contrib/glilypond/examples/example.groff +++ b/contrib/glilypond/examples/example.groff @@ -5,14 +5,9 @@ .ig glilypond - integrate 'lilypond' parts into 'groff' files -Source file position: /contrib/glilypond.man -Installed position: /share/man/man1/glilypond.1 - This file was written by Bernd Warken . . -Copyright (C) 2013-2018 Free Software Foundation, Inc. - -Last update: 10 Sep 2015 +Copyright (C) 2013-2020 Free Software Foundation, Inc. This file is part of glilypond, which is part of GNU groff, a free software project. diff --git a/contrib/glilypond/glilypond.1.man b/contrib/glilypond/glilypond.1.man index 2a02689..a81174e 100644 --- a/contrib/glilypond/glilypond.1.man +++ b/contrib/glilypond/glilypond.1.man @@ -1,18 +1,17 @@ .TH glilypond @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -glilypond \- integrate lilypond parts into groff +.SH Name +glilypond \- embed LilyPond musical notation in +.I groff +documents . -.\" glilypond - integrate 'lilypond' parts into 'groff' files -.\" Source file position: /contrib/glilypond.man -.\" Installed position: /share/man/man1/glilypond.1 . -.\" TODO: This page needs a thorough edit by a native English speaker. +.\" TODO: This page needs a thorough edit by a fluent English speaker. . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2013-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2013-2020 Free Software Foundation, Inc. .\" .\" This file is part of glilypond, which is part of GNU groff, a free .\" software project. @@ -25,25 +24,35 @@ glilypond \- integrate lilypond parts into groff .\" . . . -.\" ==================================================================== -.\" Characters -.\" ==================================================================== +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_glilypond_1_man_C \n[.cp] +.cp 0 . -.\" Ellipsis ... -.ie t .ds EL \fS\N'188'\fP\" -.el .ds EL \&.\|.\|.\&\" -.\" called with \*(EL +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback . . .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY glilypond +.RB [ \-k ] .RB [{ \-\-ly2eps | \-\-pdf2eps }] .RB [ \-e .IR directory ] -.OP \-k .RB [ \-o .IR output-file ] .RB [ \-p @@ -51,28 +60,27 @@ glilypond \- integrate lilypond parts into groff .RB [ \-t .IR tdir ] .RB [{ \-v | \-V }] -.OP \- -.OP \-\- -.RI [ filespec -\*(EL] +.RB [ \-\- ] +.RI [ file\~ .\|.\|.] +. +. .SY glilypond .RB [{ \-\-ly2eps | \-\-pdf2eps }] .RB [ \-\-eps_dir .IR directory ] -.OP \-\-keep_all +.RB [ \-\-keep_all ] .RB [ \-\-output .IR output-file ] .RB [ \-\-prefix .IR filename-prefix ] .RB [ \-\-temp_dir .IR tdir ] -.OP \-\-verbose -.OP \- -.OP \-\- -.RI [ filespec -\*(EL] +.RB [ \-\-verbose ] +.RB [ \-\- ] +.RI [ file\~ .\|.\|.] .YS . +. .SY glilypond .B \-? .SY glilypond @@ -83,177 +91,122 @@ glilypond \- integrate lilypond parts into groff .B \-\-usage .YS . +. .SY glilypond .B \-l .SY glilypond .B \-\-license .YS . +. .SY glilypond .B \-\-version .YS . +. .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . -.B glilypond -transforms sheet music written in the -.I lilypond -language into the -.BR groff (@MAN7EXT@) -language using the -.B .PSPIC -request, such that -.BR groff (@MAN1EXT@) -can transform it into a format that can be displayed directly. -. -.B .PDFPIC -is available, but does on yet work with lilypond. +.I glilypond +is a +.MR groff @MAN7EXT@ +preprocessor that enables the embedding of LilyPond music scores in +.I groff +documents. +.\". +.\".B .PDFPIC +.\"is available, but does not yet work with lilypond. . +If no operands are given, +or if +.I file +is +.RB \[lq] \- \[rq], +.I glilypond +reads the standard input stream. . -.P -Files in -.I groff -language and -.I "standard input" -can be provided as arguments. +A double-dash argument +.RB (\[lq] \-\- \[rq]) +causes all subsequent arguments to be interpreted as +.I file +operands, +even if their names start with a dash. . . .\" ==================================================================== -.SH "WORKING GLILYPOND" +.SH Usage .\" ==================================================================== . -Together with -.BR .PSPIC , -.B glilypond can work only for -.I troff -devices without -.I PDF +At present, +.I glilypond +works with the +.I groff +.BR ps , +.BR dvi , +.BR html , and -.I X +.B xhtml devices. . -. -.P -I.e., the following -.B groff -devices work, -.BR \-Tps , -.BR \-Tdvi , -.BR \-Thtml , -and -.BR \-Txhtml . -. -. -.P -I'm not sure about the -.B ldp +The +.B lbp and .B lj4 -devices. +devices are untested. . -. -.P -In -.BR groffer , -it is easier to use the following device options, either -. -.BR \-\-ps , -.BR \-\-div , -.BR \-\-html , -or -.BR \-\-xhtml . -. -. -.P -Unfortunately, the -.B groff -option -.B \-Tpdf -does not work and the -.B groffer -default -.I PDF -works neither. -. -. -.P -But -.B groffer -has an additional -.IR "pdf mode" , -not available in -.BR groff . -. -It is based on the -.I ps mode -in -.B groff -and is called through -.B groffer \-\-pdf2 -.IR roff-file-with-lilypond . +Unfortunately, +the +.B pdf +device does not yet work. . . .\" ==================================================================== -.SH "OPTION OVERVIEW" +.SH "Option overview" .\" ==================================================================== . -.\" ==================================================================== -.SS "Breaking Options" -.\" ==================================================================== . -.nh -.nf .TP .BR \-? | \-h | \-\-help | \-\-usage -Print help or usage information, then leave the program. +Display usage information and exit. . .TP .B \-\-version -Print version information. +Display version information and exit. . .TP .BR \-l | \-\-license -Print license information. -.fi -.hy +Display copyright license information and exit. . . .\" ==================================================================== -.SS "Options for building EPS Files" +.SS "Options for building EPS files" .\" ==================================================================== . .TP -.OP \-\-ly2eps -Here the -.B lilypond -program creates -.I eps -files directly. +.B \-\-ly2eps +Direct +.MR lilypond 1 +to create Encapsulated PostScript (EPS) files. . This is the default. . . .TP -.OP \-\-pdf2eps +.B \-\-pdf2eps The program -.B glilypond -generates a -.I PDF -file using -.BR lilypond . +.I glilypond +generates a PDF file using +.IR lilypond . . -Then the -.I eps -file is generated by -.B pdf2ps +Then the EPS file is generated by +.I pdf2ps and -.BR ps2eps R . +.IR ps2eps . . . .\" ==================================================================== -.SS "Directories and Files" +.SS "Directories and files" .\" ==================================================================== . .TP @@ -262,7 +215,9 @@ Normally all .I EPS files are sent to the temporary directory. . -With this option, you can generate your own directory, in which all useful +With this option, +you can generate your own directory, +in which all useful .I EPS files are send. . @@ -272,7 +227,7 @@ So at last, the temporary directory can be removed. .TP .BR \-p | \-\-prefix "\fI begin_of_name\fP" Normally all temporary files get names that start with the -.BI ly \*(EL +.BI ly .\|.\|.\& prefix. . With this option, you can freely change this prefix. @@ -285,7 +240,7 @@ Normally all temporary files without the files are deleted. . With this option, all generated files either by the -.B lilypond +.I lilypond program or other format transposers are kept. . . @@ -305,7 +260,7 @@ In this temporary directory, the temporary files are stored. . . .\" ==================================================================== -.SS "Output" +.SS Output .\" ==================================================================== . .TP @@ -326,7 +281,7 @@ A lot more of information is sent to STDERR. . . .\" ==================================================================== -.SS "Short Option Collections" +.SS "Short option collections" .\" ==================================================================== . The argument handling of options @@ -381,7 +336,7 @@ So this argument could also be written as several arguments . . .\" ==================================================================== -.SS "Handling of Long Options" +.SS "Handling of long options" .\" ==================================================================== . Arguments that start with a double dash @@ -476,62 +431,14 @@ or even as an abbreviation like .BR \-\-KeE . . . +.br +.ne 6v .\" ==================================================================== -.SH FILESPEC ARGUMENTS -.\" ==================================================================== -. -An argument that is not an option or an option argument is called a -.I filespec -argument. -. -. -.P -Without any -.I filespec -argument, -.I "standard input" -is read. -. -. -.P -Each -.I filespec -argument must either be the name of a readable file or a dash -.B \- -for -.IR "standard input" . -. -Each input must be written in the -.I roff -or -.I groff -language and can include -.I lilypond -parts. -. -. -.P -Normally arguments starting with a dash -.B \- -are interpreted as an option. -. -But if you use an argument that consists only of a doubled dash -.B \-\- R , -all following arguments are taken as -.I filespec -argument, even if such an argument starts with a dash. -. -This is handled according to the -.I GNU -standard. -. -. -.\" ==================================================================== -.SH "THE LILYPOND PARTS IN ROFF INPUT" +.SH "LilyPond regions in \f[I]roff\f[] input" .\" ==================================================================== . .\" ==================================================================== -.SS "Integrated Lilypond Codes" +.SS "Integrated LilyPond code" .\" ==================================================================== . A @@ -551,8 +458,6 @@ and .EE .RE . -. -.P A .I groff input can have several of these @@ -587,7 +492,7 @@ files. . . .\" ==================================================================== -.SS "Inclusion of ly-Files" +.SS "Inclusion of \f[I].ly\f[] files" .\" ==================================================================== . An additional command line for file inclusion of @@ -640,7 +545,7 @@ files. . . .\" ==================================================================== -.SH "GENERATED FILES" +.SH "Generated files" .\" ==================================================================== . By the transformation process of @@ -658,7 +563,7 @@ This process can be changed by command-line options. . . .\" ==================================================================== -.SS "Command Line Options for Directories" +.SS "Command-line options for directories" .\" ==================================================================== . The temporary directory for this program is either created @@ -685,9 +590,10 @@ the end of the program. . .P The beginning of the names of the temporary files can be set by the -command-line option -.OP \-p | \-\-prefix -.IR begin_of_name . +command-line options +.B \-p +or +.BR \-\-prefix . . . .P @@ -695,8 +601,10 @@ All of the temporary files except the .I EPS files are deleted finally. . -This can be changed by setting the command-line option -.OP \-k | \-\-keep_files . +This can be changed by setting the command-line options +.B \-k +or +.BR \-\-keep_files . . With this, all temporary files and directories are kept, not deleted. . @@ -713,7 +621,7 @@ are needed for the display which can take a long time. . . .\" ==================================================================== -.SH "TRANSFORMATION PROCESSES FOR GENERATING EPS FILES" +.SH "Transformation processes for generating EPS files" .\" ==================================================================== . .\" ==================================================================== @@ -728,7 +636,7 @@ This mode is the actual default and can also be chosen by the option In this mode, the .B .ly files are transformed by the -.BR lilypond (1) +.MR lilypond 1 program into .I PDF files, using @@ -759,11 +667,14 @@ files into a file. . This is done by the -.BR pdf2ps (1) +.MR pdf2ps 1 program using .RS .EX -\fR$ \fP \fBpdf2ps\fP \fIfile-name\fP \fB.pdf\fP \fIfile-name\fP \fB.ps\fP +$\~\c +.B pdf2ps\~\c +.IB file-name .pdf\~\c +.IB file-name .pds .EE .RE . @@ -775,7 +686,7 @@ file from the file. . This is done by the -.BR ps2eps (1) +.MR ps2eps 1 program using .RS .EX @@ -814,10 +725,10 @@ command In earlier time, this mode was the default. . But now it does not work any more, so accept the new default -.BR pdf2eps . +.IR pdf2eps . . For testing, this mode can also be chosen by the -.B glilypond +.I glilypond option .BR \-\-ly2eps . . @@ -826,13 +737,15 @@ option In this mode, the .B .ly files are transformed by the -.B lilypond +.I lilypond program into many files of different formats, including .I eps files, using .RS .EX -.BI "$ lilypond \-\-ps \-dbackend=eps \-dgs\-load\-fonts \-\-output=" file\-name +$\~\c +.B lilypond \-\-ps \-dbackend=eps \-dgs\-load\-fonts \-\-output=\c +.I file-name .EE .RE for each @@ -878,21 +791,19 @@ commands . . .\" ==================================================================== -.SH "THE GENERATED NEW ROFF STRUCTURE" +.SH "Generated \f[I]groff\f[] output" .\" ==================================================================== . The new -.BR groff (@MAN7EXT@) +.MR groff @MAN7EXT@ structure generated by -.B glilypond +.I glilypond is either . .TP 1) sent to standard output and can there be saved into a file or piped into -.BR groff (@MAN1EXT@) -or -.BR groffer (@MAN1EXT@) +.MR groff @MAN1EXT@ or . .TP @@ -903,21 +814,22 @@ stored into a file by given the option . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== -.B glilypond +. +.I glilypond was written by -.MT groff\-bernd.warken\-72@\:web.de +.MT groff\-bernd\:.warken\-72@\:web\:.de Bernd Warken .ME . . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . .TP -.BR groff (@MAN1EXT@) +.MR groff @MAN1EXT@ describes the usage of the .I groff command and contains pointers to further documentation of the @@ -926,21 +838,21 @@ system. . . .TP -.BR groff_tmac (@MAN5EXT@) +.MR groff_tmac @MAN5EXT@ describes the .B .PSPIC request. . . .TP -.BR lilypond (1) +.MR lilypond 1 briefly describes the -.B lilypond +.I lilypond command and contains pointers to further documentation. . . .TP -.BR pdf2ps (1) +.MR pdf2ps 1 transforms a .I PDF file into a @@ -949,7 +861,7 @@ format. . . .TP -.BR ps2eps (1) +.MR ps2eps 1 transforms a .I PS file into an @@ -957,11 +869,13 @@ file into an format. . . -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_glilypond_1_man_C] +.do rr *groff_glilypond_1_man_C +. . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/glilypond/glilypond.am b/contrib/glilypond/glilypond.am index 4dd88fe..d18049f 100644 --- a/contrib/glilypond/glilypond.am +++ b/contrib/glilypond/glilypond.am @@ -1,14 +1,10 @@ # Automake rules for 'glilypond' -# File position: /contrib/lilypond/glilypond.am - -# Copyright (C) 2013-2018 Free Software Foundation, Inc. +# Copyright (C) 2013-2020 Free Software Foundation, Inc. # Written by Werner Lemberg and # Bernd Warken . # Automake migration by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'glilypond' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -32,10 +28,6 @@ man1_MANS += contrib/glilypond/glilypond.1 # files going to lib directory '$(glilypond_dir)' # TODO glilypond_dir is subsitued by configure.ac, check if this could be removed glilyponddir = $(glilypond_dir) -dist_glilypond_DATA = \ - contrib/glilypond/subs.pl \ - contrib/glilypond/oop_fh.pl \ - contrib/glilypond/args.pl EXTRA_DIST += \ contrib/glilypond/ChangeLog \ @@ -47,7 +39,7 @@ EXTRA_DIST += \ # create perl executable 'glilypond', being stored into 'bindir' -glilypond: $(glilypond_srcdir)/glilypond.pl shdeps.sed +glilypond: $(glilypond_srcdir)/glilypond.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)$(RM) $@ \ && sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ @@ -65,12 +57,8 @@ uninstall-glilypond-hook: fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/glilypond/glilypond.pl b/contrib/glilypond/glilypond.pl index 868801b..e97ed24 100755 --- a/contrib/glilypond/glilypond.pl +++ b/contrib/glilypond/glilypond.pl @@ -24,25 +24,20 @@ use Data::Dumper; our $Legalese; { - use constant VERSION => 'v1.3.1'; # version of glilypond + use constant VERSION => '1.3.2'; # version of glilypond -### This constant 'LICENSE' is the license for this file 'GPL' >= 2 +### This constant 'LICENSE' is the license for this file 'GPL' >= 3 use constant LICENSE => q* glilypond - integrate 'lilypond' into 'groff' files -Source file position: '/contrib/glilypond/glilypond.pl' -Installed position: '/bin/glilypond' - -Copyright (C) 2013-2018 Free Software Foundation, Inc. +Copyright (C) 2013-2020 Free Software Foundation, Inc. Written by Bernd Warken -Last update: 10 Sep 2015 - This file is part of 'GNU groff'. 'GNU groff' is free software: you can redistribute it and/or modify it under the terms of the 'GNU General Public License' as published by the -'Free Software Foundation', either version 2 of the License, or (at your +'Free Software Foundation', either version 3 of the License, or (at your option) any later version. 'GNU groff' is distributed in the hope that it will be useful, but @@ -139,7 +134,424 @@ BEGIN { umask 0077; # octal output: 'printf "%03o", umask;' } - require 'subs.pl'; + use integer; + use utf8; + use feature 'state'; + + my $P_PIC; + # $P_PIC = '.PDFPIC'; + $P_PIC = '.PSPIC'; + + ###################################################################### + # subs for using several times + ###################################################################### + + sub create_ly2eps { # '--ly2eps' default + our ( $out, $Read, $Temp ); + + my $prefix = $Read->{'file_numbered'}; # w/ dir change to temp dir + + # '$ lilypond --ps -dbackend=eps -dgs-load-fonts \ + # output=file_without_extension file.ly' + # extensions are added automatically + my $opts = '--ps -dbackend=eps -dinclude-eps-fonts -dgs-load-fonts' + . " --output=$prefix $prefix"; + &run_lilypond("$opts"); + + Cwd::chdir $Temp->{'cwd'} or + die "Could not change to former directory '" . + $Temp->{'cwd'} . "': $!"; + + my $eps_dir = $Temp->{'eps_dir'}; + my $dir = $Temp->{'temp_dir'}; + opendir( my $dh, $dir ) or + die "could not open temporary directory '$dir': $!"; + + my $re = qr< + ^ + $prefix + - + .* + \.eps + $ + >x; + my $file; + while ( readdir( $dh ) ) { + chomp; + $file = $_; + if ( /$re/ ) { + my $file_path = File::Spec->catfile($dir, $file); + if ( $eps_dir ) { + my $could_copy = FALSE; + File::Copy::copy($file_path, $eps_dir) + and $could_copy = TRUE; + if ( $could_copy ) { + unlink $file_path; + $file_path = File::Spec->catfile($eps_dir, $_); + } + } + $out->print( $P_PIC . ' ' . $file_path ); + } + } # end while readdir + closedir( $dh ); + } # end sub create_ly2eps() + + + sub create_pdf2eps { # '--pdf2eps' + our ( $v, $stdout, $stderr, $out, $Read, $Temp ); + + my $prefix = $Read->{'file_numbered'}; # w/ dir change to temp dir + + &run_lilypond("--pdf --output=$prefix $prefix"); + + my $file_pdf = $prefix . '.pdf'; + my $file_ps = $prefix . '.ps'; + + # pdf2ps in temp dir + my $temp_file = &next_temp_file; + $v->print( "\n##### run of 'pdf2ps'" ); + # '$ pdf2ps file.pdf file.ps' + my $output = `pdf2ps $file_pdf $file_ps 2> $temp_file`; + die 'Program pdf2ps does not work.' if ( $? ); + &shell_handling($output, $temp_file); + $v->print( "##### end run of 'pdf2ps'\n" ); + + # ps2eps in temp dir + $temp_file = &next_temp_file; + $v->print( "\n##### run of 'ps2eps'" ); + # '$ ps2eps file.ps' + $output = `ps2eps $file_ps 2> $temp_file`; + die 'Program ps2eps does not work.' if ( $? ); + &shell_handling($output, $temp_file); + $v->print( "##### end run of 'ps2eps'\n" ); + + # change back to former dir + Cwd::chdir $Temp->{'cwd'} or + die "Could not change to former directory '" . + $Temp->{'cwd'} . "': $!"; + + # handling of .eps file + my $file_eps = $prefix . '.eps'; + my $eps_path = File::Spec->catfile($Temp->{'temp_dir'}, $file_eps); + if ( $Temp->{'eps_dir'} ) { + my $has_copied = FALSE; + File::Copy::copy( $eps_path, $Temp->{'eps_dir'} ) + and $has_copied = TRUE; + if ( $has_copied ) { + unlink $eps_path; + $eps_path = File::Spec->catfile( $Temp->{'eps_dir'}, $file_eps ); + } else { + $stderr->print( "Could not use EPS-directory." ); + } # end Temp->{'eps_dir'} + } + # print into groff output + $out->print( $P_PIC . ' ' . $eps_path ); + } # end sub create_pdf2eps() + + + sub is_subdir { # arg1 is subdir of arg2 (is longer) + my ( $dir1, $dir2 ) = @_; + $dir1 = &path2abs( $dir1 );; + $dir2 = &path2abs( $dir2 );; + my @split1 = File::Spec->splitdir($dir1); + my @split2 = File::Spec->splitdir($dir2); + for ( @split2 ) { + next if ( $_ eq shift @split1 ); + return FALSE; + } + return TRUE; + } + + + sub license { + our ( $Legalese, $stdout ); + &version; + $stdout->print( $Legalese->{'license'} ); + } # end sub license() + + + sub make_dir { # make directory or check if it exists + our ( $v, $Args ); + + my $dir_arg = shift; + chomp $dir_arg; + $dir_arg =~ s/^\s*(.*)\s*$/$1/; + + unless ( $dir_arg ) { + $v->print( "make_dir(): empty argument" ); + return FALSE; + } + + unless ( File::Spec->file_name_is_absolute($dir_arg) ) { + my $res = Cwd::realpath($dir_arg); + $res = File::Spec->canonpath($dir_arg) unless ( $res ); + $dir_arg = $res if ( $res ); + } + + return $dir_arg if ( -d $dir_arg && -w $dir_arg ); + + + # search thru the dir parts + my @dir_parts = File::Spec->splitdir($dir_arg); + my @dir_grow; + my $dir_grow; + my $can_create = FALSE; # dir could be created if TRUE + + DIRPARTS: for ( @dir_parts ) { + push @dir_grow, $_; + next DIRPARTS unless ( $_ ); # empty string for root directory + + # from array to path dir string + $dir_grow = File::Spec->catdir(@dir_grow); + + next DIRPARTS if ( -d $dir_grow ); + + if ( -e $dir_grow ) { # exists, but not a dir, so must be removed + die "Couldn't create dir '$dir_arg', it is blocked by " + . "'$dir_grow'." unless ( -w $dir_grow ); + + # now it's writable, but not a dir, so it can be removed + unlink ( $dir_grow ) or + die "Couldn't remove '$dir_grow', " . + "so I cannot create dir '$dir_arg': $!"; + } + + # $dir_grow no longer exists, so the former dir must be writable + # in order to create the directory + pop @dir_grow; + $dir_grow = File::Spec->catdir(@dir_grow); + + die "'$dir_grow' is not writable, " . + "so directory '$dir_arg' can't be created." + unless ( -w $dir_grow ); + + # former directory is writable, so '$dir_arg' can be created + + File::Path::make_path( $dir_arg, + { + mask => oct('0700'), + verbose => $Args->{'verbose'}, + } + ) # 'mkdir -P' + or die "Could not create directory '$dir_arg': $!"; + + last DIRPARTS; + } + + die "'$dir_arg' is not a writable directory" + unless ( -d $dir_arg && -w $dir_arg ); + + return $dir_arg; + + } # end sub make_dir() + + + my $number = 0; + sub next_temp_file { + our ( $Temp, $v, $Args ); + ++$number; + my $temp_basename = $Args->{'prefix'} . '_temp_' . $number; + my $temp_file = File::Spec->catfile( $Temp->{'temp_dir'} , + $temp_basename ); + $v->print( "next temporary file: '$temp_file'" ); + return $temp_file; + } # end sub next_temp_file() + + + sub path2abs { + our ( $Temp, $Args ); + + my $path = shift; + $path =~ s/ + ^ + \s* + ( + .* + ) + \s* + $ + /$1/x; + + die "path2abs(): argument is empty." unless ( $path ); + + # Perl does not support shell '~' for home dir + if ( $path =~ / + ^ + ~ + /x ) { + if ( $path eq '~' ) { # only own home + $path = File::HomeDir->my_home; + } elsif ( $path =~ m< + ^ + ~ / + ( + .* + ) + $ + >x ) { # subdir of own home + $path = File::Spec->catdir( $Temp->{'cwd'}, $1 ); + } elsif ( $path =~ m< + ^ + ~ + ( + [^/]+ + ) + $ + >x ) { # home of other user + $path = File::HomeDir->users_home($1); + } elsif ( $path =~ m< + ^ + ~ + ( + [^/]+ + ) + /+ + ( + .* + ) + $ + >x ) { # subdir of other home + $path = File::Spec-> + catdir( File::HomeDir->users_home($1), $2 ); + } + } + + $path = File::Spec->rel2abs($path); + + # now $path is absolute + return $path; + } # end sub path2abs() + + + sub run_lilypond { + # arg is the options collection for 'lilypond' to run + # either from ly or pdf + + our ( $Temp, $v ); + + my $opts = shift; + chomp $opts; + + my $temp_file = &next_temp_file; + my $output = EMPTYSTRING; + + # change to temp dir + Cwd::chdir $Temp->{'temp_dir'} or + die "Could not change to temporary directory '" . + $Temp->{'temp_dir'} . "': $!"; + + $v->print( "\n##### run of 'lilypond " . $opts . "'" ); + $output = `lilypond $opts 2>$temp_file`; + die "Program lilypond does not work, see '$temp_file': $?" + if ( $? ); + chomp $output; + &shell_handling($output, $temp_file); + $v->print( "##### end run of 'lilypond'\n" ); + + # stay in temp dir + } # end sub run_lilypond() + + + sub shell_handling { + # Handle ``-shell-command output in a string (arg1). + # stderr goes to temporary file $TempFile. + + our ( $out, $v, $Args ); + + my $out_string = shift; + my $temp_file = shift; + + my $a = &string2array($out_string); # array ref + for ( @$a ) { + $out->print( $_ ); + } + + $temp_file && -f $temp_file && -r $temp_file || + die "shell_handling(): $temp_file is not a readable file."; + my $temp = new FH_READ_FILE($temp_file); + my $res = $temp->read_all(); + for ( @$res ) { + chomp; + $v->print($_); + } + + unlink $temp_file unless ( $Args->{'keep_all'} ); + } # end sub shell_handling() + + + sub string2array { + my $s = shift; + my @a = (); + for ( split "\n", $s ) { + chomp; + push @a, $_; + } + return \@a; + } # end string2array() + + + sub usage { # for '--help' + our ( $Globals, $Args ); + + my $p = $Globals->{'prog'}; + my $usage = EMPTYSTRING; + $usage = '###### usage:' . "\n" if ( $Args->{'verbose'} ); + $usage .= qq*Options for $p: +Read a 'roff' file or standard input and transform 'lilypond' parts +(everything between '.lilypond start' and '.lilypond end') into +'EPS'-files that can be read by groff using '.PSPIC'. + +There is also a command '.lilypond include ' that can +include a complete 'lilypond' file into the 'groff' document. + + +# Breaking options: +$p -?|-h|--help|--usage # usage +$p --version # version information +$p --license # the license is GPL >= 3 + + +# Normal options: +$p [options] [--] [filename ...] + +There are 2 options for influencing the way how the 'EPS' files for the +'roff' display are generated: +--ly2eps 'lilypond' generates 'EPS' files directly (default) +--pdf2eps 'lilypond' generates a 'PDF' file that is transformed + +-k|--keep_all do not delete any temporary files +-v|--verbose print much information to STDERR + +Options with an argument: +-e|--eps_dir=... use a directory for the EPS files +-o|--output=... sent output in the groff language into file ... +-p|--prefix=... start for the names of temporary files +-t|--temp_dir=... provide the directory for temporary files. + +The directories set are created when they do not exist. +*; + + # old options: + # --keep_files -k: do not delete any temporary files + # --file_prefix=... -p: start for the names of temporary files + + $main::stdout->print( $usage ); + } # end sub usage() + + + sub version { # for '--version' + our ( $Globals, $Legalese, $stdout, $Args ); + my $groff_version = ''; + if ( $Globals->{'groff_version'} ) { + $groff_version = "(groff $Globals->{'groff_version'}) "; + } + + my $output = EMPTYSTRING; + $output = "$Globals->{'prog'} ${groff_version}version " + . $Legalese->{'version'}; + + $stdout->print($output); + } # end sub version() } #die "test: "; @@ -147,12 +559,274 @@ BEGIN { # OOP declarations for some file handles ######################################################################## -require 'oop_fh.pl'; +use integer; + +######################################################################## +# OOP for writing file handles that are open by default, like STD* +######################################################################## + +# -------------------------- _FH_WRITE_OPENED -------------------------- + +{ # FH_OPENED: base class for all opened file handles, like $TD* + + package _FH_WRITE_OPENED; + use strict; + + sub new { + my ( $pkg, $std ) = @_; + bless { + 'fh' => $std, + } + } + + sub open { + } + + sub close { + } + + sub print { + my $self = shift; + for ( @_ ) { + print { $self->{'fh'} } $_; + } + } + +} + + +# ------------------------------ FH_STDOUT ---------------------------- + +{ # FH_STDOUT: print to normal output STDOUT + + package FH_STDOUT; + use strict; + @FH_STDOUT::ISA = qw( _FH_WRITE_OPENED ); + + sub new { + &_FH_WRITE_OPENED::new( '_FH_WRITE_OPENED', *STDOUT ); + } + +} # end FH_STDOUT + + +# ------------------------------ FH_STDERR ----------------------------- + +{ # FH_STDERR: print to STDERR + + package FH_STDERR; + use strict; + @FH_STDERR::ISA = qw( _FH_WRITE_OPENED ); + + sub new { + &_FH_WRITE_OPENED::new( 'FH_OPENED', *STDERR ); + } + +} # end FH_STDERR + + +######################################################################## +# OOP for file handles that write into a file or string +######################################################################## + +# ------------------------------- FH_FILE ------------------------------ + +{ # FH_FILE: base class for writing into a file or string + + package FH_FILE; + use strict; + + sub new { + my ( $pkg, $file ) = @_; + bless { + 'fh' => undef, + 'file' => $file, + 'opened' => main::FALSE, + } + } + + sub DESTROY { + my $self = shift; + $self->close(); + } + + sub open { + my $self = shift; + my $file = $self->{'file'}; + if ( $file && -e $file ) { + die "file $file is not writable" unless ( -w $file ); + die "$file is a directory" if ( -d $file ); + } + open $self->{'fh'}, ">", $self->{'file'} + or die "could not open file '$file' for writing: $!"; + $self->{'opened'} = main::TRUE; + } + + sub close { + my $self = shift; + close $self->{'fh'} if ( $self->{'opened'} ); + $self->{'opened'} = main::FALSE; + } + + sub print { + my $self = shift; + $self->open() unless ( $self->{'opened'} ); + for ( @_ ) { + print { $self->{'fh'} } $_; + } + } + +} # end FH_FILE + + +# ------------------------------ FH_STRING ----------------------------- + +{ # FH_STRING: write into a string + + package FH_STRING; # write to \string + use strict; + @FH_STRING::ISA = qw( FH_FILE ); + + sub new { + my $pkg = shift; # string is a reference to scalar + bless + { + 'fh' => undef, + 'string' => '', + 'opened' => main::FALSE, + } + } + + sub open { + my $self = shift; + open $self->{'fh'}, ">", \ $self->{'string'} + or die "could not open string for writing: $!"; + $self->{'opened'} = main::TRUE; + } + + sub get { # get string, move to array ref, close, and return array ref + my $self = shift; + return '' unless ( $self->{'opened'} ); + my $a = &string2array( $self->{'string'} ); + $self->close(); + return $a; + } + +} # end FH_STRING + + +# -------------------------------- FH_NULL ----------------------------- + +{ # FH_NULL: write to null device + + package FH_NULL; + use strict; + @FH_NULL::ISA = qw( FH_FILE FH_STRING ); + + use File::Spec; + + my $devnull = File::Spec->devnull(); + $devnull = '' unless ( -e $devnull && -w $devnull ); + + sub new { + my $pkg = shift; + if ( $devnull ) { + &FH_FILE::new( $pkg, $devnull ); + } else { + &FH_STRING::new( $pkg ); + } + } # end new() + +} # end FH_NULL + + +######################################################################## +# OOP for reading file handles +######################################################################## + +# ---------------------------- FH_READ_FILE ---------------------------- + +{ # FH_READ_FILE: read a file + + package FH_READ_FILE; + use strict; + + sub new { + my ( $pkg, $file ) = @_; + die "File '$file' cannot be read." unless ( -f $file && -r $file ); + bless { + 'fh' => undef, + 'file' => $file, + 'opened' => main::FALSE, + } + } + + sub DESTROY { + my $self = shift; + $self->close(); + } + + sub open { + my $self = shift; + my $file = $self->{'file'}; + if ( $file && -e $file ) { + die "file $file is not writable" unless ( -r $file ); + die "$file is a directory" if ( -d $file ); + } + open $self->{'fh'}, "<", $self->{'file'} + or die "could not read file '$file': $!"; + $self->{'opened'} = main::TRUE; + } + + sub close { + my $self = shift; + close $self->{'fh'} if ( $self->{'opened'} ); + $self->{'opened'} = main::FALSE; + } + + sub read_line { + # Read 1 line of the file into a chomped string. + # Do not close the read handle at the end. + my $self = shift; + $self->open() unless ( $self->{'opened'} ); + + my $res; + if ( defined($res = CORE::readline($self->{'fh'}) ) ) { + chomp $res; + return $res; + } else { + $self->close(); + return undef; + } + } + + sub read_all { + # Read the complete file into an array reference. + # Close the read handle at the end. + # Return array reference. + my $self = shift; + $self->open() unless ( $self->{'opened'} ); + + my $res = []; + my $line; + while ( defined ( $line = CORE::readline $self->{'fh'} ) ) { + chomp $line; + push @$res, $line; + } + $self->close(); + $self->{'opened'} = main::FALSE; + return $res; + } + +} + +# end of OOP definitions + our $stdout = new FH_STDOUT(); our $stderr = new FH_STDERR(); -# verbose printing, not clear wether this will be set by '--verbose', +# verbose printing, not clear whether this will be set by '--verbose', # so store this now into a string, which can be gotten later on, when # it will become either STDERR or /dev/null our $v = new FH_STRING(); @@ -199,7 +873,468 @@ our $Args = }; { # 'Args' - require 'args.pl'; + use integer; + + our ( $Globals, $Args, $stderr, $v, $out ); + + # ---------- + # subs for second run, for remaining long options after splitting and + # transfer + # ---------- + + my %opts_with_arg = + ( + + '--eps_dir' => sub { + $Args->{'eps_dir'} = shift; + }, + + '--output' => sub { + $Args->{'output'} = shift; + }, + + '--prefix' => sub { + $Args->{'prefix'} = shift; + }, + + '--temp_dir' => sub { + $Args->{'temp_dir'} = shift; + }, + + ); # end of %opts_with_arg + + + my %opts_noarg = + ( + + '--help' => sub { + &usage; + exit; + }, + + '--keep_all' => sub { + $Args->{'keep_all'} = TRUE; + }, + + '--license' => sub { + &license; + exit; + }, + + '--ly2eps' => sub { + $Args->{'eps_func'} = 'ly'; + }, + + '--pdf2eps' => sub { + $Args->{'eps_func'} = 'pdf'; + }, + + '--verbose' => sub { + $Args->{'verbose'} = TRUE; + }, + + '--version' => sub { + &version; + exit; + }, + + ); # end of %opts_noarg + + + # used variables in both runs + + my @files = EMPTYARRAY; + + + #---------- + # first run for command-line arguments + #---------- + + # global variables for first run + + my @splitted_args; + my $double_minus = FALSE; + my $arg = EMPTYSTRING; + my $has_arg = FALSE; + + + # Split short option collections and transfer these to suitable long + # options from above. Note that '-v' now means '--verbose' in version + # 'v1.1', earlier versions had '--version' for '-v'. + + my %short_opts = + ( + '?' => '--help', + 'e' => '--eps_dir', + 'h' => '--help', + 'l' => '--license', + 'k' => '--keep_all', + 'o' => '--output', + 'p' => '--prefix', + 't' => '--temp_dir', + 'v' => '--verbose', + 'V' => '--verbose', + ); + + + # transfer long option abbreviations to the long options from above + + my @long_opts; + + $long_opts[3] = + { # option abbreviations of 3 characters + '--e' => '--eps_dir', + '--f' => '--prefix', # --f for --file_prefix + '--h' => '--help', + '--k' => '--keep_all', # and --keep_files + '--o' => '--output', + '--p' => '--prefix', # and --file_prefix + '--t' => '--temp_dir', + '--u' => '--help', # '--usage' is mapped to '--help' + }; + + $long_opts[4] = + { # option abbreviations of 4 characters + '--li' => '--license', + '--ly' => '--ly2eps', + '--pd' => '--pdf2eps', + '--pr' => '--prefix', + }; + + $long_opts[6] = + { # option abbreviations of 6 characters + '--verb' => '--verbose', + '--vers' => '--version', + }; + + + # subs for short splitting and replacing long abbreviations + + my $split_short = sub { + + my @chars = split //, $1; # omit leading dash + + # if result is TRUE: run 'next SPLIT' afterwards + + CHARS: while ( @chars ) { + my $c = shift @chars; + + unless ( exists $short_opts{$c} ) { + $stderr->print( "Unknown short option '-$c'." ); + next CHARS; + } + + # short option exists + + # map or transfer to special long option from above + my $transopt = $short_opts{$c}; + + if ( exists $opts_noarg{$transopt} ) { + push @splitted_args, $transopt; + $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' ); + next CHARS; + } + + if ( exists $opts_with_arg{$transopt} ) { + push @splitted_args, $transopt; + + if ( @chars ) { + # if @chars is not empty, option $transopt has argument + # in this arg, the rest of characters in @chars + push @splitted_args, join "", @chars; + @chars = EMPTYARRAY; + return TRUE; # use 'next SPLIT' afterwards + } + + # optarg is the next argument + $has_arg = $transopt; + return TRUE; # use 'next SPLIT' afterwards + } # end of if %opts_with_arg + } # end of while CHARS + return FALSE; # do not do anything + }; # end of sub for short_opt_collection + + + my $split_long = sub { + my $from_arg = shift; + $from_arg =~ /^([^=]+)/; + my $opt_part = lc($1); + my $optarg = undef; + if ( $from_arg =~ /=(.*)$/ ) { + $optarg = $1; + } + + N: for my $n ( qw/6 4 3/ ) { + $opt_part =~ / # match $n characters + ^ + ( + .{$n} + ) + /x; + my $argn = $1; # get the first $n characters + + # no match, so luck for fewer number of chars + next N unless ( $argn ); + + next N unless ( exists $long_opts[$n]->{$argn} ); + # not in $n hash, so go on to next loop for $n + + # now $n-hash has arg + + # map or transfer to special long opt from above + my $transopt = $long_opts[$n]->{$argn}; + + # test on option without arg + if ( exists $opts_noarg{$transopt} ) { # opt has no arg + $stderr->print( 'Option ' . $transopt . 'has no argument: ' . + $from_arg . '.' ) if ( defined($optarg) ); + push @splitted_args, $transopt; + $Args->{'verbose'} = TRUE if ( $transopt eq '--verbose' ); + return TRUE; # use 'next SPLIT' afterwards + } # end of if %opts_noarg + + # test on option with arg + if ( exists $opts_with_arg{$transopt} ) { # opt has arg + push @splitted_args, $transopt; + + # test on optarg in arg + if ( defined($optarg) ) { + push @splitted_args, $1; + return TRUE; # use 'next SPLIT' afterwards + } # end of if optarg in arg + + # has optarg in next arg + $has_arg = $transopt; + return TRUE; # use 'next SPLIT' afterwards + } # end of if %opts_with_arg + + # not with and without option, so is not permitted + $stderr->print( "'" . $transopt . + "' is unknown long option from '" . $from_arg . "'" ); + return TRUE; # use 'next SPLIT' afterwards + } # end of for N + return FALSE; # do nothing + }; # end of split_long() + + + #---------- + # do split and transfer arguments + #---------- + sub run_first { + + SPLIT: foreach (@ARGV) { + # Transform long and short options into some given long options. + # Split long opts with arg into 2 args (no '='). + # Transform short option collections into given long options. + chomp; + + if ( $has_arg ) { + push @splitted_args, $_; + $has_arg = EMPTYSTRING; + next SPLIT; + } + + if ( $double_minus ) { + push @files, $_; + next SPLIT; + } + + if ( $_ eq '-' ) { # file arg '-' + push @files, $_; + next SPLIT; + } + + if ( $_ eq '--' ) { # POSIX arg '--' + push @splitted_args, $_; + $double_minus = TRUE; + next SPLIT; + } + + if ( / # short option or collection of short options + ^ + - + ( + [^-] + .* + ) + $ + /x ) { + $split_short->($1); + next SPLIT; + } # end of short option + + if ( /^--/ ) { # starts with 2 dashes, a long option + $split_long->($_); + next SPLIT; + } # end of long option + + # unknown option without leading dash is a file name + push @files, $_; + next SPLIT; + } # end of foreach SPLIT + + # all args are considered + $stderr->print( "Option '$has_arg' needs an argument." ) + if ( $has_arg ); + + + push @files, '-' unless ( @files ); + @ARGV = @splitted_args; + + }; # end of first run, splitting with map or transfer + + + #---------- + # open or ignore verbose output + #---------- + sub install_verbose { + if ( $Args->{'verbose'} ) { # '--verbose' was used + # make verbose output into $v + # get content of string so far as array ref, close + my $s = $v->get(); + + $v = new FH_STDERR(); # make verbose output into STDERR + if ( $s ) { + for ( @$s ) { + # print the file content into new verbose output + $v->print($_); + } + } + # verbose output is now active (into STDERR) + $v->print( "Option '-v' means '--verbose'." ); + $v->print( "Version information is printed by option" + . " '--version'." + ); + $v->print( "#" x 72 ); + + } else { # '--verbose' was not used + # do not be verbose, make verbose invisible + + $v->close(); # close and ignore the string content + + $v = new FH_NULL(); + # this is either into /dev/null or in an ignored string + + } # end if-else about verbose + # '$v->print' works now in any case + + $v->print( "Verbose output was chosen." ); + + my $s = $Globals->{'prog_is_installed'} ? '' : ' not'; + $v->print( $Globals->{'prog'} . " is" . $s . + " installed." ); + + $v->print( 'The command-line options are:' ); + + $s = " options:"; + $s .= " '" . $_ . "'" for ( @ARGV ); + $v->print( $s ); + + $s = " file names:"; + $s .= " '" . $_ . "'\n" for ( @files ); + $v->print( $s ); + } # end install_verbose() + + + #---------- + # second run of command-line arguments + #---------- + sub run_second { + # Second run of args with new @ARGV from the former splitting. + # Arguments are now split and transformed into special long + # options. + + my $double_minus = FALSE; + my $has_arg = FALSE; + + ARGS: for my $arg ( @ARGV ) { + + # ignore '--', file names are handled later on + last ARGS if ( $arg eq '--' ); + + if ( $has_arg ) { + unless ( exists $opts_with_arg{$has_arg} ) { + $stderr->print( "'\%opts_with_args' does not have key '" . + $has_arg . "'." ); + next ARGS; + } + + $opts_with_arg{$has_arg}->($arg); + $has_arg = FALSE; + next ARGS; + } # end of $has_arg + + if ( exists $opts_with_arg{$arg} ) { + $has_arg = $arg; + next ARGS; + } + + if ( exists $opts_noarg{$arg} ) { + $opts_noarg{$arg}->(); + next ARGS; + } + + # not a suitable option + $stderr->print( "Wrong option '" . $arg . "'." ); + next ARGS; + + } # end of for ARGS: + + + if ( $has_arg ) { # after last argument + die "Option '$has_arg' needs an argument."; + } + + }; # end of second run + + + sub handle_args { + # handling the output of args + + if ( $Args->{'output'} ) { # '--output' was set in the arguments + my $out_path = &path2abs($Args->{'output'}); + die "Output file name $Args->{'output'} cannot be used." + unless ( $out_path ); + + my ( $file, $dir ); + ( $file, $dir ) = File::Basename::fileparse($out_path) + or die "Could not handle output file path '" . $out_path + . "': directory name '" . $dir . "' and file name '" . $file + . "'."; + + die "Could not find output directory for '" . $Args->{'output'} + . "'" unless ( $dir ); + die "Could not find output file: '" . $Args->{'output'} . + "'" unless ( $file ); + + if ( -d $dir ) { + die "Could not write to output directory '" . $dir . "'." + unless ( -w $dir ); + } else { + $dir = &make_dir($dir); + die "Could not create output directory in: '" . $out_path . "'." + unless ( $dir ); + } + + # now $dir is a writable directory + + if ( -e $out_path ) { + die "Could not write to output file '" . $out_path . "'." + unless ( -w $out_path ); + } + + $out = new FH_FILE( $out_path ); + $v->print( "Output goes to file '" . $out_path . "'." ); + } else { # '--output' was not set + $out = new FH_STDOUT(); + } + # no $out is the right behavior for standard output + + # $Args->{'prefix'} .= '_' . $Args->{'eps_func'} . '2eps'; + + @ARGV = @files; + } + &run_first(); &install_verbose(); &run_second(); @@ -288,7 +1423,8 @@ our $Temp = my @tempdirs = EMPTYARRAY; { my $tmpdir = File::Spec->tmpdir(); - push @tempdirs, $tmpdir if ( $tmpdir && -d $tmpdir && -w $tmpdir ); + push @tempdirs, $tmpdir + if ( $tmpdir && -d $tmpdir && -w $tmpdir ); my $root_dir = File::Spec->rootdir(); # '/' in Unix my $root_tmp = File::Spec->catdir($root_dir, 'tmp'); @@ -306,7 +1442,7 @@ our $Temp = } - my @path_extension = qw( groff ); # TEMPDIR/groff/USER/lilypond/ + my @path_extension = qw( groff ); # TEMPDIR/groff/USER/lilypond/N { # '$<' is UID of actual user, # 'getpwuid' gets user name in scalar context @@ -565,73 +1701,81 @@ our $Read = ); # end definition %lilypond_args - LILYPOND: foreach (<>) { - chomp; - my $line = $_; - + LILYPOND: foreach my $filename (@ARGV) { + my $input; + if ($filename eq '-') { + $input = \*STDIN; + } elsif (not open $input, '<', $filename) { + warn $!; + next; + } + while (<$input>) { + chomp; + my $line = $_; - # now the lines with '.lilypond ...' - if ( / - ^ - [.'] - \s* - lilypond - ( - .* - ) - $ - /x ) { # .lilypond ... - my $args = $1; - $args =~ s/ - ^ - \s* - //x; - $args =~ s/ - \s* - $ - //x; - $args =~ s/ - ^ - ( - \S* - ) - \s* - //x; - my $arg1 = $1; # 'start', 'end' or 'include' - $args =~ s/["'`]//g; - my $arg2 = $args; # file argument for '.lilypond include' - - if ( exists $lilypond_args{$arg1} ) { - $lilypond_args{$arg1}->($arg2); - next; - } else { - # not a suitable argument of '.lilypond' - $stderr->print( "Unknown command: '$arg1' '$arg2': '$line'" ); - } + # now the lines with '.lilypond ...' - next LILYPOND; - } # end if for .lilypond + if ( / + ^ + [.'] + \s* + lilypond + ( + .* + ) + $ + /x ) { # .lilypond ... + my $args = $1; + $args =~ s/ + ^ + \s* + //x; + $args =~ s/ + \s* + $ + //x; + $args =~ s/ + ^ + ( + \S* + ) + \s* + //x; + my $arg1 = $1; # 'start', 'end' or 'include' + $args =~ s/["'`]//g; + my $arg2 = $args; # file argument for '.lilypond include' + + if ( exists $lilypond_args{$arg1} ) { + $lilypond_args{$arg1}->($arg2); + next; + } else { + # not a suitable argument of '.lilypond' + $stderr->print( "Unknown command: '$arg1' '$arg2': '$line'" ); + } + next LILYPOND; + } # end if for .lilypond - if ( $lilypond_mode ) { # do lilypond-mode - # see '.lilypond start' - $ly->print( $line ); - next LILYPOND; - } # do lilypond-mode - # unknown line without lilypond - unless ( / - ^ - [.'] - \s* - lilypond - /x ) { # not a '.lilypond' line - $out->print($line); - next LILYPOND; - } + if ( $lilypond_mode ) { # do lilypond-mode + # see '.lilypond start' + $ly->print( $line ); + next LILYPOND; + } # do lilypond-mode - } # end foreach <> + # unknown line without lilypond + unless ( / + ^ + [.'] + \s* + lilypond + /x ) { # not a '.lilypond' line + $out->print($line); + next LILYPOND; + } + } # end while <$input> + } # end foreach $filename } # end Read @@ -723,7 +1867,7 @@ END { if ( $Temp->{'eps_dir'} ) { # EPS files in $Temp->{'eps_dir'} are always kept - $v->print( "As EPS directrory is set as '" . + $v->print( "As EPS directory is set as '" . $Temp->{'eps_dir'} . "', no EPS files there will be deleted." ); opendir my $dh_temp, $Temp->{'eps_dir'} or @@ -756,8 +1900,8 @@ END { 1; -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: CPerl # End: +# vim: set autoindent textwidth=72: diff --git a/contrib/glilypond/oop_fh.pl b/contrib/glilypond/oop_fh.pl deleted file mode 100644 index 73da6a2..0000000 --- a/contrib/glilypond/oop_fh.pl +++ /dev/null @@ -1,309 +0,0 @@ -my $License = q* -######################################################################## -# Legalese -######################################################################## - -Source file position: '/contrib/glilypond/oop_fh.pl' -Installed position: '/lib/groff/glilypond/oop_fh.pl' - -Copyright (C) 2013-2013 Free Software Foundation, Inc. - Written by Bernd Warken - -This file is part of 'glilypond', which is part of 'GNU groff'. - -glilypond - integrate 'lilypond' into 'groff' files - - 'GNU groff' is free software: you can redistribute it and/or modify it -under the terms of the 'GNU General Public License' as published by the -'Free Software Foundation', either version 3 of the License, or (at your -option) any later version. - - 'GNU groff' is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 'GNU -General Public License' for more details. - - You should have received a copy of the 'GNU General Public License' -along with 'groff', see the files 'COPYING' and 'LICENSE' in the top -directory of the 'groff' source package. If not, see -. -*; - -##### end legalese - - -# use strict; -# use warnings; -# use diagnostics; - -use integer; - -######################################################################## -# OOP for writing file handles that are open by default, like STD* -######################################################################## - -# -------------------------- _FH_WRITE_OPENED -------------------------- - -{ # FH_OPENED: base class for all opened file handles, like $TD* - - package _FH_WRITE_OPENED; - use strict; - - sub new { - my ( $pkg, $std ) = @_; - bless { - 'fh' => $std, - } - } - - sub open { - } - - sub close { - } - - sub print { - my $self = shift; - for ( @_ ) { - print { $self->{'fh'} } $_; - } - } - -} - - -# ------------------------------ FH_STDOUT ---------------------------- - -{ # FH_STDOUT: print to noral output STDOUT - - package FH_STDOUT; - use strict; - @FH_STDOUT::ISA = qw( _FH_WRITE_OPENED ); - - sub new { - &_FH_WRITE_OPENED::new( '_FH_WRITE_OPENED', *STDOUT ); - } - -} # end FH_STDOUT - - -# ------------------------------ FH_STDERR ----------------------------- - -{ # FH_STDERR: print to STDERR - - package FH_STDERR; - use strict; - @FH_STDERR::ISA = qw( _FH_WRITE_OPENED ); - - sub new { - &_FH_WRITE_OPENED::new( 'FH_OPENED', *STDERR ); - } - -} # end FH_STDERR - - -######################################################################## -# OOP for file handles that write into a file or string -######################################################################## - -# ------------------------------- FH_FILE ------------------------------ - -{ # FH_FILE: base class for writing into a file or string - - package FH_FILE; - use strict; - - sub new { - my ( $pkg, $file ) = @_; - bless { - 'fh' => undef, - 'file' => $file, - 'opened' => main::FALSE, - } - } - - sub DESTROY { - my $self = shift; - $self->close(); - } - - sub open { - my $self = shift; - my $file = $self->{'file'}; - if ( $file && -e $file ) { - die "file $file is not writable" unless ( -w $file ); - die "$file is a directory" if ( -d $file ); - } - open $self->{'fh'}, ">", $self->{'file'} - or die "could not open file '$file' for writing: $!"; - $self->{'opened'} = main::TRUE; - } - - sub close { - my $self = shift; - close $self->{'fh'} if ( $self->{'opened'} ); - $self->{'opened'} = main::FALSE; - } - - sub print { - my $self = shift; - $self->open() unless ( $self->{'opened'} ); - for ( @_ ) { - print { $self->{'fh'} } $_; - } - } - -} # end FH_FILE - - -# ------------------------------ FH_STRING ----------------------------- - -{ # FH_STRING: write into a string - - package FH_STRING; # write to \string - use strict; - @FH_STRING::ISA = qw( FH_FILE ); - - sub new { - my $pkg = shift; # string is a reference to scalar - bless - { - 'fh' => undef, - 'string' => '', - 'opened' => main::FALSE, - } - } - - sub open { - my $self = shift; - open $self->{'fh'}, ">", \ $self->{'string'} - or die "could not open string for writing: $!"; - $self->{'opened'} = main::TRUE; - } - - sub get { # get string, move to array ref, close, and return array ref - my $self = shift; - return '' unless ( $self->{'opened'} ); - my $a = &string2array( $self->{'string'} ); - $self->close(); - return $a; - } - -} # end FH_STRING - - -# -------------------------------- FH_NULL ----------------------------- - -{ # FH_NULL: write to null device - - package FH_NULL; - use strict; - @FH_NULL::ISA = qw( FH_FILE FH_STRING ); - - use File::Spec; - - my $devnull = File::Spec->devnull(); - $devnull = '' unless ( -e $devnull && -w $devnull ); - - sub new { - my $pkg = shift; - if ( $devnull ) { - &FH_FILE::new( $pkg, $devnull ); - } else { - &FH_STRING::new( $pkg ); - } - } # end new() - -} # end FH_NULL - - -######################################################################## -# OOP for reading file handles -######################################################################## - -# ---------------------------- FH_READ_FILE ---------------------------- - -{ # FH_READ_FILE: read a file - - package FH_READ_FILE; - use strict; - - sub new { - my ( $pkg, $file ) = @_; - die "File '$file' cannot be read." unless ( -f $file && -r $file ); - bless { - 'fh' => undef, - 'file' => $file, - 'opened' => main::FALSE, - } - } - - sub DESTROY { - my $self = shift; - $self->close(); - } - - sub open { - my $self = shift; - my $file = $self->{'file'}; - if ( $file && -e $file ) { - die "file $file is not writable" unless ( -r $file ); - die "$file is a directory" if ( -d $file ); - } - open $self->{'fh'}, "<", $self->{'file'} - or die "could not read file '$file': $!"; - $self->{'opened'} = main::TRUE; - } - - sub close { - my $self = shift; - close $self->{'fh'} if ( $self->{'opened'} ); - $self->{'opened'} = main::FALSE; - } - - sub read_line { - # Read 1 line of the file into a chomped string. - # Do not close the read handle at the end. - my $self = shift; - $self->open() unless ( $self->{'opened'} ); - - my $res; - if ( defined($res = CORE::readline($self->{'fh'}) ) ) { - chomp $res; - return $res; - } else { - $self->close(); - return undef; - } - } - - sub read_all { - # Read the complete file into an array reference. - # Close the read handle at the end. - # Return array reference. - my $self = shift; - $self->open() unless ( $self->{'opened'} ); - - my $res = []; - my $line; - while ( defined ( $line = CORE::readline $self->{'fh'} ) ) { - chomp $line; - push @$res, $line; - } - $self->close(); - $self->{'opened'} = main::FALSE; - return $res; - } - -} - -# end of OOP definitions - -package main; - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/glilypond/subs.pl b/contrib/glilypond/subs.pl deleted file mode 100644 index bcc7b70..0000000 --- a/contrib/glilypond/subs.pl +++ /dev/null @@ -1,471 +0,0 @@ -my $License = q* -######################################################################## -# Legalese -######################################################################## - -Subroutines for 'glilypond'. - -Source file position: '/contrib/glilypond/subs.pl' -Installed position: '/lib/groff/glilypond/subs.pl' - -Copyright (C) 2013-2018 Free Software Foundation, Inc. - Written by Bernd Warken - -Last update: 10 Sep 2015 - -This file is part of 'glilypond', which is part of 'GNU groff'. - - 'GNU groff' is free software: you can redistribute it and/or modify it -under the terms of the 'GNU General Public License' as published by the -'Free Software Foundation', either version 3 of the License, or (at your -option) any later version. - - 'GNU groff' is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 'GNU -General Public License' for more details. - - You should have received a copy of the 'GNU General Public License' -along with 'groff', see the files 'COPYING' and 'LICENSE' in the top -directory of the 'groff' source package. If not, see -. -*; - -##### end legalese - - -# use strict; -# use warnings; -# use diagnostics; - -use integer; -use utf8; -use feature 'state'; - -my $P_PIC; -# $P_PIC = '.PDFPIC'; -$P_PIC = '.PSPIC'; - -######################################################################## -# subs for using several times -######################################################################## - -sub create_ly2eps { # '--ly2eps' default - our ( $out, $Read, $Temp ); - - my $prefix = $Read->{'file_numbered'}; # with dir change to temp dir - - # '$ lilypond --ps -dbackend=eps -dgs-load-fonts \ - # output=file_without_extension file.ly' - # extensions are added automatically - my $opts = '--ps -dbackend=eps -dinclude-eps-fonts -dgs-load-fonts ' . - "--output=$prefix $prefix"; - &run_lilypond("$opts"); - - Cwd::chdir $Temp->{'cwd'} or - die "Could not change to former directory '" . - $Temp->{'cwd'} . "': $!"; - - my $eps_dir = $Temp->{'eps_dir'}; - my $dir = $Temp->{'temp_dir'}; - opendir( my $dh, $dir ) or - die "could not open temporary directory '$dir': $!"; - - my $re = qr< - ^ - $prefix - - - .* - \.eps - $ - >x; - my $file; - while ( readdir( $dh ) ) { - chomp; - $file = $_; - if ( /$re/ ) { - my $file_path = File::Spec->catfile($dir, $file); - if ( $eps_dir ) { - my $could_copy = FALSE; - File::Copy::copy($file_path, $eps_dir) - and $could_copy = TRUE; - if ( $could_copy ) { - unlink $file_path; - $file_path = File::Spec->catfile($eps_dir, $_); - } - } - $out->print( $P_PIC . ' ' . $file_path ); - } - } # end while readdir - closedir( $dh ); -} # end sub create_ly2eps() - - -sub create_pdf2eps { # '--pdf2eps' - our ( $v, $stdout, $stderr, $out, $Read, $Temp ); - - my $prefix = $Read->{'file_numbered'}; # with dir change to temp dir - - &run_lilypond("--pdf --output=$prefix $prefix"); - - my $file_pdf = $prefix . '.pdf'; - my $file_ps = $prefix . '.ps'; - - # pdf2ps in temp dir - my $temp_file = &next_temp_file; - $v->print( "\n##### run of 'pdf2ps'" ); - # '$ pdf2ps file.pdf file.ps' - my $output = `pdf2ps $file_pdf $file_ps 2> $temp_file`; - die 'Program pdf2ps does not work.' if ( $? ); - &shell_handling($output, $temp_file); - $v->print( "##### end run of 'pdf2ps'\n" ); - - # ps2eps in temp dir - $temp_file = &next_temp_file; - $v->print( "\n##### run of 'ps2eps'" ); - # '$ ps2eps file.ps' - $output = `ps2eps $file_ps 2> $temp_file`; - die 'Program ps2eps does not work.' if ( $? ); - &shell_handling($output, $temp_file); - $v->print( "##### end run of 'ps2eps'\n" ); - - # change back to former dir - Cwd::chdir $Temp->{'cwd'} or - die "Could not change to former directory '" . - $Temp->{'cwd'} . "': $!"; - - # handling of .eps file - my $file_eps = $prefix . '.eps'; - my $eps_path = File::Spec->catfile($Temp->{'temp_dir'}, $file_eps); - if ( $Temp->{'eps_dir'} ) { - my $has_copied = FALSE; - File::Copy::copy( $eps_path, $Temp->{'eps_dir'} ) - and $has_copied = TRUE; - if ( $has_copied ) { - unlink $eps_path; - $eps_path = File::Spec->catfile( $Temp->{'eps_dir'}, $file_eps ); - } else { - $stderr->print( "Could not use EPS-directory." ); - } # end Temp->{'eps_dir'} - } - # print into groff output - $out->print( $P_PIC . ' ' . $eps_path ); -} # end sub create_pdf2eps() - - -sub is_subdir { # arg1 is subdir of arg2 (is longer) - my ( $dir1, $dir2 ) = @_; - $dir1 = &path2abs( $dir1 );; - $dir2 = &path2abs( $dir2 );; - my @split1 = File::Spec->splitdir($dir1); - my @split2 = File::Spec->splitdir($dir2); - for ( @split2 ) { - next if ( $_ eq shift @split1 ); - return FALSE; - } - return TRUE; -} - - -sub license { - our ( $Legalese, $stdout ); - &version; - $stdout->print( $Legalese->{'license'} ); -} # end sub license() - - -sub make_dir { # make directory or check if it exists - our ( $v, $Args ); - - my $dir_arg = shift; - chomp $dir_arg; - $dir_arg =~ s/^\s*(.*)\s*$/$1/; - - unless ( $dir_arg ) { - $v->print( "make_dir(): empty argument" ); - return FALSE; - } - - unless ( File::Spec->file_name_is_absolute($dir_arg) ) { - my $res = Cwd::realpath($dir_arg); - $res = File::Spec->canonpath($dir_arg) unless ( $res ); - $dir_arg = $res if ( $res ); - } - - return $dir_arg if ( -d $dir_arg && -w $dir_arg ); - - - # search thru the dir parts - my @dir_parts = File::Spec->splitdir($dir_arg); - my @dir_grow; - my $dir_grow; - my $can_create = FALSE; # dir could be created if TRUE - - DIRPARTS: for ( @dir_parts ) { - push @dir_grow, $_; - next DIRPARTS unless ( $_ ); # empty string for root directory - - # from array to path dir string - $dir_grow = File::Spec->catdir(@dir_grow); - - next DIRPARTS if ( -d $dir_grow ); - - if ( -e $dir_grow ) { # exists, but not a dir, so must be removed - die "Couldn't create dir '$dir_arg', it is blocked by '$dir_grow'." - unless ( -w $dir_grow ); - - # now it's writable, but not a dir, so it can be removed - unlink ( $dir_grow ) or - die "Couldn't remove '$dir_grow', " . - "so I cannot create dir '$dir_arg': $!"; - } - - # $dir_grow does no longer exist, so the former dir must be writable - # in order to create the directory - pop @dir_grow; - $dir_grow = File::Spec->catdir(@dir_grow); - - die "'$dir_grow' is not writable, " . - "so directory '$dir_arg' can't be createdd." - unless ( -w $dir_grow ); - - # former directory is writable, so '$dir_arg' can be created - - File::Path::make_path( $dir_arg, - { - mask => oct('0700'), - verbose => $Args->{'verbose'}, - } - ) # 'mkdir -P' - or die "Could not create directory '$dir_arg': $!"; - - last DIRPARTS; - } - - die "'$dir_arg' is not a writable directory" - unless ( -d $dir_arg && -w $dir_arg ); - - return $dir_arg; - -} # end sub make_dir() - - -my $number = 0; -sub next_temp_file { - our ( $Temp, $v, $Args ); - ++$number; - my $temp_basename = $Args->{'prefix'} . '_temp_' . $number; - my $temp_file = File::Spec->catfile( $Temp->{'temp_dir'} , - $temp_basename ); - $v->print( "next temporary file: '$temp_file'" ); - return $temp_file; -} # end sub next_temp_file() - - -sub path2abs { - our ( $Temp, $Args ); - - my $path = shift; - $path =~ s/ - ^ - \s* - ( - .* - ) - \s* - $ - /$1/x; - - die "path2abs(): argument is empty." unless ( $path ); - - # Perl does not support shell '~' for home dir - if ( $path =~ / - ^ - ~ - /x ) { - if ( $path eq '~' ) { # only own home - $path = File::HomeDir->my_home; - } elsif ( $path =~ m< - ^ - ~ / - ( - .* - ) - $ - >x ) { # subdir of own home - $path = File::Spec->catdir( $Temp->{'cwd'}, $1 ); - } elsif ( $path =~ m< - ^ - ~ - ( - [^/]+ - ) - $ - >x ) { # home of other user - $path = File::HomeDir->users_home($1); - } elsif ( $path =~ m< - ^ - ~ - ( - [^/]+ - ) - /+ - ( - .* - ) - $ - >x ) { # subdir of other home - $path = File::Spec-> - catdir( File::HomeDir->users_home($1), $2 ); - } - } - - $path = File::Spec->rel2abs($path); - - # now $path is absolute - return $path; -} # end sub path2abs() - - -sub run_lilypond { - # arg is the options collection for 'lilypond' to run - # either from ly or pdf - - our ( $Temp, $v ); - - my $opts = shift; - chomp $opts; - - my $temp_file = &next_temp_file; - my $output = EMPTYSTRING; - - # change to temp dir - Cwd::chdir $Temp->{'temp_dir'} or - die "Could not change to temporary directory '" . - $Temp->{'temp_dir'} . "': $!"; - - $v->print( "\n##### run of 'lilypond " . $opts . "'" ); - $output = `lilypond $opts 2>$temp_file`; - die "Program lilypond does not work, see '$temp_file': $?" - if ( $? ); - chomp $output; - &shell_handling($output, $temp_file); - $v->print( "##### end run of 'lilypond'\n" ); - - # stay in temp dir -} # end sub run_lilypond() - - -sub shell_handling { - # Handle ``-shell-command output in a string (arg1). - # stderr goes to temporary file $TempFile. - - our ( $out, $v, $Args ); - - my $out_string = shift; - my $temp_file = shift; - - my $a = &string2array($out_string); # array ref - for ( @$a ) { - $out->print( $_ ); - } - - $temp_file && -f $temp_file && -r $temp_file || - die "shell_handling(): $temp_file is not a readable file."; - my $temp = new FH_READ_FILE($temp_file); - my $res = $temp->read_all(); - for ( @$res ) { - chomp; - $v->print($_); - } - - unlink $temp_file unless ( $Args->{'keep_all'} ); -} # end sub shell_handling() - - -sub string2array { - my $s = shift; - my @a = (); - for ( split "\n", $s ) { - chomp; - push @a, $_; - } - return \@a; -} # end string2array() - - -sub usage { # for '--help' - our ( $Globals, $Args ); - - my $p = $Globals->{'prog'}; - my $usage = EMPTYSTRING; - $usage = '###### usage:' . "\n" if ( $Args->{'verbose'} ); - $usage .= qq*Options for $p: -Read a 'roff' file or standard input and transform 'lilypond' parts -(everything between '.lilypond start' and '.lilypond end') into -'EPS'-files that can be read by groff using '.PSPIC'. - -There is also a command '.lilypond include ' that can -include a complete 'lilypond' file into the 'groff' document. - - -# Breaking options: -$p -?|-h|--help|--usage # usage -$p --version # version information -$p --license # the license is GPL >= 3 - - -# Normal options: -$p [options] [--] [filename ...] - -There are 2 options for influencing the way how the 'EPS' files for the -'roff' display are generated: ---ly2eps 'lilypond' generates 'EPS' files directly (default) ---pdf2eps 'lilypond' generates a 'PDF' file that is transformed - --k|--keep_all do not delete any temporary files --v|--verbose print much information to STDERR - -Options with an argument: --e|--eps_dir=... use a directory for the EPS files --o|--output=... sent output in the groff language into file ... --p|--prefix=... start for the names of temporary files --t|--temp_dir=... provide the directory for temporary files. - -The directories set are created when they do not exist. -*; - - # old options: - # --keep_files -k: do not delete any temporary files - # --file_prefix=... -p: start for the names of temporary files - - $main::stdout->print( $usage ); -} # end sub usage() - - -sub version { # for '--version' - our ( $Globals, $Legalese, $stdout, $Args ); - my $end; - if ( $Globals->{'groff_version'} ) { - $end = " version $Globals->{'groff_version'}"; - } else { - $end = '.'; - } - - my $output = EMPTYSTRING; - $output = "###### version:\n" if ( $Args->{'verbose'} ); - $output .= "'" . $Globals->{'prog'} . "' version '" . - $Legalese->{'version'} . "' is part of 'GNU groff'" . $end; - - $stdout->print($output); -} # end sub version() - - -# end of subs - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/gperl/ChangeLog b/contrib/gperl/ChangeLog index 2186288..813c320 100644 --- a/contrib/gperl/ChangeLog +++ b/contrib/gperl/ChangeLog @@ -1,3 +1,43 @@ +2022-10-09 G. Branden Robinson + + * gperl.pl: Include groff version information when reporting our + own (as recommended by GNU coding standards). Also drop + gratuitous quotation of program's own name. + +2022-05-03 G. Branden Robinson + + * gperl.am (gperl): Spell dependency on `$(SH_DEPS_SED_SCRIPT)` + using that macro expansion instead of a literal file name. See + groff's doc/automake.mom. + +2021-01-06 Colin Watson + + * gperl.pl: Avoid Perl's unsafe "<>" operator. + + The "<>" operator is implemented using the two-argument form of + "open", which interprets magic such as pipe characters, allowing + execution of arbitrary commands which is unlikely to be + expected. Perl >= 5.22 has a "<<>>" operator which avoids this, + but also forbids the use of "-" to mean the standard input, + which is a facility that the affected groff programs document. + + ARGV::readonly would probably also fix this, but I fundamentally + dislike the approach of escaping data in preparation for a + language facility to unescape it, especially when the required + escaping is as non-obvious as it is here. (For the same reason, + I prefer to use subprocess invocation facilities that allow + passing the argument list as a list rather than as a string to + be interpreted by the shell.) So I've abandoned this dubious + convenience and changed the affected programs to iterate over + command-line arguments manually using the three-argument form of + open. + + Fixes . + +2020-04-22 G. Branden Robinson + + * gperl.1.man: Delete references to groffer. + 2018-02-28 Werner LEMBERG * gperl.am (gperl): Use $(AM_V_GEN) to silence file generation. @@ -85,7 +125,7 @@ ________________________________________________________________________ License -Copyright (C) 2014-2018 Free Software Foundation, Inc. +Copyright (C) 2014-2020 Free Software Foundation, Inc. Written by Bernd Warken . Copying and distribution of this file, with or without @@ -95,7 +135,7 @@ notice are preserved. This file is part of `gperl', which is part of the `groff' project. -####### Emacs settings +##### Editor settings Local Variables: mode: change-log diff --git a/contrib/gperl/gperl.1.man b/contrib/gperl/gperl.1.man index ba5cac4..14afdcf 100644 --- a/contrib/gperl/gperl.1.man +++ b/contrib/gperl/gperl.1.man @@ -1,12 +1,15 @@ -.TH GPERL @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -gperl \- groff preprocessor for Perl parts in roff files +.TH gperl @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +gperl \- execute Perl commands in +.I groff +documents +. . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2014-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2014-2020 Free Software Foundation, Inc. .\" .\" This file is part of gperl, which is part of groff, a free software .\" project. @@ -18,54 +21,62 @@ gperl \- groff preprocessor for Perl parts in roff files .\" The license text is available in the internet at .\" . . -.\" ==================================================================== -.\" Characters -.\" ==================================================================== . -.\" Ellipsis ... -.ie t .ds EL \fS\N'188'\fP\" -.el .ds EL \&.\|.\|.\&\" -.\" called with \*(EL +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_gperl_1_man_C \n[.cp] +.cp 0 . -.\" Bullet -.ie t .ds BU \(bu -.el .ds BU * -.\" used in '.IP \*(BU 2m' (former .Topic) +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback . . .\" ==================================================================== -.SH "SYNOPSIS" +.SH Synopsis .\" ==================================================================== . .SY gperl -.RI [ filespec -\*(EL] +.RI [ file\~ .\|.\|.] .YS . +. .SY gperl .B \-h +. .SY gperl .B \-\-help .YS . .SY gperl .B \-v +. .SY gperl .B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . This is a preprocessor for -.BR \%groff (@MAN1EXT@). +.MR groff @MAN1EXT@ . . It allows the use of -.BR perl (7) +.MR perl 7 code in -.BR groff (7) +.MR groff @MAN7EXT@ files. . The result of a @@ -78,55 +89,36 @@ based on the arguments at a final line of a .IR "Perl part" . . . -.\" ==================================================================== -.SH "OPTIONS" -.\" ==================================================================== -. -So far, there are only -.I filespec -or -.I breaking -options. -. -. -.P -.I filespec -are file names or the minus character -.B \- -character for standard input. -. -As usual, the argument -.B \-\- -can be used in order to let all following arguments mean file names, -even if the names begin with a minus character -.BR \- . -. -. .P -An option is -.IR breaking , -when the program just writes the information that was asked for and -then stops. -. -All other arguments will be ignored by that. -. -These -.I breaking -options are here -. -.TP -.B \-h\~\fR|\fB\~\-\-help -Print help information with a short explanation of options to -standard output. -. +If no operands are given, +or if +.I file +is +.RB \[lq] \- \[rq], +.I gperl +reads the standard input stream. +. +A double-dash argument +.RB (\[lq] \-\- \[rq]) +causes all subsequent arguments to be interpreted as +.I file +operands, +even if their names start with a dash. . -.TP -.B \-v\~\fR|\fB\~\-\-version -Print version information to standard output. +.B \-h +and +.B \-\-help +display a usage message, +whereas +.B \-v +and +.B \-\-version +display version information; +all exit afterward. . . .\" ==================================================================== -.SH "PERL PARTS" +.SH "Perl regions" .\" ==================================================================== . .I Perl @@ -142,7 +134,7 @@ command. . . .\" ==================================================================== -.SS "Starting Perl Mode" +.SS "Starting Perl mode" .\" ==================================================================== . The starting @@ -151,15 +143,15 @@ can either be without arguments, or by a request that has the term .B start as its only argument. .RS -.IP \*(BU 2m +.IP \(bu .B .Perl -.IP \*(BU 2m +.IP \(bu .B .Perl start .RE . . .\" ==================================================================== -.SS "Ending Perl Mode without Storage" +.SS "Ending Perl mode without storage" .\" ==================================================================== . A @@ -174,9 +166,9 @@ Of course, it would be reasonable to add the argument that's possible, but not necessary. . .RS -.IP \*(BU 2m +.IP \(bu .B .Perl stop -.IP \*(BU 2m +.IP \(bu .BI .Perl " other_than_start" .RE . @@ -188,11 +180,11 @@ string variable name for storage \(em see next section. . . .\" ==================================================================== -.SS "Ending Perl Mode with Storage" +.SS "Ending Perl mode with storage" .\" ==================================================================== . A useful feature of -.B gperl +.I gperl is to store one or more results from the .IR "Perl mode" . . @@ -220,7 +212,7 @@ with a single line for each array member. . .P This Perl array output can be stored by -.B gperl +.I gperl in either .TP .I groff strings @@ -228,7 +220,7 @@ by creating a groff command .B .ds . .TP -.I groff number register +.I groff register by creating a groff command .B .rn . @@ -245,10 +237,12 @@ changes the mode into and .B .nr changes the mode into -.I groff number register +.I groff register for all following output parts. . . +.br +.ne 2v .P By default, all output is saved as strings, so .B .ds @@ -257,16 +251,16 @@ is not really needed before the first command. . That suits to -.BR \%groff (@MAN7EXT@), +.MR groff @MAN7EXT@ , because every output can be saved as .I groff -string, but the number registers can be very restrictive. +string, but the registers can be very restrictive. . . .P In .IR "string mode" , -.B gperl +.I gperl generates a .I groff string storage line @@ -277,7 +271,7 @@ storage line .RE . In -.I number register mode +.I register mode the following groff command is generated .RS .EX @@ -353,9 +347,9 @@ and . .TP .BI ".Perl .nr" " var_name1 varname2" -stores both variables as number register variables. +stores both variables as register variables. . -.B gperl +.I gperl generates .RS .EX @@ -368,7 +362,7 @@ generates .TP .BI ".Perl .nr " var_name1 " .ds " var_name2 stores the 1st argument as -.I number register +.I register and the second as .I string by @@ -381,20 +375,7 @@ by . . .\" ==================================================================== -.SS "Printing towards STDERR is without Storage" -.\" ==================================================================== -. -The printing towards -.IR STDERR , -(standard error) works as usual. -. -All error information goes to the real normal -.IR "standard error" , -without other automatic storage. -. -. -.\" ==================================================================== -.SH "EXAMPLES" +.SH Example .\" ==================================================================== . A possible @@ -406,7 +387,7 @@ could look like that: .EX before \&.Perl start -my $result = 'some data'; +my $result = \[aq]some data\[aq]; print $result; \&.Perl stop .ds string_var after @@ -428,9 +409,9 @@ such that the following line is printed: .EE .RE by -.B gperl +.I gperl as food for the coming -.B groff +.I groff run. . . @@ -466,43 +447,45 @@ command lines are created: . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== -.B gperl +. +.I gperl was written by -.MT groff\-bernd.warken\-72@\:web.de +.MT groff\-bernd\:.warken\-72@\:web\:.de Bernd Warken .ME . . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . .P Man pages related to .I groff are -.BR \%groff (@MAN1EXT@), -.BR \%groff (@MAN7EXT@), -.BR \%grog (@MAN1EXT@), +.MR groff @MAN1EXT@ , +.MR groff @MAN7EXT@ , and -.BR \%groffer (@MAN1EXT@). +.MR grog @MAN1EXT@ . . . .P Documents related to .I Perl are -.BR \%perl (@MAN1EXT@), -.BR \%perl (@MAN7EXT@). +.MR perl 1 , +.MR perl 7 . . . -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_gperl_1_man_C] +.do rr *groff_gperl_1_man_C +. . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/gperl/gperl.am b/contrib/gperl/gperl.am index 5689386..4d275c2 100644 --- a/contrib/gperl/gperl.am +++ b/contrib/gperl/gperl.am @@ -1,13 +1,9 @@ # Automake rules for 'gperl' (preprocessor for added Perl parts) -# File position: /contrib/gperl/gperl.am - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Automake migration by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'gperl' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -33,7 +29,7 @@ EXTRA_DIST += \ contrib/gperl/gperl.1.man \ contrib/gperl/gperl.pl -gperl: $(top_srcdir)/contrib/gperl/gperl.pl shdeps.sed +gperl: $(top_srcdir)/contrib/gperl/gperl.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)$(RM) $@ \ && sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ @@ -45,12 +41,8 @@ gperl: $(top_srcdir)/contrib/gperl/gperl.pl shdeps.sed && chmod +x $@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/gperl/gperl.pl b/contrib/gperl/gperl.pl index fdb93ff..2f9f7d1 100755 --- a/contrib/gperl/gperl.pl +++ b/contrib/gperl/gperl.pl @@ -2,10 +2,7 @@ # gperl - add Perl part to groff files, this is the preprocessor for that -# Source file position: /contrib/gperl/gperl.pl -# Installed position: /bin/gperl - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . @@ -99,7 +96,7 @@ foreach (@ARGV) { q(parts in 'roff' files.); exit; } elsif ( /^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/ ) { - print q('gperl' version ) . $version; + print "gperl (groff @VERSION@) version $version"; exit; } } @@ -132,121 +129,129 @@ my $out_file; my $perl_mode = 0; -foreach (<>) { - chomp; - s/\s+$//; - my $line = $_; - my $is_dot_Perl = $line =~ /^[.']\s*Perl(|\s+.*)$/; - - unless ( $is_dot_Perl ) { # not a '.Perl' line - if ( $perl_mode ) { # is running in Perl mode - print OUT $line; - } else { # normal line, not Perl-related - print $line; - } +unshift @ARGV, '-' unless @ARGV; +foreach my $filename (@ARGV) { + my $input; + if ($filename eq '-') { + $input = \*STDIN; + } elsif (not open $input, '<', $filename) { + warn $!; next; } - - - ########## - # now the line is a '.Perl' line - - my $args = $line; - $args =~ s/\s+$//; # remove final spaces - $args =~ s/^[.']\s*Perl\s*//; # omit .Perl part, leave the arguments - - my @args = split /\s+/, $args; - - ########## - # start Perl mode - if ( @args == 0 || @args == 1 && $args[0] eq 'start' ) { - # For '.Perl' no args or first arg 'start' means opening 'Perl' mode. - # Everything else means an ending command. - if ( $perl_mode ) { - # '.Perl' was started twice, ignore - print STDERR q('.Perl' starter was run several times); - next; - } else { # new Perl start - $perl_mode = 1; - open OUT, '>', $out_file; + while (<$input>) { + chomp; + s/\s+$//; + my $line = $_; + my $is_dot_Perl = $line =~ /^[.']\s*Perl(|\s+.*)$/; + + unless ( $is_dot_Perl ) { # not a '.Perl' line + if ( $perl_mode ) { # is running in Perl mode + print OUT $line; + } else { # normal line, not Perl-related + print $line; + } next; } - } - ########## - # now the line must be a Perl ending line (stop) - unless ( $perl_mode ) { - print STDERR 'gperl: there was a Perl ending without being in ' . - 'Perl mode:'; - print STDERR ' ' . $line; - next; - } + ########## + # now the line is a '.Perl' line + + my $args = $line; + $args =~ s/\s+$//; # remove final spaces + $args =~ s/^[.']\s*Perl\s*//; # omit .Perl part, leave the arguments + + my @args = split /\s+/, $args; + + ########## + # start Perl mode + if ( @args == 0 || @args == 1 && $args[0] eq 'start' ) { + # For '.Perl' no args or first arg 'start' means opening 'Perl' mode. + # Everything else means an ending command. + if ( $perl_mode ) { + # '.Perl' was started twice, ignore + print STDERR q('.Perl' starter was run several times); + next; + } else { # new Perl start + $perl_mode = 1; + open OUT, '>', $out_file; + next; + } + } - $perl_mode = 0; # 'Perl' stop calling is correct - close OUT; # close the storing of 'Perl' commands + ########## + # now the line must be a Perl ending line (stop) - ########## - # run this 'Perl' part, later on about storage of the result - # array stores prints with \n - my @print_res = `perl $out_file`; + unless ( $perl_mode ) { + print STDERR 'gperl: there was a Perl ending without being in ' . + 'Perl mode:'; + print STDERR ' ' . $line; + next; + } - # remove 'stop' arg if exists - shift @args if ( $args[0] eq 'stop' ); + $perl_mode = 0; # 'Perl' stop calling is correct + close OUT; # close the storing of 'Perl' commands - if ( @args == 0 ) { - # no args for saving, so @print_res doesn't matter - next; - } + ########## + # run this 'Perl' part, later on about storage of the result + # array stores prints with \n + my @print_res = `perl $out_file`; - my @var_names = (); - my @mode_names = (); + # remove 'stop' arg if exists + shift @args if ( $args[0] eq 'stop' ); - my $mode = '.ds'; - for ( @args ) { - if ( /^\.?ds$/ ) { - $mode = '.ds'; + if ( @args == 0 ) { + # no args for saving, so @print_res doesn't matter next; } - if ( /^\.?nr$/ ) { - $mode = '.nr'; - next; + + my @var_names = (); + my @mode_names = (); + + my $mode = '.ds'; + for ( @args ) { + if ( /^\.?ds$/ ) { + $mode = '.ds'; + next; + } + if ( /^\.?nr$/ ) { + $mode = '.nr'; + next; + } + push @mode_names, $mode; + push @var_names, $_; } - push @mode_names, $mode; - push @var_names, $_; - } - my $n_res = @print_res; - my $n_vars = @var_names; + my $n_res = @print_res; + my $n_vars = @var_names; - if ( $n_vars < $n_res ) { - print STDERR 'gperl: not enough variables for Perl part: ' . - $n_vars . ' variables for ' . $n_res . ' output lines.'; - } elsif ( $n_vars > $n_res ) { - print STDERR 'gperl: too many variablenames for Perl part: ' . - $n_vars . ' variables for ' . $n_res . ' output lines.'; - } - if ( $n_vars < $n_res ) { - print STDERR 'gperl: not enough variables for Perl part: ' . - $n_vars . ' variables for ' . $n_res . ' output lines.'; - } + if ( $n_vars < $n_res ) { + print STDERR 'gperl: not enough variables for Perl part: ' . + $n_vars . ' variables for ' . $n_res . ' output lines.'; + } elsif ( $n_vars > $n_res ) { + print STDERR 'gperl: too many variablenames for Perl part: ' . + $n_vars . ' variables for ' . $n_res . ' output lines.'; + } + if ( $n_vars < $n_res ) { + print STDERR 'gperl: not enough variables for Perl part: ' . + $n_vars . ' variables for ' . $n_res . ' output lines.'; + } - my $n_min = $n_res; - $n_min = $n_vars if ( $n_vars < $n_res ); - exit unless ( $n_min ); - $n_min -= 1; # for starting with 0 + my $n_min = $n_res; + $n_min = $n_vars if ( $n_vars < $n_res ); + exit unless ( $n_min ); + $n_min -= 1; # for starting with 0 - for my $i ( 0..$n_min ) { - my $value = $print_res[$i]; - chomp $value; - print $mode_names[$i] . ' ' . $var_names[$i] . ' ' . $value; + for my $i ( 0..$n_min ) { + my $value = $print_res[$i]; + chomp $value; + print $mode_names[$i] . ' ' . $var_names[$i] . ' ' . $value; + } } } 1; -######################################################################## -### Emacs settings # Local Variables: # mode: CPerl # End: diff --git a/contrib/gpinyin/ChangeLog b/contrib/gpinyin/ChangeLog index c7ec8d5..53cc228 100644 --- a/contrib/gpinyin/ChangeLog +++ b/contrib/gpinyin/ChangeLog @@ -1,3 +1,109 @@ +2022-10-09 G. Branden Robinson + + * gpinyin.pl: Report groff version number along with this + program's own when not run from source tree. Drop dead code. + Bump micro version number to reflect recent restructuring. + +2022-10-09 G. Branden Robinson + + Make gpinyin script stand alone. + + * subs.pl: Delete, moving its content into... + * gpinyin.pl: ...here. + (vowel_t): Use explicit list with `my`. + (vowel_n, vowel_t): Declare local scalar `$vowel_with_tone` + using `my`. + * gpinyin.am (dist_gpinyin_DATA): Delete. + +2022-05-03 G. Branden Robinson + + * gpinyin.am (gpinyin): Fix missing dependency on + `$(SH_DEPS_SED_SCRIPT)`. + +2021-05-11 G. Branden Robinson + + * gpinyin.1.man: Render the tone mark table only if the output + device might be capable. + + Fixes . + +2021-05-10 G. Branden Robinson + + * gpinyin.1.man: Work around inability of grops and gropdf to + construct some Unicode composite characters. Use groff + composite special characters for "a" with acute and grave + accents, and define strings for "a" with macron (overline) and + with háček/caron accents. Use different string definitions for + nroff and troff modes so we don't regress UTF-8 terminal output. + +2021-05-10 G. Branden Robinson + + * subs.pl (vowel_t): Fix incorrect rendering of base glyph 'U', + which was being forced to lowercase when a dieresis and tone + mark were both being applied. This caused the tone mark to + overlap the dieresis, so decrease the font size of the base + glyph even more to compensate. The result is ugly but + comprehensible. + + See , partially mitigated + but not completely resolved. + +2021-05-09 G. Branden Robinson + + * subs.pl (%tones1_Unicode): Fix copy and paste error. Emit + U+01D5 (Latin capital letter u with dieresis and macron) for Ü + with tone 1, instead of U+016A (Latin capital letter u with + macron). + + Fixes . + +2021-05-09 G. Branden Robinson + + * subs.pl (handle_word): Emit \[cq] instead of \[aq] when + interpolating an apostrophe before a vowel. + + Fixes . + +2021-05-09 G. Branden Robinson + + * subs.pl (%tones_glyphs, %tones4_glyphs): Fix hash keys to use + the groff dotless i special character into which a lowercase "i" + has already been transformed instead of 'i' itself. + (vowel_n, vowel_t): Rename variable so that tone-transformed + vowel is stored separately. Add "or warn" to test the result + and cheaply assert that we got a string back from our hash + lookup on the vowel. + + Fixes . + +2021-01-06 Colin Watson + + * gpinyin.pl: Avoid Perl's unsafe "<>" operator. + + The "<>" operator is implemented using the two-argument form of + "open", which interprets magic such as pipe characters, allowing + execution of arbitrary commands which is unlikely to be + expected. Perl >= 5.22 has a "<<>>" operator which avoids this, + but also forbids the use of "-" to mean the standard input, + which is a facility that the affected groff programs document. + + ARGV::readonly would probably also fix this, but I fundamentally + dislike the approach of escaping data in preparation for a + language facility to unescape it, especially when the required + escaping is as non-obvious as it is here. (For the same reason, + I prefer to use subprocess invocation facilities that allow + passing the argument list as a list rather than as a string to + be interpreted by the shell.) So I've abandoned this dubious + convenience and changed the affected programs to iterate over + command-line arguments manually using the three-argument form of + open. + + Fixes . + +2020-04-22 G. Branden Robinson + + * gpinyin.1.man: Delete references to groffer. + 2018-02-28 Werner LEMBERG * gpinyin.am (gpinyin): Use $(AM_V_GEN) to silence file generation. @@ -74,7 +180,7 @@ ________________________________________________________________________ License -Copyright (C) 2014-2018 Free Software Foundation, Inc. +Copyright (C) 2014-2020 Free Software Foundation, Inc. Written by Bernd Warken . Copying and distribution of this file, with or without @@ -84,8 +190,11 @@ notice are preserved. This file is part of `gpinyin', which is part of the `groff' project. -####### Emacs settings +##### Editor settings Local Variables: +fill-column: 72 mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/gpinyin/gpinyin.1.man b/contrib/gpinyin/gpinyin.1.man index db634fd..3c3884e 100644 --- a/contrib/gpinyin/gpinyin.1.man +++ b/contrib/gpinyin/gpinyin.1.man @@ -1,13 +1,16 @@ '\" t -.TH GPINYIN @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -gpinyin \- use Hanyu Pinyin Chinese in roff +.TH gpinyin @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +gpinyin \- use Hanyu Pinyin Chinese in +.I groff +documents +. . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2014-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2014-2020 Free Software Foundation, Inc. .\" .\" This file is part of gpinyin, which is part of groff, a free .\" software project. @@ -19,6 +22,27 @@ gpinyin \- use Hanyu Pinyin Chinese in roff .\" The license text is available in the internet at .\" . . +. +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_gpinyin_1_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== .\" Local definitions .\" ==================================================================== @@ -27,49 +51,50 @@ gpinyin \- use Hanyu Pinyin Chinese in roff .ie t .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X .el .ds TeX TeX . -.\" Define a string for an ellipsis. -.ie t .ds EL \f[S]\N'188'\f[P]\" -.el .ds EL \&.\|.\|.\&\" -. . .\" ==================================================================== -.SH "SYNOPSIS" +.SH Synopsis .\" ==================================================================== . .SY gpinyin -.RI [ input-file -\*(EL] +.RI [ file\~ .\|.\|.] .YS . +. .SY gpinyin .B \-h +. .SY gpinyin .B \-\-help .YS . .SY gpinyin .B \-v +. .SY gpinyin .B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . -.B gpinyin +.I gpinyin is a preprocessor for -.BR \%groff (@MAN1EXT@) -that facilitates use of the Hanyu Pinyin -.BR groff (7) +.MR groff @MAN1EXT@ +that facilitates use of Hanyu Pinyin in +.MR groff @MAN7EXT@ files. . -Pinyin is a method for writing the Chinese language with the Latin -alphabet. +Pinyin is a method for writing the Mandarin Chinese language with the +Latin alphabet. +. +Mandarin consists of more than four hundred base syllables, +each spoken with one of five different tones. . -The Chinese language consists of more than four hundred syllables, -each with one of five different tones. +Changing the tone applied to the syllable generally alters the meaning +of the word it forms. . In Pinyin, a syllable is written in the Latin alphabet and a numeric tone indicator @@ -79,19 +104,34 @@ can be appended to each syllable. .P Each .I input-file -is a file name or the hyphen-minus character \[lq]\-\[rq] to indicate -that standard input should be read. +is a file name or the character +.RB \[lq] \- \[rq] +to indicate that the standard input stream should be read. . As usual, -the argument \[lq]\-\-\[rq] can be used in order to force interpretation -of all remaining arguments as file names, +the argument +.RB \[lq] \-\- \[rq] +can be used in order to force interpretation of all remaining arguments +as file names, even if an .I input-file -argument begins with the hyphen-minus character. +argument begins with a +.RB \[lq] \- \[rq]. +. +.B \-h +and +.B \-\-help +display a usage message, +while +.B \-v +and +.B \-\-version +show version information; +all exit afterward. . . .\" ==================================================================== -.SS "Pinyin Sections" +.SS "Pinyin sections" .\" ==================================================================== . Pinyin sections in @@ -128,21 +168,13 @@ or . . .\" ==================================================================== -.SS "Syllables" +.SS Syllables .\" ==================================================================== . -The spoken Chinese language is based on about 411 -.IR syllables ; -see -.UR http://\:en.wikipedia.org/\:wiki/\:Pinyin_table -.UE . -. -. -.P In Pinyin, -each syllable consists of one to six letters from the Latin alphabet; -these letters comprise the fifty-two upper- and lowercase letters from -the ASCII character set, +each syllable is represented by one to six letters drawn from the +fifty-two upper- and lowercase letters of the Unicode basic Latin +character set, plus the letter \[lq]U\[rq] with dieresis (umlaut) in both cases\[em]in other words, the members of the set \[lq][a\[en]zA\[en]Z\[:u]\[:U]]\[rq]. @@ -152,7 +184,7 @@ the members of the set \[lq][a\[en]zA\[en]Z\[:u]\[:U]]\[rq]. In .I groff input, -all ASCII letters are written as themselves. +all basic Latin letters are written as themselves. . The \[lq]u with dieresis\[rq] can be written as \[lq]\e[:u]\[rq] @@ -174,7 +206,7 @@ for uppercase. . . .\" ==================================================================== -.SS "Tones" +.SS Tones .\" ==================================================================== . Each syllable has exactly one of five @@ -199,24 +231,46 @@ The tone numbers 0 and 5 are synonymous. . . .P -The following table summarizes the tones. -. -Some output devices will not be able to render every output example. +.nr gpinyin*do-table 0 +.if t .nr gpinyin*do-table 1 +.if n .if '\*[.T]'utf8' .nr gpinyin*do-table 1 +.\" XXX: One hack necessitates another; since our table is conditional, +.\" we need to save the input line counter. +.nr gpinyin*.c \n[.c] +.ie \n[gpinyin*do-table] \{\ +The tones are written as follows. . . .P +.\" XXX: This is so gross. Why can't grops and gropdf figure this out? +.if t .ds a- \za\[a-] +.if n .ds a- \[a a-] +.if t .ds a< \za\[ah] +.if n .ds a< \[a ah] .if t .ne 8 \" Try to keep the table on one page for printed output. .TS l l l l l. Tone Description Diacritic Example Input Example Output _ -first flat \[a-] ma1 m\[u0061_0304] -second rising \[aa] ma2 m\[u0061_0301] -third falling-rising \[ah] ma3 m\[u0061_030C] -fourth falling \[ga] ma4 m\[u0061_0300] +first flat \[a-] ma1 m\*[a-] +second rising \[aa] ma2 m\[a aa] +third falling-rising \[ah] ma3 m\*[a<] +fourth falling \[ga] ma4 m\[a ga] fifth neutral (none) ma0 ma \^ \^ \^ ma5 \^ .TE +.\} +.lf (\n[gpinyin*.c] + 25) \" XXX part 2: Restore input line counter. +.el \{\ +[The tone mark table is omitted from this rendering of the man page +because the selected output device \[lq]\*[.T]\[rq] lacks the character +repertoire to display it. +. +Try another output device.] +.\} +.rm a- +.rm a< +.rr gpinyin*do-table . . .P @@ -225,82 +279,52 @@ but not otherwise. . . .\" ==================================================================== -.SH OPTIONS +.SH Authors .\" ==================================================================== . -.TP -.B \-h -.TQ -.B \-\-help -Print usage information and exit. -. -. -.TP -.B \-v -.TQ -.B \-\-version -Print version information and exit. -. -. -.\" ==================================================================== -.SH AUTHORS -.\" ==================================================================== -. -.B gpinyin +.I gpinyin was written by -.MT +.MT groff\-bernd\:.warken\-72@\:web\:.de Bernd Warken .ME . . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . Useful documents on the World Wide Web related to Pinyin include .RS 4n -.br -.UR http://\:en.wikipedia.org/\:wiki/\:Pinyin -\[lq]Pinyin\[rq] (Wikipedia) -.UE , -. -.br -.UR http://\:en.wikipedia.org/\:wiki/\:Pinyin_table -\[lq]Pinyin table\[rq] (Wikipedia) -.UE , -. -.\" XXX: dead link -.\".br -.\".UR http://\:www.sino.uni\-heidelberg.de/\:course_resources/\:s02/\:\ -.\"py\-vowels.htm -.\".I Unicode vowels for Pinyin -.\".UE , -.\". -.br -.UR http://\:www.foolsworkshop.com/\:ptou/\:index.html +.UR http://\:www\:.foolsworkshop\:.com/\:ptou/\:index\:.html .I Pinyin to Unicode .UE , . .br -.UR http://\:www.mandarintools.com/ -.I On-line Chinese Tools +.UR http://\:www\:.mandarintools\:.com/ +.I On-line Chinese Tools \" sic: On-line .UE , . .br -.UR http://\:www.pinyin.info/\:index.html +.\" XXX: Turning off adjustment like this is ugly; thanks to meter-long +.\" URLs we need an escape sequence that selectively disables adjustment +.\" at the end of a word. +.na +.UR http://\:www\:.pinyin\:.info/\:index\:.html .I Pinyin.info: a guide to the writing of Mandarin Chinese in \ romanization .UE , +.ad \*[AD] . .br -.UR http://\:www.pinyin.info/\:rules/\:where.html -\[lq]Where do the tone marks go?\[rq] (Pinyin.info) +.UR http://\:www\:.pinyin\:.info/\:rules/\:where.html +\[lq]Where do the tone marks go?\[rq] .UE , . .br -.UR http://\:git.savannah.gnu.org/\:gitweb/\:\ -?p=cjk.git;a=blob_plain;f=doc/\:pinyin.txt;hb=HEAD -pinyin.txt from the CJK macro package for \*[TeX] +.UR http://\:git\:.savannah\:.gnu\:.org/\:gitweb/\:\ +?p=cjk\:.git\:;a=blob_plain\:;f=doc/\:pinyin\:.txt\:;hb=HEAD +.I pinyin.txt +from the CJK macro package for \*[TeX] .UE , .br .RS -4n @@ -308,38 +332,47 @@ and .RE . .br -.UR http://\:git.savannah.gnu.org/\:gitweb/\:\ -?p=cjk.git;a=blob_plain;f=texinput/p\:inyin.sty;hb=HEAD -pinyin.sty from the CJK macro package for \*[TeX] +.\" XXX: Same ugliness as before. +.na +.UR http://\:git\:.savannah\:.gnu\:.org/\:gitweb/\:\ +?p=cjk\:.git\:;a=blob_plain\:;f=texinput/\:pinyin\:.sty\:;hb=HEAD +.I pinyin.sty +from the CJK macro package for \*[TeX] .UE . +.ad \*[AD] . .RE . +. .P -.BR \%groff (@MAN1EXT@), -.BR \%grog (@MAN1EXT@), +.MR groff @MAN1EXT@ and -.BR \%groffer (@MAN1EXT@) +.MR grog @MAN1EXT@ explain how to view .I roff documents. . . .P -.BR \%groff (@MAN7EXT@) +.MR groff @MAN7EXT@ and -.BR \%groff_char (@MAN7EXT@) +.MR groff_char @MAN7EXT@ are comprehensive references covering the language elements of GNU -.I roff +.I troff \" GNU and the available glyph repertoire, respectively. . . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== +.\" Clean up. +.rm TeX +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_gpinyin_1_man_C] +.do rr *groff_gpinyin_1_man_C +. . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/gpinyin/gpinyin.am b/contrib/gpinyin/gpinyin.am index a46e17f..78cc35a 100644 --- a/contrib/gpinyin/gpinyin.am +++ b/contrib/gpinyin/gpinyin.am @@ -1,13 +1,9 @@ # Automake rules for 'gpinyin' (preprocessor for added Perl parts) -# File position: /contrib/gpinyin/gpinyin.am - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . # Moved to automake by Bertrand Garrigues -# Last update: 22 Aug 2015 - # This file is part of 'gpinyin' which is part of 'groff'. # 'groff' is free software; you can redistribute it and/or modify it @@ -29,14 +25,13 @@ gpinyin_srcdir = $(top_srcdir)/contrib/gpinyin bin_SCRIPTS += gpinyin gpinyindir = $(gpinyin_dir) -dist_gpinyin_DATA = contrib/gpinyin/subs.pl man1_MANS += contrib/gpinyin/gpinyin.1 EXTRA_DIST += \ contrib/gpinyin/ChangeLog \ contrib/gpinyin/gpinyin.1.man \ contrib/gpinyin/gpinyin.pl -gpinyin: contrib/gpinyin/gpinyin.pl +gpinyin: contrib/gpinyin/gpinyin.pl $(SH_DEPS_SED_SCRIPT) $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \ -e "s|[@]g[@]|$(g)|g" \ -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \ @@ -54,12 +49,8 @@ uninstall-gpinyin-hook: fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/gpinyin/gpinyin.pl b/contrib/gpinyin/gpinyin.pl index e4bb5a3..73b3034 100755 --- a/contrib/gpinyin/gpinyin.pl +++ b/contrib/gpinyin/gpinyin.pl @@ -2,14 +2,12 @@ # gpinyin - European-like Chinese writing 'pinyin' into 'groff' -# Source file position: /contrib/gpinyin/gpinyin.pl -# Installed position: /bin/gpinyin - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. +# Copyright (C) 2014-2020 Free Software Foundation, Inc. # Written by Bernd Warken . -my $version = '1.0.4'; +my $version = '1.0.5'; +my $groff_version = '(groff @VERSION@) '; # with trailing space # This file is part of 'gpinyin', which is part of 'groff'. @@ -57,37 +55,562 @@ use FindBin; $\ = "\n"; # final part for print command +{ + my $at = '@'; + $groff_version = '' if '@VERSION@' eq "${at}VERSION${at}"; +} + ######################################################################## -# read-only variables with double-@ construct +# All Pinyin syllables from wikipedia ######################################################################## -our $File_split_env_sh; -our $File_version_sh; -our $Groff_Version; +my %syllables = + ( + 'a' => 1, 'ai' => 1, 'an' => 1, 'ang' => 1, 'ao' => 1, + 'ba' => 1, 'bai' => 1, 'ban' => 1, 'bang' => 1, 'bao' => 1, + 'bei' => 1, 'ben' => 1, 'beng' => 1, + 'bi' => 1, 'bian' => 1, 'biao' => 1, 'bie' => 1, 'bin' => 1, + 'bing' => 1, 'bo' => 1, 'bu' => 1, + 'ca' => 1, 'cai' => 1, 'can' => 1, 'cang' => 1, 'cao' => 1, + 'ce' => 1, 'cen' => 1, 'ceng' => 1, + 'cha' => 1, 'chai' => 1, 'chan' => 1, 'chang' => 1, 'chao' => 1, + 'che' => 1, 'chen' => 1, 'cheng' => 1, 'chi' => 1, + 'chong' => 1, 'chou' => 1, 'chu' => 1, + 'chua' => 1, 'chuai' => 1, 'chuan' => 1, 'chuang' => 1, + 'chui' => 1, 'chun' => 1, 'chuo' => 1, + 'ci' => 1, 'cong' => 1, 'cou' => 1, + 'cu' => 1, 'cuan' => 1, 'cui' => 1, 'cun' => 1, 'cuo' => 1, + 'da' => 1, 'dai' => 1, 'dan' => 1, 'dang' => 1, 'dao' => 1, + 'de' => 1, 'dei' => 1, 'den' => 1, 'deng' => 1, + 'di' => 1, 'dian' => 1, 'diao' => 1, 'die' => 1, + 'ding' => 1, 'diu' => 1, 'dong' => 1, 'dou' => 1, + 'du' => 1, 'duan' => 1, 'dui' => 1, 'dun' => 1, 'duo' => 1, + 'e' => 1, 'ei' => 1, 'en' => 1, 'eng' => 1, 'er' => 1, + 'fa' => 1, 'fan' => 1, 'fang' => 1, + 'fei' => 1, 'fen' => 1, 'feng' => 1, 'fiao' => 1, + 'fo' => 1, 'fou' => 1, 'fu' => 1, + 'ga' => 1, 'gai' => 1, 'gan' => 1, 'gang' => 1, 'gao' => 1, + 'ge' => 1, 'gei' => 1, 'gen' => 1, 'geng' => 1, + 'gong' => 1, 'gou' => 1, 'gu' => 1, + 'gua' => 1, 'guai' => 1, 'guan' => 1, 'guang' => 1, 'gui' => 1, + 'gun' => 1, 'guo' => 1, + 'ha' => 1, 'hai' => 1, 'han' => 1, 'hang' => 1, 'hao' => 1, + 'he' => 1, 'hei' => 1, 'hen' => 1, 'heng' => 1, + 'hong' => 1, 'hou' => 1, + 'hu' => 1, 'hua' => 1, 'huai' => 1, 'huan' => 1, 'huang' => 1, + 'hui' => 1, 'hun' => 1, 'huo' => 1, + 'ji' => 1, 'jia' => 1, 'jian' => 1, 'jiang' => 1, 'jiao' => 1, + 'jie' => 1, 'jin' => 1, 'jing' => 1, 'jiong' => 1, 'jiu' => 1, + 'ju' => 1, 'juan' => 1, 'jue' => 1, 'jun' => 1, + 'ka' => 1, 'kai' => 1, 'kan' => 1, 'kang' => 1, 'kao' => 1, + 'ke' => 1, 'kei' => 1, 'ken' => 1, 'keng' => 1, + 'kong' => 1, 'kou' => 1, 'ku' => 1, 'kua' => 1, 'kuai' => 1, + 'kuan' => 1, 'kuang' => 1, 'kui' => 1, 'kun' => 1, 'kuo' => 1, + 'la' => 1, 'lai' => 1, 'lan' => 1, 'lang' => 1, 'lao' => 1, + 'le' => 1, 'lei' => 1, 'leng' => 1, + 'li' => 1, 'lia' => 1, 'lian' => 1, 'liang' => 1, 'liao' => 1, + 'lie' => 1, 'lin' => 1, 'ling' => 1, 'liu' => 1, + 'lo' => 1, 'long' => 1, 'lou' => 1, + 'lu' => 1, 'luan' => 1, 'lun' => 1, 'luo' => 1, + 'lü' => 1, 'lüe' => 1, + 'ma' => 1, 'mai' => 1, 'man' => 1, 'mang' => 1, 'mao' => 1, + 'me' => 1, 'mei' => 1, 'men' => 1, 'meng' => 1, + 'mi' => 1, 'mian' => 1, 'miao' => 1, 'mie' => 1, + 'min' => 1, 'ming' => 1, 'miu' => 1, + 'mo' => 1, 'mou' => 1, 'mu' => 1, + 'na' => 1, 'nai' => 1, 'nan' => 1, 'nang' => 1, 'nao' => 1, + 'ne' => 1, 'nei' => 1, 'nen' => 1, 'neng' => 1, + 'ni' => 1, 'nian' => 1, 'niang' => 1, 'niao' => 1, 'nie' => 1, + 'nin' => 1, 'ning' => 1, 'niu' => 1, 'nong' => 1, 'nou' => 1, + 'nu' => 1, 'nuan' => 1, 'nun' => 1, 'nuo' => 1, + 'nü' => 1, 'nüe' => 1, + 'o' => 1, 'ong' => 1, 'ou' => 1, + 'pa' => 1, 'pai' => 1, 'pan' => 1, 'pang' => 1, 'pao' => 1, + 'pei' => 1, 'pen' => 1, 'peng' => 1, + 'pi' => 1, 'pian' => 1, 'piao' => 1, 'pie' => 1, 'pin' => 1, + 'ping' => 1, 'po' => 1, 'pou' => 1, 'pu' => 1, + 'qi' => 1, 'qia' => 1, 'qian' => 1, 'qiang' => 1, 'qiao' => 1, 'qie' => 1, + 'qin' => 1, 'qing' => 1, 'qiong' => 1, 'qiu' => 1, + 'qu' => 1, 'quan' => 1, 'que' => 1, 'qun' => 1, + 'ran' => 1, 'rang' => 1, 'rao' => 1, 're' => 1, 'ren' => 1, + 'ri' => 1, 'rong' => 1, 'rou' => 1, + 'ru' => 1, 'ruan' => 1, 'rui' => 1, 'run' => 1, 'ruo' => 1, + 'sa' => 1, 'sai' => 1, 'san' => 1, 'sang' => 1, 'sao' => 1, + 'se' => 1, 'sen' => 1, 'seng' => 1, + 'sha' => 1, 'shai' => 1, 'shan' => 1, 'shang' => 1, 'shao' => 1, + 'she' => 1, 'shei' => 1, 'shen' => 1, 'sheng' => 1, 'shi' => 1, + 'shou' => 1, 'shu' => 1, 'shua' => 1, 'shuai' => 1, 'shuan' => 1, + 'shuang' => 1, 'shui' => 1, 'shun' => 1, 'shuo' => 1, + 'si' => 1, 'song' => 1, 'sou' => 1, 'su' => 1, 'suan' => 1, 'sui' => 1, + 'sun' => 1, 'suo' => 1, + 'ta' => 1, 'tai' => 1, 'tan' => 1, 'tang' => 1, 'tao' => 1, + 'te' => 1, 'teng' => 1, + 'ti' => 1, 'tian' => 1, 'tiao' => 1, 'tie' => 1, 'ting' => 1, + 'tong' => 1, 'tou' => 1, + 'tu' => 1, 'tuan' => 1, 'tui' => 1, 'tun' => 1, 'tuo' => 1, + 'wa' => 1, 'wai' => 1, 'wan' => 1, 'wang' => 1, + 'wei' => 1, 'wen' => 1, 'weng' => 1, 'wo' => 1, 'wu' => 1, + 'xi' => 1, 'xia' => 1, 'xian' => 1, 'xiang' => 1, 'xiao' => 1, + 'xie' => 1, 'xin' => 1, 'xing' => 1, 'xiong' => 1, 'xiu' => 1, + 'xu' => 1, 'xuan' => 1, 'xue' => 1, 'xun' => 1, + 'ya' => 1, 'yai' => 1, 'yan' => 1, 'yang' => 1, 'yao' => 1, + 'ye' => 1, 'yi' => 1, 'yin' => 1, 'ying' => 1, + 'yo' => 1, 'yong' => 1, 'you' => 1, + 'yu' => 1, 'yuan' => 1, 'yue' => 1, 'yun' => 1, + 'za' => 1, 'zai' => 1, 'zan' => 1, 'zang' => 1, 'zao' => 1, + 'ze' => 1, 'zei' => 1, 'zen' => 1, 'zeng' => 1, + 'zha' => 1, 'zhai' => 1, 'zhan' => 1, 'zhang' => 1, 'zhao' => 1, + 'zhe' => 1, 'zhei' => 1, 'zhen' => 1, 'zheng' => 1, 'zhi' => 1, + 'zhong' => 1, 'zhou' => 1, 'zhu' => 1, 'zhua' => 1, 'zhuai' => 1, + 'zhuan' => 1, 'zhuang' => 1, 'zhui' => 1, 'zhun' => 1, 'zhuo' => 1, + 'zi' => 1, 'zong' => 1, 'zou' => 1, 'zu' => 1, 'zuan' => 1, + 'zui' => 1, 'zun' => 1, 'zuo' => 1, + ); -my $before_make; # script before run of 'make' -{ - my $at = '@'; - $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}"; -} +######################################################################## +# Unicode variables for utf8 tty (nroff) +######################################################################## -my %at_at; -my $file_gpinyin_test_pl; -my $gpinyin_libdir; - -if ($before_make) { - my $gpinyin_source_dir = $FindBin::Bin; - $at_at{'BINDIR'} = $gpinyin_source_dir; - $at_at{'G'} = ''; - $gpinyin_libdir = '@gpinyin_dir@'; -} else { - $at_at{'BINDIR'} = '@BINDIR@'; - $at_at{'G'} = '@g@'; - $gpinyin_libdir = '@gpinyin_dir@'; - unshift(@INC, $gpinyin_libdir); -} +my %tones1_Unicode = + ( + 'A' => q(\\[u0100]), + 'E' => q(\\[u0112]), + 'I' => q(\\[u012A]), + 'O' => q(\\[u014C]), + 'U' => q(\\[u016A]), + 'Ü' => q(\\[u01D5]), + 'a' => q(\\[u0101]), + 'e' => q(\\[u0113]), + 'i' => q(\\[u012B]), + 'o' => q(\\[u014D]), + 'u' => q(\\[u016B]), + 'ü' => q(\\[u01D6]), + ); + +my %tones2_Unicode = + ( + 'A' => q(\\[u00C1]), + 'E' => q(\\[u00C9]), + 'I' => q(\\[u00CD]), + 'O' => q(\\[u00D3]), + 'U' => q(\\[u00DA]), + 'Ü' => q(\\[u01D7]), + 'a' => q(\\[u00E1]), + 'e' => q(\\[u00E9]), + 'i' => q(\\[u00ED]), + 'o' => q(\\[u00F3]), + 'u' => q(\\[u00FA]), + 'ü' => q(\\[u01D8]), + ); + +my %tones3_Unicode = + ( + 'A' => q(\\[u01CD]), + 'E' => q(\\[u011A]), + 'I' => q(\\[u01CF]), + 'O' => q(\\[u01D1]), + 'U' => q(\\[u01D3]), + 'Ü' => q(\\[u01D9]), + 'a' => q(\\[u01CE]), + 'e' => q(\\[u011B]), + 'i' => q(\\[u01D0]), + 'o' => q(\\[u01D2]), + 'u' => q(\\[u01D4]), + 'ü' => q(\\[u01DA]), + ); + +my %tones4_Unicode = + ( + 'A' => q(\\[u00C0]), + 'E' => q(\\[u00C8]), + 'I' => q(\\[u00CC]), + 'O' => q(\\[u00D2]), + 'U' => q(\\[u00D9]), + 'Ü' => q(\\[u01DB]), + 'a' => q(\\[u00E0]), + 'e' => q(\\[u00E8]), + 'i' => q(\\[u00EC]), + 'o' => q(\\[u00F2]), + 'u' => q(\\[u00F9]), + 'ü' => q(\\[u01DC]), + ); + + +######################################################################## +# glyph variables for troff +######################################################################## + +#my $tone1_macron = '\\[a-]'; +#my $tone2_acute = '\\[aa]'; +#my $tone3_caron = '\\[ah]'; +#my $tone4_grave = '\\[ga]'; +my @accents = ( '', '\\[a-]', '\\[aa]', '\\[ah]', '\\[ga]', ); + +my %tones2_glyphs = + ( + 'A' => q(\\['A]), + 'E' => q(\\['E]), + 'I' => q(\\['I]), + 'O' => q(\\['O]), + 'U' => q(\\['U]), + 'a' => q(\\['a]), + 'e' => q(\\['e]), + '\\[.i]' => q(\\['i]), + 'o' => q(\\['o]), + 'u' => q(\\['u]), + ); + +my %tones4_glyphs = + ( + 'A' => q(\\[`A]), + 'E' => q(\\[`E]), + 'I' => q(\\[`I]), + 'O' => q(\\[`O]), + 'U' => q(\\[`U]), + 'a' => q(\\[`a]), + 'e' => q(\\[`e]), + '\\[.i]' => q(\\[`i]), + 'o' => q(\\[`o]), + 'u' => q(\\[`u]), + ); + + + +######################################################################## +# subs +######################################################################## + +# Pinyin consists of syllables with a final number to be translated +# into an accent. Such numbered syllables are combined into words. +# Such words can have a final punctuation. A line is a collection of +# such words. + +my @roffs = ( 'n', + 't', + ); + +######################################################################## +sub err { + my $s = shift; + print STDERR $s; + 1; +} # err() + + +######################################################################## +sub handle_line { + my $starting_blanks = shift; + my $line = shift; + +#&err('handle_line start: ' . $line); + + my %outline = ( 'n' => $starting_blanks, 't' => $starting_blanks, ); + + # transform to Ü only for inside of Perl + $line =~ s/\\ + \(:U + /Ü/gx; + $line =~ s/\\ + \[:U\] + /Ü/gx; + +# handle_line() + + # transform to ü only for inside of Perl + $line =~ s/\\ + \(:u + /ü/gx; + $line =~ s/\\ + \[:u\] + /ü/gx; + + $line =~ s/U[eE]/Ü/g; + $line =~ s/u[eE]/ü/g; + + $line =~ s/\\\(aq/'/g; # \(aq is an apostrophe + $line =~ s/\\\[aq\]/'/g; # \[aq] is an apostrophe + $line =~ s/^[']//; # remove leading apostrophe + $line =~ s/[']$//; # remove final apostrophe + $line =~ s/['][']+/'/g; # combine apostrophe groups + $line =~ s/([0-4])'/$1/; + $line =~ s/([^0-4])'/${1}0/; + + my @words = split /\s+/, $line; + + +# handle_line() + for my $word ( @words ) { +#&err('handle_line word: ' . $word); + + next unless ( $word ); + + # this is a word, maybe composed of several syllables + my $punctuation = $1 if ( $word =~ s/([,.?!:;]*)$// ); + # '$word' is now without punctuation + + my %outword = &handle_word($word); + next unless ( %outword ); + + for my $roff ( @roffs ) { +#&err('handle_line roff ' . $roff . ': ' . $outword{$roff}); -require 'subs.pl'; + # combine words to line + next unless ( $outword{$roff} ); + + # non-initial space + $outline{$roff} .= ' ' if ( $outline{$roff} ); + + $outline{$roff} .= $outword{$roff}; + $outline{$roff} .= $punctuation; + } + } +#for my $roff ( @roffs ) { +#&err('handle_line end ' . $roff . ': ' . $outline{$roff}); +#} + return %outline; +} # handle_line() + + +######################################################################## +sub handle_word { + my $word = shift; +#&err('handle_word start: ' . $word); + + $word =~ s/5/0/g; # transform 5 to 0 + $word =~ s/([^0-4])$/${1}0/; # add lacking final no-tone + + # remove apostrophes with tone + $word =~ s/ + ([0-4]) + ['] + /$1/gx; + # replace apostrophes without tone by 0 + $word =~ s/ + ([^0-4]) + ['] + /${1}0/gx; + +# handle_word() + # detect wrong tone numbers + if ( $word =~ s/[5-9]/0/g ) { + &err('word ' . $word . ': wrong tone number ' . $1); + return {}; + } + + $word =~ s/[']//g; # remove apostrophes + + # remove starting apostrophe or number + $word =~ s/^(['0-4])+//; + + # add 0 for final no-tone + $word .= '0' if ( $word =~ /[^0-4]$/ ); + + if ( $word =~ /^[0-9]/ ) { # word starts with number + print 'word: ' . $word . ' starts with tone number'; + $word =~ s/^[0-9]+//; + } +#&err('handle_word 0: ' . $word); + +# handle_word() + + my %outword = ( 'n' => '', 't' => '', ); + + # split word into syllables + while ( $word =~ /^[a-zA-ZüÜ']/ ) { + $word =~ s/^([a-zA-ZüÜ']+)([0-4])//; + my $syll = $1; + my $tone = $2; +#err('handle_word split: ' . $syll . ' ' . $tone); + my %outsyll = &handle_syll( $syll, $tone ); + next unless ( %outsyll ); + for my $roff ( @roffs ) { + my $out = $outsyll{$roff}; + $out = '\\[cq]' . $out if ( $out && $out =~ /^[aeo]/ ); + $outword{$roff} .= $out; +#&err('handle_word ' . $roff . ': ' . $outword{$roff}); + } + } + return %outword; +} # handle_word() + + +######################################################################## +sub handle_syll { + my $syll = shift; + my $tone = shift; +#&err( 'handle_syll start: ' . $syll . ' ' . $tone); + + my $lower_case = lc($syll); + $lower_case =~ s/Ü/ü/g; + unless ( exists($syllables{$lower_case}) ) { + err('The syllable ' . $syll . ' is not a Chinese syllable.'); + return {}; + } + + my %outsyll = ( 'n' => '', 't' => '', ); + + if ( $tone == 0 ) { # no accent + # use u umlaut without accent + $syll =~ s/Ü/\\[:U]/g; + $syll =~ s/ü/\\[:u]/g; + + for my $roff ( @roffs ) { + $outsyll{$roff} = $syll; +#&err('handle_syll 0 outsyll ' . $roff . ': ' . $outsyll{$roff}); + } + return %outsyll; + } # end of tone 0 + +# handle_syll() + + # split syllable + $syll =~ + /^ + ([a-zA-Z]*) + ([aeiouAEIOUüÜ]+) + ([a-zA-Z]*) + $/x; + my $initial = $1; + my $vowels = $2; + my $final = $3; + unless ( $vowels ) { + &err( 'Syllable ' . $syll . ' does not have vowels' ); + return {}; + } + + # split vowels + my $vowels_before = ''; + my $vowel = ''; + my $vowels_after = ''; + +# handle_syll() + + # find vowel for accent + if ( $vowels =~ /^[aeiouAEIOU]$/ ) { # only 1 vowel +#&err('handle_syll single vowel ' . $vowels); + $vowel = $vowels; + } elsif ( $vowels eq 'ü' ) { + $vowel = $vowels; + } elsif ( $vowels eq 'Ü' ) { + $vowel = $vowels; + } elsif ( $vowels =~ /^([^aeAE]*)([aeAE])(.*)$/ ) { # a, A, e or E + $vowels_before = $1; + $vowel = $2; + $vowels_after = $3; + } elsif ( $vowels =~ /^([^oO]*)(oO)(.*)$/ ) { # o or O + $vowels_before = $1; + $vowel = $2; + $vowels_after = $3; + } elsif ( $vowels =~ /^(\w)(\w)(.*)$/ ) { # take 2nd vowel + $vowels_before = $1; + $vowel = $2; + $vowels_after = $3; + } else { + &err( 'Unknown vowels: ' . $vowels . ' in syllable: ' . $syll ); + return {}; + } + +# unless ( $vowel =~ /^[aeiouAEIOU]$/ ) { +# print STDERR q(The argument ') . $vowel . q(' is not a vowel!); +# return {}; +# } + +# handle_syll() + + $outsyll{'n'} = &vowel_n($vowel, $tone); + $outsyll{'t'} = &vowel_t($vowel, $tone); + + for my $roff ( @roffs ) { + $outsyll{$roff} = $initial . $vowels_before . + $outsyll{$roff} . $vowels_after . $final; +#&err('handle_syll out ' . $roff . ': ' . $outsyll{$roff}); + } + + return %outsyll; +} # handle_syll() + + +######################################################################## +sub vowel_n { # Unicode for nroff + my $vowel = shift; + my $tone = shift; +#&err('vowel_n: ' . $vowel . ' ' . $tone); + + return '' unless ( $vowel ); + + my $vowel_with_tone; + if ( $tone == 1 ) { # macron + $vowel_with_tone = $tones1_Unicode{$vowel}; + } elsif ( $tone == 2 ) { # acute + $vowel_with_tone = $tones2_Unicode{$vowel}; + } elsif ( $tone == 3 ) { # caron + $vowel_with_tone = $tones3_Unicode{$vowel}; + } elsif ( $tone == 4 ) { # grave + $vowel_with_tone = $tones4_Unicode{$vowel}; + } + $vowel_with_tone or warn "failed to apply tone $tone to vowel $vowel"; + return $vowel_with_tone; +} # vowel_nr() + + +######################################################################## +sub vowel_t { # named glyphs for troff + my $vowel = shift; + my $tone = shift; +#&err( 'vowel_t: ' . $vowel . ' ' . $tone); + + return '' unless ( $vowel ); + + # \o'\s-2\[:u]\s0\[a-]' + if ( $vowel =~ /[üÜ]/ ) { + my ($ue, $smaller); + if ($vowel eq 'ü') { + $ue = q(\\[:u]); + $smaller = 2; + } else { + $ue = q(\\[:U]); + $smaller = 4; + } + $vowel = q(\\o'\\s-) . $smaller . $ue . q(\\s0) . + $accents[$tone] . q('); + return $vowel; + } + + $vowel = q(\\[.i]) if ( $vowel eq 'i' ); + + my $vowel_with_tone; + if ( $tone == 1 ) { # macron + $vowel_with_tone = q(\\o') . $vowel . $accents[$tone] . q('); + } elsif ( $tone == 2 ) { # acute + $vowel_with_tone = $tones2_glyphs{$vowel}; + } elsif ( $tone == 3 ) { # caron + $vowel_with_tone = q(\\o') . $vowel . $accents[$tone] . q('); + } elsif ( $tone == 4 ) { # grave + $vowel_with_tone = $tones4_glyphs{$vowel}; + } + $vowel_with_tone or warn "failed to apply tone $tone to vowel $vowel"; + return $vowel_with_tone; +} # vowel_t() + + +######################################################################## +sub finish_pinyin_mode { +#&err( 'finish' ); + my $n = shift; + my $t = shift; + push @$n, '\\}'; + push @$t, '\\}'; + + for ( @$n ) { # Unicode for nroff + print; + } + + for ( @$t ) { # glyphs for troff + print; + } + + 1; +} # finish_pinyin_mode() ######################################################################## @@ -104,7 +627,7 @@ foreach (@ARGV) { q(pinyin parts in 'roff' files.); exit; } elsif (/^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/) { - print q('gpinyin' version ) . $version; + print "gpinyin ${groff_version}version $version"; exit; } } @@ -126,53 +649,63 @@ my @output_t = # troff '.el \\{\\', ); -foreach (<>) { # get line from input - chomp; - s/\s+$//; # remove final spaces -# &err('gpinyin: ' . $_); - - my $line = $_; # with starting blanks - - # .pinyin start or begin line - if ( $line =~ /^[.']\s*pinyin\s+(start|begin)$/ ) { - if ( $pinyin_mode ) { - # '.pinyin' was started twice, ignore - &err( q['.pinyin' starter was run several times] ); - } else { # new pinyin start - $pinyin_mode = 1; - } +unshift @ARGV, '-' unless @ARGV; +foreach my $filename (@ARGV) { + my $input; + if ($filename eq '-') { + $input = \*STDIN; + } elsif (not open $input, '<', $filename) { + warn $!; next; } + while (<$input>) { + chomp; + s/\s+$//; # remove final spaces +# &err('gpinyin: ' . $_); + + my $line = $_; # with starting blanks + + # .pinyin start or begin line + if ( $line =~ /^[.']\s*pinyin\s+(start|begin)$/ ) { + if ( $pinyin_mode ) { + # '.pinyin' was started twice, ignore + &err( q['.pinyin' starter was run several times] ); + } else { # new pinyin start + $pinyin_mode = 1; + } + next; + } - # .pinyin stop or end line - if ( $line =~ /^[.']\s*pinyin\s+(stop|end)$/ ) { - if ( $pinyin_mode ) { # normal stop - $pinyin_mode = 0; - &finish_pinyin_mode( \@output_n, \@output_t ); - } else { # ignore - &err( 'gpinyin: there was a .pinyin stop without ' . - 'being in pinyin mode' ); + # .pinyin stop or end line + if ( $line =~ /^[.']\s*pinyin\s+(stop|end)$/ ) { + if ( $pinyin_mode ) { # normal stop + $pinyin_mode = 0; + &finish_pinyin_mode( \@output_n, \@output_t ); + } else { # ignore + &err( 'gpinyin: there was a .pinyin stop without ' . + 'being in pinyin mode' ); + } + next; } - next; - } - # now not a .pinyin line + # now not a .pinyin line - if ( $pinyin_mode ) { # within Pinyin - my $starting_blanks = ''; - $starting_blanks = $1 if ( s/^(s+)// ); # handle starting spaces + if ( $pinyin_mode ) { # within Pinyin + my $starting_blanks = ''; + $starting_blanks = $1 if ( s/^(s+)// ); # handle starting spaces - my %outline = &handle_line($starting_blanks, $line); -#&err('gpinyin outline n: ' . $outline{'n'} ); -#&err('gpinyin outline t: ' . $outline{'t'} ); - push @output_n, $outline{'n'}; - push @output_t, $outline{'t'}; - } else { # normal roff line, not within Pinyin - print $line; - } - next; -} # end of input line + my %outline = &handle_line($starting_blanks, $line); +# &err('gpinyin outline n: ' . $outline{'n'} ); +# &err('gpinyin outline t: ' . $outline{'t'} ); + push @output_n, $outline{'n'}; + push @output_t, $outline{'t'}; + } else { # normal roff line, not within Pinyin + print $line; + } + next; + } # end of input line +} ######################################################################## @@ -185,8 +718,8 @@ if ( $pinyin_mode ) { 1; -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: CPerl # End: +# vim: set autoindent textwidth=72: diff --git a/contrib/gpinyin/subs.pl b/contrib/gpinyin/subs.pl deleted file mode 100755 index 1b10869..0000000 --- a/contrib/gpinyin/subs.pl +++ /dev/null @@ -1,576 +0,0 @@ -#! /usr/bin/env perl - -# gpinyin - European-like Chinese writing 'pinyin' into 'groff' - -# Source file position: /contrib/gpinyin/gpinyin.pl -# Installed position: /bin/gpinyin - -# Copyright (C) 2014-2018 Free Software Foundation, Inc. - -# Written by Bernd Warken . - -# This file is part of 'gpinyin', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You can find a copy of the GNU General Public License in the internet -# at . - -######################################################################## - -######################################################################## -# All Pinyin syllables from wikipedia -######################################################################## - -my %syllables = - ( - 'a' => 1, 'ai' => 1, 'an' => 1, 'ang' => 1, 'ao' => 1, - 'ba' => 1, 'bai' => 1, 'ban' => 1, 'bang' => 1, 'bao' => 1, - 'bei' => 1, 'ben' => 1, 'beng' => 1, - 'bi' => 1, 'bian' => 1, 'biao' => 1, 'bie' => 1, 'bin' => 1, - 'bing' => 1, 'bo' => 1, 'bu' => 1, - 'ca' => 1, 'cai' => 1, 'can' => 1, 'cang' => 1, 'cao' => 1, - 'ce' => 1, 'cen' => 1, 'ceng' => 1, - 'cha' => 1, 'chai' => 1, 'chan' => 1, 'chang' => 1, 'chao' => 1, - 'che' => 1, 'chen' => 1, 'cheng' => 1, 'chi' => 1, - 'chong' => 1, 'chou' => 1, 'chu' => 1, - 'chua' => 1, 'chuai' => 1, 'chuan' => 1, 'chuang' => 1, - 'chui' => 1, 'chun' => 1, 'chuo' => 1, - 'ci' => 1, 'cong' => 1, 'cou' => 1, - 'cu' => 1, 'cuan' => 1, 'cui' => 1, 'cun' => 1, 'cuo' => 1, - 'da' => 1, 'dai' => 1, 'dan' => 1, 'dang' => 1, 'dao' => 1, - 'de' => 1, 'dei' => 1, 'den' => 1, 'deng' => 1, - 'di' => 1, 'dian' => 1, 'diao' => 1, 'die' => 1, - 'ding' => 1, 'diu' => 1, 'dong' => 1, 'dou' => 1, - 'du' => 1, 'duan' => 1, 'dui' => 1, 'dun' => 1, 'duo' => 1, - 'e' => 1, 'ei' => 1, 'en' => 1, 'eng' => 1, 'er' => 1, - 'fa' => 1, 'fan' => 1, 'fang' => 1, - 'fei' => 1, 'fen' => 1, 'feng' => 1, 'fiao' => 1, - 'fo' => 1, 'fou' => 1, 'fu' => 1, - 'ga' => 1, 'gai' => 1, 'gan' => 1, 'gang' => 1, 'gao' => 1, - 'ge' => 1, 'gei' => 1, 'gen' => 1, 'geng' => 1, - 'gong' => 1, 'gou' => 1, 'gu' => 1, - 'gua' => 1, 'guai' => 1, 'guan' => 1, 'guang' => 1, 'gui' => 1, - 'gun' => 1, 'guo' => 1, - 'ha' => 1, 'hai' => 1, 'han' => 1, 'hang' => 1, 'hao' => 1, - 'he' => 1, 'hei' => 1, 'hen' => 1, 'heng' => 1, - 'hong' => 1, 'hou' => 1, - 'hu' => 1, 'hua' => 1, 'huai' => 1, 'huan' => 1, 'huang' => 1, - 'hui' => 1, 'hun' => 1, 'huo' => 1, - 'ji' => 1, 'jia' => 1, 'jian' => 1, 'jiang' => 1, 'jiao' => 1, - 'jie' => 1, 'jin' => 1, 'jing' => 1, 'jiong' => 1, 'jiu' => 1, - 'ju' => 1, 'juan' => 1, 'jue' => 1, 'jun' => 1, - 'ka' => 1, 'kai' => 1, 'kan' => 1, 'kang' => 1, 'kao' => 1, - 'ke' => 1, 'kei' => 1, 'ken' => 1, 'keng' => 1, - 'kong' => 1, 'kou' => 1, 'ku' => 1, 'kua' => 1, 'kuai' => 1, - 'kuan' => 1, 'kuang' => 1, 'kui' => 1, 'kun' => 1, 'kuo' => 1, - 'la' => 1, 'lai' => 1, 'lan' => 1, 'lang' => 1, 'lao' => 1, - 'le' => 1, 'lei' => 1, 'leng' => 1, - 'li' => 1, 'lia' => 1, 'lian' => 1, 'liang' => 1, 'liao' => 1, - 'lie' => 1, 'lin' => 1, 'ling' => 1, 'liu' => 1, - 'lo' => 1, 'long' => 1, 'lou' => 1, - 'lu' => 1, 'luan' => 1, 'lun' => 1, 'luo' => 1, - 'lü' => 1, 'lüe' => 1, - 'ma' => 1, 'mai' => 1, 'man' => 1, 'mang' => 1, 'mao' => 1, - 'me' => 1, 'mei' => 1, 'men' => 1, 'meng' => 1, - 'mi' => 1, 'mian' => 1, 'miao' => 1, 'mie' => 1, - 'min' => 1, 'ming' => 1, 'miu' => 1, - 'mo' => 1, 'mou' => 1, 'mu' => 1, - 'na' => 1, 'nai' => 1, 'nan' => 1, 'nang' => 1, 'nao' => 1, - 'ne' => 1, 'nei' => 1, 'nen' => 1, 'neng' => 1, - 'ni' => 1, 'nian' => 1, 'niang' => 1, 'niao' => 1, 'nie' => 1, - 'nin' => 1, 'ning' => 1, 'niu' => 1, 'nong' => 1, 'nou' => 1, - 'nu' => 1, 'nuan' => 1, 'nun' => 1, 'nuo' => 1, - 'nü' => 1, 'nüe' => 1, - 'o' => 1, 'ong' => 1, 'ou' => 1, - 'pa' => 1, 'pai' => 1, 'pan' => 1, 'pang' => 1, 'pao' => 1, - 'pei' => 1, 'pen' => 1, 'peng' => 1, - 'pi' => 1, 'pian' => 1, 'piao' => 1, 'pie' => 1, 'pin' => 1, - 'ping' => 1, 'po' => 1, 'pou' => 1, 'pu' => 1, - 'qi' => 1, 'qia' => 1, 'qian' => 1, 'qiang' => 1, 'qiao' => 1, 'qie' => 1, - 'qin' => 1, 'qing' => 1, 'qiong' => 1, 'qiu' => 1, - 'qu' => 1, 'quan' => 1, 'que' => 1, 'qun' => 1, - 'ran' => 1, 'rang' => 1, 'rao' => 1, 're' => 1, 'ren' => 1, - 'ri' => 1, 'rong' => 1, 'rou' => 1, - 'ru' => 1, 'ruan' => 1, 'rui' => 1, 'run' => 1, 'ruo' => 1, - 'sa' => 1, 'sai' => 1, 'san' => 1, 'sang' => 1, 'sao' => 1, - 'se' => 1, 'sen' => 1, 'seng' => 1, - 'sha' => 1, 'shai' => 1, 'shan' => 1, 'shang' => 1, 'shao' => 1, - 'she' => 1, 'shei' => 1, 'shen' => 1, 'sheng' => 1, 'shi' => 1, - 'shou' => 1, 'shu' => 1, 'shua' => 1, 'shuai' => 1, 'shuan' => 1, - 'shuang' => 1, 'shui' => 1, 'shun' => 1, 'shuo' => 1, - 'si' => 1, 'song' => 1, 'sou' => 1, 'su' => 1, 'suan' => 1, 'sui' => 1, - 'sun' => 1, 'suo' => 1, - 'ta' => 1, 'tai' => 1, 'tan' => 1, 'tang' => 1, 'tao' => 1, - 'te' => 1, 'teng' => 1, - 'ti' => 1, 'tian' => 1, 'tiao' => 1, 'tie' => 1, 'ting' => 1, - 'tong' => 1, 'tou' => 1, - 'tu' => 1, 'tuan' => 1, 'tui' => 1, 'tun' => 1, 'tuo' => 1, - 'wa' => 1, 'wai' => 1, 'wan' => 1, 'wang' => 1, - 'wei' => 1, 'wen' => 1, 'weng' => 1, 'wo' => 1, 'wu' => 1, - 'xi' => 1, 'xia' => 1, 'xian' => 1, 'xiang' => 1, 'xiao' => 1, - 'xie' => 1, 'xin' => 1, 'xing' => 1, 'xiong' => 1, 'xiu' => 1, - 'xu' => 1, 'xuan' => 1, 'xue' => 1, 'xun' => 1, - 'ya' => 1, 'yai' => 1, 'yan' => 1, 'yang' => 1, 'yao' => 1, - 'ye' => 1, 'yi' => 1, 'yin' => 1, 'ying' => 1, - 'yo' => 1, 'yong' => 1, 'you' => 1, - 'yu' => 1, 'yuan' => 1, 'yue' => 1, 'yun' => 1, - 'za' => 1, 'zai' => 1, 'zan' => 1, 'zang' => 1, 'zao' => 1, - 'ze' => 1, 'zei' => 1, 'zen' => 1, 'zeng' => 1, - 'zha' => 1, 'zhai' => 1, 'zhan' => 1, 'zhang' => 1, 'zhao' => 1, - 'zhe' => 1, 'zhei' => 1, 'zhen' => 1, 'zheng' => 1, 'zhi' => 1, - 'zhong' => 1, 'zhou' => 1, 'zhu' => 1, 'zhua' => 1, 'zhuai' => 1, - 'zhuan' => 1, 'zhuang' => 1, 'zhui' => 1, 'zhun' => 1, 'zhuo' => 1, - 'zi' => 1, 'zong' => 1, 'zou' => 1, 'zu' => 1, 'zuan' => 1, - 'zui' => 1, 'zun' => 1, 'zuo' => 1, - ); - -######################################################################## -# Unicode variables for utf8 tty (nroff) -######################################################################## - -my %tones1_Unicode = - ( - 'A' => q(\\[u0100]), - 'E' => q(\\[u0112]), - 'I' => q(\\[u012A]), - 'O' => q(\\[u014C]), - 'U' => q(\\[u016A]), - 'Ü' => q(\\[u016A]), - 'a' => q(\\[u0101]), - 'e' => q(\\[u0113]), - 'i' => q(\\[u012B]), - 'o' => q(\\[u014D]), - 'u' => q(\\[u016B]), - 'ü' => q(\\[u01D6]), - ); - -my %tones2_Unicode = - ( - 'A' => q(\\[u00C1]), - 'E' => q(\\[u00C9]), - 'I' => q(\\[u00CD]), - 'O' => q(\\[u00D3]), - 'U' => q(\\[u00DA]), - 'Ü' => q(\\[u01D7]), - 'a' => q(\\[u00E1]), - 'e' => q(\\[u00E9]), - 'i' => q(\\[u00ED]), - 'o' => q(\\[u00F3]), - 'u' => q(\\[u00FA]), - 'ü' => q(\\[u01D8]), - ); - -my %tones3_Unicode = - ( - 'A' => q(\\[u01CD]), - 'E' => q(\\[u011A]), - 'I' => q(\\[u01CF]), - 'O' => q(\\[u01D1]), - 'U' => q(\\[u01D3]), - 'Ü' => q(\\[u01D9]), - 'a' => q(\\[u01CE]), - 'e' => q(\\[u011B]), - 'i' => q(\\[u01D0]), - 'o' => q(\\[u01D2]), - 'u' => q(\\[u01D4]), - 'ü' => q(\\[u01DA]), - ); - -my %tones4_Unicode = - ( - 'A' => q(\\[u00C0]), - 'E' => q(\\[u00C8]), - 'I' => q(\\[u00CC]), - 'O' => q(\\[u00D2]), - 'U' => q(\\[u00D9]), - 'Ü' => q(\\[u01DB]), - 'a' => q(\\[u00E0]), - 'e' => q(\\[u00E8]), - 'i' => q(\\[u00EC]), - 'o' => q(\\[u00F2]), - 'u' => q(\\[u00F9]), - 'ü' => q(\\[u01DC]), - ); - - -######################################################################## -# glyph variables for troff -######################################################################## - -#my $tone1_macron = '\\[a-]'; -#my $tone2_acute = '\\[aa]'; -#my $tone3_caron = '\\[ah]'; -#my $tone4_grave = '\\[ga]'; -my @accents = ( '', '\\[a-]', '\\[aa]', '\\[ah]', '\\[ga]', ); - -my %tones2_glyphs = - ( - 'A' => q(\\['A]), - 'E' => q(\\['E]), - 'I' => q(\\['I]), - 'O' => q(\\['O]), - 'U' => q(\\['U]), - 'a' => q(\\['a]), - 'e' => q(\\['e]), - 'i' => q(\\['i]), - 'o' => q(\\['o]), - 'u' => q(\\['u]), - ); - -my %tones4_glyphs = - ( - 'A' => q(\\[`A]), - 'E' => q(\\[`E]), - 'I' => q(\\[`I]), - 'O' => q(\\[`O]), - 'U' => q(\\[`U]), - 'a' => q(\\[`a]), - 'e' => q(\\[`e]), - 'i' => q(\\[`i]), - 'o' => q(\\[`o]), - 'u' => q(\\[`u]), - ); - - - -######################################################################## -# subs -######################################################################## - -# Pinyin consists of syllables with a final number to be translated -# into an accent. Such numbered syllables are combined into words. -# Such words can have a final punctuation. A line is a collection of -# such words. - -my @roffs = ( 'n', - 't', - ); - -######################################################################## -sub err { - my $s = shift; - print STDERR $s; - 1; -} # err() - - -######################################################################## -sub handle_line { - my $starting_blanks = shift; - my $line = shift; - -#&err('handle_line start: ' . $line); - - my %outline = ( 'n' => $starting_blanks, 't' => $starting_blanks, ); - - # transform to Ü only for inside of Perl - $line =~ s/\\ - \(:U - /Ü/gx; - $line =~ s/\\ - \[:U\] - /Ü/gx; - -# handle_line() - - # transform to ü only for inside of Perl - $line =~ s/\\ - \(:u - /ü/gx; - $line =~ s/\\ - \[:u\] - /ü/gx; - - $line =~ s/U[eE]/Ü/g; - $line =~ s/u[eE]/ü/g; - - $line =~ s/\\\(aq/'/g; # \(aq is an apostrophe - $line =~ s/\\\[aq\]/'/g; # \[aq] is an apostrophe - $line =~ s/^[']//; # remove leading apostrophe - $line =~ s/[']$//; # remove final apostrophe - $line =~ s/['][']+/'/g; # combine apostrophe groups - $line =~ s/([0-4])'/$1/; - $line =~ s/([^0-4])'/${1}0/; - - my @words = split /\s+/, $line; - - -# handle_line() - for my $word ( @words ) { -#&err('handle_line word: ' . $word); - - next unless ( $word ); - - # this is a word, maybe composed of several syllables - my $punctuation = $1 if ( $word =~ s/([,.?!:;]*)$// ); - # '$word' is now without punctuation - - my %outword = &handle_word($word); - next unless ( %outword ); - - for my $roff ( @roffs ) { -#&err('handle_line roff ' . $roff . ': ' . $outword{$roff}); - - # combine words to line - next unless ( $outword{$roff} ); - - # non-initial space - $outline{$roff} .= ' ' if ( $outline{$roff} ); - - $outline{$roff} .= $outword{$roff}; - $outline{$roff} .= $punctuation; - } - } -#for my $roff ( @roffs ) { -#&err('handle_line end ' . $roff . ': ' . $outline{$roff}); -#} - return %outline; -} # handle_line() - - -######################################################################## -sub handle_word { - my $word = shift; -#&err('handle_word start: ' . $word); - - $word =~ s/5/0/g; # transform 5 to 0 - $word =~ s/([^0-4])$/${1}0/; # add lacking final no-tone - - # remove apostrophes with tone - $word =~ s/ - ([0-4]) - ['] - /$1/gx; - # replace apostrophes without tone by 0 - $word =~ s/ - ([^0-4]) - ['] - /${1}0/gx; - -# handle_word() - # detect wrong tone numbers - if ( $word =~ s/[5-9]/0/g ) { - &err('word ' . $word . ': wrong tone number ' . $1); - return {}; - } - - $word =~ s/[']//g; # remove apostrophes - - # remove starting apostrophe or number - $word =~ s/^(['0-4])+//; - - # add 0 for final no-tone - $word .= '0' if ( $word =~ /[^0-4]$/ ); - - if ( $word =~ /^[0-9]/ ) { # word starts with number - print 'word: ' . $word . ' starts with tone number'; - $word =~ s/^[0-9]+//; - } -#&err('handle_word 0: ' . $word); - -# handle_word() - - my %outword = ( 'n' => '', 't' => '', ); - - # split word into syllables - while ( $word =~ /^[a-zA-ZüÜ']/ ) { - $word =~ s/^([a-zA-ZüÜ']+)([0-4])//; - my $syll = $1; - my $tone = $2; -#err('handle_word split: ' . $syll . ' ' . $tone); - my %outsyll = &handle_syll( $syll, $tone ); - next unless ( %outsyll ); - for my $roff ( @roffs ) { - my $out = $outsyll{$roff}; - $out = '\\[aq]' . $out if ( $out && $out =~ /^[aeo]/ ); - $outword{$roff} .= $out; -#&err('handle_word ' . $roff . ': ' . $outword{$roff}); - } - } - return %outword; -} # handle_word() - - -######################################################################## -sub handle_syll { - my $syll = shift; - my $tone = shift; -#&err( 'handle_syll start: ' . $syll . ' ' . $tone); - - my $lower_case = lc($syll); - $lower_case =~ s/Ü/ü/g; - unless ( exists($syllables{$lower_case}) ) { - err('The syllable ' . $syll . ' is not a Chinese syllable.'); - return {}; - } - - my %outsyll = ( 'n' => '', 't' => '', ); - - if ( $tone == 0 ) { # no accent - # use u umlaut without accent - $syll =~ s/Ü/\\[:U]/g; - $syll =~ s/ü/\\[:u]/g; - - for my $roff ( @roffs ) { - $outsyll{$roff} = $syll; -#&err('handle_syll 0 outsyll ' . $roff . ': ' . $outsyll{$roff}); - } - return %outsyll; - } # end of tone 0 - -# handle_syll() - - # split syllable - $syll =~ - /^ - ([a-zA-Z]*) - ([aeiouAEIOUüÜ]+) - ([a-zA-Z]*) - $/x; - my $initial = $1; - my $vowels = $2; - my $final = $3; - unless ( $vowels ) { - &err( 'Syllable ' . $syll . ' does not have vowels' ); - return {}; - } - - # split vowels - my $vowels_before = ''; - my $vowel = ''; - my $vowels_after = ''; - -# handle_syll() - - # find vowel for accent - if ( $vowels =~ /^[aeiouAEIOU]$/ ) { # only 1 vowel -#&err('handle_syll single vowel ' . $vowels); - $vowel = $vowels; - } elsif ( $vowels eq 'ü' ) { - $vowel = $vowels; - } elsif ( $vowels eq 'Ü' ) { - $vowel = $vowels; - } elsif ( $vowels =~ /^([^aeAE]*)([aeAE])(.*)$/ ) { # a, A, e or E - $vowels_before = $1; - $vowel = $2; - $vowels_after = $3; - } elsif ( $vowels =~ /^([^oO]*)(oO)(.*)$/ ) { # o or O - $vowels_before = $1; - $vowel = $2; - $vowels_after = $3; - } elsif ( $vowels =~ /^(\w)(\w)(.*)$/ ) { # take 2nd vowel - $vowels_before = $1; - $vowel = $2; - $vowels_after = $3; - } else { - &err( 'Unknown vowels: ' . $vowels . ' in syllable: ' . $syll ); - return {}; - } - -# unless ( $vowel =~ /^[aeiouAEIOU]$/ ) { -# print STDERR q(The argument ') . $vowel . q(' is not a vowel!); -# return {}; -# } - -# handle_syll() - - $outsyll{'n'} = &vowel_n($vowel, $tone); - $outsyll{'t'} = &vowel_t($vowel, $tone); - - for my $roff ( @roffs ) { - $outsyll{$roff} = $initial . $vowels_before . - $outsyll{$roff} . $vowels_after . $final; -#&err('handle_syll out ' . $roff . ': ' . $outsyll{$roff}); - } - - return %outsyll; -} # handle_syll() - - -######################################################################## -sub vowel_n { # Unicode for nroff - my $vowel = shift; - my $tone = shift; -#&err('vowel_n: ' . $vowel . ' ' . $tone); - - return '' unless ( $vowel ); - - if ( $tone == 1 ) { # macron - $vowel = $tones1_Unicode{$vowel}; - } elsif ( $tone == 2 ) { # acute - $vowel = $tones2_Unicode{$vowel}; - } elsif ( $tone == 3 ) { # caron - $vowel = $tones3_Unicode{$vowel}; - } elsif ( $tone == 4 ) { # grave - $vowel = $tones4_Unicode{$vowel}; - } - return $vowel; -} # vowel_nr() - - -######################################################################## -sub vowel_t { # named glyphs for troff - my $vowel = shift; - my $tone = shift; -#&err( 'vowel_t: ' . $vowel . ' ' . $tone); - - return '' unless ( $vowel ); - - # \o'\s-2\[:u]\s0\[a-]' - if ( $vowel =~ /[üÜ]/ ) { - my $smaller = 2; - $vowel = q(\\o'\\s-) . $smaller . q(\\[:u]\\s0) . - $accents[$tone] . q('); - return $vowel; - } - - $vowel = q(\\[.i]) if ( $vowel eq 'i' ); - - if ( $tone == 1 ) { # macron - $vowel = q(\\o') . $vowel . $accents[$tone] . q('); - } elsif ( $tone == 2 ) { # acute - $vowel = $tones2_glyphs{$vowel}; - } elsif ( $tone == 3 ) { # caron - $vowel = q(\\o') . $vowel . $accents[$tone] . q('); - } elsif ( $tone == 4 ) { # grave - $vowel = $tones4_glyphs{$vowel}; - } - return $vowel; -} # vowel_t() - - -######################################################################## -sub finish_pinyin_mode { -#&err( 'finish' ); - my $n = shift; - my $t = shift; - push @$n, '\\}'; - push @$t, '\\}'; - - for ( @$n ) { # Unicode for nroff - print; - } - - for ( @$t ) { # glyphs for troff - print; - } - - 1; -} # finish_pinyin_mode() - - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/grap2graph/grap2graph.1.man b/contrib/grap2graph/grap2graph.1.man index bf13d6d..e7e87f3 100644 --- a/contrib/grap2graph/grap2graph.1.man +++ b/contrib/grap2graph/grap2graph.1.man @@ -1,6 +1,8 @@ -.TH GRAP2GRAPH @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -grap2graph \- convert a GRAP diagram into a cropped image +.TH grap2graph @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +grap2graph \- convert a +.I grap +diagram into a cropped image . . .\" ==================================================================== @@ -10,34 +12,58 @@ grap2graph \- convert a GRAP diagram into a cropped image .\" This documentation is released to the public domain. . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_grap2graph_1_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY grap2graph -.OP \-unsafe -.OP \-format output-format -.RI [ convert-arguments ] +.RB [ \-unsafe ] +.RB [ \-format\~\c +.IR output-format ] +.RI [ convert-argument \~.\|.\|.] .YS . +. .SY grap2graph .B \-\-help .YS . +. .SY grap2graph .B \-v +. .SY grap2graph .B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . .I grap2graph reads a -.IR grap (1) +.MR grap 1 program from the standard input and writes an image file, by default in Portable Network Graphics (PNG) format, to the standard output. @@ -47,11 +73,11 @@ to the standard output. The input GRAP code should .I not be wrapped with the -.B \&.G1 +.B .G1 and -.B \&.G2 +.B .G2 macros that normally guard it within -.IR groff (@MAN1EXT@) +.MR groff @MAN1EXT@ documents. . . @@ -65,7 +91,7 @@ documents. Arguments not recognized by .I grap2graph are passed to the ImageMagick or GraphicsMagick program -.IR \%convert (1). +.MR convert 1 . . . By specifying these, you can give your image a border, @@ -84,11 +110,21 @@ pixels. . . .\" ==================================================================== -.SH OPTIONS +.SH Options .\" ==================================================================== . +.B \-\-help +displays a usage message, +while +.B \-v +and +.B \-\-version +show version information; +all exit afterward. +. +. .TP -.BI "\-format " output-format +.BI \-format\~ output-format Write the image in .IR output-format , which must be understood by @@ -97,11 +133,6 @@ the default is PNG. . . .TP -.B \-\-help -Display a usage message and exit. -. -. -.TP .B \-unsafe Run .I groff @@ -116,15 +147,8 @@ The default is to forbid this. . . -.TP -.B \-v -.TQ -.B \-\-version -Display version information and exit. -. -. .\" ==================================================================== -.SH ENVIRONMENT +.SH Environment .\" ==================================================================== . .TP @@ -144,32 +168,38 @@ is used. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== . -.B grap2graph +.I grap2graph was written by -.MT esr@\:thyrsus.com +.MT esr@\:thyrsus\:.com Eric S.\& Raymond .ME , based on a recipe for -.IR pic2graph (@MAN1EXT@), +.MR pic2graph @MAN1EXT@ , by W.\& Richard Stevens. . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.IR pic2graph (@MAN1EXT@), -.IR eqn2graph (@MAN1EXT@), -.IR grap (1), -.IR @g@pic (@MAN1EXT@), -.IR groff (@MAN1EXT@), -.IR \%convert (1) +.MR pic2graph @MAN1EXT@ , +.MR eqn2graph @MAN1EXT@ , +.MR grap 1 , +.MR @g@pic @MAN1EXT@ , +.MR groff @MAN1EXT@ , +.MR convert 1 +. +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_grap2graph_1_man_C] +.do rr *groff_grap2graph_1_man_C . . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/grap2graph/grap2graph.am b/contrib/grap2graph/grap2graph.am index f00ebfd..6025aa2 100644 --- a/contrib/grap2graph/grap2graph.am +++ b/contrib/grap2graph/grap2graph.am @@ -1,6 +1,4 @@ -# Copyright (C) 2003-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright (C) 2003-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -35,8 +33,8 @@ grap2graph: $(grap2graph_srcdir)/grap2graph.sh && chmod +x $@ -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/groff_filenames/ChangeLog b/contrib/groff_filenames/ChangeLog deleted file mode 100644 index 09ec3a8..0000000 --- a/contrib/groff_filenames/ChangeLog +++ /dev/null @@ -1,108 +0,0 @@ -2015-08-22 Bernd Warken - - * groff_filenames.5.man: Use section 5 within this man-page. - -2015-08-22 Bernd Warken - - * groff_filenames.5.man: Rename `groff_filenames.1.man'. - - * groff_filenames.am: Include section changing. - -2015-08-22 Bernd Warken - - * groff_filenames.1.man: Rename `groff_filenames.man'. - - * groff_filenames.am: Include renaming. - -2015-08-05 Bernd Warken - - * groff_filenames.am: Add `Last update'. Setup Emacs mode. - -2015-04-03 Werner LEMBERG - - * groff_filenames.man: Make it work in compatibility mode. - -2014-09-03 Bernd Warken - - * groff_filenames.man, Makefile.sub: Repair copying and Emacs - setup. - -2014-08-31 Bernd Warken - - * groff_filenames.man: Replace Heirloom links to more actual - places. Create macro definitions for authors and copying. - -2014-08-30 Bernd Warken - - * groff_filenames.man: Add extension `.1b' for `heirloom' - man-pages. - -2014-07-06 Bernd Warken - - * groff_filenames.man: Make it compatible to doclifter. - -2014-07-04 Bernd Warken - - * groff_filenames.man: Transform to classical man-page style. - -2014-01-06 Bernd Warken - - * Makefile.sub: fix this file - -2014-01-05 Bernd Warken - - * runoff.man: remove this file - - * groff/contrib/RUNOFF: rename this directory to - `groff/contrib/groff_filenames' - - * Makefile.sub: change this file correspondingly - -2013-07-31 Bernd Warken - - Fix RUNOFF - -2013-06-17 Bernd Warken - - Remove files *~ - -2013-06-17 Bernd Warken - - * groff_filenames.man: Corrections. - -2013-06-17 Bernd Warken - - * groff_filenames.man: Extension. - -2013-05-14 Bernd Warken - - * runoff.man: Major rewrite, due to good documentation of 1974, - especially for text lines. - -2013-05-05 Bernd Warken - - New `groff' project: `RUNOFF', which is the predecessor of `roff'. - - * ChangeLog: New file for the `contrib' source. - - * Makefile.sub: New `make' file, so far only for 2 man-files. - - * runoff.man: New file which documents the `RUNOFF' language from - the 1960s up to the 1980s. - - * groff_filenames.man: New file about the file name extensions - since `RUNOFF'. - -######################################################################## - -Copyright 2013-2018 Free Software Foundation, Inc. - -Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. - -Local Variables: -version-control: never -mode: change-log -coding: utf-8 -End: diff --git a/contrib/groff_filenames/groff_filenames.5.man b/contrib/groff_filenames/groff_filenames.5.man deleted file mode 100644 index 8f87abe..0000000 --- a/contrib/groff_filenames/groff_filenames.5.man +++ /dev/null @@ -1,656 +0,0 @@ -.TH GROFF_FILENAMES @MAN5EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -groff_filenames \- filename extensions for roff and groff -. -.\" ad l -.\" ==================================================================== -.\" Legal Terms -.\" ==================================================================== -.\" -.\" Copyright (C) 2013-2018 Free Software Foundation, Inc. -.\" -.\" This file is part of groff, a free software project. You can -.\" redistribute it and/or modify it under the terms of the GNU General -.\" Public License version 2 (GPL2) as published by the Free Software -.\" Foundation (FSF). -.\" -.\" The license text can be found in the internet at -.\" . -. -. -.\" ==================================================================== -.SH DESCRIPTION -.\" ==================================================================== -. -Since the evolution of -.I roff -in the 1970s, a whole bunch of filename extensions for -.I roff -files were used. -. -. -.P -The -.I roff -extensions refer to preprocessors or macro packages. -. -These extensions are fixed in all -.IR Unix \-like -operating systems. -. -. -.P -Later on, -.B groff -added some more extensions. -. -This -.I man page -is about these filename extensions. -. -. -.\" ==================================================================== -.SH COMPRESSION OF ROFF FILES -.\" ==================================================================== -. -Each -.I roff -file can be optionally -.IR compressed . -. -That means that the -.I total filename -ends with a -.IR "compressor name" . -. -So the whole filename has the structure -.IR . [ . ] . -. -. -.P -Best-known are the -.I compressor extensions -.BR .Z , -.BR .gz , -and -.BR .bzip2 . -. -Relatively new is -.BR .xz . -. -. -.P -From now on, we will ignore the -.I compressions -and only comment the structure -.IB . \fR.\fP -. -. -.\" ==================================================================== -.SH MAN PAGES -.\" ==================================================================== -. -The -.I Unix manual pages -are widely called -.IR "man pages" . -. -The -.I man page -style is the best known part of the -.I roff -language. -. -. -.P -The extensions for -.I man -should be better documented. -. -So this is documented here. -. -. -.P -Files written in the -.I man -language use the following extension: -.BI *.
[] \fR.\fP -. -. -.\" ==================================================================== -.SS Man page Sections -.\" ==================================================================== -. -The traditional -.I man page
-is a digit from -.B 1 -to -.BR 8 . -. -. -.TP -.IB .1 -.TQ -.IB .2 -.TQ -.IB .3 -.TQ -.IB .4 -.TQ -.IB .5 -.TQ -.IB .6 -.TQ -.IB .7 -.TQ -.IB .8 -Classic man page -.IR sections . -. -. -.P -.\" NOTE: There was once a feeble attempt in this direction, but it -.\" hasn't been true in any sense for a long time. -.\"Linux added the section number -.\".B 9 -.\"for kernel man pages. -.\". -.\". -.\".TP -.\".IB .9 -.\".I Linux -.\"kernel man pages -.\". -.\". -.P -In older commercial -.I Unix -systems, the 3 characters -.BR l , -.BR n , -and -.B o -were also used as -.I section -names. -. -This is today -.IR deprecated , -but there are still documents in this format. -. -. -.TP -.IB .l -.TQ -.IB .n -.TQ -.IB .o -.I Deprecated -man page sections, which stood for \[lq]local\[rq], \[lq]new\[rq], and -\[lq]old\[rq], respectively. -. -. -.\" ==================================================================== -.SS Man page Group Extensions -.\" ==================================================================== -. -The -.I -extension in -.BI .
[] -is optional, but it can be any string of word characters. -. -Usually programmers use a group name that is already used, e.g.\& -.B x -for -X Window System -documents or -.B tcl -to refer to the -.I Tcl -programming language. -. -. -.P -Examples: -. -. -.TP -.B groff.1 -is the man page for -.B groff -in -.I section -.B 1 -without a -.I group -. -. -.TP -.B xargs.1posix.gz -is the man page for the program -.B xargs -in -.I section -.B 1 -and -.I group -.BR posix ; -moreover it is -.I compressed -with -.B gz -.RB ( gzip ). -. -. -.TP -.B config.5ssl -.I "OpenSSL CONF" -library configuration files from -.I section -.B 5 -with -.I group -.BR ssl . -. -. -.TP -.B dpkg\-reconfigure.8cdebconf -man page for the program -.B dpkg\-reconfigure -in -.I section -.B 8 -and -.I group -.BR cdebconf . -. -. -.\" ==================================================================== -.SS Source of man pages -.\" ==================================================================== -. -There are 2 -.I roff -languages for writing man pages: -.B man -and -.BR mdoc . -. -. -.P -The names of these 2 styles are taken as -.I extensions -for the source code files of man pages in the -.I groff -package. -. -. -.TP -.IB .man -.I traditional -Unix-like man page format within groff source files. -. -. -.TP -.IB . n -A temporary man page file produced from a -.IB name .man -man page by a run of -.B make -within the -.B groff -source package. -. -. -.TP -.IB .mdoc -Man page format in BSD. -. -. -.TP -.IB .1b -Man page format in -.IR "heirloom roff ". -. -. -.TP -.IB .mandoc -Files using this extension recognize both man page formats in -.B groff -and other processors. -. -. -.\" ==================================================================== -.SH TRADITIONAL TROFF EXTENSIONS -.\" ==================================================================== -. -.\" ==================================================================== -.SS Files Using Macro Packages -.\" ==================================================================== -. -The -.I "classical roff" -languages were interpreted by the traditional -.B "troff" -and -.B "nroff" -programs. -. -. -.P -There were several -.I roff -languages, each represented by a -.IR "macro-package" . -. -Each of these provided a suitable file name -.IR extension : -. -. -.TP -.IB .me -.I roff -file using the -.B me -.IR "macro package" . -. -. -.TP -.IB .mm -.I roff -file using the -.B mm -.I macro package -. -. -.TP -.IB .ms -.I roff -file using the -.B ms -.I macro package -. -. -.P -All of these classical -.I roff -languages and their extensions are still very active in -.BR groff . -. -. -.\" ==================================================================== -.SS Source Code for Macro Packages (TMAC Files) -.\" ==================================================================== -. -In traditional -.I roff -the source code for the macro packages was stored in -.I TMAC -files. -. -Their file names have the form: -. -. -.TP -.BI tmac. \fR,\fP -.I -is the name of the macro package without the leading -.B m -character, which is reintegrated by the option -.BR -m . -. -. -.P -For example, -.B tmac.an -is the source for the -.B man -macro package. -. -. -.P -In the -.B groff -source, more suitable file names were integrated, see later on. -. -. -.\" ==================================================================== -.SS Preprocessors -.\" ==================================================================== -. -Moreover, the following -.I preprocessors -were used as filename extension: -. -. -.TP -.IB .chem -for the integration of chemical formulas -. -. -.TP -.IB .eqn -for the mathematical use of equations -. -. -.TP -.IB .pic -graphical tool -. -. -.TP -.IB .tbl -for tables with -.I tbl -. -. -.TP -.IB .ref -for files using the -.B prefer -.I preprocessor -. -. -.\" ==================================================================== -.SS Classical Roff Files -.\" ==================================================================== -. -.TP -.IB .t -.TQ -.IB .tr -for files using the -.I roff -language of any kind -. -. -.\" ==================================================================== -.SH NEW GROFF EXTENSIONS -.\" ==================================================================== -. -.I "GNU roff" -.B groff -is the actual -.I roff -standard, both for classical -.I roff -and new extensions. -. -So even the used new extensions in the source code should be regarded -as actual standard. -. -The following extensions are used instead of classical -.B .t -or -.BR .tr : -. -. -.TP -.IB .groff -.TQ -.IB .roff -general ending for files using the -.I groff language -. -. -.\" ==================================================================== -.SS Source Code for Macro Packages (TMAC Files) -.\" ==================================================================== -. -As the classical form -.BI tmac. \fR,\fP -of the -.I TMAC -file names is quite strange, -. -.I groff -added the following structures: -. -. -.TP -.IB .tmac -.TQ -.BI m .tmac -.TQ -.BI groff_m .tmac -. -. -.\" ==================================================================== -.SS Files Using new Macro Packages -.\" ==================================================================== -. -.I Groff -uses the following new macro packages: -. -. -.TP -.IB .mmse -file with swedish -.B mm -.I macros -for -.B groff -. -. -.TP -.IB .mom -files written in the -.I "groff macro package" -.B mom -. -. -.TP -.IB .www -files written in -.BR HTML -like -.I groff -.IR macros . -. -. -.\" ==================================================================== -.SS Preprocessors and Postprocessors -.\" ==================================================================== -. -.TP -.IB .hdtbl -Heidelberger tables, an alternative to the preprocessor -.IR tbl . -. -See -.BR groff_hdtbl (@MAN7EXT@). -. -. -.TP -.IB .grap -files written for the graphical -.B grap -processor. -. -. -.TP -.IB .grn -for including -.BR gremlin (@MAN1EXT@), -pictures, see -.BR grn (@MAN1EXT@). -. -. -.TP -.IB .pdfroff -transform this file with -.B pdfroff -of the -.I groff -system -. -. -.\" ==================================================================== -.SH AUTHORS -.\" ==================================================================== -This document was written by -.MT groff\-bernd.warken\-72@\:web.de -Bernd Warken -.ME . -. -. -.\" ==================================================================== -.SH "SEE ALSO" -.\" ==================================================================== -. -. -.TP -History and future -.BR roff (@MAN7EXT@), -.BR man\-pages (@MAN7EXT@), -.BR groff_diff (@MAN7EXT@), -.BR groff (@MAN7EXT@) -. -. -.TP -.I Compression -.BR uncompress (1posix), -.BR gzip2 (@MAN1EXT@), -.BR bzip2 (@MAN1EXT@), -.BR xz (@MAN1EXT@) -. -. -.P -A man page of the naming form -.IB name ( n ) -can be read in text mode by -.RS -.EX -.BI man " n name" -.EE -.RE -or in graphical mode (PDF) by -.RS -.EX -.BI groffer " n name" -.EE -.RE -. -. -.P -.UR https://\:github.com/\:n\-t\-roff/\:heirloom\-doctools -.I Gunnar Ritter's Heirloom roff project -.UE . -. -You can get this package with the shell command: -.RS -.EX -\(Do \fBgit clone https://github.com/n\-t\-roff/heirloom\-doctools\fP -.EE -.RE -. -. -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== -. -.\" Local Variables: -.\" mode: nroff -.\" End: -.\" vim: set filetype=groff: diff --git a/contrib/groff_filenames/groff_filenames.am b/contrib/groff_filenames/groff_filenames.am deleted file mode 100644 index 52b88fa..0000000 --- a/contrib/groff_filenames/groff_filenames.am +++ /dev/null @@ -1,43 +0,0 @@ -# Automake rules for 'groff_filenames' - -# File position: /contrib/groff_filenames/groff_filenames.am - -# Copyright (C) 2013-2018 Free Software Foundation, Inc. - -# Last update: 22 Aug 2015 - -# Written by Bernd Warken . -# Automake migration by Bertrand Garrigues - -# This file is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -######################################################################## - -man5_MANS += contrib/groff_filenames/groff_filenames.5 -EXTRA_DIST += \ - contrib/groff_filenames/ChangeLog \ - contrib/groff_filenames/groff_filenames.5.man - - -######################################################################## -# Editor settings -######################################################################## -# -# Local Variables: -# mode: makefile-automake -# fill-column: 72 -# End: -# vim: set filetype=automake textwidth=72: diff --git a/contrib/groffer/ChangeLog b/contrib/groffer/ChangeLog deleted file mode 100644 index 3aef914..0000000 --- a/contrib/groffer/ChangeLog +++ /dev/null @@ -1,564 +0,0 @@ -2018-04-24 G. Branden Robinson - - * version.sh: Bump groffer version to 2.3.0, reflecting Bernd's - addition of the xhtml device/mode feature in 2015. This - change extended the interface of the groffer - program--backwards-compatibly--e.g., by adding the '--xhtml' - option. - -2018-04-24 G. Branden Robinson - - * version.sh (_GROFF_VERSION_PRESET): Set to 1.22.4. - -2018-02-28 Werner LEMBERG - - * groffer.am (groffer): Use $(AM_V_GEN) to silence file generation. - -2015-08-27 Bernd Warken - - * *.pl: Add device (mode) `xhtml'. - - * groffer.1.man: Add documentation for device `xhtml'. - -2015-08-27 Bernd Warken - - * groffer.1.man: Correct the documentation for `--viewer'. - -2015-08-05 Bernd Warken - - * groffer.1.man: Rename `groffer.man'. - - * roff2.1.man: Rename `roff2.man'. - - * groffer.am: Include renamings. - -2015-08-05 Bernd Warken - - * groffer.am: Add `Last update'. Setup Emacs mode. - -2015-04-04 Werner LEMBERG - - * roff2.man (EL): Fix typo. - -2015-04-04 Werner LEMBERG - - * roff2.man: Make it work in compatibility mode. - -2015-04-04 Werner LEMBERG - - * groffer.man: Make it work in compatibility mode. - (EL): Fix typo. - -2015-03-20 Werner LEMBERG - - * subs.pl (where_is_prog): Fix typo. - -2014-11-04 Werner LEMBERG - - * version.sh (_GROFF_VERSION_PRESET): Set to 1.22.3. - -2014-09-03 Bernd Warken - - * version.sh: Version 2.2.5 - - * all groffer files: Copying and Emacs setup. - -2014-08-02 Bernd Warken - - * version.sh: Version 2.2.4 - - * groffer.pl: Change default `tty' to `utf8'. - -2014-08-02 Bernd Warken - - Version 2.2.3 - -2014-07-06 Bernd Warken - - * subs.pl: Correct call for `grog'. - -2014-07-06 Bernd Warken - - * groffer.man, roff2.man: Make compatible with `doclifter'. - -2014-07-05 Bernd Warken - - * main_subs.pl: Add newer `groff' options `j' and `J'. - -2014-07-04 Bernd Warken - - * groffer.man, roff2.man: Transform to classical man-page style. - -2014-07-04 Bernd Warken - - * version.sh: New version 2.2.2 - - * groffer.man: Rename `.Env_var' to `.Small_CB'. - -2014-07-03 Bernd Warken - - * roff2.man: Move `.TH', etc. to the beginning of the file. - - * groffer.man: Improve definition of char `Ellipsis'. - -2014-07-03 Bernd Warken - - * groffer.tmac: Remove this file. - - * Makefile.sub: Remove parts related to `groffer.tmac'. - - * groffer.man: Instead of `.mso' for `groffer.tmac' copy former - `groffer.tmac' at the head of the man-page. - -2014-06-18 Bernd Warken - - * Makefile.sub: Let `groffer.tmac' be removed in uninstalling - `tmacdir'. - - * groffer.man: Use `.mso' for `groffer.tmac'. Remove definitions - for macros, etc. - -2014-06-18 Bernd Warken - - * version.sh: New version 2.2.1. - - * groffer.tmac: Collection of strings and macros for `groffer.man' - and other man-pages. - - * Makefile.sub: Add `groffer.tmac'. - -2014-06-18 Bernd Warken - - * version.sh: Upgrade to version 2.1.3. - - * perl_test.pl: Remove this file. - - * Makefile.sub: Remove HAS_PERL. - - * groffer.pl: Add `require' for Perl version. - -2014-06-11 Bernd Warken - - * func.pl, subs.pl: Rename `func.pl' to `subs.pl'. - - * groffer.pl, main_subs.pl: Move all subs in `groffer.pl' to - `main_subs.pl'. - - * version.sh: Upgrade to version 2.1.2. - -2014-06-01 Bernd Warken - - * groffer.pl: Fix ligature error `fi', etc. in pdf-mode by - appending `-P-y -PU' to `grog' call. pfd2-mode works, but still - has the ligature error. - - * func.pl: Reorder. - - * version.sh: Upgrade to version 2.1.1. - -2014-06-01 Deri James - - * Proposal to use `-P-y -PU' arguments for `groff' in `-Tpdf'. - -2014-05-31 Bernd Warken - - * groffer.pl, func.pl, groffer.man: Change all existing viewer - options into a single one `--viewer'. - - * version.sh: Upgrade to version 2.1.0. - -2014-03-30 Steffen Nurpmeso - - * Makefile.sub: Put straight error-prevention prefixes for `rm'. - -2014-03-30 Steffen Nurpmeso - - * Makefile.sub (uninstall_sub): Typo. - -2014-03-27 Werner LEMBERG - - Fix `make install'. - - * Makefile.sub (GROFFER_PERL, GROFFER_REST): Don't use $(srcdir). - -2014-03-11 Ingo Schwarze (tiny change) - - * Makefile.sub (clean): Don't remove checked-in file `groffer.man'. - - This got broken in fabbbb0e335801bc20f5c25fb0c448e23673721d when - `groffer.man' was moved from the former `perl' subdir and the cp(1) - call was removed that used to copy it around. - -2014-02-26 Bernd Warken - - * Makefile.sub: fix - -2014-02-26 Bernd Warken - - * groffer.pl: Fix modes pdf and pdf2. - -2014-02-25 Bernd Warken - - * groffer.pl: fix source location, when run before `make' - -2014-02-25 Bernd Warken - - * groffer.man: replace .copyleft by .co - -2014-02-25 Bernd Warken - - * all former Perl files: Correct source file position. - -2014-02-25 Bernd Warken - - * all: Add links for license text. - -2014-02-25 Bernd Warken - - * version.sh: new version groffer 2.0.2 - * perl/: Move all files to top directory and remove this - directory. - * Makefile.sub: Handle the deletion of perl/. - * groffer.pl: Rename traditional pdf mode with ps2pdf into pdf2. - Create a new mode pdf using groff -Tpdf. New options: --pdf2, - --mode=pdf2. - * groffer.man: Document the renamed and new options. - * README, README_PERL: rewrite - -2013-12-23 Bernd Warken - - New version groffer-2.0.1 - - with Perl - - without Shell version - - Remove - * shell/ChangeLog.0 - * shell/README_SH - * shell/groffer.man - * shell/groffer.sh - * shell/groffer2.sh - * shell/roff2.sh - * shell/ - - * README: remove hints to the shell version - * Makefile.sub: remove hints to the shell version - * version.sh: change version number to `2.0.1' - * .cvsignore, .gitignore: rename `.cvsignore' to `.gitignore' - -2013-12-22 Bernd Warken - - * git@github.com:RUNOFF/groffer.git: remove this archive - -2013-04-11 Bernd Warken - - * contrib/groffer: There is now a free `git' package containing - all old `groffer' versions `v0.*' and `v1.*'. The new versions - `groffer 2.*' will actually not be included. This package can be - got at: - - $ git clone git@github.com:RUNOFF/groffer.git - -2013-03-29 Bernd Warken - - * perl/groffer.pl: Change viewers for `PS'. - -2013-03-29 Bernd Warken - - * perl/groffer.pl: Change viewers for `PS' and `PDF'. - - * version.sh: New version is `1.1.3'. - -2012-08-09 Werner LEMBERG - - Synchronize man pages. - - * perl/groffer.man, shell/groffer.man: Fix many minor issues. - -2012-08-07 Eric S. Raymond - - Yet more elimination of low-level troff hackery in the - documentation so it can be lifted to structural markup. - - * perl/groffer.man: Use .IP rather than .TP in - .Topic; this make structural parsing work. Also remove a - pointless and somewhat out-of-date .ig section. - -2011-10-17 Ingo Schwarze - - Do not use INSTALL_DATA and INSTALL_SCRIPT during build phase. - - * Makefile.sub (groffer): Replace INSTALL_DATA and - INSTALL_SCRIPT with `cp'. Otherwise the build phase might - fail with `permission denied' if you use the `-o root' flag - of the `install' command. The use of INSTALL_* is an abuse - anyway because it's not installing anything at that point; - it's just copying files around locally, within in the build - directories. - -2011-03-21 Jan Vcelak - Bernd Warken - - Remove hardcoded path to 'libdir/groff/groffer' directory. - - * Makefile.sub: use @groffer_dir@ - - * groffer.pl: use @groffer_dir@ - -2011-01-27 James Budiono - Bernd Warken - - Fix display of manpages. - - Reported as - http://lists.gnu.org/archive/html/bug-groff/2011-01/msg00015.html. - - * perl/groffer.pl (_get_first_prog): Fix return value. - (Viewer_X): Add `okular' viewer. - * perl/man.pl (manpath_set_from_path): Handle `@main::Path)' - correctly. - - * version.sh: Updated. - -2009-01-03 Werner LEMBERG - - * version.sh: Prepare for groff release 1.20. - -2008-01-04 Werner LEMBERG - - * shell/groffer.man, perl/groffer.man: Insert `\:' in URLs where - appropriate. - -2007-02-15 Eric S. Raymond - - * perl/groffer.man, perl/groffer.man: Fix non-portable `if' - expressions. - -2007-02-13 Eric S. Raymond - - Use an-ext.tmac macros in groffer.man. - - * perl/groffer.man, perl/groffer.man: Replace ShellCommand with - .EX/.EE pairs. - Don't use .TP for examples, as some viewers won't handle a display - macro as a tag line. Use .SY/.OP/.YS rather than elaborate custom - macros. - -2007-02-02 Werner LEMBERG - - * roff2.man: Further refinements and normalizations. - -2007-02-02 Eric S. Raymond - - * roff2.man: Converted to use .SY/.OP/.YS and for cross-viewer - portability. Conversion checked using the protocol described in - tmac/TESTING-HINTS. - -2006-11-14 Werner LEMBERG - - * Makefile.sub (GROFFER_REST): Add roff2.man. - (groffer): Use $(INSTALL_DATA) for man pages. - Don't call `chmod' for $(ROFF2PROGS). - (roff2.man): Typographical fixes. - -2006-11-11 Bernd Warken - ________________________________________________________________ - * release of groffer 1.1.1 - - * perl/roff2.pl, shell/roff2.sh: Create a new working mode without - `groffer' for `roff2*'. - - * perl/groffer.pl: Fix test of temporary directory. - -2006-11-09 Bernd Warken - ________________________________________________________________ - * release of groffer 1.1.0 - - * perl/groffer.pl, perl/func.pl, perl/groffer.man, \ - shell/groffer2.sh, shell/groffer.man: Add `--debug-grog' to - display the `grog' output. - - * perl/roff2.pl, shell/roff2.sh: New files for creating the roff2* - programs to transform roff code to different formats. - - * roff2.man: New file to create man pages for the roff2* - programs. - - * Makefile.sub: Add roff2* and some minor fixes. - -2006-11-04 Bernd Warken - ________________________________________________________________ - * release of groffer 1.0.3 - - * Makefile.sub: - - Delete removing of $(CLEANADD) in `groffer'. - - Add $(MAN1) to `groffer'. - - * perl/groffer.pl, perl/func.pl, shell/groffer2.sh: - - Add `groff' option with argument `-K'. - - Redesign the changed `grog'. - -2006-10-23 Bernd Warken - ________________________________________________________________ - * release of groffer 1.0.2 - - * perl/groffer.pl: - - Move all variable declarations out of BEGIN. - - Move all `use' commands outside of BEGIN. Fix the arising - errors. - - Correct new position of perl/perl_test.pl. - - * perl/func.pl: - - version(): Fix the determination of the version of groff. - - usage(): Sort it among the functions in this file. - - * perl/groffer.man, shell/groffer.man: Fix string variable - Ellipsis. - - * shell/README_SH: Add information on Autobook. - - * shell/groffer.sh: - - Extent simple shell tests by testing on support for functions. - Test standard shell on function support. Add error reports on - shell tests. - - Set unset variables LANG LC_ALL LC_MESSAGES LC_CTYPES LANGUAGES - to `C', according to Autobook, ch. 22. - - Remove option `-e' from `sed'. - - * shell/groffer2.sh: - - Add test on directory in man path find. - - Add Bourne compatibility for zsh shell. - - Replace `echo -n ""' by `:'. - - Remove -e option from sed. - -2006-10-23 Werner Lemberg - - * perl_test.pl: Moved to... - * perl/perl_test.pl: Here. - - * Makefile.sub: Rewritten. Change PERL to HAVE_PERL and SHELL to - HAVE_SHELL. - -2006-10-14 Bernd Warken - ________________________________________________________________ - * release of groffer 1.0.1 - - * perl/groffer.pl: Change $perl_test_pl to $file_perl_test_pl. - - * perl/groffer.pl, perl/func.pl: Remove `\n' in `die' calls. - -2006-10-12 Bernd Warken - ________________________________________________________________ - * release of groffer 1.0.0 - - Changements of the shell version since 0.9.31 - - * shell/groffer.sh: Use version.sh in the upper directory. - -2006-10-02 Bernd Warken - - The groffer versions 1.* have two kinds of program, a shell - version and a Perl version. - - The shell version is kept from the old shell only versions of - groffer 0.*. Most of the former files in the main groffer - directory are now moved to the subdirectoy shell/. - - The Perl version of groffer is a complete rewrite; most of its - files are found in the subdirectory perl/. - - The Makefile.sub decides whether the shell or Perl version of - groffer is installed. This is done by the program perl_test.pl. - - In the following, all files in the groffer directory tree are - mentioned. - - * ChangeLog: This file. It contains information for `groffer' - versions >= 1.0.0 with shell and Perl kinds. For older `groffer' - versions, see `shell/ChangeLog.0' which contains information for - the shell only versions of groffer 0.*. - - * Makefile.sub: The old `Makefile.sub' was extended to support the - shell and the Perl version of `groffer' at the same time. If the - test of `perl_test.pl' succeeds the `groffer' Perl version will be - installed, otherwise the shell version is used. - - * perl_test.pl: This is used by `Makefile.sub' and installed with - the Perl version of `groffer'. It is a test of the installed perl - version. The installed Perl version should be greater or equal - than the version that is required by this file. - - * version.sh: This is the old file kept from the shell version of - `groffer'. It stores the `groffer' version, the date of the last - update, and the `groff' version. It is used and installed for the - shell and Perl version of `groffer'. - - * README: This is the old `README' file extended by information on - the shell and Perl kinds of `groffer'. - - * perl/: Subdirectory for the Perl version of `groffer'. - - * perl/groffer.pl: This is the `groffer' script of the Perl - version, a Perl source file that handles the complete groffer - functionality. - - * perl/man.pl: This is the collection of functions that are - related to man pages, `apropos', and `whatis'. It is loaded by - `perl/groffer.pl'. - - * perl/func.pl: This is the collection of miscellaneous functions. - It is loaded by `perl/groffer.pl'. - - * perl/split_env.sh: A shell script that is used by - `perl/groffer.pl' to split a large shell environment variable to a - Perl array. - - * perl/groffer.man: This is the man page of the Perl version of - `groffer'. It is derived from `groffer.man' of the shell version. - It will only be installed when the `Makefile.sub' chooses to - install the Perl version of 'groffer' instead of the shell - version. - - * perl/README_PERL: This file contains information of the Perl - compatibility and details that are special to the Perl version. - - * shell/: Subdirectory for the shell version of `groffer'. - - * shell/ChangeLog.0: The former `ChangeLog' file of the groffer - versions 0.* was moved to this file. It contains information of - the shell only version of groffer 0.*. - - * shell/groffer.sh: This is the old `groffer.sh' file of the shell - version. - - * shell/groffer2.sh: This is the old `groffer2.sh' file of the - shell version. - - * shell/groffer.man: This is the old man page groffer.man of the - shell version. The shell version keeps its own man page. It will - only be installed when the `Makefile.sub' chooses to install the - shell version instead of the Perl version. - - * shell/README_SH: This is the old `README_SH' file of the shell - version containing information of the shell compatibility. - - The former part of the ChangeLog file is in `shell/ChangeLog.0'. - -2006-10-01 Bernd Warken -________________________________________________________________ -License - -Copyright (C) 2006-2018 Free Software Foundation, Inc. -Written by Bernd Warken . - -Copying and distribution of this file, with or without -modification, are permitted provided the copyright notice and this -notice are preserved. - -This file is part of `groffer', which is part of the `groff' -project. - -####### Emacs settings - -Local Variables: -mode: change-log -End: diff --git a/contrib/groffer/README b/contrib/groffer/README deleted file mode 100644 index 2d638f3..0000000 --- a/contrib/groffer/README +++ /dev/null @@ -1,112 +0,0 @@ -README - -The 'groffer' program is the easiest way to read documents written in -some 'roff' language, such as the 'man pages', the manual pages in -many operating systems. All 'roff' preprocessors, such as 'chem' or -'glilypond', are detected and executed automatically. - - -Input - -Input comes from either standard input or command-line parameters that -represent names of exisiting roff files or standardized specifications -for searching man pages. All of these can be compressed in a format -that is decompressible by 'gzip' or 'bzip2', including '.gz', 'bz2', -and '.Z'. - -'groffer' has many built-in 'man' functionalities to find and read the -manual pages on Unix and similar operating systems. It accepts the -information from an installed 'man' program, but tries to find a man -path by itself. - -'groffer' bundles all filespec parameters into a single output file in -the same way as 'groff'. The disadvantage of this is that all file -name arguments must use the same groff language. To change this, the -option parsing must be revised for large parts. It seems that this -would create incompatibilities, so the actual option strategy is kept. - - -Output - -All input is first sent to 'grog' to determine the necessary 'groff' -command and then to 'groff' together with all necessary preprocessors. -So no special 'groff' arguments must be given. But all 'groff' -options can be specified when this seems to be appropriate. - -The following displaying modes for the output are available: -- Display formatted input with --- a PDF viewer, --- a Postcript viewer, --- a web browser, --- the X 'roff' viewer 'gxditview', --- a DVI viewer, --- a pager in a text terminal (tty). -- Generate 'groff' output on stdout without a viewer. -- Generate the 'groff intermediate output' on standard output without - postprocessing. -- Output the source code without any 'groff' processing. -- There are some information outputs without 'groff' processing, such - as by option '-V' and the 'man' like 'whatis' and 'apropos' - outputs. - -By default, the program creates a PDF file; on non-X text terminals, -the 'tty' text mode with a pager is tried by default. - - -File access - -The Perl version of groffer now uses a umask of 077. This is a very -strict security issue. It allows only access of the temporary files -by the file owner. - - -Compatibility - -'groffer' is compatible to the 'man' program. It supports '.so' -requests based on the man path and compressed files. That's more than -'groff' does. - - -Reporting bugs - -For reporting bugs of 'groffer', groff's bug-tracking tool at -http://savannah.gnu.org/bugs/?group=groff can be used. - - -Mailing list - -For a general discussion, the mailing list is -useful, but one has to subscribe to this list at -http://lists.gnu.org/mailman/listinfo/groff. - -See the 'README' file in the top directory of the 'groff' source -package for more details on this mailing list. - - -####### License - -Copyright (C) 2003-2018 Free Software Foundation, Inc. -Written by Bernd Warken . - -This file is part of 'groffer', which is part of 'groff'. - -'groff' is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -'groff' is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see -. - - -####### Emacs settings - -Local Variables: -mode: text -End: diff --git a/contrib/groffer/README_PERL b/contrib/groffer/README_PERL deleted file mode 100644 index 0e0e86d..0000000 --- a/contrib/groffer/README_PERL +++ /dev/null @@ -1,49 +0,0 @@ -README_PERL - -'groffer' is written in the programming language Perl. - - -Compatibility - -It was written in Linux, but due to Free Software under GNU it is -available for each operating system. - -For testing, 'groffer.pl' may be used directly without a Makefile. By -'make', this file will be transformed into the file 'groffer' that will -be installed. - - -Temporary files - -The 'file' and 'so' temporaries are numbered and the files with .so -request are copied. All .so requests are handled; this is an -extension to 'man' that deals only with the first .so request. - - -####### License - -Copyright (C) 2003-2018 Free Software Foundation, Inc. -Written by Bernd Warken . - -This file is part of 'groffer', which is part of 'groff'. - -'groff' is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -'groff' is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see -. - - -####### Emacs settings - -Local Variables: -mode: text -End: diff --git a/contrib/groffer/groffer.1.man b/contrib/groffer/groffer.1.man deleted file mode 100644 index 5eec6bf..0000000 --- a/contrib/groffer/groffer.1.man +++ /dev/null @@ -1,3822 +0,0 @@ -.TH GROFFER @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -groffer \- display groff files and man pages on X and tty -. -. -.\"********************************************************************* -.\" -.\" This man page doesn't use extended groff syntax! -.\" XXX: Yes, it does--"\~" is ubiquitous. "\/" and "\," also occur. -.\" Formatting it with and without groff's option '-C' should always -.\" give the same result. -.\" -.\"********************************************************************* -. -. -.\" ==================================================================== -.\" Legal Terms -.\" ==================================================================== -.\" -.\" Copyright (C) 2001-2018 Free Software Foundation, Inc. -.\" -.\" This file is part of groffer, which is part of groff, a free -.\" software project. -.\" -.\" You can redistribute it and/or modify it under the terms of the GNU -.\" General Public License version 2 as published by the Free Software -.\" Foundation. -.\" -.\" The license text is available in the internet at -.\" . -. -. -.\" ==================================================================== -.\" Characters -.\" ==================================================================== -. -.\" Ellipsis ... -.ie t .ds EL \fS\N'188'\fP\" -.el .ds EL \&.\|.\|.\&\" -.\" called with \*(EL -. -.\" Bullet -.ie t .ds BU \(bu -.el .ds BU * -.\" used in '.IP \*(BU 2m' (former .Topic) -. -. -.\" ==================================================================== -.SH "SYNOPSIS" -.\" ==================================================================== -. -.SY groffer -.RI [ mode-option -\*(EL] -.RI [ groff-option -\*(EL] -.RI [ man-option -\*(EL] -.RI [ X-option -\*(EL] -.OP \-\- -.RI [ filespec -\*(EL] -.YS -. -.SY groffer -.B \-h -.SY groffer -.B \-\-help -.YS -. -.SY groffer -.B \-v -.SY groffer -.B \-\-version -.YS -. -. -.\" ==================================================================== -.SH DESCRIPTION -.\" ==================================================================== -. -The -.B \%groffer -program is the easiest way to use -.BR \%groff (@MAN1EXT@). -It can display arbitrary documents written in the -.I \%groff -language, see -.BR \%groff (@MAN7EXT@), -or other -.I \%roff -languages, see -.BR \%roff (@MAN7EXT@), -that are compatible to the original -.I \%troff -language. -. -It finds and runs all necessary -.I groff -preprocessors, such as -.BR @g@chem . -. -. -.P -The -.B \%groffer -program also includes many of the features for finding and displaying -the \%\f(CRUnix\fP manual pages -.nh -.RI ( man\~pages ), -.hy -such that it can be used as a replacement for a -.BR \%man (1) -program. -. -Moreover, compressed files that can be handled by -.BR \%gzip (1) -or -.BR \%bzip2 (1) -are decompressed on-the-fly. -. -. -.P -The normal usage is quite simple by supplying a file name or name of a -.I \%man\~page -without further options. -. -But the option handling has many possibilities for creating special -behaviors. -. -This can be done either in configuration files, with the shell -environment variable -.IR \%GROFFER_OPT , -or on the command line. -. -. -.P -The output can be generated and viewed in several different ways -available for -.IR \%groff . -. -This includes the -X Window System-based -.I \%groff -program -.BR \%gxditview (@MAN1EXT@), -each -.IR \%PostScript , -.IR \%PDF , -or -.I \%DVI -display program, a web browser by generating -.I \%HTML -or -.I \%XHTML -in -.IR \%www\~mode , -or several -.I \%text\~modes -in text terminals. -. -. -.P -Most of the options that must be named when running -.B \%groff -directly are determined automatically for -.BR \%groffer , -due to the internal usage of the -.BR \%grog (@MAN1EXT@) -program. -. -But all parts can also be controlled manually by arguments. -. -. -.P -Several file names can be specified on the command-line arguments. -. -They are transformed into a single document in the normal way of -.BR \%groff . -. -. -.P -Option handling is done in \f(CRGNU\fP style. -. -Options and file names can be mixed freely. -. -The option -.RB \[lq] \-\- \[rq] -closes the option handling, all following arguments are treated as -file names. -. -Long options can be abbreviated in several ways. -. -. -.\" ==================================================================== -.SH "OPTION OVERVIEW" -.\" ==================================================================== -. -.TP -.I breaking options -.RS -.P -.SY -.OP \-h\~\fR|\fB\~\-\-help -.OP \-v\~\fR|\fB\~\-\-version -.YS -.RE -. -. -.TP -.I \%groffer mode options -.RS -.P -.SY -.OP \-\-auto -.OP \-\-default -.OP \-\-default\-modes mode1,mode2,\*(EL -.OP \-\-dvi -.OP \-\-groff -.OP \-\-html -.OP \-\-latin1 -.OP \-\-mode display_mode -.OP \-\-pdf -.OP \-\-pdf2 -.OP \-\-ps -.OP \-\-source -.OP \-\-text -.OP \-\-to\-stdout -.OP \-\-tty -.OP \-\-utf8 -.OP \-\-viewer prog -.OP \-\-www -.OP \-\-xhtml -.OP \-\-x\~\fR|\fB\~\-\-X\fP -.YS -.RE -. -. -.TP -.I options related to \%groff -.RS -.P -.SY -.OP \-T\~\fR|\fB\~\-\-device device -.OP \-Z\~\fR|\fB\~\-\-intermediate\-output\~\fR|\fB\~\-\-ditroff -.YS -.P -All further -.B \%groff -short options are accepted. -.RE -. -. -.TP -.I options for man\~pages -.RS -.P -.SY -.OP \-\-apropos -.OP \-\-apropos\-data -.OP \-\-apropos\-devel -.OP \-\-apropos\-progs -.OP \-\-man -.OP \-\-no\-man -.OP \-\-no\-special -.OP \-\-whatis -.YS -.RE -. -. -.TP -.I long options taken over from GNU man -.RS -.P -.SY -.OP \-\-all -.OP \-\-ascii -.OP \-\-ditroff -.OP \-\-extension suffix -.OP \-\-locale language -.OP \-\-local\-file -.OP \-\-location\~\fR|\fB\~\-\-where -.OP \-\-manpath dir1:dir2:\*(EL -.OP \-\-no\-location -.OP \-\-pager program -.OP \-\-sections sec1:sec2:\*(EL -.OP \-\-systems sys1,sys2,\*(EL -.OP \-\-troff\-device device -.YS -.P -Further long options of \f(CRGNU\fP -.B man -are accepted as well. -.RE -. -. -.TP -.I options mapped to X Window System Toolkit Intrinsics options -.RS -.P -.SY -.OP \-\-bd\~\fR|\fB\~\-\-bordercolor pixels -.OP \-\-bg\~\fR|\fB\~\-\-background color -.OP \-\-bw\~\fR|\fB\~\-\-borderwidth pixels -.OP \-\-display X-display -.OP \-\-fg\~\fR|\fB\~\-\-foreground color -.OP \-\-fn\~\fR|\fB\~\-\-ft\~\fR|\fB\~\-\-font font_name -.OP \-\-geometry size_pos -.OP \-\-resolution value -.OP \-\-rv -.OP \-\-title string -.OP \-\-xrm X\-resource -.YS -.RE -. -. -.TP -.I options for development -.RS -.P -.SY -.OP \-\-debug -.OP \-\-debug\-filenames -.OP \-\-debug\-grog -.OP \-\-debug\-keep -.OP \-\-debug\-params -.OP \-\-debug\-tmpdir -.OP \-\-do\-nothing -.OP \-\-print text -.OP \-V -.YS -.RE -. -. -.TP -.I \%filespec arguments -.RS -.P -The -.I \%filespec -parameters are all arguments that are neither an option nor an option -argument. -. -They usually mean a file name or a -.I man page -searching scheme. -. -. -.P -In the following, the term -.I section_extension -is used. -. -It means a word that consists of a -.I man section -that is optionally followed by an -.IR extension . -. -The name of a -.I man section -is a single character from -.BR \%[1\(en9on] , -the -.I extension -is some word. -. -The -.I extension -is mostly lacking. -. -. -.P -No -.I \%filespec -parameters means standard input. -. -. -.TP 10m -.B \- -stands for standard input (can occur several times). -. -. -.TP -.I filename -the path name of an existing file. -. -. -.TP -.BI man: name ( section_extension ) -.TQ -.BI man: name . section_extension -.TQ -.IB name ( section_extension ) -.TQ -.IB name . section_extension -.TQ -.I "section_extension name" -search the \%man\~page -.I \%name -in the section with optional extension -.IR section_extension . -. -. -.TP -.BI man: name -\%man\~page in the lowest -.I \%man\~section -that has -.IR \%name . -. -. -.TP -.I name -if -.I \%name -is not an existing file search for the man\~page -.I \%name -in the lowest man\~section. -. -.RE -. -. -.\" ==================================================================== -.SH "OPTION DETAILS" -.\" ==================================================================== -. -The -.B \%groffer -program can usually be run with very few options. -. -But for special purposes, it supports many options. -. -These can be classified in 5 option classes. -. -. -.P -All short options of -.B \%groffer -are compatible with the short options of -.BR \%groff (@MAN1EXT@). -. -All long options of -.B \%groffer -are compatible with the long options of -.BR \%man (1). -. -. -.P -Arguments for long option names can be abbreviated in several ways. -. -First, the argument is checked whether it can be prolonged as is. -. -Furthermore, each minus sign -.B \- -is considered as a starting point for a new abbreviation. -. -This leads to a set of multiple abbreviations for a single argument. -. -For example, -.B \-\-de\-n\-f -can be used as an abbreviation for -.BR \-\-debug\-not\-func , -but -.B \-\-de\-n -works as well. -. -If the abbreviation of the argument leads to several resulting options -an error is raised. -. -. -.P -These abbreviations are only allowed in the environment variable -.IR \%GROFFER_OPT , -but not in the configuration files. -. -In configuration, all long options must be exact. -. -. -.\" ==================================================================== -.SS "groffer breaking Options" -.\" ==================================================================== -. -As soon as one of these options is found on the command line it is -executed, printed to standard output, and the running -.B \%groffer -is terminated thereafter. -. -All other arguments are ignored. -. -. -.TP -.B \-h\~\fR|\fB\~\-\-help -Print help information with a short explanation of options to -standard output. -. -. -.TP -.B \-v\~\fR|\fB\~\-\-version -Print version information to standard output. -. -. -.\" ==================================================================== -.SS "groffer Mode Options" -.\" ==================================================================== -. -The display mode and the viewer programs are determined by these -options. -. -If none of these mode and viewer options is specified -.B \%groffer -tries to find a suitable display mode automatically. -. -The default modes are -.IR "mode pdf" , -.IR "mode ps" , -.IR "mode html" , -.IR "mode xhtml" , -.IR "mode x" , -and -.I "mode dvi" -in the X Window System with different viewers and -.I mode tty -with device -.I utf8 -under -.B less -on a terminal; other modes are tested if the programs for the main -default mode do not exist. -. -. -.P -In the X Window System, many programs create their own window when -called. -. -.B \%groffer -can run these viewers as an independent program in the background. -. -As this does not work in text mode on a terminal (tty) there must be a -way to know which viewers are X Window System-based graphical -programs. -. -The -.B \%groffer -script has a small amount of information on some viewer names. -. -If a viewer argument of the command\-line chooses an element that is -recognized as an X Window System-based program in this list, it is -treated as a viewer that can run in the background. -. -Unrecognized viewers are not run in the background. -. -. -.P -For each mode, you are free to choose whatever viewer you want. -. -That need not be some graphical viewer suitable for this mode. -. -There is a chance to view the output source; for example, the -combination of the options -.B \-\-mode=ps -and -.B \-\-viewer=less -shows the content of the -.I PostScript -output, the source code, with the pager -.BR less . -. -. -.TP -.B \-\-auto -Equivalent to -.BR \-\-mode=auto . -. -. -.TP -.B \-\-default -Reset all configuration from previously processed command-line options -to the default values. -. -This is useful to wipe out all former options of the configuration, in -.IR \%GROFFER_OPT , -and restart option processing using only the rest of the command line. -. -. -.TP -.BI \-\-default\-modes \ mode1,mode2,\*(EL -Set the sequence of modes for -.I \%auto\~mode -to the comma separated list given in the argument. -. -See -.B \-\-mode -for details on modes. -Display in the default manner; actually, this means to try the modes -.IR x , -.IR ps , -and -.I \%tty -in this sequence. -. -. -. -.TP -.B \-\-dvi -Equivalent to -.BR \-\-mode=\%dvi . -. -Known -.I \%DVI -viewers for the X Window System include -.BR \%xdvi (1) -and -.BR \%dvilx (1). -. -. -.TP -.B \-\-groff -Equivalent to -.BR \-\-mode=groff . -. -. -.TP -.B \-\-html -Equivalent to -.BR \-\-mode=html . -. -. -.TP -.BI \-\-mode \ value -. -Set the display mode. -. -The following mode values are recognized: -. -.RS -. -.TP -.B auto -Select the automatic determination of the display mode. -. -The sequence of modes that are tried can be set with the -.B \-\-default\-modes -option. -. -Useful for restoring the -.I \%default\~mode -when a different mode was specified before. -. -. -.TP -.B dvi -Display formatted input in a -.I \%DVI -viewer program. -. -By default, the formatted input is displayed with the -.BR \%xdvi (1) -program. -. -. -.TP -.B groff -After the file determination, switch -.B \%groffer -to process the input like -.BR \%groff (@MAN1EXT@) -would do. -. -This disables the -.I \%groffer -viewing features. -. -. -.TP -.B html -Translate the input into HTML format and display the result in a web -browser program. -. -By default, the existence of a sequence of standard web browsers is -tested, starting with -.BR \%konqueror (1) -and -.BR \%mozilla (1). -The text HTML viewer is -.BR \%lynx (1). -. -By default, the existence of a sequence of standard web browsers is -tested, starting with -.BR \%konqueror (1) -and -.BR \%mozilla (1). -The text HTML viewer is -.BR \%lynx (1). -. -. -.TP -.B pdf -Transform -.I roff input files -into a -.I PDF file -by using the -.B groff (@MAN1EXT@) -device -.BR -Tpdf . -. -This is the default -.B PDF -generator. -. -The generated -.I PDF file -is displayed with suitable viewer programs, such as -.BR okular (1). -. -. -.TP -.B pdf2 -This is the traditional -.IR "pdf mode" . -. -Sometimes this mode produces more correct output than the default -.BR "PDF mode" . -. -By default, the input is formatted by -.B \%groff -using the PostScript device, then it is transformed into the PDF file -format using -.BR \%gs (1), -or -.BR ps2pdf (1). -. -If that's not possible, the -.I PostScript mode (ps) -is used instead. -. -Finally it is displayed using different viewer programs. -. -. -.TP -.B ps -Display formatted input in a PostScript viewer program. -. -By default, the formatted input is displayed in one of many viewer -programs. -. -. -.TP -.B text -Format in a -.I \%groff\~text\~mode -and write the result to standard output without a pager or viewer -program. -. -The text device, -.I \%latin1 -by default, can be chosen with option -.BR \-T . -. -. -.TP -.B tty -Format in a -.I \%groff\~text\~mode -and write the result to standard output using a text pager program, -even when in the X Window System. -. -. -.TP -.B www -Equivalent to -.BR \-\-mode=html . -. -. -.TP -.B x -Display the formatted input in a native -.I roff -viewer. -. -By default, the formatted input is displayed with the -.BR \%gxditview (@MAN1EXT@) -program being distributed together with -.BR \%groff . -But the legacy X Window System application -.BR \%xditview (1) -can also be chosen with the option -.BR \-\-viewer . -The default resolution is -.BR 75dpi , -but -.B 100dpi -are also possible. -. -The default -.I groff -device -for the resolution of -.B 75dpi -is -.BR X75\-12 , -for -.B 100dpi -it is -.BR X100 . -. -The corresponding -.I "groff intermediate output" -for the actual device is generated and the result is displayed. -. -For a resolution of -.BR 100dpi , -the default width of the geometry of the display program is chosen to -.BR 850dpi . -. -. -.TP -.B X -Equivalent to -.BR \-\-mode=x . -. -. -.TP -.B xhtml -Translate the input into -.I XHTML -format, which is an -.I XML -version of -.IR HTML . -. -Then display the result in a web browser program, mostly the known -.IR "HTML viewers" . -. -. -.P -The following modes do not use the -.I \%groffer -viewing features. -. -They are only interesting for advanced applications. -. -. -.TP -.B groff -Generate device output with plain -.I \%groff -without using the special viewing features of -.IR \%groffer . -If no device was specified by option -.B \-T -the -.I \%groff -default -.B \%ps -is assumed. -. -. -.TP -.B source -Output the roff source code of the input files without further -processing. -. -. -.RE -. -. -.TP -.B \-\-pdf -Equivalent to -.BR \-\-mode=pdf . -.TQ -.B \-\-pdf2 -Equivalent to -.BR \-\-mode=pdf2 . -. -. -.TP -.B \-\-ps -Equivalent to -.BR \-\-mode=ps . -. -Common PostScript viewers include -.BR \%okular (1), -.BR \%evince (1), -.BR \%gv (1), -.BR \%ghostview (1), -and -.BR \%gs (1), -. -In each case, arguments can be provided additionally. -. -. -.TP -.B \-\-source -Equivalent to -.BR \-\-mode=source . -. -. -.TP -.B \-\-text -Equivalent to -.BR \-\-mode=text . -. -. -.TP -.B \-\-to\-stdout -The file for the chosen mode is generated and its content is printed -to standard output. -. -It will not be displayed in graphical mode. -. -. -.TP -.B \-\-tty -Equivalent to -.BR \-\-mode=tty . -The standard pager is -.BR less (1). -This option is equivalent to -.I man -option -.BR \-\-pager=\,\fIprog\fP . -The option argument can be a file name or a program to be searched in -.IR $PATH ; -arguments can be provided additionally. -. -. -.TP -.BI \-\-viewer \ prog -Choose a viewer program for actual device or mode. -. -This can be a file name or a program to be searched in -.IR $PATH ; -arguments can be provided additionally. -. -. -.TP -.B \-\-www -Equivalent to -.BR \-\-mode=html . -. -. -.TP -.B \-\-X\~\fR|\fB\~\-\-x -Equivalent to -.BR \-\-mode=x . -Suitable viewer programs are -.BR \%gxditview (@MAN1EXT@) -which is the default and -.BR \%xditview (1). -. -. -.TP -.B \-\- -Signals the end of option processing; all remaining arguments are -interpreted as -.I \%filespec -parameters. -. -. -.P -Besides these, -.B \%groffer -accepts all short options that are valid for the -.BR \%groff (@MAN1EXT@) -program. -. -All -.RB \%non- groffer -options are sent unmodified via -.B \%grog -to -.BR \%groff . -. -So postprocessors, macro packages, compatibility with -.I classical -.IR \%troff , -and much more can be manually specified. -. -. -.\" ==================================================================== -.SS "Options related to groff" -.\" ==================================================================== -. -All short options of -.B \%groffer -are compatible with the short options of -.BR \%groff (@MAN1EXT@). -. -The following of -.B \%groff -options have either an additional special meaning within -.B \%groffer -or make sense for normal usage. -. -. -.P -Because of the special outputting behavior of the -.B \%groff -option -.B \-Z -.B \%groffer -was designed to be switched into -.IR \%groff\~mode ; -the -.I \%groffer -viewing features are disabled there. -. -The other -.B \%groff -options do not switch the mode, but allow to customize the formatting -process. -. -. -.TP -.B \-\-a -This generates an ASCII approximation of output in the -.IR \%text\~modes . -. -That could be important when the text pager has problems with control -sequences in -.IR "tty mode" . -. -. -.TP -.BI \-\-m \ file -Add -.I \%file -as a -.I \%groff -macro file. -. -This is useful in case it cannot be recognized automatically. -. -. -.TP -.BI \-\-P \ opt_or_arg -Send the argument -.I \%opt_or_arg -as an option or option argument to the actual -.B \%groff -postprocessor. -. -. -.TP -.B \-\-T \fIdevname\fR\~\fR|\fB\~\-\-device \fIdevname\fR -. -This option determines -.BR \%groff 's -output device. -. -The most important devices are the text output devices for referring -to the different character sets, such as -.BR \%ascii , -.BR \%utf8 , -.BR \%latin1 , -.BR \%utf8 , -and others. -. -Each of these arguments switches -.B \%groffer -into a -.I \%text\~mode -using this device, to -.I \%mode\~tty -if the actual mode is not a -.IR \%text\~mode . -. -The following -.I \%devname -arguments are mapped to the corresponding -.B \%groffer -.B \-\-mode=\,\fIdevname\fR -option: -.BR \%dvi , -.BR \%html , -.BR \%xhtml , -and -.BR \%ps . -All -.B \%X* -arguments are mapped to -.IR \%mode\~x . -Each other -.I \%devname -argument switches to -.I \%mode\~groff -using this device. -. -. -.TP -.B \-\-X -is equivalent to -.BR "groff \-X" . -It displays the -.I groff intermediate output -with -.BR gxditview . -As the quality is relatively bad this option is deprecated; use -.B \-\-X -instead because the -.I \%x\~mode -uses an -.IR X * -device for a better display. -. -. -.TP -.B \-Z\~\fR|\fB\~\-\-intermediate-output\~\fR|\fB\~\-\-ditroff -Switch into -.I \%groff\~mode -and format the input with the -.I \%groff intermediate output -without postprocessing; see -.BR \%groff_out (@MAN5EXT@). -This is equivalent to option -.B \-\-ditroff -of -.IR \%man , -which can be used as well. -. -. -.P -All other -.B \%groff -options are supported by -.BR \%groffer , -but they are just transparently transferred to -.B \%groff -without any intervention. -. -The options that are not explicitly handled by -.B \%groffer -are transparently passed to -.BR \%groff . -. -Therefore these transparent options are not documented here, but in -.BR \%groff (@MAN1EXT@). -Due to the automatism in -.BR \%groffer , -none of these -.B \%groff -options should be needed, except for advanced usage. -. -. -.\" ==================================================================== -.SS "Options for man\~pages" -.\" ==================================================================== -. -.TP -.B \-\-apropos -Start the -.BR \%apropos (1) -command or facility of -.BR \%man (1) -for searching the -.I \%filespec -arguments within all -.I \%man\~page -descriptions. -. -Each -.I \%filespec -argument is taken for search as it is; -.I section -specific parts are not handled, such that -.B 7 groff -searches for the two arguments -.B 7 -and -.BR groff , -with a large result; for the -.I \%filespec -.B groff.7 -nothing will be found. -. -The -.I language -locale is handled only when the called programs do support this; the -GNU -.B apropos -and -.B man \-k -do not. -. -The display differs from the -.B \%apropos -program by the following concepts: -.RS -.IP \*(BU 2m -Construct a -.I \%groff -frame similar to a -.I \%man\~page -to the output of -.BR \%apropos , -.IP \*(BU 2m -each -.I \%filespec -argument is searched on its own. -.IP \*(BU 2m -The restriction by -.B \-\-sections -is handled as well, -.IP \*(BU 2m -wildcard characters are allowed and handled without a further option. -.RE -. -. -.TP -.B \-\-apropos\-data -Show only the -.B \%apropos -descriptions for data documents, these are the -.BR \%man (7) -.IR sections\~4 ", " 5 ", and " 7 . -. -Direct -.I section -declarations are ignored, wildcards are accepted. -. -. -.TP -.B \-\-apropos\-devel -Show only the -.B \%apropos -descriptions for development documents, these are the -.BR man (7) -.IR sections\~2 ", " 3 ", and " 9 . -. -Direct -.I section -declarations are ignored, wildcards are accepted. -. -. -.TP -.B \-\-apropos\-progs -Show only the -.B \%apropos -descriptions for documents on programs, these are the -.BR \%man (7) -.IR sections\~1 ", " 6 ", and " 8 . -. -Direct -.I section -declarations are ignored, wildcards are accepted. -. -. -.TP -.B \-\-whatis -For each -.I \%filespec -argument search all -.I \%man\~pages -and display their description \(em or say that it is not a -.IR \%man\~page . -This is written from anew, so it differs from -.IR man 's -.B whatis -output by the following concepts -.RS -.IP \*(BU 2m -each retrieved file name is added, -.IP \*(BU 2m -local files are handled as well, -.IP \*(BU 2m -the \fIlanguage\fP and \fIsystem\fP locale is supported, -.IP \*(BU 2m -the display is framed by a -.I groff -output format similar to a -.IR \%man\~page , -.IP \*(BU 2m -wildcard characters are allowed without a further option. -.RE -. -. -.P -The following options were added to -.B \%groffer -for choosing whether the file name arguments are interpreted as names -for local files or as a search pattern for -.IR \%man\~pages . -. -The default is looking up for local files. -. -. -.TP -.B \-\-man -Check the non-option command-line arguments -.nh -.RI ( filespecs ) -.hy -first on being -.IR \%man\~pages , -then whether they represent an existing file. -. -By default, a -.I \%filespec -is first tested whether it is an existing file. -. -. -.TP -.B \-\-no-man\~\fR|\fB\~\-\-local-file -Do not check for -.IR \%man\~pages . -. -.B \-\-local-file -is the corresponding -.B man -option. -. -. -.TP -.B \-\-no-special -Disable former calls of -.BR \-\-all , -.BR \-\-apropos* , -and -.BR \-\-whatis . -. -. -.\" ==================================================================== -.SS "Long options taken over from GNU man" -.\" ==================================================================== -. -The long options of -.B \%groffer -were synchronized with the long options of \f(CRGNU\fP -.BR man . -. -All long options of \f(CRGNU\fP -.B man -are recognized, but not all of these options are important to -.BR \%groffer , -so most of them are just ignored. -. -These ignored -.B man -options are -.BR \-\-catman , -.BR \-\-troff , -and -.BR \-\-update . -. -. -.P -In the following, the -.B man -options that have a special meaning for -.B \%groffer -are documented. -. -. -.P -If your system has \f(CRGNU\fP -.B man -installed the full set of long and short options of the \f(CRGNU\fP -.B man -program can be passed via the environment variable -.IR MANOPT ; -see -.BR \%man (1). -. -. -.TP -.B \-\-all -In searching -.IR \%man\~pages , -retrieve all suitable documents instead of only one. -. -. -.TP -.B \-7\~\fR|\fB\~\-\-ascii -In -.IR \%text\~modes , -display ASCII translation of special characters for critical environment. -. -This is equivalent to -.BR "groff \%\-mtty_char" ; -see -.BR groff_tmac (@MAN5EXT@). -. -. -.TP -.B \-\-ditroff -Produce -.IR "groff intermediate output" . -This is equivalent to -.B \%groffer -.BR \-Z . -. -. -.TP -.BI \-\-extension \ suffix -Restrict -.I \%man\~page -search to file names that have -.I \%suffix -appended to their section element. -. -For example, in the file name -.I \%/usr/share/man/man3/terminfo.3ncurses.gz -the -.I \%man\~page -extension is -.IR \%ncurses . -. -. -.TP -.BI \-\-locale \ language -. -Set the language for -.IR \%man\~pages . -. -This has the same effect, but overwrites -.IR $LANG . -. -. -.TP -.B \-\-location -Print the location of the retrieved files to standard error. -. -. -.TP -.B \-\-no-location -Do not display the location of retrieved files; this resets a former -call to -.BR \-\-location . -. -This was added by -.BR \%groffer . -. -. -.TP -.BI \-\-manpath \ 'dir1:dir2:\*(EL' -Use the specified search path for retrieving -.I \%man\~pages -instead of the program defaults. -. -If the argument is set to the empty string "" the search for -.I \%man\~page -is disabled. -. -. -.TP -.B \-\-pager -Set the pager program in -.IR \%tty\~mode ; -default is -.BR \%less . -. -This can be set with -.BR \-\-viewer . -. -. -.TP -.BI \-\-sections \ sec1:sec2:\*(EL -Restrict searching for -.I \%man\~pages -to the given -.IR sections , -a colon-separated list. -. -. -.TP -.BI \-\-systems \ sys1,sys2,\*(EL -Search for -.I \%man\~pages -for the given operating systems; the argument -.I \%systems -is a comma-separated list. -. -. -.TP -.B \-\-where -Equivalent to -.BR \-\-location . -. -. -.\" ==================================================================== -.SS "X Window System Toolkit Intrinsics Options" -.\" ==================================================================== -. -The following long options were adapted from the corresponding -X Window System Toolkit Intrinsics options. -. -.B \%groffer -will pass them to the actual viewer program if it is an -X Window System program. -. -Otherwise these options are ignored. -. -. -.P -Unfortunately these options use the old style of a single minus for -long options. -. -For -.B \%groffer -that was changed to the standard with using a double minus for long -options, for example, -.B \%groffer -uses the option -.B \-\-font -for the X Window System Toolkit Intrinsics option -.BR \-font . -. -. -.P -See -.BR X (7) -and the manual -.I "X Toolkit Intrinsics \(en C Language Interface" -for more details on these options and their arguments. -. -. -.TP -.BI \-\-background \ color -Set the background color of the viewer window. -. -. -.TP -.BI \-\-bd \ pixels -This is equivalent to -.BR \-\-bordercolor . -. -. -.TP -.BI \-\-bg \ color -This is equivalent to -.BR \-\-background . -. -. -.TP -.BI \-\-bw \ pixels -This is equivalent to -.BR \-\-borderwidth . -. -. -.TP -.BI \-\-bordercolor \ pixels -Specifies the color of the border surrounding the viewer window. -. -. -.TP -.BI \-\-borderwidth \ pixels -Specifies the width in pixels of the border surrounding the viewer -window. -. -. -.TP -.BI \-\-display \ X-display -Set the X Window System display on which the viewer program -shall be started. -. -See section \(lqDisplay Names\(rq in -.BR X (7) -for the syntax of the argument. -. -. -.TP -.BI \-\-foreground \ color -Set the foreground color of the viewer window. -. -. -.TP -.BI \-\-fg \ color -This is equivalent to -.BR \-\-foreground . -. -. -.TP -.BI \-\-fn \ font_name -This is equivalent to -.BR \-\-font . -. -. -.TP -.BI \-\-font \ font_name -Set the font used by the viewer window. -. -The argument is an X Window System font name. -. -. -.TP -.BI \-\-ft \ font_name -This is equivalent to -.BR \-\-font . -. -. -.TP -.BI \-\-geometry \ size_pos -Set the geometry of the display window, that means its size and its -starting position. -. -See section \(lqGeometry Specifications\(rq in -.BR X (7) -for the syntax of the argument. -. -. -.TP -.BI \-\-resolution \ value -Set X Window System resolution in dpi (dots per inch) in some -viewer programs. -. -The only supported dpi values are -.B 75 -and -.BR 100 . -. -Actually, the default resolution for -.B \%groffer -is set to -.BR 75dpi . -The resolution also sets the default device in -.IR "mode x" . -. -. -.TP -.B \-\-rv -Reverse foreground and background color of the viewer window. -. -. -.TP -.BI \-\-title "\ 'some text'" -Set the title for the viewer window. -. -. -.TP -.BI \-\-xrm \ 'resource' -Set the X Window System server resource to the given value. -. -. -.\" ==================================================================== -.SS "Options for Development" -.\" ==================================================================== -. -.TP -.B \-\-debug -Enable all debugging options -.BR \-\-debug\-\,\fItype\fP . -. -The temporary files are kept and not deleted, the -.B grog -output is printed, the name of the temporary directory is printed, the -displayed file names are printed, and the parameters are printed. -. -. -.TP -.B \-\-debug\-filenames -Print the names of the files and -.I \%man\~pages -that are displayed by -.BR \&groffer . -. -. -.TP -.B \-\-debug\-grog -Print the output of all -.B grog -commands. -. -. -.TP -.B \-\-debug\-keep -Enable two debugging informations. -. -Print the name of the temporary directory and keep the temporary -files, do not delete them during the run of -.BR \%groffer . -. -. -.TP -.B \-\-debug\-params -Print the parameters, as obtained from the configuration files, from -.IR \%GROFFER_OPT , -and the command-line arguments. -. -. -.TP -.B \-\-debug\-tmpdir -Print the name of the temporary directory. -. -. -.TP -.B \-\-do-nothing -This is like -.BR \-\-version , -but without the output; no viewer is started. -. -This makes only sense in development. -. -. -.TP -.B \-\-print=\,\fItext\fR -Just print the argument to standard error. -. -This is good for parameter check. -. -. -.TP -.B \-V -This is an advanced option for debugging only. -. -Instead of displaying the formatted input, a lot of -.I \%groffer -specific information is printed to standard output: -. -.RS -.IP \*(BU 2m -the output file name in the temporary directory, -. -.IP \*(BU 2m -the display mode of the actual -.B \%groffer -run, -. -.IP \*(BU 2m -the display program for viewing the output with its arguments, -. -.IP \*(BU 2m -the active parameters from the config files, the arguments in -.IR \%GROFFER_OPT , -and the arguments of the command line, -. -.IP \*(BU 2m -the pipeline that would be run by the -.B \%groff -program, but without executing it. -.RE -. -. -.P -Other useful debugging options are the -.B \%groff -option -.B \-Z -and -.BR \-\-mode=groff . -. -. -.\" ==================================================================== -.SS "Filespec Arguments" -.\" ==================================================================== -. -A -.I \%filespec -parameter is an argument that is not an option or option argument. -. -In -.BR \%groffer , -.I \%filespec -parameters are a file name or a template for searching -.IR \%man\~pages . -. -These input sources are collected and composed into a single output -file such as -.B \%groff -does. -. -. -.P -The strange \%\f(CRPOSIX\fP behavior to regard all arguments behind -the first non-option argument as -.I \%filespec -arguments is ignored. -. -The \f(CRGNU\fP behavior to recognize options even when mixed with -.I \%filespec -arguments is used throughout. -. -But, as usual, the double minus argument -.B \-\- -ends the option handling and interprets all following arguments as -.I \%filespec -arguments; so the \%\f(CRPOSIX\fP behavior can be easily adopted. -. -. -.P -The options -.B \-\-apropos* -have a special handling of -.I filespec -arguments. -. -Each argument is taken as a search scheme of its own. -. -Also a regexp (regular expression) can be used in the filespec. -. -For example, -.B groffer \-\-apropos '^gro.f$' -searches -.B groff -in the -.I man\~page -name, while -.B groffer \-\-apropos groff -searches -.B groff -somewhere in the name or description of the -.IR man\~pages . -. -. -.P -All other parts of -.IR groffer , -such as the normal display or the output with -.B \-\-whatis -have a different scheme for -.IR filespecs . -No regular expressions are used for the arguments. -. -The -.I filespec -arguments are handled by the following scheme. -. -. -.P -It is necessary to know that on each system the -.I \%man\~pages -are sorted according to their content into several sections. -. -The -.I classical man sections -have a single-character name, either a digit from -.B 1 -to -.B 9 -or one of the characters -.B n -or -.BR o . -. -. -.P -This can optionally be followed by a string, the so-called -.IR extension . -The -.I extension -allows the storage of several -.I man\~pages -with the same name in the same -.IR section . -But the -.I extension -is only rarely used; usually it is omitted. -. -Then the -.I extensions -are searched automatically by alphabet. -. -. -.P -In the following, we use the name -.I section_extension -for a word that consists of a single character -.I section -name or a -.I section -character that is followed by an -.IR extension . -. -Each -.I \%filespec -parameter can have one of the following forms in decreasing sequence. -. -. -.IP \*(BU 2m -No -.I \%filespec -parameters means that -.B \%groffer -waits for standard input. -. -The minus option -.B \- -always stands for standard input; it can occur several times. -. -If you want to look up a -.I \%man\~page -called -.B \- -use the argument -.BR man:\- . -. -. -.IP \*(BU 2m -Next a -.I \%filespec -is tested whether it is the path name of an existing file. -. -Otherwise it is assumed to be a searching pattern for a -.IR \%man\~page . -. -. -.IP \*(BU 2m -.BI \%man: name ( section_extension ) , -.BI \%man: name . section_extension, -.IB \%name ( section_extension ) , -or -.IB \%name . section_extension -search the \%man\~page -.I \%name -in \%man\~section and possibly extension of -.IR \%section_extension . -. -. -.IP \*(BU 2m -Now -.BI \%man: name -searches for a -.I \%man\~page -in the lowest -.I \%man\~section -that has a document called -.IR \%name . -. -. -.IP \*(BU 2m -.I \%section_extension\~name -is a pattern of 2 arguments that originates from a strange argument -parsing of the -.B man -program. -. -Again, this searches the man page -.I name -with -.IR \%section_extension , -a combination of a -.I section -character optionally followed by an -.IR extension . -. -. -.IP \*(BU 2m -We are left with the argument -.I \%name -which is not an existing file. -. -So this searches for the -.I \%man\~page -called -.I \%name -in the lowest -.I \%man\~section -that has a document for this name. -. -. -.P -Several file name arguments can be supplied. -. -They are mixed by -.B \%groff -into a single document. -. -Note that the set of option arguments must fit to all of these file -arguments. -. -So they should have at least the same style of the -.I \%groff -language. -. -. -.\" ==================================================================== -.SH "OUTPUT MODES" -.\" ==================================================================== -. -By default, the -.B \%groffer -program collects all input into a single file, formats it with the -.B \%groff -program for a certain device, and then chooses a suitable viewer -program. -. -The device and viewer process in -.B \%groffer -is called a -.IR \%mode . -. -The mode and viewer of a running -.B \%groffer -program is selected automatically, but the user can also choose it -with options. -. -. -The modes are selected by option the arguments of -.BR \-\-mode=\,\fIanymode . -Additionally, each of this argument can be specified as an option of -its own, such as -.BR anymode . -Most of these modes have a viewer program, which can be chosen by the -option -.BR \-\-viewer . -. -. -.P -Several different modes are offered: graphical modes for -the X Window System, -.IR \%text\~modes , -and some direct -.I \%groff\~modes -for debugging and development. -. -. -.P -By default, -.B \%groffer -first tries whether -.I \%x\~mode -is possible, then -.IR \%ps\~mode , -and finally -.IR \%tty\~mode . -. -This mode testing sequence for -.I \%auto\~mode -can be changed by specifying a comma separated list of modes with the -option -.B \-\-default\-modes. -. -. -.P -The searching for -.I \%man\~pages -and the decompression of the input are active in every mode. -. -. -.\" ==================================================================== -.SS "Graphical Display Modes" -.\" ==================================================================== -. -The graphical display modes work mostly in the X Window System -environment (or similar implementations within other windowing -environments). -. -The environment variable -.I \%DISPLAY -and the option -.B \-\-display -are used for specifying the X Window System display to be used. -. -If this environment variable is empty, -.B \%groffer -assumes that the X Window System is not running and changes to a -.IR \%text\~mode . -. -You can change this automatic behavior by the option -.BR \-\-default\-modes . -. -. -.P -Known viewers for the graphical display modes and their standard -X Window System viewer programs are -. -.IP \*(BU 2m -in a PDF viewer -.nh -.RI ( \%pdf\~mode ) -.hy -. -.IP \*(BU 2m -in a web browser -.nh -.RI ( html , -.RI ( xhtml , -or -.IR \%www\~mode ) -.hy -.RE -. -.IP \*(BU 2m -in a PostScript viewer -.nh -.RI ( \%ps\~mode ) -.hy -. -.IP \*(BU 2m -X Window System -.I roff -viewers such as -.BR \%gxditview (@MAN1EXT@) -or -.BR \%xditview (1) -(in -.IR \%x\~mode ) -. -.IP \*(BU 2m -in a DVI viewer program -.nh -.RI ( \%dvi\~mode ) -.hy -. -. -.P -The -.I \%pdf\~mode -has a major advantage \(em it is the only graphical display mode that -allows searching for text within the viewer; this can be a really -important feature. -. -Unfortunately, it takes some time to transform the input into the PDF -format, so it was not chosen as the major mode. -. -. -.P -These graphical viewers can be customized by options of the -X Window System Toolkit Intrinsics. -. -But the -.B \%groffer -options use a leading double minus instead of the single minus used by -the X Window System Toolkit Intrinsics. -. -. -.\" ==================================================================== -.SS "Text modes" -.\" ==================================================================== -. -There are two modes for text output, -.I \%mode\~text -for plain output without a pager and -.I \%mode\~tty -for a text output on a text terminal using some pager program. -. -. -.P -If the variable -.I \%DISPLAY -is not set or empty, -.B \%groffer -assumes that it should use -.IR \%tty\~\%mode . -. -. -.P -In the actual implementation, the -.I groff -output device -.I \%latin1 -is chosen for -.IR \%text\~modes . -. -This can be changed by specifying option -.B \-T -or -.BR \%\-\-device . -. -. -.P -The pager to be used can be specified by one of the options -.B \-\-pager -and -.BR \-\-viewer , -or by the environment variable -.IR PAGER . -If all of this is not used the -.BR \%less (1) -program with the option -.B \-r -for correctly displaying control sequences is used as the default -pager. -. -. -.\" ==================================================================== -.SS "Special Modes for Debugging and Development" -.\" ==================================================================== -. -These modes use the -.I \%groffer -file determination and decompression. -. -This is combined into a single input file that is fed directly into -.B \%groff -with different strategy without the -.I \%groffer -viewing facilities. -. -These modes are regarded as advanced, they are useful for debugging -and development purposes. -. -. -.P -The -.I \%source\~mode -with option -.B \-\-source -just displays the decompressed input. -. -. -.P -Option -.B \-\-to\-stdout -does not display in a graphical mode. -. -It just generates the file for the chosen mode and then prints its -content to standard output. -. -. -.P -The -.I \%groff\~mode -passes the input to -.B \%groff -using only some suitable options provided to -.BR \%groffer . -. -This enables the user to save the generated output into a file or pipe -it into another program. -. -. -.P -In -.IR \%groff\~\%mode , -the option -.B \-Z -disables post-processing, thus producing the -.nh -.I groff intermediate -.IR output . -.hy -. -In this mode, the input is formatted, but not postprocessed; see -.BR \%groff_out (@MAN5EXT@) -for details. -. -. -.P -All -.B \%groff -short options are supported by -.BR \%groffer . -. -. -.\" ==================================================================== -.SH "MAN PAGE SEARCHING" -.\" ==================================================================== -. -The default behavior of -.B \%groffer -is to first test whether a file parameter represents a local file; if -it is not an existing file name, it is assumed to represent the name -of a -.IR \%man\~page . -The following options can be used to determine whether the arguments -should be handled as file name or -.I \%man\~page -arguments. -. -.TP -.B \-\-man -forces to interpret all file parameters as -.I \%filespecs -for searching -.IR \%man\~pages . -. -.TP -.B \-\-no\-man -.TQ -.B \-\-local\-file -disable the -.I man -searching; so only local files are displayed. -. -. -.P -If neither a local file nor a -.I \%man\~page -was retrieved for some file parameter a warning is issued on standard -error, but processing is continued. -. -. -.\" ==================================================================== -.SS "Search Algorithm" -.\" ==================================================================== -. -Let us now assume that a -.I \%man\~page -should be searched. -. -The -.B \%groffer -program provides a search facility for -.IR \%man\~pages . -. -All long options, all environment variables, and most of the -functionality of the \f(CRGNU\fP -.BR \%man (1) -program were implemented. -. -The search algorithm shall determine which file is displayed for a given -.IR \%man\~page . -The process can be modified by options and environment variables. -. -. -.P -The only -.I man -action that is omitted in -.B \%groffer -are the preformatted -.IR \%man\~pages , -also called -.IR cat\~pages . -. -With the excellent performance of the actual computers, the -preformatted -.I \%man\~pages -aren't necessary any longer. -. -Additionally, -.B \%groffer -is a -.I roff -program; it wants to read -.I roff -source files and format them itself. -. -. -.P -The algorithm for retrieving the file for a -.I \%man\~page -needs first a set of directories. -. -This set starts with the so-called -.I man\~path -that is modified later on by adding names of -.I operating system -and -.IR language . -. -This arising set is used for adding the section directories which -contain the -.I \%man\~page -files. -. -. -.P -The -.I man\~path -is a list of directories that are separated by colon. -. -It is generated by the following methods. -. -.IP \*(BU 2m -The environment variable -.I \%MANPATH -can be set. -. -.IP \*(BU 2m -It can be read from the arguments of the environment variable -.IR MANOPT . -. -.IP \*(BU 2m -The -.I man\~path -can be manually specified by using the option -.BR \-\-manpath . -An empty argument disables the -.I \%man\~page -searching. -. -.IP \*(BU 2m -When no -.I man\~path -was set the -.BR \%manpath (1) -program is tried to determine one. -. -.IP \*(BU 2m -If this does not work a reasonable default path from -.I $PATH -is determined. -. -. -.P -We now have a starting set of directories. -. -The first way to change this set is by adding names of -.I operating -.IR systems . -. -This assumes that -.I \%man\~pages -for several -.I operating systems -are installed. -. -This is not always true. -. -The names of such -.I operating systems -can be provided by 3 methods. -. -.IP \*(BU 2m -The environment variable -.I \%SYSTEM -has the lowest precedence. -. -.IP \*(BU 2m -This can be overridden by an option in -.IR MANOPT . -. -.IP \*(BU 2m -This again is overridden by the command-line option -.BR \-\-systems . -. -. -.P -Several names of -.I operating systems -can be given by appending their names, separated by a comma. -. -. -.P -The -.I man\~path -is changed by appending each -.I system -name as subdirectory at the end of each directory of the set. -. -No directory of the -.I man\~path -set is kept. -. -But if no -.I system -name is specified the -.I man\~path -is left unchanged. -. -. -.P -After this, the actual set of directories can be changed by -.I language -information. -. -This assumes that there exist -.I man\~pages -in different languages. -. -The wanted -.I language -can be chosen by several methods. -. -.IP \*(BU 2m -Environment variable -.IR LANG . -. -.IP \*(BU 2m -This is overridden by -.IR \%LC_MESSAGES . -. -.IP \*(BU 2m -This is overridden by -.IR LC_ALL . -. -.IP \*(BU 2m -This can be overridden by providing an option in -.IR MANOPT . -. -.IP \*(BU 2m -All these environment variables are overridden by the command-line -option -.BR \-\-locale . -. -. -.P -The -.I default language -can be specified by specifying one of the pseudo-language parameters -\f(CRC\fP or \f(CR\%POSIX\fP. -. -This is like deleting a formerly given -.I language -information. -. -The -.I \%man\~pages -in the -.I default language -are usually in English. -. -. -.P -Of course, the -.I language -name is determined by -.BR man . -In \f(CRGNU\fP -.BR man , -it is specified in the \%\f(CRPOSIX\~1003.1\fP based format: -.P -.nh -\fI\/\fP[\f(CB_\fP\,\fI\/\fP[\f(CB.\fP\ -\fI\/\fP[\f(CB,\fP\,\fI\/\fP]]], -.hy -.P -but the two-letter code in -.nh -.I -.hy -is sufficient for most purposes. -. -If for a complicated -.I language -formulation no -.I \%man\~pages -are found -.B \%groffer -searches the country part consisting of these first two characters as -well. -. -. -.P -The actual directory set is copied thrice. -. -The -.I language -name is appended as subdirectory to each directory in the first copy -of the actual directory set (this is only done when a language -information is given). -. -Then the 2-letter abbreviation of the -.I language -name is appended as subdirectories to the second copy of the directory -set (this is only done when the given language name has more than 2 -letters). -. -The third copy of the directory set is kept unchanged (if no -.I language -information is given this is the kept directory set). -. -These maximally 3 copies are appended to get the new directory set. -. -. -.P -We now have a complete set of directories to work with. -. -In each of these directories, the -.I man -files are separated in -.IR sections . -. -The name of a -.I section -is represented by a single character, a digit between -.I 1 -and -.IR 9 , -or the character -.I o -or -.IR n , -in this order. -. -. -.P -For each available -.IR section , -a subdirectory -.BI man
-exists containing all -.I man -files for this -.IR section , -where -.I
-is a single character as described before. -. -Each -.I man -file in a -.I section -directory has the form -.IR \%\f(CBman\fP
\f(CB/\fP\f(CB.\fP
\ -[][\f(CB.\fP] , -where -.I \% -and -.I \% -are optional. -. -.I \% -is the name of the -.I \%man\~page -that is also specified as filespec argument on the command line. -. -. -.P -The -.I extension -is an addition to the section. -. -This postfix acts like a subsection. -. -An -.I extension -occurs only in the file name, not in name of the -.I section -subdirectory. -. -It can be specified on the command line. -. -. -.P -On the other hand, the -.I compression -is just an information on how the file is compressed. -. -This is not important for the user, such that it cannot be specified -on the command line. -. -. -.P -There are 4 methods to specify a -.I section -on the command line: -. -.IP \*(BU 2m -Environment variable -.I \%MANSECT -. -.IP \*(BU 2m -Command line option -.B \-\-sections -. -.IP \*(BU 2m -Appendix to the -.I name -argument in the form -.I .
-. -.IP \*(BU 2m -Preargument before the -.I name -argument in the form -.I
-. -. -.P -It is also possible to specify several -.I sections -by appending the single characters separated by colons. -. -One can imagine that this means to restrict the -.I \%man\~page -search to only some -.IR sections . -. -The multiple -.I sections -are only possible for -.I \%MANSECT -and -.BR \-\-sections . -. -. -.P -If no -.I section -is specified all -.I sections -are searched one after the other in the given order, starting with -.IR section\~1 , -until a suitable file is found. -. -. -.P -There are 4 methods to specify an -.I extension -on the command line. -. -But it is not necessary to provide the whole extension name, some -abbreviation is good enough in most cases. -. -.IP \*(BU 2m -Environment variable -.I \%EXTENSION -. -.IP \*(BU 2m -Command line option -.B \-\-extension -. -.IP \*(BU 2m -Appendix to the -.I .
-argument in the form -.I .
-. -.IP \*(BU 2m -Preargument before the -.I name -argument in the form -.I
-. -. -.P -For further details on -.I \%man\~page -searching, see -.BR \%man (1). -. -. -.\" ==================================================================== -.SS "Examples of man files" -.\" ==================================================================== -. -.TP -.B /usr/share/man/man1/groff.1 -This is an uncompressed file for the -.I \%man\~page -\f(CRgroff\fP in -.IR section\~1 . -. -It can be called by -.EX -\fIsh#\fR groffer\~groff -.EE -No -.I section -is specified here, so all -.I sections -should be searched, but as -.I section\~1 -is searched first this file will be found first. -. -The file name is composed of the following components. -.B /usr/share/man/ -must be part of the -.IR \%man\~path ; -the subdirectory -.B man1/ -and the part -.B .1 -stand for the -.IR section ; -.B groff -is the name of the -.IR \%man\~page . -. -. -.TP -.B /usr/local/share/man/man7/groff.7.gz -The file name is composed of the following components. -.B /usr/local/share/man -must be part of the -.IR \%man\~path ; -the subdirectory -.B man7/ -and the part -.B .7 -stand for the -.IR section ; -.B groff -is the name of the -.IR \%man\~page ; -the final part -.B .gz -stands for a compression with -.BR gzip (1). -As the -.I section -is not the first one it must be specified as well. -. -This can be done by one of the following commands. -.EX -\fIsh#\fR\~groffer\~groff.7 -\fIsh#\fR\~groffer\~7\~groff -\fIsh#\fR\~groffer\~\-\-sections=7\~groff -.EE -. -.TP -.B /usr/local/man/man1/ctags.1emacs21.bz2 -Here -.B /usr/local/man -must be in -.IR \%man\~path ; -the subdirectory -.B man1/ -and the file name part -.B .1 -stand for -.IR section\~1 ; -the name of the -.I \%man\~page -is -.BR ctags ; -the section has an extension -.BR emacs21 ; -and the file is compressed as -.B .bz2 -with -.BR bzip2 (1). -The file can be viewed with one of the following commands -.EX -\fIsh#\fR\~groffer\~ctags.1e -\fIsh#\fR\~groffer\~1e\~ctags -\fIsh#\fR\~groffer\~\-\-extension=e\~\-\-sections=1\~ctags -.EE -where \f(CRe\fP works as an abbreviation for the extension -\f(CRemacs21\fP. -. -. -.TP -.B /usr/man/linux/de/man7/man.7.Z -The directory -.B /usr/man -is now part of the -.IR \%man\~path ; -then there is a subdirectory for an -.I operating system -name -.BR linux/ ; -next comes a subdirectory -.B de/ -for the German -.IR language ; -the -.I section -names -.B man7 -and -.B .7 -are known so far; -.B man -is the name of the -.IR \%man\~page ; -and -.B .Z -signifies the compression that can be handled by -.BR gzip (1). -We want now show how to provide several values for some options. -. -That is possible for -.I sections -and -.I operating system -names. -. -So we use as -.I sections\~5 -and -.I 7 -and as -.I system -names -.I linux -and -.IR aix . -The command is then -.sp -.EX -\fIsh#\fR groffer\~\-\-locale=de\~\-\-sections=5:7\~\-\-systems=linux,aix\~man -\fIsh#\fR LANG=de\~MANSECT=5:7\~SYSTEM=linux,aix\~groffer\~man -.EE -. -. -.\" ==================================================================== -.SH DECOMPRESSION -.\" ==================================================================== -. -The program has a decompression facility. -. -If standard input or a file that was retrieved from the command line -parameters is compressed with a format that is supported by either -.BR \%gzip (1) -or -.BR \%bzip2 (1) -it is decompressed on-the-fly. -. -This includes the \f(CRGNU\fP -.BR \%.gz , -.BR \%.bz2 , -and the traditional -.B \%.Z -compression. -. -The program displays the concatenation of all decompressed input in -the sequence that was specified on the command line. -. -. -.\" ==================================================================== -.SH "ENVIRONMENT" -.\" ==================================================================== -. -The -.B \%groffer -program supports many system variables, most of them by courtesy of -other programs. -. -All environment variables of -.BR \%groff (@MAN1EXT@) -and \f(CRGNU\fP -.BR \%man (1) -and some standard system variables are honored. -. -. -.\" ==================================================================== -.SS "Native groffer Variables" -.\" ==================================================================== -. -.TP -.I \%GROFFER_OPT -Store options for a run of -.BR \%groffer . -. -The options specified in this variable are overridden by the options -given on the command line. -. -The content of this variable is run through the shell builtin -\[lq]eval\[rq], -so arguments containing whitespace or special shell characters should -be quoted. -. -Do not forget to export this variable, otherwise it does not exist -during the run of -.BR groffer . -. -. -.\" ==================================================================== -.SS "System Variables" -.\" ==================================================================== -. -The following variables have a special meaning for -.BR \%groffer . -. -. -.TP -.I \%DISPLAY -If set, this variable indicates that the X Window System is running. -. -Testing this variable decides on whether graphical or text output is -generated. -. -This variable should not be changed by the user carelessly, but it can -be used to start the graphical -.B \%groffer -on a remote X Window System terminal. -. -For example, depending on your system, -.B \%groffer -can be started on the second monitor by the command -.sp -.EX -\fIsh#\fR DISPLAY=:0.1\~groffer\~what.ever & -.EE -. -. -.TP -.I \%LC_ALL -.TQ -.I \%LC_MESSAGES -.TQ -.I LANG -If one of these variables is set (in the above sequence), its content -is interpreted as the locale, the language to be used, especially when -retrieving -.IR \%man\~pages . -. -A locale name is typically of the form -.nh -.IR language [\c -.B _\c -.IR territory [\c -.B .\c -.IR codeset [\c -.B @\c -.IR modifier ]]], -.hy -where -.I \%language -is an ISO 639 language code, -.I \%territory -is an ISO 3166 country code, and -.I \%codeset -is a character set or encoding identifier like ISO-8859-1 or UTF-8; -see -.BR \%setlocale (3). -. -The locale values \f(CRC\fP and \%\f(CRPOSIX\fP -stand for the default, i.e.\& the -.I \%man\~page -directories without a language prefix. -. -This is the same behavior as when all 3\~variables are unset. -. -. -.TP -.I \%PAGER -This variable can be used to set the pager for the tty output. -. -For example, to disable the use of a pager completely set this -variable to the -.BR \%cat (1) -program -.sp -.EX -\fIsh#\fR PAGER=cat\~groffer\~anything -.EE -.sp -. -.TP -.I PATH -All programs within the -.B \%groffer -script are called without a fixed path. -. -Thus this environment variable determines the set of programs used -within the run of -.BR \%groffer . -. -. -.\" ==================================================================== -.SS "Groff Variables" -.\" ==================================================================== -. -The -.B \%groffer -program internally calls -.BR \%groff , -so all environment variables documented in -.BR \%groff (@MAN1EXT@) -are internally used within -.B \%groffer -as well. -. -The following variable has a direct meaning for the -.B \%groffer -program. -. -.TP -.I \%GROFF_TMPDIR -If the value of this variable is an existing, writable directory, -.B \%groffer -uses it for storing its temporary files, just as -.B groff -does. -. -See the -.BR \%groff (@MAN1EXT@) -man page for more details on the location of temporary files. -. -. -.\" ==================================================================== -.SS "Man Variables" -.\" ==================================================================== -. -Parts of the functionality of the -.B man -program were implemented in -.BR \%groffer ; -support for all environment variables documented in -.BR \%man (1) -was added to -.BR \%groffer , -but the meaning was slightly modified due to the different approach in -.BR \%groffer ; -but the user interface is the same. -. -The -.B man -environment variables can be overwritten by options provided with -.IR MANOPT , -which in turn is overwritten by the command line. -. -. -.TP -.I \%EXTENSION -Restrict the search for -.I \%man\~pages -to files having this extension. -. -This is overridden by option -.BR \-\-extension ; -see there for details. -. -. -.TP -.I MANOPT -This variable contains options as a preset for -.BR \%man (1). -As not all of these are relevant for -.B \%groffer -only the essential parts of its value are extracted. -. -The options specified in this variable overwrite the values of the -other environment variables that are specific to -.IR man . -. -All options specified in this variable are overridden by the options -given on the command line. -. -. -.TP -.I \%MANPATH -If set, this variable contains the directories in which the -.I \%man\~page -trees are stored. -. -This is overridden by option -.BR \%\-\-manpath . -. -. -.TP -.I \%MANSECT -If this is a colon separated list of section names, the search for -.I \%man\~pages -is restricted to those manual sections in that order. -. -This is overridden by option -.BR \-\-sections . -. -. -.TP -.I \%SYSTEM -If this is set to a comma separated list of names these are interpreted -as -.I \%man\~page -trees for different operating systems. -. -This variable can be overwritten by option -.BR \-\-systems ; -see there for details. -. -. -.P -The environment variable -.I \%MANROFFSEQ -is ignored by -.B \%groffer -because the necessary preprocessors are determined automatically. -. -. -.\" ==================================================================== -.SH "CONFIGURATION FILES" -.\" ==================================================================== -. -The -.B \%groffer -program can be preconfigured by two configuration files. -. -. -.TP -.B \%/etc/groff/groffer.conf -System-wide configuration file for -.BR \%groffer . -. -. -.TP -.B \%$HOME/.groff/groffer.conf -User-specific configuration file for -.BR \%groffer , -where -.I \%$HOME -denotes the user's home directory. -. -This file is called after the system-wide configuration file to enable -overriding by the user. -. -. -.P -Both files are handled for the configuration, but the configuration -file in -.B /etc -comes first; it is overwritten by the configuration file in the home -directory; both configuration files are overwritten by the environment -variable -.IR \%GROFFER_OPT ; -everything is overwritten by the command line arguments. -. -. -.P -The configuration files contain options that should be called as -default for every -.B \%groffer -run. -. -These options are written in lines such that each contains either a -long option, a short option, or a short option cluster; each with or -without an argument. -. -So each line with configuration information starts with a minus -character -.RB \[lq] \- \[rq]; -a line with a long option starts with two minus characters -.RB \[lq] \-\- \[rq], -a line with a short option or short option cluster starts with a -single minus -.RB \[lq] \- \[rq]. -. -. -.P -The option names in the configuration files may not be abbreviated, -they must be exact. -. -. -.P -The argument for a long option can be separated from the option name -either by an equal sign -.RB \[lq] = \[rq] -or by whitespace, i.e.\& one or several space or tab characters. -. -An argument for a short option or short option cluster can be directly -appended to the option name or separated by whitespace. -. -The end of an argument is the end of the line. -. -It is not allowed to use a shell environment variable in an option -name or argument. -. -. -.P -It is not necessary to use quotes in an option or argument, except for -empty arguments. -. -An empty argument can be provided by appending a pair of quotes to the -separating equal sign or whitespace; with a short option, the -separator can be omitted as well. -. -For a long option with a separating equal sign -.RB \[lq] = \[rq], -the pair of quotes can be omitted, thus ending the line with the -separating equal sign. -. -All other quote characters are cancelled internally. -. -. -.P -In the configuration files, arbitrary whitespace is allowed at the -beginning of each line, it is just ignored. -. -Each whitespace within a line is replaced by a single space character -\[lq] \[rq] internally. -. -. -.P -All lines of the configuration lines that do not start -with a minus character are ignored, such that comments starting with -.RB \[lq] # \[rq] -are possible. -. -So there are no shell commands in the configuration files. -. -. -.P -As an example, consider the following configuration file that can be -used either in -.B \%/etc/groff/groffer.conf -or -.B \%\s+2~\s0/.groff/groffer.conf . -. -. -.P -.ft CR -.nh -.nf -# groffer configuration file -# -# groffer options that are used in each call of groffer -\-\-foreground=DarkBlue -\-\-resolution=100 -\-\-viewer=gxditview \-geometry 900x1200 -.fi -.hy -.ft -. -. -.P -The lines starting with -.B # -are just ignored, so they act as command lines. -. -This configuration sets four -.B \%groffer -options (the lines starting with -.RB \[lq] \- \[rq]). -This has the following effects: -. -. -.IP \*(BU 2m -Use a text color of -.B \%DarkBlue -in all viewers that support this, such as -.BR \%gxditview . -. -. -.IP \*(BU 2m -Use a resolution of -.B 100dpi -in all viewers that support this, such as -.BR \%gxditview . -. -By this, the default device in -.I x mode -is set to -.BR X100 . -. -. -.IP \*(BU 2m -Force -.BR \%gxditview (@MAN1EXT@) -as the -.I \%x-mode -viewer using the geometry option for setting the width to -.B 900px -and the height to -.BR 1200px . -This geometry is suitable for a resolution of -.BR 100dpi . -. -. -.IP \*(BU 2m -Use -.BR \%xpdf (1) -as the -.I \%pdf-mode -viewer with the argument -.B \-Z -.BR 150 . -. -. -.\" ==================================================================== -.SH "EXAMPLES" -.\" ==================================================================== -. -The usage of -.B \%groffer -is very easy. -. -Usually, it is just called with a file name or -.IR \%man\~page . -. -The following examples, however, show that -.B \%groffer -has much more fancy capabilities. -. -.sp -.EX -\fIsh#\fR\~groffer\~/usr/local/share/doc/groff/meintro.ms.gz -.EE -.sp -Decompress, format and display the compressed file -.B meintro.ms.gz -in the directory -.BR /usr/local/share/doc/groff , -using the standard viewer -.B \%gxditview -as graphical viewer when in the X Window System, or the -.BR \%less (1) -pager program otherwise. -. -.sp -.EX -\fIsh#\fR\~groffer\~groff -.EE -.sp -If the file -.B \%./groff -exists use it as input. -. -Otherwise interpret the argument as a search for the -.I \%man\~page -named -.B \%groff -in the smallest possible -.IR \%man\~section , -being section 1 in this case. -. -.sp -.EX -\fIsh#\fR\~groffer\~man:groff -.EE -.sp -search for the -.I \%man\~page -of -.B \%groff -even when the file -.B ./groff -exists. -. -.sp -.EX -\fIsh#\fR\~groffer\~groff.7 -\fIsh#\fR\~groffer\~7\~groff -.EE -.sp -search the -.I \%man\~page -of -.B \%groff -in -.I \%man\~section -.BR 7 . -This section search works only for a digit or a single character from -a small set. -. -.sp -.EX -\fIsh#\fR\~groffer\~fb.modes -.EE -.sp -If the file -.B ./fb.modes -does not exist interpret this as a search for the -.I \%man\~page -of -.BR fb.modes . -As the extension -.I \%modes -is not a single character in classical section style the argument is -not split to a search for -.BR fb . -. -.sp -.EX -\fIsh#\fR\~groffer\~groff\~\(cqtroff(1)\(cq\~man:roff -.EE -.sp -The arguments that are not existing files are looked-up as the -following -.IR \%man\~pages : -.B \%groff -(automatic search, should be found in \fIman\fP\~section\~1), -.B \%troff -(in section\~1), -and -.B \%roff -(in the section with the lowest number, being\~7 in this case). -. -The quotes around -.nh -.I \(cqtroff(1)\(cq -.hy -are necessary because the parentheses are special shell characters; -escaping them with a backslash character -.I \(rs( -and -.I \(rs) -would be possible, too. -. -The formatted files are concatenated and displayed in one piece. -. -.sp -.EX -\fIsh#\fR\~LANG=de\~groffer\~\-\-man\~\-\-viewer=galeon\~ls -.EE -.sp -Retrieve the German -.I \%man\~page -(language -.IR de ) -for the -.B ls -program, decompress it, format it to -.I \%html -or -.I \%xhtml -format -.nh -.RI ( \%www\~mode ) -.hy -and view the result in the web browser -.BR \%galeon . -The option -.B \-\-man -guarantees that the -.I \%man\~page -is retrieved, even when a local file -.B \%ls -exists in the actual directory. -. -. -.sp -.EX -\fIsh#\fR\~groffer\~\-\-source\~'man:roff(7)' -.EE -.sp -Get the -.I \%man\~page -called -.I \%roff -in \fIman\fP\~section 7, decompress it, and print its unformatted -content, its source code. -. -. -.sp -.EX -\fIsh#\fR\~groffer\~\-\-de-p\~\-\-in\~\-\-ap -.EE -.sp -This is a set of abbreviated arguments, it is determined as -.br -.sp -.EX -\fIsh#\fR\~groffer\~\-\-debug-params\~\-\-intermediate-output\~\-\-apropos -.EE -.sp -. -.sp -.EX -\fIsh#\fR\~cat\~file.gz\~|\~groffer\~-Z\~-mfoo -.EE -.sp -. -The file -.B file.gz -is sent to standard input, this is decompressed, and then this is -transported to the -.I \%groff intermediate output mode -without post-processing -.RB ( groff -option -.BR \-Z ), -using macro package -.I \%foo -.RB ( groff -option -.BR \-m ). -. -. -.sp -.EX -\fIsh#\fR\~echo\~'\(rsf(CBWOW!'\~| -> groffer \-\-x \-\-bg red \-\-fg yellow \-\-geometry 200x100 \- -.EE -.sp -. -Display the word \f(CBWOW!\fP in a small window in constant-width -bold font, using color yellow on red background. -. -. -.\" ==================================================================== -.SH "COMPATIBILITY" -.\" ==================================================================== -. -The -.B \%groffer -program is written in Perl, the Perl version during writing was v5.8.8. -. -. -.P -.B \%groffer -provides its own parser for command-line arguments that is compatible -to both \%\f(CRPOSIX\fP -.BR \%getopts (1) -and \%\f(CRGNU\fP -.BR \%getopt (1). -It can handle option arguments and file names containing white space -and a large set of special characters. -. -The following standard types of options are supported. -. -. -.IP \*(BU 2m -The option consisting of a single minus -.B \- -refers to standard input. -. -. -.IP \*(BU 2m -A single minus followed by characters refers to a single character -option or a combination thereof; for example, the -.B \%groffer -short option combination -.B \-Qmfoo -is equivalent to -.BR \-Q\~\-m\~foo . -. -. -.IP \*(BU 2m -Long options are options with names longer than one character; they -are always preceded by a double minus. -. -An option argument can either go to the next command-line argument or -be appended with an equal sign to the argument; for example, -.B \-\-long=arg -is equivalent to -.BR \-\-long\~arg . -. -. -.IP \*(BU 2m -An argument of -.B \-\- -ends option parsing; all further command-line arguments are -interpreted as -.I \%filespec -parameters, i.e.\& file names or constructs for searching -.IR \%man\~pages ). -. -. -.IP \*(BU 2m -All command-line arguments that are neither options nor option -arguments are interpreted as -.I \%filespec -parameters and stored until option parsing has finished. -. -For example, the command line -.sp -.EX -\fIsh#\fR\~groffer file1 \-a \-o arg file2 -.EE -.sp -is equivalent to -.sp -.EX -\fIsh#\fR\~groffer \-a \-o arg \-\- file1 file2 -.EE -.sp -. -.P -The free mixing of options and -.I \%filespec -parameters follows the GNU principle. -. -That does not fulfill the strange option behavior of \%\f(CRPOSIX\fP -that ends option processing as soon as the first non-option argument -has been reached. -. -The end of option processing can be forced by the option -.RB \[lq] \-\- \[rq] -anyway. -. -. -.\" ==================================================================== -.SH AUTHORS -.\" ==================================================================== -.B groffer -was written by -.MT groff\-bernd.warken\-72@\:web.de -Bernd Warken -.ME . -. -. -.\" ==================================================================== -.SH "SEE ALSO" -.\" ==================================================================== -. -.P -.BR \%groff (@MAN1EXT@), -.BR \%@g@troff (@MAN1EXT@) -.RS -Details on the options and environment variables available in -.BR \%groff ; -all of them can be used with -.BR \%groffer . -.RE -. -. -.TP -.BR \%grog (@MAN1EXT@) -This program tries to guess the necessary -.B \%groff -command-line options from the input and the -.B groffer -options. -. -. -.TP -.BR \%groff (@MAN7EXT@) -Documentation of the -.I \%groff -language. -. -. -.TP -.BR groff_char (@MAN7EXT@) -Documentation on the -.I \%groff -characters, special characters, and glyphs.. -. -. -.TP -.BR groff_tmac (@MAN5EXT@) -Documentation on the -.I \%groff -macro files. -. -. -.TP -.BR groff_out (@MAN5EXT@) -Documentation on the -.I \%groff intermediate output -before the run of a -.IR postprocessor . -.nh -.RI ( ditroff -output). -.hy -. -This can be run by the -.B groff -or -.B groffer -option -.BR -Z . -. -. -.TP -.BR \%man (1) -The standard program to display -.IR \%man\~pages . -. -The information there is only useful if it is the -.I \%man\~page -for GNU -.BR man . -Then it documents the options and environment variables that are -supported by -.BR \%groffer . -. -. -.TP -.BR \%gxditview (@MAN1EXT@) -.TQ -.BR \%xditview (1x) -.RS -Viewers for -.BR \%groffer 's -.IR \%x\~mode . -.RE -. -. -.TP -.BR \%kpdf (1) -.TQ -.BR \%kghostview (1) -.TQ -.BR \%evince (1) -.TQ -.BR \%ggv (1) -.TQ -.BR \%gv (1) -.TQ -.BR \%ghostview (1) -.TQ -.BR \%gs (1) -Viewers for -.BR \%groffer 's -.IR \%ps\~mode . -. -. -.TP -.BR \%kpdf (1) -.TQ -.BR \%acroread (1) -.TQ -.BR \%evince (1) -.TQ -.BR \%xpdf (1) -.TQ -.BR \%gpdf (1) -.TQ -.BR \%kghostview (1) -.TQ -.BR \%ggv (1) -Viewers for -.BR \%groffer 's -.IR \%pdf\~mode . -. -. -.P -.BR \%kdvi (1), -.BR \%xdvi (1), -.BR \%dvilx (1) -.RS -Viewers for -.BR \%groffer 's -.IR \%dvi\~mode . -.RE -. -. -.TP -.BR \%konqueror (1) -.TQ -.BR \%epiphany (1) -.TQ -.BR \%firefox (1) -.TQ -.BR \%mozilla (1) -.TQ -.BR \%netscape (1) -.TQ -.BR \%lynx (1) -Web-browsers for -.BR \%groffer 's -.IR \%html , -.IR \%xhtml , -or -.IR \%www\~mode . -. -. -.TP -.BR \%less (1) -.TQ -.BR more (1) -Standard pager program for the -.IR \%tty\~mode . -. -. -.TP -.BR \%gzip (1) -.TQ -.BR \%bzip2 (1) -.TQ -.BR \%xz (1) -The decompression programs supported by -.BR \%groffer . -. -. -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== -. -.\" Local Variables: -.\" mode: nroff -.\" End: -.\" vim: set filetype=groff: diff --git a/contrib/groffer/groffer.am b/contrib/groffer/groffer.am deleted file mode 100644 index 7f0665a..0000000 --- a/contrib/groffer/groffer.am +++ /dev/null @@ -1,120 +0,0 @@ -# Automake rules for 'groffer' - -# File position: /contrib/groffer/groffer.am - -# Copyright (C) 2001-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg and -# Bernd Warken . -# Automake migration by Bertrand Garrigues - -# Last update: 22 Aug 2015 - -# This file is part of 'groffer' which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -groffer_srcdir = $(top_srcdir)/contrib/groffer -# generated programs -ROFF2PROGS = \ - roff2dvi \ - roff2html \ - roff2pdf \ - roff2ps \ - roff2text \ - roff2x - -# Generated man templates -ROFF2MAN = \ - contrib/groffer/roff2dvi.1.man \ - contrib/groffer/roff2html.1.man \ - contrib/groffer/roff2pdf.1.man \ - contrib/groffer/roff2ps.1.man \ - contrib/groffer/roff2text.1.man \ - contrib/groffer/roff2x.1.man - -GROFFER_PERL = \ - contrib/groffer/main_subs.pl \ - contrib/groffer/man.pl \ - contrib/groffer/split_env.sh \ - contrib/groffer/subs.pl - -GROFFER_REST = \ - contrib/groffer/roff2.1.man \ - contrib/groffer/version.sh \ - contrib/groffer/groffer.1.man \ - contrib/groffer/groffer.pl \ - contrib/groffer/roff2.pl - -EXTRA_DIST += $(GROFFER_PERL) $(GROFFER_REST) \ - contrib/groffer/ChangeLog \ - contrib/groffer/README \ - contrib/groffer/README_PERL - -# groffer_dir is set by a m4 macro -grofferdir = $(groffer_dir) -bin_SCRIPTS += groffer $(ROFF2PROGS) -groffer_DATA = $(GROFFER_PERL) contrib/groffer/version.sh -man1_MANS += \ - contrib/groffer/groffer.1 \ - contrib/groffer/roff2dvi.1 \ - contrib/groffer/roff2html.1 \ - contrib/groffer/roff2pdf.1 \ - contrib/groffer/roff2ps.1 \ - contrib/groffer/roff2text.1 \ - contrib/groffer/roff2x.1 -MOSTLYCLEANFILES += $(ROFF2MAN) - -$(ROFF2PROGS): $(groffer_srcdir)/roff2.pl - cp $(groffer_srcdir)/roff2.pl $@ - -# we take roff2.man and replace the @ROFF2MODE@ by the type of file -# (dvi, pdf, html etc ...) -$(ROFF2MAN): $(groffer_srcdir)/roff2.1.man - $(AM_V_GEN)$(MKDIR_P) contrib/groffer \ - && FILEMODE=`echo $@ | sed 's|contrib/groffer/roff2\([a-z][a-z]*\)\.1\.man|\1|g'` \ - && sed -e 's/[@]ROFF2MODE[@]/'"$$FILEMODE"'/g' \ - $(groffer_srcdir)/roff2.1.man \ - > $@; - -groffer: $(GROFFER_PERL) $(GROFFER_REST) $(SH_DEPS_SED_SCRIPT) - $(AM_V_GEN)sed -f "$(SH_DEPS_SED_SCRIPT)" \ - -e "s|[@]g[@]|$(g)|g" \ - -e "s|[@]BINDIR[@]|$(DESTDIR)$(bindir)|g" \ - -e "s|[@]libdir[@]|$(DESTDIR)$(libdir)|g" \ - -e "s|[@]groffer_dir[@]|$(DESTDIR)$(groffer_dir)|g" \ - -e "s|[@]VERSION[@]|$(VERSION)|g" \ - -e "$(SH_SCRIPT_SED_CMD)" \ - $(groffer_srcdir)/groffer.pl \ - >$@ \ - && chmod +x $@; - -uninstall_groffdirs: uninstall-groffer-hook -uninstall-groffer-hook: - if test -d $(DESTDIR)$(grofferdir); then \ - rmdir $(DESTDIR)$(grofferdir); \ - fi - - -######################################################################## -# Editor settings -######################################################################## -# -# Local Variables: -# mode: makefile-automake -# fill-column: 72 -# End: -# vim: set filetype=automake textwidth=72: diff --git a/contrib/groffer/groffer.pl b/contrib/groffer/groffer.pl deleted file mode 100755 index 697dacb..0000000 --- a/contrib/groffer/groffer.pl +++ /dev/null @@ -1,331 +0,0 @@ -#! /usr/bin/env perl - -# groffer - display groff files - -# Source file position: /contrib/groffer/groffer.pl -# Installed position: /bin/groffer - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. - -# Written by Bernd Warken . - -# Last update: 27 Aug 2015 - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -use strict; -use warnings; -#use diagnostics; - -# temporary dir and files -use File::Temp qw/ tempfile tempdir /; - -# needed for temporary dir -use File::Spec; - -# for 'copy' and 'move' -use File::Copy; - -# for fileparse, dirname and basename -use File::Basename; - -# current working directory -use Cwd; - -# $Bin is the directory where this script is located -use FindBin; - - -######################################################################## -# system variables and exported variables -######################################################################## - -require 5.6.1; - -our $Dev_Null; -our $Umask; -our @Path; -our $Start_Dir; - -our $tmpdir = ''; -our ($fh_cat, $tmp_cat); -our ($fh_stdin, $tmp_stdin); - -our @Addopts_Groff; -our %Debug; -our %Opt; - -our $Has_Compression; -our $Has_bzip; - -our $Output_File_Name; - -our $Apropos_Prog; -our $Filespec_Arg; -our $Filespec_Is_Man; -our $Macro_Pkg; -our $Manspec; -our $No_Filespecs; -our $Special_Filespec; -our $Special_Setup; - -our %Man; - -BEGIN { - $Dev_Null = File::Spec->devnull(); - - $Umask = umask 077; - - $Start_Dir = getcwd; - - # flush after each print or write command - $| = 1; -} - - -######################################################################## -# read-only variables with double-@ construct -######################################################################## - -our $File_split_env_sh; -our $File_version_sh; -our $Groff_Version; - -my $before_make; # script before run of 'make' -{ - my $at = '@'; - $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}"; -} - -my %at_at; -my $groffer_libdir; - -if ($before_make) { - my $groffer_source_dir = $FindBin::Bin; - $at_at{'BINDIR'} = $groffer_source_dir; - $at_at{'G'} = ''; - $at_at{'LIBDIR'} = ''; - $groffer_libdir = $groffer_source_dir; - $File_version_sh = File::Spec->catfile($groffer_source_dir, 'version.sh'); - $Groff_Version = ''; -} else { - $Groff_Version = '@VERSION@'; - $at_at{'BINDIR'} = '@BINDIR@'; - $at_at{'G'} = '@g@'; - $at_at{'LIBDIR'} = '@libdir@'; - $groffer_libdir = '@groffer_dir@'; - $File_version_sh = File::Spec->catfile($groffer_libdir, 'version.sh'); -} - -die "$groffer_libdir is not an existing directory;" - unless -d $groffer_libdir; - -unshift(@INC, $groffer_libdir); - -$File_split_env_sh = File::Spec->catfile($groffer_libdir, 'split_env.sh'); -die "$File_split_env_sh does not exist;" unless -f "$File_split_env_sh"; - -require 'subs.pl'; -require 'main_subs.pl'; -require 'man.pl'; - -@Path = &path_uniq( File::Spec->path() ); - -if ( &where_is_prog('gzip') ) { - $Has_Compression = 1; - $Has_bzip = 1 if &where_is_prog('bzip2'); -} - - -######################################################################## -# modes, viewers, man sections, and defaults -######################################################################## - -# configuration files -our @Conf_Files = (File::Spec->catfile(File::Spec->rootdir(), - 'etc', 'groff', 'groffer.conf'), - File::Spec->catfile("$ENV{'HOME'}", '.groff', - 'groffer.conf') - ); - -our @Default_Modes = ('pdf', 'pdf2', 'html', 'xhtml', 'ps', 'x', 'dvi', - 'tty'); -our $Default_Resolution = 100; -our $Default_tty_Device = 'utf8'; - -our @Macro_Packages = ('-man', '-mdoc', '-me', '-mm', '-mom', '-ms'); - -our %Viewer_tty = ('DVI' => [], - 'HTML' => ['lynx', 'w3m'], - 'PDF' => [], - 'PS' => [], - 'TTY' => ['less -r -R', 'more', 'pager'], - 'X' => [], - ); - -our %Viewer_X = ('DVI' => ['kdvi', 'xdvi', 'dvilx'], - 'HTML' => ['konqueror', 'epiphany'. 'mozilla-firefox', - 'firefox', 'mozilla', 'netscape', 'galeon', - 'opera', 'amaya','arena', 'mosaic'], - 'XHTML' => ['konqueror', 'epiphany'. 'mozilla-firefox', - 'firefox', 'mozilla', 'netscape', 'galeon', - 'opera', 'amaya','arena', 'mosaic'], - 'PDF' => ['okular', 'kpdf', 'acroread', 'evince', - 'xpdf -z 150', 'gpdf', 'xpdf', 'zathura'. - 'epdfview', 'qpdfview', 'apvlv', 'qpdfview', - 'kghostview --scale 1.45', 'gv', 'ggv'], - 'PS' => ['okular', 'evince', 'gv', - 'gs', 'gs_x11', 'ghostscript', 'ghostview', - 'kghostview --scale 1.45', 'ggv', 'kpdf'], - 'TTY' => ['xless'], - 'X' => ['gxditview', 'xditview'], - ); - -%Man = ('ALL' => 0, - 'AUTO_SEC' => ['1', '2', '3', '4', '5', '6', '7', '8', '9', - 'n', 'o'], - 'ENABLE' => 1, - 'EXT' => '', - 'FORCE' => 0, - 'IS_SETUP' => 0, - 'MANSPEC' => {}, - 'LANG' => '', - 'LANG2' => '', - 'PATH' => [], - 'SEC' => [], - 'SEC_CHARS' => '', - 'SYS' => [], - ); -$Man{'AUTO_SEC_CHARS'} = join('', @{$Man{'AUTO_SEC'}}); - - -######################################################################## -# given options -######################################################################## - -our %Opts_Cmdline_Short; -our %Opts_Cmdline_Long; -our $Opts_Cmdline_Long_Str; -our %Opts_Cmdline_Double; -our %Opts_Groff_Short; - -&main_set_options(); - - -######################################################################## -# $MANOPT -######################################################################## - -# handle environment variable $MANOPT -our @Manopt; - -&main_parse_MANOPT(); - - -######################################################################## -# configuration files, $GROFFER_OPT, and command line, main_config_params() -######################################################################## - -our @Options; -our @Filespecs; -our @Starting_Conf; -our @Starting_ARGV = @ARGV; - -&main_config_params(); - -if (0) { - print STDERR "<$_>\n" foreach @ARGV; -} - - -######################################################################## -# main_parse_params() -######################################################################## - -$Opt{'XRM'} = []; - -our $i = 0; -our $n = $#Options; - -&main_parse_params(); - - -######################################################################## -# main_set_mode() -######################################################################## - -our $Viewer_Background; -our $PDF_Did_Not_Work; -our $PDF_Has_gs; -our $PDF_Has_ps2pdf; -our %Display = ('MODE' => '', - 'PROG' => '', - 'ARGS' => '' - ); - -&main_set_mode(); - - -######################################################################## -# groffer temporary directory, main_temp() -######################################################################## - -&main_temp(); - - -######################################################################## -# tmp functions and compression -######################################################################## - -######################################################################## -# main_do_fileargs() and related subs -######################################################################## - -our @REG_TITLE = (); - -&main_do_fileargs(); - - - -######################################################################## -# main_set_resources() -######################################################################## - -&main_set_resources(); - - -######################################################################## -# set resources -######################################################################## - -our $groggy; -our $modefile; -our $addopts; - -&main_display(); - -&clean_up(); - - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/groffer/main_subs.pl b/contrib/groffer/main_subs.pl deleted file mode 100644 index a40e356..0000000 --- a/contrib/groffer/main_subs.pl +++ /dev/null @@ -1,2132 +0,0 @@ -#! /usr/bin/env perl - -# groffer - display groff files - -# Source file position: /contrib/groffer/subs.pl -# Installed position: /lib/groff/groffer/subs.pl - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# Last update: 27 Aug 2015 - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## -# This file contains the main functions formerly in 'groff.pl' - -use strict; -use warnings; - - -######################################################################## -# main_set_options() -######################################################################## - -sub main_set_options { - our %Opts_Cmdline_Short; - our %Opts_Cmdline_Long; - our $Opts_Cmdline_Long_Str; - our %Opts_Cmdline_Double; - our %Opts_Groff_Short; - - # the following options are ignored in groffer.pl, but are kept from - # groffer.sh: --shell arg, --debug-shell - - my @opts_ignored_short_na = (); - my @opts_ignored_short_arg = (); - - my @opts_ignored_long_na = ('debug-shell'); - - my @opts_ignored_long_arg = ('shell'); - - - ###### groffer native options - - my @opts_groffer_short_na = ('h', 'Q', 'v', 'V', 'X', 'Z'); - my @opts_groffer_short_arg = ('T'); - - my @opts_groffer_long_na = ('auto', 'apropos', 'apropos-data', - 'apropos-devel', 'apropos-progs', 'debug', 'debug-all', - 'debug-filenames', 'debug-func', 'debug-grog', 'debug-not-func', - 'debug-keep', 'debug-lm', 'debug-params', 'debug-stacks', - 'debug-tmpdir', 'debug-user', 'default', 'do-nothing', 'dvi', - 'groff', 'help', 'intermediate-output', 'html', 'latin1', 'man', - 'no-location', 'no-man', 'no-special', 'pdf', 'pdf2', 'ps', 'rv', - 'source', 'text', 'to-stdout', 'text-device', 'tty', 'tty-device', - 'utf8', 'version', 'whatis', 'where', 'www', 'x', 'X', 'xhtml'); - -### main_set_options() - my @opts_groffer_long_arg = - ('default-modes', 'device', 'extension', 'fg', 'fn', 'font', - 'foreground', 'mode', 'print', 'title', 'viewer', - # tty viewers are ignored - 'dvi-viewer-tty', 'html-viewer-tty', 'pdf-viewer-tty', - 'ps-viewer-tty', 'tty-viewer-tty', 'www-viewer-tty', - 'X-viewer-tty', 'x-viewer-tty', 'xhtml-viewer-tty',, - # viewers for modes are ignored - 'dvi-viewer', 'html-viewer', 'pdf-viewer', 'ps-viewer', 'tty-viewer', - 'www-viewer', 'X-viewer', 'x-viewer', 'xhtml-viewer', - ); - - ##### groffer options inhereted from groff - - my @opts_groff_short_na = ('a', 'b', 'c', 'C', 'e', 'E', 'g', 'G', - 'i', 'j', 'J', 'k', 'l', 'N', 'p', 'R', 's', 'S', 't', 'U', 'z'); - - my @opts_groff_short_arg = ('d', 'f', 'F', 'I', 'K', 'L', 'm', 'M', 'n', - 'o', 'P', 'r', 'w', 'W'); - - my @opts_groff_long_na = (); - my @opts_groff_long_arg = (); - - ##### groffer options inhereted from the X Window toolkit - - my @opts_x_short_na = (); - my @opts_x_short_arg = (); - - my @opts_x_long_na = ('iconic', 'rv'); - - my @opts_x_long_arg = ('background', 'bd', 'bg', 'bordercolor', - 'borderwidth', 'bw', 'display', 'fg', 'fn', 'font', 'foreground', - 'ft', 'geometry', 'resolution', 'title', 'xrm'); - -### main_set_options() - ###### groffer options inherited from man - - my @opts_man_short_na = (); - my @opts_man_short_arg = (); - - my @opts_man_long_na = ('all', 'ascii', 'catman', 'ditroff', - 'local-file', 'location', 'troff', 'update'); - - my @opts_man_long_arg = ('locale', 'manpath', 'pager', - 'preprocessor', 'prompt', 'sections', 'systems', 'troff-device'); - - ###### additional options for parsing evironment variable $MANOPT only - - my @opts_manopt_short_na = ('7', 'a', 'c', 'd', 'D', 'f', 'h', 'k', - 'l', 't', 'u', 'V', 'w', 'Z'); - - my @opts_manopt_short_arg = ('e', 'L', 'm', 'M', 'p', 'P', 'r', 'S', - 'T'); - - my @opts_manopt_long_na = (@opts_man_long_na, 'apropos', 'debug', - 'default', 'help', 'html', 'ignore-case', 'location-cat', - 'match-case', 'troff', 'update', 'version', 'whatis', 'where', - 'where-cat'); - - my @opts_manopt_long_arg = (@opts_man_long_na, 'config_file', - 'encoding', 'extension', 'locale'); - -### main_set_options() - ###### collections of command-line options - - # There are two hashes that control the whole of the command-line - # options, one for short and one for long options. Options without - # and with arguments are mixed by advicing a value of 0 for an option - # without argument and a value of 1 for an option with argument. - # The options are with leading minus. - - foreach (@opts_groffer_short_na, @opts_groff_short_na, - @opts_x_short_na, @opts_man_short_na, @opts_ignored_short_na) { - $Opts_Cmdline_Short{"-$_"} = 0 if $_; - } - foreach (@opts_groffer_short_arg, @opts_groff_short_arg, - @opts_x_short_arg, @opts_man_short_arg, @opts_ignored_short_arg) { - $Opts_Cmdline_Short{"-$_"} = 1 if $_; - } - - foreach (@opts_groffer_long_na, @opts_groff_long_na, - @opts_x_long_na, @opts_man_long_na, @opts_ignored_long_na) { - $Opts_Cmdline_Long{"--$_"} = 0 if $_; - } - foreach (@opts_groffer_long_arg, @opts_groff_long_arg, - @opts_x_long_arg, @opts_man_long_arg, @opts_ignored_long_arg) { - $Opts_Cmdline_Long{"--$_"} = 1 if $_; - } - - # For determining abbreviations of an option take two spaces as join - # for better check. - # The options are without leading minus. - $Opts_Cmdline_Long_Str = join ' ', keys %Opts_Cmdline_Long; - if ($Opts_Cmdline_Long_Str) { - $Opts_Cmdline_Long_Str = " $Opts_Cmdline_Long_Str "; - $Opts_Cmdline_Long_Str =~ s/--//g; - } - -### main_set_options() - # options with equal meaning are mapped to a single option name - # all of these have leading minus characters - %Opts_Cmdline_Double = ('-h' => '--help', - '-Q' => '--source', - '-T' => '--device', - '-v' => '--version', - '-Z' => '--intermediate-output', - '--bd' => '--bordercolor', - '--bg' => '--background', - '--bw' => '--borderwidth', - '--debug-all' => '--debug', - '--ditroff' => '--intermediate-output', - '--fg' => '--foreground', - '--fn' => '--font', - '--ft' => '--font', - '--latin1' => '--tty', - '--troff-device' => '--device', - '--tty-device' => '--text-device', - '--viewer' => '--viewer', - '--where' => '--location', - '--www' => '--html', - '--X' => '--x', - '--xhtml' => '--html', - # '--dvi-viewer' => '--viewer', - '--dvi-viewer-tty' => '--viewer', - '--html-viewer-tty' => '--viewer', - '--xhtml-viewer-tty' => '--pager', - '--pdf-viewer-tty' => '--viewer', - '--ps-viewer-tty' => '--viewer', - '--tty-viewer' => '--pager', - '--tty-viewer-tty' => '--pager', - '--www-viewer' => '--viewer', - '--www-viewer-tty' => '--pager', - '--X-viewer' => '--viewer', '--X-viewer-tty' - => '--pager', '--x-viewer' => '--viewer', - '--x-viewer-tty' => '--pager', ); - - # groff short options with leading minus - foreach (@opts_groff_short_na) { - $Opts_Groff_Short{"-$_"} = 0; - } - foreach (@opts_groff_short_arg) { - $Opts_Groff_Short{"-$_"} = 1; - } - -} # main_set_options() - - -######################################################################## -# main_parse_MANOPT -######################################################################## - -sub main_parse_MANOPT { - our @Manopt; - our $File_split_env_sh; - - if ( $ENV{'MANOPT'} ) { - @Manopt = `sh $File_split_env_sh MANOPT`; - chomp @Manopt; - - my @manopt; - # %opts stores options that are used by groffer for $MANOPT - # All options not in %opts are ignored. - # Check options used with %Opts_Cmdline_Double. - # 0: option used ('' for ignore), 1: has argument or not - ### main_parse_MANOPT() - my %opts = ('-7' => ['--ascii', 0], - '-L' => ['--locale', 1], - '-M' => ['--manpath', 1], - '-P' => ['--pager', 1], - '-S' => ['--sections', 1], - '-T' => ['-T', 1], - '-w' => ['--location', 0], - '-a' => ['--all', 0], - '-c' => ['', 1], - '-e' => ['--extension', 1], - '-f' => ['--whatis', 1], - '-m' => ['--systems', 1], - '-p' => ['', 1], - '-r' => ['', 1], - '-manpath' => ['--manpath', 1], - '-pager' => ['--pager', 1], - '-prompt' => ['', 1], - '-sections' => ['--sections', 1], - '--all' => ['--all', 0], - '--ascii' => ['--ascii', 0], - '--catman' => ['', 1], - '--device' => ['-T', 1], - '--extension' => ['--extension', 1], - '--locale' => ['--locale', 1], - '--location' => ['--location', 0], - '--manpath' => ['--manpath', 1], - '--preprocessor' => ['', 1], - '--systems' => ['--systems', 1], - '--whatis' => ['--whatis', 1], - '--where' => ['--location', 0], - ); - -### main_parse_MANOPT() - my ($opt, $has_arg); - my $i = 0; - my $n = $#Manopt; - while ($i <= $n) { - my $o = $Manopt[$i]; - ++$i; - # ignore, when not in %opts - next unless (exists $opts{$o}); - if (($o eq '-D') or ($o eq '--default')) { - @manopt = (); - next; - } - $opt = $opts{$o}[0]; - $has_arg = $opts{$o}[1]; - # ignore, when empty in %opts - unless ($opt) { - # ignore without argument - next unless ($has_arg); - # ignore the argument as well - ++$i; - next; - } - if ($has_arg) { - last if ($i > $n); - push @manopt, $opt, $Manopt[$i]; - ++$i; - next; - } else { - push @manopt, $opt; - next; - } - } - @Manopt = @manopt; - } -} # main_parse_MANOPT() - - -######################################################################## -# configuration files, $GROFFER_OPT, and command line, main_config_params() -######################################################################## - -sub main_config_params { # handle configuration files - our @Options; - our @Filespecs; - our @Starting_Conf; - our @Starting_ARGV = @ARGV; - - our %Opts_Cmdline_Short; - our %Opts_Cmdline_Long; - our $Opts_Cmdline_Long_Str; - our %Opts_Cmdline_Double; - our %Opts_Groff_Short; - - our $File_split_env_sh; - our @Manopt; - our @Conf_Files; - - # options may not be abbreviated, but must be exact - my @conf_args; - foreach my $f ( @Conf_Files ) { - if (-s $f) { - my $fh; - open $fh, "<$f" || next; - my $nr = 0; - LINE: foreach my $line (<$fh>) { - ++ $nr; - chomp $line; - # remove starting and ending whitespace - $line =~ s/^\s+|\s+$//g; - # replace whitespace by single space - $line =~ s/\s+/ /g; - # ignore all lines that do not start with minus - next unless $line =~ /^-/; - # three minus - if ($line =~ /^---/) { - warn "Wrong option $line in configuration file $f.\n"; - next; - } - if ( $line =~ /^--[ =]/ ) { - warn "No option name in '$line' in configuration " . - "file $f.\n"; - next; - } - push @Starting_Conf, $line; - # -- or - - if ($line =~ /^--?$/) { - warn "'$line' is not allowed in configuration files.\n"; - next; } -### main_config_params() - if ($line =~ /^--/) { # line is long option - my ($name, $arg); - if ($line =~ /[ =]/) { # has arg on line $line =~ - /^(--[^ =]+)[ =] ?(.*)$/; - ($name, $arg) = ($1, $2); - $arg =~ s/[\'\"]//g; - } else { # does not have an argument on line - $name = $line; - } $name =~ s/[\'\"]//g; - unless (exists $Opts_Cmdline_Long{$name}) { - # option does not exist - warn "Option '$name' does not exist.\n"; - next LINE; - } - # option exists - if ( $Opts_Cmdline_Long{$name} ) { # option has arg - if (defined $arg) { - push @conf_args, $name, $arg; - next LINE; - } else { warn "Option '$name' needs an argument in " . - "configuration file $f\n"; - next LINE; - } - } else { # option has no arg - if (defined $arg) { - warn "Option '$name' may not have an argument " . - "in configuration file $f\n"; - next LINE; - } else { - push @conf_args, $name; next LINE; - } - } -### main_config_params() - } else { # line is short option or cluster - $line =~ s/^-//; - while ($line) { - $line =~ s/^(.)//; - my $opt = "-$1"; - next if ($opt =~ /\'\"/); - if ($opt =~ /- /) { - warn "Option '$conf_args[$#conf_args]' does not " . - "have an argument.\n"; - next LINE; - } - if ( exists $Opts_Cmdline_Short{$opt} ) { - # short opt exists - push @conf_args, $opt; - if ( $Opts_Cmdline_Short{$opt} ) { # with arg - my $arg = $line; - $arg =~ s/^ //; - $arg =~ s/\'\"//g; - push @conf_args, "$arg"; - next LINE; - } else { # no arg - next; - } - } else { # short option does not exist - warn "Wrong short option '-$opt' from " . - "configuration. Rest of line ignored.\n"; - next LINE; - } - } - } - } - close $fh; - } - } - -### main_config_params() - #handle environment variable $GROFFER_OPT - my @GROFFER_OPT; - if ( $ENV{'GROFFER_OPT'} ) { - @GROFFER_OPT = `sh $File_split_env_sh GROFFER_OPT`; - chomp @GROFFER_OPT; - } - - # Handle command-line parameters together with $GROFFER_OPT. - # Options can be abbreviated, with each - as abbreviation place. - { - my @argv0 = (@GROFFER_OPT, @ARGV); - my @argv; - my $only_files = 0; - my $n = $#argv0; # last element - my $n1 = scalar @GROFFER_OPT; # first element of @ARGV - my $i = 0; # number of the element - my @s = ('the environment variable $GROFFER_OPT', 'the command line'); - my $j = 0; # index in @s, 0 before $n1, 1 then - ELT: while ($i <= $n) { - my $elt = $argv0[$i]; - $j = 1 if $i >= $n1; - ++$i; - # remove starting and ending whitespace - $elt =~ s/^\s+|\s+$//g; - # replace whitespace by single space - $elt =~ s/\s+/ /g; - - if ($only_files) { - push @Filespecs, $elt; - next ELT; - } - -### main_config_params() - if ( $elt =~ /^-$/ ) { # - - push @Filespecs, $elt; - next ELT; - } - if ($elt =~ /^--$/) { # -- - $only_files = 1; - next ELT; - } - - if ($elt =~ /^--[ =]/) { # no option name - warn "No option name in '$elt' at $s[$j].\n"; - next ELT; - } - if ($elt =~ /^---/) { # wrong with three minus - warn "Wrong option '$elt' at $s[$j].\n"; - next ELT; - } - - if ($elt =~ /^--[^-]/) { # long option - my ($name, $opt, $abbrev, $arg); - if ($elt =~ /[ =]/) { # has arg on elt - $elt =~ /^--([^ =]+)[ =] ?(.*)$/; - ($name, $arg) = ($1, $2); - $opt = "--$name"; - $abbrev = $name; - $arg =~ s/[\'\"]//g; - } else { # does not have an argument in the element - $opt = $name = $elt; - $name =~ s/^--//; - $abbrev = $name; - } -### main_config_params() - # remove quotes in name - $name =~ s/[\'\"]//g; - my $match = $name; - $match =~ s/-/[^- ]*-/g; - if ( exists $Opts_Cmdline_Long{$opt} ) { - # option exists exactly - } elsif ( $Opts_Cmdline_Long_Str =~ / (${match}[^- ]*?) / ) { - # option is an abbreviation without further - - my $n0 = $1; - if ( $Opts_Cmdline_Long_Str =~ - /\s(${match}[^-\s]*)\s.*\s(${match}[^-\s]*) / ) { - warn "Option name '--$abbrev' is not unique: " . - "--$1 --$2 \n"; - next ELT; - } - $name = $n0; - $opt = "--$n0"; - } elsif ( $Opts_Cmdline_Long_Str =~ /\s(${match}[^\s]*)\s/ ) { - # option is an abbreviation with further - - my $n0 = $1; - if ( $Opts_Cmdline_Long_Str =~ - /\s(${match}[^\s]*)\s.*\s(${match}[^\s]*)\s/ ) { - warn "Option name '--$abbrev' is not unique: " . - "--$1 --$2 \n"; - next ELT; - } - $name = $n0; - $opt = "--$n0"; - } else { - warn "Option '--$abbrev' does not exist.\n"; - next ELT; - } -### main_config_params() - if ( $Opts_Cmdline_Long{$opt} ) { # option has arg - if (defined $arg) { - push @argv, "--$name", $arg; - next ELT; - } else { # $arg not defined, argument at next element - if (($i == $n1) || ($i > $n)) { - warn "No argument left for option " . - "'$elt' at $s[$j].\n"; - next ELT; } - # add argument as next element - push @argv, "--$name", $argv0[$i]; - ++$i; - next ELT; - } # if (defined $arg) - } else { # option has no arg - if (defined $arg) { - warn "Option '$abbrev' may not have an argument " . - "at $s[$j].\n"; - next ELT; - } else { - push @argv, "--$name"; - next ELT; - } - } # if ($Opts_Cmdline_Long{$opt}) -### main_config_params() - } elsif ( $elt =~ /^-[^-]/ ) { # short option or cluster - my $cluster = $elt; - $cluster =~ s/^-//; - while ($cluster) { - $cluster =~ s/^(.)//; - my $opt = "-$1"; - if ( exists $Opts_Cmdline_Short{$opt} ) { # opt exists - if ( $Opts_Cmdline_Short{$opt} ) { # with arg - if ($cluster) { # has argument in this element - $cluster =~ s/^\s//; - $cluster =~ s/\'\"//g; - # add argument as rest of this element - push @argv, $opt, $cluster; - next ELT; - } else { # argument at next element - if (($i == $n1) || ($i > $n)) { - warn "No argument left for option " . - "'$opt' at $s[$j].\n"; - next ELT; } -### main_config_params() - # add argument as next element - push @argv, $opt, $argv0[$i]; - ++$i; - next ELT; - } - } else { # no arg - push @argv, $opt; next; - } - } else { # short option does not exist - warn "Wrong short option '$opt' at $s[$j].\n"; - next ELT; - } # if (exists $Opts_Cmdline_Short{$opt}) - } # while ($cluster) - } else { # not an option, file name - push @Filespecs, $elt; - next; - } - } -### main_config_params() - @Options = (@Manopt, @conf_args, @argv); - foreach my $i ( 0..$#Options ) { - if ( exists $Opts_Cmdline_Double{$Options[$i]} ) { - $Options[$i] = $Opts_Cmdline_Double{ $Options[$i] }; - } - } @Filespecs = ('-') unless (@Filespecs); - @ARGV = (@Options, '--', @Filespecs); - } -} # main_config_params() - - -######################################################################## -# main_parse_params() -######################################################################## - -sub main_parse_params { - # options that are ignored in this part - # shell version of groffer: --debug*, --shell - # man options: --catman (only special in man), - # --preprocessor (force groff preproc., handled by grog), - # --prompt (prompt for less, ignored), - # --troff (-mandoc, handled by grog), - # --update (inode check, ignored) - our %Opt; - our %Man; - our %Debug; - our %Opts_Cmdline_Short; - our %Opts_Cmdline_Double; - our %Opts_Cmdline_Long; - our %Opts_Groff_Short; - our $i; - our $n; - our @Starting_ARGV; - our @Starting_Conf; - our @Default_Modes; - our @Addopts_Groff; - our @Options; - - my %ignored_opts = ( - '--catman' => 0, - '--debug-func' => 0, - '--debug-not-func' => 0, - '--debug-lm' => 0, - '--debug-shell' => 0, - '--debug-stacks' => 0, - '--debug-user' => 0, - '--preprocessor' => 1, - '--prompt' => 1, - '--shell' => 1, - '--troff' => 0, - '--update' => 0, - ); - -### main_parse_params() - my %long_opts = - ( - '--debug' => - sub { $Debug{$_} = 1 foreach (qw/FILENAMES GROG KEEP PARAMS TMPDIR/); }, - '--debug-filenames' => sub { $Debug{'FILENAMES'} = 1; }, - '--debug-grog' => sub { $Debug{'GROG'} = 1; }, - '--debug-keep' => sub { $Debug{'KEEP'} = 1; $Debug{'PARAMS'} = 1; }, - '--debug-params' => sub { $Debug{'PARAMS'} = 1; }, - '--debug-tmpdir' => sub { $Debug{'TMPDIR'} = 1; }, - '--help' => sub { &usage(); $Opt{'DO_NOTHING'} = 1; }, - '--source' => sub { $Opt{'MODE'} = 'source'; }, - '--device' => - sub { $Opt{'DEVICE'} = &_get_arg(); - my %modes = ( - 'ascii' => 'tty', - 'cp1047' => 'tty', - 'dvi'=> 'dvi', - 'html' => 'html', - 'xhtml' => 'html', - 'latin1' => 'tty', - 'lbp' => 'groff', - 'lj4' => 'groff', - 'pdf' => 'pdf', - 'pdf2' => 'pdf2', - 'ps' => 'ps', - 'utf8' => 'tty', - ); - if ($Opt{'DEVICE'} =~ /^X.*/) { - $Opt{'MODE'} = 'x'; - } elsif ( exists $modes{ $Opt{'DEVICE'} } ) { - if ( $modes{ $Opt{'DEVICE'} } eq 'tty' ) { - $Opt{'MODE'} = 'tty' - unless ($Opt{'MODE'} eq 'text'); - } else { - $Opt{'MODE'} = $modes{ $Opt{'DEVICE'} }; - } - } else { - # for all elements not in %modes - $Opt{'MODE'} = 'groff'; - } - }, -### main_parse_params() - '--version' => sub { &version(); $Opt{'DO_NOTHING'} = 1; }, - '--intermediate-output' => sub { $Opt{'Z'} = 1; }, - '--all' => sub { $Opt{'ALL'} = 1; }, - '--apropos' => # run apropos - sub { $Opt{'APROPOS'} = 1; - delete $Opt{'APROPOS_SECTIONS'}; - delete $Opt{'WHATIS'}; }, - '--apropos-data' => # run apropos for data sections - sub { $Opt{'APROPOS'} = 1; - $Opt{'APROPOS_SECTIONS'} = '457'; - delete $Opt{'WHATIS'}; }, - '--apropos-devel' => # run apropos for devel sections - sub { $Opt{'APROPOS'} = 1; - $Opt{'APROPOS_SECTIONS'} = '239'; - delete $Opt{'WHATIS'}; }, - '--apropos-progs' => # run apropos for prog sections - sub { $Opt{'APROPOS'} = 1; - $Opt{'APROPOS_SECTIONS'} = '168'; - delete $Opt{'WHATIS'}; }, - '--ascii' => - sub { push @Addopts_Groff, '-mtty-char'; - $Opt{'MODE'} = 'text' unless $Opt{'MODE'}; }, - '--auto' => # the default automatic mode - sub { delete $Opt{'MODE'}; }, - '--bordercolor' => # border color for viewers, arg - sub { $Opt{'BD'} = &_get_arg(); }, - '--background' => # background color for viewers, arg - sub { $Opt{'BG'} = &_get_arg(); }, -### main_parse_params() - '--borderwidth' => # border width for viewers, arg - sub { $Opt{'BW'} = &_get_arg(); }, - '--default' => # reset variables to default - sub { %Opt = (); }, - '--default-modes' => # sequence of modes in auto mode; arg - sub { $Opt{'DEFAULT_MODES'} = &_get_arg(); }, - '--display' => # set X display, arg - sub { $Opt{'DISPLAY'} = &_get_arg(); }, - '--do-nothing' => sub { $Opt{'DO_NOTHING'} = 1; }, - '--dvi' => sub { $Opt{'MODE'} = 'dvi'; }, - '--extension' => # the extension for man pages, arg - sub { $Opt{'EXTENSION'} = &_get_arg(); }, - '--foreground' => # foreground color for viewers, arg - sub { $Opt{'FG'} = &_get_arg(); }, - '--font' => # set font for viewers, arg - sub { $Opt{'FN'} = &_get_arg(); }, - '--geometry' => # window geometry for viewers, arg - sub { $Opt{'GEOMETRY'} = &_get_arg(); }, - '--groff' => sub { $Opt{'MODE'} = 'groff'; }, - '--html' => sub { $Opt{'MODE'} = 'html'; }, - '--iconic' => # start viewers as icons - sub { $Opt{'ICONIC'} = 1; }, - '--locale' => # set language for man pages, arg - # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...) - sub { $Opt{'LANG'} = &_get_arg(); }, - '--local-file' => # force local files; same as '--no-man' - sub { delete $Man{'ENABLE'}; delete $Man{'FORCE'}; }, - '--location' => # print file locations to stderr - sub { $Opt{'LOCATION'} = 1; }, -### main_parse_params() - '--man' => # force all file params to be man pages - sub { $Man{'ENABLE'} = 1; $Man{'FORCE'} = 1; }, - '--manpath' => # specify search path for man pages, arg - # arg is colon-separated list of directories - sub { $Opt{'MANPATH'} = &_get_arg(); }, - '--mode' => # display mode - sub { my $arg = &_get_arg(); - my %modes = ( '' => '', - 'auto' => '', - 'groff' => 'groff', - 'html' => 'html', - 'www' => 'html', - 'dvi' => 'dvi', - 'pdf' => 'pdf', - 'pdf2' => 'pdf2', - 'ps' => 'ps', - 'text' => 'text', - 'tty' => 'tty', - 'X' => 'x', - 'x' => 'x', - 'Q' => 'source', - 'source' => 'source', - ); - if ( exists $modes{$arg} ) { - if ( $modes{$arg} ) { - $Opt{'MODE'} = $modes{$arg}; - } else { - delete $Opt{'MODE'}; - } - } else { - warn "Unknown mode in '$arg' for --mode\n"; - } - }, -### main_parse_params() - '--no-location' => # disable former call to '--location' - sub { delete $Opt{'LOCATION'}; }, - '--no-man' => # disable search for man pages - sub { delete $Man{'ENABLE'}; delete $Man{'FORCE'}; }, - '--no-special' => # disable some special former calls - sub { delete $Opt{'ALL'}; delete $Opt{'APROPOS'}; - delete $Opt{'WHATIS'}; }, - '--pager' => # set paging program for tty mode, arg - sub { $Opt{'PAGER'} = &_get_arg(); }, - '--pdf' => sub { $Opt{'MODE'} = 'pdf'; }, - '--pdf2' => sub { $Opt{'MODE'} = 'pdf2'; }, - '--print' => # print argument, for argument test - sub { my $arg = &_get_arg; print STDERR $arg . "\n"; }, - '--ps' => sub { $Opt{'MODE'} = 'ps'; }, - '--resolution' => # set resolution for X devices, arg - sub { my $arg = &_get_arg(); - my %res = ( '75' => 75, - '75dpi' => 75, - '100' => 100, - '100dpi' => 100, - ); - if (exists $res{$arg}) { - $Opt{'RESOLUTION'} = $res{$arg}; - } else { - warn "--resolution allows only 75, 75dpi, " . - "100, 100dpi as argument.\n"; - } - }, -### main_parse_params() - '--rv' => sub { $Opt{'RV'} = 1; }, - '--sections' => # specify sections for man pages, arg - # arg is a ':'-separated (colon) list of section names - sub { my $arg = &_get_arg(); - my @arg = split /:/, $arg; - my $s; - foreach (@arg) { - /^(.)/; - my $c = $1; - if ($Man{'AUTO_SEC_CHARS'} =~ /$c/) { - $s .= $c; - } else { - warn "main_parse_params(): not a man section '$c';"; - } - } - $Opt{'SECTIONS'} = $s; }, - '--systems' => # man pages for different OS's, arg - # argument is a comma-separated list - sub { $Opt{'SYSTEMS'} = &_get_arg(); }, - '--text' => # text mode without pager - sub { $Opt{'MODE'} = 'text'; }, - '--title' => # title for X viewers; arg - sub { my $arg = &_get_arg(); - if ($arg) { - if ( $Opt{'TITLE'} ) { - $Opt{'TITLE'} = "$Opt{'TITLE'} $arg"; - } else { - $Opt{'TITLE'} = $arg; - } - } - }, - '--text-device' => # device for tty mode; arg - sub { $Opt{'TEXT_DEVICE'} = &_get_arg(); }, - '--to-stdout' => # print mode file without display - sub { $Opt{'STDOUT'} = 1; }, - '--tty' => # tty mode, text with pager - sub { $Opt{'MODE'} = 'tty'; }, - '--viewer' => # viewer for actiual mode - sub { $Opt{'VIEWER'} = &_get_arg(); }, - '--whatis' => sub { delete $Opt{'APROPOS'}; $Opt{'WHATIS'} = 1; }, - '--x' => sub { $Opt{'MODE'} = 'x'; }, -### main_parse_params() - '--xrm' => # pass X resource string, arg - sub { my $arg = &_get_arg(); push @{$Opt{'XRM'}}, $arg if $arg; }, - ); - -# '--dvi-viewer' => # viewer program for dvi mode; arg -# sub { $Opt{'VIEWER_DVI'} = &_get_arg(); }, -# '--html-viewer' => # viewer program for html mode; arg -# sub { $Opt{'VIEWER_HTML'} = &_get_arg(); }, -# '--pdf-viewer' => # viewer program for pdf and pdf2 mode; arg -# sub { $Opt{'VIEWER_PDF'} = &_get_arg(); }, -# '--ps-viewer' => # viewer program for ps mode; arg -# sub { $Opt{'VIEWER_PS'} = &_get_arg(); }, -# '--x-viewer' => # viewer program for x mode; arg -# sub { $Opt{'VIEWER_X'} = &_get_arg(); }, - - my %short_opts = ( - '-V' => sub { $Opt{'V'} = 1; }, - '-X' => sub { $Opt{'X'} = 1; }, - ); - - if (0) { - # check if all options are handled in parse parameters - - # short options - my %these_opts = (%ignored_opts, %short_opts, %Opts_Groff_Short, - %Opts_Cmdline_Double); - foreach my $key (keys %Opts_Cmdline_Short) { - warn "unused option: $key" unless exists $these_opts{$key}; - } - - # long options - %these_opts = (%ignored_opts, %long_opts, %Opts_Cmdline_Double); - foreach my $key (keys %Opts_Cmdline_Long) { - warn "unused option: $key" unless exists $these_opts{$key}; - } - } # if (0) - -### main_parse_params() - OPTION: while ($i <= $n) { - my $opt = $Options[$i]; - ++$i; - if ($opt =~ /^-([^-])$/) { # single minus for short option - if (exists $short_opts{$opt}) { # short option handled by hash - $short_opts{$opt}->(); - next OPTION; - } else { # $short_opts{$opt} does not exist - my $c = $1; # the option character - next OPTION unless $c; - if ( exists $Opts_Groff_Short{ $opt } ) { # groff short option - if ( $Opts_Groff_Short{ $opt } ) { # option has argument - my $arg = $Options[$i]; - ++$i; - push @Addopts_Groff, $opt, $arg; - next OPTION; - } else { # no argument for this option - push @Addopts_Groff, $opt; - next OPTION; - } - } elsif ( exists $Opts_Cmdline_Short{ $opt } ) { - # is a groffer short option - warn "Groffer option $opt not handled " . - "in parameter parsing"; - } else { - warn "$opt is not a groffer option.\n"; - } - } # if (exists $short_opts{$opt}) - } # if ($opt =~ /^-([^-])$/) - # now it is a long option - - # handle ignored options - if ( exists $ignored_opts{ $opt } ) { - ++$i if ( $ignored_opts{ $opt } ); - next OPTION; - } -### main_parse_params() - - # handle normal long options - if (exists $long_opts{$opt}) { - $long_opts{$opt}->(); - } else { - warn "Unknown option $opt.\n"; - } - next OPTION; - } # while ($i <= $n) - - if ($Debug{'PARAMS'}) { - print STDERR '$MANOPT: ' . $ENV{'MANOPT'} . "\n" if $ENV{'MANOPT'}; - foreach (@Starting_Conf) { - print STDERR "configuration: " . $_ . "\n"; - } - print STDERR '$GROFFER_OPT: ' . $ENV{'GROFFER_OPT'} . "\n" - if $ENV{'GROFFER_OPT'}; - print STDERR "command line: @Starting_ARGV\n"; - print STDERR "parameters: @ARGV\n"; - } - - if ( $Opt{'WHATIS'} ) { - die "main_parse_params(): cannot handle both 'whatis' and 'apropos';" - if $Opt{'APROPOS'}; - $Man{'ALL'} = 1; - delete $Opt{'APROPOS_SECTIONS'}; - } - - if ( $Opt{'DO_NOTHING'} ) { - exit; - } - - if ( $Opt{'DEFAULT_MODES'} ) { - @Default_Modes = split /,/, $Opt{'DEFAULT_MODES'}; - } -} # main_parse_params() - - -sub _get_arg { - our $i; - our $n; - our @Options; - if ($i > $n) { - die '_get_arg(): No argument left for last option;'; - } - my $arg = $Options[$i]; - ++$i; - $arg; -} # _get_arg() of main_parse_params() - - -######################################################################## -# main_set_mode() -######################################################################## - -sub main_set_mode { - our %Opt; - - our @Default_Modes; - our @Addopts_Groff; - - our $Viewer_Background; - our $PDF_Did_Not_Work; - our $PDF_Has_gs; - our $PDF_Has_ps2pdf; - our %Display = ('MODE' => '', - 'PROG' => '', - 'ARGS' => '' - ); - - my @modes; - - # set display - $ENV{'DISPLAY'} = $Opt{'DISPLAY'} if $Opt{'DISPLAY'}; - - push @Addopts_Groff, '-V' if $Opt{'V'}; - - if ( $Opt{'X'} ) { - $Display{'MODE'} = 'groff'; - push @Addopts_Groff, '-X'; - } - - if ( $Opt{'Z'} ) { - $Display{'MODE'} = 'groff'; - push @Addopts_Groff, '-Z'; - } - - $Display{'MODE'} = 'groff' if $Opt{'MODE'} and $Opt{'MODE'} eq 'groff'; - - return 1 if $Display{'MODE'} and $Display{'MODE'} eq 'groff'; - -### main_set_mode() - if ($Opt{'MODE'}) { - if ($Opt{'MODE'} =~ /^(source|text|tty)$/) { - $Display{'MODE'} = $Opt{'MODE'}; - return 1; - } - $Display{'MODE'} = $Opt{'MODE'} if $Opt{'MODE'} =~ /^x?html$/; - @modes = ($Opt{'MODE'}); - } else { # empty mode - if ($Opt{'DEVICE'}) { - if ($Opt{'DEVICE'} =~ /^X/) { - &is_X() || die "no X display found for device $Opt{'DEVICE'}"; - $Display{'MODE'} = 'x'; - return 1; - } - ; - if ($Opt{'DEVICE'} =~ /^(ascii|cp1047|latin1|utf8)$/) { - $Display{'MODE'} ne 'text' and $Display{'MODE'} = 'tty'; - return 1; - } - ; - unless (&is_X) { - $Display{'MODE'} = 'tty'; - return 1; - } - } # check device - @modes = @Default_Modes; - } # check mode - -### main_set_mode() - LOOP: foreach my $m (@modes) { - $Viewer_Background = 0; - if ($m =~ /^(test|tty|X)$/) { - $Display{'MODE'} = $m; - return 1; - } elsif ($m eq 'pdf') { - &_get_prog_args($m) ? return 1: next LOOP; - } elsif ($m eq 'pdf2') { - next LOOP if $PDF_Did_Not_Work; - $PDF_Has_gs = &where_is_prog('gs') ? 1 : 0 - unless (defined $PDF_Has_gs); - $PDF_Has_ps2pdf = &where_is_prog('ps2pdf') ? 1 : 0 - unless (defined $PDF_Has_ps2pdf); - if ( (! $PDF_Has_gs) and (! $PDF_Has_ps2pdf) ) { - $PDF_Did_Not_Work = 1; - next LOOP; - } - - if (&_get_prog_args($m)) { - return 1; - } else { - $PDF_Did_Not_Work = 1; - next LOOP; - } - } else { # other modes - &_get_prog_args($m) ? return 1 : next LOOP; - } # if $m - } # loop: foreach - die 'set mode: no suitable display mode found under ' . - join(', ', @modes) . ';' unless $Display{'MODE'}; - die 'set mode: no viewer available for mode ' . $Display{'MODE'} . ';' - unless $Display{'PROG'}; - 0; -} # main_set_mode() - - -######################################################################## -# functions to main_set_mode() -######################################################################## - -########## -# _get_prog_args() -# -# Simplification for loop in set mode. -# -# Globals in/out: $Viewer_Background -# globals in : $Opt{VIEWER}, $VIEWER_X{}, -# $Viewer_tty{} -# -## globals in : $Opt{VIEWER_}, $VIEWER_X{}, -## $Viewer_tty{} -## -sub _get_prog_args { - our %Opt; - our %Display; - our %Viewer_X; - our %Viewer_tty; - - our $Viewer_Background; - my $n = @_; - die "_get_prog_args(): one argument is needed; you used $n;" - unless $n == 1; - - my $mode = lc($_[0]); - my $MODE = uc($mode); - $MODE = 'PDF' if ( $MODE =~ /^PDF2$/ ); - - my $xlist = $Viewer_X{$MODE}; - my $ttylist = $Viewer_tty{$MODE}; - -# my $vm = "VIEWER_${MODE"; - my $vm = "VIEWER"; - my $opt = $Opt{$vm}; - - if ($opt) { - my %prog = &where_is_prog($opt); - my $prog_ref = \%prog; - unless (%prog) { - warn "_get_prog_args(): '$opt' is not an existing program;"; - return 0; - } - - # $prog from $opt is an existing program - -### _get_prog_args() of main_set_mode() - if (&is_X) { - if ( &_check_prog_on_list($prog_ref, $xlist) ) { - $Viewer_Background = 1; - } else { - $Viewer_Background = 0; - &_check_prog_on_list($prog_ref, $ttylist); - } - } else { # is not X - $Viewer_Background = 0; - &_check_prog_on_list($prog_ref, $ttylist); - } # if is X - } else { # $opt is empty - $Viewer_Background = 0; - my $x; - if (&is_X) { - $x = &_get_first_prog($xlist); - $Viewer_Background = 1 if $x; - } else { # is not X - $x = &_get_first_prog($ttylist); - } # test on X - $Display{'MODE'} = $mode if $x; - return $x; - } - $Display{'MODE'} = $mode; - return 1; -} # _get_prog_args() of main_set_mode() - - -########## -# _get_first_prog() -# -# Retrieve from the elements of the list in the argument the first -# existing program in $PATH. -# -# Local function of main_set_mode(). -# -# Return : '0' if not a part of the list, '1' if found in the list. -# -sub _get_first_prog { - our %Display; - my $n = @_; - die "_get_first_prog(): one argument is needed; you used $n;" - unless $n == 1; - - foreach my $i (@{$_[0]}) { - next unless $i; - my %prog = &where_is_prog($i); - if (%prog) { - $Display{'PROG'} = $prog{'fullname'}; - $Display{'ARGS'} = $prog{'args'}; - return 1; - } - } - return 0; -} # _get_first_prog() of main_set_mode() - - -########## -# _check_prog_on_list ( ) -# -# Check whether the content of is in the list -# . -# The globals are set correspondingly. -# -# Local function for main_set_mode(). -# -# Arguments: 2 -# -# Return : '0' if not a part of the list, '1' if found in the list. -# Output : none -# -# Globals in : $Viewer_X{}, $Viewer_tty{} -# Globals in/out: $Display{'PROG'}, $Display{'ARGS'} -# -sub _check_prog_on_list { - our %Display; - my $n = @_; - die "_get_first_prog(): 2 arguments are needed; you used $n;" - unless $n == 2; - - my %prog = %{$_[0]}; - - $Display{'PROG'} = $prog{'fullname'}; - $Display{'ARGS'} = $prog{'args'}; - - foreach my $i (@{$_[1]}) { - my %p = &where_is_prog($i); - next unless %p; - next unless $Display{'PROG'} eq $p{'fullname'}; - if ($p{'args'}) { - if ($Display{'ARGS'}) { - $Display{'ARGS'} = $p{'args'}; - } else { - $Display{'ARGS'} = "$p{'args'} $Display{'ARGS'}"; - } - } # if args - return 1; - } # foreach $i - # prog was not in the list - return 0; -} # _check_prog_on_list() of main_set_mode() - - -######################################################################## -# groffer temporary directory, main_temp() -######################################################################## - -sub main_temp { - our %Debug; - our $tmpdir; - our $fh_cat; - our $fh_stdin; - our $tmp_cat; - our $tmp_stdin; - my $template = 'groffer_' . "$$" . '_XXXX'; - foreach ($ENV{'GROFF_TMPDIR'}, $ENV{'TMPDIR'}, $ENV{'TMP'}, $ENV{'TEMP'}, - $ENV{'TEMPDIR'}, File::Spec->catfile($ENV{'HOME'}, 'tmp')) { - if ($_ && -d $_ && -w $_) { - if ($Debug{'KEEP'}) { - eval { $tmpdir = tempdir( $template, DIR => "$_" ); }; - } else { - eval { $tmpdir = tempdir( $template, - CLEANUP => 1, DIR => "$_" ); }; - } - last if $tmpdir; - } - } - $tmpdir = tempdir( $template, CLEANUP => 1, DIR => File::Spec->tmpdir ) - unless ($tmpdir); - - # see Lerning Perl, page 205, or Programming Perl, page 413 - # $SIG{'INT'} is for Ctrl-C interruption - $SIG{'INT'} = sub { &clean_up(); die "interrupted..."; }; - $SIG{'QUIT'} = sub { &clean_up(); die "quit..."; }; - - if ($Debug{'TMPDIR'}) { - if ( $Debug{'KEEP'}) { - print STDERR "temporary directory is kept: " . $tmpdir . "\n"; - } else { - print STDERR "temporary directory will be cleaned: " . - $tmpdir . "\n"; - } - } - - # further argument: SUFFIX => '.sh' - if ($Debug{'KEEP'}) { - ($fh_cat, $tmp_cat) = tempfile(',cat_XXXX', DIR => $tmpdir); - ($fh_stdin, $tmp_stdin) = tempfile(',stdin_XXXX', DIR => $tmpdir); - } else { - ($fh_cat, $tmp_cat) = tempfile(',cat_XXXX', UNLINK => 1, - DIR => $tmpdir); - ($fh_stdin, $tmp_stdin) = tempfile(',stdin_XXXX', UNLINK => 1, - DIR => $tmpdir); - } -} # main_temp() - - -######################################################################## -# subs needed for main_do_fileargs() -######################################################################## - -########## -# register_file() -# -# Write a found file and register the title element. -# -# Arguments: 1: a file name -# Output: none -# -sub register_file { - our $tmp_stdin; - my $n = @_; - die "register_file(): one argument is needed; you used $n;" - unless $n == 1; - die 'register_file(): file name is empty;' unless $_[0]; - - if ($_[0] eq '-') { - &to_tmp($tmp_stdin) && ®ister_title('stdin'); - } else { - &to_tmp($_[0]) && ®ister_title($_[0]); - } - 1; -} # register_file() - - -########## -# register_title() -# -# Create title element from and append to $_REG_TITLE_LIST. -# Basename is created. -# -# Globals in/out: @REG_TITLE -# -# Variable prefix: rt -# -sub register_title { - our @REG_TITLE; - our %Debug; - my $n = @_; - die "register_title(): one argument is needed; you used $n;" - unless $n == 1; - return 1 unless $_[0]; - - return 1 if scalar @REG_TITLE > 3; - - my $title = &get_filename($_[0]); - $title =~ s/\s/_/g; - $title =~ s/\.bz2$//g; - $title =~ s/\.gz$//g; - $title =~ s/\.Z$//g; - - if ($Debug{'FILENAMES'}) { - if ($_[0] eq 'stdin') { - print STDERR "register_title(): file title is stdin\n"; - } else { - print STDERR "register_title(): file title is $title\n"; - } - } # if ($Debug{'FILENAMES'}) - - return 1 unless $title; - push @REG_TITLE, $title; - 1; -} # register_title() - - -########## -# save_stdin() -# -# Store standard input to temporary file (with decompression). -# -sub save_stdin { - our $tmp_stdin; - our $fh_stdin; - our $tmpdir; - - our %Debug; - - my ($fh_input, $tmp_input); - $tmp_input = File::Spec->catfile($tmpdir, ',input'); - open $fh_input, ">$tmp_input" or - die "save_stdin(): could not open $tmp_input"; - foreach () { - print $fh_input $_; - } - close $fh_input; - open $fh_stdin, ">$tmp_stdin" or - die "save_stdin(): could not open $tmp_stdin"; - foreach ( &cat_z("$tmp_input") ) { - print $fh_stdin $_; - } - close $fh_stdin; - unlink $tmp_input unless $Debug{'KEEP'}; -} # save_stdin() - - -######################################################################## -# main_do_fileargs() -######################################################################## - -sub main_do_fileargs { - our %Man; - our %Opt; - - our @Filespecs; - - our $Filespec_Arg; - our $Filespec_Is_Man; - our $Special_Filespec; - our $No_Filespecs; - our $Macro_Pkg; - our $Manspec; - - &special_setup(); - if ($Opt{'APROPOS'}) { - if ($No_Filespecs) { - &apropos_filespec(); - return 1; - } - } else { - foreach (@Filespecs) { - if (/^-$/) { - &save_stdin(); - last; - } - } # foreach (@Filespecs) - } # if ($Opt{'APROPOS'}) - - my $section = ''; - my $ext = ''; - my $twoargs = 0; - my $filespec; - my $former_arg; - - FILESPEC: foreach (@Filespecs) { - $filespec = $_; - $Filespec_Arg = $_; - $Filespec_Is_Man = 0; - $Manspec = ''; - $Special_Filespec = 0; - - next FILESPEC unless $filespec; - -### main_do_fileargs() - if ($twoargs) { # second run - $twoargs = 0; - # $section and $ext are kept from earlier run - my $h = { 'name' => $filespec, 'sec' => $section, 'ext' => $ext }; - &man_setup(); - if ( &is_man($h) ) { - $Filespec_Arg = "$former_arg $Filespec_Arg"; - &special_filespec(); - $Filespec_Is_Man = 1; - &man_get($h); - next FILESPEC; - } else { - warn "main_do_fileargs(): $former_arg is neither a file nor a " . - "man page nor a section argument for $filespec;"; - } - } - $twoargs = 0; - - if ( $Opt{'APROPOS'} ) { - &apropos_filespec(); - next FILESPEC; - } - - if ($filespec eq '-') { - ®ister_file('-'); - &special_filespec(); - next FILESPEC; - } elsif ( &get_filename($filespec) ne $filespec ) { # path with dir - &special_filespec(); - if (-f $filespec && -r $filespec) { - ®ister_file($filespec) - } else { - warn "main_do_fileargs: the argument $filespec is not a file;"; - } - next FILESPEC; - } else { # neither '-' nor has dir - # check whether filespec is an existing file - unless ( $Man{'FORCE'} ) { - if (-f $filespec && -r $filespec) { - &special_filespec(); - ®ister_file($filespec); - next FILESPEC; - } - } - } # if ($filespec eq '-') - -### main_do_fileargs() - # now it must be a man page pattern - - if ($Macro_Pkg and $Macro_Pkg ne '-man') { - warn "main_do_fileargs(): $filespec is not a file, " . - "man pages are ignored due to $Macro_Pkg;"; - next FILESPEC; - } - - # check for man page - &man_setup(); - unless ( $Man{'ENABLE'} ) { - warn "main_do_fileargs(): the argument $filespec is not a file;"; - next FILESPEC; - } - my $errmsg; - if ( $Man{'FORCE'} ) { - $errmsg = 'is not a man page'; - } else { - $errmsg = 'is neither a file nor a man page'; - } - - $Filespec_Is_Man = 1; - -### main_do_fileargs() - # test filespec with 'man:...' or '...(...)' on man page - - my @names = ($filespec); - if ($filespec =~ /^man:(.*)$/) { - push @names, $1; - } - - foreach my $i (@names) { - next unless $i; - my $h = { 'name' => $i }; - if ( &is_man($h) ) { - &special_filespec(); - &man_get($h); - next FILESPEC; - } - if ( $i =~ /^(.*)\(([$Man{'AUTO_SEC_CHARS'}])(.*)\)$/ ) { - $h = { 'name' => $1, 'sec' => $2, 'ext' => $3 }; - if ( &is_man($h) ) { - &special_filespec(); - &man_get($h); - next FILESPEC; - } - } # if // - if ( $i =~ /^(.*)\.([$Man{'AUTO_SEC_CHARS'}])(.*)$/ ) { - $h = { 'name' => $1, 'sec' => $2, 'ext' => $3 }; - if ( &is_man($h) ) { - &special_filespec(); - &man_get($h); - next FILESPEC; - } - } # if // - } # foreach (@names) - -### main_do_fileargs() - # check on "s name", where "s" is a section with or without an extension - if ($filespec =~ /^([$Man{'AUTO_SEC_CHARS'}])(.*)$/) { - unless ( $Man{'ENABLE'} ) { - warn "main_do_fileargs(): $filespec $errmsg;"; - next FILESPEC; - } - $twoargs = 1; - $section = $1; - $ext = $2; - $former_arg = $filespec; - next FILESPEC; - } else { - warn "main_do_fileargs(): $filespec $errmsg;"; - next FILESPEC; - } - } # foreach (@Filespecs) - - if ( $twoargs ) { - warn "main_do_fileargs(): no filespec arguments left for second run;"; - return 0; - } - 1; -} # main_do_fileargs() - - -######################################################################## -# main_set_resources() -######################################################################## - -########## -# main_set_resources () -# -# Determine options for setting X resources with $_DISPLAY_PROG. -# -# Globals: $Display{PROG}, $Output_File_Name -# -sub main_set_resources { - our %Opt; - our %Display; - our %Debug; - - our @REG_TITLE; - - our $Default_Resolution; - our $tmp_stdin; - our $tmpdir; - our $Output_File_Name; - - # $prog viewer program - # $rl resource list - unlink $tmp_stdin unless $Debug{'KEEP'}; - $Output_File_Name = ''; - - my @title = @REG_TITLE; - @title = ($Opt{'TITLE'}) unless @title; - @title = () unless @title; - - foreach my $n (@title) { - next unless $n; - $n =~ s/^,+// if $n =~ /^,/; - next unless $n; - $Output_File_Name = $Output_File_Name . ',' if $Output_File_Name; - $Output_File_Name = "$Output_File_Name$n"; - } # foreach (@title) - - $Output_File_Name =~ s/^,+//; - $Output_File_Name = '-' unless $Output_File_Name; - $Output_File_Name = File::Spec->catfile($tmpdir, $Output_File_Name); - -### main_set_resources() - unless ($Display{'PROG'}) { # for example, for groff mode - $Display{'ARGS'} = ''; - return 1; - } - - my %h = &where_is_prog($Display{'PROG'}); - my $prog = $h{'file'}; - if ($Display{'ARGS'}) { - $Display{'ARGS'} = "$h{'args'} $Display{'ARGS'}"; - } else { - $Display{'ARGS'} = $h{'args'}; - } - - my @rl = (); - - if ($Opt{'BD'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-bd', $Opt{'BD'}; - } - } - - if ($Opt{'BG'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-bg', $Opt{'BG'}; - } elsif ($prog eq 'kghostview') { - push @rl, '--bg', $Opt{'BG'}; - } elsif ($prog eq 'xpdf') { - push @rl, '-papercolor', $Opt{'BG'}; - } - } - -### main_set_resources() - if ($Opt{'BW'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-bw', $Opt{'BW'}; - } - } - - if ($Opt{'FG'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-fg', $Opt{'FG'}; - } elsif ($prog eq 'kghostview') { - push @rl, '--fg', $Opt{'FG'}; - } - } - - if ($Opt{'FN'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-fn', $Opt{'FN'}; - } elsif ($prog eq 'kghostview') { - push @rl, '--fn', $Opt{'FN'}; - } - } - - if ($Opt{'GEOMETRY'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-geometry', $Opt{'GEOMETRY'}; - } elsif ($prog eq 'kghostview') { - push @rl, '--geometry', $Opt{'GEOMETRY'}; - } - } - -### main_set_resources() - if ($Opt{'RESOLUTION'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-resolution', $Opt{'RESOLUTION'}; - } elsif ($prog eq 'xpdf') { - if ($Display{'PROG'} !~ / -z/) { # if xpdf does not have option -z - if ($Default_Resolution == 75) { - push @rl, '-z', 104; - } elsif ($Default_Resolution == 100) { # 72dpi is '100' - push @rl, '-z', 139; - } - } - } # if $prog - } else { # empty $Opt{RESOLUTION} - $Opt{'RESOLUTION'} = $Default_Resolution; - if ($prog =~ /^(gxditview|xditview)$/) { - push @rl, '-resolution', $Default_Resolution; - } elsif ($prog eq 'xpdf') { - if ($Display{'PROG'} !~ / -z/) { # if xpdf does not have option -z - if ($Default_Resolution == 75) { - push @rl, '-z', 104; - } elsif ($Default_Resolution == 100) { # 72dpi is '100' - push @rl, '-z', 139; - } - } - } # if $prog - } # if $Opt{RESOLUTION} - - if ($Opt{'ICONIC'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-iconic'; - } - } - -### main_set_resources() - if ($Opt{'RV'}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) { - push @rl, '-rv'; - } - } - - if (@{$Opt{'XRM'}}) { - if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi|xpdf)$/) { - foreach (@{$Opt{'XRM'}}) { - push @rl, '-xrm', $_; - } - } - } - - if (@title) { - if ($prog =~ /^(gxditview|xditview)$/) { - push @rl, '-title', $Output_File_Name; - } - } - - my $args = join ' ', @rl; - if ($Display{'ARGS'}) { - $Display{'ARGS'} = "$args $Display{'ARGS'}"; - } else { - $Display{'ARGS'} = $args; - } - - 1; -} # main_set_resources() - - -######################################################################## -# set resources -######################################################################## - -########## -# main_display () -# -# Do the actual display of the whole thing. -# -# Globals: -# in: $Display{MODE}, $Opt{DEVICE}, @Addopts_Groff, -# $fh_cat, $tmp_cat, $Opt{PAGER}, $Output_File_Name -# -sub main_display { - our ( %Display, %Opt, %Debug, %Viewer_tty, %Viewer_X ); - - our @Addopts_Groff; - - our ( $groggy, $modefile, $addopts, $fh_cat, $tmp_cat, $tmpdir ); - our ( $Output_File_Name, $Default_tty_Device ); - - $addopts = join ' ', @Addopts_Groff; - - if (-z $tmp_cat) { - warn "groffer: empty input\n"; - &clean_up(); - return 1; - } - - $modefile = $Output_File_Name; - - # go to the temporary directory to be able to access internal data files - chdir $tmpdir; - -### main_display() - SWITCH: foreach ($Display{'MODE'}) { - /^groff$/ and do { - push @Addopts_Groff, "-T$Opt{'DEVICE'}" if $Opt{'DEVICE'}; - $addopts = join ' ', @Addopts_Groff; - $groggy = `cat $tmp_cat | grog`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_opt_V(); - unlink $modefile; - rename $tmp_cat, $modefile; - system("cat $modefile | $groggy $addopts"); - &clean_up(); - next SWITCH; - }; # /groff/ - - /^(text|tty)$/ and do { - my $device; - if (! $Opt{'DEVICE'}) { - $device = $Opt{'TEXT_DEVICE'}; - $device = $Default_tty_Device unless $device; - } elsif ($Opt{'DEVICE'} =~ /^(ascii||cp1047|latin1|utf8)$/) { - $device = $Opt{'DEVICE'}; - } else { - warn "main_display(): wrong device for $Display{'MODE'} mode: " . - "$Opt{'DEVICE'}"; - } - $groggy = `cat $tmp_cat | grog -T$device`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: " . $groggy . "\n" if $Debug{'GROG'}; - if ($Display{'MODE'} eq 'text') { - &_do_opt_V(); - system("cat $tmp_cat | $groggy $addopts"); - &clean_up(); - next SWITCH; - } - -### main_display() - # mode is not 'text', but 'tty' - my %pager; - my @p; - push @p, $Opt{'PAGER'} if $Opt{'PAGER'}; - push @p, $ENV{'PAGER'} if $ENV{'PAGER'}; - foreach (@p) { - %pager = &where_is_prog($_); - next unless %pager; - if ($pager{'file'} eq 'less') { - if ($pager{'args'}) { - $pager{'args'} = "-r -R $pager{'args'}"; - } else { - $pager{'args'} = '-r -R'; - } - } - last if $pager{'file'}; - } # foreach @p - unless (%pager) { - foreach (@{$Viewer_tty{'TTY'}}, @{$Viewer_X{'TTY'}}, 'cat') { - next unless $_; - %pager = &where_is_prog($_); - last if %pager; - } - } - die "main_display(): no pager program found for tty mode;" - unless %pager; - &_do_opt_V(); - system("cat $tmp_cat | $groggy $addopts | " . - "$pager{'fullname'} $pager{'args'}"); - &clean_up(); - next SWITCH; - }; # /text|tty/ - - /^source$/ and do { - open $fh_cat, "<$tmp_cat"; - foreach (<$fh_cat>) { - print "$_"; - } - &clean_up(); - next SWITCH; - }; - -### main_display() - /^dvi$/ and do { - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'dvi') { - warn "main_display(): " . - "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};" - } - $modefile .= '.dvi'; - $groggy = `cat $tmp_cat | grog -Tdvi`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - - /^html$/ and do { - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'html') { - warn "main_display(): " . - "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};" - } - $modefile .= '.html'; - $groggy = `cat $tmp_cat | grog -Thtml`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - - /^xhtml$/ and do { - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'xhtml') { - warn "main_display(): " . - "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};" - } - $modefile .= '.xhtml'; - $groggy = `cat $tmp_cat | grog -Txhtml`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - - - /^pdf$/ and do { - $modefile .= '.pdf'; - $groggy = `cat $tmp_cat | grog -Tpdf --ligatures`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - - - /^pdf2$/ and do { - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'ps') { - warn "main_display(): " . - "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};" - } - $modefile .= '.ps'; - $groggy = `cat $tmp_cat | grog -Tps`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(\&_make_pdf2); - next SWITCH; - }; - -### main_display() - /^ps$/ and do { - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'ps') { - warn "main_display(): " . - "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};" - } - $modefile .= '.ps'; - $groggy = `cat $tmp_cat | grog -Tps`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - - /^x$/ and do { - my $device; - if ($Opt{'DEVICE'} && $Opt{'DEVICE'} =~ /^X/) { - $device = $Opt{'DEVICE'}; - } else { - if ($Opt{'RESOLUTION'} == 100) { - if ( $Display{'PROG'} =~ /^(g|)xditview$/ ) { - # add width of 800dpi for resolution of 100dpi to the args - $Display{'ARGS'} .= ' -geometry 800'; - $Display{'ARGS'} =~ s/^ //; - } - } else { # RESOLUTIOM != 100 - $device = 'X75-12'; - } # if RESOLUTIOM - } # if DEVICE - $groggy = `cat $tmp_cat | grog -T$device -Z`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - &_do_display(); - next SWITCH; - }; - -### main_display() - /^X$/ and do { - if (! $Opt{'DEVICE'}) { - $groggy = `cat $tmp_cat | grog -X`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - } elsif ($Opt{'DEVICE'} =~ /^(X.*|dvi|html|xhtml|lbp|lj4|ps)$/) { - # these devices work with - $groggy = `cat $tmp_cat | grog -T$Opt{'DEVICE'} -X`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - } else { - warn "main_display(): wrong device for " . - "$Display{'MODE'} mode: $Opt{'DEVICE'};"; - $groggy = `cat $tmp_cat | grog -Z`; - die "main_display(): grog error;" if $?; - chomp $groggy; - print STDERR "grog output: $groggy\n" if $Debug{'GROG'}; - } # if DEVICE - &_do_display(); - next SWITCH; - }; - - /^.*$/ and do { - die "main_display(): unknown mode '$Display{'MODE'}';"; - }; - - } # SWITCH - 1; -} # main_display() - - -######################## -# _do_display ([]) -# -# Perform the generation of the output and view the result. If an -# argument is given interpret it as a function name that is called in -# the midst (actually only for 'pdf'). -# -sub _do_display { - our ( %Display, %Debug, %Opt ); - - our ( $modefile, $tmpdir, $tmp_cat, $addopts, $groggy ); - our ( $Viewer_Background ); - - &_do_opt_V(); - unless ($Display{'PROG'}) { - system("$groggy $addopts $tmp_cat"); - &clean_up(); - return 1; - } - unlink $modefile; - die "_do_display(): empty output;" if -z $tmp_cat; - system("cat $tmp_cat | $groggy $addopts >$modefile"); - die "_do_display(): empty output;" if -z $modefile; - &print_times("before display"); - if ($_[0] && ref($_[0]) eq 'CODE') { - $_[0]->(); - } - unlink $tmp_cat unless $Debug{'KEEP'}; - - if ( $Opt{'STDOUT'} ) { - my $fh; - open $fh, "<$modefile"; - foreach (<$fh>) { - print; - } - close $fh; - return 1; - } - - if ( $Viewer_Background ) { - if ($Debug{'KEEP'}) { - exec "$Display{'PROG'} $Display{'ARGS'} $modefile &"; - } else { - exec "{ $Display{'PROG'} $Display{'ARGS'} $modefile; " . - "rm -rf $tmpdir; } &"; - } - } else { - system("$Display{'PROG'} $Display{'ARGS'} $modefile"); - &clean_up(); - } -} # _do_display() of main_display() - - -############# -# _do_opt_V () -# -# Check on option '-V'; if set print the corresponding output and leave. -# -# Globals: @ARGV, $Display{MODE}, $Display{PROG}, -# $Display{ARGS}, $groggy, $modefile, $addopts -# -sub _do_opt_V { - our %Opt; - our %Display; - our @ARGV; - - our ($groggy, $modefile, $addopts); - - if ($Opt{'V'}) { - $Opt{'V'} = 0; - print "Parameters: @ARGV\n"; - print "Display Mode: $Display{'MODE'}\n"; - print "Output file: $modefile\n"; - print "Display prog: $Display{'PROG'} $Display{'ARGS'}\n"; - print "Output of grog: $groggy $addopts\n"; - my $res = `$groggy $addopts\n`; - chomp $res; - print "groff -V: $res\n"; - exit 0; - } - 1; -} # _do_opt_V() of main_display() - - -############## -# _make_pdf2 () -# -# Transform to ps/pdf format; for pdf2 mode in _do_display(). -# -# Globals: $md_modefile (from main_display()) -# -sub _make_pdf2 { - our %Debug; - our %Opt; - - our $PDF_Did_Not_Work; - our $PDF_Has_gs; - our $PDF_Has_ps2pdf; - our $Dev_Null; - our $modefile; - - die "_make_pdf2(): pdf2 mode did not work;" if $PDF_Did_Not_Work; - my $psfile = $modefile; - die "_make_pdf2(): empty output;" if -z $modefile; - $modefile =~ s/\.ps$/.pdf/; - unlink $modefile; - my $done; - if ($PDF_Has_ps2pdf) { - system("ps2pdf $psfile $modefile 2>$Dev_Null"); - $done = ! $?; - } - if (! $done && $PDF_Has_gs) { - system("gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite " . - "-sOutputFile=$modefile -c save pop -f $psfile 2>$Dev_Null"); - $done = ! $?; - } - if (! $done) { - $PDF_Did_Not_Work = 1; - warn '_make_pdf2(): Could not transform into pdf format, ' . - 'the Postscript mode (ps) is used instead;'; - $Opt{'MODE'} = 'ps'; - &main_set_mode(); - &main_set_resources(); - &main_display(); - exit 0; - } - unlink $psfile unless $Debug{'KEEP'}; - 1; -} # _make_pdf2() of main_display() - - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/groffer/man.pl b/contrib/groffer/man.pl deleted file mode 100644 index a79368c..0000000 --- a/contrib/groffer/man.pl +++ /dev/null @@ -1,736 +0,0 @@ -#! /usr/bin/env perl - -# groffer - display groff files - -# Source file position: /contrib/groffer/man.pl -# Installed position: /lib/groff/groffer/man.pl - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -use strict; -use warnings; - -######################################################################## -# functions for apropos, man, whatis -######################################################################## - -########## -# apropos_filespec() -# -# Compose temporary file for filspec. -# -# Globals: in: $main::Opt{'APROPOS'}, $main::Special_Setup, $main::Filespec_Arg, -# $main::Apropos_Prog, $main::Opt{'APROPOS_SECTIONS'}, $main::Opt{'SECTIONS'} -# out: $main::Special_Filespec -# -sub apropos_filespec { - return 0 unless $main::Opt{'APROPOS'}; - die 'apropos_filespec(): apropos_setup() must be run first;' - unless $main::Special_Setup; - die 'apropos_filespec(): no $main::Filespec_Arg is set;' - unless defined $main::Filespec_Arg; - $main::Special_Filespec = 1; - - my $s; - if ($main::No_Filespecs) { - &to_tmp_line('.SH no filespec'); - $s = `$main::Apropos_Prog`; - $s =~ s/^/\\\&/; - &to_tmp_line($s); - return 1; - } - - $s = $main::Filespec_Arg; - $s =~ s/[^\\]-/\\-/g; - &to_tmp_line(".SH $s"); - - if ( $main::Opt{'APROPOS_SECTIONS'} ) { - $s = qr/^[^\(]*\([$main::Opt{'APROPOS_SECTIONS'}]/; - } else { - if ( $main::Opt{'SECTIONS'} ) { - $s = $main::Opt{'SECTIONS'}; - $s = qr/^[^\(]*\([$s]/; - } else { - $s = qr/^.*\(.+\).*$/; - } - } - -### apropos_filespec() - my $filespec = $main::Filespec_Arg; - $filespec =~ s#/#\\/#g; - $filespec =~ s#\.#\\./#g; - my @ap; - foreach ( `$main::Apropos_Prog $main::Filespec_Arg 2>$main::Dev_Null` ) { - chomp; - if (/^$filespec:\s/) { # for error messages of this script - my $line = $_; - $line =~ s/^(.*)$/\\\&$1/s; - push @ap, $line; - } - if (/$s/) { - push @ap, $_; - } - } - my @res; - foreach (sort @ap) { - s/^ - ([^\(]+\(+[$main::Man{'AUTO_SEC_CHARS'}][^\)]*\)+) - (\s*-*)*\s* - (.*) - $/.br\n.TP 15\n.BR "$1"\n\\\&$3\n/sx; - push @res, $_; - } - &to_tmp_line(@res); - 1; -} # apropos_filespec() - - -########## -# apropos_setup() -# -# Setup for the --apropos* options, just 2 global variables are set. -# -# Globals: in: $main::Opt{'APROPOS'} -# out: $main::Special_Setup, $main::Apropos_Prog -# -sub apropos_setup { - return 0 unless $main::Opt{'APROPOS'}; - if ( &where_is_prog('apropos') ) { - $main::Apropos_Prog = 'apropos'; - } elsif ( &where_is_prog('man') ) { - if (! system("man --apropos man >$main::Dev_Null 2>$main::Dev_Null")) { - $main::Apropos_Prog = 'man --apropos'; - } elsif (! system("man -k man >$main::Dev_Null 2>$main::Dev_Null")) { - $main::Apropos_Prog = 'man --k'; - } - } # test man - die 'apropos_setup(): no apropos program available;' - unless $main::Apropos_Prog; - &to_tmp_line('.TH GROFFER APROPOS'); - $main::Special_Setup = 1; - $main::Opt{'TITLE'} = 'apropos' unless $main::Opt{'TITLE'}; - 1; -} # apropos_setup() - - -########## -# is_man() -# -# Test whether the argument hash exists as man page (from is_man()). -# -# Globals: in: $main::Man{AUTO_SEC_CHARS},$main::Man{SEC_CHARS}, -# $main::Man{EXT}, $tmpdir -# out: $main::Manspec -# -# Arguments: 1, a hash reference with keys 'name', 'sec', 'ext', where -# 'sec' is a string of one or several section characters -# -sub is_man { - my $n = @_; - die "is_man(): one argument is needed, you used $n;" - unless $n == 1; - die "is_man(): the argument is not a hash reference '$_[0]';" - if ref($_[0]) ne 'HASH'; - die 'is_man(): temporary directory is not set;' unless $main::tmpdir; - die 'is_man(): man_setup() must be run first;' unless $main::Man{'IS_SETUP'}; - - my $name = $_[0]->{'name'}; - unless ($name) { - $main::Manspec = ''; - return 0; - } - - my $sec; - $sec = $_[0]->{'sec'}; - $sec = $main::Man{'SEC_CHARS'} unless $sec; - $sec = $main::Man{'AUTO_SEC_CHARS'} unless $sec; - $sec = '' unless defined $sec; - # take care, $sec may be several sections - -### is_man() - my $ext; - $ext = $_[0]->{'ext'}; - $ext = $main::Man{'EXT'} unless $ext; - $ext = '' unless defined $ext; - - $main::Manspec = "$name.$sec,$ext"; - my @m; - if (exists $main::Man{'MANSPEC'}{$main::Manspec}) { - return 1; - } else { - foreach my $p ( @{$main::Man{'PATH'}} ) { - foreach my $s (split //, $sec) { - my $dir = File::Spec->catdir($p, "man$s"); - next unless -d $dir; - my $file = File::Spec->catfile($dir, "$name.$s$ext"); - push @m, glob("$file*"); - } - } - $main::Man{'MANSPEC'}{$main::Manspec} = \@m; - } - return 0 unless (@m); - return 1; -} # is_man() - - -########## -# man_get () -# -# Write a man page to the temporary file. -# -# Globals in: $main::Manspec, $main::Man{MANSPEC}, $main::Man{SEC_CHARS}, -# $main::Man{EXT}, $main::Man{ALL} -# -# Arguments: 1, a hash reference with keys 'name', 'sec', 'ext', where -# 'sec' is a string of one or several section characters -# -sub man_get { - my $n = @_; - die "man_get(): one argument is needed, you used $n;" - unless $n == 1; - die "man_get(): the argument is not a hash reference '$_[0]';" - if ref($_[0]) ne 'HASH'; - die "man_get(): is_man() must be run first on the argument;" - unless $main::Manspec; - die "man_get(): wrong hash reference '$_[0]', no 'name' key;" - unless exists $_[0]->{'name'}; - - my ($name, $sec, $ext, $f, $path); - $name = $_[0]->{'name'}; - die "man_get(): empty 'name' key in the argument;" unless $name; - - $sec = $_[0]->{'sec'}; - $sec = $main::Man{'SEC_CHARS'} if (! $sec) and $main::Man{'SEC_CHARS'}; - $sec = '' unless defined $sec; - # take care $sec may be several sections - -### man_get() - $ext = $_[0]->{'ext'}; - $ext = $main::Man{'EXT'} unless $ext; - $ext = '' unless defined $ext; - - die 'man_get(): $main::Manspec does not suit the arguments;' - if ($main::Manspec ne "$name.$sec,$ext") and - (! exists $main::Man{'MANSPEC'}{$main::Manspec}); - - if ($main::Man{'ALL'}) { - my $ok; - my %list; - foreach ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - next if exists $list{$_}; - if (-f $_ and -r $_) { - $list{$_} = 1; - &to_tmp($_); - $ok = 1; - } - } - ®ister_title("man:$name") if $ok; - return 1; - } - - # not $main::Man{'ALL'} - - if ($_[0]->{'sec'}) { - my $path = File::Spec->catfile('', "man$sec", $name); - if ($ext) { - foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ($f =~ m#$path\.$sec$ext($|\..*$)#) { - if (-f $f && -r $f) { - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f -### man_get() - foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ($f =~ m#$path\.$sec$ext.*$#) { - if (-f $f && -r $f) { - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f - } else { # $ext is empty - foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ($f =~ m#$path\.$sec($|\..*$)#) { - if (-f $f && -r $f) { - # &to_tmp($f) && ®ister_file($f); - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f - foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ($f =~ m#$path\.$sec.*$#) { - if (-f $f && -r $f) { - # &to_tmp($f) && ®ister_file($f); - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f - } # if $ext -### man_get() - } else { # sec is empty - my $m = $main::Man{'SEC_CHARS'}; - $m = $main::Man{'AUTO_SEC_CHARS'} unless $m; - foreach my $s (split //, $m) { - my $path = File::Spec->catfile('', "man$s", $name); - unless ($ext) { - foreach my $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ( $f =~ m#$path\.$s($|\..*$)# ) { - if (-f $f && -r $f) { - # &to_tmp($f) && ®ister_file($f); - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f - } # unless $ext - foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) { - if ($f =~ m#$path\.$s$ext.*$#) { - if (-f $f && -r $f) { - # &to_tmp($f) && ®ister_file($f); - ®ister_file($f); - return 1; - } - } # if $f =~ - } # foreach $f - } # foreach $s - } # if sec - - 1; -} # man_get() - - -########## -# man_setup () -# -# Setup the variables in %MAN needed for man page searching. -# -# Globals: -# in: %OPT, $LANG, $LC_MESSAGES, $LC_ALL, -# $MANPATH, $MANSEC, $PAGER, $SYSTEM, $MANOPT. -# out: $main::Man{PATH}, $main::Man{LANG}, $main::Man{LANG2}, $main::Man{SYS}, -# $main::Man{SEC}, $main::Man{ALL} -# in/out: $main::Man{ENABLE} -# -# The precedence for the variables related to 'man' is that of GNU -# 'man', i.e. -# -# $LANG; overridden by -# $LC_MESSAGES; overridden by -# $LC_ALL; this has the same precedence as -# $MANPATH, $MANSEC, $PAGER, $SYSTEM; overridden by -# $MANOPT; overridden by -# the groffer command-line options. -# -# $MANROFFSEQ is ignored because grog determines the preprocessors. -# -sub man_setup { - return 1 if $main::Man{'IS_SETUP'}; - $main::Man{'IS_SETUP'} = 1; - return 1 unless $main::Man{'ENABLE'}; - - # determine basic path for man pages - my $path; - if (defined $main::Opt{'MANPATH'}) { - $path = $main::Opt{'MANPATH'}; - } elsif ($ENV{'MANPATH'}) { - $path = $ENV{'MANPATH'}; - } elsif ( &where_is_prog('manpath') ) { - $path = `manpath 2>$main::Dev_Null`; - } - if ($path) { - chomp $path; - $main::Man{'PATH'} = [split /:/, $path]; - } else { - $main::Man{'PATH'} = []; - &manpath_set_from_path(); - } - unless ( @{$main::Man{'PATH'}} ) { - $main::Man{'ENABLE'} = 0; - warn "man_setup(): man path is empty;"; - return 1; - } - -### man_setup() - # make man path list consisting of unique existing directories - @{$main::Man{'PATH'}} = &path_uniq( @{$main::Man{'PATH'}} ); - - unless ($main::Man{'ALL'}) { - $main::Man{'ALL'} = $main::Opt{'ALL'} ? 1 : 0; - } - - # handle man systems - my $sys = $ENV{'SYSTEM'}; - $sys = $main::Opt{'SYSTEMS'} if $main::Opt{'SYSTEMS'}; - if ($sys) { - chomp $sys; - $main::Man{'SYS'} = [split /,/, $sys]; - } else { - $main::Man{'SYS'} = []; - $sys = ''; - } - -### man_setup() - # handle language - my $lang = ''; - $lang = $main::Opt{'LANG'} if $main::Opt{'LANG'}; - unless ($lang) { - foreach ('LC_ALL', 'LC_MESSAGES', 'LANG') { - if ($ENV{$_}) { - $lang = $ENV{$_}; - last; - } - } - } - if ($lang) { - if ($lang eq 'C' or $lang eq 'POSIX') { - $main::Man{'LANG'} = ''; - $main::Man{'LANG2'} = ''; - } elsif ($lang =~ /^.$/) { - $main::Man{'LANG'} = $lang; - $main::Man{'LANG2'} = ''; - } elsif ($lang =~ /^..$/) { - $main::Man{'LANG'} = $lang; - $main::Man{'LANG2'} = $lang; - } else { - $main::Man{'LANG'} = $lang; - $main::Man{'LANG2'} = $lang; - $main::Man{'LANG2'} =~ s/^(..).*$/$1/; - } - } # if ($lang) - # from now on, use only $main::Man{LANG*}, - # forget about $main::Opt{LANG}, $ENV{LC_*}. - - &manpath_add_lang_sys(); - -### man_setup() - # section - my $sec; - $sec = $main::Opt{'SECTIONS'} if $main::Opt{'SECTIONS'}; - unless ($sec) { - $sec = $ENV{'MANSEC'} if $ENV{'MANSEC'}; - } - $main::Man{'SEC'} = []; - $main::Man{'SEC_CHARS'} = ''; - if ($sec) { - foreach (split /:/, $sec) { - push @{$main::Man{'SEC'}}, $_ if /^[$main::Man{'AUTO_SEC_CHARS'}]$/; - } - $main::Man{'SEC_CHARS'} = join '', @{$main::Man{'SEC'}} if @{$main::Man{'SEC'}}; - } # if ($sec) - - # extension - my $ext = ''; - $ext = $main::Opt{'EXTENSION'} if $main::Opt{'EXTENSION'}; - unless ($ext) { - $ext = $ENV{'EXTENSION'} if $ENV{'EXTENSION'}; - } - $main::Man{'EXT'} = $ext; - - # creation of man temporary is omitted, because of globs in perl - 1; -} # man_setup() - - -########## -# manpath_add_lang_sys() -# -# Add language and operating system specific directories to man path. -# -# Globals: -# in: $main::Man{SYS}: a list of names of operating systems. -# $main::Man{LANG} and $main::Man{LANG2}: each a single name -# in/out: @{$main::Man{PATH}}: list of directories which shall have the 'man?' -# subdirectories. -# -sub manpath_add_lang_sys { - return 1 unless $main::Man{'PATH'}; - return 1 unless @{$main::Man{'PATH'}}; - - my @mp; - - if ( @{$main::Man{'SYS'}} ) { - foreach ( @{$main::Man{'SYS'}} ) { - if ($_ eq 'man') { - @mp = (@mp, @{$main::Man{'PATH'}}); - } elsif ($_) { - my $sys = $_; - foreach my $p (@{$main::Man{'PATH'}}) { - my $dir = File::Spec->catdir($p, $sys); - push @mp, $dir; - } - } # if eq 'man' - } # foreach SYS - } else { # no SYS - @mp = @{$main::Man{'PATH'}}; - } - - if (@mp && $main::Man{'LANG'}) { - my @lang_path; - my $man_lang2 = ''; - $man_lang2 = $main::Man{'LANG2'} if $main::Man{'LANG'} ne $main::Man{'LANG2'}; - foreach my $i ($main::Man{'LANG'}, $man_lang2) { - next unless $i; - my $lang = $i; - foreach my $p (@mp) { - my $dir = File::Spec->catdir($p, $lang); - push @lang_path, $dir; - } # foreach $p - } # foreach $i - @mp = (@lang_path, @mp); - } # if $mp - - $main::Man{PATH} = [&path_uniq(@mp)]; - 1; -} # manpath_add_lang_sys() - - -########## -# manpath_set_from_path() -# -# Determine basic search path for man pages from $PATH. -# -# Return: '1' if a valid man path was retrieved. -# Output: none -# Globals: -# in: $PATH -# out: $_MAN_PATH -# -sub manpath_set_from_path { - my @path = - qw( /usr/local /usr /usr/X11R6 /usr/openwin /opt /opt/gnome /opt/kde ); - # get a basic man path from $ENV{PATH} - my @path2 = @main::Path; - foreach (@path2) { - s#bin/*$##; - push @path, $_; - } - @path = &path_uniq(@path); - foreach my $d (@path) { - foreach my $e ( File::Spec->catdir( qw(share man) ), - File::Spec->catdir( qw(share MAN) ), - 'man', 'MAN' ) { - my $dir = File::Spec->catdir($d, $e); - push @{$main::Man{'PATH'}}, $dir if -d $dir; - } - } - 1; -} # manpath_set_from_path() - - -########## -# special_filespec() -# -# Handle special modes like whatis and apropos. Run their filespec -# functions if suitable. -# -# Globals: in: $main::Opt{'APROPOS'}, $main::Opt{'WHATIS'}, $main::Special_Setup -# out: $main::Special_Filespec (internal) -# -sub special_filespec { - return 0 unless $main::Opt{'APROPOS'} || $main::Opt{'WHATIS'}; - die 'special_filespec(): setup for apropos or whatis must be run first;' - unless $main::Special_Setup; - if ( $main::Opt{'APROPOS'} ) { - die "special_setup(): both apropos and whatis option variables are set;" - if $main::Opt{'WHATIS'}; - return &apropos_filespec() ? 1 : 0; - } - if ( $main::Opt{'WHATIS'} ) { - return &whatis_filespec() ? 1 : 0; - } - 0; -} # special_filespec - - -########## -# special_setup() -# -# Handle special modes like whatis and apropos. Run their setup -# functions if suitable. -# -sub special_setup { - if ( $main::Opt{'APROPOS'} ) { - die "special_setup(): both --apropos and --whatis option variables " . - "are set;" if $main::Opt{'WHATIS'}; - return &apropos_setup() ? 1 : 0; - } - if ( $main::Opt{'WHATIS'} ) { - return &whatis_setup() ? 1 : 0; - } - 0; -} # special_setup() - - -########## -# whatis_filename() -# -# Interpret as a man page and display its 'whatis' -# information as a fragment written in the groff language. -# -# Globals: in: $main::Opt{'WHATIS'}, $main::Special_Setup, $main::Special_Filespec, -# $main::Filespec_Arg -# -sub whatis_filename { - my $n = @_; - die "whatis_filename(): one argument is needed; you used $n;" - unless $n == 1; - die "whatis_filename(): whatis is not setup;" unless $main::Opt{'WHATIS'}; - die "whatis_filename(): setup for whatis must be run first;" - unless $main::Special_Setup; - die "whatis_filename(): whatis_filespec() must be run first;" - unless $main::Special_Filespec; - die 'whatis_filename(): no $main::Filespec_Arg is set;' - unless defined $main::Filespec_Arg; - - my $arg = $_[0]; - die "whatis_file_name(): $arg is not an existing file" unless -f $arg; - die "whatis_file_name(): could not read file $arg" unless -r $arg; - return 1 if -z $arg; - $arg = 'stdin' if $main::Filespec_Arg eq '-'; - - &to_tmp_line('.br', '\\f[CR]' . $arg . '\\f[]:', '.br'); - -### whatis_filename() - # get the parts of the file name according to the naming of man pages - my ($dir, $name) = &split_path( $_[0] ); - my $section = $_[0]; - my $path = File::Spec->catfile('', 'man'); - $section =~ s#^.*$path([$main::Man{'AUTO_SEC_CHARS'}]).*$#$1#; - $section = '' if $section eq $_[0]; - if ($section) { - if ($name =~ m#^.*\.$section.*$#) { - $name =~ s/^(.*)\.$section.*$/$1/; - } else { - $section = ''; - } - } - - # traditional man style; grep the line containing '.TH' macro, if any - my @catz = &cat_z($_[0]); - my $res; - my $test; - foreach (@catz) { - if (/^[\.']\s*TH\s/) { # search .TH, traditional man style - $test = 1; - last; - } - } # foreach (@catz) -### whatis_filename() - if ($test) { # traditional man style - # get the first line after the first '.SH' macro before the next '.SH' - my $test1; - foreach (@catz) { - if ($test1) { - chomp; - next unless $_; - next if /^[\.']?\s*$/; - last if /^[\.']/; # especially for .SH - if ($res) { - $res = "$res $_"; - } else { - $res = $_; - } - } else { # $test1 is empty - $test1 = 1 if (/^[\.']\s*SH\s/); - } # if ($test1) - } # foreach (@catz) - - if ($section) { - if ($res =~ m|^ - $name - \s - [^-]* - - - \s* - (.*) - $|sx) { - $res = "$name ($section) \\[em] $1"; - } - } # if ($section) -### whatis_filename() - &to_tmp_line($res, '.br', '', '.br'); - return 1; - } # if ($test) - - # mdoc style (BSD doc); grep the line containing '.Nd' macro, if any - foreach (@catz) { - if (/^[\.']\s*Nd\s/) { # BSD doc style - $res =~ s/^(.*)$/$name ($section) \\[em] $1/; - &to_tmp_line($res); - return 1; - } - } - - &to_tmp_line('is not a man page', '.br', '', '.br'); - 1; -} # whatis_filename() - - -########## -# whatis_filespec() -# -# Print the filespec name as .SH to the temporary cat file. -# -# Globals: in: $main::Opt{'WHATIS'}, $main::Filespec_Arg -# in/out: $main::Special_Filespec -# -sub whatis_filespec { - return 0 unless ($main::Opt{'WHATIS'}); - die 'whatis_filespec(): whatis_setup() must be run first.' - unless $main::Special_Setup; - die 'whatis_filespec(): no $main::Filespec_Arg is set;' - unless defined $main::Filespec_Arg; - $main::Special_Filespec = 1; - my $arg = $main::Filespec_Arg; - $arg =~ s/[^\\]-/\\-/g; - to_tmp_line(".SH $arg"); -} # whatis_filespec() - - -########## -# whatis_setup () -# -# Print the whatis header to the temporary cat file; this is the setup -# for whatis. -# -# Globals: in: $main::Opt{'WHATIS'} -# out: $main::Special_Setup -sub whatis_setup { - if ( $main::Opt{'WHATIS'} ) { - &to_tmp_line('.TH GROFFER WHATIS'); - $main::Special_Setup = 1; - $main::Opt{'TITLE'} = 'whatis' unless $main::Opt{'TITLE'}; - return 1; - } - 0; -} # whatis_setup () - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/groffer/roff2.1.man b/contrib/groffer/roff2.1.man deleted file mode 100644 index 6013b58..0000000 --- a/contrib/groffer/roff2.1.man +++ /dev/null @@ -1,229 +0,0 @@ -.TH roff2@ROFF2MODE@ @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -roff2@ROFF2MODE@ \- transform roff code into @ROFF2MODE@ mode -. -.\" roff2@ROFF2MODE@.1 - man page for roff2@ROFF2MODE@ (section 1). -. -.\" Source file position: /contrib/groffer/roff2.man -.\" Installed position: $prefix/share/man/man1/roff2@ROFF2MODE@.1 -. -. -.\" ==================================================================== -.\" Legal Terms -.\" ==================================================================== -.\" -.\" Copyright (C) 2006-2018 Free Software Foundation, Inc. -.\" -.\" This file is part of groffer, which is part of GNU groff, a free -.\" software project. -.\" -.\" You can redistribute it and/or modify it under the terms of the GNU -.\" General Public License version 2 (GPL2) as published by the Free -.\" Software Foundation. -.\" -.\" The license text is available in the internet at -.\" . -. -. -.\" ==================================================================== -.\" Characters -.\" ==================================================================== -. -.\" Ellipsis ... -.ie t .ds EL \fS\N'188'\fP\" -.el .ds EL \&.\|.\|.\&\" -.\" called with \*(EL -. -. -.\" ==================================================================== -.SH "SYNOPSIS" -.\" ==================================================================== -. -.SY roff2@ROFF2MODE@ -.RI [ groffer-option -\*(EL] -.OP \-\- -.RI [ filespec -\*(EL] -.YS -. -.SY roff2@ROFF2MODE@ -.B \-h -.SY roff2@ROFF2MODE@ -.B \-\-help -.YS -. -.SY roff2@ROFF2MODE@ -.B \-v -.SY roff2@ROFF2MODE@ -.B \-\-version -.YS -. -.P -The options -.B \-v -and -.B \%\-\-version -print the version information of the program to standard output and exit. -. -The options -.B \-h -and -.B \-\-help -print a usage information of the program to standard output and stop -the program instantly. -. -. -.P -All other options are assumed to be -.B \%groffer -options. -. -They are internally passed to -.BR \%groffer . -They override the behavior of the program. -. -The options are optional, they can be omitted. -. -. -.P -The -.I \%filespec -arguments correspond to the -.I \%filespec -arguments of -.BR \%groffer . -So they are either the names of existing, readable files or -.B \- -for standard input, or the name of a man page or a -.BR \%groffer (@MAN1EXT@) -man page search pattern. -. -If no -.I \%filespec -is specified standard input is assumed automatically. -. -. -.\" ==================================================================== -.SH DESCRIPTION -. -.B \%roff2@ROFF2MODE@ -transforms -.I roff -code into -.ie '@ROFF2MODE@'x' \{\ -. I X -mode corresponding to the -. I groff -devices -. BR X *; -this mode is suitable for -. BR \%gxditview (@MAN1EXT@). -.\} -.el \{\ -. I \%@ROFF2MODE@ -mode. -.\} -. -Print the result to standard output. -. -. -.P -There are more of these programs for generating other formats of -.I \%roff -input. -. -.if !'@ROFF2MODE@'dvi' \{\ -. TP -. BR \%roff2dvi (@MAN1EXT@) -is for -. I dvi -mode. -.\} -. -.if !'@ROFF2MODE@'html' \{\ -. TP -. BR \%roff2html (@MAN1EXT@) -generates -. I HTML -output. -.\} -. -.if !'@ROFF2MODE@'pdf' \{\ -. TP -. BR \%roff2pdf (@MAN1EXT@) -outputs -. I pdf -mode. -.\} -. -.if !'@ROFF2MODE@'ps' \{\ -. TP -. BR \%roff2ps (@MAN1EXT@) -prints -. I \%PostScript -format to standard output. -.\} -. -.if !'@ROFF2MODE@'text' \{\ -. TP -. BR \%roff2text (@MAN1EXT@) -generates text output in the -. B groff -device -. IR latin1 . -.\} -. -.if !'@ROFF2MODE@'x' \{\ -. TP -. BR \%roff2x (@MAN1EXT@) -prints the output in the -. B groff -device -. B X -that is suitable for programs like -. BR \%gxditview (@MAN1EXT@) -or -. BR \%xditview (1). -.\} -. -. -.\" ==================================================================== -.SH AUTHORS -.\" ==================================================================== -.B roff2@ROFF2MODE@ -was written by -.MT groff\-bernd.warken\-72@\:web.de -Bernd Warken -.ME . -. -. -.\" ==================================================================== -.SH "SEE ALSO" -.\" ==================================================================== -. -.BR \%groff (@MAN1EXT@), -.BR \%groffer (@MAN1EXT@), -.if !'@ROFF2MODE@'dvi' \ -. BR \%roff2dvi (@MAN1EXT@), -.if !'@ROFF2MODE@'html' \ -. BR \%roff2html (@MAN1EXT@), -.if !'@ROFF2MODE@'pdf' \ -. BR \%roff2pdf (@MAN1EXT@), -.if !'@ROFF2MODE@'ps' \ -. BR \%roff2ps (@MAN1EXT@), -.if !'@ROFF2MODE@'text' \ -. BR \%roff2text (@MAN1EXT@), -.if !'@ROFF2MODE@'x' \ -. BR \%roff2x (@MAN1EXT@), -.BR \%gxditview (@MAN1EXT@). -. -. -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== -. -.\" Local Variables: -.\" mode: nroff -.\" End: -.\" vim: set filetype=groff: diff --git a/contrib/groffer/roff2.pl b/contrib/groffer/roff2.pl deleted file mode 100755 index cf5c583..0000000 --- a/contrib/groffer/roff2.pl +++ /dev/null @@ -1,230 +0,0 @@ -#! /usr/bin/env perl - -# roff2* - transform roff files into other formats - -# Source file position: /contrib/groffer/roff2.pl -# Installed position: /bin/roff2* - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -require v5.6; - -use strict; -use warnings; -use File::Spec; - -# temporary dir and files -use File::Temp qw/ tempfile /; - -my $Dev_Null = File::Spec->devnull(); -my $Mode; -my $Name; -{ - my ($v, $d); - ($v, $d, $Name) = File::Spec->splitpath($0); - die "wrong program name: $Name;" - if $Name !~ /^roff2[a-z]/; -} -$Mode = $Name; -$Mode =~ s/^roff2//; - -my $Groff_Version = `groff --version 2>$Dev_Null`; -die "$Name error: groff does not work;" if $?; -my $Groffer_Version = `groffer --version 2>$Dev_Null`; -my $Has_Groffer = ! $?; - -if ($Has_Groffer) { - foreach (@ARGV) { - last if $_ eq '--'; - next if $_ eq '-'; - if ($_ eq '-v' || '--version' =~ m|^$_|) { - print $Name, ' in ', $Groffer_Version; - exit 0; - } - if ($_ eq '-h' || '--help' =~ m|^$_|) { - &usage_with_groffer(); - exit 0; - } - } - system('groffer', '--to-stdout', "--$Mode", @ARGV); - exit $?; -} else { - my @filespec; - my $double_minus; - foreach (@ARGV) { - if ($double_minus) { - push @filespec, $_; - next; - } - if ($_ eq '--') { - $double_minus = 1; - next; - } - if ($_ eq '-') { - push @filespec, '-'; - next; - } - if ($_ eq '-v' || '--version' =~ m|^$_|) { - print $Name, ' in ', $Groff_Version; - exit 0; - } - if ($_ eq '-h' || '--help' =~ m|^$_|) { - &usage_without_groffer(); - exit 0; - } - if ($_ =~ /^-/) { - &error_no_groffer(); - &error_no_options(); - next; - } - if (-f && -r) { - push @filespec, $_; - } else { - &error_no_groffer(); - print STDERR "$_ is not an existing, readable file.\n"; - } - } - - @filespec = ('-') unless @filespec; - my $has_stdin; - foreach (@filespec) { - if ($_ eq '-') { - $has_stdin =1; - last; - } - } - - if ($has_stdin) { - my $tempdir; - foreach ($ENV{'GROFF_TMPDIR'}, $ENV{'TMPDIR'}, $ENV{'TMP'}, - $ENV{'TEMP'}, $ENV{'TEMPDIR'}, - File::Spec->catfile($ENV{'HOME'}, 'tmp')) { - if ($_ && -d $_ && -w $_) { - $tempdir = $_; - last; - } - } - my $template = $Name . '_XXXX'; - my ($fh, $stdin); - if ($tempdir) { - ($fh, $stdin) = tempfile($template, UNLINK => 1, DIR => $tempdir) || - die "$Name: could not create temporary file;"; - } else { - ($fh, $stdin) = tempfile($template, UNLINK => 1) || - die "$Name: could not create temporary file;"; - } - open $fh, ">$stdin"; - print $fh $_ foreach ; - - foreach (@filespec) { - $_ = $stdin if $_ eq '-'; - } - } # if $has_stdin - - my $grog; - my $groff_options = "-T$Mode"; - $groff_options = '-TX75-12 -Z' if $Mode eq 'x'; - $groff_options = '-Tlatin1' if $Mode eq 'text'; - if ($Mode eq 'pdf') { - my $ps2pdf; - my @path = File::Spec->path(); - foreach (@path) { - my $file = File::Spec->catfile($_, 'ps2pdf'); - if (-f $file && -x $file) { - $ps2pdf = "$file -"; - last; - } - } - unless ($ps2pdf) { - foreach (@path) { - my $file = File::Spec->catfile($_, 'gs'); - if (-f $file && -x $file) { - $ps2pdf = $file . ' -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite ' . - '-sOutputFile=- -c save pop -f -'; - last; - } - } - } - $grog = `grog -Tps @filespec`; - chomp $grog; - system("$grog | $ps2pdf"); - exit $?; - } else { - $grog = `grog $groff_options @filespec`; - chomp $grog; - system($grog); - exit $?; - } -} - -my $error_no_groffer; -sub error_no_groffer { - return 1 if $error_no_groffer; - $error_no_groffer = 1; - print STDERR "$Name: groffer is not available.\n"; -} - -my $error_no_options; -sub error_no_options { - return 1 if $error_no_options; - $error_no_groffer = 1; - print STDERR "$Name: groffer options are not allowed.\n"; -} - -sub usage_with_groffer { - print </contrib/groffer/split_env.sh -# Installed position: /lib/groff/groffer/split_env.sh - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -# This file is called from groffer.pl. The environment variable -# of the name in $1 will be split at output. The corresponding variable -# must be exported before the call of groffer.pl. - -if test $# = 0 -then - echo 'split_env.sh was called without an argument.' >&2; -else - eval v='"$'"$1"'"'; - if test _"$v"_ != __ - then - eval set x $v; - shift; - for i in "$@"; - do - echo $i; - done; - fi; -fi; diff --git a/contrib/groffer/subs.pl b/contrib/groffer/subs.pl deleted file mode 100644 index a3d6b87..0000000 --- a/contrib/groffer/subs.pl +++ /dev/null @@ -1,795 +0,0 @@ -#! /usr/bin/env perl - -# groffer - display groff files - -# Source file position: /contrib/groffer/subs.pl -# Installed position: /lib/groff/groffer/subs.pl - -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# Last update: 27 Aug 2015 - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -######################################################################## - -use strict; -use warnings; - -######################################################################## -# some functions -######################################################################## - -########## -# cat_z() -# -# Decompress or cat the . -# -# Return: the decompressed file as array -# -sub cat_z { - my $n = @_; - die "cat_z(): one argument is needed; you used $n;" - unless $n == 1; - - my $file = $_[0]; - die "cat_z(): '$file' is not a readable file;" unless -f $file && -r $file; - return () if -z $file; - - my @res; - if ($main::Has_Compression) { - if ($main::Has_bzip) { - # test whether bz2 compressed, shell return must be inverted - unless ( system("bzip2 -t $file 2>$main::Dev_Null") ) { - @res = `bzip2 -c -d $file 2>$main::Dev_Null`; - return @res; - } - # if not compressed with gz, gzip will act like 'cat' - @res = `gzip -c -d -f $file 2>$main::Dev_Null`; - return @res; - } - } else { - my $fh; - open $fh, "<$file" or die "cat_z(): could not open $file"; - @res = <$fh>; - close $fh; - return @res; - } - (); -} # cat_z() - - -########## -# clean_up() -# -# Remove the temporary directory and restore the system. -# -sub clean_up { - umask $main::Umask; - chdir $main::Start_Dir; - if ($main::Debug{'KEEP'} && -d $main::tmpdir) { - my $glob = File::Spec->catfile($main::tmpdir, '*'); - unlink glob($glob); # rm $tmpdir/* - rmdir $main::tmpdir; - } -} # clean_up() - - -########## -# get_dirname() -# -# Split the path and return the directory name part -# -# Return: string of directory name -# -sub get_dirname { - my $n = @_; - die "get_filename(): one argument is needed; you used $n;" unless $n == 1; - return '' unless $_[0]; - - my ($dirname, $filename) = &split_path($_[0]); - $dirname; -} # get_dirname() - - -########## -# get_filename() -# -# Split the path and return the file name part -# -# Return: string of file name -# -sub get_filename { - my $n = @_; - die "get_dirname(): one argument is needed; you used $n;" unless $n == 1; - return '' unless $_[0]; - - my ($dirname, $filename) = &split_path($_[0]); - $filename; -} # get_filename() - - -########## -# is_X() -# -# Test whether X Windows is running. -# -sub is_X { - return 1 if $ENV{'DISPLAY'}; - return 0; -} # is_X() - - -########## -# list_has(, ) -# -# Determine if has as element. -# -sub list_has { - my $n = @_; - die "list_has(): 2 arguments are needed; you used $n;" - unless $n == 2; - - my $list_ref = $_[0]; - my $string = $_[1]; - die "list_has(): first argument must be an array reference;" - unless ref($list_ref) eq 'ARRAY'; - - foreach ( @$list_ref ) { - return 1 if $_ eq $string; - } - 0; -} - - -########## -# path_uniq(...) -# -# make path having unique existing directories -# -sub path_uniq { - my @a; - my %h; - foreach (@_) { - next if exists $h{$_}; - next unless -d $_; - push @a, $_; - $h{$_} = 1; - } - @a; -} # path_uniq() - - -########## -# print_hash() -# -# print the elements of a hash or hash reference -# -sub print_hash { - my $hr; - my $n = scalar @_; - if ($n == 0) { - print "empty hash\n;"; - return 1; - } elsif ($n == 1) { - if (ref($_[0]) eq 'HASH') { - $hr = $_[0]; - } else { - warn 'print_hash(): the argument is not a hash or hash reference;'; - return 0; - } - } else { - if ($n % 2) { - warn 'print_hash(): the arguments are not a hash;'; - return 0; - } else { - my %h = @_; - $hr = \%h; - } - } - -### print_hash() - unless (%$hr) { - print "empty hash\n"; - return 1; - } - print "hash (ignore the ^ characters):\n"; - for my $k (sort keys %$hr) { - my $hk = $hr->{$k}; - print " $k => "; - if (defined $hk) { - print "^$hk^"; - } else { - print "undef"; - } - print "\n"; - } - - 1; -} # print_hash() - - -########## -# print_times() -# -# print the time, result: user, system, child process user, child system -# -sub print_times { - my @t = times; - my $s = ''; - $s = $_[0] if $_[0]; -# print STDERR "$s: @t\n"; -} # print_times() - -BEGIN { &print_times("start"); } -END { &print_times("end"); } - - -########## -# split_path() -# -# Split the path into directory and file name parts -# -# Return: array with 2 elements consisting of directory and file name -# -sub split_path { - my $n = @_; - die "split_path(): one argument is needed; you used $n;" unless $n == 1; - my $arg = $_[0]; - return () unless $arg; - - my $basename = basename($arg); - if ( $basename ne $arg ) { # path with dir - # fileparse() is from File::Basename - my($filename, $dirname, $suffix) = fileparse($arg); - return ($dirname, $basename); - } - return ('', $arg); -} - - -{ - my $nr_file = 0; - my $nr_so = 0; - - my $tmp_file_base; - my $tmp_so_base; - - my $soelim_r = ''; - $soelim_r = '-r' - if ! system("echo -n '' | soelim -r 2>$main::Dev_Null >$main::Dev_Null"); - - ########## - # to_tmp () - # - # Print file (decompressed) to the temporary cat file with handling .SO - # for man pages. - # - sub to_tmp { - my $n = @_; - die "to_tmp(): one argument is needed; you used $n;" - unless $n == 1; - - my $arg = $_[0]; - return 1 unless $arg; - die "to_tmp(): $arg is not an existing file;" unless -f $arg; - die "to_tmp(): could not read file $arg;" unless -r $arg; - return 1 if -z $arg; - - $tmp_file_base = File::Spec->catfile($main::tmpdir, ',file') - unless $tmp_file_base; - $tmp_so_base = File::Spec->catfile($main::tmpdir, ',so') - unless $tmp_so_base; - - open $main::fh_cat, ">>$main::tmp_cat" or - die "to_tmp(): could not open temporary cat file"; - - if ($main::Opt{'WHATIS'}) { - &whatis_filename($arg); - return 1; - } - - ### to_tmp() - my $dir = &get_dirname($arg); - - my ($fh_file, $tmp_file, $fh_tmp, $tmp_tmp); - ++$nr_file; - $tmp_file = $tmp_file_base . $nr_file; - $tmp_tmp = File::Spec->catfile($main::tmpdir, ',tmp'); - - print STDERR "file: $arg\n" if $main::Debug{'FILENAMES'}; - - if ($main::Filespec_Is_Man) { - my ($fh_so, $tmp_so); - - open $fh_file, ">$tmp_file" or - die "to_tmp(): could not open $tmp_file;"; - foreach ( &cat_z($arg) ) { - print $fh_file "$_"; - } - close $fh_file; - - open $fh_file, "<$tmp_file" or - die "to_tmp(): could not open $tmp_file;"; - my @list; - foreach (<$fh_file>) { - if (/^[\.']\s*so\s/) { - chomp; - s/^[\.']\s*so\s*//; - push @list, $_; - } - } - close $fh_file; - - if ( @list && $main::Debug{'KEEP'} ) { - my $f = $tmp_file . '+man'; - copy($tmp_file, $f); - } - - ### to_tmp() - DO_MAN_SO: foreach (@list) { - # start of _do_man_so() in shell version - my $so = $_; - my $soname = $so; - $soname =~ s/\\\s/ /g; - - my $sofound; - my $path = File::Spec->rootdir(); - if ($soname =~ m#^$path#) { # absolute path name - next DO_MAN_SO if -f $soname; - foreach ('.gz', '.Z', '.bz2') { - my $name = $soname . $_; - if (-f $name) { - $sofound = $name; - last; - } - } # foreach - next DO_MAN_SO unless $sofound; - } else { # relative to man path - LOOP: foreach my $ext ('', '.gz', '.Z', '.bz2') { - foreach my $p ( @{$main::Man{'PATH'}} ) { - my $f = File::Spec->catfile($p, "$soname$ext"); - if (-f $f) { - $sofound = $f if -f $f; - last LOOP; - } - } # foreach - } # LOOP: - next DO_MAN_SO unless $sofound; - } # if on path - - print STDERR "file from .so: $so\n" if $main::Debug{'FILENAMES'}; - - ### to_tmp() - ++$nr_so; - $tmp_so = $tmp_so_base . $nr_so; - unlink $tmp_so if -e $tmp_so; - open $fh_so, ">$tmp_so" or - die "to_tmp(): could not open $tmp_so;"; - foreach ( &cat_z($sofound) ) { - print $fh_so $_; - } - close $fh_so; - - my $esc = $so; - $esc =~ s/\\/\\\\/g; - open $fh_file, "<$tmp_file" or - die "to_tmp(): could not open $tmp_file;"; - open $fh_tmp, ">$tmp_tmp" or - die "to_tmp(): could not open $tmp_tmp;"; - foreach (<$fh_file>) { - s#^([\.'])\s*so\s+($so|$esc|$soname)\s*\n$#${1}so $tmp_so\n#s; - print $fh_tmp $_; - } - ### to_tmp() - close $fh_tmp; - close $fh_file; - unlink $tmp_file if -e $tmp_file; - rename $tmp_tmp, $tmp_file; - # end of _do_man_so() in shell version - } # foreach (@list) - - if ( @list && $main::Debug{'KEEP'} ) { - my $f = $tmp_file . '+tmp'; - copy($tmp_file, $f); - } - - unlink $tmp_tmp if -e $tmp_tmp; - rename $tmp_file, $tmp_tmp; - system("soelim -I$dir $soelim_r $tmp_tmp >$tmp_file"); - unlink $tmp_tmp if -e $tmp_tmp; - - } else { # $Filespec_Is_Man is empty - open $fh_tmp, ">$tmp_tmp" or - die "to_tmp(): could not open $tmp_tmp;"; - foreach (cat_z $arg) { - print $fh_tmp $_; - } - close $fh_tmp; - if ($dir) { - system("soelim -I$dir $soelim_r $tmp_tmp >$tmp_file"); - } else { - system("soelim $soelim_r $tmp_tmp >$tmp_file"); - } - unlink $tmp_tmp; - } # if ($Filespec_Is_Man) - - ### to_tmp() - my $grog = `grog $tmp_file`; - die "to_tmp(): grog error on $tmp_file;" if $?; - chomp $grog; - print STDERR "grog output: $grog\n" if $main::Debug{'GROG'}; - if ($grog =~ /^.*\s-m.*$/) { - $grog =~ s/\s+/ /g; - $grog =~ s/ -m / -m/g; - $grog =~ s/ -mm([^ ]) / -m$1/g; - foreach my $g (split / /, $grog) { - if ($g =~ /^-m/) { - my $ref = \@main::Macro_Packages; - if ( &list_has($ref, $g) ) { - if (! $main::Macro_Pkg) { - $main::Macro_Pkg = $g; - } elsif ($main::Macro_Pkg eq $g) { - 1; - } elsif ($main::Macro_Pkg =~ /^-m/) { - warn "to_tmp(): Ignore $arg because it needs $g " . - "instead of $main::Macro_Pkg"; - unlink $tmp_file unless $main::Debug{'KEEP'}; - return 0; - } elsif ($main::Macro_Pkg ne $g) { - die "to_tmp(): \$Macro_Pkg does not start with -m: " . - "$main::Macro_Pkg"; - } # if (! $main::Macro_Pkg) - } # if (&list_has - } # if (/^-m/) - } # foreach my $g - } # if $grog - - open $fh_file, "<$tmp_file" or - die "to_tmp(): could not open $tmp_file for reading;"; - open $main::fh_cat, ">>$main::tmp_cat" or - die "to_tmp(): could not open $main::tmp_cat for appending;"; - foreach (<$fh_file>) { - print $main::fh_cat $_; - } - close $main::fh_cat; - close $fh_file; - - unless ( $main::Debug{'KEEP'} ) { - unlink $tmp_file; - foreach ( glob("$tmp_so_base*") ) { - unlink $_; - } - } - 1; - } # to_tmp() -} - -########## -# to_tmp_line (...) -# -# Print array of lines with to the temporary cat file. \n is added -# if a line does not end with \n. -# -sub to_tmp_line { - my $n = @_; - return 1 if $n == 0; - open $main::fh_cat, ">>$main::tmp_cat" or - die "to_tmp_line(): could not open temporary cat file"; - foreach (@_) { - my $line = $_; - chomp($line); - print $main::fh_cat "$line\n"; - } - close $main::fh_cat; - 1; -} # to_tmp_line() - - -########## -# usage() -# -# Print usage information for --help. -# -sub usage { - print "\n"; - &version(); - print <) { - chomp; - if (/^\s*_PROGRAM_VERSION\s*=\s*['"]*([^'"]*)['"]*\s*;?\s*$/) { - $program_version = $1; - next; - } - if (/^\s*_GROFF_VERSION_PRESET\s*=\s*['"]*([^'"]*)['"]*\s*;?\s*$/) { - # this setting of the groff version is only used before make is run, - # otherwise @VERSION@ will set it, see groffer.sh. - $groff_version_preset = $1; - next; - } - } - close $fh; - - if ($main::Groff_Version) { - $groff_version = $main::Groff_Version; - } else { - $groff_version = $groff_version_preset; - } - print <) -# -# Test whether without its arguments exists or is a program -# in $PATH. -# -# Arguments : 1, can have spaces and arguments. -# Return : a hash with 'dir', 'file', 'fullname', 'args' if -# argument exists or is a program in $PATH, empty hash else. -# -sub where_is_prog { - scalar @_ eq 1 or die "where_is_prog(): only one argument is allowed"; - my $p1 = $_[0]; - return () unless $p1; - - $p1 =~ s/\s+/ /g; - $p1 =~ s/(\\)+ / /g; - $p1 =~ s/^ | $//g; - return () unless $p1; - - my $noarg = $p1; - $noarg =~ s/ -.*$//; - return () unless $noarg; - - my $args; - if ($p1 =~ /^.* -.*$/) { - $args = $p1; - $args =~ s#^$noarg ##; - } - $args = '' unless defined $args; - - my %result; - - # test whether $noarg has directory, so it is not tested with $PATH - my ($dir, $name) = &split_path($noarg); - $result{'dir'} = $dir; - -### where_is_prog() - if (-f $noarg && -x $noarg) { - $result{'args'} = $args; - $result{'file'} = $name; - $result{'fullname'} = File::Spec->catfile($dir, $name); - return %result; - } - - if ($dir) { # $noarg has name with directory - # now $wip_noarg (with directory) is not an executable file - - # test name with space - if ($name =~ / /) { - my @base = split(/ /, $name); - my $n = pop @base; - my @baseargs = ($n); - while (@base) { - my $base = join(' ', @base); - my $file = File::Spec->catpath($dir, $base); - if (-f $file && -x $file) { - my $baseargs = join(' ', @baseargs); - ### where_is_prog() - if ($args) { - $args = "$baseargs $args"; - } else { - $args = $baseargs; - } - $result{'args'} = $args; - $result{'file'} = $base; - $result{'fullname'} = $file; - return %result; - } # file test $file - $n = pop @base; - unshift(@baseargs, $n); - } # while (@base) - } # end of test name with space - return (); - } # test on $dir - - # now $noarg doesn't have a directory part - - $name = $noarg; - - # check with $PATH - - # test path with $win_noarg as a whole, evt. with spaces - foreach my $d (@main::Path) { - my $file = File::Spec->catfile($d, $name); - if (-f $file && -x $file) { - $result{'args'} = $args; - $result{'fullname'} = $file; - ($result{'dir'}, $result{'file'}) = &split_path($file); - return %result; - } # file test $file - } # foreach (@main::Path) - -### where_is_prog() - if ($name =~ / /) { - my @base = split(/ /, $name); - my $n = pop @base; - my @baseargs = ($n); - while (@base) { - my $base = join(' ', @base); - foreach my $d (@main::Path) { - my $file = File::Spec->catfile($d, $base); - if (-f $file && -x $file) { - my $baseargs = join(' ', @baseargs); - if ($args) { - $args = "$baseargs $args"; - } else { - $args = $baseargs; - } - $result{'args'} = $args; - $result{'fullname'} = $file; - ($result{'dir'}, $result{'file'}) = &split_path($file); - return %result; - } # file test $file - } # foreach (@main::Path) - $n = pop @base; - unshift(@baseargs, $n); - } # while (@base) - } # test $name on space - return (); -} # where_is_prog() - - -########## -# wait() -# -# stop for checking temp files, etc. -# -sub wait { - print "push Ctrl-D"; - my @x = ; - print "\n"; -} # wait() - - -1; -######################################################################## -### Emacs settings -# Local Variables: -# mode: CPerl -# End: diff --git a/contrib/groffer/version.sh b/contrib/groffer/version.sh deleted file mode 100644 index 0015981..0000000 --- a/contrib/groffer/version.sh +++ /dev/null @@ -1,34 +0,0 @@ -#! /bin/sh - -# groffer - display groff files - -# Source file position: /contrib/groffer/version.sh -# Installed position: /lib/groff/groffer/version.sh - -# Copyright (C) 2001-2018 Free Software Foundation, Inc. -# Written by Bernd Warken . - -# This file is part of 'groffer', which is part of 'groff'. - -# 'groff' is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# 'groff' is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -######################################################################## - -export _PROGRAM_VERSION; -_PROGRAM_VERSION='2.3.0'; - -# this setting of the groff version is only used before make is run, -# otherwise @VERSION@ will set it, see groffer.sh. -export _GROFF_VERSION_PRESET; -_GROFF_VERSION_PRESET='1.22.4'; diff --git a/contrib/hdtbl/ChangeLog b/contrib/hdtbl/ChangeLog index 431db45..a0a1e8d 100644 --- a/contrib/hdtbl/ChangeLog +++ b/contrib/hdtbl/ChangeLog @@ -1,3 +1,83 @@ +2022-06-21 G. Branden Robinson + + * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): Add dependency on + grops. + +2022-05-01 G. Branden Robinson + + * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): Add dependency on devps + stamp file since the files' target rule generates PostScript + with groff. + +2022-04-12 Ingo Schwarze + + Delete the harmful, ill-designed, buggy, and essentially + unmaintained and untested --with-doc option of the configure + script. See the NEWS file for more details on the rationale. + + * hdtbl.am: Delete two BUILD_EXAMPLES conditionals. + +2022-03-30 G. Branden Robinson + + * hdtbl.am: Eliminate `HDTBL_TFLAG` and `HDTBL_PFLAG` Make + macros; they were expanded in only one place. + (HDTBLGROFF): Track rename of Make macro `TFLAG` to `MFLAG`. + +2022-03-30 G. Branden Robinson + + * examples/mixed_pickles.ms: Die horribly if `PSPIC` call fails. + +2022-03-26 G. Branden Robinson + + * hdtbl.am (nodist_hdtblexample_DATA, + HDTBLPROCESSEDEXAMPLEFILES): Replace hard-coded "gnu.eps" file + name with expansion of `DOC_GNU_EPS`. + (HDTBLPROCESSEDEXAMPLEFILES): Pass `-I` option to `HDTBLGROFF` + to enable location of "gnu.eps" file (for "mixedpickles.roff" + document). + +2021-10-21 G. Branden Robinson + + * hdtbl.am: + (hdtbl_test_template): Pull file name into a new variable. + (EXTRA_DIST, contrib/hdtbl/examples/test-hdtbl.sh): Use it. + (contrib/hdtbl/examples/test-hdtbl.sh): Build more quietly; + prefix rule with `$(AM_V_GEN)`. Also run `chmod` conditionally. + +2021-07-11 G. Branden Robinson + + * hdtbl.am: Remove unnecessary Make variable. + (hdtbl_builddir): Delete. + (HDTBL_TFLAG): Remove `-M$(hdtbl_builddir)` option; it's no + longer needed for hdtbl example document generation needed now + that hdtbl is no longer stripped. + +2021-07-01 G. Branden Robinson + + Skip the stripper, part 2/3 ("hdtbl"). + + * hdmisc.tmac-u: Rename to... + * hdmisc.tmac: ...this. + + * hdtbl.tmac-u: Rename to... + * hdtbl.tmac: ...this. + + * hdtbl.am (HDSTRIPFILES): Rename to... + (HDTBLTMACFILES): ...this. + (hdtbltmac_DATA): Rename to... + (dist_hdtbltmac_DATA): ...this. + (MOSTLYCLEANFILES): Drop $(HDTBLSTRIPFILES). + ($(HDTBLSTRIPFILES)): Drop target. + +2018-12-26 Ingo Schwarze + + A missing prerequisite could cause parallel builds to fail. + + * hdtbl.am (HDTBLPROCESSEDEXAMPLEFILES): requires eqn + because the .roff.ps target runs HDTBLGROFF = + GROFFBIN ... HDTBL_PFLAG = groff ... -t -p -e -U + which includes -e. + 2018-12-06 Ingo Schwarze * examples/fonts_n.in, examples/fonts_x.in: @@ -453,14 +533,16 @@ ________________________________________________________________________ -Copyright 2006-2018 Free Software Foundation, Inc. +Copyright 2006-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never -mode: change-log coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/hdtbl/examples/chess_board.roff b/contrib/hdtbl/examples/chess_board.roff index ee5d365..171d95e 100644 --- a/contrib/hdtbl/examples/chess_board.roff +++ b/contrib/hdtbl/examples/chess_board.roff @@ -3,7 +3,7 @@ chess_board.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -57,10 +57,6 @@ along with this program. If not, see . .TD .ETB . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/col_rowspan_colors.roff b/contrib/hdtbl/examples/col_rowspan_colors.roff index 9a42766..90f2e7a 100644 --- a/contrib/hdtbl/examples/col_rowspan_colors.roff +++ b/contrib/hdtbl/examples/col_rowspan_colors.roff @@ -3,7 +3,7 @@ col_rowspan_colors.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -75,10 +75,6 @@ along with this program. If not, see . .ETB .ETB .PN 15 Text after table. . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/color_boxes.roff b/contrib/hdtbl/examples/color_boxes.roff index ddb1666..65538a7 100644 --- a/contrib/hdtbl/examples/color_boxes.roff +++ b/contrib/hdtbl/examples/color_boxes.roff @@ -3,7 +3,7 @@ color_boxes.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -45,10 +45,6 @@ along with this program. If not, see . .TBL border=.5n bc=color1 bgc=color2 width=15c tal=c csp=.2n cpd=.3n .TR .TD .ETB .PN 25 Text after horizontal rule. . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/color_nested_tables.roff b/contrib/hdtbl/examples/color_nested_tables.roff index cb0e9c4..946d297 100644 --- a/contrib/hdtbl/examples/color_nested_tables.roff +++ b/contrib/hdtbl/examples/color_nested_tables.roff @@ -4,7 +4,7 @@ color_nested_tables.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -53,10 +53,6 @@ along with this program. If not, see . .PN 39 .ETB .PN 25 Text after second table. . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/color_table_cells.roff b/contrib/hdtbl/examples/color_table_cells.roff index 2f84b28..65489cb 100644 --- a/contrib/hdtbl/examples/color_table_cells.roff +++ b/contrib/hdtbl/examples/color_table_cells.roff @@ -4,7 +4,7 @@ color_table_cells.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -47,10 +47,6 @@ along with this program. If not, see . .TBL border=.5n bc=c1 bgc=c2 width=15c tal=c csp=.2n cpd=.3n .TR .TD .ETB .PN 15 Text after HR. . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/color_transitions.roff b/contrib/hdtbl/examples/color_transitions.roff index 27c1400..be69b7c 100644 --- a/contrib/hdtbl/examples/color_transitions.roff +++ b/contrib/hdtbl/examples/color_transitions.roff @@ -4,7 +4,7 @@ color_transitions.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -51,10 +51,6 @@ along with this program. If not, see . .ETB .PN 30 After table. . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/common.roff b/contrib/hdtbl/examples/common.roff index fa45674..a9c02a0 100644 --- a/contrib/hdtbl/examples/common.roff +++ b/contrib/hdtbl/examples/common.roff @@ -4,7 +4,7 @@ common.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2010-2018 Free Software Foundation, Inc. +Copyright (C) 2010-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -288,10 +288,6 @@ along with this program. If not, see . .if "\n[.M]"" \ . fcolor white . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/fonts_n.in b/contrib/hdtbl/examples/fonts_n.in index 76d6661..c953fa4 100644 --- a/contrib/hdtbl/examples/fonts_n.in +++ b/contrib/hdtbl/examples/fonts_n.in @@ -4,7 +4,7 @@ font_n.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -142,10 +142,6 @@ along with this program. If not, see . . .fontdump all . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/fonts_x.in b/contrib/hdtbl/examples/fonts_x.in index 081c8c7..c183c7c 100644 --- a/contrib/hdtbl/examples/fonts_x.in +++ b/contrib/hdtbl/examples/fonts_x.in @@ -4,7 +4,7 @@ font_x.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -153,10 +153,6 @@ along with this program. If not, see . . .fontdump all . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/mixed_pickles.roff b/contrib/hdtbl/examples/mixed_pickles.roff index 190c860..1c909e9 100644 --- a/contrib/hdtbl/examples/mixed_pickles.roff +++ b/contrib/hdtbl/examples/mixed_pickles.roff @@ -4,7 +4,7 @@ mixed_pickles.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -20,6 +20,10 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . +.. +. +.am pspic*error-hook +. ab \\n[.F]:\\n[.c]: fatal error: PSPIC failed to include '\\$1' .. . .if !d sopath \ @@ -93,10 +97,6 @@ ellipse "PostScript" . ETB .ETB . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/rainbow.roff b/contrib/hdtbl/examples/rainbow.roff index 8c2553f..ecd59f5 100644 --- a/contrib/hdtbl/examples/rainbow.roff +++ b/contrib/hdtbl/examples/rainbow.roff @@ -4,7 +4,7 @@ rainbow.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -79,10 +79,6 @@ along with this program. If not, see . . .PN 6*\n[*n] .ETB . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/examples/short_reference.roff b/contrib/hdtbl/examples/short_reference.roff index e608769..62b3bcd 100644 --- a/contrib/hdtbl/examples/short_reference.roff +++ b/contrib/hdtbl/examples/short_reference.roff @@ -4,7 +4,7 @@ short_reference.roff This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -79,10 +79,6 @@ using the macros themselves. .ETB .H ------ incomplete ------- . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/groff_hdtbl.7.man b/contrib/hdtbl/groff_hdtbl.7.man index 0ae39a3..af5ab87 100644 --- a/contrib/hdtbl/groff_hdtbl.7.man +++ b/contrib/hdtbl/groff_hdtbl.7.man @@ -1,18 +1,14 @@ -.TH GROFF_HDTBL @MAN7EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -groff_hdtbl \- Heidelberger table macros for GNU roff -. -. -.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr groff_hdtbl_C \n[.C] -.cp 0 +.TH groff_hdtbl @MAN7EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +groff_hdtbl \- Heidelberger table macros for GNU +.I roff . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2005-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2005-2020 Free Software Foundation, Inc. .\" .\" This file is part of groff, the GNU roff type-setting system. .\" @@ -26,11 +22,31 @@ groff_hdtbl \- Heidelberger table macros for GNU roff .\" called FDL in the main directory of the groff source package. . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_groff_hdtbl_7_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .ig Some simple formatting macros. Note that we use '.ig' here and not a comment to make 'mandb' 2.4.1 (and probably more recent versions also) - happy; otherwise the '.char' lines and the stuff which follows is included - in the 'whatis' database. + happy; otherwise the '.char' lines and the stuff which follows is + included in the 'whatis' database. .. . . @@ -68,6 +84,7 @@ groff_hdtbl \- Heidelberger table macros for GNU roff . fam C . \\$2 \&\\\\$*\F[]\F[\\\\*[old-fam]] . fam +. rm old-fam \\.. . . . @@ -81,6 +98,7 @@ groff_hdtbl \- Heidelberger table macros for GNU roff . fam C . \\$1 \\\\$@ \F[]\F[\\\\*[old-fam]] . fam +. rm old-fam \\.. . . . @@ -129,7 +147,10 @@ groff_hdtbl \- Heidelberger table macros for GNU roff . .de XAA . TQ -. CRI \\$@ +. ie (\\n[.$] < 2) \ +. CR \\$@ +. el \ +. CRI \\$@ .. . . @@ -162,84 +183,87 @@ groff_hdtbl \- Heidelberger table macros for GNU roff .. . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . The -.B hdtbl -macros consist of four base and three optional macros, controlled by about -twenty arguments. +.I hdtbl +macros consist of four base and three optional macros, +controlled by about twenty arguments. . -The syntax is simple and similar to the -.B HTML -table model and nearly as flexible: You can write sequences of tokens (macro -calls with their arguments and content data), separated by blanks and -beginning with a macro call, into the same line to get compact and cleanly -arrranged input. +The syntax is simple and similar to the HTML table model and nearly as +flexible: +you can write sequences of tokens +(macro calls with their arguments and content data), +separated by blanks and beginning with a macro call, +into the same line to get compact and cleanly arrranged input. . An advantage of -.B hdtbl -is that the tables are constructed without calling a preprocessor; this -means that -.BR groff 's +.I hdtbl +is that the tables are constructed without calling a preprocessor; +this means that +.MR groff @MAN7EXT@ 's full macro capabilities are available. . -On the other hand, table processing with -.B hdtbl +On the other hand, +table processing with +.I hdtbl is much slower than using the -.BR tbl (@MAN1EXT@) +.MR @g@tbl @MAN1EXT@ preprocessor. . A further advantage is that the HTML-like syntax of -.B hdtbl -will be easily converted to HTML; this is not implemented yet. +.I hdtbl +will be easily converted to HTML; +this is not implemented yet. . . .\" ==================================================================== -.SH USAGE +.SH Usage .\" ==================================================================== . In this and the next section, we present examples to help users understand the basic workflow of -.BR hdtbl . +.IR hdtbl . . First of all, you must load the .I hdtbl.tmac file. . -As with nearly all other groff macro packages, there are two possibilities -to do so: +As with nearly all other +.I groff +macro packages, +there are two possibilities to do so: . Either add the line . +. .PP -.nf -.nh .RS -.CR .mso hdtbl.tmac -.fi -.hy +.EX +\&.mso hdtbl.tmac +.EE .RE . +. .PP to your .I roff file before using any macros of the -.B hdtbl +.I hdtbl package, or add the option . .PP -.nf -.nh .RS -.CR \-m hdtbl -.fi -.hy +.EX +\-m hdtbl +.EE .RE . +. .PP to the command line of groff (before the document file which contains -.B hdtbl +.I hdtbl macros). . Then you can include on or more tables in your document, where each one @@ -251,11 +275,15 @@ macros, respectively. . . .PP -In this man page, we approximate the result of each example in the -.I tty -format to be as generic as possible since -.B hdtbl -currently only supports the PS and PDF output devices. +In this man page, +we approximate the result of each example as terminal output to be as +generic as possible since +.I hdtbl +currently only supports the +.B ps +and +.B pdf +output drivers. . . .PP @@ -264,49 +292,46 @@ four base table macros in the right order. . Here we construct a table with only one cell. . +. .PP .RS -.nf -.nh -.CR .TBL -.CR .TR -.CR .TD -.CI contents of the table cell -.CR .ETB -.fi -.hy +.EX +\&.TBL +\&.TR +\&.TD +.I contents of the table cell +\&.ETB +.EE .RE . . .PP -A -.I tty -representation is +A terminal representation is +. . .PP -.nf -.nh -.ft CR +.if t .ne 3v .RS +.EX +.tr -\- +------------------------------------------------------+ -| contents-of-the-table-cell | +.\" That's 27 spaces below. +.RI "| " contents-of-the-table-cell " |" +------------------------------------------------------+ +.tr -- +.EE .RE -.ft -.hy -.fi . . .PP Equivalent to the above is the following notation. . +. .PP .RS -.nh -.nf -.CRI ".TBL .TR .TD \[dq]" "contents of the table cell" "\[dq] .ETB" -.fi -.hy +.EX +.RI ".TBL .TR .TD \[dq]" "contents of the table cell" "\[dq] .ETB" +.EE .RE . . @@ -329,37 +354,32 @@ can be written as . .PP .RS -.nf -.nh -.CR ".TBL cols=2" -.CR ". TR .TD 1*1 .TD 1*2" -.CR ". TR .TD 2*1 .TD 2*2" -.CR ".ETB" -.fi -.hy +.EX +\&.TBL cols=2 +\&.\& TR .TD 1*1 .TD 1*2 +\&.\& TR .TD 2*1 .TD 2*2 +\&.ETB +.EE .RE . . .PP -A -.I tty -representation is +A terminal representation is . . .PP -.nf -.nh -.ft CR +.if t .ne 5v .RS +.EX +.tr -\- +--------------------------+---------------------------+ | 1*1 | 1*2 | +--------------------------+---------------------------+ | 2*1 | 2*2 | +--------------------------+---------------------------+ +.tr -- +.EE .RE -.ft -.hy -.fi . . .PP @@ -372,11 +392,13 @@ argument, see below). . . .PP -The contents of a table cell is arbitrary; for example, it can be another -table, without restriction to the nesting depth. +The contents of a table cell is arbitrary; +for example, +it can be another table, +without restriction to the nesting depth. . -A given table layout can be either constructed with suitably nested tables -or with proper arguments to +A given table layout can be either constructed with suitably nested +tables or with proper arguments to .CR .TD and .CR .TH\c @@ -384,49 +406,49 @@ and . Note, however, that this table . +. .PP .RS -.nf -.nh -.CR ".TBL" -.CR ". TR" -.CR ". TD" -.CR ". nop 1*1 1*2" -.CR ". TR" -.CR ". TD" -.CR ". TBL cols=2 border=" -.CR ". TR" -.CR ". TD" -.CR ". nop 2*1" -.CR ". TD" -.CR ". nop 2*2" -.CR ". ETB" -.CR ".ETB" -.fi -.hy +.EX +\&.TBL +\&.\& TR +\&.\& TD +\&.\& nop 1*1 1*2 +\&.\& TR +\&.\& TD +\&.\& TBL cols=2 border= +\&.\& TR +\&.\& TD +\&.\& nop 2*1 +\&.\& TD +\&.\& nop 2*2 +\&.\& ETB +\&.ETB +.EE .RE . +. .PP and this table . +. .PP .RS -.nf -.nh -.CR ".TBL cols=2" -.CR ". TR" -.CR ". TD colspan=2" -.CR ". nop 1*1 1*2" -.CR ". TR" -.CR ". TD" -.CR ". nop 2*1" -.CR ". TD" -.CR ". nop 2*2" -.CR ".ETB" -.fi -.hy +.EX +\&.TBL cols=2 +\&.\& TR +\&.\& TD colspan=2 +\&.\& nop 1*1 1*2 +\&.\& TR +\&.\& TD +\&.\& nop 2*1 +\&.\& TD +\&.\& nop 2*2 +\&.ETB +.EE .RE . +. .PP are similar but not identical (the use of .CR .nop @@ -437,10 +459,10 @@ is purely cosmetic to get proper indentation). The first table looks like . .PP -.nf -.nh -.ft CR +.if t .ne 7v .RS +.EX +.tr -\- +------------------------------------------------------+ | 1*1 1*2 | +------------------------------------------------------+ @@ -448,57 +470,58 @@ The first table looks like | 2*1 2*2 | | | +------------------------------------------------------+ +.tr -- +.EE .RE -.ft -.hy -.fi +. . .PP and the second one like . +. .PP -.nf -.nh -.ft CR +.if t .ne 5v .RS +.EX +.tr -\- +------------------------------------------------------+ | 1*1 1*2 | +---------------------------+--------------------------+ | 2*1 | 2*2 | +---------------------------+--------------------------+ +.tr -- +.EE .RE -.ft -.hy -.fi +. . .PP -Here the latter table in a more compact form. +Here is the latter table in a more compact form. . .PP .RS -.nf -.nh -.CR ".TBL cols=2 .TR \[dq].TD colspan=2\[dq] 1*1 1*2" -.CR ". TR .TD 2*1 .TD 2*2 .ETB" -.fi -.hy +.EX +\&.TBL cols=2 .TR \[dq].TD colspan=2\[dq] 1*1 1*2 +\&.\& TR .TD 2*1 .TD 2*2 .ETB +.EE .RE . . .PP -If a macro has one or more arguments (see below), and it is not starting a -line, everything belonging to this macro including the macro itself must be +If a macro has one or more arguments +(see below), +and it is not starting a line, +everything belonging to this macro including the macro itself must be enclosed in double quotes. . . .\" ==================================================================== -.SH MACROS AND ARGUMENTS +.SH "Macros and arguments" .\" ==================================================================== . The order of macro calls and other tokens follows the HTML model. . In the following list, valid predecessors and successors of all -.B hdtbl +.I hdtbl macros are given, together with the possible arguments. . .PP @@ -535,15 +558,16 @@ Another possible form is . . .PP -However, this is limited to the case where the macro is the first one in the -line and not already enclosed in double quotes. +However, +this is limited to the case where the macro is the first one in the line +and not already enclosed in double quotes. . . .PP Argument values specified below as\~\c .CI c are colors predefined by -.B groff +.I groff or colors defined by the user with the .CR .defcolor request. @@ -559,7 +583,7 @@ are natural numbers. Argument values\~\c .CI n are numerical values with the usual -.B groff +.I groff scaling indicators. . Some of the arguments are specific to one or two macros, but most of @@ -614,7 +638,8 @@ Border color. .XAA cols= m Number of table columns. . -This argument is necessary if more than one column is in the table and no +This argument is necessary if more than one column is in the table and +no .CR \[oq]width\[cq] arguments are present. . @@ -657,11 +682,12 @@ Widths of table cells. .CI n or natural numbers with the pseudo-scaling indicator .CR \[oq]%\[cq]\c -, with the meaning \[lq]percent of the actual line length (or column length -for inner tables, respectively)\[rq]. +, with the meaning \[lq]percent of the actual line length +(or column length for inner tables, +respectively)\[rq]. . -If there are less width values than table columns, the last width value is -used for the remaining cells. +If there are less width values than table columns, +the last width value is used for the remaining cells. . The argument . @@ -675,8 +701,8 @@ for example indicates that the first column is 1.5\~inches wide; the remaining columns take 1/10 of the column length each. . .XDEF -The table width equals the outer line length or column length; the columns -have equal widths. +The table width equals the outer line length or column length; +the columns have equal widths. . .XAA height= n Height of the table. @@ -789,49 +815,48 @@ cells left and right of this column. . .IP .B Remark: -Overlapping of column and row spanning, as in the following table fragment -(the overlapping happens in the second cell in the second row), is invalid -and causes incorrect results. +Overlapping of column and row spanning, +as in the following table fragment +(the overlapping happens in the second cell in the second row), +is invalid and causes incorrect results. +. . .RS .IP -.nh -.nf -.CR ".TR .TD 1*1 \[dq].TD 1*2 rowspan=2\[dq] .TD 1*3" -.CR ".TR \[dq].TD 2*1 colspan=2\[dq] .TD 2*3" -.fi -.hy +.EX +\&.TR .TD 1*1 \[dq].TD 1*2 rowspan=2\[dq] .TD 1*3 +\&.TR \[dq].TD 2*1 colspan=2\[dq] .TD 2*3 +.EE .RE . +. .PP A working example for headers and cells with .B colspan is . +. .PP .RS -.nf -.nh -.CR .TBL cols=3 -.CR ". TR" \[dq].TH colspan=2\[dq] header1+2 .TH header3 -.CR ". TR" .TD 1*1 .TD 1*2 .TD 1*3 -.CR ". TR" .TD 2*1 \[dq].TD colspan=2\[dq] 2*2+3 -.CR .ETB -.fi -.hy +.EX +\&.TBL cols=3 +\&.\& TR \[dq].TH colspan=2\[dq] header1+2 .TH header3 +\&.\& TR .TD 1*1 .TD 1*2 .TD 1*3 +\&.\& TR .TD 2*1 \[dq].TD colspan=2\[dq] 2*2+3 +\&.ETB +.EE .RE . +. .PP This looks like . +. .PP -.ft CR -.if t \{\ -. ne 7v -.\} +.if t .ne 7v .RS -.nf -.nh +.EX +.tr -\- +------------------------------+---------------+ | header1+2 | header3 | +--------------+---------------+---------------+ @@ -839,57 +864,57 @@ This looks like +--------------+---------------+---------------+ | 2*1 | 2*2+3 | +--------------+-------------------------------+ +.tr -- +.EE .RE -.ft -.hy -.fi +. . .PP A working example with .B rowspan is . +. .PP .RS -.nf -.nh -.CR .TBL cols=3 -.CR ". TR" -.CR ". TD" 1*1 -.CR ". TD" rowspan=2 1+2*2 -.CR ". TD" 1*3 -.CR . -.CR ". TR" -.CR ". TD" 2*1 -.CR ". TD" 2*3 -.CR .ETB -.fi -.hy +.EX +\&.TBL cols=3 +\&.\& TR +\&.\& TD 1*1 +\&.\& TD rowspan=2 1+2*2 +\&.\& TD 1*3 +\&.\& +\&.\& TR +\&.\& TD 2*1 +\&.\& TD 2*3 +\&.ETB +.EE .RE . +. .PP which looks like . +. .PP -.ft CR +.if t .ne 5v .RS -.nf -.nh +.EX +.tr -\- +--------------+---------------+---------------+ | 1*1 | 1+2*2 | 1*3 | +--------------+ +---------------+ | 2*1 | | 2*3 | +--------------+---------------+---------------+ -.hy -.fi +.tr -- +.EE .RE -.ft CR -. .RE .RE . .\"================================================================== . +. .TP .CB ".ETB \[lB]hold\[rB]" End of the table. @@ -905,9 +930,9 @@ If the argument .CR \[oq]hold\[cq] is given, the table is held until it is freed by calling the macro .CR .t*free\c -, which in turn prints the table immediately, either at the current position -or at the top of the next page if its height is larger than the remaining -space on the page. +, which in turn prints the table immediately, +either at the current position or at the top of the next page if its +height is larger than the remaining space on the page. . .IP \[bu] 3 Otherwise, if the table is higher than the remaining space on the page, @@ -952,7 +977,8 @@ macro. . . .\" ==================================================================== -.SS "Arguments common to \f[CB].TBL\f[], \f[CB].TR\f[], \f[CB].TD\f[], and \f[CB].TH\f[]" +.SS "Arguments common to \f[CB].TBL\f[], \f[CB].TR\f[], \f[CB].TD\f[], \ +and \f[CB].TH\f[]" .\" ==================================================================== . The arguments described in this section can be specified with the @@ -961,8 +987,11 @@ and .CR .TR macros, but they are eventually passed on to the table cells. . -If omitted, the defaults take place, which the user can change by setting -the corresponding default registers or strings, as documented below. +If omitted, +the defaults take place, +which the user can change by setting the corresponding default registers +or strings, +as documented below. . Setting an argument with the .CR .TBL @@ -1000,11 +1029,14 @@ The foreground color of the cell contents. The font family for the table. . .CI name -is one of the groff font families, for example +is a +.I groff +font family identifier, +such as .CR A -for the AvantGarde fonts or +for Avant Garde or .CR HN -for Helvetica-Narrow. +for Helvetica Narrow. . .XDEF The font family found before the table (string @@ -1025,15 +1057,17 @@ One of for roman, .BR bold , .IR italic , -or \f[BI]bold italic\f[], respectively. +or \f[BI]bold italic\f[], \" \f[BI] is not portable man(7) +respectively. . As with -.BR roff 's -.CR .ft -request the +.IR roff 's +.B .ft +request, +the .CR \[oq]fst\[cq] -argument can be used to specify the font family and font style together, for -example +argument can be used to specify the font family and font style together, +for example .CR \[oq]fst=HNBI\[cq] instead of .CR \[oq]ff=HN\[cq] @@ -1114,7 +1148,8 @@ this is a separator line to the cell below. : a double separator line. . .IP -The thickness of the separator lines is the half of the border thickness, +The thickness of the separator lines is the half of the border +thickness, but at least 0.1\~inches. . The distance between the double lines is equal to the line thickness. @@ -1125,8 +1160,8 @@ Together with .CR \[oq]border=0\[cq] for proper formatting the value of .CR \[oq]csp\[cq] -must be at least .05\~inches for single separator lines and .15\~inches for -double separator lines. +must be at least \&.05\~inches for single separator lines and +\&.15\~inches for double separator lines. . .XDEFS hl=s t*hl . @@ -1156,7 +1191,7 @@ argument above. . . .\" ==================================================================== -.SH HDTBL CUSTOMIZATION +.SH "\f[I]hdtbl\f[] customization" .\" ==================================================================== . .PP @@ -1164,20 +1199,22 @@ Before creating the first table, you should configure default values to minimize the markup needed in each table. . The following example sets up defaults suitable for typical papers: +. +. .PP .RS -.nf -.CR ".ds t*bgc white\e\[dq] background color -.CR ".ds t*fgc black\e\[dq] foreground color -.CR ".ds t*bc black\e\[dq] border color -.CR ".nr t*cpd 0.1n\e\[dq] cell padding -.fi +.EX +\&.ds t*bgc white\[rs]\[dq] background color +\&.ds t*fgc black\[rs]\[dq] foreground color +\&.ds t*bc black\[rs]\[dq] border color +\&.nr t*cpd 0.1n\[rs]\[dq] cell padding +.EE .RE . . .PP The file -.B examples/common.roff +.I @EXAMPLEDIR@/\:hdtbl/\:\%common\:.roff provides another example setup in the \[lq]minimal Page setup\[rq] section. . @@ -1191,19 +1228,20 @@ to the page header macro of your document's main macro package. . For example, say . +. .PP .RS -.nf -.CR ".am pg@top" -.CR ". t*hm" -.CR ".." -.fi +.EX +\&.am pg@top +\&.\& t*hm +\&.. +.EE .RE . . .PP if you use the -.B ms +.I ms macro package. . . @@ -1215,81 +1253,94 @@ and for missing .CR ETB macros (table not closed). . -You can append this macro -to the \[lq]end\[rq] macro of your document's main macro package. +You can call this macro by appending it the to end-of-input macro of +the main, +or \[lq]full-service\[rq], +macro package your document uses. +. +For example, +try . -For example: . -.PP .RS -.nf -.nh -.CR ".am pg@end-text" -.CR ". t*EM" -.CR ".." -.fi -.hy +.EX +\&.am pg@end\-text +\&.\& t*EM +\&.. +.EE .RE . -.PP -If you use the -.B ms -macro package. +if you use the +.I ms +package. . . .\" ==================================================================== -.SH BUGS AND SUGGESTIONS +.SH "Bugs and suggestions" .\" ==================================================================== . -Please send your commments to the -.MT groff@\:gnu.org -groff mailing list +Please send your comments to the +.MT groff@\:gnu\:.org +.I groff +mailing list .ME or directly to the author. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== +. The -.B hdtbl +.I hdtbl macro package was written by -.MT Joachim.Walsdorff@\:urz.uni\-heidelberg.de +.MT Joachim\:.Walsdorff@\:urz\:.uni\-heidelberg\:.de Joachim Walsdorff .ME . . . .\" ==================================================================== -.SH SEE ALSO +.SH "See also" .\" ==================================================================== +. .TP -.BR groff (1) +.MR groff @MAN1EXT@ provides an overview of GNU .I roff and details how to invoke .I groff at the command line. +. +. .TP -.BR groff (7) +.MR groff @MAN7EXT@ summarizes the .I roff language and GNU extensions to it. +. +. .TP -.BR tbl (1) +.MR @g@tbl @MAN1EXT@ describes the traditional .I roff preprocessor for tables. . . -.\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[groff_hdtbl_C] +.\" Unwind (some of) the stuff we've done. +.rchar \[lB] +.rchar \[rB] +.rchar \[or] +.rchar \[ell] +.rchar \[oq] +.rchar \[cq] . +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_groff_hdtbl_7_man_C] +.do rr *groff_groff_hdtbl_7_man_C . -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/hdtbl/hdmisc.tmac-u b/contrib/hdtbl/hdmisc.tmac similarity index 97% rename from contrib/hdtbl/hdmisc.tmac-u rename to contrib/hdtbl/hdmisc.tmac index 33111eb..9709bd8 100644 --- a/contrib/hdtbl/hdmisc.tmac-u +++ b/contrib/hdtbl/hdmisc.tmac @@ -4,7 +4,7 @@ hdmisc.tmac This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -23,8 +23,6 @@ along with this program. If not, see . .. . . -.\" %beginstrip% -. .if d t*getarg \ . nx . @@ -322,10 +320,6 @@ along with this program. If not, see . .. . . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/hdtbl/hdtbl.am b/contrib/hdtbl/hdtbl.am index 3537aa6..3dd60cf 100644 --- a/contrib/hdtbl/hdtbl.am +++ b/contrib/hdtbl/hdtbl.am @@ -1,17 +1,17 @@ -# Copyright (C) 2006-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg (wl@gnu.org) +# Copyright (C) 2006-2020 Free Software Foundation, Inc. +# Written by Werner Lemberg # Automake migration by Bertrand Garrigues -# +# # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -19,26 +19,22 @@ # along with this program. If not, see . hdtbl_srcdir = $(top_srcdir)/contrib/hdtbl -hdtbl_builddir = $(top_builddir)/contrib/hdtbl man7_MANS += contrib/hdtbl/groff_hdtbl.7 # Groff command used to generate .ps files -HDTBL_TFLAG = -M$(hdtbl_srcdir) -M$(hdtbl_builddir) -HDTBL_PFLAG=-t -p -e -U HDTBLGROFF = \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ - $(GROFFBIN) $(FFLAG) $(TFLAG) $(HDTBL_TFLAG) $(HDTBL_PFLAG) + $(GROFFBIN) $(FFLAG) $(MFLAG) -M$(hdtbl_srcdir) -t -p -e -U -# Files installed in $(tmacdir). -# These files are generated with 'strip.sed' from their unstripped source file -# equivalent (e.g. hdtbl.tmac is generated from hdtbl.tmac-u) -HDTBLSTRIPFILES = \ +HDTBLTMACFILES = \ contrib/hdtbl/hdtbl.tmac \ contrib/hdtbl/hdmisc.tmac hdtbltmacdir = $(tmacdir) -hdtbltmac_DATA = $(HDTBLSTRIPFILES) +dist_hdtbltmac_DATA = $(HDTBLTMACFILES) + +hdtbl_test_template = contrib/hdtbl/examples/test-hdtbl.sh.in # Files installed in $(exampledir)/hdtbl. HDTBLEXAMPLEFILES are # located in the source tree, while HDTBLPROCESSEDEXAMPLEFILES are @@ -51,7 +47,7 @@ HDTBLGENFILES = \ EXTRA_DIST += \ contrib/hdtbl/examples/fonts_n.in \ contrib/hdtbl/examples/fonts_x.in \ - contrib/hdtbl/examples/test-hdtbl.sh.in + $(hdtbl_test_template) HDTBLEXAMPLEFILES = \ contrib/hdtbl/examples/common.roff \ @@ -79,61 +75,52 @@ HDTBLPROCESSEDEXAMPLEFILES = \ contrib/hdtbl/examples/short_reference.ps hdtblexampledir = $(exampledir)/hdtbl - -if BUILD_EXAMPLES dist_hdtblexample_DATA = $(HDTBLEXAMPLEFILES) nodist_hdtblexample_DATA = \ $(HDTBLGENFILES) \ $(HDTBLPROCESSEDEXAMPLEFILES) \ - gnu.eps -else -EXTRA_DIST += $(HDTBLEXAMPLEFILES) -endif -$(hdtblexample_DATA): $(HDTBLSTRIPFILES) + $(DOC_GNU_EPS) + +$(hdtblexample_DATA): $(HDTBLTMACFILES) -MOSTLYCLEANFILES += $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES) \ - $(HDTBLSTRIPFILES) +MOSTLYCLEANFILES += $(HDTBLGENFILES) $(HDTBLPROCESSEDEXAMPLEFILES) EXTRA_DIST += \ contrib/hdtbl/ChangeLog \ contrib/hdtbl/TODO \ - contrib/hdtbl/groff_hdtbl.7.man \ - contrib/hdtbl/hdtbl.tmac-u \ - contrib/hdtbl/hdmisc.tmac-u + contrib/hdtbl/groff_hdtbl.7.man -if BUILD_EXAMPLES hdtbl_TESTS = contrib/hdtbl/examples/test-hdtbl.sh TESTS += $(hdtbl_TESTS) -contrib/hdtbl/examples/test-hdtbl.sh: $(top_builddir)/config.status \ - $(HDTBLPROCESSEDEXAMPLEFILES) $(top_srcdir)/contrib/hdtbl/examples/test-hdtbl.sh.in - sed -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ - -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \ - $(top_srcdir)/contrib/hdtbl/examples/test-hdtbl.sh.in > $@ - chmod +x $@ +contrib/hdtbl/examples/test-hdtbl.sh: \ + $(top_builddir)/config.status \ + $(HDTBLPROCESSEDEXAMPLEFILES) \ + $(top_srcdir)/$(hdtbl_test_template) + $(AM_V_GEN)sed \ + -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ + -e "s|[@]GHOSTSCRIPT[@]|$(GHOSTSCRIPT)|g" \ + $(top_srcdir)/$(hdtbl_test_template) > $@ \ + && chmod +x $@ MOSTLYCLEANFILES += $(hdtbl_TESTS) -endif # Rule to generate ps and roff files SUFFIXES += .roff .in .ps .roff.ps: $(GROFF_V)$(MKDIR_P) `dirname $@` \ - && $(HDTBLGROFF) -Tps \ + && $(HDTBLGROFF) -I $(doc_builddir) -I $(doc_srcdir) -Tps \ -dfontpath=$(top_srcdir)/font \ -dsopath=$(hdtbl_srcdir)/ \ -mhdtbl $< >$@ + .in.roff: $(AM_V_GEN)$(MKDIR_P) `dirname $@` \ && sed -e "s|[@]fontdir[@]|$(fontdir)|" \ -e "s|[@]EGREP[@]|$(EGREP)|" $< >$@ -$(HDTBLPROCESSEDEXAMPLEFILES): gnu.eps groff troff pic tbl \ - contrib/hdtbl/examples/common.roff - -$(HDTBLSTRIPFILES): $(top_srcdir)/tmac/strip.sed - @$(MKDIR_P) `dirname $@` - sed -f $(top_srcdir)/tmac/strip.sed $(hdtbl_srcdir)/`basename $@`-u > $@; +$(HDTBLPROCESSEDEXAMPLEFILES): $(DOC_GNU_EPS) groff troff eqn pic tbl \ + grops font/devps/stamp contrib/hdtbl/examples/common.roff uninstall_groffdirs: uninstall-hdtbl-hook uninstall-hdtbl-hook: @@ -142,12 +129,8 @@ uninstall-hdtbl-hook: fi -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile-automake # fill-column: 72 # End: -# vim: set filetype=automake textwidth=72: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/hdtbl/hdtbl.tmac-u b/contrib/hdtbl/hdtbl.tmac similarity index 99% rename from contrib/hdtbl/hdtbl.tmac-u rename to contrib/hdtbl/hdtbl.tmac index c39f52a..422ede7 100644 --- a/contrib/hdtbl/hdtbl.tmac-u +++ b/contrib/hdtbl/hdtbl.tmac @@ -4,7 +4,7 @@ hdtbl.tmac This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2005-2018 Free Software Foundation, Inc. +Copyright (C) 2005-2020 Free Software Foundation, Inc. written by Joachim Walsdorff . groff is free software; you can redistribute it and/or modify it under @@ -68,8 +68,6 @@ along with this program. If not, see . "\m[\\*[t*fgc]]Table \\n+[t*cptn]:\0\k*\c"\" . . -.\" %beginstrip% -. .\" for better error messages .ds nth-1 st\" .ds nth-2 nd\" diff --git a/contrib/mm/ChangeLog b/contrib/mm/ChangeLog index 6b0f41f..6c17811 100644 --- a/contrib/mm/ChangeLog +++ b/contrib/mm/ChangeLog @@ -1,3 +1,664 @@ +2023-05-25 G. Branden Robinson + + * groff_mm.7.man (Macros) : Clarify operation. + + Fixes . + +2023-02-17 G. Branden Robinson + + [mm]: Add `--help` option support to mmroff. + + * mmroff.pl: Recognize `--help` option. + * mmroff.1.man (Synopsis, Options): Document. + +2023-02-01 G. Branden Robinson + + * m.tmac (H, SETR): Trivially refactor. Rename register to + conform to convention: `hd-mark-trimmed` -> `hd@mark-trimmed`. + This register is used outside of its "module", "hd". + +2023-02-01 G. Branden Robinson + + * m.tmac (H, LI): Trivially refactor. Annotate and test + threshold registers consistently. + +2023-02-01 G. Branden Robinson + + * m.tmac: Fix code style nit. Except for initial register + tests for GNU troff formatter and compatibility mode, migrate + special character, register, and string interpolation escape + sequences from `(xx` form to `[xx]`. Also rewrite an instance + of `\nP` to `\n[P]`. + +2023-01-24 G. Branden Robinson + + When register `Pt` was 2, paragraphs immediately following + displays and lists were being indented, contrary to DWB mm + behavior. + + * m.tmac: Replace `par@ind-flag` register with two separate + state bits, `par*indentation-eligible` and + `par@suppress-indentation`. + (P, nP): Remove complex test for deciding whether the current + paragraph is being set immediately after a heading. + (P): Set `par*indentation-eligible` to the logical complement of + `par@suppress-indentation`. Call `par@doit` (which underlies + both `P` and `nP`) unconditionally. + (nP): Force `par*indentation-eligible` off, since numbered + paragraphs are not influenced by a `Pt` value of "2" in DWB mm. + {The paragraph number occupies the indentation space.} + (par@doit): Introduce local register `par*do-indent`, + manipulate it, and use it to control `ti` request instead of + scattering the request across multiple locations. Remove this + register when done. Clear `par@suppress-indentation` at end, + since after indentation is suppressed once, it should not happen + again until a special circumstance (the setting of a heading, + display, or list) arises. + (H): Convert test of `hd*htype` register, which tells us if + we're setting a run-in heading or not, from `if` to `ie`. (The + first paragraphing macro call after a run-in heading should + _not_ have its indentation suppressed, because the material + after the heading title constitutes a first pagraph.) In the + true arm, set `par@suppress-indentation`; in the new else arm, + clear it. This replaces the "complex test" above, and seems + much more straightforward and reliable. Stop manipulating + `par@ind-flag`. + (df@end, ds@end, LC): Set `par@suppress-indentation` instead of + clearing `par@ind-flag`. + (LE): Set `par@suppress-indentation`. + + Fixes . Thanks to Jeff + Conrad for the report. + +2023-01-24 G. Branden Robinson + + Regression-test Savannah #54909. + + * tests/P-indentation-works.sh: Do it. + * mm.am (mm_TESTS): Run test. + +2023-01-24 G. Branden Robinson + + * m.tmac (df@print-float): Eliminate spew at high debug levels. + This macro gets called even when there aren't any floating + displays pending, so we cannot assume that related registers are + defined. + +2023-01-24 G. Branden Robinson + + * m.tmac (P): Fix missing backslash after brace escape sequence. + Problem introduced by me in 3b1afbdb8e, 6 January. + +2023-01-22 G. Branden Robinson + + * m.tmac: Help user navigate the document type macros. Stop + setting up the formatter to throw "unrecognized macro" + diagnostics for macros that are plainly documented in + groff_mm(7). + (@disable): New macro takes a list of macros whose definitions + are replaced with a warning diagnostic about how they're no + longer unavailable due to use of another document type macro + already called, identified by new string `@cover`. + (TL, MT, COVER, LT, LO): Define `@cover` and call `@disable`. + Drop existing diagnostics that did a similar thing as above, + more verbosely. + +2023-01-17 G. Branden Robinson + + * m.tmac: Revise diagnostic messages. Use a consistent message + format, including a space after a colon and the name of the + complaining macro. + (pg@header): Drop unnecessary empty comment at end of macro + call. Macro call syntax differs from `ds` request syntax. + (2C, MC, FD, FS, FE, DF, LB, LI, LE, LC, AL, ML, VL, BL, DL, RL) + (BVL, TH, TE, PS, B1, B2, APPSK, AS, SETR, GETST, GETHN, GETPN) + (INITI, IND, LT, LO): Refer to self with `\$0` escape sequence + instead of a literal. + (2C, MC, PS): Throw fatal error immediately instead of doing + other processing first. + (2C, MC, FD, FS, FE, DF, ds@set-format, ds@end, LB, LI, LE, LC) + (AL, ML, VL, BL, DL, RL, BVL, TH, TE, B1, B2, APPSK, AS, SETR) + (GETST, GETHN, GETPN, INITI, IND, let*lt-sign, LT, LO): Stop + unnecessarily quoting arguments to @error macro. + (FD, LB, VL, BVL, APPSK, SETR, GETST, GETHN, GETPN, INITI): + State quantities of expected and actual arguments. + (FS, FE, LC, B1, INITI): Clarify message. + (DF, DS): Store macro name in `ds@macro` for use in later + diagnostics thrown by internal macros. + (DS): Drop dead store to register `XXX`; debugging detritus? + (ds@set-format): Use `ds@macro`. + (ds@set-format, let*lt-sign, LT, LO): Bracket unrecognized + argument in single quotes. + (ds@set-format): Characterize argument as "unrecognized", not + "wrong". Similarly with the fill style. + (LI, LE, IND): Offer advice. + (LE): Describe problem in same terms as `LI` ("no list active"). + (LC): Validate argument as numeric expression and die with + diagnostic if it isn't one. + (AL, ML, VL, BL, DL, RL, BVL): Weaken fatal diagnostic to + warning; excess arguments are not a serious problem. + (PS): Simplify control flow; since @error does not return, + convert `ie` request to `if` and make `el` branch unconditional. + (RP): Weaken fatal diagnostic to warning and return early; + calling this macro without any references defined does no + structural damage to a document. + (INITI): Remove redundant conditional. + +2023-01-16 G. Branden Robinson + + * m.tmac (IX): Delete. + +2023-01-16 G. Branden Robinson + + * m.tmac (MC): Throw internal error if we don't leave + `pg*cols-per-page` in a valid state after invalidating it to + count columns. Also simplify expression. + +2023-01-16 G. Branden Robinson + + * m.tmac (1C): Warn and return early instead of bombing out if + called when multiple columnation is inactive. A no-op should + not be a fatal error. + +2023-01-16 G. Branden Robinson + + * m.tmac (@abort): Introduce macro for internal errors, + unconditionally reporting a backtrace... + (misc@pop-set, hd@split, MULN, df@print-float, IND): ..and use + it instead of `@error` for problems with internal state. + (IND): Also fix botch in reported error. + +2023-01-16 G. Branden Robinson + + * m.tmac (SA): Reject an argument value > 1 as invalid. + +2023-01-16 G. Branden Robinson + + * m.tmac (P): Quote unrecognized argument in warning diagnostic. + (OK, PM): Refactor to use `\$0`. + (1C): Clarify that formatting can go wrong if you suppress a + page break when returning from multi- to single-column mode with + a footnote pending. + +2023-01-16 G. Branden Robinson + + * m.tmac (Tm): Align with definition of `Sm`, with analogous + fallback definitions. + +2023-01-16 G. Branden Robinson + + * m.tmac (Sm): Implement string for service mark, for DWB mm + compatibility. + * groff_mm.7.man: Document it. + +2023-01-16 G. Branden Robinson + + * m.tmac (CS): Define to throw diagnostic when used without ".MT + 4". (Later, if the "4.MT" file is sourced, this definition is + replaced.) + * groff_mm.7.man (Description): Clarify `CS` support status. + +2023-01-16 G. Branden Robinson + + * m.tmac (MOVE, SM, AT, LO): Weaken diagnostics when given no + arguments from (fatal) errors to warnings, then return. + +2023-01-16 G. Branden Robinson + + * m.tmac (PIC): Bomb out (with diagnostic) if either of the + width or height arguments are not numeric expressions. + +2023-01-16 G. Branden Robinson + + * m.tmac (EPIC): Handle and shift off a leading "-L" argument + before checking argument count. Then, if fewer than two + arguments remain, throw warning diagnostic and return early + instead of bombing out. Do bomb out (with diagnostic) if either + of the width or height arguments are not numeric expressions. + Fix bug which prevented third argument from being interpreted. + Annotate potential future development. + +2023-01-16 G. Branden Robinson + + * m.tmac (AU): Partially revert commit 4fd984adc9, 2021-07-17. + `AU` can be called for the sole purpose of "closing" a document + title "opened" with `TL`. + * groff_mm.7.man (Macros) : Update description. + +2023-01-16 G. Branden Robinson + + * m.tmac (TM): Warn if called without arguments. + +2023-01-16 G. Branden Robinson + + * m.tmac (AST): Preserve any user-specified leading spaces in + argument. + +2023-01-06 G. Branden Robinson + + * m.tmac (P): Warn if argument is non-numeric, and discard it. + Also warn if argument is out of range; people accustomed to + setting the `Pt` register to 2 might mistakenly believe it to be + meaningful here. + +2023-01-03 G. Branden Robinson + + * mm/0.MT: + * mm/5.MT: Drop never-read register `cov*mt0-ind`. + +2023-01-03 G. Branden Robinson + + Improve cover sheet diagnostics. + + * m.tmac (MT): Warn and ignore if `COVER` or self already + called. + (COVER): Warn and ignore if `MT` already called. + * mm/0.MT (cov@print-title): Abort if title not defined; tell + user how to use the macros. + (cov@print-authors): Add similar paranoid diagnostic that I + don't think is reachable (since you _have_ to call `AU` to + "close" `TL`). + * mm/4.MT (cov@print-title, cov@print-authors): + * mm/5.MT (cov@print-title): As "0.MT". + + * mm/4.MT: Get rid of spurious blank line in file. + +2023-01-03 G. Branden Robinson + + Fix Savannah #63613. + + * mm/0.MT (cov*print-authors): Iterate through _all_ technical + memorandum numbers instead of stopping one shy of the last. + Problem appears to date back to introduction of TM support for + memorandum type 1 in commit a48ab7b6d (groff 1.05, 1992-03-18). + + Fixes . + +2023-01-03 G. Branden Robinson + + Regression-test Savannah #63613. + + * tests/MT-1-reports-all-TM-numbers.sh: Do it. + * mm.am (mm_TESTS): Run test. + +2022-12-17 G. Branden Robinson + + * m.tmac (let*mt-sign): Check strings populated by optional + arguments to `AU` macro for existence before interpolating them. + + Fixes . Thanks to Werner + Lemberg for the report. + +2022-11-22 G. Branden Robinson + + * mse.tmac: Set `pg*footer-size` to four vees, not four basic + units; the latter is too small by orders of magnitude on + typesetting output devices. + + Fixes . Thanks to Hans + Bezemer for the report. + +2022-11-21 G. Branden Robinson + + Regression-test Savannah #63398. + + * tests/mse_has-sufficient-footnote-space.sh: Do it. + * mm.am (mm_TESTS): Run test. + +2022-10-09 G. Branden Robinson + + [mm]: Add `--version` option support to mmroff. + + * mm.am (mmroff): Replace `@VERSION@` token in script. + * mmroff.pl: Recognize `--version` option. + * mmroff.1.man (Synopsis, Options): Document. + +2022-10-09 G. Branden Robinson + + * mmroff.pl: Add proper diagnostic subroutine. Add "progname" + scalar to store the name of the program. + (Die): New subroutine. + (print_index, top level): Call Die() when encountering + prohibitive problems instead of flinging a string into a void + context. + +2022-10-09 G. Branden Robinson + + * mmroff.pl: Enable Perl warnings. + +2022-10-09 G. Branden Robinson + + [mm]: Refactor generation of "mmroff" script. + + * mmroff.pl: Replace absolute filespec with `@PERL@` replacement + token. This is documentary; the filespec was getting replaced + anyway. + * mm.am (mmroff): Use more idiomatic token replacement strategy. + Also create target as a .tmp-suffixed file at first since it is + not initially executable, so that we don't race against anything + needing to run it in a parallelized build. (This is a + hypothetical concern; at present, nothing runs mmroff during the + build.) + +2022-10-02 G. Branden Robinson + + * m.tmac (pg@header): Add page length sufficiency check. + + Fixes . Thanks to Werner + Lemberg for the report. + +2022-10-02 G. Branden Robinson + + Regression-test Savannah #24048. + + * tests/short-pages-do-not-overflow-stack.sh: Test it. + * mm.am (mm_TESTS): Run test. + +2022-09-17 Nikita Ivanov + + * mm/ms.cov (cov@print-title, cov@print-authors): Escape + newlines when beginning conditional blocks. + + Fixes . [Problems + introduced by me in commits 59d1fd7a5e and 4fd984adc9, both + 2021-07-17. --GBR] + +2022-09-16 Nikita Ivanov + + * m.tmac (misc@ev-keep): Select configured default font family, + as with `.fam H` at the top of the document, for example, when + switching to new environment. + + Fixes . + +2022-08-14 G. Branden Robinson + + * m.tmac (PY): Add new macro. + (PE): Replace `init@reset` call with `PY` (and then space by + half a vee as before). + + * groff_mm.7.man (PY): Document it. + + Fixes . + +2022-08-14 G. Branden Robinson + + * m.tmac (@warning, @error): Stop pointlessly using no-break + control character when invoking the `tm` request, which never + causes a break in formatted output. (Management of the standard + output and standard error streams is the user's responsibility.) + (@error): Drop old-fashioned asterisk banners around error + diagnostics. Stop invoking `ab` with redundant and sometimes + misleading arguments. In groff 1.23, `ab` exits silently if + given none. We've already issued a diagnostic and moreover not + all problems are with "syntax"; some are semantic. + +2022-08-14 G. Branden Robinson + + * m.tmac (PS): Validate better; check for 2 arguments exactly. + +2022-08-14 G. Branden Robinson + + * m.tmac (PS): Refactor; drop dead code. The `pic*in` register + was used only for dead stores; it was never read or tested. + +2022-08-04 G. Branden Robinson + + * m.tmac (initialization): In nroff mode, surround automatically + numbered footnote markers in body text with square brackets, as + groff me(7) and ms(7) do. + +2022-08-04 G. Branden Robinson + + * m.tmac (initialization): Recognize new register `V` for + setting the vertical spacing from the command line, instead of + blindly setting the vertical spacing two points larger than the + type size. Handle setting of `V` and type size `S` in case they + are given with an appended scaling unit, using the same + technique as groff ms(7)--if the values are over 1,000, assume + that conversion to basic units by the formatter has already + taken place. + * groff_mm.7.man (Registers) : Document it. + +2022-08-03 G. Branden Robinson + + * m.tmac (:p): Define register as an alias of `ft*nr`; the + former name is a documented DWB mm feature. + +2022-08-01 G. Branden Robinson + + * groff_mm.7.man: Document more features. + (Macros) <)E, VM>: Document these DWB mm internals as exposed by + groff mm. + (Macros) : Document as GNU extensions. + (Strings) : Document. + (Registers) <:R, Au, Ex, Fg, H8...H14, Oc, S>: Document. + +2022-07-29 G. Branden Robinson + + * groff_mm.7.man: Document further differences between DWB mm + and groff mm, including several unimplemented features. + +2022-07-29 G. Branden Robinson + + * m.tmac: Remove pointless conditionals in initialization. + Simplify if-else request pairs that did the same thing in both + branches. + +2022-07-28 G. Branden Robinson + + * groff_mm.7.man: Document `NE` macro. + +2022-03-15 Damian McGuckin + + * m.tmac (eq@check): Compensate for display indentation when + setting equation label. + + Fixes . + +2022-04-27 G. Branden Robinson + + Regression-test Savannah #62190. + + * tests/place-equation-labels-correctly-in-displays.sh: Test it. + * mm.am (mm_TESTS): Run test. + +2021-08-12 G. Branden Robinson + + * m.tmac (R): Alter to work analogously to `B` and `I` macros; + accept multiple arguments if given, and alternate roman with + previous font. Stop explicitly turning off underlining. + +2021-07-17 G. Branden Robinson + + Refactor author title handling. + + * m.tmac (AU): Initialize `cov*at!` array element to zero for + current author number (`AT` already updates it). + + * mm/ms.cov (cov@print-authors): Enforce requirement documented + in groff_mm(7) that .AU is mandatory if .COVER is used. Emit + diagnostic if `cov*au` is not defined, and skip remainder of + macro definition. Test for existence of authors' titles + differently; now that `cov*at!` (a count of titles for the + current author) is guaranteed to be initialized, we can use it + as part of a while loop condition, instead of the hard-coded "9" + as an arbitrary limit on the allowed quantity of author titles + {though surely even that is obnoxiously high in practice}, and + more importantly avoid using a \w escape to measure the width of + the interpolation of a potentially undefined string. Use `nop` + to indent text output. Delete apparent typo causing `mac` + warning with respect to undefined `.` macro. Introduce + temporary strings for the author and author title "loop indices" + to shorten and clarify logic. Remove them when done. + + Fixes . + +2021-07-17 G. Branden Robinson + + * mm/ms.cov (cov@print-title): Enforce requirement documented in + groff_mm(7) that .TL is mandatory if .COVER is used. Emit + diagnostic if `cov*title` is not defined, and skip remainder of + macro definition. + +2021-07-17 G. Branden Robinson + + * mm/ms.cov (COVEND): Fix thinko; test for existence of + `cov*abs-arg` register with `r` conditional operator, not `d`. + +2021-07-17 G. Branden Robinson + + * m.tmac: Stop emitting debugging diagnostic using undefined + string. Problem exposed by commit + d6d98d2b3e0ad070037073bb288bbaee3fc04cf0, 8 December 2013. + + Fixes . + +2021-07-17 G. Branden Robinson + + Stop installing empty macro files. + + * mm.am: Delete variable `MMLOCALE`. + (install_mm): Delete `for` loop that touches the files. + (uninstall_mm): Delete `for` loop that deletes the files. + * m.tmac: Update initializtion. + - Load the `\*[@country]_locale` file with `msoquiet` instead + of `mso`. + - Add version check to require groff 1.23 or later, since + the `msoquiet` request is now being used. + - Move "include guard" to follow the compatibility mode and + groff version checks. Remove its `do` prefix. + * groff_mm.7.man (Localization): Migrate topic into its own + subsection and update discussion. + + Fixes . + +2021-07-17 G. Branden Robinson + + * mm/ms.cov (cov@print-firm): Do nothing if the `cov*firm` + string is not defined. Silences a `mac` warning and prevents + the document date from being incorrectly aligned. + + * tests/ms_cover_sheet_robust_to_missing_AF.sh: Test it. + * mm.am (mm_TESTS): Run test. + + Fixes . + +2021-07-14 G. Branden Robinson + + * m.tmac: Rename `cov*mt-addresse` to `cov*mt-addressee`. + * NOTES: Update the only place the foregoing is documented. + +2021-05-31 G. Branden Robinson + + * groff_mm.7.man (Description/Macros) : Document the "SP" + {simplified} letter style more completely. Salutations and + formal closings are omitted. + + Solves the remaining part of bug #60373, "the formal closing is + omitted completely". And, regarding the salutation, #60390. + + Fixes and + . + +2021-05-30 Bjarni Ingi Gislason + + * m.tmac (let@sg_SP): Stop placing a comma after the first + argument (an author name set by AU) if the second argument is + empty (an author title set by AT). + + Solves another part of bug #60373, "the writer's name at the + bottom is followed by a trailing comma". + + Fixes . + +2021-05-30 Bjarni Ingi Gislason + + * m.tmac (let@print-head): Quote the interpolation of the string + `let*lo-SJ`. + + Solves part of bug #60373, "[t]he subject line shows only the + first word". + + Fixes . + +2021-05-30 G. Branden Robinson + + Add regression tests for Savannah #60373. + + * tests/LT_SP_AU_without_AT_works.sh: + * tests/LT_SP_multi-word_LO_SJ_works.sh: Add tests. + * mm.am (mm_TESTS): Run tests. + +2021-05-30 Tadziu Hoffman + + Fix Savannah #57034. + + * m.tmac (AT): Count author title declarations. + (let*mt-sign): Use correct index when iterating author names. + Prevent page break between author names and titles. Iterate + author titles and write them. + + Fixes . + +2021-05-30 G. Branden Robinson + + Add regression test for Savannah #57034. + + * tests/MT_5_includes_AT_in_SG.sh: Test it. Thanks to Ken + Mandelberg for the reproducer. + * mm.am (mm_TESTS): Add variable storing script name. + (TESTS): Append `mm_TESTS` to run it. + (EXTRA_DIST): Append `mm_TESTS` to ship it. + +2021-05-30 Bjarni Ingi Gislason + + * mm/5.MT (cov@print-title): Fix missing diagnostic. Memorandum + type 5 now requires a title to be declared with .TL. + + Fixes . + +2021-05-30 G. Branden Robinson + + [mm]: Cease warning level manipulation. + + Stop mm macro package from manipulating warnings. + + * m.tmac: Remove code that attempted to enable all warnings if + none were given on the command line. It did this by simply + comparing the value of the warning register (\n[.warn]) against + the default value; but of course, a user could specify -w + options that exactly matched the default and the test would not + be able to tell, causing puzzling and undesired behavior. + Furthermore, the hard-coded default was out of date and did not + correspond to recent releases of groff. If you want all + warnings on, use the ".warn" request with no arguments in your + mm document or pass "-w w" to groff (see troff(1) or the Texinfo + manual for more on warnings). + + See commit 5aa934e7, 20 February 2020. + +2021-05-30 G. Branden Robinson + + * examples/letter.mm: Revise to be a better example: use macro + package more effectively, follow *roff input conventions more + carefully, and incorporate more accurate comments. + +2021-05-30 G. Branden Robinson + + * m.tmac: Update diagnostics. When aborting, explicitly tell + the user we are doing so (see + a334cc97abbdfb9c41e28fcd7c187b81a0a3ceac, 25 September 2020). + (@mm): Define new string to hold prefix for diagnostic messages. + (@warning, @error): Use @mm. Reorder diagnostic messages to + conform with GNU Coding Standards. + (OK, PM): Use @warning instead of `tm` request directly. + +2019-09-10 G. Branden Robinson + + * Makefile.sim: Delete sed transformation of @G@. It is no + longer needed. + 2018-03-01 Werner LEMBERG * m.tmac: Fix `.hy' value. @@ -10,8 +671,8 @@ 2017-11-02 G. Branden Robinson - examples/letter.mm: New; simple example of mm usage. - mm.am: Ship the file. + * examples/letter.mm: New; simple example of mm usage. + * mm.am: Ship the file. 2015-08-22 Bernd Warken @@ -522,7 +1183,7 @@ Fri Sep 3 07:33:14 1999 J It didn't setup the @pl, @ll and @po as it should, now it does. * mgm_ref/mgm_roff renamed to mmroff [-x] * fixed y2k-bug in \*[DT] - * \n[cov*year] removed, hope noone used that. + * \n[cov*year] removed, hope no one used that. * ISODATE added with Iso as command line flag (iso-date suggested by Paul Eggert) * Added ISODATE to tmac.mse and removed local settings @@ -588,7 +1249,7 @@ Fri Sep 6 07:13:07 1996 J * .S D should set the point size to \nS, not 10. * .S was setting the vertical spacing based on the old point size instead of the new point size. - * Got rid of a spurrious .br that prevented run-in headings from + * Got rid of a spurious .br that prevented run-in headings from working. * Reset the .SP counters in pg@header so that spacing on one page won't affect spacing on subsequent pages. @@ -613,7 +1274,7 @@ Fri Sep 6 07:13:07 1996 J Wed May 15 07:39:32 1996 Jörgen Hägg (jh at axis.se) * version 1.29 - * Syntax and scaling errror fixed, (thanks to Frazer Williams) + * Syntax and scaling error fixed, (thanks to Frazer Williams) * DF/DE will now do a line-break before printing the display. * Updated the manual for TB,FG,EX and EC. * Added support for the ms- (and mgs-)macro .IX @@ -738,7 +1399,7 @@ Mon Apr 5 09:36:01 1993 Joergen Haegg (jh at efd.lth.se) * bug in VERBON fixed, causing strange errors. * section-page footer fixed. * added support for numberregister S - * fixed bug with floating displays wich made floats to + * fixed bug with floating displays which made floats to generate space on a page, but broke page anyway. * end-of-page trap reinstalled. @@ -775,7 +1436,7 @@ Wed Mar 3 09:21:20 1993 Joergen Haegg (jh at efd.lth.se) normal text, but it will still set .vs. * SK was broken, will now produce the requested number of empty pages. - * dotted lines added to LIST OF FIGURES adn friends. + * dotted lines added to LIST OF FIGURES and friends. Also better linespacing. Mon Feb 22 12:41:06 1993 Joergen Haegg (jh at efd.lth.se) @@ -843,7 +1504,7 @@ Thu Aug 20 13:56:31 1992 Joergen Haegg (jh at efd.lth.se) * page-break in .EQ moved. * changed unit for footer-size and header-size from units to lines. Fixes problems with .S and page-breaks. - * \n[%] is now treated as a string, wich makes it possible + * \n[%] is now treated as a string, which makes it possible to assign new formats to it. Unfortunately, it was necessary to change the page-number-variable in GETPN to a string. * Makefile.sub included. (Thank you, James) @@ -997,13 +1658,15 @@ Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) ________________________________________________________________________ -Copyright 1991-2018 Free Software Foundation, Inc. +Copyright 1991-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Local Variables: -version-control: never +fill-column: 72 mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/mm/Makefile.sim b/contrib/mm/Makefile.sim index 518401c..2d2d6b6 100644 --- a/contrib/mm/Makefile.sim +++ b/contrib/mm/Makefile.sim @@ -1,6 +1,4 @@ -# Copyright 1991-2018 Free Software Foundation, Inc. -# -# Last update: 5 Aug 2015 +# Copyright 1991-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -19,7 +17,7 @@ # # Makefile.sim # -# To install mgm separately as gm.tmac: +# To install mm separately as gm.tmac: # make -f Makefile.sub tmacdir=/usr/local/lib/groff/tmac srcdir=. \ # INSTALL_DATA='install -m 644' tmac_m=gm install # @@ -77,13 +75,8 @@ uninstall: groff_mm.n groff_mmse.n -e "s|@VERSION@|$(version)|g" \ -e "s|@MDATE@|$(mdate)|g" \ -e "s|@g@|$(g)|g" \ - -e "s!@G@;`echo $(g) | tr [a-z] [A-Z]`!g" \ $< >$@ -######################################################################## -# Editor settings -######################################################################## -# # Local Variables: # mode: makefile # fill-column: 72 diff --git a/contrib/mm/NOTES b/contrib/mm/NOTES index c3cb3d1..1c35133 100644 --- a/contrib/mm/NOTES +++ b/contrib/mm/NOTES @@ -1,4 +1,4 @@ - Copyright (C) 1989-2018 Free Software Foundation, Inc. + Copyright (C) 1989-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -76,10 +76,10 @@ cov*abs-name S The string 'ABSTRACT', changed with .AST cov*abstract M The abstract. -cov*new-date S The date (todays date if ND is not used) +cov*new-date S date (today if .ND not used) -cov*mt-type S MT type -cov*mt-addresse S MT addressee +cov*mt-type S memorandum type set by .MT +cov*mt-addressee S memorandum addressee set by .MT ########################## @@ -110,7 +110,7 @@ Index Desc. 9 title 9 -### Emacs settings +##### Editor settings Local Variables: mode: text End: diff --git a/contrib/mm/README b/contrib/mm/README index bd79b18..6c6ca5b 100644 --- a/contrib/mm/README +++ b/contrib/mm/README @@ -1,39 +1,27 @@ - Copyright (C) 1989-2018 Free Software Foundation, Inc. + Copyright (C) 1989-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -This is mgm, a macro package for groff. +This is mm, a macro package for groff. -It is supposed to be compatible with the DWB mm macros, -and has several extensions. +It is supposed to be compatible with the Documenter's Workbench (DWB) mm +macros, and has several extensions. -Submit bug reports at http://savannah.gnu.org/bugs/?group=groff with a -description of the problem and a sample of text which reproduces the -error. - -Don't forget to mention the version of mgm (look in the beginning -of m.tmac) and the version of groff. +Please submit bug reports using groff's 'BUG-REPORT' file to +http://savannah.gnu.org/bugs/?group=groff. Any new ideas or improvements are welcome. -Newest version is available here or at the groff repository. -ftp://ftp.axis.se/pub/groff/mm.gz - -You can install mgm as a separate package without the configure in groff -with the following command: - -make -f Makefile.sim install - This README should be bigger :-) /Jörgen Hägg -Thanks to everyone who have sent me bug-reports and fixes. +Thanks to everyone who have sent me bug reports and fixes. -### Emacs settings +##### Editor settings Local Variables: mode: text End: diff --git a/contrib/mm/examples/README b/contrib/mm/examples/README index 7c496b5..cb0956a 100644 --- a/contrib/mm/examples/README +++ b/contrib/mm/examples/README @@ -1,5 +1,5 @@ -*- text -*- - Copyright (C) 1989-2018 Free Software Foundation, Inc. + Copyright (C) 1989-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -14,9 +14,9 @@ COVER My general cover macro, this example is using ms.cov. IND A general indexing method, see manual for INITI. LT The letter macro. -LT.se A Swedish example with the extra - Swedish macros for getting a letter conforming - to Swedish standard letter, both left and right adjusted. +LT.se A Swedish example with extra Swedish macros for + composing a letter conforming to Swedish standard style, + adjusted to left and right margins. ML Marked list, an extended list type. MOVE The MOVE macro, how to begin to print on an exact position. MUL Enhanced multicolumn mode. @@ -33,7 +33,7 @@ VERBON Begin verbatim output. And remember, check the manual for all string and number registers, -I've made sure that mgm is useful in several languages; +I've made sure that mm is useful in several languages; all English output can be redefined. For Swedish localization, check the manual for groff_mse and the diff --git a/contrib/mm/examples/letter.mm b/contrib/mm/examples/letter.mm index 078546d..3683849 100644 --- a/contrib/mm/examples/letter.mm +++ b/contrib/mm/examples/letter.mm @@ -1,11 +1,15 @@ +.\" Set a blank page header; our letter is a single page and does not +.\" require the default numbering. +.PH ''' .\" Set point size to 14. .S 14 .\" Set paragraph type to "indented". .nr Pt 1 - 1 November 2017 -.\" Set line spacing to double-spaced. -.SP 2 -.\" Start display. +.\" Put the date in a right-aligned display. +.DS R +30 May 2021 +.DE +.\" Start display (left-aligned). .DS Mr. Ty Coon President of Vice, Intellectual Property and Licensing @@ -14,20 +18,34 @@ Silly Valley, CA 94043 .\" End display. .DE Dear Mr. Coon, +. +. .\" Start new paragraph. .P -I would like to request that your wholly-owned subsidiary, Yoyodyne, Inc., -disclaim all copyright interest in the program `Gnomovision' (which makes passes -at compilers) written by Juliet Hacker prior to her employment with Yoyodyne. +I would like to request that your wholly-owned subsidiary, +Yoyodyne, Inc., +disclaim all copyright interest in the program `Gnomovision' +(which makes passes at compilers) +written by Juliet Hacker prior to her employment with Yoyodyne. +. +. .P -Our colleagues at the Software Freedom Conservancy have determined and informed -us that Ms. Hacker's employment agreement is a contract of adhesion. +Our colleagues at the Software Freedom Conservancy have determined and +informed us that Ms.\& Hacker's employment agreement is a contract of +adhesion. +. +. .P Thank you for your prompt attention to this matter. -.\" Set line spacing to single-spaced. -.SP - Sincerely yours, -.\" Leave room for signature. -.SP 2 - Tracy T. Jordan -.\" vim: set noexpandtab textwidth=80: +. +. +.\" Put the closing and signature in a right-aligned display as well. +.DS R +Sincerely yours, +.\" Leave three "vees" (3 text line heights) of room for signature. +.SP 3v +. +. +Tracy T.\& Jordan +.DE +.\" vim: set noexpandtab textwidth=72: diff --git a/contrib/mm/groff_mm.7.man b/contrib/mm/groff_mm.7.man index a95790c..4f94191 100644 --- a/contrib/mm/groff_mm.7.man +++ b/contrib/mm/groff_mm.7.man @@ -1,19 +1,15 @@ '\" t -.TH GROFF_MM @MAN7EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -groff_mm \- memorandum macros for GNU roff -. -. -.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr groff_mm_C \n[.C] -.cp 0 +.TH groff_mm @MAN7EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +groff_mm \- memorandum macros for GNU +.I roff . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 1989-2018 Free Software Foundation, Inc. +.\" Copyright (C) 1989-2023 Free Software Foundation, Inc. .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are @@ -31,160 +27,458 @@ groff_mm \- memorandum macros for GNU roff .\" instead of in the original English. . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_groff_mm_7_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY "groff \-m@TMAC_M_PREFIX@m" -.RI [ option -\&.\|.\|.\&] -.RI [ file -\&.\|.\|.\&] +.RI [ option\~ .\|.\|.\&] +.RI [ file\~ .\|.\|.] +. .SY "groff \-m m@TMAC_M_PREFIX@m" -.RI [ option -\&.\|.\|.\&] -.RI [ file -\&.\|.\|.\&] +.RI [ option\~ .\|.\|.\&] +.RI [ file\~ .\|.\|.] .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . -The groff mm macros are intended to be compatible with the DWB mm macros -with the following limitations: +The GNU implementation of the +.I mm +macro package is part of the +.I groff +document formatting system. . -.TP -.B \(bu -No Bell Labs localisms are implemented. +The +.I mm +package is suitable for the composition of +letters, +memoranda, +reports, +and books. . -.TP -.B \(bu -The macros OK and PM are not implemented. . -.TP -.B \(bu -groff mm does not support cut marks. +.P +Call an +.I mm +macro at the beginning of a document to initialize the package. . +A simple +.I mm +document might use only +.B P +for paragraphing. . -.LP -.B m@TMAC_M_PREFIX@m -is intended to support easy localization. +Set numbered and unnumbered section headings with +.B H +and +.BR HU , +respectively. . -Use -.B m@TMAC_M_PREFIX@mse -as an example how to adapt the output format to a national standard. +Change the style of the typeface with +.BR B , +.BR I , +and +.BR R ; +you can alternate styles with +.BR BI , +.BR BR , +.BR IB , +.BR IR , +.BR RB , +and +.BR RI . +. +Several nestable list types are available via +.BR AL , +.BR BL , +.BR BVL , +.BR DL , +.BR ML , +.BR RL , +and +.BR VL ; +each of these begins a list, +to which +.B LI +adds an item and +.B LE +ends the (nested) list. +. +Customized list arrangements are supported by +.BR LB . +. +.B DS +and +.B DF +start static and floating displays, +respectively; +either is terminated with +.BR DE . +. +. +.P +.I groff mm +is intended to be compatible with the +.I mm +implementation found in the AT&T Documenter's Workbench (DWB), +with the following limitations. +. +. +.IP \[bu] 2n +Omitted features include +the logo and company name strings, +.B }Z +and +.BR ]S , +respectively; +the encoded company site location addresses recognized as the third +argument to the +.B AU +macro; +the +.B Pv +(\[lq]private\[rq] heading) +register; +and the +.B OK +(other keywords), +and +.B PM +(proprietary markings) +macros. +. +. +.IP \[bu] 2n +The +.B CS +(output cover sheet) +macro is implemented only for memorandum type 4. +. +. +.IP \[bu] +The +.I grap +preprocessor is not explicitly supported; +no +.B G1 +and +.B G2 +macros +are defined. +. +. +.IP \[bu] +The registers +.BR A , +.BR C , +.BR E , +.BR T , +and +.BR U , +typically set from the +.I troff \" generic +or +.I nroff \" generic +command lines with DWB +.IR mm , +are not recognized. +. +. +.IP \[bu] +When setting the registers +.B L +or +.B W +from the command line, +use an explicit scaling unit to avoid surprises. +. +. +.IP \[bu] +DWB +.IR mm 's +.B nP +macro indented the second line of a paragraph to align it with the start +of the text of the first +(after the paragraph number); +.IR "groff mm" 's +does not. +. +. +.IP \[bu] +Cut marks are not supported. . -Localized strings are collected in the file -.IR @MACRODIR@/ xx .tmac , +. +.P +DWB +.I mm +supported only seven levels of heading. +. +As a compatible extension, +.I groff mm +supports fourteen, +introducing new registers +.B H8 +through +.BR H14 , +and affecting the interpretation of the +.B HF +and +.B HP +strings. +. +. +.P +Macro, +register, +and string descriptions in this page frequently mention each other; +most cross references are to macros. +. +Where a register or string is referenced, +its type is explicitly identified. +. +.IR mm 's +macro names are usually in full capitals; +registers and strings tend to have mixed-case names. +. +. +.\" ==================================================================== +.SS "Document styles" +.\" ==================================================================== +. +.I groff mm +offers three different frameworks for document organization. +. +.BR \%COVER /\: \%COVEND +is a flexible means of preparing any document requiring a cover page. +. +.BR LT / LO +aids preparation of typical Anglophone correspondence +(business letters, +for example). +. +The +.B MT +memorandum type mechanism implements a group of formal styles +historically used by AT&T Bell Laboratories. +. +Your document can select at most one of these approaches; +when used, +each disables the others. +. +. +.\" ==================================================================== +.SS Localization +.\" ==================================================================== +. +.I groff mm +is designed to be easily localized. +. +For languages other than English, +strings that can appear in output are collected in the file +.IR @MACRODIR@/\: xx \:.tmac , where .I xx -denotes the two-letter code for the -.IR language , -as defined in the ISO 639 standard. +is an ISO\~639 two-letter language identifier. . -For Swedish, this is \[oq]sv.tmac\[cq] \[en] not \[oq]se\[cq], which -is the ISO 3166 two-letter code for the -.I country -(as used for the output format localization). +Localization packages should be loaded after +.IR mm ; +for example, +you might format a Swedish +.I mm +document with the command +.RB \[lq] "groff \-mm \-msv" \[rq]. . . -.\"######################################################################## -.LP -A file called -.I locale -or -.RI country _locale -is read after the initialization of the global variables. +.P +This package can also be localized by site or territory; +for example, +.I @MACRODIR@/\:@TMAC_M_PREFIX@mse\:.tmac +illustrates how to adapt the output to a national standard using its ISO +3166 territory code. . -It is therefore possible to localize the macros with a different company -name and so on. +Such a package can define a string that causes a macro file +.IR @MACRODIR@/\:mm/\:\% territory _locale +to be loaded at package initialization. . +If this mechanism is not used, +.I @MACRODIR@/\:mm/\:\%locale +is loaded instead. . -.LP -In this manual, square brackets are used to show optional arguments. +No diagnostic is produced if these files do not exist. . . .\" ==================================================================== -.SS "Number registers and strings" +.SS "Registers and strings" .\" ==================================================================== . -Many macros can be controlled by number registers and strings. +Much +.I mm +behavior can be configured by registers and strings. . -A number register is assigned with the +A register is assigned with the .B nr -command: +request. +. . .RS -.LP -.BI .nr\ "XXX \fR[\fP\fB\[+-]\fP\fR]\fPn \fR[\fPi\fR]\fP\"" +.P +.B .nr +.I ident +.RB [ \[+-] ]\c +.I n +.RI [ i ] .RE . . -.LP -.I XXX +.P +.I ident is the name of the register, +and .IR n \~is -the value to be assigned, and -.IR i \~is -the increment value for auto-increment. +the value to be assigned. . .IR n \~can -have a plus or minus sign as a prefix if an increment -or decrement of the current value is wanted. +be prefixed with a plus or minus sign if incrementation or +decrementation (respectively) of the register's existing value +.RI by\~ n +is desired. . -(Auto-increment or auto-decrement occurs if the number register is -used with a plus or minus sign, -.BI \[rs]n+[ XXX ] -or -.BI \[rs]n\-[ XXX ]\fR.)\fP +If assignment of a (possibly) negative +.IR n \~is +required, +further prefix it with a zero or enclose it in parentheses. . +If +.IR i \~is +specified, +the register is automatically modified +.RI by \~i +prior to interpolation if a plus or minus sign is included in the escape +sequence as follows. . -.LP -Strings are defined with -.BR ds . . .RS -.LP -\fB\&.ds\fP \fIYYY string\fP +.P +.B \[rs]n\c +.RB [ \[+-] ]\c +.BI [ ident ] .RE . . -.LP -The string is assigned everything to the end of the line, -even blanks. +.P +.IR i \~can +be negative; +it combines algebraically with the sign in the interpolation escape +sequence. . -Initial blanks in -.I string -should be prefixed with a double-quote. . -(Strings are used in the text as -.BI \[rs]*[ YYY ]\fR.)\fP +.P +Strings are defined with the +.B ds +request. +. +. +.RS +.P +.B .ds +.I ident contents +.RE +. +. +.P +.I contents +consumes everything up to the end of the line, +including trailing spaces. +. +It is a good practice to end +.I contents +with a comment escape sequence +.RB ( \[rs]\[dq] ) +so that extraneous spaces do not intrude during document maintenance. +. +To include leading spaces in +.IR contents , +prefix it with a double quote. +. +Strings are interpolated with the +.B \[rs]* +escape sequence. +. +. +.RS +.P +.B \[rs]*\c +.BI [ ident ] +.RE +. +. +.P +Register and string name spaces are distinct, +but strings and macros share a name space. +. +Defining a string with the same name as an +.I mm +macro is not supported and may cause incorrect rendering, +the emission of diagnostic messages, +and an error exit status from +.IR @g@troff . . . .\" ==================================================================== -.SS "Special formatting of number registers" +.SS "Register format" .\" ==================================================================== . -A number register is printed with normal digits if no format has been -given. +A register is interpolated using Arabic numerals if no other format has +been assigned to it. +. +Assign a format to a register with the +.B af +request. . -Set the format with -.BR af : . .RS .LP -.BI .af\ "R c" +.BI .af\~ "R c" .RE . . .LP .IR R \~is the name of the register, +and .IR c \~is the format. . +If +.IR c \~is +a sequence of Arabic numerals, +their quantity defines a zero-padded minimum width for the interpolated +register value. +. +. .RS .LP .TS @@ -192,8 +486,8 @@ tab(@); lb lb l l. Form@Sequence -1@0, 1, 2, 3, .\|.\|. -001@000, 001, 002, 003, .\|.\|. +1@0, 1, 2, 3, .\|.\|., 10, .\|.\|. +001@000, 001, 002, 003, .\|.\|., 1000, .\|.\|. i@0, i, ii, iii, iv, .\|.\|. I@0, I, II, III, IV, .\|.\|. a@0, a, b, c, .\|.\|., z, aa, ab, .\|.\|. @@ -207,39 +501,93 @@ A@0, A, B, C, .\|.\|., Z, AA, AB, .\|.\|. .\" ==================================================================== . In -.BR m@TMAC_M_PREFIX@m , -the fonts (or rather, font styles) -.BR R \~(normal), +.IR "groff mm" , +the fonts +(or rather, +font styles) +.BR R \~(roman), .BR I \~(italic), and .BR B \~(bold) -are hardwired to font positions +are mounted at font positions .BR 1 , .BR 2 , -and\~\c -.BR 3 , +.RB and\~ 3 , respectively. . -Internally, font positions are used for backwards compatibility. +Internally, +font positions are used for backward compatibility. . -From a practical point of view it doesn't make a big difference -\[en] a different font family can still be selected with a call to the -.B .fam -request or using -.BR groff 's +From a practical point of view, +it doesn't make a big difference\[em]a different font family can still +be selected by invoking +.IR groff 's +.B fam +request or using its .B \-f command-line option. . -On the other hand, if you want to replace just, say, font +On the other hand, +if you want to replace just, +for example, +.RB font\~ I +with Zapf Chancery Medium italic +(available on +.IR groff 's +.B pdf +and +.B ps +output devices), +you have to use the +.B fp +request, +replacing the font at position\~2 with +.RB \[lq] .fp\~2\~ZCMI \[rq]). +. +Because the cover sheet, +memorandum type, +and +.MR @g@refer @MAN1EXT@ +integration macros explicitly request fonts named .BR B , -you have to replace the font at position\~2 (with a call to -\[oq].fp\~2\~.\|.\|.\[cq]). +.BR I , +and +.BR R , +you will also need to remap these font names with the +.B ftr +request, +for instance with +.RB \[lq] .ftr\~I\~ZCMI \[rq]. . . .\" ==================================================================== -.SS Macros +.SH Macros .\" ==================================================================== . +An explicitly empty argument may be specified with a pair of double +quotes; +to call a macro +.B XX +with an empty second argument but non-empty first and third ones, +you could input the following. +. +. +.P +.RS +.EX +\&.XX foo \[dq]\[dq] baz +.EE +.RE +. +. +.P +Macro names longer than two characters are GNU extensions; +some shorter names were not part of DWB +.IR mm 's +published interface but are documented aspects of +.I groff mm. +. +. .TP .BI )E\ "level text" Add heading text @@ -249,647 +597,838 @@ to the table of contents with which is either\~0 or in the range 1 to\~7. . See also -.BR .H . +.BR H . +. +This undocumented DWB +.I mm +macro is exposed by +.I groff mm +to enable customized tables of contents. . -This macro is used for customized tables of contents. . .TP -.BR 1C\ [ 1 ] -Begin one-column processing. +.BR 1C\~ [ 1 ] +Format page text in one column. . -A\~\c -.B 1 -as an argument disables the page break. +The page is broken. +. +.RB A\~ 1 +argument suppresses this break; +its use may cause body text and a pending footnote to overprint. +. +See +.BR 2C , +.BR MC , +and +.BR NCOL . . -Use wide footnotes, small footnotes may be overprinted. . .TP .B 2C -Begin two-column processing. -. -Splits the page in two columns. +Begin two-column formatting. . -It is a special case of +This is a special case of .BR MC . -See also -.BR 1C . +. +See +.B 1C +and +.BR NCOL . +. . .TP .B AE -Abstract end, see +Abstract end; +stop collecting abstract text. +. +See .BR AS . . +. +.\" In DWB mm, the mnemonic for `AF` was "alternate first-page format", +.\" and was described in the context of the `A` and `E` registers and +.\" `}Z` and `]S` strings, none of which we support. .TP -.BI AF\ \fR[\fP name-of-firm \fR]\fP -Author's firm, should be called before -.BR AU , -see also +.BR AF \~[\c +.IR firm-name ] +Specify firm associated with the document. +. +At most one can be declared; +the firm name is used by memorandum types and available to cover sheets. +. +.B AF +terminates a document title started with +.BR TL , +and can be called without an argument for that purpose. +. +See +.B MT +and .BR COVER . . +. .TP -.BI AL\ \fR[\fPtype\ \fR[\fPtext-indent\ \fR[\fP1\fR]]]\fP -Start auto-increment list. +.BR AL \~[\c +.IR type \~[ text-indent \~[\c +.BR 1 ]]] +Begin an auto-incrementing numbered list. . -Items are numbered beginning with one. +Item numbers start at one. . The .I type -argument controls the format of numbers. +argument assigns the register format +(see above) +of the list item enumerators. . -.RS -.IP -.TS -tab(@); -lb lb -l l. -Arg@Description -1@Arabic (the default) -A@Upper-case letters (A\(enZ) -a@Lower-case letters (a\(enz) -I@Upper-case roman -i@Lower-case roman -.TE -.RE +The default +.RB is\~ 1 . . -.IP +An explicitly empty +.I type +also indicates the default. +. +A .I text-indent -sets the indentation and overrides +argument overrides register .BR Li . -A third argument prohibits printing of a blank line before each item. . -.TP -.BI APP\ "name text" -Begin an appendix with name -.IR name . +A third argument suppresses the blank line that normally precedes each +list item. . -Automatic naming occurs if -.I name -is -.BR \[dq]\[dq] . +Use +.B LI +to declare list items, +and +.B LE +to end the list. . -The appendices start with\~\c -.B A -if automatic naming is used. . -A new page is ejected, and a header is also produced if the number -variable -.B Aph -is non-zero. +.TP +.BR APP \~\c +.RI [ id\~ [ title ]] +Begin an appendix. +. +If the identifier +.I id +is omitted, +it is incremented +(or initialized, +if necessary). . -This is the default. +The register format used for +.I id +is \[lq]A\[rq]. . -The appendix always appears in the \[oq]List of contents\[cq] with -correct page numbers. +The page is broken. +. +The register +.B Aph +determines whether an appendix heading is then formatted. . -The name \[oq]APPENDIX\[cq] can be changed by setting the string +This heading uses the string .B App -to the desired text. +followed by +.IR id . +. +Appendices appear in any table of contents +(see +.BR TC ). . The string .B Apptxt -contains the current appendix text. +is set to +.I title +if the latter is present, +and made empty otherwise. +. . .TP -.BI APPSK\ "name pages text" -Same as -.BR .APP , -but the page number is incremented with -.IR pages . +.BI APPSK\~ "id n" \~\c +.RI [ title ] +As +.BR APP , +but increment the page number by +.IR n . +. +Use this macro to \[lq]skip pages\[rq] when diagrams or other materials +not formatted by +.I @g@troff +are included in appendices. . -This is used when diagrams or other non-formatted documents are -included as appendices. . .TP -.BI AS\ "\fR[\fParg \fR[\fPindent\fR]]\fP" -Abstract start. +.BR AS\~ [\c +.IR placement \~[ indentation ]] +Abstract start; +begin collecting abstract. . -Indentation is specified in \[oq]ens\[cq], but scaling is allowed. +Input up to the next +.B AE +call is included in the abstract. . -Argument -.I arg -controls where the abstract is printed. +.I placement +influences the location of the abstract on the cover sheet of a +memorandum +(see +.BR MT ). . -.RS +.BR \%COVER , +by contrast, +ignores +.I placement +by default, +but can be customized to interpret it. +. +. +.IP .TS tab(@); -lb lb +lf(BI) lb l lx. -\fBArg@Placement\fP +placement@Effect 0@T{ -Abstract is printed on page\~1 and on the cover sheet if used in the -released-paper style (\fBMT 4\fP), -otherwise it is printed on page\~1 without a cover sheet. +The abstract appears on page\~1 and cover sheet if the document is a +\[lq]released paper\[rq] memorandum +.RB (\[lq] ".MT 4" \[rq]); +otherwise, +it appears on page\~1 without a cover sheet. T} -1@Abstract is only printed on the cover sheet (\fBMT 4\fP only). -2@T{ -Abstract is printed only on the cover sheet (other than \fBMT 4\fP only). -The cover sheet is printed without a need for \fBCS\fP. +1@T{ +The abstract appears only on the cover sheet +.RB (\[lq] ".MT 4" \[rq] +only). T} +.\" XXX: This does not appear to be implemented. +.\"2@T{ +.\"The abstract is printed only on the cover sheet (if not +.\".BR ".MT 4" ) +.\". +.\"The cover sheet is printed without a need for \fBCS\fP. +.\"T} .TE -.RE +. . .IP -An abstract is not printed at all in external letters (\fBMT 5\fP). +An abstract does not appear at all in external letters +.RB (\[lq] ".MT 5" \[rq]). . -The -.I indent -parameter controls the indentation of both margins, otherwise normal -text indentation is used. +.RI A\~ placement +of +.B 2 +was supported by DWB +.I mm +but is not by +.IR "groff mm" . +. +. +.IP +A second argument increases the indentation by +.I indentation +and reduces the line length by twice this amount. +. +A scaling unit of ens is assumed. +. +The default is\~0. . +. +.\" XXX: Do we need a macro for this? Why is it not a string like App +.\" or Licon? It is usefully localizable. .TP -.BI AST\ \fR[\fPtitle\fR]\fP -Abstract title. +.BR AST \~\c +.RI [ caption ] +Set the caption above the abstract to +.IR caption , +or clear it if there is no argument. . -Default is \[oq]ABSTRACT\[cq]. +The default is \[lq]ABSTRACT\[rq]. . -Sets the text above the abstract text. . .TP -.BI AT\ "title1 \fR[\fPtitle2 \fR[.\|.\|.]]\fP" -Author's title. +.BI AT\~ title\c +\~.\|.\|. +Specify author's title(s). . +If present, .B AT -must appear just after each +must appear just after the corresponding author's .BR AU . . -The title shows up after the name in the signature block. +Each +.I title +occupies an output line beneath the author's name in the signature block +used by +.B LT +letters +(see +.BR SG ) +and in +.B MT +memoranda. . -.TP -.BI AU\ "\fR[\fPname \fR[\fPinitials \fR[\fPloc \fR[\fPdept \fR[\fPext \fR[\fProom \fR[\fParg \fR[\fParg \fR[\fParg\fR]]]]]]]]]\fP" -Author information. +The +.B ms +cover sheet style also uses it. +. +. +.br +.ne 7v +.TP +.BR AU \~\c +.RI [ name\~\c +.RI [ initials\~\c +.RI [ loc\~\c +.RI [ dept\~\c +.RI [ ext\~\c +.RI [ room\~\c +.RI [ arg1\~\c +.RI [ arg2\~\c +.RI [ arg3 ]]]]]]]]] +Specify author. +. +.B AU +terminates a document title started with +.BR TL , +and can be called without arguments for that purpose. +. +Author information is used by cover sheets, +.B MT +memoranda, +and +.BR SG . +. +Further arguments comprise +initials, +location, +department, +telephone extension, +room number or name, +and up to three additional items. . -Specifies the author of the memo or paper, and is printed on the cover -sheet and on other similar places. +Repeat .B AU -must not appear before -.BR TL . +to identify multiple authors. +. +. +.IP +Use +.BR WA / WE +instead to identify the author for documents employing +.BR LT . . -The author information can contain initials, location, department, -telephone extension, room number or name and up to three extra -arguments. . .TP -.BI AV\ \fR[\fPname\ \fR[\fP1\fR]]\fP -Approval signature. +.BR AV \~[\c +.IR name \~[\c +.BR 1 ]] +Format approval lines for a handwritten signature and date. +. +Two horizontal rules are drawn, +with the specified +.I name +and the text of the string +.B Letdate +beneath them. . -Generates an approval line with place for signature and date. +Above these rules, +the text in the string +.B Letapp +is formatted; +a second argument replaces this text with a blank line. . -The string \[oq]APPROVED:\[cq] can be changed with variable -.BR Letapp ; -it is replaced with an empty lin if there is a second argument. +See +.BR LT . . -The string \[oq]Date\[cq] can be changed with variable -.BR Letdate . . +.\" XXX: AVL is misnamed; it should have been called SGL or similar. .TP -.BI AVL\ \fR[\fPname\fR]\fP -Letter signature. +.BR AVL \~[\c +.IR name ] +As +.BR AV , +but the date, +date rule, +and approval notation +.B Letapp +are omitted. . -Generates a line with place for signature. . .TP -.BI B\ "\fR[\fPbold-text \fR[\fPprev-font-text \fR[\fPbold \fR[.\|.\|.]]]]\fP" -Begin boldface. +.BR B \~\c \" space in roman; we must use 2-font macro with \c +.RI [ bold-text\~\c +.RI [ previous-font-text ]]\~.\|.\|. +Join +.I bold-text +in boldface with +.I previous-font-text +in the previous font, +without space between the arguments. . -No limit on the number of arguments. +If no arguments, +switch font to bold style. . -All arguments are concatenated to one word; the first, third and so on -is printed in boldface. . .TP .B B1 -Begin box (as the ms macro). +Begin boxed, +kept display. +. +The text is indented one character, +and the right margin is one character shorter. . -Draws a box around the text. +This is a GNU extension. . -The text is indented one character, and the right margin is one -character shorter. . .TP .B B2 -End box. +End boxed, +kept display. +. +This is a GNU extension. . -Finishes the box started with -.BR B1 . . .TP .B BE -End bottom block, see +End bottom block; see .BR BS . . +. .TP -.BI BI\ "\fR[\fPbold-text \fR[\fPitalic-text \fR[\fPbold-text \fR[.\|.\|.]]]]\fP" -Bold-italic. +.BR BI \~\c \" space in roman; we must use 2-font macro with \c +.RI [ bold-text\~\c +.RI [ italic-text ]]\~.\|.\|. +Join +.I bold-text +in boldface with +.I italic-text +in italics, +without space between the arguments. . -No limit on the number of arguments, -see\~\c -.BR B . . .TP -.BI BL\ \fR[\fPtext-indent\ \fR[\fP1\fR]]\fP -Start bullet list. +.BR BL \~[\c +.IR text-indent \~[\c +.BR 1 ]] +Begin bulleted list. . -Initializes a list with a bullet and a space in the beginning of each -list item (see -.BR LI ). +Items are prefixed with a bullet and a space. . +A .I text-indent -overrides the default indentation of the list items set by number register +argument overrides register .BR Pi . . -A third argument prohibits printing of a blank line before each item. +A second argument suppresses blank lines between items. +. +Use +.B LI +to declare list items, +and +.B LE +to end the list. +. . .TP -.BI BR\ "\fR[\fPbold-text \fR[\fProman-text \fR[\fPbold-text \fR[.\|.\|.]]]]\fP" -Bold-roman. -No limit on the number of arguments. +.BR BR \~\c \" space in roman; we must use 2-font macro with \c +.RI [ bold-text\~\c +.RI [ roman-text ]]\~.\|.\|. +Join +.I bold-text +in boldface with +.I roman-text +in roman style, +without space between the arguments. +. . .TP .B BS -Bottom block start. +Begin bottom block. . -Begins the definition of a text block which is printed at the bottom -of each page. +Input is collected until +.B BE +is called, +and output between the footnote area and footer of each page. . -The block ends with -.BR BE . . +.\" XXX: Couldn't this have been done with an extra parameter to `VL`? +.\" Or a register influencing VL behavior? .TP -.BI BVL\ "text-indent \fR[\fPmark-indent\ " \fR[\fP1\fR]]\fP -Start of broken variable-item list. +.BR BVL \~[\c +.IR text-indent \~[ mark-indent \~[\c +.BR 1 ]]] +Begin broken variable-item +(or \[lq]tagged\[rq]) +list. . -Broken variable-item list has no fixed mark, -it assumes that every -.B LI -has a mark instead. +Each item is expected to supply its own mark. . -The text always begins at the next line after the mark. +The line is always broken after the mark; +contrast +.BR VL . . .I text-indent -sets the indentation to the text, and +sets the indentation of the text, +and .I mark-indent -the distance from the current indentation to the mark. +the distance from the current list indentation to the mark. +. +A third argument suppresses the blank line that normally precedes each +list item. +. +Use +.B LI +to declare list items, +and +.B LE +to end the list. . -A third argument prohibits printing of a blank line before each item. . .TP -.BI COVER\ \fR[\fParg\fR]\fP -Begin a coversheet definition. +.BR \%COVER \~\c \" space in roman; we must use 2-font macro with \c +.RI [ style ] +Begin a cover page description. . -It is important that -.B .COVER -appears before any normal text. -. -This macro uses -.I arg -to build the filename -.IR @TMAC_MDIR@/ arg .cov . -. -Therefore it is possible to create unlimited types of cover sheets. +.B \%COVER +must appear before the body text +(or main matter) +of a document. . +The argument +.I style +is used to construct the file name +.IR @TMAC_MDIR@/\: style \:.cov +and load it with the +.B mso +request. +. +The default +.I style +is +.BR ms ; +the .I ms.cov -is supposed to look like the ms cover sheet. -. -.B .COVER -requires a -.B .COVEND -at the end of the cover definition. +file prepares a cover page resembling those of the +.I ms +package. +. +A +.I .cov +file must define a +.B \%COVEND +macro, +which a document must call at the end of the cover description. +. +Use cover description macros in the following order; +only +.B TL +and +.B AU +are required. . -Always use this order of the cover macros: . -.RS .IP -.nf +.EX \&.COVER \&.TL \&.AF \&.AU \&.AT \&.AS +.ne 2v \&.AE \&.COVEND -.fi -.RE +.EE . -.IP -However, only -.B .TL -and -.B .AU -are required. . .TP .B COVEND -Finish the cover description and print the cover page. +End the cover description. . -It is defined in the cover file. . .TP .B DE -Display end. -. -Ends a block of text or display that begins with +End static or floating display begun with .B DS or .BR DF . . +. .TP -.BI DF\ "\fR[\fPformat \fR[\fPfill \fR[\fPrindent\fR]]]\fP" -Begin floating display (no nesting allowed). +.BR DF\~ [\c +.IR format \~[ fill \~[ right-indentation ]]] +Begin floating display. . -A floating display is saved in a queue and is printed in the order entered. -.IR Format , -.IR fill , -and -.I rindent -are the same as in +A floating display is saved in a queue and output in the order entered. +. +Arguments are handled as in .BR DS . -Floating displays are controlled by the two number registers +. +Floating displays cannot be nested. +. +Placement of floating displays is controlled by the registers .B De and .BR Df . . -.IP -.B De register -. -.RS -.IP -.TS -tab(@); -l lx. -0@T{ -Nothing special, this is the default. -T} -1@T{ -A page eject occurs after each printed display, -giving only one display per page and no text following it. -T} -.TE -.RE -. -.IP -.B Df register -. -.RS -.IP -.TS -tab(@); -l lx. -0@T{ -Displays are printed at the end of each section (when section-page -numbering is active) or at the end of the document. -T} -1@T{ -A new display is printed on the current page if there is enough space, -otherwise it is printed at the end of the document. -T} -2@T{ -One display is printed at the top of each page or column -(in multi-column mode). -T} -3@T{ -Print one display if there is enough space for it, -otherwise it is printed at the top of the next page or column. -T} -4@T{ -Print as many displays as possible in a new page or column. -A page break occurs between each display if -.B De -is not zero. -T} -5@T{ -Fill the current page with displays and the rest beginning at a new page -or column. -(This is the default.) -A page break occurs between each display -if \fBDe\fP is not zero. -T} -.TE -.RE . .TP -.BI DL\ \fR[\fPtext-indent\ "\fR[\fP\fB1\fP \fR[\fP\fB1\fP\fR]]]\fP" -Dash list start. +.BR DL \~[\c +.IR text-indent \~[\c +.BR 1 ]] +Begin dashed list. . -Begins a list where each item is printed after a dash. +Items are prefixed with an em dash and a space. . +A .I text-indent -changes the default indentation of the list items set by number -register +argument overrides register .BR Pi . . -A second argument prevents an empty line between each list item. +A second argument suppresses blank lines between items. . -See -.BR LI . +Use +.B LI +to declare list items, +and +.B LE +to end the list. . -A third argument prohibits printing of a blank line before each item. . .TP -.BI DS\ "\fR[\fPformat \fR[\fPfill \fR[\fPrindent\fR]]]\fP" -Static display start. +.BR DS \~[\c +.IR format \~[\c +.IR fill \~[\c +.IR right-indentation ]]] +Begin static display. . -Begins collection of text until -.BR DE . +Input until +.B DE +is called is collected into a display. . -The text is printed together on the same page, unless it is longer -than the height of the page. +The display is output on a single page unless it is taller than the +height of the page. . .B DS -can be nested arbitrarily. +can be nested +(contrast with +.BR DF ). . -.IP -.B format . -.RS .IP .TS tab(@); -l lx. -\[dq]\[dq]@No indentation. -none@No indentation. -L@No indentation. +Lf(BI) Lb +L Lx. +format@Effect +\f[I]none\f[]@Do not indent the display. +L@Do not indent the display. I@T{ -Indent text with the value of number register -.BR Si . +Indent text by +.BR \[rs]n[Si] . T} C@Center each line. CB@Center the whole display as a block. R@Right-adjust the lines. RB@Right-adjust the whole display as a block. .TE -.RE . -.IP -The values \[oq]L\[cq], \[oq]I\[cq], \[oq]C\[cq], and \[oq]CB\[cq] can -also be specified as \[oq]0\[cq], \[oq]1\[cq], \[oq]2\[cq], and -\[oq]3\[cq], respectively, for compatibility reasons. . .IP -.B fill +The values \[lq]L\[rq], +\[lq]I\[rq], +\[lq]C\[rq], +and \[lq]CB\[rq] can also be specified as \[lq]0\[rq], +\[lq]1\[rq], +\[lq]2\[rq], +and +\[lq]3\[rq], +respectively, +for compatibility with +.RI DWB\~ mm. +. . -.RS .IP .TS tab(@); -l l. -\[dq]\[dq]@Line-filling turned off. -none@Line-filling turned off. -N@Line-filling turned off. -F@Line-filling turned on. +Lf(BI) Lb +L Lx. +fill@Effect +\f[I]none\f[]@Disable filling. +N@Disable filling. +F@Enable filling. .TE -.RE +. +. +.IP +\[lq]N\[rq] and \[lq]F\[rq] can also be specified as \[lq]0\[rq] and +\[lq]1\[rq], +respectively, +for compatibility with +.RI DWB\~ mm. +. . .IP -\[oq]N\[cq] and \[oq]F\[cq] can also be specified as \[oq]0\[cq] and -\[oq]1\[cq], respectively. +A third argument +reduces the line length by +.I right-indentation. +. . .IP -By default, an empty line is printed before and after the display. +.I mm +normally +places blank lines before and after the display. . -Setting number register +Set register .B Ds -to\~0 prevents this. +to\~0 to suppress these. . -.I rindent -shortens the line length by that amount. . .TP -.BI EC\ "\fR[\fPtitle \fR[\fPoverride \fR[\fPflag \fR[\fPrefname\fR]]]]\fP" -Equation title. +.BR EC \~\c +.RI [ title \~[ override \~[ flag \~[ refname ]]]] +Caption an equation. . -Sets a title for an equation. +The caption consists of the string +.B Liec +followed by an automatically incrementing counter stored in the register +.BR Ec , +punctuation configured by the register +.BR Of , +then +.I title +(if any). +. +Use the +.B af +request to configure +.BR Ec 's +number format. . -The .I override -argument changes the numbering. +and +.I flag +alter the equation number as follows. +. +Omitting +.I flag +and specifying +.B 0 +in its place are equivalent. . -.IP -.B flag . -.RS .IP .TS tab(@); -l lx. -none@T{ -.I override -is a prefix to the number. -T} +Lf(BI) Lb +L Lx. +flag@Effect 0@T{ -.I override -is a prefix to the number. +Prefix number with +.IR override . T} 1@T{ -.I override -is a suffix to the number. +Suffix number with +.IR override . T} 2@T{ -.I override -replaces the number. +Replace number with +.IR override . T} .TE -.RE . -.IP -.B EC -uses the number register -.B Ec -as a counter. . -It is possible to use -.B .af -to change the format of the number. +.IP +Equation captions are centered irrespective of the alignment of any +enclosing display. . -If number register -.B Of -is\~1, the format of title uses a dash instead of a dot after the -number. . .IP -The string -.B Le -controls the title of the List of Equations; -default is \[oq]LIST OF EQUATIONS\[cq]. +.I refname +stores the equation number using +.BR SETR ; +it can be retreived with +.RB \[lq] .GETST +.IR refname \[rq]. . -The List of Equations is only printed if number register -.B Le -is\~1. +This argument is a GNU extension. . -The default is\~0. . -The string -.B Liec -contains the word \[oq]Equation\[cq], which is printed before the -number. +.IP +Captioned equations are listed in a table of contents +(see +.BR TC ) +if the Boolean register +.B Le +is true. . -If -.I refname -is used, -then the equation number is saved with -.BR .SETR , -and can be retrieved with \[oq]\fB.GETST\fP \fIrefname\fP\[cq]. +Such a list uses the string +.B Le +as a heading. . -.IP -Special handling of the title occurs if -.B EC -is used inside -.BR DS / DE ; -it is not affected by the format of -.BR DS . . .TP -.BI EF\ \fR[\fParg\fR]\fP -Even-page footer, -printed just above the normal page footer on even pages. +.BR EF\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +Define the even-page footer, +which is formatted just above the normal page footer on even-numbered +pages. . See .BR PF . . -.IP -This macro defines string +.B EF +defines the string .BR EOPef . . +. .TP -.BI EH\ \fR[\fParg\fR]\fP -Even-page header, -printed just below the normal page header on even pages. +.BR EH\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +Define the even-page header, +which is formatted just below the normal page header on even-numbered +pages. . See .BR PH . . -.IP -This macro defines string +.B EH +defines the string .BR TPeh . . +. .TP .B EN -Equation end, see +End equation input preprocessed by +.MR @g@eqn @MAN1EXT@ ; +see .BR EQ . . +. .TP .B EOP -End-of-page user-defined macro. +If defined, +this macro is called in lieu of normal page footer layout. . -This macro is called instead of the normal printing of the footer. -. -The macro is executed in a separate environment, -without any trap active. +Headers and footers are formatted in a separate environment. . See .BR TP . . +. .IP -.B Strings available to EOP -.RS .TS tab(@); -l l. -EOPf@argument of \fBPF\fP -EOPef@argument of \fBEF\fP -EOPof@argument of \fBOF\fP +Cb S +Lb L. +Strings available to EOP +_ +EOPf@argument to \fBPF\fP +EOPef@argument to \fBEF\fP +EOPof@argument to \fBOF\fP .TE -.RE +. . .TP .BI EPIC\ "\fR[\fP\fB\-L\fP\fR]\fP width height \fR[\fPname\fR]\fP" @@ -908,117 +1447,114 @@ This is used to include external pictures; just give the size of the picture. . .B \-L -left-adjusts the picture; +left-aligns the picture; the default is to center. . See .BR PIC . . -.TP -.BI EQ\ \fR[\fPlabel\fR]\fP -Equation start. . -.BR EQ / EN -are the delimiters for equations written for -.BR @g@eqn (@MAN1EXT@). +.TP +.BR EQ \~[\c +.IR label ] +Start equation input preprocessed by +.MR @g@eqn @MAN1EXT@ . . -.BR EQ / EN -must be inside of a -.BR DS / DE -pair, except if .B EQ -is used to set options for -.B @g@eqn -only. +and +.B EN +macro calls bracket an equation region. . -The +Such regions must be contained in displays +.RB ( DS / DE ), +except when the region is used only to configure +.I @g@eqn +and not to produce output. +. +If present, .I label -argument appears at the right margin of the equation, -centered vertically within the -.BR DS / DE -block, -unless number register -.B Eq -is\~1. +appears aligned to the right and +centered vertically within the display; +see register +.BR Eq . . -Then the label appears at the left margin. . -.IP -If there are multiple -.BR EQ / EN -blocks within a single -.BR DS / DE -pair, -only the last equation label (if any) is printed. +If multiple +.I eqn \" generic +regions occur within a display, +only the last +.I label +(if any) +is used. +. . .TP -.BI EX\ "\fR[\fPtitle \fR[\fPoverride \fR[\fPflag \fR[\fPrefname\fR]]]]\fP" -Exhibit title. +.BR EX \~\c +.RI [ title \~[ override \~[ flag \~[ refname ]]]] +Caption an exhibit. . -The arguments are the same as for +Arguments are handled analogously to .BR EC . . -.B EX -uses the number register +The register .B Ex -as a counter. -. -The string -.B Lx -controls the title of the List of Exhibits; -default is \[oq]LIST OF EXHIBITS\[cq]. -. -The List of Exhibits is only printed if number register -.B Lx -is\~1, -which is the default. +is the exhibit counter. . The string .B Liex -contains the word \[oq]Exhibit\[cq], which is printed before the -number. +precedes the exhibit number and any +.I title. +. +Exhibit captions are centered irrespective of the alignment of any +enclosing display. . -If -.I refname -is used, the exhibit number is saved with -.BR .SETR , -and can be retrieved with \[oq]\fB.GETST\fP \fIrefname\fP\[cq]. . .IP -Special handling of the title occurs if -.B EX -is used inside -.BR DS / DE ; -it is not affected by the format of -.BR DS . +Captioned exhibits are listed in a table of contents +(see +.BR TC ) +if the Boolean register +.B Lx +is true. +. +Such a list uses the string +.B Lx +as a heading. . -.TP -.BI FC\ \fR[\fPclosing\fR]\fP -Print \[oq]Yours\~very\~truly,\[cq] as a formal closing of a letter or -memorandum. . -The argument replaces the default string. +.TP +.BR FC \~[\c +.IR closing-text ] +Output the string +.BR Letfc , +or the specified +.I closing-text, +as the formal closing of a letter. . -The default is stored in string variable -.BR Letfc . . .TP -.BI FD\ \fR[\fParg\ \fR[\fP1\fR]]\fP -Footnote default format. +.BR FD \~[\c +.IR arg \~[\c +.BR 1 ]] +Configure display of footnotes. . -Controls the hyphenation (hyphen), -right margin justification (adjust), -and indentation of footnote text (indent). +The first argument encodes enablement of +automatic hyphenation, +adjustment to the right margin, +indentation of footnote text, +and left- vs.\& right-alignment of the footnote label within the space +allocated for it. . -It can also change the label justification (ljust). . -.RS +.br +.ne 5v .IP +.\" XXX: We can fit one more row using "nokeep" vs. not using it. .TS -tab(@); -lb lb lb lb lb -l l l l l. -arg@hyphen@adjust@indent@ljust +tab(@) nokeep; +Lf(BI) Lb Lb Lb Lb +L L L L L. +arg@Hyphenate?@Adjust?@Indent?@Label alignment 0@no@yes@yes@left 1@yes@yes@yes@left 2@no@no@yes@left @@ -1032,90 +1568,121 @@ arg@hyphen@adjust@indent@ljust 10@no@no@yes@right 11@yes@no@yes@right .TE -.RE +. +. +.IP +An +.I arg +greater than 11 is treated +.RB as\~ 0 . +. +.IR mm 's +default +.RB is\~ 0 . +. . .IP -An argument greater than or equal to 11 is considered as value\~0. +If a second argument, +conventionally +.BR 1 , +is given, +footnote numbering is reset when a first-level heading is encountered. +. +See +.BR FS . . -Default for -.B m@TMAC_M_PREFIX@m -is 10. . .TP .B FE -Footnote end. +End footnote; +see +.BR FS . +. . .TP -.BI FG\ "\fR[\fPtitle \fR[\fPoverride \fR[\fPflag \fR[\fPrefname\fR]]]]\fP" -Figure title. +.BR FG \~\c +.RI [ title \~[ override \~[ flag \~[ refname ]]]] +Caption a figure. . -The arguments are the same as for +Arguments are handled analogously to .BR EC . -.B FG -uses the number register +. +The register .B Fg -as a counter. +is the figure counter. . The string +.B Lifg +precedes the figure number and any +.I title. +. +Figure captions are centered irrespective of the alignment of any +enclosing display. +. +. +.IP +Captioned figures are listed in a table of contents +(see +.BR TC ) +if the Boolean register .B Lf -controls the title of the List of Figures; -default is \[oq]LIST OF FIGURES\[cq]. +is true. . -The List of Figures is only printed if number register +Such a list uses the string .B Lf -is\~1, which is the default. +as a heading. . -The string -.B Lifg -contains the word \[oq]Figure\[cq], which is printed before the -number. . -If -.I refname -is used, then the figure number is saved with -.BR .SETR , -and can be retrieved with \[oq]\fB.GETST\fP \fIrefname\fP\[cq]. +.TP +.BR FS \~[\c +.IR label ] +Start footnote. . -.IP -Special handling of the title occurs if -.B FG -is used inside -.BR DS / DE , -it is not affected by the format of -.BR DS . +Input until +.B FE +is called is collected into a footnote. +. +By default, +footnotes are automatically numbered starting at 1; +the number is available in register +.B :p +and, +with a trailing period, +in +.RB string\~ F . . -.TP -.BI FS\ \fR[\fPlabel\fR]\fP -Footnote start. +This string precedes the footnote text at the bottom of the column or +page. . -The footnote is ended by -.BR FE . +Footnotes are vertically separated by the product of +.RB registers\~ Fs +and +.BR Lsp . . -By default, footnotes are automatically numbered; -the number is available in string\~\c -.BR F . +In +.IR "groff mm" , +footnotes may be used in displays. . -Just add -.B \[rs]*F -in the text. . -By adding -.IR label , -it is possible to have other number or names on the footnotes. +.IP +A +.I label +argument replaces the contents of the string +.BR F ; +it need not be numeric. . -Footnotes in displays are now possible. +In this event, +the footnote marker in the body text must be explicitly written. . -An empty line separates footnotes; -the height of the line is controlled by number register -.BR Fs , -default value is\~1. . .TP .BI GETHN\ "refname \fR[\fPvarname\fR]\fP" -Include the header number where the corresponding \[oq]\fBSETR\fP -\fIrefname\fP\[cq] was placed. +Include the heading number where the corresponding +.RB \[lq] .SETR +.IR refname \[rq] +was placed. . -This is displayed as \[oq]X.X.X.\[cq] in pass\~1. +This is displayed as \[lq]X.X.X.\[rq] in pass\~1. . See .BR INITR . @@ -1124,16 +1691,18 @@ If .I varname is used, .B GETHN -sets the string variable +sets the string .I varname -to the header number. +to the heading number. . .TP .BI GETPN\ "refname \fR[\fPvarname\fR]\fP" -Include the page number where the corresponding \[oq]\fBSETR\fP -\fIrefname\fP\[cq] was placed. +Include the page number where the corresponding +.RB \[lq] .SETR +.IR refname \[rq] +was placed. . -This is displayed as \[oq]9999\[cq] in pass\~1. +This is displayed as \[lq]9999\[rq] in pass\~1. . See .BR INITR . @@ -1142,7 +1711,7 @@ If .I varname is used, .B GETPN -sets the stringvariable +sets the string .I varname to the page number. . @@ -1152,7 +1721,7 @@ Combine .B GETHN and .B GETPN -with the text \[oq]chapter\[cq] and \[oq],\~page\[cq]. +with the text \[lq]chapter\[rq] and \[lq],\~page\[rq]. . The string .B Qrf @@ -1173,7 +1742,8 @@ and .B Qrfp are set by .B GETR -and contain the page and header number, respectively. +and contain the page and heading number, +respectively. . .TP .BI GETST\ "refname \fR[\fPvarname\fR]\fP" @@ -1191,684 +1761,616 @@ sets it to the saved string. See .BR INITR . . -.TP -.BI H\ "level \fR[\fPheading-text \fR[\fPheading-suffix\fR]]\fP" -Numbered section heading. -. -Section headers can have a level between 1 and 14; -level\~1 is the top level. . -The text is given in -.IR heading-text , -and must be surrounded by double quotes if it contains spaces. +.TP +.BI H\~ level\~\c +.RI [ title \~[ suffix ]] +Set a numbered section heading at +.IR level . . -.I heading-suffix -is added to the header in the text but not in the table of contents. +.I mm +produces numbered +.I "heading marks" +of the form +.IR a . b . c .\|.\|., +with up to fourteen levels of nesting. . -This is normally used for footnote marks and similar things. +Each level's number increases automatically with each +.B H +call and is reset to zero when a more significant +.I level +is specified. . -Don't use -.B \[rs]*F -in -.IR heading-suffix , -it doesn't work. +.RB \[lq] 1 \[rq]\~is +the most significant or coarsest division of the document. . -A manual label must be used, see -.BR FS . -.sp -A call to the paragraph macro\~\c -.B P -directly after\~\c +Text after an .B H -is ignored. +call is formatted as a paragraph; +calling +.B P +is unnecessary. . -.BR H \~takes -care of spacing and indentation. . .IP -.B Page ejection before heading +.I title +specifies an optional title; +it must be double-quoted if it contains spaces. . -.RS -.IP -Number register -.B Ej -controls page ejection before the heading. +.I mm +appends +.I suffix +to +.I title +in the body of the document, +but omits it from any table of contents +(see +.BR TC ). . -By default, a level-one heading gets two blank lines before it; -higher levels only get one. +This facility can be used to annotate the heading title with a footnote. . -A new page is ejected before each first-level heading if number -register -.B Ej -is\~1. +.I suffix +should not interpolate +.RB the\~ F +string; +specify a footnote mark explicitly. . -All levels below or equal the value of -.B Ej -get a new page. +See +.BR FS . . -Default value for -.B Ej -is\~0. -.RE . .IP -.B Heading break level +Heading behavior is highly configurable. . -.RS -.IP -A line break occurs after the heading if the heading level is less -or equal to number register -.BR Hb . +Several registers set a +.I threshold, +where heading levels at or below the threshold value are handled in one +way, +and those above it another. . -Default value is\~2. -.RE +For example, +a heading level within the threshold of register +.B Cl +is included in the table of contents +(see +.BR TC ). . -.IP -.B Heading space level . -.RS .IP -A blank line is inserted after the heading if the heading level is -less or equal to number register -.BR Hs . +.I Heading layout. . -Default value is\~2. +Register +.B Ej +sets a threshold for page breaking (ejection) prior to a heading. . -.IP -Text follows the heading on the same line if the level is greater than -both +If not preceded by a page break, +a heading level below the threshold in register +.B Hps +is preceded by the amount of vertical space in register +.BR Hps1 , +and by the amount in +.B Hps2 +otherwise. +. +The +.B Hb +register sets a threshold below which a break occurs after the heading, +and register +.B Hs +sets a threshold below which vertical space follows it. +. +If the heading level is not less than both of these, +a +.I run-in heading +is produced; +paragraph text follows on the same output line. +. +Otherwise, +register +.B Hi +configures the indentation of text after headings. +. +Threshold register +.B Hc +enables the centering of headings; +a heading level below both of the .B Hb and -.BR Hs . -.RE +.B Hc +thresholds is centered. . -.IP -.B Post-heading indent . -.RS .IP -Indentation of the text after the heading is controlled by number -register -.BR Hi . +.I Heading typeface and size. +. +The fonts used for heading numbers and titles at each level are +configured by the +.B HF +string. +. +The string +.B HP +likewise assigns a type size to each heading level. +. +.\" XXX: Why not an "Hvs" string? +The vertical spacing used by headings may be controlled by +the user-definable macros +.B HX +and/or +.BR HZ . . -Default value is\~0. . .IP -.B Hi -.TS -tab(@); -l lx. -0@The text is left-justified. -1@T{ -Indentation of the text follows the value of number -register -.B Pt , -see -.BR P . -T} -2@T{ -The text is lined up with the first word of the heading. -T} -.TE -.RE -. -.IP -.B Centered section headings -. -.RS -.IP -All headings whose level is equal or below number register -.B Hc -and also less than or equal to -.B Hb -or -.B Hs -are centered. -.RE -. -.IP -.B Font control of the heading -. -.RS -.IP -The font of each heading level is controlled by string -.BR HF . -. -It contains a font number or font name for each level. -. -Default value is -. -.RS -.IP -.B 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -.RE -. -.IP -(all headings in italic). -. -This could also be written as -. -.RS -.IP -.B I I I I I I I I I I I I I I -.RE -. -.IP -Note that some other implementations use -.B 3\~3\~2\~2\~2\~2\~2 -as the default value. -. -All omitted values are presumed to have value\~1. -.RE -. -.IP -.B Point size control -. -.RS -.IP -String -.B HP -controls the point size of each heading, -in the same way as -.B HF -controls the font. -. -A value of\~0 selects the default point size. -. -Default value is +.I Heading number format. . -.RS -.IP -.B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -.RE -. -.IP -Beware that only the point size changes, not the vertical size. -. -The latter can be controlled by the user-specified macros -.B HX -and/or -.BR HZ . -.RE -. -.IP -.B Heading counters -. -.RS -.IP -Fourteen number registers named +Registers named .B H1 -up to +through .B H14 -contain the counter for each heading level. -. -The values are printed using Arabic numerals; -this can be changed with the macro -.B HM -(see below). +store counters for each heading level. . -All marks are concatenated before printing. +Their values are printed using Arabic numerals by default; +see +.BR HM . . -To avoid this, -set number register +The heading levels are catenated with dots for formatting; +to typeset only the deepest, +set the .B Ht -to\~1. +register. . -This only prints the current heading counter at each heading. -.RE +Heading numbers are not suffixed with a trailing dot except when only +the first level is output; +to omit a dot in this case as well, +clear the +.B H1dot +register. . -.IP -.B Automatic table of contents . -.RS .IP -All headings whose level is equal or below number register -.B Cl -are saved to be printed in the table of contents. +.I Customizing heading behavior. . -Default value is\~2. -.RE +.I mm +calls +.I hook +macros to enable further customization of headings. . -.IP -.B Special control of the heading, user-defined macros +(DWB +.I mm +called these \[lq]exits\[rq].) . -.RS -.IP -The following macros can be defined by the user to get a finer control -of vertical spacing, fonts, or other features. +They can be used to change the heading's +.I mark +(the numbered portion before any heading title), +its vertical spacing, +and its vertical space requirements +(for instance, +to require a minimum quantity of subsequent output lines). . -Argument +Define hook macros in expectation of the following parameters. +. +The argument +.I declared-level +is the .I level -is the level-argument to\~\c +argument to .BR H , -but\~0 for unnumbered headings (see +.RB or\~ 0 +for unnumbered headings (see .BR HU ). . -Argument -.I rlevel -is the real level; -it is set to number register -.B Hu +.I actual-level +is the same as +.I declared-level +for numbered headings, +and the value of +.RB register\~ Hu for unnumbered headings. . -Argument -.I heading-text -is the text argument to +.I title +is the corresponding argument to .B H -and +or .BR HU . . +. .RS .TP -.BI HX\ "level rlevel heading-text" -This macro is called just before the printing of the heading. -. -The following registers are available for -.BR HX . -. -Note that +.BI HX\~ "declared-level actual-level title" +.I mm +calls .B HX -may alter +before setting the heading. +. +Your definition may alter .BR }0 , .BR }2 , and .BR ;3 . . +. +.\" XXX: These names are ugly and of no obvious meaning. Make +.\" documented aliases for them. .RS .TP -.BR }0\ (string) -Contains the heading mark plus two spaces if -.I rlevel +.BR }0\~ (string) +contains the heading mark plus two spaces if +.I declared-level is non-zero, -otherwise empty. +and otherwise is empty. +. . .TP -.BR ;0\ (register) -Contains the position of the text after the heading. +.BR ;0\~ (register) +encodes a position for the text after the heading. . -0\~means that the text should follow the heading on the same line, -1\~means that a line break should occur before the text, -and 2\~means that a blank line should separate the heading and the text. +0\~means that the heading is to be run in, +1\~means that a break is to occur before the text, +and 2\~means that vertical space is to separate heading and text. . -.TP -.BR }2\ (string) -Contains two spaces if register -.B ;0 -is\~0. . -It is used to separate the heading from the text. +.TP +.BR }2\~ (string) +is the suffix that separates a run-in heading from the text. . -The string is empty if +It contains two spaces if register .B ;0 -is non-zero. +is\~0, +and otherwise is empty. +. . .TP -.BR ;3\ (register) -Contains the needed space in units after the heading. +.BR ;3\~ (register) +contains the vertical space required for the heading to be typeset. . -Default is 2v. +If that amount is not available, +the page is broken prior to the heading. . -Can be used to change things like numbering -.RB ( }0 ), -vertical spacing -.RB ( }2 ), -and the needed space after the heading. +The default is +.BR 2v . .RE . +. .TP -.BI HY\ "dlevel rlevel heading-text" -This macro is called after size and font calculations and -might be used to change indentation. +.BI HY\~ "declared-level actual-level title" +.I mm +calls +.B HY +after determing the heading typeface and size. +. +It could be used to change indentation. +. . .TP -.BI HZ\ "dlevel rlevel heading-text" -This macro is called after the printing of the heading, +.BI HZ\~ "declared-level actual-level title" +.I mm +calls +.B HZ +after formatting the heading, just before .B H or .B HU -exits. +returns. . -Can be used to change the page header according to the section heading. -.RE +It could be used to change the page header to include a section heading. +.\" XXX: ...but only for the _next_ page, not the current one. See +.\" Savannah #62825. .RE . +. .TP .BI HC\ \fR[\fPhyphenation-character\fR]\fP Set hyphenation character. . -Default value is \[oq]\[rs]%\[cq]. +Default value is \[lq]\[rs]%\[rq]. . Resets to the default if called without argument. . -Hyphenation can be turned off by setting number register +Hyphenation can be turned off by setting register .B Hy to\~0 at the beginning of the file. . +. .TP .BI HM\ "\fR[\fParg1 \fR[\fParg2 \fR[.\|.\|.\& [\fParg14\fR]]]]\fP" -Heading mark style. +Set the heading mark style. . -Controls the type of marking for printing of the heading counters. +Each argument assigns the specified register format +(see above) +to the corresponding heading level. . -Default is\~1 for all levels. +The default +.RB is\~ 1 +for all levels. . -.IP -.B Argument +An explicitly empty argument also indicates the default. . -.TS -tab(@); -l l. -1@Arabic numerals. -0001@Arabic numerals with leading zeroes, one or more. -A@upper-case alphabetic -a@lower-case alphabetic -I@upper-case roman numerals -i@lower-case roman numerals -\[dq]\[dq]@Arabic numerals. -.TE . .TP -.BI HU\ heading-text -Unnumbered section header. +.BI HU\~ heading-text +Set an unnumbered section heading. . -.B HU -behaves like -.B H -at the level in number register -.BR Hu . +Except for a heading number, +it is treated as a numbered heading of the level stored in +.RB register\~ Hu ; +.RB see\~ H . . -See\~\c -.BR H . . .TP -.BI HX\ "dlevel rlevel heading-text" -User-defined heading exit. +.BR I \~\c \" space in roman; we must use 2-font macro with \c +.RI [ italic-text\~\c +.RI [ previous-font-text ]]\~.\|.\|. +Join +.I italic-text +in italics with +.I previous-font-text +in the previous font, +without space between the arguments. . -Called just before printing the header. +If no arguments, +switch font to italic style. . -See\~\c -.BR H . . .TP -.BI HY\ "dlevel rlevel heading-text" -User-defined heading exit. +.BR IA \~[\c +.IR recipient-name \~[\c +.IR title ]] +Specify the inside address in a letter. . -Called just before printing the header. +Input is collected into the inside address until +.B IE +is called, +and then output. . -See\~\c -.BR H . +You can specify multiple recipients with empty +.BR IA / IE +pairs; +only the last address is used. . -.TP -.BI HZ\ "dlevel rlevel heading-text" -User-defined heading exit. +The arguments give each recipient a name and title. . -Called just after printing the header. +See +.BR LT . . -See\~\c -.BR H . . .TP -.BI I\ "\fR[\fPitalic-text \fR[\fPprev-font-text \fR[\fPitalic-text \fR[.\|.\|.]]]]\fP" -Italic. +.BR IB \~\c \" space in roman; we must use 2-font macro with \c +.RI [ italic-text\~\c +.RI [ bold-text ]]\~.\|.\|. +Join +.I italic-text +in italics with +.I bold-text +in boldface, +without space between the arguments. . -Changes the font to italic if called without arguments. . -With one argument it sets the word in italic. -. -With two arguments it concatenates them and sets the first -word in italic and the second in the previous font. +.TP +.B IE +End the inside address begun with +.BR IA . . -There is no limit on the number of argument; -all are concatenated. . .TP -.BI IA\ "\fR[\fPaddressee-name \fR[\fPtitle\fR]]\fP" -Begin specification of the addressee and addressee's address in -letter style. +.BI IND\~ argument\~\c +\&.\|.\|. +If the Boolean register +.B Ref +is true, +write an index entry as a specially prepared +.I roff +comment to the standard error stream, +with each +.I argument +separated from its predecessor by a tab character. . -Several names can be specified with empty -.BR IA / IE -pairs, -but only one address. +The entry's location information is arranged as configured by the most +recent +.B INITI +call. . -See -.BR LT . . .TP -.BI IB\ "\fR[\fPitalic-text \fR[\fPbold-text \fR[\fPitalic-text \fR[.\|.\|.]]]]\fP" -Italic-bold. +.B INDP +Output the index set up by +.B INITI +and populated by +.B IND +calls. . -Even arguments are printed in italic, odd in boldface. +By default, +.B INDP +calls +.B SK +and writes a centered caption interpolating the string +.BR Index . +. +It then disables filling and calls +.BR 2C ; +afterward, +it restores filling and calls +.BR 1C . . -See\~\c -.BR I . . -.TP -.B IE -End the address specification after -.BR IA . +.IP +Define macros to customize this behavior. . -.TP -.BI INITI\ "type filename \fR[\fPmacro\fR]\fP" -Initialize the new index system and set the filename to collect index -lines in with -.BR IND . +.B INDP +calls +.B TXIND +before the caption, +.B TYIND +.I instead +of writing the caption, +and +.B TZIND +after formatting the index. . -Argument -.I type -selects the type of index: page number, header marks or both. . -The default is page numbers. +.TP +.BI INITI\~ "location-type file-name\~"\c +.RI [ macro ] +Initialize +.IR "groff mm" 's +indexing system. . -.IP -It is also possible to create a macro that is responsible -for formatting each row; -just add the name of the macro as a third argument. +Argument +.I location-type +selects how the location of each index entry is reported. . -The macro is then called with the index as argument(s). +.I file-name +populates an internal string used later by +.BR INDP . . -.IP -.B type . .IP .TS tab(@); -l lx. -N@Page numbers -H@Header marks -B@T{ -Both page numbers and header marks, -separated with a tab character. -T} +Lf(BI) Lb +L Lx. +location-type@Entry format +N@page number +H@heading mark +B@page number, tab character, heading mark .TE . +. +.IP +If +.I macro +is specified, +it is called for each index entry +with the arguments given to +.BR IND . +. +. .TP -.BI INITR\ filename +.BI INITR\~ id Initialize the cross reference macros. . -Cross references are written to stderr and are supposed to be -redirected into file -.RI filename .qrf . -. -Requires two passes with groff; -this is handled by a separate program called -.BR mmroff (@MAN1EXT@). +Cross references are written to the standard error stream, +which should be redirected into a file named +.RI id .qrf . . -This program exists because -.BR groff (@MAN1EXT@) -by default deactivates the unsafe operations that are required by -.BR INITR . +.MR mmroff @MAN1EXT@ +handles this and the two formatting passes it requires. +.\". +.\"This program exists because +.\".MR groff @MAN1EXT@ +.\"by default deactivates the unsafe operations that are required by +.\".BR INITR . . -The first pass looks for cross references, +The first pass identifies cross references, and the second one includes them. +.\" +.\".B INITR +.\"can be used several times, +.\"but it is only the first occurrence of +.\".B INITR +.\"that is active. . -.B INITR -can be used several times, -but it is only the first occurrence of -.B INITR -that is active. . .IP -See also +See .BR SETR , .BR GETPN , and .BR GETHN . . -.TP -.BI IND\ "arg1 \fR[\fParg2 \fR[.\|.\|.]]\fP" -Write a line in the index file selected by -.B INITI -with all arguments and the page number or header mark separated by tabs. -. -.RS -.IP -.B Examples -. -.IP -arg1\[rs]tpage number -.br -arg1\[rs]targ2\[rs]tpage number -.br -arg1\[rs]theader mark -.br -arg1\[rs]tpage number\[rs]theader mark -.RE . .TP -.B INDP -Print the index by running the command specified by string variable -.BR Indcmd , -which has \[oq]sort\ \-t\[rs]t\[cq] as the default value. +.BR IR \~\c \" space in roman; we must use 2-font macro with \c +.RI [ italic-text\~\c +.RI [ roman-text ]]\~.\|.\|. +Join +.I italic-text +in italics with +.I roman-text +in roman style, +without space between the arguments. . -.B INDP -reads the output from the command to form the index, -by default in two columns (this can be changed by defining -.BR TYIND ). -. -The index is printed with string variable -.B Index -as header, -default is \[oq]INDEX\[cq]. -. -One-column processing is reactivated after the list. -. -.B INDP -calls the user-defined macros -.BR TXIND , -.BR TYIND , -and -.B TZIND -if defined. -. -.B TXIND -is called before printing the string \[oq]INDEX\[cq], -.B TYIND -is called instead of printing \[oq]INDEX\[cq], and -.B TZIND -is called after the printing and should take care of restoring to -normal operation again. . .TP -.B ISODATE \fR[\fP0\fR]\fP -Change the predefined date string in +.BR ISODATE\~ [ 0 ] +Use ISO\~8601 format for the date string .B DT -to ISO-format, this is, \[oq]YYYY-MM-DD\[cq]. -. -This can also be done by adding -.B \-rIso=1 -on the command line. -. -Reverts to old date format if argument is\~\c -.BR 0 . -. -.TP -.BI IR\ "\fR[\fPitalic-text \fR[\fProman-text \fR[\fPitalic-text \fR[.\|.\|.]]]]\fP" -Italic-roman. -. -Even arguments are printed in italic, odd in roman. -. -See\~\c -.BR I . -. -.TP -.BI LB\ "text-indent mark-indent pad type \fR[\fPmark \fR[\fPLI-space \fR[\fPLB-space\fR]]]\fP" -List-begin macro. -. -This is the common macro used for all lists. -. -.I text-indent -is the number of spaces to indent the text from the current indentation. -. -.IP -.I pad +used by some cover sheet and memorandum types; +that is, +.IR YYYY - MM - DD . +. +Must be called before +.B ND +to be effective. +. +If given an argument +.RB of\~ 0, +the traditional date format for the +.I groff +locale is used; +this is also the default. +. +. +.TP +.BI LB\~ "text-indent mark-indent pad type"\~\c +.RI [ mark \~[ pre-item-space \~[ pre-list-space ]]] +Begin list. +. +The macros +.BR AL , +.BR BL , +.BR BVL , +.BR DL , +.BR ML , +.BR RL , and -.I mark-indent -control where to put the mark. +.B VL +call +.B LB +in various ways; +they are simpler to use and may be preferred if they suit the desired +purpose. . -The mark is placed within the mark area, and -.I mark-indent -sets the number of spaces before this area. . -By default it is\~0. +.br +.ne 5v +.IP +The nesting level of lists is tracked by +.I mm; +the outermost level is\~0. . -The mark area ends where the text begins. +The text of each list item is indented by +.I text-indent; +the default is taken from the +.B Li +register +(in ens). . -The start of the text is still controlled by -.IR text-indent . +Each item's mark is indented by +.I mark-indent; +the default is +.BR 0n . . -.IP -The mark is left-justified within the mark area if -.I pad -is\~0. +The mark is normally left-aligned. . If .I pad -is greater than\~0, +is greater than zero, .I mark-indent -is ignored, -and the mark is placed +is overridden such that .I pad -spaces before the text. -. -This right-justifies the mark. -. -.IP -If -.I type -is\~0 the list either has a hanging indentation or, -if argument -.I mark -is given, -the string -.I mark -as a mark. -. -.IP -If -.I type -is greater than\~0 automatic numbering occurs, -using arabic numbers if -.I mark -is empty. +ens of space follow the mark. . -.I mark -can then be any of \[oq]1\[cq], \[oq]A\[cq], \[oq]a\[cq], \[oq]I\[cq], -or \[oq]i\[cq]. -. -.IP .I type selects one of six possible ways to display the mark. . -.IP -.B type . -.RS .IP -.br .TS tab(@); -l l. +Lf(BI) Lb +L L. +type@Output for a mark \[lq]x\[rq] 1@x. 2@x) 3@(x) @@ -1876,284 +2378,386 @@ l l. 5@ 6@{x} .TE -.RE +. . .IP -Every item in the list gets -.I LI-space -number of blank lines before them. +If +.I type +is\~0 and +.I mark +is unspecified, +the items are set with a hanging indent. +. +Otherwise, +.I mark +is interpreted as a string defining the mark. +. +If +.I type +is greater than zero, +items are automatically numbered; +.I mark +is interpreted as a register format. +. +The default +.I type +.RB is\~ 0 . . -Default is\~1. . .IP +The last two arguments manage vertical space. +. +Unless a list's nesting level is greater than the value of register +.BR Ls , +its items are preceded by +.I pre-item-space +multiplied by the register +.BR Lsp ; +the default +.RB is\~ 1 . +. .B LB -itself prints -.I LB-space -blank lines. +precedes the list by +.I pre-list-space +multiplied by the register +.BR Lsp ; +the default +.RB is\~ 0 . . -Default is\~0. . .TP -.BI LC\ \fR[\fPlist-level\fR]\fP -List-status clear. +.BR LC \~[\c +.IR list-level ] +Clear list state. . -Terminates all current active lists down to -.IR list-level , -or\~0 if no argument is given. +Active lists are terminated as if with +.BR LE , +either all +(the default) +or only those from the current level down to +.I list-level +if specified. . -This is used by\~\c .B H -to clear any active list. +calls +.B LC +automatically. +. . .TP -.B LE \fR[\fP1\fR]\fP -List end. +.BR LE \~[ 1 ] +End list. . -Terminates the current list. -.B LE -outputs a blank line if an argument is given. +The current list is terminated. . -.TP -.BI LI\ \fR[\fPmark\ \fR[\fP1\fR|\fP2\fR]]\fP -List item preceding every item in a list. +An argument +.RB of\~ 1 +causes +vertical space in the amount of register +.B Lsp +to follow the list. . -Without argument, -.B LI -prints the mark determined by the current list type. . -By giving -.B LI -one argument, it uses that as the mark instead. +.TP +.BR LI \~[\c +.IR mark \~[ item-mark-mode ]] +Begin a list item. . -Two arguments to +Input is collected into a list item until the current list is terminated +or .B LI -makes -.I mark -a prefix to the current mark. -. -There is no separating space between the prefix and the mark if the -second argument is \[oq]2\[cq] instead of \[oq]1\[cq]. +is called again. . -This behaviour can also be achieved by setting number register -.B Limsp -to zero. +By default, +the item's text is preceded by any mark configured by the current list. . -A zero length +If only .I mark -makes a hanging indentation instead. +is specified, +it replaces the configured mark. . -.IP -A blank line is printed before the list item by default. -. -This behaviour can be controlled by number register -.BR Ls . -. -Pre-spacing occurs for each list level less than or equal to -.BR Ls . +A second argument +prefixes +.I mark +to the configured mark; +an +.I item-mark-mode +value of\~1 places an unbreakable space after +.I mark, +while +a value of\~2 does not +(rendering the two adjacent). . -Default value is 99. +Also see register +.BR Limsp . . -There is no nesting limit. . -.IP -The indentation can be changed through number register -.BR Li . -Default is\~6. +.TP +.BI LO\~ option\~\c +.RI [ value ] +Specify letter options; +see +.BR LT . . -.IP -All lists begin with a list initialization macro, -.BR LB . +Standard options are as follows. . -There are, however, seven predefined list types to make lists easier -to use. +See +.B IA +regarding the inside address and string +.B DT +regarding the date. . -They all call -.B LB -with different default values. . -.RS .IP .TS tab(@); -l l. -\fBAL\fP@Automatically Incremented List -\fBML\fP@Marked List -\fBVL\fP@Variable-Item List -\fBBL\fP@Bullet List -\fBDL\fP@Dash List -\fBRL\fP@Reference List -\fBBVL\fP@Broken Variable List. +Lf(BI) Lb +L Lx. +option@Effect +AT@T{ +Attention; +put contents of string +.B LetAT +and +.I value +left-aligned after the inside address. +T} +CN@T{ +Confidential; +put +.I value, +or contents of string +.BR LetCN , +left-aligned after the date. +T} +RN@T{ +Reference; +put contents of string +.B LetRN +and +.I value +after the confidental notation +(if any) +and the date, +aligned with the latter. +T} +SA@T{ +Salutation; +put +.I value, +or contents of string +.BR LetSA , +left-aligned after the inside address +and the confidental notation +(if any). +T} +SJ@T{ +Subject; +put contents of string +.B LetSJ +and +.I value +left-aligned after the inside address +and the attention and salutation notations +(if any). +. +In letter type \[lq]SP\[rq], +.B LetSJ +is ignored and +.I value +is set in full capitals. +T} .TE -.RE . -.IP -These lists are described at other places in this manual. . -See also -.BR LB . +.br +.ne 5v +.TP +.BR LT \~[\c +.IR style ] +Format a letter in the designated +.I style, +defaulting to +.B BL +(see below). . -.TP -.BI LT\ \fR[\fIarg\/\fR]\fI -Format a letter in one of four different styles depending -on the argument. +A letter begins with the writer's address +.RB ( WA / WE ), +followed by the date +.RB ( ND ), +the inside address +.RB ( IA / IE ), +the body of the letter +.RB ( P +and other general-purpose +.I mm +macros), +the formal closing +.RB ( FC ), +the signature +.RB ( SG ), +and notations +.RB ( NS / NE ). . -Also see section \[lq]Internals\[rq] below. +Any of these may be omitted. . -.RS +Letter options specified with +.B LO +add further annotations, +which are extensible; +see section \[lq]Internals\[rq] below. +. +. +.br +.ne 6v .IP .TS tab(@); -lb lb -l lx. -Arg@Style +Lf(BI) Lb +Lb Lx. +style@Description BL@T{ -Blocked. -Date line, return address, writer's address and closing -begins at the center of the line. +Blocked: +the writer's address, +date, +formal closing, +and signature are indented to the center of the line. . -All other lines begin at the left margin. +Everything else is left-aligned. T} SB@T{ -Semi-blocked. -Same as blocked, -except that the first line in every paragraph is indented five spaces. +Semi-blocked: +as +.BR BL , +but the first line of each paragraph is indented by +.BR 5m . +.\" XXX: https://savannah.gnu.org/bugs/?64315 T} FB@T{ -Full-blocked. -All lines begin at the left margin. +Fully blocked: +everything begins at the left margin. T} SP@T{ -Simplified. -Almost the same as the full-blocked style. -Subject and the writer's identification are printed in all-capital. +Simplified: +as +.BR FB , +but a formal closing is omitted, +and the signature is set in full capitals. T} .TE -.RE . -.TP -.BI LO\ "type \fR[\fParg\fR]\fP" -Specify options in letter (see -.BR .LT ). . -This is a list of the standard options: +.TP +.BI MC\~ column-width\~\c +.RI [ gutter-width ] +Begin multi-column layout. . -.RS -.IP -.TS -tab(@); -l lx. -CN@T{ -Confidential notation. -Prints \[oq]CONFIDENTIAL\[cq] on the second line below the date line. +.I groff mm +creates as many columns of +.I column-width +as the line length will permit. . -Any argument replaces \[oq]CONFIDENTIAL\[cq]. +.I gutter-width +is the interior spacing between columns. . -See also string variable -.BR LetCN . -T} -RN@T{ -Reference notation. -Prints \[oq]In reference to:\[cq] and the argument two lines below the date line. -See also string variable -.BR LetRN . -T} -AT@T{ -Attention. -Prints \[oq]ATTENTION:\[cq] and the argument below the inside address. -See also string variable -.BR LetAT . -T} -SA@T{ -Salutation. -Prints \[cq]To Whom It May Concern:\[cq] or the argument if it was present. -The salutation is printed two lines below the inside address. -See also string variable -.BR LetSA . -T} -SJ@T{ -Subject line. -Prints the argument as subject prefixed with \[oq]SUBJECT:\[cq] -two lines below the inside address, -except in letter type \[oq]SP\[cq], -where the subject is printed in all-capital without any prefix. -See also string variable -.BR LetSJ . -T} -.TE -.RE +It defaults to +.IR column-width /15. . -.TP -.BI MC\ "column-size \fR[\fPcolumn-separation\fR]\fP" -Begin multiple columns. -. -Return to normal with -.BR 1C . +.B 1C +returns to single-column layout. . .B MC -creates as many columns as the current line length permits. -. -.I column-size -is the width of each column, -and -.I column-separation -is the space between two columns. +is a GNU extension. . -Default separation is -.IR column-size /15. +See +.B MULB +for an alternative. . -See also -.BR 1C . . .TP -.BI ML\ "mark \fR[\fPtext-indent\ " \fR[\fP1\fR]]\fP -Marked list start. -. -The +.BI ML\~ "mark \fR[\fPtext-indent\~" \fR[\fP1\fR]]\fP +Start a list with the .I mark -argument is printed before each list item. +argument preceding each list item. . .I text-indent -sets the indent and overrides +overrides the default indentation of the list items set by register .BR Li . . -A third argument prohibits printing of a blank line before each item. +If a third argument, +conventionally +.BR 1 , +is given, +the blank line that normally precedes each list item is suppressed. +. +Use +.B LI +to declare list items, +and +.B LE +to end the list. +. . .TP -.BI MT\ "\fR[\fParg \fR[\fPaddressee\fR]]\fP" -Memorandum type. +.BR MT \~\c \" space in roman; we must use 2-font macro with \c +.RI [ type \~[ addressee ]] +Select memorandum type. . -The argument -.I arg -is part of a filename in -.IR @TMAC_MDIR@/ * .MT . +These correspond to formats used by AT&T Bell Laboratories, +where the +.I mm +package was initially developed, +affecting the document layout. +. +Some of these included a cover page with a caption categorizing the +document. +. +.I groff mm +uses +.I type +to construct the file name +.IR @TMAC_MDIR@/\:\% type \:.MT +and load it with the +.B mso +request. +. +Memorandum types 0 to\~5 are supported; +any other value of +.I type +is mapped to type\~6. . -Memorandum types 0 to\~5 are supported, including type -\[oq]string\[cq] (which gets internally mapped to type\~6). +If +.I type +is omitted, +.B 0 +is implied. . .I addressee -just sets a variable, used in the AT&T macros. +sets a string analogous to one used by AT&T cover sheet macros that are +not implemented in +.IR "groff mm" . . -.IP -.B arg . -.RS .IP .TS tab(@); -l l. -0@Normal memorandum, no type printed. -1@Memorandum with \[oq]MEMORANDUM FOR FILE\[cq] printed. -2@Memorandum with \[oq]PROGRAMMER'S NOTES\[cq] printed. -3@Memorandum with \[oq]ENGINEER'S NOTES\[cq] printed. -4@Released paper style. -5@External letter style. +Lf(BI) Lb +L L. +type@Description +0@normal memorandum; no caption +1@captioned \[lq]MEMORANDUM FOR FILE\[rq] +2@captioned \[lq]PROGRAMMER'S NOTES\[rq] +3@captioned \[lq]ENGINEER'S NOTES\[rq] +4@released paper +5@external letter .TE -.RE +. . .IP -See also -.BR COVER / COVEND , -a more flexible type of front page. +See +.B \%COVER +for a more flexible cover sheet mechanism. +. . .TP .BI MOVE\ "y-pos \fR[\fPx-pos \fR[\fPline-length\fR]]\fP" @@ -2169,133 +2773,154 @@ Use .B PGFORM without arguments to return to normal. . -.TP -.BI MULB\ "cw1 space1 \fR[\fPcw2 space2 \fR[\fPcw3 \fR.\|.\|.]]\fP" -Begin a special multi-column mode. -. -All columns widths must be specified. . -The space between the columns must be specified also. +.TP +.BR MULB \~\c \" space in roman; we must use 2-font macro with \c +.IR "cw1 space1\~" [ "cw2 space2" "] .\|.\|.\~" cwn +Begin alternative multi-column mode. . -The last column does not need any space definition. +All column widths must be specified, +as must the amount of space between each column pair. . -.B MULB -starts a diversion, and -.B MULE -ends the diversion and prints the columns. +The arguments' default scaling unit is +.BR n . . -The unit for the width and space arguments is \[oq]n\[cq], but .B MULB -accepts all normal unit specifications like \[oq]c\[cq] and \[oq]i\[cq]. +uses a diversion and operates in a separate environment. . -.B MULB -operates in a separate environment. . .TP .B MULN -Begin the next column. +Begin next column in alternative column mode. . -This is the only way to switch the column. . .TP .B MULE -End the multi-column mode and print the columns. +End alternative multi-column mode and emit the columns. +. . .TP -.BI nP\ \fR[\fPtype\fR]\fP -Print numbered paragraph with header level two. +.B NCOL +Move to the start of the next column +(only when using +.B 2C +or +.BR MC ). +. +Contrast with +.BR MULN . . -See -.BR .P . . .TP -.B NCOL -Force printing to the next column. +.BR ND \~[\c +.IR arg ] +Set the document's date. +. +.I mm +does not interpret +.IR arg ; +it can be a revision identifier +(or empty). . -Don't use this together with the -.B MUL* -macros, see -.BR 2C . . .TP -.BI NS\ \fR[\fParg\ \fR[\fP1\fR]]\fP -Print different types of notations. +.B NE +End notation begun with +.BR NS ; +filling is enabled. . -The argument selects between the predefined type of notations. . -If the second argument is available, -then the argument becomes the entire notation. +.TP +.BI nP\ \fR[\fPtype\fR]\fP +Begin a numbered paragraph at heading level two. . -If the argument doesn't select a predefined type, -it is printed as \[oq]Copy (\fIarg\/\fP) to\[cq]. +See +.BR P . . -It is possible to add more standard notations, -see the string variables -.B Letns -and -.BR Letnsdef . . -.RS -.IP -.TS -tab(@); -l l. -\fBArg@Notation\fP -\fInone\/\fP@Copy To -\[dq]\[dq]@Copy To -1@Copy To (with att.\&) to -2@Copy To (without att.\&) to -3@Att. -4@Atts. -5@Enc. -6@Encs. -7@Under separate cover -8@Letter to -9@Memorandum to -10@Copy (with atts.\&) to -11@Copy (without atts.\&) to -12@Abstract Only to -13@Complete Memorandum to -14@CC -.TE -.RE +.br +.ne 6v +.TP +.BR NS \~[\c +.IR code \~[\c +.BR 1 ]] +Declare notations, +typically for letters or memoranda, +of the type specified by +.IR code . +. +The text corresponding to +.I code +is output, +and filling is disabled +until +.B NE +is called. +. +Typically, +a list of names or attachments lies within +.BR NS / NE . . -.TP -.BI ND\ new-date -New date. +If +.I code +is absent or does not match one of the values listed under the +.B Letns +string description below, +each line of notations is formatted as +.RI "\[lq]Copy (" line ") to\[rq]." +. +If a second argument, +conventionally +.BR 1 , +is given, +.I code +becomes the entire notation and +.B NE +is not necessary. . -Overrides the current date. +In +.IR "groff mm" , +you can set up further notations to be recognized by +.BR NS ; +see the strings +.B Letns +and +.B Letnsdef +below. . -Date is not printed if -.I new-date -is an empty string. . .TP -.BI OF\ \fR[\fParg\fR]\fP -Odd-page footer, a line printed just above the normal footer. +.BR OF\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +Define the odd-page footer, +which is formatted just above the normal page footer on odd-numbered +pages. . See -.B EF -and .BR PF . . -.IP -This macro defines string +.B OF +defines the string .BR EOPof . . +. .TP -.BI OH\ \fR[\fParg\fR]\fP -Odd-page header, a line printed just below the normal header. +.BR OH\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +Define the odd-page header, +which is formatted just below the normal page header on odd-numbered +pages. . See -.B EH -and .BR PH . . -.IP -This macro defines string +.B OH +defines the string .BR TPoh . . +. .TP .B OP Make sure that the following text is printed at the top of an @@ -2303,52 +2928,70 @@ odd-numbered page. . Does not output an empty page if currently at the top of an odd page. . +. +.br +.ne 4v .TP -.BI P\ \fR[\fPtype\fR]\fP +.BR P \~[\c +.IR type ] Begin new paragraph. . -.BR P \~without -argument produces left\-justified text, -even the first line of the paragraph. +If +.I type +is missing or\~ 0, +.BR P \~sets +the paragraph fully left\-aligned. . -This is the same as setting +A .I type -to\~0. +of\~1 +idents the first line by +.B \[rs][Pi] +ens. . -If the argument is\~1, -the first line of text following\~\c -.B P -is indented by the number of spaces in number register -.BR Pi , -by default\~5. +Set the register +.B Pt +to select a default paragraph indentation style. . -.IP -Instead of giving an argument to\~\c -.B P -it is possible to set the paragraph type in number register -.BR Pt . +The register +.B Ps +controls the vertical spacing between paragraphs. . -Using 0 and\~1 is the same as adding that value to -.BR P . . -A value of\~2 indents all paragraphs, except after headings, lists, -and displays (this value can't be used as an argument to -.B P -itself). +.TP +.B PE +Picture end; +see +.MR @g@pic @MAN1EXT@ . . -.IP -The space between two paragraphs is controlled by number register -.BR Ps , -and is\~1 by default (one blank line). +. +.TP +.BR PF\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +Define the page footer. +. +The footer is formatted at the bottom of each page; +the argument is otherwise as described in +.BR PH . +. +.B PF +defines the string +.BR EOPf . +. +See +.BR EF , +.BR OF , +and +.BR EOP . . .TP .BI PGFORM\ "\fR[\fPlinelength \fR[\fPpagelength \fR[\fPpageoffset\ " \fR[\fP1\fR]]]]\fP Set line length, page length, and/or page offset. . -This macro can be used for special formatting, -like letter heads and other. +This macro can be used for letterheads and similar. . -It is normally the first command in a file, +It is normally the first macro call in a file, though it is not necessary. . .B PGFORM @@ -2368,132 +3011,150 @@ line length, page length, and page offset instead.) . .TP .B PGNH -No header is printed on the next page. +Suppress header on the next page. . -Used to get rid of the header in letters or other special texts. +This macro must be called before any macros that produce output to +affect the layout of the first page. . -This macro must be used before any text to inhibit the page header -on the first page. . .TP -.BI "PIC \fR[\fP\-B\fR] [\fP\-L\fR] [\fP\-C\fR] [\fP\-R\fR] [\fP\-I\ " "n\fR]\fP filename \fR[\fPwidth \fR[\fPheight\fR]]\fP" -Include a PostScript file in the document. -. -The macro depends on -.BR mmroff (@MAN1EXT@) -and -.BR INITR . -. -The arguments -.BR \-L , -.BR \-C , -.BR \-R , +.BR PH\~ [ \[dq]\|\[aq]\c +.IB left \[aq] center \[aq] right \[aq]\|\[dq]\c +] +.RS +Define the page header, +formatted at the top of each page, +as the argument, +where +.IR left , +.IR center , and -.BI \-I\ n -adjust the picture or indent it. +.I right +are aligned to the respective locations on the line. . -With no flag the picture is adjusted to the left. +A +.RB \[lq] % \[rq] +character in +.I arg +is replaced by the page number. . -Adding -.B \-B -draws a box around the picture. +If the argument is absent, +no page header is set. . -The optional -.I width -and -.I height -can also be given to resize the picture. +The default page header is . -.TP -.B PE -Picture end. +.RS +.EX +\[dq]\[aq]\[aq]\- % \-\[aq]\[aq]\[dq] +.EE +.RE . -Ends a picture for -.BR @g@pic (@MAN1EXT@). +which centers the page number between hyphens and formats nothing at the +upper left and right. . -.TP -.BI PF\ \fR[\fParg\fR]\fP -Page footer. -.B PF -sets the line to be printed at the bottom of each page. +Header macros call +.B PX +(if defined) +after formatting the header. . -Empty by default. +.B PH +defines the string +.BR TPh . . See -.B PH -for the argument specification. +.BR EH , +.BR OH , +and +.BR TP . +.RE . -.IP -This macro defines string -.BR EOPf . . .TP -.BI PH\ \fR[\fParg\fR]\fP -Page header, a line printed at the top of each page. -. -The argument should be specified as +.BR PIC \~\c +.RB [ \-B ]\~\c +.RB [ \-C |\c +.BI \-I\~ n\c +.RB | \-L \c +.RB | \-R ]\~\c +.IR file \~[ width \~[ height ]] +Include PostScript document +.IR file . . -.RS -.IP -.RI \[dq]' left-part ' center-part ' right-part '\[dq] -.RE +The optional +.B \-B +argument draws a box around the picture. . -.IP -where -.IR left-part , -.IR center-part , +The optional +.BR \-L , +.BR \-C , +.BR \-R , and -.I right-part -are printed left-justified, centered, and right justified, respectively. -. -Within the argument to -.BR PH , -the character \[oq]%\[cq] is changed to the current page number. +.BI \-I\~ n +arguments align the picture or indent it by +.I n +(assuming a scaling unit of +.BR m ). . -The default argument is +By default, +the picture is left-aligned. . -.RS -.IP -\[dq]''- % -''\[dq] -.RE +Optional +.I width +and +.I height +arguments resize the picture. . -.IP -which gives the page number between two dashes. +Use of this macro requires two-pass processing; +see +.B INITR +and +.MR mmroff @MAN1EXT@ . . -.IP -This macro defines string -.BR TPh . . .TP .B PS -Picture start (from pic). +Picture start; see +.MR @g@pic @MAN1EXT@ . . -Begins a picture for -.BR @g@pic (@MAN1EXT@). . .TP -.B PX -Page header user-defined exit. +.B PY +Picture end with flyback. . -This macro is called just after the printing of the page header in -.I no-space -mode. +Ends a +.MR @g@pic @MAN1EXT@ +picture, +returning the vertical position to where it was prior to the picture. . -.TP -.B R -Roman. +This is a GNU extension. . -Return to roman font, see also\~\c -.BR I . . .TP -.BI RB\ "\fR[\fProman-text \fR[\fPbold-text \fR[\fProman-text \fR[.\|.\|.]]]]\fP" -Roman-bold. +.BR R \~\c \" space in roman; we must use 2-font macro with \c +.RI [ roman-text\~\c +.RI [ previous-font-text ]]\~.\|.\|. +Join +.I roman-text +in roman style with +.I previous-font-text +in the previous font, +without space between the arguments. +. +If no arguments, +switch font to roman style. . -Even arguments are printed in roman, odd in boldface. . -See\~\c -.BR I . +.TP +.BR RB \~\c \" space in roman; we must use 2-font macro with \c +.RI [ roman-text\~\c +.RI [ bold-text ]]\~.\|.\|. +Join +.I roman-text +in roman style with +.I bold-text +in boldface, +without space between the arguments. +. . .TP .BI RD\ "\fR[\fPprompt \fR[\fPdiversion \fR[\fPstring\fR]]]\fP" @@ -2523,126 +3184,177 @@ Ends a reference definition and returns to normal processing. See .BR RS . . +. .TP -.BI RI\ "\fR[\fProman-text \fR[\fPitalic-text \fR[\fProman-text \fR[.\|.\|.]]]]\fP" -Print even arguments in roman, odd in italic. +.BR RI \~\c \" space in roman; we must use 2-font macro with \c +.RI [ roman-text\~\c +.RI [ italic-text ]]\~.\|.\|. +Join +.I roman-text +in roman style with +.I italic-text +in italics, +without space between the arguments. . -See\~\c -.BR I . . .TP -.BI RL\ \fR[\fPtext-indent \fR[\fP1\fR]]\fP -Reference list start. +.BR RL \~[\c +.IR text-indent \~[\c +.BR 1 ]] +Begin reference list. . -Begins a list where each item is preceded with an automatically -incremented number between square brackets. +Each item is preceded by an automatically incremented number between +square brackets; +compare +.BR AL . . .I text-indent changes the default indentation. . -.TP -.BI RP\ "\fR[\fParg1 \fR[\fParg2\fR]]\fP" -Produce reference page. +Use +.B LI +to declare list items, +and +.B LE +to end the list. . -This macro can be used if a reference page is wanted somewhere in the -document. +A second argument, +conventionally +.BR 1 , +suppresses the blank line that normally precedes each list item. . -It is not needed if -.B TC -is used to produce a table of contents. . -The reference page is then printed automatically. +.TP +.BR RP \~\c \" space in roman; we must use 2-font macro with \c +.RI [ suppress-counter-reset \~[ page-ejection-policy ]] +Format a reference page, +listing items accumulated within +.BR RS / RF +pairs. . -.IP -The reference counter is not reset if -.I arg1 -is\~1. +The reference counter is reset unless the first argument +.RB is\~ 1 . . -.IP -.I arg2 -tells -.B RP -whether to eject a page or not. +Normally, +page breaks occur before and after the references are output; +the register +.B Rpe +configures this behavior, +and a second argument overrides its value. . -.IP -.B arg2 +.B TC +calls +.B RP +automatically if references have accumulated. . -.RS -.IP -.TS -tab(@); -l lx. -0@The reference page is printed on a separate page. -1@Do not eject page after the list. -2@Do not eject page before the list. -3@Do not eject page before and after the list. -.TE -.RE . .IP -The reference items are separated by a blank line. +References are list items, +and thus are vertically separated +(see +.BR LB ). . -Setting number register +Setting register .B Ls -to\~0 suppresses the line. +.RB to\~ 0 +suppresses this spacing. . -.IP The string .B Rp -contains the reference page title and is set to \[oq]REFERENCES\[cq] -by default. +contains the reference page caption. . -The number register -.B Rpe -holds the default value for the second argument of -.BR RP ; -it is initially set to\~0. . +.br +.ne 5v .TP -.BI RS\ \fR[\fPstring-name\fR]\fP +.BR RS \~[\c +.IR reference-string ] Begin an automatically numbered reference definition. . -Put the string -.B \[rs]*(Rf +By default, +references are numbered starting at 1; +the number is available in register +.BR :R . +. +Interpolate the string +.B Rf where the reference mark should be and write the reference between .BR RS / RF -at next new line after the reference mark. -. -The reference number is stored in number register -.BR :R . +on an input line after the reference mark. . If -.I string-name -is given, a string with that name is defined and contains the current -reference mark. +.I reference-string +is specified, +.I "groff ms" +also stores the reference mark in a string of that name, +which can be interpolated as +.BI \[rs]*[ reference-string ] +subsequently. . -The string can be referenced as -.BI \[rs]*[ string-name ] -later in the text. . .TP -.BI S\ "\fR[\fPsize \fR[\fPspacing\fR]]\fP" -Set point size and vertical spacing. +.BR S \~[\c +.IR type-size \~[ vertical-spacing ]] +Set type size and vertical spacing. . -If any argument is equal to \[oq]P\[cq], the previous value is used. +Each argument is a +.I groff +measurement, +using an appropriate scaling unit and an optional +.B + +or +.B \- +prefix to increment or decrement the current value. +. +An argument of +.B P +restores the previous value, +.B C +indicates the current value, +and +.B D +requests the default. . -A \[oq]C\[cq] means current value, and \[oq]D\[cq] the default value. +An empty or omitted argument is treated as +.BR P . . -If \[oq]+\[cq] or \[oq]\-\[cq] is used before the value, -the current value is incremented or decremented, respectively. . .TP -.BI SA\ \fR[\fParg\fR]\fP -Set right-margin justification. +.BR SA \~\c +.RI [ mode ] +Set or restore the default enablement of adjustment. +. +Specify +.B 0 +or +.B 1 +as +.I mode +to set a document's default explicitly; +.B 1 +is assumed by +.IR mm . . -Justification is turned on by default. +Adjustment can be temporarily suspended with the +.B na +request. +. +When the +.B H +or +.B HU +macros are used to format a heading, +or when +.B SA +is called without a +.I mode +argument, +the default adjustment is restored. . -No argument or value \[oq]0\[cq] turns off justification, -and \[oq]1\[cq] turns on justification. . .TP .BI SETR\ "refname \fR[\fPstring\fR]\fP" -Remember the current header and page number as +Remember the current heading and page numbers as .IR refname . . Saves @@ -2653,7 +3365,7 @@ is defined. . .I string is retrieved with -.BR .GETST . +.BR GETST . . See .BR INITR . @@ -2669,53 +3381,61 @@ first or last author. . The reference data is the location, department, and initials specified with -.BR .AU . +.BR AU . . It is printed at the first author if the second argument is given, otherwise at the last. . No reference data is printed if the author(s) is specified through -.BR .WA / .WE . +.BR WA / WE . . See section \[lq]Internals\[rq] below. . +. .TP -.BI SK\ \fR[\fPpages\fR]\fP -Skip pages. +.BR SK \~\c +.RI [ n ] +Skip +.I n +pages. . If -.I pages -is\~0 or omitted, a skip to the next page occurs unless it is already -at the top of a page. +.I n +is\~0 or omitted, +the page is broken unless the drawing position is already at the top of +a page. . -Otherwise it skips -.I pages -pages. +Otherwise, +.I n +pages, +blank except for any headers and footers, +are printed. . -.TP -.BI SM\ "string1 \fR[\fPstring2 \fR[\fPstring3\fR]]\fP" -Make a string smaller. . -If -.I string2 -is given, -.I string1 -is made smaller and -.I string2 -stays at normal size, -concatenated with -.IR string1 . +.br +.ne 4v \" XXX: 3v should suffice +.TP +.BI SM\~ text\~\c +.RI [ post ] +.TQ +.BI SM\~ "pre text post" +Format +.I text +at a smaller type size, +joined with any specified +.I pre +and +.I post +at normal size. . -With three arguments, everything is concatenated, but only -.I string2 -is made smaller. . .TP .BI SP\ \fR[\fPlines\fR]\fP Space vertically. . .I lines -can have any scaling factor, like \[oq]3i\[cq] or \[oq]8v\[cq]. +can have any scaling factor, +like \[lq]3i\[rq] or \[lq]8v\[rq]. . Several .B SP @@ -2730,137 +3450,169 @@ before a call to .B SP to avoid this. . +. .TP .B TAB -Reset tabs to every\ 5n. +Reset tab stops to every 5\~ens. . -Normally used to reset any previous tab positions. . +.br +.ne 4v .TP -.BI TB\ "\fR[\fPtitle \fR[\fPoverride \fR[\fPflag \fR[\fPrefname\fR]]]]\fP" -Table title. +.BR TB \~\c +.RI [ title \~[ override \~[ flag \~[ refname ]]]] +Caption a table. . -The arguments are the same as for +Arguments are handled analogously to .BR EC . . -.B TB -uses the number register +The register .B Tb -as a counter. -. -The string -.B Lt -controls the title of the List of Tables; -default value is \[oq]LIST OF TABLES\[cq]. -. -The List of Tables is only printed if number register -.B Lt -is\~1, which is the default. +is the table counter. . The string .B Litb -contains the word \[oq]TABLE\[cq], which is printed before the number. +precedes the table number and any +.I title. . -.IP -Special handling of the title occurs if -.B TB -is used inside -.BR DS / DE , -it is not affected by the format of -.BR DS . -. -.TP -.BI TC\ "\fR[\fPslevel \fR[\fPspacing \fR[\fPtlevel \fR[\fPtab \fR[\fPh1 \fR[\fPh2 \fR[\fPh3 \fR[\fPh4 \fR[\fPh5\fR]]]]]]]]]\fP" -Table of contents. +Table captions are centered irrespective of the alignment of any +enclosing display. . -This macro is normally used as the last line of the document. . -It generates a table of contents with headings up to the level -controlled by number register -.BR Cl . +.IP +Captioned tables are listed in a table of contents +(see +.BR TC ) +if the Boolean register +.B Lt +is true. . -Note that +Such a list uses the string +.B Lt +as a heading. +. +. +.TP +.BR TC \~\c +.RI [ slevel\~\c +.RI [ spacing\~\c +.RI [ tlevel\~\c +.RI [ tab\~\c +.RI [ h1\~\c +.RI [ h2\~\c +.RI [ h3\~\c +.RI [ h4\~\c +.RI [ h5 ]]]]]]]]] +Output table of contents. +. +This macro is normally the last called in the document. +. +It flushes any pending displays and, +if any references are pending +(see +.BR RS ), +calls +.BR RP . +. +It then begins a new page with the contents caption, +stored in the string +.BR Licon , +centered at the top. +. +The entries follow after three vees of space. +. +Each entry is a +saved section +(number and) +heading title +(see the .B Cl -controls the saving of headings, it has nothing to do with -.BR TC . +register), +along with its associated page number. +. +By default, +an entry is indented by an amount corresponding to its heading level +and the maximum heading length encountered at that heading level; +if defined, +the string +.B Ci +overrides these indentations. . -Headings with a level less than or equal to +Entries at heading levels up to and including .I slevel -get +are preceded by .I spacing -number of lines before them. +vees of space. . -Headings with a level less than or equal to +Entries at heading levels up to and including .I tlevel -have their page numbers right\-justified with dots or spaces separating -the text and the page number. +are followed by a leader and a right-aligned page number. . -Spaces are used if +If the Boolean-valued .I tab -is greater than zero, dots otherwise. +argument is true, +the leader is replaced with horizontal motion in the same amount. . -Other headings have the page number directly at the end of the heading -text -.RI ( ragged-right ). +For entries above heading level +.IR tlevel , +the page number follows the heading text after a word space. +. +Each argument +.IR h1 .\|.\|. h5 +appears in order on its own line, +centered, +above the contents caption. +. +Page numbering restarts at 1, +in register format \[lq]i\[rq]. +. +If the +.B Oc +register is true, +numbering of these pages is suppressed. . -.IP -The rest of the arguments is printed, centered, before the table of -contents. . .IP -The user-defined macros -.B TX -and -.B TY -are used if +If .B TC -is called with at most four arguments. -. +is called with at most four arguments, +it calls the user-defined macro .B TX -is called before the printing of the string \[oq]CONTENTS\[cq], +(if defined) +prior to formatting the contents caption, and .B TY -is called instead of printing \[oq]CONTENTS\[cq]. +(if defined) +.I instead +of formatting the contents caption. +. . .IP -Equivalent macros can be defined for list of figures, tables, equations -and exhibits by defining +Analogous handling of lists of figures, +tables, +equations, +and exhibits is achieved by defining .BI TX xx -or -.BI TY xx\fR,\fP +and +.BI TY xx +macros, where .I xx -is \[oq]Fg\[cq], \[oq]TB\[cq], \[oq]EC\[cq], or \[oq]EX\[cq], +is \[lq]FG\[rq], +\[lq]TB\[rq], +\[lq]EC\[rq], +or \[lq]EX\[rq], respectively. . -.IP -String -.B Ci -can be set to control the indentations for each heading-level. -. -It must be scaled, like -. -.RS -.IP -\&.ds Ci .25i .5i .75i 1i 1i -.RE -. -.IP -By default, the indentation is controlled by the maximum length of -headings in each level. -. -.IP -The string variables +Similarly, +the strings .BR Lifg , .BR Litb , .BR Liex , -.BR Liec , and -.B Licon -contain \[oq]Figure\[cq], \[oq]TABLE\[cq], \[oq]Exhibit\[cq], -\[oq]Equation\[cq], and \[oq]CONTENTS\[cq], respectively. +.B Liec +determine captions for their respective lists. . -These can be redefined to other languages. . .TP .B TE @@ -2870,174 +3622,176 @@ See .BR TS . . .TP -.B TH \fR[\fPN\fR]\fP -Table header. +.B TH +End table heading. +. +It is repeated after page breaks within a table. . See .BR TS . . -.B TH -ends the header of the table. -. -This header is printed again if a page break occurs. +The +.B N +argument supported by DWB +.I mm +is not implemented by +.I "groff mm." . -Argument \[oq]N\[cq] isn't implemented yet. . .TP -.BI TL\ "\fR[\fPcharging-case-number \fR[\fPfiling-case-number\fR]]\fP" -Begin title of memorandum. +.BR TL \~[\c +.IR charging-case-number \~[\c +.IR filing-case-number ]] +Begin document title. . -All text up to the next +Input is collected into the title until +.B AF +or .B AU -is included in the title. +is called, +and output as directed by the cover page. . .I charging-case-number and .I filing-case-number -are saved for use in the front page processing. +are saved for use in memorandum types 0 and 5. . -.TP -.BI TM\ "\fR[\fPnum1 \fR[\fPnum2 \fR[.\|.\|.]]]\fP" -Technical memorandum numbers used in -.BR .MT . +See +.BR MT . . -An unlimited number of arguments may be given. . .TP -.B TP -Top-of-page user-defined macro. +.BI TM\~ number\c +\~.\|.\|. +Declare technical memorandum number(s) used by +.BR MT . . -This macro is called instead of the normal page header. . -It is possible to get complete control over the header. -. -Note that the header and the footer are printed in a separate environment. +.br +.ne 6v +.TP +.B TP +If defined, +this macro is called in lieu of normal page header layout. . -Line length is preserved, though. +Headers and footers are formatted in a separate environment. . See .BR EOP . . +. .IP -.B strings available to TP -.RS .TS tab(@); -l l. -TPh@argument of \fBPH\fP -TPeh@argument of \fBEH\fP -TPoh@argument of \fBOH\fP +Cb S +Lb L. +Strings available to TP +_ +TPh@argument to \fBPH\fP +TPeh@argument to \fBEH\fP +TPoh@argument to \fBOH\fP .TE -.RE +. . .TP .B TS \fR[\fPH\fR]\fP Table start. . -This is the start of a table specification to -.BR @g@tbl (@MAN1EXT@). -. -.B TS -ends with -.BR TE . -. -Argument \[oq]H\[cq] tells -.B m@TMAC_M_PREFIX@m -that the table has a header. -. -See -.BR TH . -. -.TP -.B TX -User-defined table of contents exit. -. -This macro is called just before -.B TC -prints the word \[oq]CONTENTS\[cq]. +Argument \[lq]H\[rq] tells +.I mm +that the table has a heading. . See -.BR TC . -. -.TP -.B TY -User-defined table of contents exit. -. -This macro is called instead of printing \[oq]CONTENTS\[cq]. +.BR TE , +.BR TH , +and +.MR @g@tbl @MAN1EXT@ . . -See -.BR TC . . .TP -.BI VERBON\ "\fR[\fPflag \fR[\fPpoint-size \fR[\fPfont\fR]]]\fP" -Begin verbatim output using Courier font. -. -Usually for printing programs. +.BR VERBON \~\c \" space in roman; we must use 2-font macro with \c +.RI [ format \~[ type-size \~[ font ]]] +Begin verbatim display, +where characters have equal width. . -All characters have equal width. +.I format +controls several parameters. . -The point size can be changed with the second argument. +Add up the values of desired features; +the default +.RB is\~ 0 . . -By specifying a third argument it is possible to use another font -instead of Courier. +On typesetting devices, +further arguments configure the +.I type-size +in scaled points, +and the face +.RI ( font ); +the default is +.B CR +(Courier roman). . -.I flag -controls several special features. -. -Its value is the sum of all wanted features. . -.RS .IP .TS tab(@); lb lb l lx. -Arg@Description -1@T{ -Disable the escape character (\[rs]). -This is normally turned on during verbose output. -T} -2@Add an empty line before the verbose text. -4@Add an empty line after the verbose text. +Value@Effect +1@Disable the formatter's escape character (\[rs]). +2@Vertically space before the display. +4@Vertically space after the display. 8@T{ -Print the verbose text with numbered lines. -This adds four digit-sized spaces in the beginning of each line. -Finer control is available with the string variable +Number output lines; call formatter's +.B nm +request with arguments in string .BR Verbnm . -It contains all arguments to the -.BR troff (@MAN1EXT@) -command -.BR .nm , -normally \[oq]1\[cq]. T} 16@T{ -Indent the verbose text by \[oq]5n\[cq]. -. -This is controlled by the number-variable -.B Verbin -(in units). +Indent by the amount stored in register +.BR Verbin . T} .TE -.RE +. . .TP .B VERBOFF -End verbatim output. +End verbatim display. +. . .TP -.BI VL\ "text-indent \fR[\fPmark-indent\ " \fR[\fP1\fR]]\fP -Variable-item list. +.BR VL \~[\c +.IR text-indent \~[ mark-indent \~[\c +.BR 1 ]]] +Begin variable-item +(or \[lq]tagged\[rq]) +list. . -It has no fixed mark, it assumes that every -.B LI -has a mark instead. +Each item should supply its own mark, +or tag. +. +If the mark is wider than +.I mark-indent, +one space separates it from subsequent text; +contrast +.BR BVL . . .I text-indent -sets the indent to the text, and +sets the indentation of the text, +and .I mark-indent -the distance from the current indentation to the mark. +the distance from the current list indentation to the mark. +. +A third argument suppresses the blank line that normally precedes each +list item. +. +Use +.B LI +to declare list items, +and +.B LE +to end the list. . -A third argument prohibits printing of a blank line before each item. . .TP .BI "VM \fR[\fP\-T\fR] [\fP" "top \fR[\fPbottom\fR]]\fP" @@ -3057,7 +3811,8 @@ and .IR bottom . . If no argument is given, reset the margin to zero, or to the default -(\[oq]7v 5v\[cq]) if +(\[lq]7v 5v\[rq]) +if .B \-T is used. . @@ -3069,77 +3824,183 @@ are defined if using .B \-T and setting top and/or bottom margin to less than the default. . +This undocumented DWB +.I mm +macro is exposed by +.I groff mm +to increase user control of page layout. +. +. .TP -.BI WA\ "\fR[\fPwriter-name \fR[\fPtitle\fR]]\fP" -Begin specification of the writer and writer's address. +.BR WA \~[\c +.IR writer's-name \~[\c +.IR title ]] +Specify the writer(s) of an +.B LT +letter. +. +Input is collected into the writer's address until +.B WA +is called, +and then output. . -Several names can be specified with empty +You can specify multiple writers with empty .BR WA / WE -pairs, but only one address. +pairs; +only the last address is used. +. +The arguments give each writer a name and title. . -.TP -.B WE -End the address specification after -.BR .WA . . .TP -.BI WC\ "\fR[\fPformat1\fR] [\fPformat2\fR] [.\|.\|.]\fP" -Footnote and display width control. +.BR WC \~[\c +.IR format \~.\|.\|.] +Control width of footnotes and displays. +. . +.IP .RS .TS tab(@); -l lx. +Lf(BI) Lb +Lb Lx. +format@Effect N@T{ -Set default mode which is equal to using the options -.BR \-WF , -.BR \-FF , -.BR \-WD , -and -.BR FB . +equivalent to +.RB \[lq] "\-WF \-FF \-WD" \[rq] +.\" FB \" XXX: see Savannah ticket reference below +(default) T} WF@T{ -Wide footnotes, wide also in two-column mode. +set footnotes at full line length, +even in two-column mode +.\" XXX: what about multi-column modes more generally? +T} +\-WF@T{ +set footnotes using column line length T} --WF@Normal footnote width, follow column mode. FF@T{ -All footnotes gets the same width as the first footnote encountered. +apply width of first footnote to encountered to subsequent ones T} --FF@T{ -Normal footnotes, width follows \fBWF\fP and \fB-WF\fP. +\-FF@T{ +footnote width determined by +.B WF +and +.B \-WF T} WD@T{ -Wide displays, wide also in two-column mode. -T} --WD@T{ -Normal display width, follow column mode. -T} -FB@T{ -Floating displays generates a line break when printed on the current -page. +set displays at full line length, +even in two-column mode +.\" XXX: what about multi-column modes more generally? T} --FB@T{ -Floating displays does not generate line break. +\-WD@T{ +set displays using column line length T} .TE .RE +.\" XXX: See . +.\"FB@T{ +.\"Break when outputting floating displays. +.\"T} +.\"\-FB@T{ +.\"Do not break when outputting floating displays. +.\"T} +. +. +.TP +.B WE +End the writer's address begun with +.BR WA . . . +.br +.ne 4v .\" ==================================================================== -.SS "Strings used in m@TMAC_M_PREFIX@m" +.SH Strings .\" ==================================================================== . +Many +.I mm +strings interpolate predefined, +localizable text. +. +These are presented in quotation marks. +. +. .TP .B App -A string containing the word \[oq]APPENDIX\[cq]. +\[lq]APPENDIX\[rq] +. . .TP .B Apptxt -The current appendix text. +stores the +.I title +argument to the last +.B APP +call. +. +. +.TP +.B BU +interpolates a bullet +(see +.BR BL ). +. +. +.TP +.B Ci +is a list of indentation amounts to use for table of contents heading +levels, +overriding their automatic computation. +. +Each word must be a horizontal measurement +(like +.RB \[lq] 1i \[rq]) +and is mapped one-to-one to heading levels 1, +2, +and so on. +. +. +.TP +.B DT +The date; +set by the +.B ND +macro +(defaults to the date the document is formatted). +. +The format is the conventional one for the +.I groff +locale, +but see the +.B ISODATE +macro and +.B Iso +register. +. . .TP .B EM -Em dash string +interpolates an em dash. +. +. +.TP +.B F +interpolates an automatically numbered footnote marker; +the number is used by the next +.B FS +call without an argument. +. +In +.I troff +mode, +the marker is superscripted; +in +.I nroff +mode, +it is surrounded by square brackets. +. . .TP .B H1txt @@ -3151,191 +4012,268 @@ to the current heading text. . Also updated in table of contents & friends. . +. .TP .B HF -Font list for headings, \[oq]2 2 2 2 2 2 2\[cq] by default. +assigns font identifiers, +separated by spaces, +to heading levels in one-to-one correspondence. +. +Each identifier may be a font mounting position, +font name, +or style name. +. +Omitted values are assumed to be\~1. +. +The default is +.RB \[lq] "2 2 2 2 2 2 2 2 2 2 2 2 2 2" \[rq], +which places all headings in italics. +. +DWB +.IR mm 's +default was +.RB \[lq] "3 3 2 2 2 2 2" \[rq]. . -Non-numeric font names may also be used. . .TP .B HP -Point size list for headings. +assigns type sizes, +separated by spaces, +to heading levels in one-to-one correspondence. +. +Each size is interpreted in scaled points; +zero values are translated to +.BR 10 . +. +Omitted values are assumed to be\~0 +(and are translated accordingly). +. +The default is +.RB \[lq] "0 0 0 0 0 0 0 0 0 0 0 0 0 0" \[rq]. . -By default, this is \[cq]0 0 0 0 0 0 0\[cq] which is the same as \[oq]10 -10 10 10 10 10 10\[cq]. . .TP .B Index -Contains the string \[oq]INDEX\[cq]. +\[lq]INDEX\[rq] +. . .TP -.B Indcmd -Contains the index command. +.B Le +\[lq]LIST OF EQUATIONS\[rq] . -Default value is \[oq]sort\ \-t\[rs]t\[cq]. . .TP -.B Lifg -String containing \[oq]Figure\[cq]. +.B Letfc +\[lq]Yours very truly,\[rq] +(see +.BR FC ) . -.TP -.B Litb -String containing \[oq]TABLE\[cq]. . .TP -.B Liex -String containing \[oq]Exhibit\[cq]. +.B Letapp +\[lq]APPROVED:\[rq] +(see +.BR AV ) . -.TP -.B Liec -String containing \[oq]Equation\[cq]. . .TP -.B Licon -String containing \[oq]CONTENTS\[cq]. +.B LetAT +\[lq]ATTENTION:\[rq] +(see +.BR LO ) . -.TP -.B Lf -Contains the string \[oq]LIST OF FIGURES\[cq]. . .TP -.B Lt -Contains the string \[oq]LIST OF TABLES\[cq]. +.B LetCN +\[lq]CONFIDENTIAL\[rq] +(see +.BR LO ) +. . .TP -.B Lx -Contains the string \[oq]LIST OF EXHIBITS\[cq]. +.B Letdate +\[lq]Date\[rq] +(see +.BR AV ) +. . .TP -.B Le -Contains the string \[oq]LIST OF EQUATIONS\[cq]. +.B Letns +is a group of strings structuring the notations produced by +.BR NS . +. +If the +.I code +argument to +.B NS +has no corresponding string, +the notation is included between parentheses, +prefixed with +.BR Letns!copy , +and suffixed with +.BR Letns!to . +. +Observe the spaces after \[lq]Copy\[rq] and before \[lq]to\[rq]. +. +. +.RS +.P +.TS +tab(@); +Lb Lb Lb +L L L. +NS code@String@Contents +0@Letns!0@Copy to +1@Letns!1@Copy (with att.\&) to +2@Letns!2@Copy (without att.\&) to +3@Letns!3@Att. +4@Letns!4@Atts. +5@Letns!5@Enc. +6@Letns!6@Encs. +7@Letns!7@Under separate cover +8@Letns!8@Letter to +9@Letns!9@Memorandum to +10@Letns!10@Copy (with atts.\&) to +11@Letns!11@Copy (without atts.\&) to +12@Letns!12@Abstract Only to +13@Letns!13@Complete Memorandum to +14@Letns!14@CC +\[em]@Letns!copy@Copy \fI(with trailing space)\fP +\[em]@Letns!to@ to \fI(note leading space)\fP +.TE +.RE +. . .TP -.B Letfc -Contains the string \[oq]Yours very truly,\[cq], -used in -.BR .FC . +.B Letnsdef +Select the notation format used by +.B NS +when it is given no argument. +. +The default is +.RB \[lq] 0 \[rq]. +. . .TP -.B Letapp -Contains the string \[oq]APPROVED:\[cq], -used in -.BR .AV . +.B LetRN +\[lq]In reference to:\[rq] +(see +.BR LO ) +. . .TP -.B Letdate -Contains the string \[oq]Date\[cq], -used in -.BR .AV . +.B LetSA +\[lq]To Whom It May Concern:\[rq] +(see +.BR LO ) +. . .TP -.B LetCN -Contains the string \[oq]CONFIDENTIAL\[cq], -used in -.BR ".LO CN" . +.B LetSJ +\[lq]SUBJECT:\[rq] +(see +.BR LO ) +. . .TP -.B LetSA -Contains the string \[oq]To Whom It May Concern:\[cq], -used in -.BR ".LO SA" . +.B Lf +\[lq]LIST OF FIGURES\[rq] +. . .TP -.B LetAT -Contains the string \[oq]ATTENTION:\[cq], -used in -.BR ".LO AT" . +.B Licon +\[lq]CONTENTS\[rq] +. . .TP -.B LetSJ -Contains the string \[oq]SUBJECT:\[cq], -used in -.BR ".LO SJ" . +.B Liec +\[lq]Equation\[rq] +. . .TP -.B LetRN -Contains the string \[oq]In reference to:\[cq], -used in -.BR ".LO RN" . +.B Liex +\[lq]Exhibit\[rq] +. . .TP -.B Letns -is an array containing the different strings used in -.BR .NS . +.B Lifg +\[lq]Figure\[rq] . -It is really a number of string variables prefixed with -.BR Letns! . . -If the argument doesn't exist, it is included between -.B () -with -.B Letns!copy -as a prefix and -.B Letns!to -as a suffix. +.TP +.B Litb +\[lq]TABLE\[rq] . -Observe the space after \[oq]Copy\[cq] and before \[oq]to\[cq]. . -.RS -.IP -.TS -tab(@); -lb lb -l l. -Name@Value -Letns!0@Copy to -Letns!1@Copy (with att.\&) to -Letns!2@Copy (without att.\&) to -Letns!3@Att. -Letns!4@Atts. -Letns!5@Enc. -Letns!6@Encs. -Letns!7@Under separate cover -Letns!8@Letter to -Letns!9@Memorandum to -Letns!10@Copy (with atts.\&) to -Letns!11@Copy (without atts.\&) to -Letns!12@Abstract Only to -Letns!13@Complete Memorandum to -Letns!14@CC -Letns!copy@Copy \fI(with trailing space)\fP -Letns!to@ to \fI(note leading space)\fP -.TE -.RE +.TP +.B Lt +\[lq]LIST OF TABLES\[rq] +. . .TP -.B Letnsdef -Define the standard notation used when no argument is given to -.BR .NS . +.B Lx +\[lq]LIST OF EXHIBITS\[rq] . -Default is\~0. . .TP -.B "MO1 \(en MO12" -Strings containing the month names \[oq]January\[cq] through -\[oq]December\[cq]. +.BR MO1 \|.\|.\|.\| MO12 +\[lq]January\[rq] through \[lq]December\[rq] +. . .TP .B Qrf -String containing \[oq]See chapter \[rs]\[rs]*[Qrfh], page -\[rs]\[rs]n[Qrfp].\[cq]. +\[lq]See chapter \[rs]\[rs]*[Qrfh], +page \[rs]\[rs]n[Qrfp].\[rq] +. +. +.TP +.B Rf +interpolates an automatically numbered reference mark; +the number is used by the next +.B RS +call. +. +In +.I troff +mode, +the marker is superscripted; +in +.I nroff +mode, +it is surrounded by square brackets. +. . .TP .B Rp -Contains the string \[oq]REFERENCES\[cq]. +\[lq]REFERENCES\[rq] +. +. +. +.TP +.B Sm +interpolates +.if c \[u2120] \[u2120], +the service mark sign. +. . .TP .B Tcst -Contains the current status of the table of contents and list of -figures, etc. +interpolates an indicator of the +.B TC +macro's processing status. . -Empty outside of -.BR .TC . +If +.B TC +is not operating, +it is empty. +. +User-defined +.B TP +or +.B EOP +macros might condition page headers or footers on its contents. . -Useful in user-defined macros like -.BR .TP . . -.RS .IP .TS tab(@); @@ -3349,594 +4287,1029 @@ ec@List of equations ex@List of exhibits ap@Appendix .TE -.RE +. . .TP .B Tm -Contains the string \[oq]\[rs](tm\[cq], the trade mark symbol. +interpolates +.if c \[tm] \[tm], +the trade mark sign. +. . .TP .B Verbnm -Argument to -.B .nm -in the -.B .VERBON -command. +supplies argument(s) to the +.B nm +request employed by the +.B VERBON +macro. . -Default is\~1. +The default is\~\[lq]1\[rq]. . . +.br +.ne 4v .\" ==================================================================== -.SS "Number variables used in m@TMAC_M_PREFIX@m" +.SH Registers .\" ==================================================================== . +Default register values, +where meaningful, +are shown in parentheses. +. +Many are also marked as Boolean-valued, +meaning that they are considered \[lq]true\[rq] +(on, +enabled) +when they have a positive value, +and \[lq]false\[rq] +(off, +disabled) +otherwise. +. +. .TP -.B Aph -Print an appendix page for every new appendix if this number variable -is non-zero. +.B .mgm +indicates that +.I groff mm +is in use +(Boolean-valued; +.BR 1 ). . -No output occurs if +. +.TP +.B :p +is an auto-incrementing footnote counter; +see +.BR FS . +. +. +.TP +.B :R +is an auto-incrementing reference counter; +see +.BR RS . +. +. +.TP .B Aph -is zero, but there is always an appendix entry in the \[oq]List of -contents\[cq]. +formats an appendix heading +(and title, +if supplied); +see +.B APP +(Boolean-valued; +.BR 1 ). +. +. +.TP +.B Au +includes supplemental author information +(the third and subsequent arguments to +.BR AU ) +in memorandum \[lq]from\[rq] information; +see +.B COVER +and +.B MT +(Boolean-valued; +.BR 1 ). +. . .TP .B Cl -Contents level (in the range 0 to 14). +sets the threshold for inclusion of headings in a table of contents. +. +Headings at levels above this value are excluded; +see +.B H +and +.B TC +.RB ( 2 ). . -The contents is saved if a heading level is lower than or equal to the -value of -.BR Cl . +The +.B Cl +register controls whether a heading is +.I saved +for output in the table of contents at the time +.B H +or +.B HU +is called; +if you change +.BR Cl 's +value immediately prior to calling +.BR TC , +you are unlikely to get the result you want. . -Default is\~2. . .TP .B Cp -Eject page between list of table, list of figure, etc., if the value of -.B Cp -is zero. +suppresses page breaks before lists of captioned +equations, +exhibits, +figures, +and tables, +and before an index; +see +.BR EC , +.BR EX , +.BR FG , +.BR TB , +and +.B INDP +(Boolean-valued; +.\" DWB 3.3's manual said this was 1, but the code said 0. +.BR 0 ). . -Default is\~0. . .TP .B D -Debug flag. +produces debugging information for the +.I mm +package on the standard error stream. . -Values greater than zero produce debug information of increasing -verbosity. +A value of\~0 outputs nothing; +1\~reports formatting progress. . -A value of\~1 gives information about the progress of formatting. +Higher values communicate internal state information of increasing +verbosity +.RB ( 0 ). . -Default is\~0. . .TP .B De -If set to\~1, eject after floating display is output. +causes a page break after a floating display is output; +see +.B DF +(Boolean-valued; +.BR 0 ). . -Default is\~0. . .TP -.B Dsp -If defined, it controls the space output before and after static -displays. +.B Df +configures the behavior of +.BR DF . . -Otherwise the value of -.B Lsp -is used. +The following values are recognized; +4 and 5 do not override the +.B De +register +.RB ( 5 ). . -.TP -.B Df -Control floating keep output. . -This is a number in the range 0 to 5, with a default value of\~5. +.IP +.TS +tab(@); +Lb Lb +L Lx. +Value@Effect +0@T{ +Flush pending displays +at the end of each section +when section-page numbering is active, +otherwise at the end of the document. +T} +1@T{ +Flush a pending display +on the current page or column +if there is enough space, +otherwise at the end of the document. +T} +2@T{ +Flush one pending display +at the top of each page or column. +T} +3@T{ +Flush a pending display +on the current page or column +if there is enough space, +otherwise at the top of the next. +T} +4@T{ +Flush as many pending displays +as possible in a new page or column. +T} +5@T{ +Fill columns or pages with flushed displays +until none remain. +T} +.TE . -See -.BR .DF . . .TP .B Ds -If set to\~1, use the amount of space stored in register +puts vertical space in the amount of register +.B Dsp +(if defined) or .B Lsp -before and after display. +before and after each static display; +see +.B DS +(Boolean-valued; +.BR 1 ). +. +. +.TP +.B Dsp +configures the amount of vertical space placed +before and after static displays; +see +.B DS +and register +.B Ds +.RI ( undefined ). +. +. +.TP +.B Ec +is an auto-incrementing equation counter; +see +.BR EC . . -Default is\~1. . .TP .B Ej -If set to\~1, eject page before each first-level heading. +sets the threshold for page breaks (ejection) prior to the format of +headings. +. +Headings at levels above this value are set on the same page and column +if possible; +see +.B H +.RB ( 0 ). . -Default is\~0. . .TP .B Eq -Equation labels are left-adjusted if set to\~0 and right-adjusted if -set to\~1. +aligns an equation label to the left of a display instead of the right +(Boolean-valued; +.BR 0 ). +. +. +.TP +.B Ex +is an auto-incrementing exhibit counter; +see +.BR EX . +. +. +.TP +.B Fg +is an auto-incrementing figure counter; +see +.BR FG . . -Default is\~0. . .TP .B Fs -Footnote spacing. +is multiplied by register +.B Lsp +to vertically separate footnotes; +see +.B FS +.RB ( 1 ). . -Default is\~1. . .TP -.B "H1 \(en H7" -Heading counters +.BR H1 \|.\|.\|.\| H14 +are auto-incrementing counters corresponding to each heading level; +see +.BR H . . +. +.\" XXX: This could be generalized to an "Hdot" threshold register with +.\" a default of 2. .TP .B H1dot -Append a dot after the level-one heading number if value is greater -than zero. +appends a period to the number of a level one heading; +see +.B H +(Boolean-valued; +.BR 1 ). . -Default is\~1. . +.\" XXX: This may be insufficiently general; see Savannah #62825. .TP .B H1h -A copy of number register -.BR H1 , -but it is incremented just before the page break. +is a copy of +A copy of register +.RB register\~ H1 , +but it is incremented just before a page break. +. +This can be useful in user-defined macros; +see +.B H +and +.BR HX . . -Useful in user-defined header macros. . .TP .B Hb -Heading break level. +sets the threshold for breaking the line after formatting a heading. . -A number in the range 0 to 14, with a default value of\~2. +Text after headings at levels above this value are set on the same +output line if possible; +see +.B H +.RB ( 2 ). . -See\~\c -.BR .H . . .TP .B Hc -Heading centering level. +sets the threshold for centering a heading. . -A number in the range 0 to 14, with a default value value of\~0. +Headings at levels above this value use the prevailing alignment +(that is, +they are not centered); +see +.B H +.RB ( 0 ). . -See\~\c -.BR .H . . .TP .B Hi -Heading temporary indent. +configures the indentation of text after headings. +. +It does not affect \[lq]run-in\[rq] headings. +. +The following values are recognized; +see +.B H +and +.B P +.RB ( 1 ). . -A number in the range 0 to 2, with a default value of\~1. . -.RS .IP .TS tab(@); -l lx. -0@no indentation, left margin -1@T{ -indent to the right, similar to -.RB \[oq] ".P 1" \[cq] -T} -2@T{ -indent to line up with text part of preceding heading -T} +Lb Lb +L Lx. +Value@Effect +0@no indentation +1@indent per the paragraph type +2@indent to align with heading title .TE -.RE +. . .TP .B Hps -Heading pre-space level. +sets the heading level threshold for application of preceding vertical +space; +see +.BR H . . -If the heading level is less than or equal to -.BR Hps , -two lines precede the section heading instead of one. +Headings at levels above the value in register +.B Hps +use the amount of space in register +.BR Hps1 ; +otherwise that in +.BR Hps2 . . -Default is first level only. +The value of +.B Hps +should be strictly greater than that of +.B Ej +.RB ( 1 ). . -The real amount of lines is controlled by the variables -.B Hps1 -and -.BR Hps2 . . .TP .B Hps1 -Number of lines preceding -.B .H -if the heading level is greater than -.BR Hps . +configures the amount of vertical space preceding a heading above the +.B Hps +threshold; +see +.B H +.RI ( troff +devices: +.BR 0.5v ; +.I nroff +devices: +.BR 1v ). . -Value is in units, default is 0.5. . .TP .B Hps2 -Number of lines preceding -.B .H -if the heading level is less than or equal to -.BR Hps . +configures the amount of vertical space preceding a heading at or below +the +.B Hps +threshold; +see +.B H +.RI ( troff +devices: +.BR 1v ; +.I nroff +devices: +.BR 2v ). . -Value is in units, default is\~1. . .TP .B Hs -Heading space level. +sets the heading level threshold for application of succeeding vertical +space. . -A number in the range 0 to 14, with a default value of\~2. +If the heading level is greater than +.BR Hs , +the heading is followed by vertical space in the amount of +.RB register\~ Hss ; +see +.B H +.RB ( 2 ). . -See\~\c -.BR .H . . .TP .B Hss -Number of lines following -.B .H -if the heading level is less than or equal to -.BR Hs . +is multiplied by register +.B Lsp +to produce vertical space after headings above the +threshold in +.RB register\~ Hs ; +see +.B H +.RB ( 1 ). . -Value is in units, default is\~1. . .TP .B Ht -Heading numbering type. +suppresses output of heading level counters above the lowest when the +heading is formatted; +see +.B H +(Boolean-valued; +.BR 0 ). +. . -.RS -.IP -.TS -tab(@); -l l. -0@multiple levels (1.1.1, 1.1.2, etc.) -1@single level -.TE -.RE -.IP -Default is\~0. . .TP .B Hu -Unnumbered heading level. +sets the heading level used by unnumbered headings; +see +.B HU +.RB ( 2 ). . -Default is\~2. . .TP .B Hy -Hyphenation status of text body. -. -.RS -.IP -.TS -7tab(@); -l l. -0@no hyphenation -1@hyphenation on, set to value\~6 -.TE -.RE +enables automatic hyphenation of words +(Boolean-valued; +.BR 0 ). . -.IP -Default is\~0. . .TP .B Iso -Set this variable to\~1 on the command line to get an ISO-formatted -date string (\fB\-rIso=1\fP). +configures the use of ISO\~8601 date format +if specified +(with any value) +on the command line; +see +.BR ISODATE . +. +The default is determined by localization files. . -Useless inside of a document. . .TP .B L -Page length, only for command-line settings. +defines the page length for the document, +and must be set from the command line. . -.TP -.B Letwam -Maximum lines in return-address, used in -.BR .WA / .WE . +A scaling unit should be appended. +. +The default is that of the selected +.I groff +output device. . -Default is\~14. . .TP -.BR Lf ,\ Lt ,\ Lx ,\ Le -Enable (1) or disable (0) the printing of List of figures, +.B Le +.TQ +.B Lf +.TQ +.B Lt +.TQ +.B Lx +configure the report of lists of equation, +figure, +table, +and exhibit captions, +respectively, +after a table of contents; +see +.B TC +(Boolean-valued; +.BR Le :\~ 0 ; +.BR Lf , +.BR Lt , +.BR Lx :\~ 1 ). +. . -List of tables, List of exhibits and List of equations, respectively. +.\" XXX: What is the rationale for this feature? +.TP +.B Letwam +sets the maximum number of input lines permitted in a writer's address; +see +.B WA +and +.B WE +.RB ( 14 ). . -Default values are Lf=1, Lt=1, Lx=1, and Le=0. . .TP .B Li -List indentation, used by -.BR .AL . +configures the amount of indentation in ens applied to list items; +see +.B LI +.RB ( 6 ). . -Default is\~6. . .TP .B Limsp -A flag controlling the insertion of space between prefix and mark in -automatic lists -.RB ( .AL ). +inserts a space between the prefix and the mark +in automatically numbered lists; +see +.B AL +(Boolean-valued; +.BR 1 ). . -.RS -.IP -.TS -tab(@); -l l. -0@no space -1@emit space -.TE -.RE . .TP .B Ls -List space threshold. +sets a threshold for placement of vertical space before list items. . -If current list level is greater than -.B Ls -no spacing occurs around lists. +If the list nesting level is greater than this value, +no such spacing occurs; +see +.B LI +.RB ( 99 ). . -Default is\~99. . .TP .B Lsp -The vertical space used by an empty line. +configures the base amount of vertical space used for separation +in the document. +. +.I mm +applies this spacing to many contexts, +sometimes with multipliers; +see +.BR DS , +.BR FS , +.BR H , +.BR LI , +and +.B P +.RI ( troff +devices: +.BR 0.5v ; +.I nroff +devices: +.BR 1v ). . -The default is 0.5v in troff mode and 1v in nroff mode. . .TP .B N -Page numbering style. -. -.RS -.IP -.TS -tab(@); -l lx. -0@normal header for all pages. -1@T{ -header replaces footer on first page, header is empty. -T} -2@page header is removed on the first page. -3@\[oq]section-page\[cq] numbering style enabled. -4@page header is removed on the first page. -5@T{ -\[oq]section-page\[cq] and \[oq]section-figure\[cq] numbering style enabled. -T} -.TE -.RE +configures the header and footer placements used by +.BR PH . . -.IP -Default is\~0. +The default footer is empty. . -See also the number registers +If \[lq]section-page\[rq] numbering is selected, +the default header becomes empty +and the default footer becomes +.RI \[lq] x - y \[rq], +where +.IR x \~is +is the section number +(the number of the current first-level heading) +.RI and\~ y +the page number within the section. +.\" XXX: section-figure numbering needs more documentation. +. +The following values are recognized; +for finer control, +see +.BR PH , +.BR PF , +.BR EH , +.BR EF , +.BR OH , +and +.BR OF , +and registers .B Sectf and .BR Sectp . . -.TP -.B Np -A flag to control whether paragraphs are numbered. +Value 5 is a GNU extension +.RB ( 0 ). +. . -.RS .IP .TS tab(@); -l l. -0@not numbered -1@numbered in first-level headings. +Lb Lb +L Lx. +Value@Effect +0@Set header on all pages. +1@Move header to footer on page 1. +2@Omit header on page 1. +3@Use \[lq]section-page\[rq] numbering style on all pages. +4@Omit header on all pages. +5@T{ +Use \[lq]section-page\[rq] and \[lq]section-figure\[rq] \ +numbering style on all pages. +T} .TE -.RE . -.IP -Default is\~0. +. +.TP +.B Np +causes paragraphs after first-level headings (only) to be numbered +in the format +.IR s . p , +where +.IR s \~is +is the section number +(the number of the current first-level heading) +and +.IR p \~is +the paragraph number, +starting at 1; +see +.B H +and +.B P +(Boolean-valued; +.BR 0 ). +. . .TP .B O -Page offset, only for command-line settings. +defines the page offset of the document, +and must be set from the command line. +. +A scaling unit should be appended. +. +The default +.RB is\~ \&.75i +on terminal devices. +. +On typesetters, +it is +.B \&.963i +or set to +.B 1i +by the +.I papersize.tmac +package; +see +.MR groff_tmac @MAN5EXT@ . +. +. +.TP +.B Oc +suppresses the appearance of page numbers in the table of contents; +see +.B TC +(Boolean-valued; +.BR 0 ). +. . +.\" XXX: This really should just be a string, shouldn't it? .TP .B Of -Format of figure, table, exhibit, and equation titles. +selects a separator format within equation, +exhibit, +figure, +and table captions; +see +.BR EC , +.BR EX , +.BR FG , +and +.BR TB . +. +The following values are recognized; +the spaces shown are unpaddable +.RB ( 0 ). +. . -.RS .IP .TS tab(@); -l l. -0@\[dq]. \[dq] -1@\[dq] - \[dq] +Lb Lb +L Lx. +Value@Effect +0@\[dq]. \[dq] +1@\[dq] \[em] \[dq] .TE -.RE . -.IP -Default is\~0. . .TP .B P -Current page-number, normally the same as \[oq]%\[cq] unless -\[oq]section-page\[cq] numbering style is enabled. +interpolates the current page number; +it is the same as +.RB register\~ % +except when +\[lq]section-page\[rq] numbering is enabled. +. . .TP .B Pi -Paragraph indentation. +configures the amount of indentation in ens applied to the first line of +a paragraph; +see +.B P +.RB ( 5 ). . -Default is\~5. . .TP .B Pgps -A flag to control whether header and footer point size should follow -the current settings or just change when the header and footer are -defined. +causes the type size and vertical spacing set by +.B S +to apply to headers and footers, +overriding the +.B HP +string. . -.RS -.IP -.TS -tab(@); -l lx. -0@T{ -Point size only changes to the current setting when -.BR .PH , -.BR .PF , -.BR .OH , -.BR .EH , -.BR .OF , +If not set, +.B S +calls affect headers and footers only when followed by +.BR PH , +.BR PF , +.BR OH , +.BR EH , +.BR OF , or -.B .OE -is executed. -T} -1@T{ -Point size changes after every -.BR .S . -This is the default. -T} -.TE -.RE +.B OE +calls +(Boolean-valued; +.BR 1 ). +. . .TP .B Ps -Paragraph spacing. -Default is\~1. +is multiplied by register +.B Lsp +to vertically separate paragraphs; +see +.B P +.RB ( 1 ). +. . .TP .B Pt -Paragraph type. +determines when a first-line indentation is applied to a paragraph; +see +.B P +.RB ( 0 ). +. . -.RS .IP .TS tab(@); -l lx. -0@left-justified -1@indented paragraphs +Lb Lb +L Lx. +Value@Effect +0@never +1@always 2@T{ -indented paragraphs except after -.BR .H , -.BR .DE , +always, +except immediately after +.BR H , +.BR DE , or -.BR .LE . +.B LE T} .TE -.RE . -.IP -Default is\~0. . .TP +.B Ref +is used internally to control +.MR mmroff 1 's +two-pass approach to index and reference management; +see +.B INITI +and +.B RS +(Boolean-valued; +.BR 0 ). +. +. +.\" XXX: Why is this not named `Rpej`? +.TP .B Rpe -Set default value for second argument of -.BR .RP . +configures the default page ejection policy for reference pages; +see +.B RP +.RB ( 0 ). +. +. +.IP +.TS +tab(@); +Lb Lb +L Lx. +Value@Effect +0@Break the page before and after the list of references. +1@Suppress page break after the list. +2@Suppress page break before the list. +3@Suppress page breaks before and after the list. +.TE +. +. +.TP +.B S +defines the type size for the document, +and must be set from the command line. +. +A scaling unit should be appended; +.B p +is typical +.RB ( 10p ). . -Default is\~0. . .TP .B Sectf -A flag controlling \[oq]section-figures\[cq] numbering style. +selects the \[lq]section-figure\[rq] numbering style. . -A non-zero value enables this. +Its default +.RB is\~ 0 +unless +.RB register\~ N +is set +.RB to\~ 5 +at the command line +(Boolean-valued). . -See also register\~\c -.BR N . . .TP .B Sectp -A flag controlling \[cq]section-page\[cq] numbering style. +selects the \[lq]section-page\[rq] numbering style. . -A non-zero value enables this. +Its default +.RB is\~ 0 +unless +.RB register\~ N +is set +.RB to\~ 3 +.RB or\~ 5 +at the command line +(Boolean-valued). . -See also register\~\c -.BR N . . .TP .B Si -Display indentation. +configures the amount of display indentation in ens; +see +.B DS +.RB ( 5 ). +. +. +.TP +.B Tb +is an auto-incrementing table counter; +see +.BR TB . +. +. +.TP +.B V +defines the vertical spacing for the document, +and must be set from the command line. +. +A scaling unit should be appended; +.B p +is typical. +. +The default vertical spacing is 120% of the type size. . -Default is\~5. . .TP .B Verbin -Indentation for -.BR .VERBON . +configures the amount of indentation for verbatim displays +when indentation is selected; +see +.B \%VERBON +.RB ( 5n ). . -Default is 5n. . .TP .B W -Line length, only for command-line settings. +defines the \[lq]width\[rq] +of the document +(that is, +the length of an output line with no indentation); +it must be set from the command line. +. +A scaling unit should be appended. +. +The default +.RB is\~ 6i +or assigned by the +.I papersize.tmac +package; +see +.MR groff_tmac @MAN5EXT@ . . -.TP -.B .mgm -Always\~1. . . .\" ==================================================================== -.SH INTERNALS +.SH Internals .\" ==================================================================== . -The letter macros are using different submacros depending on the -letter type. -. -The name of the submacro has the letter type as suffix. +The +.B LT +letter macros call further macros depending on the letter type, +with which they are suffixed. . -It is therefore possible to define other letter types, either in the -national macro-file, or as local additions. +It is therefore possible to define additional letter types, +either in the territory-specific macro file, +or as local additions. . -.B .LT -sets the number variables +.B LT +sets the registers .B Pt and .B Pi -to 0 and\~5, respectively. +to 0 and\~5, \" XXX: ...but doesn't use Pi for indentation... +respectively. +.\" XXX: and why aren't both of these actions the responsibility of +.\" let@init_type as described below? +. +The following macros must be defined to support a new letter type. . -The following strings and macros must be defined for a new letter type. . .TP .BI let@init_ type -This macro is called directly by -.BR .LT . +.B LT +calls this macro to initialize any registers and other data needed by +the letter type. . -It is supposed to initialize variables and other stuff. . .TP .BI let@head_ type -This macro prints the letter head, -and is called instead of the normal page header. +formats the letterhead; +it is called instead of the usual page header macro. +. +Its definition should remove the alias +.B let@header +unless the letterhead is desired on subsequent pages. . -It is supposed to remove the alias -.BR let@header , -otherwise it is called for all pages. . .TP -.BI let@sg_ "type name title n flag \fR[\fParg1 \fR[\fParg2 \fR[.\|.\|.]]]\fP" -.B .SG -is calling this macro only for letters; -memorandums have its own processing. +.BI let@sg_ type\~\c +.IR "name title n is-final\~" [ SG-arg\~ .\|.\|.] +.B SG +calls this macro only for letters; +.B MT +memoranda have their own signature processing. . .I name and .I title are specified through -.BR .WA / .WB . +.BR WA / WE . . .IR n \~is -the counter, 1-max, and -.I flag -is true for the last name. +the index of the +.IR n th +writer, +and +.I is-final +is true for the last writer to be listed. +. +Further +.B SG +arguments are appended to the signature line. . -Any other argument to -.B .SG -is appended. . .TP .BI let@fc_ "type closing" This macro is called by -.BR .FC , +.BR FC , and has the formal closing as the argument. . . -.LP -.B .LO -is implemented as a general option-macro. +.P +.B LO +implements letter options. . -It demands that a string named +It requires that a string named .BI Let type -is defined, where +be defined, +where .I type is the letter type. . -.B .LO -then assigns the argument to the string variable -.BI let*lo- type\fR.\fP +.B LO +then assigns its second argument +.RI ( value ) +to the string +.BI let*lo\- type\c +\&. . . .\" ==================================================================== @@ -3945,51 +5318,111 @@ then assigns the argument to the string variable . . .\" ==================================================================== -.SH FILES +.SH Files .\" ==================================================================== . .TP .I @MACRODIR@/@TMAC_M_PREFIX@m.tmac +is the +.I groff +implementation of the memorandum macros. +. +. +.TP +.I @MACRODIR@/mm.tmac +is wrapper to load +.IR m.tmac . +. +. +.TP +.I @MACRODIR@/refer\-mm.tmac +implements +.MR @g@refer @MAN1EXT@ +support for +.IR mm . +. +. +.TP +.I @TMAC_MDIR@/ms.cov +implements an +.IR ms -like +cover sheet. +. +. +.TP +.I @TMAC_MDIR@/0.MT +implements memorandum types 0\[en]3 and 6. +. +. .TP -.IR @TMAC_MDIR@/ * .cov +.I @TMAC_MDIR@/4.MT +implements memorandum type 4. +. +. .TP -.IR @TMAC_MDIR@/ * .MT +.I @TMAC_MDIR@/5.MT +implements memorandum type 5. +. +. .TP .I @TMAC_MDIR@/locale +performs any (further) desired necessary localization; +empty by default. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== +. The GNU version of the .I mm macro package was written by -.MT jh@\:axis.se +.MT jh@\:axis\:.se J\[:o]rgen H\[:a]gg .ME of Lund, Sweden. . . -.na .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.BR groff (@MAN1EXT@), -.BR @g@troff (@MAN1EXT@), -.BR @g@tbl (@MAN1EXT@), -.BR @g@pic (@MAN1EXT@), -.BR @g@eqn (@MAN1EXT@) -.br -.BR groff_mmse (@MAN7EXT@) +.UR https://tkurtbond\:.github\:.io/\:troff/\:mm\-all\:.pdf +.I MM \- A Macro Package for Generating Documents +.UE , +the DWB\~3.3 +.I mm +manual, +introduces the package but does not document GNU extensions. +. +. +.P +.IR "Groff: The GNU Implementation of troff" , +by Trent A.\& Fisher and Werner Lemberg, +is the primary +.I groff +manual. +. +You can browse it interactively with \[lq]info groff\[rq]. +. +. +.P +.MR groff @MAN1EXT@ , +.MR @g@troff @MAN1EXT@ , +.MR @g@tbl @MAN1EXT@ , +.MR @g@pic @MAN1EXT@ , +.MR @g@eqn @MAN1EXT@ , +.MR @g@refer @MAN1EXT@ , +.MR groff_mmse @MAN7EXT@ . . .\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[groff_mm_C] +.cp \n[*groff_groff_mm_7_man_C] +.do rr *groff_groff_mm_7_man_C . . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff -.\" coding: latin-1 .\" End: -.\" vim:set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/groff_mmse.7.man b/contrib/mm/groff_mmse.7.man index 814d54f..6ba94eb 100644 --- a/contrib/mm/groff_mmse.7.man +++ b/contrib/mm/groff_mmse.7.man @@ -1,18 +1,16 @@ -.TH GROFF_MMSE @MAN7EXT@ "@MDATE@" "groff @VERSION@" -.SH NAMN -groff_mmse \- svenska \(rqmemorandum\(rq makro f\(:or GNU roff +.TH groff_mmse @MAN7EXT@ "@MDATE@" "groff @VERSION@" +.SH Namn +groff_mmse \- svenska \(rqmemorandum\(rq makro f\(:or GNU +.I roff . . -.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr groff_mmse_C \n[.C] -.cp 0 -. +.\" Skrivet av Jörgen Hägg, Lund, Sverige . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 1989-2018 Free Software Foundation, Inc. +.\" Copyright (C) 1989-2020 Free Software Foundation, Inc. .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are @@ -29,37 +27,48 @@ groff_mmse \- svenska \(rqmemorandum\(rq makro f\(:or GNU roff .\" included in translations approved by the Free Software Foundation .\" instead of in the original English. . -.\" -.\" Skrivet av Jörgen Hägg, Lund, Sverige -.\" . -.mso sv.tmac +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_groff_mmse_7_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback . . .\" ==================================================================== -.SH SYNTAX +.SH Syntax .\" ==================================================================== . .SY "groff \-m@TMAC_M_PREFIX@mse" -.RI [ flaggor -\&.\|.\|.\&] -.RI [ filer -\&.\|.\|.\&] +.RI [ flaggor\~ .\|.\|.\&] +.RI [ filer\~ .\|.\|.] +. .SY "groff \-m m@TMAC_M_PREFIX@mse" -.RI [ flaggor -\&.\|.\|.\&] -.RI [ filer -\&.\|.\|.\&] +.RI [ flaggor\~ .\|.\|.\&] +.RI [ filer\~ .\|.\|.] .YS . . .\" ==================================================================== -.SH BESKRIVNING +.SH Beskrivning .\" ==================================================================== . -.B m@TMAC_M_PREFIX@mse +.I m@TMAC_M_PREFIX@mse är en svensk variant av -.BR m@TMAC_M_PREFIX@m . +.IR m@TMAC_M_PREFIX@m . Alla texter är översatta. En A4 sida får text som är 13\~cm bred, 3,5\~cm indragning samt är 28,5\~cm hög. @@ -73,12 +82,12 @@ kan anv som argument. Detta ger ett svenskt försättsblad. Se -.BR groff_mm (@MAN7EXT@) +.MR groff_mm @MAN7EXT@ för övriga detaljer. . . .\" ==================================================================== -.SH BREV +.SH Brev .\" ==================================================================== . Tillgängliga brevtyper: @@ -122,7 +131,8 @@ Anger dokumentbeteckning eller dokumentnummer. . .TP .BI ".LO BET\ " beteckning -Anger beteckning (ärendebeteckning i form av diarienummer eller liknande). +Anger beteckning +(ärendebeteckning i form av diarienummer eller liknande). . .TP .BI ".LO SIDOR\ " antal @@ -137,14 +147,14 @@ D . . .\" ==================================================================== -.SH "SKRIVET AV" +.SH "Skrivet av" .\" ==================================================================== . Jörgen Hägg, Lund, Sweden . . .\" ==================================================================== -.SH FILER +.SH Filer .\" ==================================================================== . .TP @@ -153,26 +163,21 @@ J .IR @TMAC_MDIR@/se_ * .cov . . -.na .\" ==================================================================== -.SH "SE OCKSÅ" +.SH "Se också" .\" ==================================================================== . -.BR groff (@MAN1EXT@), -.BR @g@troff (@MAN1EXT@), -.BR @g@tbl (@MAN1EXT@), -.BR @g@pic (@MAN1EXT@), -.BR @g@eqn (@MAN1EXT@) -.br -.BR groff_mm (@MAN7EXT@) +.MR groff_mm @MAN7EXT@ . . .\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[groff_mmse_C] +.cp \n[*groff_groff_mmse_7_man_C] +.do rr *groff_groff_mmse_7_man_C . . .\" Local Variables: .\" coding: latin-1 +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/m.tmac b/contrib/mm/m.tmac index 2851d68..c679a70 100644 --- a/contrib/mm/m.tmac +++ b/contrib/mm/m.tmac @@ -1,14 +1,14 @@ .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2023 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -16,22 +16,34 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. -Naming convention stolen from mgs. +Naming convention adapted from groff ms. Local names module*name Extern names module@name Env.var environ:name Index array!index .. -.if !\n(.g .ab These mm macros require groff. -.do if d PH .nx -.if \n(.C .ab The groff mm macros do not work in compatibility mode. -.if (\n[.warn] == 65543) .warn +.if !\n(.g \ +. ab groff mm macros require groff extensions; aborting +. +.if \n(.C \ +. ab groff mm macros do not work in compatibility mode; aborting +. +.ds @mm m.tmac\" +. +.if (\n[.x]\n[.y] < 123) \{\ +. ds mm-msg \*[@mm]: groff mm macros require groff 1.23 or later,\" +. as mm-msg " but found groff \n[.x].\n[.y]; aborting\" +. ab \*[mm-msg] +.\} +. +.if d PH .nx +. .mso devtag.tmac .\" ######## init ####### -.\" Contents level [0:14], contents saved if heading level <= Cl +.\" create table of contents entry for headings of level <= Cl .nr Cl 2 .\" Eject page between LIST OF XXXX if Cp == 0 .nr Cp 0 @@ -43,16 +55,16 @@ Index array!index .nr Df 5 .\" space before and after display if == 1 [0:1] .nr Ds 1 -.\" Eject page +.\" eject page before headings of level <= Ej .nr Ej 0 .\" Equation label adjust 0=left, 1=right .nr Eq 0 .\" Bullet string (for .BL) -.ie n .ds BU \(bu -.el .ds BU \s-2\(bu\s0 +.ie n .ds BU \[bu] +.el .ds BU \s-2\[bu]\s0 .\" Em dash string .ie n .ds EM " -- -.el .ds EM \(em +.el .ds EM \[em] .\" Footnote spacing .nr Fs 1 .\" H1-H7 heading counters @@ -70,9 +82,9 @@ Index array!index .nr H12 0 1 .nr H13 0 1 .nr H14 0 1 -.\" Heading break level [0:14] +.\" break after headings of level <= Hb .nr Hb 2 -.\" heading centering level, [0:14] +.\" center headings of level <= Hc .nr Hc 0 .\" header format .ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2 @@ -83,7 +95,7 @@ Index array!index .nr Hi 1 .\" header pointsize .ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -.\" heading space level [0:14] +.\" put vertical space of \n[Hss] after headings of level <= Hs .nr Hs 2 .\" heading numbering type .\" 0 -> multiple (1.1.1 ...) @@ -104,10 +116,10 @@ Index array!index .nr Lx 1 .ds Le LIST OF EQUATIONS .nr Le 0 -.\" List indent, used by .AL +.\" List indentation in ens, used by .AL .nr Li 6 -.\" List space, if listlevel > Ls then no spacing will occur around lists. -.nr Ls 99 +.\" put vertical space before list items of nesting level <= Ls +.nr Ls 99 \" TODO: use \n[.R]; see Savannah #63587 .\" Numbering style [0:5] .if !r N .nr N 0 .\" numbered paragraphs @@ -121,7 +133,7 @@ Index array!index .nr Oc 0 .\" Page-number, normally same as %. .nr P 0 -.\" paragraph indent +.\" paragraph indentation in ens .nr Pi 5 .\" paragraph spacing .nr Ps 1 @@ -134,14 +146,24 @@ Index array!index .ds Rp REFERENCES .\" Reference page eject status .nr Rpe 0 -.\" Display indent +.\" display indentation in ens .nr Si 5 .\" .\" Current state of TOC, empty outside TC, inside .\" it will be set to co,fg,tb,ec,ex or ap. .ds Tcst .\" -.ds Tm \(tm +.ie t .ds Sm \v'-.4m'\s-3SM\s0\v'.4m'\" +.el \{\ +. ie c \[u2120] .ds Sm \[u2120]\" +. el .ds Sm (SM)\" +.\} +. +.ie t .ds Tm \v'-.4m'\s-3TM\s0\v'.4m'\" +.el \{\ +. ie c \[tm] .ds Tm \[tm]\" +. el .ds Tm (TM)\" +.\} .\" .\"--------------------------------------------- .\" Internal global variables @@ -166,27 +188,31 @@ Index array!index . el .ds @sdf_font R .\} .\" -.\" Current pointsize and vertical space, always in points. +.\" Set the type size and vertical spacing. If given on the command +.\" line, these have already been converted to basic units. .if !r S .nr S 10 -.ps \n[S] -.vs \n[S]+2 +.ie (\n[S] >= 1000) .ps \n[S]z/1000u +.el .ps \n[S] +.nr *vs-default \n[.ps]*120/100 +.if !r V .nr V \n[*vs-default] +.ie (\n[V] >= 1000) .vs \n[V]p/1000u +.el .vs \n[V] +.rm *vs-default .\" .nr @ps \n[.ps] .nr @vs \n[.v] .if \n[D]>1 .tm @ps=\n[@ps], @vs=\n[@vs] .if \n[D]>3 .tm INIT: l:\n[.l] p:\n[.p] o:\n[.o] .\" -.\" Page length +.\" page length .if r L \{\ -. ie n .pl \n[L]u -. el .pl \n[L]u +. pl \n[L]u .\} .nr @pl \n[.p] .\" -.\" page width +.\" line length .ie r W \{\ -. ie n .ll \n[W]u -. el .ll \n[W]u +. ll \n[W]u .\} .el .ll 6i .nr @ll \n[.l] @@ -221,16 +247,14 @@ Index array!index .\" Add a dot after level one heading number if >0 .nr H1dot 1 .\" -.\" header prespace level. If level <= Hps, then two lines will be printed -.\" before the header instead of one. +.\" put vertical space of \n[Hps2] before headings of level <= Hps .nr Hps 1 .\" -.\" These variables controls the number of lines preceding .H. -.\" Hps1 is the number of lines when level > Hps +.\" amount of vertical space before headings when level > Hps .nr Hps1 0.5v .if n .nr Hps1 1v .\" -.\" Hps2 is the number of lines when level <= Hps +.\" amount of vertical space before headings when level <= Hps .nr Hps2 1v .if n .nr Hps2 2v .\" @@ -293,7 +317,7 @@ Index array!index .if \n[N]=5 .nr Sectf 1 .\" .\" argument to .nm in .VERBON. -.ds Verbnm "1 +.ds Verbnm 1\" .\" indent for VERBON .nr Verbin 5n .\" @@ -358,12 +382,12 @@ Index array!index .\" .\"--------------------------------------------- .\" set local variables. -.ie d @country .mso mm/\*[@country]_locale -.el .mso mm/locale +.ie d @country .msoquiet mm/\*[@country]_locale +.el .msoquiet mm/locale .\"--------------------------------------------- -.if \n[D] .tm Groff mm, version \*[RE]. .\" ####### module init ###### .\" reset all things +.\" XXX: Resets .cu and .ul but _not_ .ce or .rj. .de init@reset .ie \\n[misc@adjust] 'ad .el 'na @@ -375,15 +399,20 @@ Index array!index .vs \\n[@vs]u .. .de @warning -'tm WARNING:(\\n[.F]) input line \\n[.c]:\\$* +.tm \\*[@mm]:\\n[.F]:\\n[.c]: warning: \\$* .if \\n[D] .backtrace .. +.\" All errors are fatal. .de @error -'tm ****************** -'tm ERROR:(\\n[.F]) input line \\n[.c]:\\$* +.tm \\*[@mm]:\\n[.F]:\\n[.c]: error: \\$* .if \\n[D] .backtrace -'tm ****************** -.ab "Input aborted, syntax error" +.ab +.. +. +.de @abort +.tm \\*[@mm]:\\n[.F]:\\n[.c]: internal error: \\$* +.backtrace +.ab .. .de misc@toupper .tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ @@ -406,7 +435,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n] .. .\" ####### module par ################################# -.nr par@ind-flag 1 \" indent on following P if Pt=2 +.nr par*indentation-eligible 1 \" indent following P if Pt=2 +.nr par@suppress-indentation 0 .nr hd*last-pos -1 .nr hd*last-hsize -1 .nr par*number 0 1 @@ -423,44 +453,50 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\"------------ .\" paragraph .de P +.if \\n[.$] \{\ +. ie !\B'\\$1' \{\ +. @warning \\$0: expected numeric argument, got '\\$1' +. shift +. \} +. el .if (\\$1 > 1) \ +. @warning \\$0: ignoring unsupported paragraph type \ +'\\$1' +.\} .\" skip P if previous heading .if \\n[D]>2 \{\ . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos] . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize] .\} -.if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\ -. if \\n[D]>2 .tm Paragraph set ind-flag=1 -. nr par@ind-flag 1 -. \" any collected unprinted text? -. par@doit \\$* -.\} +.nr par*indentation-eligible 1-\\n[par@suppress-indentation] +.par@doit \\$* .if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c .. .\"------------ .de nP -.\" skip P if previous heading .if \\n[D]>2 \{\ . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos] . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize] .\} -.if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\ -. if \\n[D]>2 .tm Paragraph set ind-flag=1 -. nr par@ind-flag 1 -.\} -.par@doit \\$* +.\" A first-line indentation is meaningless for a numbered paragraph. +.nr par*indentation-eligible 0 +.par@doit \\n[H2].\\n+[par*number2]\ \ \c -.nr par@ind-flag 1 .. .\"------------ .de par@doit .SP (u;\\n[Ps]*\\n[Lsp]) -.ie \\n[.$] \{\ -. if \\$1=1 .ti +\\n[Pi]n +.nr par*do-indent 0 +.ie \\n[.$] \{\ +. if \\$1=1 .nr par*do-indent 1 .\} .el \{\ -. if \\n[Pt]=1 .ti +\\n[Pi]n -. if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n +. if \\n[Pt]=1 .nr par*do-indent 1 +. if (\\n[Pt]=2)&\\n[par*indentation-eligible] \ +. nr par*do-indent 1 .\} +.if \\n[par*do-indent] .ti +\\n[Pi]n +.rr par*do-indent +.nr par@suppress-indentation 0 .. .\" ####### module line ####################################### .de SP @@ -486,12 +522,22 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nr line*lp\\n[.z] \\n[.d] .. .\" ######## module misc ############### +.\" XXX: This register value is meaningless. +.\" .ad b +.\" .nr misc@adjust \n[.j] +.\" might be better... .nr misc@adjust 14 .de SA .if \\n[.$] \{\ -. if \\$1-1 .@error "SA: bad arg: \\$1" +. if ((\\$1 < 0) : (\\$1 > 1)) .@error \\$0: invalid argument \ +'\\$1' +.\" XXX: ...then... +.\" .ad l +.\" .nr misc@adjust \\n[.j] . nr misc@adjust 0\\$1 .\} +.\" XXX: ...and finally an unconditional. +.\" .ad \\n[.j] .ie \\n[misc@adjust] 'ad .el 'na .. @@ -499,9 +545,11 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" switch environment, keep all important settings. .de misc@ev-keep .nr misc*ll \\n[.l] +.ds misc*fam \\n[.fam] .ev \\$1 .ll \\n[misc*ll]u .lt \\n[misc*ll]u +.fam \\*[misc*fam] .. .\"------------- .\" .misc@push stackname value @@ -519,7 +567,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .de misc@pop-set .ds misc*st-name \\$1 .shift -.if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty" +.if \\n[.$]<1 .@abort stack '\\*[misc*st-name]' empty .ds misc*pop \\$1 .shift .ds \\*[misc*st-name] \\$* @@ -585,7 +633,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" .MOVE y [[x] linelength] .\" move to line y, indent to x .de MOVE -.if !\\n[.$] .@error "MOVE y [x]: no arguments" +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} .if \\n[nl]<0 \c .\" move to Y-pos .sp |(v;\\$1) @@ -602,7 +653,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"------------- .de SM -.if !\\n[.$] .@error "SM: no arguments" +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} .if \\n[.$]=1 \s-1\\$1\s0 .if \\n[.$]=2 \s-1\\$1\s0\\$2 .if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3 @@ -693,14 +747,14 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .rm misc*rd misc*rd2 .. .\"------------ -.\" VERBON [flag [pointsize [font]]] +.\" VERBON [flag [type-size [font]]] .\" flag .\" bit function -.\" 0 escape on +.\" 0 escape character disablement .\" 1 add an empty line before verbose text .\" 2 add an empty line after verbose text -.\" 3 numbered lines (controlled by the string Verbnm) -.\" 4 indent text by the numbervariable Verbin. +.\" 3 number output lines using Verbnm string for .nm args +.\" 4 indent text by amount in register Verbin .de VERBON .br .nr misc*verb 0\\$1 @@ -801,10 +855,14 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] . nr pict*id +1 . shift . if \\n[.$]>0 \{\ +. if !\B'\\$1' .@error \\$0: width parameter is not \ +numeric; got '\\$1' . nr pict*width (i;\\$1) . shift . \} . if \\n[.$]>0 \{\ +. if !\B'\\$1' .@error \\$0: height parameter is not \ +numeric; got '\\$1' . nr pict*height (i;\\$1) . shift . \} @@ -878,19 +936,26 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\} .. .\" external picture -.\" -L left adjust +.\" -L left align .de EPIC -.if \\n[.$]<2 .@error "EPIC: Not enough arguments" .nr pict*adj 0 \" centered .if '\\$1'-L' \{\ -. shift 1 \" left adjust +. shift . nr pict*adj 1 .\} +.if \\n[.$]<2 \{\ +. @warning \\$0: ignoring; expected width and height arguments +. return +.\} +.\" Permit a document to start with EPIC. .if \\n[nl]<0 \& -.nr pict*w \\$1 -.nr pict*h \\$2 -.ds pict*name "External picture -.if !''$3' .ds pict*name \\$3 +.ie \B'\\$1' .nr pict*w \\$1 +.el .@error \\$0: width parameter is not numeric; got '\\$1' +.ie \B'\\$2' .nr pict*h \\$2 +.el .@error \\$0: height parameter is not numeric; got '\\$2' +.\" XXX: This is kind of lame. It's also not localized. +.ds pict*name External picture\" +.if !''\\$3' .ds pict*name " \\$3\" .ne \\n[pict*h]u .sp \\n[pict*h]u-1v .nr pict*ind 0 @@ -921,16 +986,31 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .acc@over-def ' \' .acc@over-def ^ ^ .acc@over-def ~ ~ -.acc@over-def : \(ad -.acc@over-def ; \(ad -.acc@under-def , \(ac +.acc@over-def : \[ad] +.acc@over-def ; \[ad] +.acc@under-def , \[ac] .\" ######## module uni ################# .\" unimplemented macros +.de @disable +.ds @end \" empty +.while \\n[.$] \{\ +. rm \\$1 \" in case it's aliased +. de \\$1 @end +. @warning \\$1: ignoring; unavailable after \\*[@cover] +. @end +. shift +.\} +.. +.rm @end +. +.de CS +.@warning \\$0: not implemented except with ".MT 4" +.. .de OK -'tm "OK: not implemented" +.@warning \\$0: not implemented .. .de PM -'tm "PM: not implemented" +.@warning \\$0: not implemented .. .\" ######## module hd ################# .\" support for usermacro @@ -947,7 +1027,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\"------------- .\" .hd@split variable index name val1 val2 ... .de hd@split -.if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]). +.\" TODO: Verify that this isn't reachable due to ordinary user error; +.\" if it is, make it an @error. +.if \\$2>(\\n[.$]-3) .@abort \\$3 must have at least \\$2 values \ +(\\*[\\$3]) .nr hd*sp-tmp \\$2+3 .ds \\$1 \\$[\\n[hd*sp-tmp]] .. @@ -984,9 +1067,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .el .nr H1h \\n[H1] 1 .if \\n[hd*level]=1 .nr H1h +1 .\" -.\" Check if it's time for new page. Only if text has -.\" appeared before. -.if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page +.\" Break page before headings of level <= Ej. +.if ((\\n[hd*level]<=\\n[Ej])&(\\n[nl]>\\n[hd*cur-bline])) .pg@next-page .\" .\" increment current counter .nr H\\n[hd*level] +1 @@ -1000,24 +1082,25 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .if \\n[hd*level]>1 .as hd*mark \\n[H2] .\" .nr hd*i 2 1 -.while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]] +.while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) \ +. as hd*mark .\\n[H\\n[hd*i]] .if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]]. .\" .\" special case, no dot after level one heading if not H1dot true .if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1] .\" -.ds hd-mark-trimmed \\*[hd*mark]\" save hd-mark w/o spaces for references -.as hd*mark \ \ \" add spaces between mark and heading -.if !\\n[hd*arg1] .ds hd*mark\" no mark for unnumbered +.ds hd@mark-trimmed \\*[hd*mark]\" mark without spaces, for references +.as hd*mark \ \ \" add spaces between heading mark and title +.if !\\n[hd*arg1] .ds hd*mark \" empty; no mark for unnumbered heading .\" .if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2" -.nr hd*htype 0 \" hd*htype = check break and space -. \" 0 = run-in, 1 = break only, 2 = space +.nr hd*htype 0 \" hd*htype = check break and space +. \" 0 = run-in, 1 = break only, 2 = space .if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1 .if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2 . \" two spaces if hd*htype == 0 .ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \" -.el .ds hd*suf-space +.el .ds hd*suf-space \" empty .nr hd*need 2v \" hd*need = header need space .\"---------- user macro HX ------------ .\" User exit macro to override numbering. @@ -1036,9 +1119,9 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .br .di .rm hd*div -.if \\n[hd*htype] .na \" no adjust if run-in +.if \\n[hd*htype] .na \" do not adjust heading if not run-in .if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \" add some extra space -.ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" this is the needed space for a header +.ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" space needed for a heading .\" .\" size and font calculations .hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level @@ -1090,13 +1173,15 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" do break or space .if \\n[hd*htype] .br .if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss]) -.if \\n[hd*htype] \{\ +.ie \\n[hd*htype] \{\ . \" indent if Hi=1 and Pt=1 . if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n . \" indent size of mark if Hi=2 . if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u +. nr par@suppress-indentation 1 .\} -.nr par@ind-flag 0 \" no indent on .P if Pt=2 +.\" We're setting a run-in heading; the next paragraph is normal. +.el .nr par@suppress-indentation 0 .\" .\" check if it is time to reset footnotes .if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1 @@ -1112,7 +1197,6 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3" .nr hd*last-pos \\n[nl] .nr hd*last-hsize \\n[.k] -.nr par@ind-flag 0 .\" HTML: end of heading .misc@tag EO-H .. @@ -1137,7 +1221,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .wh 0 pg@header .em pg@end-of-text .\" -.ds pg*header ''- \\nP -'' +.ds pg*header ''- \\n[P] -'' .ds pg*footer .if \n[N]=4 .ds pg*header '''' .if (\n[N]=3):(\n[N]=5) \{\ @@ -1237,6 +1321,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" Disable in HTML mode .if !'\*[.T]'html' \{\ .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.]) +. if (u;(\\n[pg*header-size] + \\n[pg*extra-header-size] \ + + \\n[pg*footer-size] + \\n[pg*extra-footer-size] \ + + \\n[.V]) >= \\n[.p]) \{\ +. pl \\n[nl]u +. @error insufficient page length; aborting +. \} +.\} .\" check if Hy has been changed .ie \\n[Hy] 'hy 14 .el 'nh @@ -1510,8 +1601,11 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\" An argument disables the page-break. .de 1C +.if \\n[pg*cols-per-page]<=1 \{\ +. @warning \\$0: multicolumn mode not active +. return +.\} .br -.if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active" .nr pg*cols-per-page 1 .nr pg*column-sep 0 .nr pg*column-size \\n[@ll] @@ -1523,7 +1617,9 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .el \{\ . if d ft*div \{\ . if \\n[pg*ncol-i]>0 \{\ -. @warning 1C: footnotes will be messy +. @warning \\$0: returning to single-column \ +layout with suppressed page break and footnote pending; output may be \ +messy . \} . \} . if \\n[pg*last-ncol]>0 \{\ @@ -1533,9 +1629,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\} .. .de 2C +.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \ +active .br .nr pg*head-mark \\n[nl]u -.if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active" .nr pg*cols-per-page 2 .nr pg*column-sep \\n[@ll]/15 .nr pg*column-size (\\n[@ll]u*7)/15 @@ -1546,21 +1643,24 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\" MC column-size [ column-separation ] .de MC +.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \ +active .br .nr pg*head-mark \\n[nl]u -.if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active" .ie ''\\$1' .nr pg*column-size \\n[.l] .el .nr pg*column-size (n;\\$1) .ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15 .el .nr pg*column-sep (n;\\$2) .\" .\" calculate the number of columns/page -.nr pg*cols-per-page 0 +.nr pg*cols-per-page 0 \" temporarily invalid! .nr pg*i \\n[pg*column-size] .while \\n[pg*i]<=\\n[.l] \{\ -. nr pg*cols-per-page \\n[pg*cols-per-page]+1 +. nr pg*cols-per-page +1 . nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size] .\} +.if \\n[pg*cols-per-page]<0 .@abort \\n[pg*cols-per-page] columns in \ +page .nr pg*cur-column 0 1 .nr pg*cur-po \\n[@po]u .ll \\n[pg*column-size]u @@ -1611,7 +1711,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"----------- .de MULN -.if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth" +.if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@abort undefined column width \ +(pg*mul-x=\\n[pg*mul-x >= pg*mul-max-col=\\n[pg*mul-max]) .br .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d] .rt +0 @@ -1647,6 +1748,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nr ft*note-size 0 .nr ft*busy 0 .nr ft*nr 0 1 +.aln :p ft*nr .nr ft*wide 0 .nr ft*hyphen 0\" hyphenation value .nr ft*adjust 1\" >0 if adjust true @@ -1655,7 +1757,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nr ft*exist 0\" not zero if there are any footnotes to be printed .nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head. .\" -.ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m' +.ie t .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m' +.el .ds F [\\n+[ft*nr]] .\" .\"----------------- .\" init footnote environment @@ -1677,7 +1780,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" set footnote format .\" no support for two column processing (yet). $$$ .de FD -.if \\n[.$]=0 .@error "FD: bad arg \\$1" +.if \\n[.$]=0 .@error \\$0: expected 1 or 2 arguments, got \\n[.$] .ie \\n[.$]=2 .nr ft*clear-at-header 1 .el .nr ft*clear-at-header 0 .\" @@ -1734,7 +1837,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" begin footnote .\" Change environment, switch to diversion and print the foot-note mark. .de FS -.if \\n[ft*busy] .@error "FS: missing FE" +.if \\n[ft*busy] .@error \\$0: cannot nest; missing FE? .nr ft*busy 1 .ev ft*ev .ft@init @@ -1769,7 +1872,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .di 'in 0 'nf -.if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote" +.if \\n[@pl]u<\\n[dn]u .@error \\$0: footnote bigger than page area .if !d ft*div .nr dn +1v .if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn] .ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\ @@ -1839,7 +1942,9 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" floating display start .\" nested DF/DE is not allowed. .de DF -.if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS." +.if \\n[df*float] .@error \\$0: cannot nest floating keeps; use DS \ +within DF/DE +.ds ds@macro \\$0 .ds@set-format \\$@ .\" .nr df*old-ll \\n[.l] @@ -1870,7 +1975,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" move div to the floating display list .rn df*div df*fdiv!\\n[df*fnr] .\" -.nr par@ind-flag 0 +.nr par@suppress-indentation 1 \" no indentation after displays .\" print float if queue is empty and the display fits into .\" the current page .if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1 @@ -1900,11 +2005,16 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" 4 beginning of new page .\" .de df@print-float -.if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5" +.if \\n[Df]>5 .@abort invalid float type: 5 < Df (\\n[Df]) .if !\\n[ds*float-busy] \{\ . nr ds*float-busy 1 .\" at .DE -. if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]] +. if \\n[D]>3 \{\ +. tmc print-float: .t=\\n[.t] +. if r df*height!\\n[df*o-fnr] \ +. tmc , h=\\n[df*height!\\n[df*o-fnr]] +. tm +. \} . \" Df = 1 or 5 . if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\ . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\ @@ -2012,7 +2122,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .de ds@set-format .ie \\n[.$] \{\ . ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1] -. el .@error "DS/DF:wrong format:\\$1" +. el .@error \\*[ds@macro]: unrecognized format '\\$1' .\} .el .nr ds*format 0 .if \\n[D]>2 .tm set format=\\n[ds*format] @@ -2020,7 +2130,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nr ds*fill 0 .if \\n[.$]>1 \{\ . ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2] -. el .@error "\\*[ds*type]:wrong fill:\\$2" +. el .@error \\*[ds@macro]: unrecognized fill style '\\$2' .\} .if \\n[D]>2 .tm set fill=\\n[ds*fill] .nr ds*rindent 0 @@ -2069,8 +2179,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" static display start .\" nested DS/DE is allowed. No limit on depth. .de DS +.ds ds@macro \\$0 .br -.nr XXX \\n[nl] .nr ds*lvl +1 .ds@set-format \\$@ .\" @@ -2090,13 +2200,16 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .di ds*div!\\n[ds*snr] .\" .nr ds*div-ll \\n[ds*old-ll] -.if \\n[ds*format]=1 .nr ds*div-ll -\\n(Sin +.if \\n[ds*format]=1 .nr ds*div-ll -\\n[Si]n .ds@set-new-ev \\n[ds*div-ll] .nr df*float 0 .. .\"-------------------------------------------- .de ds@end -.if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS" +.\" We hard-code the DE macro name here since this macro is internal but +.\" only DE calls it. We also know we're closing a static keep because +.\" df@end is called otherwise. See `DE`. +.if \\n-[ds*lvl]<0 .@error DE: no corresponding DS .br .di .\" ********** @@ -2140,7 +2253,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .if \\n[ds*format]=4 'rj 0 .rm ds*div!\\n[ds*snr] .nr ds*snr -1 -.nr par@ind-flag 0 +.nr par@suppress-indentation 1 \" no indentation after displays .ev .. .\"########### module list ################### @@ -2159,7 +2272,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" the major list-begin macro. .\" If type == -1 a 'break' will occur. .de LB -.if \\n[.$]<4 .@error "LB: not enough arguments, min 4" +.if \\n[.$]<4 .@error \\$0: expected at least 4 arguments, got \\n[.$] .misc@push cind \\n[.i] .misc@push tind \\n[li*tind] .misc@push mind \\n[li*mind] @@ -2189,8 +2302,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"--------------- .de LI -.if \\n[li*lvl]<1 .@error "LI:no lists active" -.if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp]) +.if \\n[li*lvl]<1 .@error \\$0: no list active; call AL, BL, BVL, ... \ +first +.if \\n[li*li-spc]&(\\n[li*lvl]<=\\n[Ls]) \ +. SP (u;\\n[li*li-spc]*\\n[Lsp]) .ne 2v .\" .ds li*c-mark \\*[li*mark] @@ -2235,23 +2350,29 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .ds li*mark \\*[li*mark-list!\\n[li*lvl]] .. .de LE -.if \\n[li*lvl]<1 .@error "LE:mismatched" +.if \\n[li*lvl]<1 .@error \\$0: no list active; call AL, BL, BVL, ... \ +and LI first .li@pop .if '\\$1'1' .SP \\n[Lsp]u +.nr par@suppress-indentation 1 \" no indentation after lists .. .\"------------- .\" list status clear. .\" terminate all lists to level i .de LC -.ie \\n[.$]<1 .nr li*i 0 -.el .nr li*i \\$1 -.if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)" +.nr li*i 0 +.if \\n[.$] \{\ +. ie \B'\\$1' .nr li*i \\$1 +. el .@error \\$0: argument not numeric: '\\n[li*i]' +.\} +.if \\n[li*i]>\\n[li*lvl] .@error \\$0 invalid argument: \\n[li*i] \ +exceeds depth of nested lists (\\n[li*lvl]) .while \\n[li*lvl]>\\n[li*i] .li@pop -.nr par@ind-flag 0 +.nr par@suppress-indentation 1 \" no indentation after lists .. .\"------------- .de AL -.if \\n[.$]>3 .@error "AL: too many arguments" +.if \\n[.$]>3 .@warning \\$0: ignoring excess arguments .if \\n[D]>2 .tm AL $* .ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1" .el \{\ @@ -2263,7 +2384,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\} .. .de ML -.if \\n[.$]>3 .@error "ML: too many arguments" +.if \\n[.$]>3 .@warning \\$0: ignoring excess arguments .if \\n[D]>2 .tm ML $* .nr li*ml-width \w@\\$1@u+1n .if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1" @@ -2275,14 +2396,14 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .de VL .if \\n[D]>2 .tm VL $* -.if \\n[.$]>3 .@error "VL: too many arguments" -.if \\n[.$]<1 .@error "VL: missing text-indent" +.if \\n[.$]>3 .@warning \\$0: ignoring excess arguments +.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$] .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0 .el .LB 0\\$1 0\\$2 0 0 \& 0 1 .. .de BL .if \\n[D]>2 .tm BL $* -.if \\n[.$]>2 .@error "BL: too many arguments" +.if \\n[.$]>2 .@warning \\$0: ignoring excess arguments .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU] .if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU] .if \\n[.$]=2 \{\ @@ -2292,17 +2413,17 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .de DL .if \\n[D]>2 .tm DL $* -.if \\n[.$]>2 .@error "DL: too many arguments" -.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em -.if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em +.if \\n[.$]>2 .@warning \\$0: ignoring excess arguments +.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \[em] +.if \\n[.$]=1 .LB 0\\$1 0 1 0 \[em] .if \\n[.$]=2 \{\ -. ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1 -. el .LB 0\\$1 0 1 0 \(em 0 1 +. ie '\\$1'' .LB \\n[Pi] 0 1 0 \[em] 0 1 +. el .LB 0\\$1 0 1 0 \[em] 0 1 .\} .. .de RL .if \\n[D]>2 .tm RL $* -.if \\n[.$]>2 .@error "RL: too many arguments" +.if \\n[.$]>2 .@warning \\$0: ignoring excess arguments .if \\n[.$]<1 .LB 6 0 2 4 .if \\n[.$]=1 .LB 0\\$1 0 2 4 .if \\n[.$]=2 \{\ @@ -2313,13 +2434,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" Broken Variable List. As .VL but text begin on the next line .de BVL .if \\n[D]>2 .tm BVL $* -.if \\n[.$]>3 .@error "BVL: too many arguments" -.if \\n[.$]<1 .@error "BVL: missing text-indent" +.if \\n[.$]>3 .@warning \\$0: ignoring excess arguments +.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$] .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1 .el .LB 0\\$1 0\\$2 0 -1 \& 0 1 .. .\" ####### module tbl ####################################### -.\" This module is copied from groff_ms and modified for mgm. +.\" This module is copied from groff_ms and modified for mm. .\" Yes, it does not resemble the original anymore :-). .\" Don't know if I missed something important. .\" Groff_ms is written by James Clark. @@ -2364,10 +2485,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] . ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header . el .tbl@print-header .\} -.el .@error ".TH without .TS H" +.el .@error \\$0: .TH without .TS H" .. .de TE -.ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE" +.ie '\\n[.z]'tbl*header-div' .@error \\$0: .TS H but no .TH before .TE .el \{\ . nr tbl*have-header 0 .\} @@ -2378,23 +2499,20 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\" ####### module pic ####################################### .de PS -.nr pic*in 0 +.if !\\n[.$]=2 \{\ +. ds pic*msg \\$0: expected 2 arguments, got \\n[.$]\" +. as pic*msg ; not preprocessed with pic?\" +. @error \\*[pic*msg] +.\} .br .SP .5 -.ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic." -.el \{\ -. if !\\n[ds*lvl] .ne (u;\\$1)+1v -.\" should be contained between .DS/.DE -.if r ds*format \{\ -. if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\ -. nr pic*in \\n[.i] -.\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2) -. \} -. \} -.\} +.if r ds*format .if !\\n[ds*lvl] .ne (u;\\$1)+1v .. -.de PE +.de PY .init@reset +.. +.de PE +.PY .SP .5 .. .\" ####### module eq ####################################### @@ -2414,8 +2532,11 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] \h'|0'\\*[eq*label] . \} . el \{\ -. \" label to the right -\h'|\\n[.l]u-\w'\\*[eq*label]'u'\\*[eq*label] +. \" label to the right, possibly compensating for +. \" indented display +. ie \\n[ds*format]=1 \ +\h'|\\n[.l]u-\w'\\*[eq*label]'u+\\n[Si]n'\\*[eq*label] +. el \h'|\\n[.l]u-\w'\\*[eq*label]'u'\\*[eq*label] . \} . rt .\} @@ -2600,7 +2721,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .el .ds lix*numb \\$3 .\" .ie !\\n[Of] .ds lix*ds-form .\ \ \" -.el .ds lix*ds-form "\ \(em\ \" +.el .ds lix*ds-form "\ \[em]\ \" .nr lix*in \\n[.i] .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form] .if !'\\$5'' \{\ @@ -2717,10 +2838,6 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"########################### module fnt ############################ .\" some font macros. -.de R -.ft 1 -.ul 0 -.. .\"----------- .de fnt@switch .ul 0 @@ -2744,6 +2861,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .ie \\n[.$] .fnt@switch \f2 \f[\\n[.f]] \\$@ .el .ft 2 .. +.de R +.ie \\n[.$] .fnt@switch \f1 \f[\\n[.f]] \\$@ +.el .ft 1 +.. .de IB .if \\n[.$] .fnt@switch \f2 \f3 \\$@ .. @@ -2768,7 +2889,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nr box*ll 0 .\" .B1 and .B2 works like .DS .de B1 -.if \\n[box*ll] .@error "B1: missing B2" +.if \\n[box*ll] .@error \\$0: cannot nest; missing B2? .nr box*ll \\n[.l] .nr box*ind \\n[.i] .nr box*hyp \\n[.hy] @@ -2784,7 +2905,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .hy \\n[.hy] .. .de B2 -.if !\\n[box*ll] .@error "B2: missing B1" +.if !\\n[box*ll] .@error \\$0: no corresponding B1 .br .di .nr box*height \\n[dn] @@ -2856,7 +2977,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"----------- .de RP -.if !d ref*mac .@error "RP: No references!" +.if !d ref*mac \{\ +. @warning \\$0: ignoring; no references defined +. return +.\} .ie !''\\$2' .nr ref*i 0\\$2 .el .nr ref*i \\n[Rpe] .if \\n[ref*i]<2 .SK @@ -2922,7 +3046,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" .APPSK name pages text .\" name == "" -> autonumber .de APPSK -.if \\n[.$]<2 .@error "APPSK: too few arguments" +.if \\n[.$]<2 .@error \\$0: expected 2 or 3 arguments, got \\n[.$] .app@set-ind "\\$1" .\" .ds Tcst ap @@ -2975,7 +3099,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" indent stored in cov*abs-ind .\" number of authors stored in cov*au .\" author(s) stored in cov*au!x!y -.\" author(s) title stored in cov*at!x!y +.\" number of authors' titles stored in cov*at!x +.\" title(s) of author(s) stored in cov*at!x!y .\" x is the author-index [1-cov*au], y is the argument-index [1-9]. .\" author(s) firm stored in cov*firm .\" new date (if .ND exists) is stored in cov*new-date @@ -2985,7 +3110,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" .nr cov*au 0 .de TL -.rm IA IE WA WE LO LT +.ds @cover \\$0 +.@disable IA IE WA WE LO LT \" can't use with LT and friends .if \\n[.$]>0 .ds cov*title-charge-case \\$1 .if \\n[.$]>1 .ds cov*title-file-case \\$2 .pg@disable-top-trap @@ -2997,11 +3123,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .ec .. .\"------------------- -.\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]] +.\" .AU [name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]] .de AU .cov@title-end +.if !\\n[.$] .return \" AU is being used only to end a TL. .pg@disable-top-trap .nr cov*au +1 +.nr cov*at!\\n[cov*au] 0 \" no titles for this author yet .nr cov*i 0 1 .ds cov*au!\\n[cov*au]!1 .while \\n[.$]>=\\n+[cov*i] \{\ @@ -3014,11 +3142,15 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\} .. .\"------------------- -.\" .AT title1 [title2 [... [title9] ]]]] -.\" Well, thats all that COVEND look for. -.\" Must appear directly after .AU +.\" .AT title [...] +.\" Any quantity of titles may be declared. +.\" Must be called directly after the corresponding .AU. .de AT -.if \\n[.$]<1 .@error "AT: no arguments" +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.nr cov*at!\\n[cov*au] \\n[.$] .nr cov*i 0 1 .while \\n[.$]>=\\n+[cov*i] \{\ . ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]] @@ -3030,12 +3162,12 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .if !''\\$1' .ds cov*firm \\$1 .. .de AST -.ds cov*abs-name \\$1 +.ds cov*abs-name "\\$1\" .. .de AS .pg@disable-top-trap -.if d cov*abstract .@error "AS: only one abstract allowed" -.if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)" +.if d cov*abstract .@error \\$0: only one abstract allowed +.if !''\\n[.z]' .@error \\$0: no diversion allowed (previous .AS?) .nr cov*abs-arg 0\\$1 .nr cov*abs-ind (n;0\\$2) .de cov*abstract AE @@ -3064,8 +3196,12 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" switch to ISO-date if register Iso exist: YYYY-MM-DD .if r Iso .ISODATE 1 .\"------------------- -.\" save technical numbers. +.\" Save technical memorandum numbers. .de TM +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} .nr cov*i 0 1 .while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]] .nr cov*mt-tm-max \\n[.$] @@ -3085,18 +3221,22 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .ds cov*mt-file!6 0.MT .\"------------ .de MT +.ds @cover \\$0 +.@disable COVER IA IE WA WE LO LT .ie \\n[.$] \{\ . ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1 . el .ds cov*mt-type 6 .\} .el .ds cov*mt-type 1 -.ds cov*mt-addresse "\\$2 +.ds cov*mt-addressee "\\$2 .ds cov*mt-type-text "\\$1 .ie d @country .ds cov*str mm/\\*[@country]_ .el .ds cov*str mm/ .mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]] .. .de COVER +.ds @cover \\$0 +.@disable IA IE WA WE LO LT MT .ie !\\n[.$] .ds cov*cov-type ms .el .ds cov*cov-type \\$1 .pg@disable-top-trap @@ -3125,18 +3265,18 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\"--------------- .\" set a reference. .de SETR -.if \\n[.$]<1 .@error "SETR:reference name missing" -.if !r qrf*pass .tm "SETR: No .INITR in this file" +.if \\n[.$]<1 .@error \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? .if \\n[Ref] \{\ . ds qrf*name qrf*ref-\\$1 -. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd-mark-trimmed],\\n[%] +. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd@mark-trimmed],\\n[%] . \" heading-number -. ds \\*[qrf*name]-hn \\*[hd-mark-trimmed] +. ds \\*[qrf*name]-hn \\*[hd@mark-trimmed] . \" page-number . ds \\*[qrf*name]-pn \\n[%] . \" . if \\n[Ref] \{\ -. tm .ds \\*[qrf*name]-hn \\*[hd-mark-trimmed] +. tm .ds \\*[qrf*name]-hn \\*[hd@mark-trimmed] . tm .ds \\*[qrf*name]-pn \\n[%] . if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2 . \} @@ -3146,8 +3286,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" get misc-string .\" If two arg -> set var. arg to misc-string. .de GETST -.if \\n[.$]<1 .@error "GETST:reference name missing" -.if !r qrf*pass .tm "GETST: No .INITR in this file" +.if \\n[.$]<1 .@error \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? .ds qrf*name qrf*ref-\\$1 . if d \\*[qrf*name]-xx \{\ . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx] @@ -3159,8 +3299,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" get header-number .\" If two arg -> set var. arg to header-number. .de GETHN -.if \\n[.$]<1 .@error "GETHN:reference name missing" -.if !r qrf*pass .tm "GETHN: No .INITR in this file" +.if \\n[.$]<1 .@error \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? .ds qrf*name qrf*ref-\\$1 .if d \\*[qrf*name]-hn \{\ . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn] @@ -3171,8 +3311,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" get page-number .\" If two arg -> set var. arg to page-number. .de GETPN -.if \\n[.$]<1 .@error "GETPN:reference name missing" -.if !r qrf*pass .tm "GETPN: No .INITR in this file" +.if \\n[.$]<1 .@error \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? .ds qrf*name qrf*ref-\\$1 .if d \\*[qrf*name]-pn \{\ . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn] @@ -3181,10 +3321,8 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"---------- .de GETR -.if \\n[.$]<1 .@error "GETR:reference name missing" -.ie !r qrf*pass \{\ -. tm "GETR: No .INITR in this file" -.\} +.if \\n[.$]<1 .@error \\$0: expected an argument +.ie !r qrf*pass .tm \\$0: no .INITR in this file" \" XXX: .@error? .el \{\ . GETHN \\$1 Qrfh . GETPN \\$1 Qrfp @@ -3192,22 +3330,16 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\} .. .\"########################### module ind ############################ -.\" Support for mgs-style indexing, borrowed from mgs. -.de IX -. tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%] -.. .\"-------------------- .\" Another type of index system .\" INITI type filename [macro] .de INITI -.if \\n[.$]<1 .@error "INITI:type missing" +.if \\n[.$]<2 .@error \\$0: expected 2 or 3 arguments, got \\n[.$] .\" ignore if INITI has already been used -.if \\n[.$]>1 \{\ -. if d ind*file .@error "INITI:file already set" -. ds ind*file \\$2.ind -. if \\n[D]>1 .tm INITI: source \\*[ind*file] -.\} -.if !d ind*file .@error "INITI:file not specified" +.if d ind*file .@error \\$0: index file name already set +.ds ind*file \\$2.ind +.if \\n[D]>1 .tm INITI: source \\*[ind*file] +.if !d ind*file .@error \\$0: index file name not specified .ds ind*type \\$1 .if \\n[Ref] \{\ . if \\n[.$]>2 .tm .\\\\" Imacro: \\$3 @@ -3215,13 +3347,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"--------------- .de IND -.if !d ind*file .@error "IND: No active INITI" +.if !d ind*file .@error \\$0: no active index; call INITI" .if \\n[D]>1 .tm IND: type=\\*[ind*type] -.ds ind*ref +.ds ind*ref \" empty .if '\\*[ind*type]'N' .ds ind*ref \\n[%] .if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark] .if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%] -.if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]" +.if '\\*[ind*ref]'' .@abort invalid index type '\\*[ind*type]' .\" .ds ind*line \\$1 .while \\n[.$]>0 \{\ @@ -3284,7 +3416,10 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .. .\"------------------------ .de let*lt-sign -.if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined" +.\" We hard-code the SG macro name here since this macro is internal but +.\" only SG calls it. +.if !d let@sg_\\*[let*type] .@error SG: letter type '\\*[let*type]' \ +undefined .df@print-float 3 .nr let*i 0 1 .nr let*j 0 @@ -3300,22 +3435,32 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .ne \\n[cov*au]u*4v .ie \\n[.$]>1 .nr let*k 1 .el .nr let*k \\n[cov*au] -.ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]- +.ds let*tmp \" empty +.if d cov*au!\\n[let*k]!3 \{\ +. as let*tmp \\*[cov*au!\\n[let*k]!3]\" +. if d cov*au!\\n[let*k]!4 \ +. as let*tmp -\\*[cov*au!\\n[let*k]!4]-\" +.\} .nr let*i 0 1 .while \\n+[let*i]<=\\n[cov*au] \{\ -. if \\n[let*i]>1 .as let*tmp / -. as let*tmp \\*[cov*au!\\n[let*k]!2] +. if \\n[let*i]>1 .as let*tmp /\" +. if d cov*au!\\n[let*i]!2 .as let*tmp \\*[cov*au!\\n[let*i]!2]\" .\} .if !''\\$1' .as let*tmp -\\$1 .in (u;\\n[.l]/2) .nf .nr let*i 0 1 .while \\n+[let*i]<=\\n[cov*au] \{\ +. ne 3v+\\n[cov*at!\\n[let*i]]v . SP 3v . if \\n[let*i]=\\n[let*k] \{\ \Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c . \} \\*[cov*au!\\n[let*i]!1] +. nr let*j 0 1 +. while \\n+[let*j]<=\\n[cov*at!\\n[let*i]] \{\ +\\*[cov*at!\\n[let*i]!\\n[let*j]] +. \} .\} .fi .in @@ -3350,12 +3495,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" let@header is called from the header. It is supposed .\" to remove the alias itself. .de LT -.rm AF AS AE AT AU CS OK TL MT +.ds @cover LT +.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LO .ds let*type BL .nr Pi 5 .nr Pt 0 .if !''\\$1' .ds let*type \\$1 -.if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1" +.if !d let@head_\\*[let*type] .@error \\$0: unknown letter type '\\$1' .shift .als let@header let@head_\\*[let*type] .let@init_\\*[let*type] \\$@ @@ -3428,12 +3574,14 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .nf .if \\$3=1 .sp .sp -.misc@toupper "\\$1, \\$2" +.ie '\\$2'' .misc@toupper "\\$1" +.el .misc@toupper "\\$1, \\$2" .if \\$4 .sp .if \w'\\$5'&\\$4 \\$5 .fi .. .de let@fc_SP +.\" Simplified letters have no formal closing, just space before SG. .sp 2 .. .\"-------------------------------------- @@ -3486,7 +3634,7 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .if d let*lo-SJ \{\ . ie '\\*[let*type]'SP' \{\ . sp 2 -. misc@toupper \\*[let*lo-SJ] +. misc@toupper "\\*[let*lo-SJ]" . sp . \} . el \{\ @@ -3565,9 +3713,13 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\"------------------- .\" Letter options .de LO -.rm AF AS AE AT AU CS OK TL MT -.if ''\\$1' .@error "LO: missing option" -.if !d Let\\$1 .@error "LO: unknown option (\\$1)" +.ds @cover \\$0 +.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LT +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.if !d Let\\$1 .@error \\$0: unrecognized option '\\$1' .ds let*lo-\\$1 \\$2 .if \n[D]>1 .tm Letter option \\$1 \\$2 .. @@ -3575,10 +3727,6 @@ in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] .\" Start with a clean slate .init@reset . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/mm/mm.am b/contrib/mm/mm.am index cdd5270..191dbce 100644 --- a/contrib/mm/mm.am +++ b/contrib/mm/mm.am @@ -1,6 +1,4 @@ -# Copyright 1991-2018 Free Software Foundation, Inc. -# -# Last update: 22 Aug 2015 +# Copyright 1991-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -50,11 +48,6 @@ MMEXAMPLEFILES=\ mmexampledir=$(exampledir)/mm dist_mmexample_DATA = $(MMEXAMPLEFILES) -# Local configuration files with default values. -MMLOCALE = \ - locale \ - se_locale - EXTRA_DIST += \ contrib/mm/ChangeLog \ contrib/mm/examples \ @@ -67,15 +60,32 @@ EXTRA_DIST += \ contrib/mm/mmroff.1.man \ contrib/mm/mmroff.pl +mm_TESTS = \ + contrib/mm/tests/LT_SP_AU_without_AT_works.sh \ + contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh \ + contrib/mm/tests/MT-1-reports-all-TM-numbers.sh \ + contrib/mm/tests/MT_5_includes_AT_in_SG.sh \ + contrib/mm/tests/P-indentation-works.sh \ + contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh \ + contrib/mm/tests/mse_has-sufficient-footnote-space.sh \ + contrib/mm/tests/place-equation-labels-correctly-in-displays.sh \ + contrib/mm/tests/remove-stale-bib-entry-data.sh \ + contrib/mm/tests/short-pages-do-not-overflow-stack.sh +TESTS += $(mm_TESTS) +EXTRA_DIST += \ + $(mm_TESTS) \ + contrib/mm/tests/artifacts/60657.ref mmroff: $(mm_srcdir)/mmroff.pl - $(AM_V_GEN)$(SED) -e 's;/usr/bin/perl;$(PERL);' \ - $(mm_srcdir)/mmroff.pl \ - >$@ \ - && chmod +x $@ + $(AM_V_GEN)$(SED) \ + -e 's;[@]PERL[@];$(PERL);' \ + -e 's;[@]VERSION[@];$(VERSION);' \ + $(mm_srcdir)/mmroff.pl \ + >$@.tmp \ + && chmod +x $@.tmp \ + && mv $@.tmp $@ -# Special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac -# and MMLOCALE +# special installation rules for m.tmac, mse.tmac, mmse.tmac, mm.tmac install-data-local: install_mm install_mm: -test -d $(DESTDIR)$(tmacdir) || $(mkinstalldirs) $(DESTDIR)$(tmacdir) @@ -90,19 +100,11 @@ install_mm: $(mm_srcdir)/mmse.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mmse.tmac @$(SED) -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \ $(mm_srcdir)/mm.tmac > $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac - @for f in $(MMLOCALE); do \ - test -f $(DESTDIR)$(tmacdir)/mm/$$f \ - || touch $(DESTDIR)$(tmacdir)/mm/$$f; \ - done uninstall-local: uninstall_mm uninstall_mm: if test -d $(DESTDIR)$(mmexampledir); then \ rmdir $(DESTDIR)$(mmexampledir); \ fi - -for f in $(MMLOCALE); do \ - test -s $(DESTDIR)$(tmacdir)/mm/$$f \ - || $(RM) $(DESTDIR)$(tmacdir)/mm/$$f; \ - done $(RM) $(DESTDIR)$(tmacdir)/tmac.$(tmac_m_prefix)m $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)m.tmac $(RM) $(DESTDIR)$(tmacdir)/$(tmac_m_prefix)mm.tmac @@ -119,9 +121,8 @@ dist_mm: done -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -# vim: set filetype=automake: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/mm/mm/0.MT b/contrib/mm/mm/0.MT index 20952ec..b06a4b8 100644 --- a/contrib/mm/mm/0.MT +++ b/contrib/mm/mm/0.MT @@ -1,15 +1,14 @@ -.\" -*- nroff -*- .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2020 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -17,7 +16,7 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. .. . @@ -25,8 +24,8 @@ http://savannah.gnu.org/bugs/?group=groff. .\" Cover sheet. Memorandum type 0-3 and "string". .\"------------ .if !r Au .nr Au 1 -.nr cov*mt0-ind 1.1c .de cov@print-title +.if !d cov*title .@error title not defined; call TL and AU before MT .MOVE 4.8c 1.5c .S 8 subject: @@ -46,6 +45,8 @@ subject: .. .\"------------ .de cov@print-authors +.\" The following diagnostic might be unreachable. +.if !r cov*au .@error no authors defined; call AU before MT .MOVE 5.7c 13.3c .nf .S 8 @@ -75,7 +76,7 @@ subject: TM . in 1.5c . sp -1 -. while \\n+[cov*i]<\\n[cov*mt-tm-max] \\*[cov*mt-tm!\\n[cov*i]] +. while \\n+[cov*i]<=\\n[cov*mt-tm-max] \\*[cov*mt-tm!\\n[cov*i]] . in . ft .\} @@ -166,3 +167,9 @@ TM . pg@enable-trap . ds cov*mt-printed .\} +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/mm/4.MT b/contrib/mm/mm/4.MT index a722490..1fd31df 100644 --- a/contrib/mm/mm/4.MT +++ b/contrib/mm/mm/4.MT @@ -1,15 +1,14 @@ -.\" -*- nroff -*- .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2020 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -17,7 +16,7 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. .. . @@ -25,7 +24,7 @@ http://savannah.gnu.org/bugs/?group=groff. .\" Cover sheet. Memorandum type 4 .\"------------ .de cov@print-title -.if !d cov*title .@error title (.TL) not defined! +.if !d cov*title .@error title not defined; call TL and AU before MT .MOVE 2.8c .S +2 .ad c @@ -39,6 +38,8 @@ http://savannah.gnu.org/bugs/?group=groff. .. .\"------------ .de cov@print-authors +.\" The following diagnostic might be unreachable. +.if !r cov*au .@error no authors defined; call AU before MT .SP 0.5 .I .S +1 @@ -101,4 +102,9 @@ http://savannah.gnu.org/bugs/?group=groff. .cov@print-firm .cov@print-abstract .. - +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/mm/5.MT b/contrib/mm/mm/5.MT index 20d7795..10bf410 100644 --- a/contrib/mm/mm/5.MT +++ b/contrib/mm/mm/5.MT @@ -1,15 +1,14 @@ -.\" -*- nroff -*- .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2020 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -17,15 +16,15 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. .. . .\"------------ .\" Cover sheet. Memorandum type 5 .\"------------ -.nr cov*mt0-ind 1.1c .de cov@print-title +.if !d cov*title .@error title not defined; call TL and AU before MT .B .ll 9c .fi @@ -54,3 +53,9 @@ http://savannah.gnu.org/bugs/?group=groff. . pg@enable-trap . ds cov*mt-printed .\} +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/mm/ms.cov b/contrib/mm/mm/ms.cov index d771a81..cea6073 100644 --- a/contrib/mm/mm/ms.cov +++ b/contrib/mm/mm/ms.cov @@ -1,15 +1,15 @@ .\" -*- nroff -*- .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2020 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -17,7 +17,7 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. .. . @@ -25,42 +25,50 @@ http://savannah.gnu.org/bugs/?group=groff. .\" Cover sheet. Mostly like ms cover. .\"------------ .de cov@print-title -.in 0 -.misc@ev-keep cov*ev -.init@reset -.ad c -.hy 0 -.fi -.B -.cov*title -.br -.ad b -.R -.ev +.ie !d cov*title .@error COVEND: no title (TL) defined +.el \{\ +. in 0 +. misc@ev-keep cov*ev +. init@reset +. ad c +. hy 0 +. fi +. B +. cov*title +. br +. ad b +. R +. ev +.\} .. .\"------------ .de cov@print-authors -.SP -.nr cov*i 0 1 -.while \\n+[cov*i]<=\\n[cov*au] \{\ -. ce -\fI\\*[cov*au!\\n[cov*i]!1]\fP -. nr cov*j 0 1 -. while \\n+[cov*j]<=9 \{\ -. if d cov*at!\\n[cov*i]!\\n[cov*j] \{\ -. if \w'\\*[cov*at!\\n[cov*i]!\\n[cov*j]]' \{\ -. ce -\s-1\\*[cov*at!\\n[cov*i]!\\n[cov*j]]\s0 -. .\} +.ie !\\n[cov*au] .@error COVEND: no authors (AU) defined +.el \{\ +. SP +. nr cov*i 0 1 +. while \\n+[cov*i]<=\\n[cov*au] \{\ +. ds cov*aname \\*[cov*au!\\n[cov*i]!1] +. ce +. nop \fI\\*[cov*aname]\fP +. nr cov*j 0 1 +. while \\n+[cov*j]<=\\n[cov*at!\\n[cov*i]] \{\ +. ds cov*atitle \\*[cov*at!\\n[cov*i]!\\n[cov*j]] +. ce +. nop \s-1\\*[cov*atitle]\s0 . \} +. rm cov*atitle . \} +. rm cov*aname .\} .. .\"------------ .de cov@print-firm -.SP .5 -.ce -\\*[cov*firm] +.if d cov*firm \{\ +. SP .5 +. ce +. nop \\*[cov*firm] +.\} .. .\"------------ .de cov@print-abstract @@ -89,7 +97,8 @@ http://savannah.gnu.org/bugs/?group=groff. .\"----------------- .de COVEND .br -.if d cov*default-firm .if !d cov*firm .ds cov*firm \\*[cov*default-firm] +.if d cov*default-firm \ +. if !d cov*firm .ds cov*firm \\*[cov*default-firm] .sp |4.2c .cov@print-title .cov@print-authors @@ -99,8 +108,14 @@ http://savannah.gnu.org/bugs/?group=groff. .pg@enable-top-trap .bp 1 .pg@enable-trap -.if d cov*abs-arg .if \\n[cov*abs-arg] \{\ +.if r cov*abs-arg .if \\n[cov*abs-arg] \{\ . cov@print-abstract ABSTRACT . SP 2 .\} .. +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/mmroff.1.man b/contrib/mm/mmroff.1.man index cd5c375..7920c70 100644 --- a/contrib/mm/mmroff.1.man +++ b/contrib/mm/mmroff.1.man @@ -1,18 +1,15 @@ -.TH MMROFF @MAN1EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -mmroff \- cross-reference preprocessor for GNU roff mm macro package -. -. -.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr mmroff_C \n[.C] -.cp 0 +.TH mmroff @MAN1EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +mmroff \- cross-referencing front end for GNU +.I roff mm +macro package . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 1989-2018 Free Software Foundation, Inc. +.\" Copyright (C) 1989-2023 Free Software Foundation, Inc. .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are @@ -30,83 +27,145 @@ mmroff \- cross-reference preprocessor for GNU roff mm macro package .\" instead of in the original English. . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_mmroff_1_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== -.SH SYNOPSIS +.SH Synopsis .\" ==================================================================== . .SY mmroff -.OP \-x -.I groff-arguments +.RB [ \-x ] +.IR groff-argument \~.\|.\|. +.YS +. +. +.SY mmroff +.B \-\-help +.YS +. +. +.SY mmroff +.B \-\-version .YS . . .\" ==================================================================== -.SH DESCRIPTION +.SH Description .\" ==================================================================== . .I mmroff -is a simple preprocessor for +is a simple wrapper for .IR groff , -used for expanding cross references in +used to expand cross references in .IR m@TMAC_M_PREFIX@m ; see -.IR groff_mm (@MAN7EXT@). +.MR groff_mm @MAN7EXT@ . . +It runs .I groff -is executed twice, first with +with the +.B \-mm +option twice, +first with .B \-z and .B \-rRef=1 -to collect all cross references and then to do the real processing -when the cross-reference file is up to date. +to populate cross-reference and index files with their corresponding +entries, +and then again to produce the document. +. +It also handles the inclusion of PostScript images with the +.B PIC +macro. +. +Documents that do not use these features of +.I "groff mm" +(the +.BR INITI , +.BR IND , +.BR INDP , +.BR INITR , +.BR SETR , +.BR GETHN , +.BR GETPN , +.BR GETR , +.BR GETST , +and +.B PIC +macros) +do not require +.IR \%mmroff . . . .\" ==================================================================== -.SH OPTIONS +.SH Options .\" ==================================================================== . +.B \-\-help +displays +a usage message, +while +.B \-\-version +shows version information; +both exit afterward. +. +. .TP .B \-x -Just create the cross-reference file. -. -This can be used to refresh the cross-reference file; it isn't -always needed to have accurate cross references and by using this -option -.I groff -will only be run once. +Create or update the cross-reference file and exit. . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== . -.B mmroff +.I mmroff was written by -.MT jh@\:axis.se -Jörgen Hägg +.MT jh@\:axis\:.se +J\[o ad]rgen H\[a ad]gg .ME -of Lund, Sweden. +of Lund, +Sweden. . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.IR groff_mm (@MAN7EXT@), -.IR groff_mmse (@MAN7EXT@), -.IR groff (@MAN1EXT@), -.IR @g@troff (@MAN1EXT@), -.IR @g@tbl (@MAN1EXT@), -.IR @g@pic (@MAN1EXT@), -.IR @g@eqn (@MAN1EXT@) +.MR groff_mm @MAN7EXT@ , +.MR groff_mmse @MAN7EXT@ , +.MR groff @MAN1EXT@ , +.MR @g@troff @MAN1EXT@ , +.MR @g@tbl @MAN1EXT@ , +.MR @g@pic @MAN1EXT@ , +.MR @g@eqn @MAN1EXT@ . . .\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[mmroff_C] +.cp \n[*groff_mmroff_1_man_C] +.do rr *groff_mmroff_1_man_C . . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff -.\" coding: latin-1 .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mm/mmroff.pl b/contrib/mm/mmroff.pl index 685a588..af8bf90 100644 --- a/contrib/mm/mmroff.pl +++ b/contrib/mm/mmroff.pl @@ -1,6 +1,5 @@ -#! /usr/bin/perl -# -*- Perl -*- -# Copyright (C) 1989-2018 Free Software Foundation, Inc. +#!@PERL@ +# Copyright (C) 1989-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -18,6 +17,10 @@ # along with this program. If not, see . use strict; +use warnings; + +(my $progname = $0) =~s @.*/@@; + # runs groff in safe mode, that seems to be the default # installation now. That means that I have to fix all nice # features outside groff. Sigh. @@ -25,6 +28,17 @@ use strict; # of security holes. my $no_exec; + +if (grep(/^--help$/, @ARGV)) { + print "usage: mmroff [-x] [groff-option ...] [file ...]\n"; + exit; +} + +if (grep(/^--version$/, @ARGV)) { + print "mmroff (groff) @VERSION@\n"; + exit; +} + # check for -x and remove it if (grep(/^-x$/, @ARGV)) { $no_exec++; @@ -84,12 +98,17 @@ while() { } close(MACRO); +sub Die { + print STDERR "$progname: fatal error: @_\n"; + exit 1; +} if ($rfilename) { push(@out, ".nr pict*max-height $max_height\n") if defined $max_height; push(@out, ".nr pict*max-width $max_width\n") if defined $max_width; - open(OUT, ">$rfilename") || "create $rfilename:$!"; + open(OUT, ">$rfilename") + or &Die("unable to create $rfilename:$!"); print OUT '.\" references', "\n"; my $i; for $i (@out) { @@ -104,7 +123,7 @@ exit system($run_macro); sub print_index { my ($f, $ind, $macro) = @_; - open(OUT, ">$f") || "create $f:$!"; + open(OUT, ">$f") or &Die("unable to create $f:$!"); my $i; for $i (sort @$ind) { if ($macro) { @@ -155,8 +174,6 @@ sub psbb { 1; -######################################################################## -### Emacs settings # Local Variables: # mode: CPerl # End: diff --git a/contrib/mm/mse.tmac b/contrib/mm/mse.tmac index 7a9795e..8184b14 100644 --- a/contrib/mm/mse.tmac +++ b/contrib/mm/mse.tmac @@ -1,14 +1,14 @@ .ig -Copyright (C) 1991-2018 Free Software Foundation, Inc. -mgm is written by Jörgen Hägg +Copyright (C) 1991-2020 Free Software Foundation, Inc. +mm is written by Jörgen Hägg -mgm is free software; you can redistribute it and/or modify it under +mm is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -mgm is distributed in the hope that it will be useful, but WITHOUT ANY +mm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -16,7 +16,7 @@ for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Please submit bug reports with examples at +Please submit bug reports using groff's 'BUG-REPORT' file to http://savannah.gnu.org/bugs/?group=groff. .. . @@ -43,7 +43,7 @@ http://savannah.gnu.org/bugs/?group=groff. .po \n[@po]u .pl \n[@pl]u . -.nr pg*footer-size 4\" 1v+footer+even/odd footer+1v +.nr pg*footer-size 4v\" 1v+footer+even/odd footer+1v .\"------------------------------------------------ .\" Dokumentnamn .ds LetDNAMN @@ -159,10 +159,6 @@ Datum: .. .\" ----------------------------------- . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/mm/refer-mm.tmac b/contrib/mm/refer-mm.tmac index c27fa31..800568a 100644 --- a/contrib/mm/refer-mm.tmac +++ b/contrib/mm/refer-mm.tmac @@ -2,7 +2,7 @@ .\" .\" Refer support for mm macros. .\" -.\" Copyright (C) 2011-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2011-2020 Free Software Foundation, Inc. .\" Written by Werner Lemberg (wl@gnu.org) .\" .\" This file is part of groff. @@ -79,6 +79,7 @@ . am ref*mac . ds [F "\\*([F\" . ][ "\\$1" "\\$2" +. ref*reset \\.. .. . @@ -101,10 +102,6 @@ . .mso refer.tmac . -.\" ==================================================================== -.\" Editor settings -.\" ==================================================================== -. .\" Local Variables: .\" mode: nroff .\" fill-column: 72 diff --git a/contrib/mm/tests/LT_SP_AU_without_AT_works.sh b/contrib/mm/tests/LT_SP_AU_without_AT_works.sh new file mode 100755 index 0000000..7589966 --- /dev/null +++ b/contrib/mm/tests/LT_SP_AU_without_AT_works.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Copyright (C) 2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +# Regression-test Savannah #60373 (3/3). +# +# Ensure that an author name (AU) with no title (AT) isn't rendered with +# a trailing comma. +# +# Thanks to Robert Goulding for the reproducer. + +EXAMPLE='.LT SP +.WA "John Doe" +Nowhere, +USA. +.WE +.IA "Jane Smith" +Somewhere, +UK. +.IE +.LO SJ "Letter of Introduction" +.LO SA "Dear Ms.\& Smith" +.P +This is the text of the letter. +.FC "Yours sincerely," +.SG' + +echo "$EXAMPLE" \ + | "$groff" -Tascii -P-cbou -mm \ + | grep -Eqx '[[:space:]]+JOHN DOE[[:space:]]*' + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh b/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh new file mode 100755 index 0000000..98c3fda --- /dev/null +++ b/contrib/mm/tests/LT_SP_multi-word_LO_SJ_works.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Copyright (C) 2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +# Regression-test Savannah #60373 (1/3). +# +# Ensure that a multi-word subject line (LO SJ) gets rendered. +# +# Thanks to Robert Goulding for the reproducer. + +EXAMPLE='.LT SP +.WA "John Doe" +Nowhere, +USA. +.WE +.IA "Jane Smith" +Somewhere, +UK. +.IE +.LO SJ "Letter of Introduction" +.LO SA "Dear Ms.\& Smith" +.P +This is the text of the letter. +.FC "Yours sincerely," +.SG' + +echo "$EXAMPLE" \ + | "$groff" -Tascii -P-cbou -mm \ + | grep -Eqx '[[:space:]]+LETTER OF INTRODUCTION[[:space:]]*' + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh b/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh new file mode 100755 index 0000000..3224e7c --- /dev/null +++ b/contrib/mm/tests/MT-1-reports-all-TM-numbers.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +fail= + +wail () { + echo ...FAILED >&2 + fail=YES +} + +# Regression-test Savannah #63613. The identifiers of all technical +# memoranda should be formatted. + +input='.TL +My Memo +.AU "Random Hacker" +.TM 23-SKIDOO 24-URTHRU +.MT 1 +This is my memo. +. +There are many like it but this one is mine.' + +output=$(printf "%s\n" "$input" | "$groff" -mm -Tascii -P-cbou) +echo "$output" + +echo "checking that first TM number is present" >&2 +echo "$output" | grep -q "23-SKIDOO" || wail + +echo "checking that second TM number is present" >&2 +echo "$output" | grep -q "24-URTHRU" || wail + +test -z "$fail" + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/MT_5_includes_AT_in_SG.sh b/contrib/mm/tests/MT_5_includes_AT_in_SG.sh new file mode 100755 index 0000000..4f23d53 --- /dev/null +++ b/contrib/mm/tests/MT_5_includes_AT_in_SG.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# +# Copyright (C) 2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +# Regression-test Savannah #57034. +# +# Ensure that an author's title (if any) is written in the signature. +# +# Thanks to Ken Mandelberg for the reproducer. + +EXAMPLE='.TL +Inquiry +.AU "John SMITH" +.AT "Director" +.MT 5 +.P +sentence +.FC Sincerely, +.SG' + +echo "$EXAMPLE" \ + | "$groff" -Tascii -P-cbou -mm \ + | grep -Eqx '[[:space:]]+Director[[:space:]]*' + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/P-indentation-works.sh b/contrib/mm/tests/P-indentation-works.sh new file mode 100755 index 0000000..5be7efd --- /dev/null +++ b/contrib/mm/tests/P-indentation-works.sh @@ -0,0 +1,135 @@ +#!/bin/sh +# +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +fail= + +wail () { + echo ...FAILED >&2 + fail=YES +} + +# Regression-test Savannah #54909. Check other cases as well. + +input='.P +P1 not indented. +.P 0 +P2 not indented. +.P 1 +P3 indented. +.nr Pt 2 +.P +P4 indented. +.H 1 Heading +.P +P5 not indented. +.P +P6 indented. +.H 3 "Run-in heading." +Some text. +.P +P7 indented. +.DS +display +.DE +.P +P8 not indented. +.P +P9 indented. +.BL +.LI +list item +.LE +.P +P10 not indented. +.P +P11 indented.' + +output=$(printf "%s\n" "$input" | "$groff" -mm -Tascii -P-cbou) +echo "$output" + +# P1 not indented. +# +# P2 not indented. +# +# P3 indented. +# +# P4 indented. +# +# +# 1. Heading +# +# P5 not indented. +# +# P6 indented. +# +# 1.0.1 Run-in heading. Some text. +# +# P7 indented. +# +# display +# +# P8 not indented. +# +# P9 indented. +# +# o list item +# +# P10 not indented. +# +# P11 indented. + +echo "checking that initial untyped paragraph not indented" >&2 +echo "$output" | grep -Eqx ' {7}P1 not indented\.' || wail + +echo "checking that initial type 0 paragraph not indented" >&2 +echo "$output" | grep -Eqx ' {7}P2 not indented\.' || wail + +echo "checking that first paragraph after Pt=2 indented" >&2 +echo "$output" | grep -Eqx ' {12}P3 indented\.' || wail + +echo "checking that second paragraph after Pt=2 indented" >&2 +echo "$output" | grep -Eqx ' {12}P4 indented\.' || wail + +echo "checking that first paragraph after heading not indented" >&2 +echo "$output" | grep -Eqx ' {7}P5 not indented\.' || wail + +echo "checking that second paragraph after heading indented" >&2 +echo "$output" | grep -Eqx ' {12}P6 indented\.' || wail + +echo "checking that paragraph after run-in heading indented" >&2 +echo "$output" | grep -Eqx ' {12}P7 indented\.' || wail + +echo "checking that first paragraph after display not indented" >&2 +echo "$output" | grep -Eqx ' {7}P8 not indented\.' || wail + +echo "checking that second paragraph after display indented" >&2 +echo "$output" | grep -Eqx ' {12}P9 indented\.' || wail + +echo "checking that first paragraph after list not indented" >&2 +echo "$output" | grep -Eqx ' {7}P10 not indented\.' || wail + +echo "checking that second paragraph after list indented" >&2 +echo "$output" | grep -Eqx ' {12}P11 indented\.' || wail + +test -z "$fail" + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/artifacts/60657.ref b/contrib/mm/tests/artifacts/60657.ref new file mode 100644 index 0000000..ed7f6f3 --- /dev/null +++ b/contrib/mm/tests/artifacts/60657.ref @@ -0,0 +1,11 @@ +%K 1 +%A First Author +%B First Book +%O Test one + +%K 2 +%A Second Author +%B Second Book + +%K 3 +%A Third Author diff --git a/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh b/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh new file mode 100755 index 0000000..66086f8 --- /dev/null +++ b/contrib/mm/tests/ms_cover_sheet_robust_to_missing_AF.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright (C) 2021 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +# Regression-test Savannah #60915. +# +# Ensure that a missing firm definition doesn't disrupt cover sheet +# layout. + +EXAMPLE='.COVER +.ND 2020-07-17 +.TL +The Great American Novel +.AU "Eileen M. Plausible" +.COVEND' + +echo "$EXAMPLE" \ + | "$groff" -Tascii -P-cbou -mm \ + | grep -Fqx ' 2020-07-17' # 7 spaces + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/mse_has-sufficient-footnote-space.sh b/contrib/mm/tests/mse_has-sufficient-footnote-space.sh new file mode 100755 index 0000000..936d9e5 --- /dev/null +++ b/contrib/mm/tests/mse_has-sufficient-footnote-space.sh @@ -0,0 +1,77 @@ +#!/bin/sh +# +# Copyright (C) 2022 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +# Regression-test Savnnah #63398. + +input='.de M +. nr N \\\\$1-1 +. if \\\\$1 .M \\\\nN +Sed ut perspiciatis, unde omnis iste natus error sit voluptatem +accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab +illo inventore veritatis et quasi architecto beatae vitae dicta sunt, +explicabo.\\\\*F +. FS +footnote text +. FE +.. +.P +.M 16' + +# .de M +# . nr N \\$1-1 +# . if \\$1 .M \\nN +# Sed ut perspiciatis, unde omnis iste natus error sit voluptatem +# accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab +# illo inventore veritatis et quasi architecto beatae vitae dicta sunt, +# explicabo.\\*F +# .FS +# blather +# .FE +# Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur +# aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione +# voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, +# quia dolor sit amet consectetur adipiscivelit, sed quia non-numquam eius +# modi tempora incidunt, ut labore et dolore magnam aliquam quaerat +# voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam +# corporis suscipitlaboriosam, nisi ut aliquid ex ea commodi consequatur? +# Quis autem vel eum iure reprehenderit, qui inea voluptate velit esse, +# quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo +# voluptas nulla pariatur? At vero eos et accusamus et iusto odio +# dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti +# atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati +# cupiditate non-provident, similique sunt in culpa, qui officia deserunt +# mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum +# facilis est et expedita distinctio. Nam libero tempore, cum soluta +# nobis est eligendi optio, cumque nihil impedit, quo minus id, quod +# maxime placeat, facere possimus, omnis voluptas assumenda est, omnis +# dolor repellendus. Temporibus autem quibusdam et aut officiis debitis +# aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae +# sint et molestiae non-recusandae. Itaque earum rerum hic tenetur a +# sapiente delectus, ut aut reiciendis voluptatibus maiores alias +# consequatur aut perferendis doloribus asperiores repellat. +# .. +# .P +# .M 4 + +output=$(echo "$input" | "$groff" -mm -mmse -Tps) + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh b/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh new file mode 100755 index 0000000..1970397 --- /dev/null +++ b/contrib/mm/tests/place-equation-labels-correctly-in-displays.sh @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Copyright (C) 2022 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +fail= + +wail () { + echo FAILED >&2 + fail=YES +} + +# Regression-test Savannah #62190. Check left- and center-aligned +# displayed equations as well. + +input='.DS L +.EQ (1) +p = q +.EN +.DE +.DS I +.EQ (2) +w = z +.EN +.DE +.DS C +.EQ (3) +x = y +.EN +.DE' + +output=$(printf "%s\n" "$input" | "$groff" -e -mm -Tascii -P-cbou) + +echo "checking left-aligned displayed equation" >&2 +echo "$output" | grep -Eq 'p=q {54}\(1\)' || wail + +echo "checking indented displayed equation" >&2 +echo "$output" | grep -Eq 'w=z {49}\(2\)' || wail + +echo "checking centered displayed equation" >&2 +echo "$output" | grep -Eq 'x=y {26}\(3\)' || wail + +test -z "$fail" || exit 1 + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/remove-stale-bib-entry-data.sh b/contrib/mm/tests/remove-stale-bib-entry-data.sh new file mode 100755 index 0000000..5fb68e6 --- /dev/null +++ b/contrib/mm/tests/remove-stale-bib-entry-data.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# +# Copyright (C) 2022 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +fail= + +wail () { + echo FAILED >&2 + fail=YES +} + +# Regression-test Savannah #60657. Ensure data from a bibliographic +# entry don't carry over to the next. + +# Locate directory containing our test artifacts. +artifact_dir= + +for buildroot in . .. ../.. +do + d=$buildroot/contrib/mm/tests/artifacts + if [ -d "$d" ] + then + artifact_dir=$d + break + fi +done + +# If we can't find it, we can't test. +test -z "$artifact_dir" && exit 77 # skip + +input=".R1 +bibliography $artifact_dir/60657.ref +.R2" + +output=$(echo "$input" | "$groff" -R -mm -Tascii -P-cbou) + +echo "checking first entry" +echo "$output" \ + | grep -q "1\. First Author in First Book\. Test one\.$" \ + || wail + +echo "checking second entry" +echo "$output" \ + | grep -q "2\. Second Author in Second Book\.$" \ + || wail + +echo "checking third entry" +echo "$output" \ + | grep -q "3\. Third Author\.$" \ + || wail + +test -z "$fail" || exit 1 + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mm/tests/short-pages-do-not-overflow-stack.sh b/contrib/mm/tests/short-pages-do-not-overflow-stack.sh new file mode 100755 index 0000000..4be0e13 --- /dev/null +++ b/contrib/mm/tests/short-pages-do-not-overflow-stack.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Copyright (C) 2022 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +groff="${abs_top_builddir:-.}/test-groff" + +fail= + +wail () { + echo FAILED >&2 + fail=YES +} + +# Regression-test Savannah #24048. Pages that are too short to +# accommodate minimal header and footer requirements should not cause +# infinite trap recursion. + +input='.COVER +.TL +Title +.AU "R. Thurston Howell" +.AT "Professor of Agnotology" "Publisher, Posterior Analytics Weekly" +.COVEND +.P +Main matter goes here.' + +echo "checking that sample document fits using default length" >&2 +output=$(printf "%s\n" "$input" \ + | "$groff" -b -mm -Tascii -P-cbou) || wail + +echo "checking that sample document fits using -rL5v" >&2 +output=$(printf "%s\n" "$input" \ + | "$groff" -b -rL5v -mm -Tascii -P-cbou) || wail + +echo "checking that sample document fails gracefully using -rL4v" >&2 +error=$(printf "%s\n" "$input" \ + | "$groff" -b -rL4v -mm -Tascii -P-cbou -z 2>&1) +# Assume that >= 10 lines of stderr must be due to a giant backtrace. +test $(echo "$error" | wc -l) -lt 10 || wail + +test -z "$fail" + +# vim:set ai et sw=4 ts=4 tw=72: diff --git a/contrib/mom/BUGS b/contrib/mom/BUGS index 4875fdf..6e7a828 100644 --- a/contrib/mom/BUGS +++ b/contrib/mom/BUGS @@ -1,5 +1,5 @@ -*- text -*- - Copyright 2004-2018 Free Software Foundation, Inc. + Copyright 2004-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -21,6 +21,129 @@ the Subject line or you risk my spam filters nuking your message. ==================================================================== +Version 2.5_c +============= + +#R_MARGIN not being respected in PAGEWIDTH. +---Fixed--- + +Version 2.5_b +============= +PAGINATE not restoring page numbers after being disabled. +---Fixed--- + +Sentence space not being restored after a terminating REF. +---Fixed--- + +CODE not always correctly restoring point size of text +afterwards. +---Fixed--- + +BLANKPAGE broken when columns are enabled. +---Fixed--- + +Registers #FROM_COVERTITLE and #FROM_DOC_COVERTITLE not being +cleared in macro COLLATE. +---Fixed--- + +DROPCAP not calculating distance to FOOTER trap correctly. +---Fixed--- + +Version 2.5 +=========== + +Page offset not being restored correctly after CENTRE_BLOCK. +---Fixed--- + +LEFT_HANG intermittently causing type to be raised out of position. +---Fixed--- + +$CHAPTER_STRING default not being set in COPYSTYLE. +---Fixed--- + +When using mom bare metal, NEWPAGE depositing a superfluous blank +page unless B_MARGIN has been set explicitly. +---Fixed--- + +Version 2.4-4_e +=============== + +LANDSCAPE arg to PAPER not being appended to $PAPER so PAPER +isn't picking it up when PAPER is called at the top of DEFAULTS. +---Fixed--- + +BLANKPAGE with NULL arg printing incorrect page number when page +numbering is restored. +---Fixed--- + +BLANKPAGE with DIVIDER arg spitting out one too many pages. +---Fixed--- + +Hyphens appearing mid-line in runon footnotes. +---Fixed--- + +Version 2.4-4_b +=============== +SMALLCAPS introducing a small indent equal to a wordspace when +called after PP. +---Fixed--- + +Version 2.4-4_a +=============== +BIBLIOGRAPHY_SPACING not being respected. +---Fixed--- + +Version 2.4-4 +============= +Default PAPER settings overwriting user-entered PAGEWIDTH, +PAGELENGTH, and PAGE. +---Fixed--- + +QUOTE and BLOCKQUOTE indents shifting after page breaks. +---Fixed--- + +Version 2.4-3 +============= +TYPEWRITE: Inline \*[PREV] calling \*[ULX] without explicitly +returning to TYPEWRITER font. +---Fixed--- + +%u field in refer databases not triggering ref*type 0 (Internet +reference). +---Fixed--- + +Idem field of refer databases overwriting first occurrence of author +name. +---Fixed--- + +Captions not fully respecting TYPEWRITE. +---Fixed--- + +COVERTEXT not fully respecting TYPEWRITE. +---Fixed--- + +Changes to font family inside a COVERTEXT block not being reset to +default document family when the block is terminated. +---Fixed--- + +Unwanted linespace before labels above tables. +---Fixed--- + +Label number of AUTOLABEL_TABLES incrementing by 2 instead of 1. +---Fixed--- + +Page number of the page before a bibliography not printing. +---Fixed--- + +Version 2.4-1 +============= +tbl not respecting pre-tbl fill mode. +---Fixed--- + +COVER and DOC_COVER not always capturing pertinent title and +copyright. +---Fixed--- + Version 2.4 =========== BIBLIOGRAPHY output broken. @@ -171,7 +294,7 @@ Forced floats not advancing on the page after output if the float is forced to the next page, causing running text to overprint. ---Fixed--- -Text after defered floats not being shimmed properly. +Text after deferred floats not being shimmed properly. ---Fixed--- Tables that span pages overprinting first two lines of table on new @@ -287,7 +410,7 @@ Version 1.5-b Use of \E*[UC] and \E*[LC] inside strings for HDRFTR_RECTO and HDRFTR_VERSO breaking headers. ---Not fixable. CAPS option added to HDRFTR_RECTO/VERSO to - accomodate situations where capitalized reserved + accommodate situations where capitalized reserved strings(\*[$TITLE], \*[$AUTHOR], etc) are desired.--- COLLATE depositing a blank page if last output line before it falls @@ -685,7 +808,7 @@ FOOTNOTE, whether in column mode or not, was using #FN_COUNT_FOR_COLS for all footnote markers and handling. ---Fixed--- -Deferred footnotes that occured on the second to last page of +Deferred footnotes that occurred on the second to last page of documents not printing. ---Fixed--- diff --git a/contrib/mom/ChangeLog b/contrib/mom/ChangeLog index 25c3f8c..82e5dbb 100644 --- a/contrib/mom/ChangeLog +++ b/contrib/mom/ChangeLog @@ -1,3 +1,145 @@ +2023-06-15 + + * om.tmac: Enclose all calls to \D't n' in \Z + +2023-03-01 G. Branden Robinson + + [mom]: Generate test script even if we'll skip it. + + * examples/test-mom.sh.in: Check availability of required + pdfinfo(1) and pdfimages(1) commands at test time; skip if they + aren't present. + * mom.am [!HAVE_PDFTOOLS]: Generate the test script even if + these tools aren't available. + +2023-02-18 G. Branden Robinson + + * mom.am (uninstall_mom): Clean more fastidiously; try to remove + the configured `pdfdocdir` in the event it is empty, but do not + fail if it isn't. (It can be a directory shared with other + groff components; we don't know in what order the uninstall + targets will serialize, but the last one run should succeed.) + +2023-02-02 + * om.tmac (UNDERSCORE, UNDERSCORE2): Add PREFIX and SUFFIX + arguments so surrounding punctuation can be protected from + underscoring. + +2023-01-16 + * om.tmac (PRINTSTYLE): Abort with message if nroff is called on + a document using PRINTSTYLE TYPESET. + + Fixes . Thanks to Gene + for the report. + +2022-11-16 + + * om.tmac (PAPER): Adjust #R_MARGIN to work with papersize.tmac. + +2022-10-23 G. Branden Robinson + + * om.tmac (FORCE_RECTO): Use backslash before newline when + starting multi-line conditional block. + +2022-09-02 + + * examples/mom-pdf.mom: Fixes missing parameter to \*[SIZE] at + line 457. + + * om.tmac: Fixes CODE not restoring point size + correctly. The point size was being stored in a number register + instead of a string. + + * BUGS: Updated. + + Fixes . + +2022-08-29 G. Branden Robinson + + * mom.am (MOMPDFMOM): Pass `PDFMOMBIN` '-K utf8', not '-k', in + case 'configure' didn't find uchardet. + + Fixes . Thanks to Bjarni + Ingi Gislason for the report. + +2022-05-31 + + * Make mom emit a warning and abort when tbl(1) data present + without a corresponding -t on the command line. + +2022-05-20 G. Branden Robinson + + * momdoc/appendices.html: Reflect file rename in groff + distribution: the name of the file mapping Adobe Glyph List + names to groff special character identifiers for text (as + opposed to "special") fonts has changed from "textmap" to + "text.map". + +2022-05-20 G. Branden Robinson + + * mom.am (MOMPROCESSEDEXAMPLEFILES): Include "typesetting.pdf" + only if `HAVE_URW_FONTS`, since the document demands them. + +2022-05-20 G. Branden Robinson + + * mom.am: Rename `BUILD_PDFDOC` to `USE_GROPDF`. + +2022-05-01 G. Branden Robinson + + * mom.am ($(MOMPROCESSEDEXAMPLEFILES)): Depend on new name for + devpdf stamp file. + +2022-04-12 Ingo Schwarze + + Delete the harmful, ill-designed, buggy, and essentially + unmaintained and untested --with-doc option of the configure + script. See the NEWS file for more details on the rationale. + + * mom.am: Delete one INSTALL_SHIPPED_HTML and one BUILD_EXAMPLES + conditional and use BUILD_PDFDOC instead of BUILD_PDFEXAMPLES. + +2021-03-29 G. Branden Robinson + + * mom.am: Eliminate `MOM_TFLAG` and `MOM_PFLAG` Make macros; + they were expanded in only one place. + (MOMPDFMOM): Track rename of Make macro `TFLAG` to `MFLAG`. + +2022-03-26 G. Branden Robinson + + * mom.am (MOMPROCESSEDEXAMPLEFILES): Drop dependency on gnu.eps. + No mom document appears to require this file; it came in with + the initial Automake file for mom in commit 4d84d0f1d, 27 + January 2015, and may have been a copy-and-paste error. + +2021-10-21 G. Branden Robinson + + * mom.am (mom_test_template): Pull file name into a new + variable. + (EXTRA_DIST, contrib/mom/examples/tests-mom.sh): Use it. + (contrib/mom/examples/tests-mom.sh): Build more quietly; + prefix rule with `$(AM_V_GEN)`. Also run `chmod` conditionally. + +2021-10-04 + + * version 2.5 release (see NEWS) + + * removed orphaned stubs for abandoned cutaround feature from + om.tmac + +2019-12-26 + + * added PREFIX_CHAPTER argument to HEADING_STYLE + + * added TOC_HEADING; single line, non-pagenumbered insertions into + the TOC + +2019-11-03 + + * templates added for setting up copyright pages + + * updated mom.am to include the templates when building + pdfs in mom/examples + 2018-11-24 * version 2.4 release (see NEWS) @@ -20,7 +162,7 @@ 2017-10-29 Bjarni Ingi Gislason - om.tmac-u: Fix typo in register reference. + * om.tmac-u: Fix typo in register reference. Fix bug https://savannah.gnu.org/bugs/?51608. @@ -200,7 +342,7 @@ * Thu Sep 20 2012 - o Simplify enviroment handling. + o Simplify environment handling. * Fri Aug 31 2012 @@ -218,7 +360,7 @@ * Thu Sep 8 2011 - o Added register #SUBHEAD, analagous to #HEAD, to fix excessive + o Added register #SUBHEAD, analogous to #HEAD, to fix excessive spacing between SUBHEADs and SUBSUBHEADs. * Sun Feb 20 2011 @@ -933,7 +1075,7 @@ footnotes, both "normal" footnotes and footnotes that occur inside QUOTE, BLOCKQUOTE and EPIGRAPH. - o Addtion of font "styles" to om.tmac, plus changes to the FAMILY + o Addition of font "styles" to om.tmac, plus changes to the FAMILY and FT macros to manage them. New section in the doc appendices on adding fonts and managing the new font styles. @@ -947,7 +1089,7 @@ used in justified text. o NEWPAGE, which used to be an alias for .bp, has been moved into - its own macro, in order to make it more responsive to some unusal + its own macro, in order to make it more responsive to some unusual situations. o Some changes to elvis_syn.new, including that the file @@ -1224,7 +1366,7 @@ o Changed .ne in .HEAD when PRINTSTYLE TYPESET from 5 to 4. With 5, heads required at least 2 lines of text underneath or they'd be - defered to the next page, which created too much whitespace at the + deferred to the next page, which created too much whitespace at the end of the page. Heads will now be processed on the same page if the head plus at least one line of text underneath fits. I figure it's easier for the user to break to a new page manually if this @@ -1548,7 +1690,7 @@ o String tabs weren't working as advertised when set from within a tab. Fixed. Two new registers added: #ST_OFFSET and #IN_TAB. - String tabs now behave poperly and intuitively when set within + String tabs now behave properly and intuitively when set within tabs. o Added a note to docs about surrounding \w'...' escape with @@ -1630,15 +1772,17 @@ ________________________________________________________________________ ##### License -Copyright 2004-2018 Free Software Foundation, Inc. +Copyright 2004-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -##### Emacs settings +##### Editor settings Local Variables: -version-control: never -mode: change-log coding: latin-1 +fill-column: 72 +mode: change-log +version-control: never End: +vim:set autoindent textwidth=72: diff --git a/contrib/mom/NEWS b/contrib/mom/NEWS index a5fd76b..d7cf82a 100644 --- a/contrib/mom/NEWS +++ b/contrib/mom/NEWS @@ -1,16 +1,20 @@ -*- text -*- - Copyright (C) 2004-2018 Free Software Foundation, Inc. + Copyright (C) 2004-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. -Release 2.4 +Release 2.5 ----------- -General bug fix release, with an overhaul of float, image, and +Addition of shaded backgrounds, frames, and page colour. + +Releases 2.4 — 2.4-4_e +---------------------- +General bug fix releases, with an overhaul of float, image, and pre-processor handling to correct inconsistencies in spacing, indents, labels, and captions. Corrects page numbering issue in -"Lists of..." when pre-processor material is floated and defered. +"Lists of..." when pre-processor material is floated and deferred. Release 2.3 ----------- @@ -180,7 +184,7 @@ cover or doc cover, as well as tell her whether to include covers and doc covers in the pagination scheme. The convenience macro, CODE, has been made more convenient. A new -control macro allows setting users' prefered fixed-width fonts. +control macro allows setting users' preferred fixed-width fonts. Additionally, CODE can now be called inline. New inline escapes, \*[UC] and \*[LC], have been added to allow @@ -256,7 +260,7 @@ Release 1.3-a ------------- Bug fixes: First baseline of type wasn't going where it was supposed to when the docheader was turned off; fixes to errors in html -formattting of docs. +formatting of docs. Release 1.3 ----------- diff --git a/contrib/mom/TODO b/contrib/mom/TODO index d558eb7..d9bb257 100644 --- a/contrib/mom/TODO +++ b/contrib/mom/TODO @@ -1,5 +1,5 @@ -*- txt -*- - Copyright 2004-2018 Free Software Foundation, Inc. + Copyright 2004-2020 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/copyright b/contrib/mom/copyright index aee4b03..04c09d9 100644 --- a/contrib/mom/copyright +++ b/contrib/mom/copyright @@ -2,14 +2,14 @@ AUTHOR ------ Peter Schaffter (peter@schaffter.ca) -3-355 Lafontaine Ave +6-331 Mona Ave Vanier (ON) CANADA -K1L 6X6 +K1L 7A3 ======================================================================== The groff macro file om.tmac and the html documentation pertaining to -it are Copyright (C) 2004-2018 Peter Schaffter. +it are Copyright (C) 2004-2021 Peter Schaffter. om.tmac is issued under the GNU General Public License, a full copy of which can be had at diff --git a/contrib/mom/examples/README-fr.txt b/contrib/mom/examples/README-fr.txt index ddf572b..5b1b434 100644 --- a/contrib/mom/examples/README-fr.txt +++ b/contrib/mom/examples/README-fr.txt @@ -1,9 +1,9 @@ - -*- mode: text; coding: utf-8; -*- - Copyright (C) 2014-2018 Free Software Foundation, Inc. +-*- mode: text; coding: utf-8; -*- +Copyright (C) 2014-2020 Free Software Foundation, Inc. - Copying and distribution of this file, with or without modification, - are permitted in any medium without royalty provided the copyright - notice and this notice are preserved. +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. ======================================================================== @@ -96,6 +96,12 @@ le paramètre de configuration INDENT_FIRST_PARAS est activé afin d'indenter le premier paragraphe de chaque section -- ceci est l'usage en typographie française. +***copyright-default.mom/copyright-chapter.mom*** + +Deux fichiers qui montrent la bonne façon d'insérer une page des +droits d'auteur dans les documents créés avec mom. "Default" est +pour DOCTYPE DEFAULT; "chapter" est pour DOCTYPE CHAPTER. + ***mom-pdf.mom*** Le manuel "Producing PDFs with mom and groff". diff --git a/contrib/mom/examples/README.txt b/contrib/mom/examples/README.txt index 633f089..851a9a2 100644 --- a/contrib/mom/examples/README.txt +++ b/contrib/mom/examples/README.txt @@ -1,9 +1,9 @@ - -*- mode: text; coding: utf-8; -*- - Copyright (C) 2004-2018 Free Software Foundation, Inc. +-*- mode: text; coding: utf-8; -*- +Copyright (C) 2004-2020 Free Software Foundation, Inc. - Copying and distribution of this file, with or without modification, - are permitted in any medium without royalty provided the copyright - notice and this notice are preserved. +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. ======================================================================== @@ -89,6 +89,12 @@ TOC_HEADER_STRING is used to modity the Table of Content title to indent the first paragraph of a section -- this is the usual convention in French typesetting. +***copyright-default.mom/copyright-chapter.mom*** + +These two files demonstrate the correct way to insert a copyright +page into mom documents. "Default" is for DOCTYPE DEFAULT; +"chapter" is for DOCTYPE CHAPTER. + ***mom-pdf.mom*** The manual, Producing PDFs with mom and groff. diff --git a/contrib/mom/examples/copyright-chapter.mom b/contrib/mom/examples/copyright-chapter.mom new file mode 100644 index 0000000..261c712 --- /dev/null +++ b/contrib/mom/examples/copyright-chapter.mom @@ -0,0 +1,160 @@ +.\" -*- mode: text; coding: utf-8; -*- +\# +\# Copyright (C) 2019-2020 Free Software Foundation, Inc. +\# +\# Copying and distribution of this file, with or without modification, +\# are permitted in any medium without royalty provided the copyright +\# notice and this notice are preserved. +\# +.ig +***Template for creating a copyright page, DOCTYPE CHAPTER*** +. +Mom documents comprised of chapters using DOCTYPE CHAPTER require +the START macro to begin each chapter, and the COLLATE macro to join +it to the subsequent chapter. +. +A copyright page (also called an edition page), which is not a +chapter, should be treated as a DOCTYPE DEFAULT. The text of +the copyright page is entered after START and joined to the first +chapter (DOCTYPE CHAPTER) with COLLATE. +. +Copyright pages are not identified by a title or heading, however +they require a TITLE in order to be included in PDF viewer outlines +and the Table of Contents. Supplying '.TITLE "Copyright"' +but disabling the DOCHEADER achieves both these requirements. +. +Pagination should also be disabled for the copyright page. Both +docheader and pagination should be re-enabled before the START of +the first chapter. +.. +. +.\" Cover setup +. +.\" By default, mom uses the last TITLE macro before START for the +.\" title that appears on the cover. Since the TITLE is "Copyright," +.\" mom needs to be told explicitly to use a different title. +. +.\" Cover and PDF viewer setup +. +.DOCTITLE "Book Title" +.TITLE DOC_COVER \ + "\*[$DOCTITLE]" \" Title for the cover page +.AUTHOR \ + "Book Author" +.DOC_COVER \ + TITLE AUTHOR +.PDF_TITLE \ + "DOCTYPE CHAPTER with copyright page" \" For PDF viewer titlebar +. +.\" Copyright page setup +. +.PRINTSTYLE TYPESET +.DOCTYPE DEFAULT \" Copyright page is not a chapter. +. +.DOCHEADER off 1i \" Turn off docheader for copyright page. +. \" Begin text 1 inch from page top. +.PAGINATION off \" Disable pagination for copyright page. +. +.TITLE "Copyright" \" Required for the PDF viewer outline; does not +. \" get printed because docheader is disabled. +.NO_TOC_ENTRY \" So copyright page is not included in the TOC +. +.START \" Begin example copyright page +All rights reserved. No part of this publication may be reproduced, +distributed, or transmitted in any form or by any means, including +photocopying, recording, or other electronic or mechanical methods, +without the prior written permission of the publisher, except +in the case of brief quotations embodied in critical reviews +and certain other noncommercial uses permitted by copyright +law. For permission requests, write to the publisher, addressed +“Attention: Permissions Coordinator,” at the address below. +.SP +.LEFT +Copyright \[co]2019 Copyright Holder +.SP +Additional information... +.TOC_AFTER_HERE \" Place TOC after copyright page. +. +.COLLATE +. +.\" Chapter setup +. +.DOCTYPE CHAPTER \" Begin using DOCTYPE CHAPTER. +.TITLE \ + "\*[$DOCTITLE]" \" Needed for page headers. +. \" Only required before first chapter. +.CHAPTER 1 +.CHAPTER_TITLE \ + "Sample Chapter" +.DOCHEADER \" Re-enable docheader. +.PAGINATE \" Re-enable pagination. +.PAGENUMBER 1 +. +.START \" Begin first chapter. +.PP +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at +ante. Mauris eleifend, quam a vulputate dictum, massa quam dapibus +leo, eget vulputate orci purus ut lorem. In fringilla mi in ligula. +Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio, +tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla +aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit +amet erat quis risus feugiat viverra. Pellentesque augue justo, +sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In +cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci. +Curabitur dolor nunc, egestas at, accumsan at, malesuada nec, magna. +.PP +Nulla facilisi. Nunc volutpat. Vestibulum ante ipsum primis in +faucibus orci luctus et ultrices posuere cubilia Curae; Ut sit +amet orci vel mauris blandit vehicula. Nullam quis enim. Integer +dignissim viverra velit. Curabitur in odio. In hac habitasse platea +dictumst. Ut consequat, tellus eu volutpat varius, justo orci +elementum dolor, sed imperdiet nulla tellus ut diam. Vestibulum +ipsum ante, malesuada quis, tempus ac, placerat sit amet, elit. +.PP +Sed eget turpis a pede tempor malesuada. Vivamus quis mi at leo +pulvinar hendrerit. Cum sociis natoque penatibus et magnis dis +parturient montes, nascetur ridiculus mus. Pellentesque aliquet +lacus vitae pede. Nullam mollis dolor ac nisi. Phasellus sit amet +urna. Praesent pellentesque sapien sed lacus. Donec lacinia odio +in odio. In sit amet elit. Maecenas gravida interdum urna. Integer +pretium, arcu vitae imperdiet facilisis, elit tellus tempor nisi, +vel feugiat ante velit sit amet mauris. Vivamus arcu. Integer +pharetra magna ac lacus. Aliquam vitae sapien in nibh vehicula +auctor. Suspendisse leo mauris, pulvinar sed, tempor et, consequat +ac, lacus. Proin velit. Nulla semper lobortis mauris. Duis urna +erat, ornare et, imperdiet eu, suscipit sit amet, massa. Nulla nulla +nisi, pellentesque at, egestas quis, fringilla eu, diam. +.PP +Donec semper, sem nec tristique tempus, justo neque commodo nisl, +ut gravida sem tellus suscipit nunc. Aliquam erat volutpat. Ut +tincidunt pretium elit. Aliquam pulvinar. Nulla cursus. Suspendisse +potenti. Etiam condimentum hendrerit felis. Duis iaculis aliquam +enim. Donec dignissim augue vitae orci. Curabitur luctus felis a +metus. Cum sociis natoque penatibus et magnis dis parturient montes, +nascetur ridiculus mus. In varius neque at enim. Suspendisse massa +nulla, viverra in, bibendum vitae, tempor quis, lorem. +.PP +Donec dapibus orci sit amet elit. Maecenas rutrum ultrices lectus. +Aliquam suscipit, lacus a iaculis adipiscing, eros orci pellentesque +nisl, non pharetra dolor urna nec dolor. Integer cursus dolor vel +magna. Integer ultrices feugiat sem. Proin nec nibh. Duis eu dui +quis nunc sagittis lobortis. Fusce pharetra, enim ut sodales luctus, +lectus arcu rhoncus purus, in fringilla augue elit vel lacus. In +hac habitasse platea dictumst. Aliquam erat volutpat. Fusce iaculis +elit id tellus. Ut accumsan malesuada turpis. Suspendisse potenti. +Vestibulum lacus augue, lobortis mattis, laoreet in, varius at, +nisi. Nunc gravida. Phasellus faucibus. In hac habitasse platea +dictumst. Integer tempor lacus eget lectus. Praesent fringilla augue +fringilla. +.PP +Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio, +tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla +aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit +amet erat quis risus feugiat viverra. Pellentesque augue justo, +sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In +cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci. +.TOC +.\" Local Variables: +.\" mode: nroff +.\" End: +.\" vim: filetype=groff: diff --git a/contrib/mom/examples/copyright-default.mom b/contrib/mom/examples/copyright-default.mom new file mode 100644 index 0000000..25a428f --- /dev/null +++ b/contrib/mom/examples/copyright-default.mom @@ -0,0 +1,149 @@ +.\" -*- mode: text; coding: utf-8; -*- +\# +\# Copyright (C) 2019-2020 Free Software Foundation, Inc. +\# +\# Copying and distribution of this file, with or without modification, +\# are permitted in any medium without royalty provided the copyright +\# notice and this notice are preserved. +\# +.ig +***Template for created a copyright page, DOCTYPE DEFAULT*** + +Mom documents comprised of titled sections using DOCTYPE DEFAULT +(e.g. a collection of articles or a book of short stories by +different authors) require the START macro to begin each new +section, and the COLLATE macro to join it to the subsequent section. +. +A copyright page (also called an edition page) should be treated +as a titled section. The text of the copyright page is entered +after START and joined to the next major section (i.e. the beginning +of a document's content) with COLLATE. +. +Copyright pages are not identified by a title or heading, however +they require a TITLE in order to be included in PDF viewer outlines +and, if desired, the Table of Contents. Supplying '.TITLE "Copyright"' +but disabling the DOCHEADER achieves both these requirements. +. +Pagination should also be disabled for the copyright page. Both +docheader and pagination should be re-enabled before the START of +the first (titled) section of the document. +.. +. +.\" Cover and PDF viewer setup +. +.\" By default, mom uses the last TITLE macro before START for the +.\" title that appears on the cover. Since the TITLE is "Copyright," +.\" mom needs to be told explicitly to use a different title. +. +.TITLE DOC_COVER \ + "Document Title" +.EDITOR DOC_COVER \ + "Document Editor" +.ATTRIBUTE_STRING DOC_COVER \ + "Edited by" +.DOC_COVER \ + TITLE EDITOR +.PDF_TITLE \ + "DOCTYPE DEFAULT with copyright page" \" For PDF viewer titlebar +. +.\" Copyright page setup +. +.PRINTSTYLE TYPESET +.DOCHEADER off 1i \" Turn off docheader for copyright page. +. \" Begin text 1 inch from page top. +.PAGINATION off \" Disable pagination for copyright page. +. +.TITLE "Copyright" \" Required for PDF viewer outline; does not +. \" get printed because docheader is disabled. +. +.NO_TOC_ENTRY \" So copyright page is not included in the TOC +. +.START \" Begin copyright page +All rights reserved. No part of this publication may be reproduced, +distributed, or transmitted in any form or by any means, including +photocopying, recording, or other electronic or mechanical methods, +without the prior written permission of the publisher, except +in the case of brief quotations embodied in critical reviews +and certain other noncommercial uses permitted by copyright +law. For permission requests, write to the publisher, addressed +“Attention: Permissions Coordinator,” at the address below. +.SP +.LEFT +Copyright \[co]2019 Copyright Holder +.SP +Additional information... +.TOC_AFTER_HERE \" Place TOC after copyright page. +. +.COLLATE +. +.\" Sample article setup +. +.TITLE \ + "Sample article" \" Title of first article +.AUTHOR \ + "Article Author" +.DOCHEADER \" Re-enable docheader. +.PAGINATE \" Re-enable pagination. +.PAGENUMBER 1 +. +.START +.PP +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at +ante. Mauris eleifend, quam a vulputate dictum, massa quam dapibus +leo, eget vulputate orci purus ut lorem. In fringilla mi in ligula. +Pellentesque aliquam quam vel dolor. Nunc adipiscing. Sed quam odio, +tempus ac, aliquam molestie, varius ac, tellus. Vestibulum ut nulla +aliquam risus rutrum interdum. Pellentesque lorem. Curabitur sit +amet erat quis risus feugiat viverra. Pellentesque augue justo, +sagittis et, lacinia at, venenatis non, arcu. Nunc nec libero. In +cursus dictum risus. Etiam tristique nisl a nulla. Ut a orci. +Curabitur dolor nunc, egestas at, accumsan at, malesuada nec, magna. +.PP +Nulla facilisi. Nunc volutpat. Vestibulum ante ipsum primis in +faucibus orci luctus et ultrices posuere cubilia Curae; Ut sit +amet orci vel mauris blandit vehicula. Nullam quis enim. Integer +dignissim viverra velit. Curabitur in odio. In hac habitasse platea +dictumst. Ut consequat, tellus eu volutpat varius, justo orci +elementum dolor, sed imperdiet nulla tellus ut diam. Vestibulum +ipsum ante, malesuada quis, tempus ac, placerat sit amet, elit. +.PP +Sed eget turpis a pede tempor malesuada. Vivamus quis mi at leo +pulvinar hendrerit. Cum sociis natoque penatibus et magnis dis +parturient montes, nascetur ridiculus mus. Pellentesque aliquet +lacus vitae pede. Nullam mollis dolor ac nisi. Phasellus sit amet +urna. Praesent pellentesque sapien sed lacus. Donec lacinia odio +in odio. In sit amet elit. Maecenas gravida interdum urna. Integer +pretium, arcu vitae imperdiet facilisis, elit tellus tempor nisi, +vel feugiat ante velit sit amet mauris. Vivamus arcu. Integer +pharetra magna ac lacus. Aliquam vitae sapien in nibh vehicula +auctor. Suspendisse leo mauris, pulvinar sed, tempor et, consequat +ac, lacus. Proin velit. Nulla semper lobortis mauris. Duis urna +erat, ornare et, imperdiet eu, suscipit sit amet, massa. Nulla nulla +nisi, pellentesque at, egestas quis, fringilla eu, diam. +.PP +Donec semper, sem nec tristique tempus, justo neque commodo nisl, +ut gravida sem tellus suscipit nunc. Aliquam erat volutpat. Ut +tincidunt pretium elit. Aliquam pulvinar. Nulla cursus. Suspendisse +potenti. Etiam condimentum hendrerit felis. Duis iaculis aliquam +enim. Donec dignissim augue vitae orci. Curabitur luctus felis a +metus. Cum sociis natoque penatibus et magnis dis parturient montes, +nascetur ridiculus mus. In varius neque at enim. Suspendisse massa +nulla, viverra in, bibendum vitae, tempor quis, lorem. +.PP +Donec dapibus orci sit amet elit. Maecenas rutrum ultrices lectus. +Aliquam suscipit, lacus a iaculis adipiscing, eros orci pellentesque +nisl, non pharetra dolor urna nec dolor. Integer cursus dolor vel +magna. Integer ultrices feugiat sem. Proin nec nibh. Duis eu dui +quis nunc sagittis lobortis. Fusce pharetra, enim ut sodales luctus, +lectus arcu rhoncus purus, in fringilla augue elit vel lacus. In +hac habitasse platea dictumst. Aliquam erat volutpat. Fusce iaculis +elit id tellus. Ut accumsan malesuada turpis. Suspendisse potenti. +Vestibulum lacus augue, lobortis mattis, laoreet in, varius at, +nisi. Nunc gravida. Phasellus faucibus. In hac habitasse platea +dictumst. Integer tempor lacus eget lectus. Praesent fringilla augue +fringilla dui. +.TOC +.\" Local Variables: +.\" mode: nroff +.\" End: +.\" vim: filetype=groff: diff --git a/contrib/mom/examples/elvis_syntax b/contrib/mom/examples/elvis_syntax index 68a0c35..b5735bf 100644 --- a/contrib/mom/examples/elvis_syntax +++ b/contrib/mom/examples/elvis_syntax @@ -1,4 +1,4 @@ -" Copyright (C) 2004-2018 Free Software Foundation, Inc. +" Copyright (C) 2004-2020 Free Software Foundation, Inc. " " Copying and distribution of this file, with or without modification, " are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/elvis_syntax.new b/contrib/mom/examples/elvis_syntax.new index fd63275..5dadecc 100644 --- a/contrib/mom/examples/elvis_syntax.new +++ b/contrib/mom/examples/elvis_syntax.new @@ -1,4 +1,4 @@ -" Copyright (C) 2004-2018 Free Software Foundation, Inc. +" Copyright (C) 2004-2020 Free Software Foundation, Inc. " " Copying and distribution of this file, with or without modification, " are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/letter.mom b/contrib/mom/examples/letter.mom index 1d1eac5..6e1a0c0 100644 --- a/contrib/mom/examples/letter.mom +++ b/contrib/mom/examples/letter.mom @@ -1,6 +1,6 @@ .\" -*- mode: text; coding: utf-8; -*- \# -\# Copyright (C) 2004-2018 Free Software Foundation, Inc. +\# Copyright (C) 2004-2020 Free Software Foundation, Inc. \# \# Copying and distribution of this file, with or without modification, \# are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/mom-pdf.mom b/contrib/mom/examples/mom-pdf.mom index 17c0b4c..15cf6df 100644 --- a/contrib/mom/examples/mom-pdf.mom +++ b/contrib/mom/examples/mom-pdf.mom @@ -1,6 +1,6 @@ .\" -*- mode: text; coding: utf-8; -*- .\" -.\" Copyright (C) 2012-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2012-2020 Free Software Foundation, Inc. .\" .\" This file is part of mom, which is part of groff, a free software .\" project. @@ -40,12 +40,12 @@ .PT_SIZE 10.5 .AUTOLEAD 3 .PARA_INDENT 0 \" No indent because we're spacing paragraphs. -.\" Copyright notice .COVERTEXT .SP .5v .QUAD CENTER .HY off .IB 8P +.\" Copyright notice This file is part of groff. .SP .5v Groff is free software. You can redistribute it @@ -99,24 +99,24 @@ If not, see: .\" .FOOTNOTE_SIZE -1 .\" Character definitions for program names, opts, etc. -.char \[ghostscript] \*[BD]ghostscript\*[PREV] -.char \[groff] \*[BD]groff\*[PREV] -.char \[gropdf] \*[BD]gropdf\*[PREV] -.char \[grops] \*[BD]grops\*[PREV] -.char \[man] \*[BD]man\*[PREV] -.char \[-mom] \*[BD]\-mom\*[PREV] -.char \[mom] \*[BD]mom\*[PREV] -.char \[-mpdfmark] \*[BD]\-mpdfmark\*[PREV] -.char \[ms] \*[BD]ms\*[PREV] -.char \[pdfmom] \*[BD]pdfmom\*[PREV] -.char \[pdfroff] \*[BD]pdfroff\*[PREV] -.char \[-P-e] \*[BD]\-P\-e\*[PREV] -.char \[-P-p] \*[BD]\-P\-p\*[PREV] -.char \[ps2pdf] \*[BD]ps2pdf\*[PREV] -.char \[psselect] \*[BD]psselect\*[PREV] -.char \[-T] \*[BD]\-T\*[PREV] -.char \[-Tpdf] \*[BD]\-Tpdf\*[PREV] -.char \[-Tps] \*[BD]\-Tps\*[PREV] +.char \[ghostscript] \*[BD]ghostscript\*[PREV] +.char \[groff] \*[BD]groff\*[PREV] +.char \[gropdf] \*[BD]gropdf\*[PREV] +.char \[grops] \*[BD]grops\*[PREV] +.char \[man] \*[BD]man\*[PREV] +.char \[-mom] \*[BD]\-mom\*[PREV] +.char \[mom] \*[BD]mom\*[PREV] +.char \[-mpdfmark] \*[BD]\-mpdfmark\*[PREV] +.char \[ms] \*[BD]ms\*[PREV] +.char \[pdfmom] \*[BD]pdfmom\*[PREV] +.char \[pdfroff] \*[BD]pdfroff\*[PREV] +.char \[-P-e] \*[BD]\-P\-e\*[PREV] +.char \[-P-p] \*[BD]\-P\-p\*[PREV] +.char \[ps2pdf] \*[BD]ps2pdf\*[PREV] +.char \[psselect] \*[BD]psselect\*[PREV] +.char \[-T] \*[BD]\-T\*[PREV] +.char \[-Tpdf] \*[BD]\-Tpdf\*[PREV] +.char \[-Tps] \*[BD]\-Tps\*[PREV] .\" Strings for inline code .ds cod \E*[CODE]\&\E*[COND] .ds codx \E*[CONDX]\E*[CODE off]\& @@ -128,13 +128,6 @@ If not, see: . nop \*[COND]\\$*\*[CONDX] . QUOTE OFF .. -.\" Note box -.de BOX-NOTE -. ie \\n[#NUM_ARGS]=1 .DBX .5 0 \\n[.l]u \\$1 -. el .DBX .5 0 \\$1 \\$2 -. ALD 15p -. IB 6p -.. .\" Table of contents .TOC_PADDING 2 .SPACE_TOC_ITEMS @@ -145,7 +138,7 @@ If not, see: .\" .DOCHEADER_ADVANCE 5c \" Begin docheader this distance down from top of page .\" -.NO_SHIM +.NO_SHIM \" Use flex spacing .START .\" .SP .5c @@ -191,7 +184,7 @@ of PDF features available in \[mom]. .COD "pdfmom doc.mom > doc.pdf One reason to prefer using the native PDF driver (via \[pdfmom] or \[-Tpdf]) is that papersizes set within mom source files (see -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro SUFFIX ) \ +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro SUFFIX ) \ "paper and page setup macros" do not require a corresponding \[-P-p] flag on the command line. @@ -299,12 +292,12 @@ used as the text. If hotlink text is given and ends in URL. If it ends in \*[cod]\[dq]+\[dq]\*[codx]\*[BU9], the URL is surrounded by quotes. As an example, .RW 0 -.COD "\&.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/toc.html +.COD "\&.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html would open mom's online documentation at -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/toc.html SUFFIX "." +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html SUFFIX "." The same, with \*[cod]\[dq]here\[dq]\*[codx] supplied as hotlink text, lets you click -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/toc.html "here" +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/toc.html "here" instead. .HEADING 2 NAMED colour "Assigning a colour to links" .PP @@ -312,9 +305,9 @@ The colour of links is set with .COD "\&.PDF_LINK_COLOR | | | <#rrggbb> where \*[cod]\*[codx] or \*[cod]\*[codx] are the names of colours already initialized with -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/color.html#xcolor "XCOLOR" +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/color.html#xcolor "XCOLOR" or -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/color.html#newcolor SUFFIX . "NEWCOLOR" +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/color.html#newcolor SUFFIX . "NEWCOLOR" If you prefer to define a new colour (using the RGB colour scheme), enter it either as 3 numbers between 0.0 \*[UP 1p]\[->]\*[DOWN 1p] 1\*[BU4].0 @@ -412,7 +405,7 @@ can remove the window title by issuing .COD ".PDF_TITLE \[dq]\[dq] \e\[dq] ie. with a blank argument .IBQ .FLOAT off -.SP .5v +\#.SP .5v .HEADING 1 NAMED toc "Tables of Contents" .RLD .5v .HEADING 2 NAMED toc:gen "Generating a Table of Contents @@ -423,7 +416,7 @@ insert the macro, \*[cod]TOC\*[codx], as the last line of the source file. (Formatting of the printable Table of Contents is discussed in detail in the .PDF_WWW_LINK \ -http://www.schaffter.ca/mom/momdoc/tables-of-contents.html#top \ +https://www.schaffter.ca/mom/momdoc/tables-of-contents.html#top \ SUFFIX ). "mom documentation" When the file is processed and loaded in a viewer, entries in the Table of Contents will be clickable links. @@ -461,7 +454,7 @@ the \*[cod]TOP\*[codx] argument. BEFORE_DOCCOVER AFTER_DOCCOVER BEFORE_COVER -AFTER_COVER\*[SIZE] +AFTER_COVER\*[SIZE +.7] .SP .25v .ILQ .JUSTIFY @@ -532,18 +525,20 @@ The resulting PDF is produced from PostScript output fed into For either invocation, it is not necessary to add \[-mom] or \[-mpdfmark], as these are implied. .PP +.RW .04 If Encapsulated PostScript or plain PostScript images have been embedded in a document with -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/images.html#pspic SUFFIX , \ +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/images.html#pspic SUFFIX , \ "PSPIC" the \[-Tps] option must be used. In most other cases, \[pdfmom] with no \[-T] flag is preferable. +.RW 0 .HEADING 2 NAMED papersize "Setting papersize within a source file" .PP A significant convenience afforded by using \[pdfmom] (or \[groff] with the \[-Tpdf] flag) is that papersizes or page dimensions set within mom source files (see -.PDF_WWW_LINK http://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro \ +.PDF_WWW_LINK https://www.schaffter.ca/mom/momdoc/typesetting.html#page-setup-intro \ SUFFIX ) "paper and page setup macros" do not require a corresponding \[-P-p] option on the command line. It is even possible to create documents with @@ -552,8 +547,8 @@ unequal-sized pages. "Differences between pdfmom and pdfroff" .PP Several features described in this manual are not available when -using \[pdfmom] with the \[-Tps] option, or when using \[pdfroff], or -\[groff]\~\[-Tps]\~\[-mpdfmark]: +the \[-Tps] option is given to \[pdfmom], nor when using \[pdfroff] +or \[groff]\~\[-Tps]\~\[-mpdfmark]: .SP .25v .QUAD LEFT .HYPHENATION off @@ -587,8 +582,6 @@ only accepts colour definitions in decimal notation. does not support all the features described here .ITEM accepts images and graphics embedded with PSPIC -.ITEM -is mature and well-tested code .LIST OFF .IQ .ALD .4v @@ -605,27 +598,20 @@ for the papersize flag (\[-P-p]) on the command line .ITEM is not compatible with .PDF_WWW_LINK \ - http://www.schaffter.ca/mom/momdoc/docprocessing.html#printstyle \ + https://www.schaffter.ca/mom/momdoc/docprocessing.html#printstyle \ "PRINTSTYLE TYPEWRITE" underlining (e.g., of italics) .ITEM generally produces larger files; these can be reduced by piping the output through \[ps2pdf]\*[B] -.FLOAT -.QUAD LEFT -.BR_AT_LINE_KERN -.IL -2P -.BOX-NOTE (\n[.l]u-6P) 3P -.EW .3 -\*[BD]Note:\*[PREV] Owing to a known bug, PDF files piped -through \[ps2pdf] lose some of -.EW 0 -their metadata, notably the window title set with -\*[cod]PDF_TITLE\*[codx]. -.SP .75 -.FLOAT off -.ITEM -is newer code with less testing +.sp -1.25v +.BOX OUTLINED black SHADED grey90 WEIGHT 1p INSET 6p +.JUSTIFY +\*[BD]Note:\*[PREV] Owing to a known bug, PDF files piped through +\[ps2pdf] lose some of their metadata, notably the window title set +with \*[cod]PDF_TITLE\*[codx]. +.BOX STOP +.SP -.25v .LIST OFF .TOC .\" Local Variables: diff --git a/contrib/mom/examples/mom.vim b/contrib/mom/examples/mom.vim index 340e2c8..fe8debf 100644 --- a/contrib/mom/examples/mom.vim +++ b/contrib/mom/examples/mom.vim @@ -1,4 +1,4 @@ -" Copyright (C) 2012-2018 Free Software Foundation, Inc. +" Copyright (C) 2012-2020 Free Software Foundation, Inc. " " Copying and distribution of this file, with or without modification, " are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/mon_premier_doc.mom b/contrib/mom/examples/mon_premier_doc.mom index ffb1b19..3497c06 100644 --- a/contrib/mom/examples/mon_premier_doc.mom +++ b/contrib/mom/examples/mon_premier_doc.mom @@ -1,6 +1,6 @@ .\" -*- mode: text; coding: utf-8; -*- \# -\# Copyright (C) 2015-2018 Free Software Foundation, Inc. +\# Copyright (C) 2015-2020 Free Software Foundation, Inc. \# \# Copying and distribution of this file, with or without modification, \# are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/sample_docs.mom b/contrib/mom/examples/sample_docs.mom index 5c25a2a..f9b2933 100644 --- a/contrib/mom/examples/sample_docs.mom +++ b/contrib/mom/examples/sample_docs.mom @@ -1,6 +1,6 @@ .\" -*- mode: text; coding: utf-8; -*- \# -\# Copyright (C) 2004-2018 Free Software Foundation, Inc. +\# Copyright (C) 2004-2020 \# \# Copying and distribution of this file, with or without modification, \# are permitted in any medium without royalty provided the copyright diff --git a/contrib/mom/examples/slide-demo.mom b/contrib/mom/examples/slide-demo.mom index 2dc4439..989ce5a 100644 --- a/contrib/mom/examples/slide-demo.mom +++ b/contrib/mom/examples/slide-demo.mom @@ -1,13 +1,12 @@ .\" -*- mode: text; coding: utf-8; -*- -. -.\"---------------------------------------------------------------- -.\" Make first slide black. Remove if printing to save ink. -.po 0 -.ll 11i -.DBX SOLID 0 \n[.l]u \n[.p]u -.\"---------------------------------------------------------------- -. -.\"---------------------------------------------------------------- +\# +\# Copyright (C) 2004-2020 Free Software Foundation, Inc. +\# Revised for version 2.5 2021-08. +\# +\# Copying and distribution of this file, with or without modification, +\# are permitted in any medium without royalty provided the copyright +\# notice and this notice are preserved. +\# .\" Macro for code blocks .de CODE_BLOCK . ie \\n[.$] \{\ @@ -74,7 +73,12 @@ . .STRING hand \*[darkred]\[rh]\*[black] . +.\" Make first slide black. +.\" If printing, remove to save ink. +.SLIDE_COLOR black +. .START +.SLIDE_COLOR off . .ADD_SPACE 9p .IB 8P @@ -250,12 +254,44 @@ parameters.\*[BU6]\*[UP 2p]\s[-2]*\s[0] .PT_SIZE +2 . .NEWSLIDE "Blinds .5" +.SLIDE_COLOR antiquewhite . .ADD_SPACE 9p . -.HEADING 1 "Macros and preprocessors" +.HEADING 1 "Highlighting items .SP .5v +.PP +The BOX macro lets you highlight items as they are revealed with +frames and shaded backgrounds\*[HANG .] +.PAUSE "Fade .5" +.BOX SHADED pink INSET 3p +.PP +This item is highlighted with a shaded background\*[HANG .] +.PAUSE +.PP +The highlight moves to each new item as it's revealed\*[HANG .] +.PAUSE +.PP +Highlighting can continue for as many slides as you want\*[HANG .] +.PAUSE +.PP +If there are no pauses on a slide, BOX can be used +.BR +to provide a background for all the items\*[HANG .] +.PAUSE +.PP +The SLIDE_COLOR macro lets you colour +.BR +the whole slide (q.v.)\*[HANG .] +.BOX off +. +.NEWSLIDE "Box 1 . O" +.SLIDE_COLOR off +. +.ADD_SPACE 9p . +.HEADING 1 "Macros and preprocessors" +.SP .5v .PP Slides can make full use of all mom's document processing and typesetting macros, including preprocessors and image insertion\*[HANG .] @@ -265,20 +301,22 @@ typesetting macros, including preprocessors and image insertion\*[HANG .] . .PAD "\ \*[FWD 4P+6p]\*[ST1]#\*[ST1X]\ -\*[FWD 1P]\*[ST2]#\*[ST2X]\ -\*[FWD 3P+6p]\*[ST3]#\*[ST3X]\ +\*[FWD 2P+6p]\*[ST2]\*[FWD 12P]\\*[ST2X]\ +\*[FWD 3P+9p]\*[ST3]#\*[ST3X]\ \*[FWD 3P]\*[ST4]#\*[ST4X]\*[FWD 2P]" . .ST 1 L -.ST 2 L -.ST 3 L -.ST 4 L +.ST 2 C +.ST 3 C +.ST 4 C . .PAUSE "Fade .5" . .TAB 1 .PT_SIZE -1.5 +.CENTER \*[BD]\*[blue2]\*[DOWN 6p]tbl +.LEFT .mk .PT_SIZE -1 .COLOR blue2 @@ -307,7 +345,7 @@ _ \*[FWD 10p]\*[DOWN 6p]pic .COLOR green4 .SP 3p -.PS 2 +.PS 2 LEFT A: ellipse wid 0.5 ht 0.5 arrow color "green4" up 0.2 from A.n arrow color "green4" up 0.2 right 0.2 from A.ne @@ -345,11 +383,11 @@ f sub X (x) ^=^ left { .COLOR blue2 \*[DOWN 6p]pdf image\*[black]\*[PREV] .SP 2P+6p -.PDF_IMAGE -L penguin.pdf 81p 96p FRAME +.PDF_IMAGE -C penguin.pdf 81p 96p FRAME .TQ . .NEWSLIDE "Box 1 . O" -.ADD_SPACE 9p +.ADD_SPACE 5p .IB 10P .PT_SIZE +1.5 . @@ -394,3 +432,7 @@ manpage for complete information concerning slide usage\*[HANG .] . DCL SOLID \n+[dcl-ind]P 9p 9p blue2 .\} .CENTER_BLOCK off +.\" Local Variables: +.\" mode: nroff +.\" End: +.\" vim: filetype=groff: diff --git a/contrib/mom/examples/test-mom.sh.in b/contrib/mom/examples/test-mom.sh.in index 0841b37..ebaba20 100644 --- a/contrib/mom/examples/test-mom.sh.in +++ b/contrib/mom/examples/test-mom.sh.in @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2018- Free Software Foundation, Inc. +# Copyright (C) 2018-2020 Free Software Foundation, Inc. # # This file is part of groff. # @@ -29,6 +29,8 @@ list=" sample_docs.pdf slide-demo.pdf typesetting.pdf + copyright-chapter.pdf + copyright-default.pdf " if test "$have_urw_fonts" != "yes"; then @@ -36,6 +38,15 @@ if test "$have_urw_fonts" != "yes"; then exit 77 fi +for cmd in pdfinfo pdfimages +do + if ! command -v $cmd >/dev/null + then + echo "cannot locate '$cmd' command; skipping" >&2 + exit 77 # skip + fi +done + # $1: pdf file # $2: expected number of pages check_number_pages() @@ -70,8 +81,10 @@ check_number_pages "$examplesdir/letter.pdf" 1 check_number_pages "$examplesdir/mom-pdf.pdf" 8 check_number_pages "$examplesdir/mon_premier_doc.pdf" 5 check_number_pages "$examplesdir/sample_docs.pdf" 12 -check_number_pages "$examplesdir/slide-demo.pdf" 27 +check_number_pages "$examplesdir/slide-demo.pdf" 33 check_number_pages "$examplesdir/typesetting.pdf" 3 +check_number_pages "$examplesdir/copyright-chapter.pdf" 5 +check_number_pages "$examplesdir/copyright-default.pdf" 5 check_has_images "$examplesdir/typesetting.pdf" check_has_images "$examplesdir/slide-demo.pdf" diff --git a/contrib/mom/examples/typesetting.mom b/contrib/mom/examples/typesetting.mom index a35b237..e273611 100644 --- a/contrib/mom/examples/typesetting.mom +++ b/contrib/mom/examples/typesetting.mom @@ -1,6 +1,6 @@ .\" -*- mode: text; coding: utf-8; -*- \# -\# Copyright 2004-2018 Free Software Foundation, Inc. +\# Copyright 2004-2020 Free Software Foundation, Inc. \# \# Copying and distribution of this file, with or without modification, \# are permitted in any medium without royalty provided the copyright @@ -439,7 +439,7 @@ text. .COMMENT Now, set up the indented bullet-point sublist. The PAD line says: move forward 12 points (1 pica), then mark off a string -tab (ST3) that's the length of the bullet character; move foward +tab (ST3) that's the length of the bullet character; move forward another three points, then make the next string tab (ST4) the length of remainder of the line. .COMMENT OFF diff --git a/contrib/mom/groff_mom.7.man b/contrib/mom/groff_mom.7.man index 6cb2bcd..3872b8f 100644 --- a/contrib/mom/groff_mom.7.man +++ b/contrib/mom/groff_mom.7.man @@ -1,19 +1,14 @@ -.TH GROFF_MOM @MAN7EXT@ "@MDATE@" "groff @VERSION@" -.SH NAME -groff_mom \- groff \(lqmom\(rq macros; \(lqmom\(rq is a \(lqroff\(rq \ -language, part of \(lqgroff\(rq -. -. -.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). -.do nr groff_mom_C \n[.C] -.cp 0 +.TH groff_mom @MAN7EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +groff_mom \- modern macros for document composition with GNU +.I roff . . .\" ==================================================================== .\" Legal Terms .\" ==================================================================== .\" -.\" Copyright (C) 2002-2018 Free Software Foundation, Inc. +.\" Copyright (C) 2002-2020 Free Software Foundation, Inc. .\" .\" This file is part of mom, which is part of groff, the GNU roff .\" type-setting system. @@ -33,12 +28,30 @@ language, part of \(lqgroff\(rq .\" . . . +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_groff_mom_7_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. .\" ==================================================================== .\" Setup .\" ==================================================================== . -.ds Ellipsis \&.\|.\|.\&\" -. .hw line-space . . @@ -61,212 +74,160 @@ language, part of \(lqgroff\(rq . if (\\n[.$] = 1) .as result \,\f[\\$1] . nh . nop \\*[result]\& -. hy +. rm result +. hy \\n[HY] .. . . .\" ==================================================================== -.SH "SYNOPSIS" +.SH Synopsis .\" ==================================================================== . -.SY pdfmom -.RB [ \-Tps -.RI [ pdfroff-option -\*[Ellipsis]]] -.RI [ groff-option -\*[Ellipsis]] -.I file -\*[Ellipsis] -.YS -. .SY groff .B \-mom -.RI [ option -\*[Ellipsis]] -.I file -\*[Ellipsis] +.RI [ option\~ .\|.\|.\&] +.RI [ file\~ .\|.\|.] +. .SY groff .B "\-m mom" -.RI [ option -\*[Ellipsis]] -.I file -\*[Ellipsis] +.RI [ option\~ .\|.\|.\&] +.RI [ file\~ .\|.\|.] .YS . . .\" ==================================================================== -.SH CALLING MOM +.SH Description .\" ==================================================================== . -.B mom +.I mom is a macro set for -.BR groff , -designed primarily to format documents for -.I PDF -and -.I PostScript -output. +.IR groff , +designed primarily to prepare documents for PDF and PostScript output. . . -.P -.B mom -provides two categories of macros: macros for typesetting, and -macros for document processing. +.I mom +provides macros in two categories: typesetting +and document processing. . -The typesetting macros provide access to groff's typesetting -capabilities in ways that are simpler to master than groff's -primitives. +The former provide access to +.IR groff 's +typesetting capabilities in ways that are simpler to master than +.IR groff 's +requests and escape sequences. . -The document processing macros provide highly customizable markup -tags that allow the user to design and output professional-looking -documents with a minimum of typesetting intervention. +The latter provide highly customizable markup tags that allow the user +to design and output professional-looking documents with a minimum of +typesetting intervention. . . .P Files processed with -.BR pdfmom (@MAN1EXT@) -with or without the -.RI \-T ps -option, produce -.I PDF -documents. -. -The documents include a -.I PDF -outline that appears in the \[oq]Contents\[cq] panel of document -viewers, and may contain clickable internal and external links. +.MR pdfmom @MAN1EXT@ +produce PDF documents. . +The documents include a PDF outline that appears in the navigation pane +panel of document viewers, +and may contain clickable internal and external links. . .P -When -.RI \-T ps -is absent, -.B groff's -native -.I PDF -driver, -.BR gropdf , +Normally. +.IR groff 's +native PDF driver, +.MR gropdf @MAN1EXT@ , is used to generate the output. . -When given, the output is still -.IR PDF , -but processing is passed over to -.BR pdfroff , +When +.I pdfmom +is given the +.RB \[lq] "\-T ps" \[rq] +option, +it still produces PDF, +but processing is delegated to +.IR pdfroff , which uses -.B groff's +.IR groff 's PostScript driver, -.BR grops \&. -Not all -.I PDF -features are available when -.RI \-T ps -is given; its primary use is to allow processing of files with -embedded -.I PostScript +.MR grops @MAN1EXT@ . +. +Not all PDF features are available when +.B \-T ps +is given; +its primary use is to allow processing of files with embedded PostScript images. +.\" XXX: but we have PDFPIC now...so -Tps is necessary only for people +.\" who want to avoid use of unsafe mode? . . .P Files processed with .B groff \-mom (or -.BI "\-m " mom\/\c -) produce -.I PostScript -output by default. +.BR "\-m mom" ) +format for the device specified with the +.B \-T +option. +. +(In this installation, +.B @DEVICE@ +is the default output device.) . . .P -.B mom -comes with her own very complete documentation in -.I HTML -format. +.I mom +comes with her own comprehensive documentation in HTML. . -A separate -.IR "PDF manual" , -.I Producing PDFs -with groff and -.BR mom , -covers full -.B mom -or -.I PDF -usage. +A PDF manual, +\[lq]Producing PDFs with +.I groff +and +.IR mom \[rq], +discusses preparation of PDF documents with +.I mom +in detail. . . .\" ==================================================================== -.SH FILES +.SH Files .\" ==================================================================== . .TP -.I @MACRODIR@/\:om.tmac -\[en] the main macro file -.TQ .I @MACRODIR@/\:mom.tmac -\[en] a wrapper file that calls om.tmac directly. +is a wrapper enabling the package to be loaded with +.RB \[lq] "groff \-m mom" \[rq]. . -.TP -.I @HTMLDOCDIR@/\:mom/\:toc.html -\[en] entry point to the HTML documentation -. -.TP -.I @PDFDOCDIR@/\:mom\-pdf.pdf -\[en] the PDF manual, -.I Producing PDFs with groff and mom . .TP -.IR @EXAMPLEDIR@/\:mom/\: * .mom -\[en] example files using mom -. -. -.\" ==================================================================== -.SH DOCUMENTATION IN ALPHABETICAL ORDER -.\" ==================================================================== -. -. -This part of the man page contains information just as in groff(7), -.I mom macros -and -.I mom escape sequences -in alphabetical order. -. +.I @MACRODIR@/\:om.tmac +implements the package. . -.P -The logical order of -.I mom macros -and -.I mom escape sequences -is very well documented in . .TP .I @HTMLDOCDIR@/\:mom/\:toc.html -\[en] entry point to the HTML documentation -. -. -.P -That document is quite good for beginners, but other users should be -happy to have some documentation in reference style. +is the entry point to the HTML documentation. . . -.P -So we restrict this part to the alphabetical order of macros and -escape sequences. -. -But, so far, we took all documentation details from the -.I toc.html -file, just in a more useful alphabetical order. +.TP +.I @PDFDOCDIR@/\:mom\-pdf.pdf +is \[lq]Producing PDFs with +.I groff +and +.IR mom \[rq], +by Deri James and Peter Schaffter. . . -So this part of the man page is nothing new, but only a logical -arrangement. +.TP +.IR @EXAMPLEDIR@/\:mom/\: * .mom +are examples of +.I mom +usage. . . .\" ==================================================================== -.SH "QUICK REFERENCE" +.SH Reference .\" ==================================================================== . .\" ==================================================================== -.SS "Quick Reference of Inline Escape Sequences in alphabetical Order" +.SS "Escape sequences" .\" ==================================================================== . .TP @@ -276,7 +237,7 @@ begin using an initialized colour inline . .TP .FONT B \[rs]*[BCK I " n" B ] -move backwards in a line +move backward in a line . . .TP @@ -310,13 +271,13 @@ off pseudo condensing inline (related to macro . . .TP -.FONT B \[rs]*[CONDSUP] R \*[Ellipsis] B \[rs]*[CONDSUPX] +.FONT B \[rs]*[CONDSUP] R .\|.\|. B \[rs]*[CONDSUPX] pseudo-condensed superscript . . .TP .FONT B \[rs]*[DOWN I " n" B ] -temporarily move downwards in a line +temporarily move downward in a line . . .TP @@ -338,7 +299,7 @@ off pseudo condensing inline (related to macro . . .TP -.FONT B \[rs]*[EXTSUP] R \*[Ellipsis] B \[rs]*[EXTSUPX] +.FONT B \[rs]*[EXTSUP] R .\|.\|. B \[rs]*[EXTSUPX] pseudo extended superscript . . @@ -382,12 +343,12 @@ off pseudo italic inline (related to macro . . .TP -.FONT B \[rs]*[ST I B ] R \*[Ellipsis] B \[rs]*[ST I B X] +.FONT B \[rs]*[ST I B ] R .\|.\|. B \[rs]*[ST I B X] string tabs (mark tab positions inline) . . .TP -.FONT B \[rs]*[SUP] R \*[Ellipsis] B \[rs]*[SUPX] +.FONT B \[rs]*[SUP] R .\|.\|. B \[rs]*[SUPX] superscript . . @@ -399,17 +360,17 @@ inline escape for . . .TP -.FONT B \[rs]*[UL] R \*[Ellipsis] B \[rs]*[ULX] +.FONT B \[rs]*[UL] R .\|.\|. B \[rs]*[ULX] invoke underlining inline (fixed width fonts only) . . .TP .FONT B \[rs]*[UP I " n" B ] -temporarily move upwards in a line +temporarily move upward in a line . . .\" ==================================================================== -.SS "Quick Reference of Macros in alphabetical Order" +.SS Macros .\" ==================================================================== . .TP @@ -625,11 +586,11 @@ set the minimum word space size . . .\" ==================================================================== -.SH "DOCUMENTATION OF DETAILS" +.SH "Documentation of details" .\" ==================================================================== . .\" ==================================================================== -.SS "Details of Inline Escape Sequences in alphabetical Order" +.SS "Details of inline escape sequences in alphabetical order" .\" ==================================================================== . .TP @@ -639,12 +600,12 @@ begin using an initialized colour inline . .TP .FONT B \[rs]*[BCK I " n" B ] -move wards in a line +move backward in a line . . -.\" ====================================================================== +.\" ==================================================================== .\" BOLDER -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[BOLDER] .TQ @@ -660,11 +621,14 @@ begins emboldening type. .B \[rs]*[BOLDERX] turns the feature off. . -Both are inline escapes, therefore they should not appear as separate -lines, but rather be embedded in text lines, like this: +Both are inline escape sequences; +therefore, +they should not appear as separate lines, +but rather be embedded in text lines, like this: .RS .EX -.FONT R "Not " B \[rs]*[BOLDER] R everything B \[rs]*[BOLDERX] R " is as it seems." +.FONT R "Not " B \[rs]*[BOLDER] R everything B \[rs]*[BOLDERX] \ +R " is as it seems." .EE .RE . @@ -672,7 +636,8 @@ lines, but rather be embedded in text lines, like this: Alternatively, if you wanted the whole line emboldened, you should do .RS .EX -.FONT B \[rs]*[BOLDER] R "Not everything is as it seems." B \[rs]*[BOLDERX] +.FONT B \[rs]*[BOLDER] R "Not everything is as it seems." \ +B \[rs]*[BOLDERX] .EE .RE . @@ -683,7 +648,7 @@ is invoked, it remains in effect until turned off. .P Note: If you're using the document processing macros with .BR "\%.PRINTSTYLE \%TYPEWRITE" , -.B mom +.I mom ignores .B \[rs]*[BOLDER] requests. @@ -691,18 +656,18 @@ requests. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" BU -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[BU I " n" B ] move characters pairs closer together inline (related to macro .BR \%.KERN ) . . -.\" ====================================================================== +.\" ==================================================================== .\" COND -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[COND] .TQ @@ -718,8 +683,10 @@ begins pseudo-condensing type. .B \[rs]*[CONDX] turns the feature off. . -Both are inline escapes, therefore they should not appear as separate -lines, but rather be embedded in text lines, like this: +Both are inline escape sequences; +therefore, +they should not appear as separate lines, +but rather be embedded in text lines, like this: .RS .EX .FONT B \[rs]*[COND] I "Not everything is as it seems." B \[rs]*[CONDX] @@ -737,11 +704,11 @@ via the .B \%.PT_SIZE macro or with the .B \[rs]s -inline escape. +inline escape sequence. . If you wish the new point size to be pseudo-condensed, simply reinvoke .B \%\[rs]*[COND] -afterwards. +afterward. . Equally, .B \%\[rs]*[COND] @@ -751,7 +718,7 @@ must be turned off before changing the condense percentage with .P Note: If you're using the document processing macros with .BR "\%.PRINTSTYLE \%TYPEWRITE" , -.B mom +.I mom ignores .B \%\[rs]*[COND] requests. @@ -759,34 +726,34 @@ requests. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" CONDSUP -.\" ====================================================================== +.\" ==================================================================== .TP -.FONT B \[rs]*[CONDSUP] R \*[Ellipsis] B \[rs]*[CONDSUPX] +.FONT B \[rs]*[CONDSUP] R .\|.\|. B \[rs]*[CONDSUPX] pseudo-condensed superscript . . -.\" ====================================================================== +.\" ==================================================================== .\" DOWN -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[DOWN I " n" B ] -temporarily move downwards in a line +temporarily move downward in a line . . -.\" ====================================================================== +.\" ==================================================================== .\" EN-MARK -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[EN\-MARK] mark initial line of a range of line numbers (for use with line numbered endnotes) . . -.\" ====================================================================== +.\" ==================================================================== .\" EXT -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[EXT] .TQ @@ -802,8 +769,10 @@ begins pseudo-extending type. .B \[rs]*[EXTX] turns the feature off. . -Both are inline escapes, therefore they should not appear as separate -lines, but rather be embedded in text lines, like this: +Both are inline escape sequences; +therefore, +they should not appear as separate lines, +but rather be embedded in text lines, like this: .RS .EX .FONT B \[rs]*[EXT] I "Not everything is as it seems." B \[rs]*[EXTX] @@ -821,13 +790,13 @@ via the .B \%.PT_SIZE macro or with the .B \[rs]s -inline escape. +inline escape sequence. . If you wish the new point size to be .IR \%pseudo-extended , simply reinvoke .B \%\[rs]*[EXT] -afterwards. +afterward. . Equally, .B \%\[rs]*[EXT] @@ -837,7 +806,7 @@ must be turned off before changing the extend percentage with .P Note: If you are using the document processing macros with .BR "\%.PRINTSTYLE \%TYPEWRITE" , -.B mom +.I mom ignores .B \%\[rs]*[EXT] requests. @@ -845,59 +814,59 @@ requests. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" EXTSUP -.\" ====================================================================== +.\" ==================================================================== .TP -.FONT B \[rs]*[EXTSUP] R \*[Ellipsis] B \[rs]*[EXTSUPX] +.FONT B \[rs]*[EXTSUP] R .\|.\|. B \[rs]*[EXTSUPX] pseudo extended superscript . . -.\" ====================================================================== +.\" ==================================================================== .\" FU -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[FU I " n" B ] move characters pairs further apart inline (related to macro .BR .KERN ) . . -.\" ====================================================================== +.\" ==================================================================== .\" FWD -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[FWD I " n" B ] move forward in a line . . -.\" ====================================================================== +.\" ==================================================================== .\" LEADER -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[LEADER] insert leaders at the end of a line . . -.\" ====================================================================== +.\" ==================================================================== .\" RULE -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[RULE] draw a full measure rule . . -.\" ====================================================================== +.\" ==================================================================== .\" PT_SIZE -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[SIZE I " n" B ] change the point size inline (related to macro .BR \%.PT_SIZE ) . . -.\" ====================================================================== +.\" ==================================================================== .\" SLANT -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[SLANT] .TQ @@ -915,14 +884,14 @@ begins .B \%\[rs]*[SLANTX] turns the feature off. . -Both are -.I inline -.IR escapes , -therefore they should not appear as separate lines, but rather be -embedded in text lines, like this: +Both are inline escape sequences; +therefore, +they should not appear as separate lines, +but rather be embedded in text lines, like this: .RS .EX -.FONT R "Not " B \[rs]*[SLANT] R everything B \[rs]*[SLANTX] R " is as it seems." +.FONT R "Not " B \[rs]*[SLANT] R everything B \[rs]*[SLANTX] \ +R " is as it seems." .EE .RE . @@ -932,7 +901,8 @@ Alternatively, if you wanted the whole line you'd do .RS .EX -.FONT B \[rs]*[SLANT] R "Not everything is as it seems." B \[rs]*[SLANTX] +.FONT B \[rs]*[SLANT] R "Not everything is as it seems." \ +B \[rs]*[SLANTX] .EE .RE . @@ -944,7 +914,7 @@ is invoked, it remains in effect until turned off. .P Note: If you're using the document processing macros with .BR "\%.PRINTSTYLE \%TYPEWRITE" , -.B mom +.I mom underlines pseudo-italics by default. . To change this behaviour, use the special macro @@ -953,11 +923,11 @@ To change this behaviour, use the special macro .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" ST -.\" ====================================================================== +.\" ==================================================================== .TP -.FONT B \[rs]*[ST I B ] R \*[Ellipsis] B \[rs]*[ST I B X] +.FONT B \[rs]*[ST I B ] R .\|.\|. B \[rs]*[ST I B X] Mark positions of string tabs . .RS @@ -983,8 +953,8 @@ Please see below. . .P -String tabs need to be marked off with inline escapes before being set -up with the +String tabs need to be marked off with inline escape sequences before +being set up with the .B .ST macro. . @@ -997,7 +967,8 @@ above, means the numeric identifier of the tab. The following shows a sample input line with string tab markers. .RS .EX -.FONT B \[rs]*[ST1] R "Now is the time" B \[rs]*[ST1X] R " for all " B \[rs]*[ST2] R "good men" B \[rs]*ST2X] R " to come to the aid of the party." +.BR \[rs]*[ST1] "De minimus" \[rs]*[ST1X] \c +.RB "non curat" \[rs]*[ST2] lex \[rs]*[ST2X] . .EE .RE . @@ -1014,15 +985,15 @@ starts at and ends after .IR men . . -.I Inline escapes -(e.g.\& +.I Inline escape sequences +(e.g., .I font or .I point size .IR changes , or horizontal movements, including padding) are taken into account when -.B mom +.I mom determines the .I position and @@ -1054,10 +1025,10 @@ macro. .P .I IMPORTANT: Owing to the way -.B groff +.I groff processes input lines and turns them into output lines, it is not possible for -.B mom +.I mom to .I guess the correct starting position of string tabs marked off in lines that @@ -1113,33 +1084,33 @@ Rather than this, you should do: .RS .EX -.B .QUAD CENTER -.B .PAD """#\[rs]*[ST1]A line of text\[rs]*[ST1X]#""" -.B .EL -.B .ST 1 -.B .TAB 1 -.B .PT_SIZE 24 -.B .ALD 3p -.B \[rs]*[RULE] \[rs]" Note that you can't use \[rs]*[UP] or \[rs]*[DOWN] with \[rs]*[RULE]\"" -.B .RLD 3p -.B .TQ +\&.QUAD CENTER +\&.PAD "#\[rs]*[ST1]A line of text\[rs]*[ST1X]#" +\&.EL +\&.ST 1 +\&.TAB 1 +\&.PT_SIZE 24 +\&.ALD 3p +\&\[rs]" You can\[aq]t use \[rs]*[UP] or \[rs]*[DOWN] with \[rs]*[RULE]. +\&.RLD 3p +\&.TQ .EE .RE . .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" SUP -.\" ====================================================================== +.\" ==================================================================== .TP -.FONT B \[rs]*[SUP] R \*[Ellipsis] B \[rs]*[SUPX] +.FONT B \[rs]*[SUP] R .\|.\|. B \[rs]*[SUPX] superscript . . -.\" ====================================================================== +.\" ==================================================================== .\" TB+ -.\" ====================================================================== +.\" ==================================================================== .TP .B \[rs]*[TB+] Inline escape for @@ -1147,37 +1118,37 @@ Inline escape for .RI ( "Tab Next" ) . . -.\" ====================================================================== +.\" ==================================================================== .\" UL -.\" ====================================================================== +.\" ==================================================================== .TP -.FONT B \[rs]*[UL] R \*[Ellipsis] B \[rs]*[ULX] +.FONT B \[rs]*[UL] R .\|.\|. B \[rs]*[ULX] invoke underlining inline (fixed width fonts only) . . -.\" ====================================================================== +.\" ==================================================================== .\" UP -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B \[rs]*[UP I " n" B ] -temporarily move upwards in a line +temporarily move upward in a line . . .\" ==================================================================== -.SS "Details of Macros in alphabetical Order" +.SS "Details of macros in alphabetical order" .\" ==================================================================== . -.\" ====================================================================== +.\" ==================================================================== .\" AUTOLEAD -.\" ====================================================================== +.\" ==================================================================== .TP .B .AUTOLEAD set the linespacing relative to the point size . . -.\" ====================================================================== +.\" ==================================================================== .\" Bottom Margin -.\" ====================================================================== +.\" ==================================================================== .TP .BI .B_MARGIN " " Bottom Margin @@ -1193,7 +1164,7 @@ sets a nominal position at the bottom of the page beyond which you don't want your type to go. . When the bottom margin is reached, -.B mom +.I mom starts a new page. . .B .B_MARGIN requires a unit of measure. @@ -1203,7 +1174,7 @@ Decimal fractions are allowed. To set a nominal bottom margin of 3/4 inch, enter .RS .EX -.B \&.B_MARGIN \&.75i +.B .B_MARGIN .75i .EE .RE . @@ -1233,9 +1204,9 @@ macros. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Fallback Font -.\" ====================================================================== +.\" ==================================================================== .TP .BI \%.FALLBACK_FONT " " "[ ABORT | WARN ]" Fallback Font @@ -1247,7 +1218,7 @@ In the event that you pass an invalid argument to .B \%.FAMILY (i.e.\& a non-existent .IR family ), -.BR mom , +.IR mom , by default, uses the .IR "fallback font" , .B Courier Medium Roman @@ -1314,7 +1285,7 @@ Some examples of invoking . .TP .B .FALLBACK_FONT WARN -.B mom +.I mom will issue a warning whenever you try to access a non-existent .I font but will continue processing your file with the default @@ -1356,27 +1327,31 @@ If, for some reason, you want to revert to just enter .B \%".FALLBACK_FONT ABORT" and -.B mom +.I mom will once again abort on .IR "font errors" . . .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" FAM -.\" ====================================================================== +.\" ==================================================================== .TP .BI .FAM " " -Type Family, alias of \fB.FAMILY\fR +Type Family, +alias of +.B .FAMILY . . -.\" ====================================================================== +.\" ==================================================================== .\" FAMILY -.\" ====================================================================== +.\" ==================================================================== .TP .BI .FAMILY " " -Type Family, alias \fB.FAM\fR +Type Family, +alias of +.B .FAM . .RS . @@ -1457,23 +1432,29 @@ to .IR I . . .P -Additional note: If you are running a version of groff lower than -1.19.2, you must follow all +Additional note: If you are running a +.I groff +version prior to +1.19.2, +you must follow all .B .FAMILY requests with a .B .FT -request, otherwise -.B mom +request, +otherwise +.I mom will set all type up to the next .B .FT request in the fallback font. . .P -If you are running a version of groff greater than or equal to 1.19.2, +If you are running +.I groff +1.19.2 or later, when you invoke the .B .FAMILY macro, -.B mom +.I mom .I remembers the font style .BR ( Roman , @@ -1494,7 +1475,7 @@ For example: . .P However, if the font style does not exist in the new family, -.B mom +.I mom will set all subsequent type in the fallback font (by default, .B Courier Medium .BR Roman ) @@ -1506,7 +1487,7 @@ request that's valid for the .P For example, assuming you don't have the font .B Medium Condensed Roman -.RB ( mom +.RI ( mom extension .IR CD ) in the @@ -1534,9 +1515,10 @@ request that's valid for Please see the Appendices, .I Adding fonts to .IR groff , -for information on adding fonts and families to groff, as well as to +for information on adding fonts and families to +.IR groff , as well as to see a list of the extensions -.B mom +.I mom provides to .IR groff 's basic @@ -1594,18 +1576,18 @@ fonts respectively. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" FONT -.\" ====================================================================== +.\" ==================================================================== .TP .BI ".FONT R | B | BI | " "" Alias to .B .FT . . -.\" ====================================================================== +.\" ==================================================================== .\" FT -.\" ====================================================================== +.\" ==================================================================== .TP .BI ".FT R | B | BI | " "" Set font @@ -1659,7 +1641,7 @@ and shapes within the same family. . .P Have a look here for a list of the weight/style arguments -.B mom +.I mom allows. . Be aware, though, that you must have the fonts, correctly installed @@ -1675,28 +1657,35 @@ found in the description of the .B \%.FAMILY macro. . +. .P How -.B mom +.I mom reacts to an invalid argument to .B .FT -depends on which version of groff you're using. +depends on which version of +.I groff +you're using. . If your -.I groff version -is greater than or equal to 1.19.2, -.B mom -will issue a warning and, depending on how you've set up the fallback -font, either continue processing using the fallback font, or abort -(allowing you to correct the problem). If your -.I groff version -is less than 1.19.2, -.B mom -will silently continue processing, using either the fallback font or -the font that was in effect prior to the invalid +.I groff +version is 1.19.2 or later, +.I mom +will issue a warning and, +depending on how you've set up the fallback font, +either continue processing using the fallback font, +or abort +(allowing you to correct the problem). +. +In earlier versions, +.I mom +will silently continue processing, +using either the fallback font or the font that was in effect prior to +the invalid .B .FT call. . +. .P .B .FT will also accept, as an argument, a full @@ -1734,9 +1723,9 @@ font control. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Hanging Indent -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.HI [" " " ] Hanging indent \[em] the optional argument requires a unit of measure. @@ -1747,11 +1736,11 @@ Hanging indent \[em] the optional argument requires a unit of measure. A hanging indent looks like this: .RS .EX -\fB The thousand injuries of Fortunato I had borne as best I - could, but when he ventured upon insult, I vowed - revenge. You who so well know the nature of my soul - will not suppose, however, that I gave utterance to a - threat, at length I would be avenged\*[Ellipsis] +The thousand injuries of Fortunato I had borne as best I + could, but when he ventured upon insult, I vowed + revenge.\& You who so well know the nature of my soul + will not suppose, however, that I gave utterance to a + threat, at length I would be avenged.\|.\|. .EE .RE . @@ -1802,7 +1791,7 @@ Subsequent invocations of .B \%.HI do not require you to supply a .IR measure ; -.B mom +.I mom keeps track of the last measure you gave it. . .P @@ -1827,7 +1816,7 @@ measures given to are NOT additive. . Each time you pass a measure to -.B .HI , +.BR .HI , the measure is treated literally. . .B @@ -1837,7 +1826,7 @@ A numbered list using . .P .I Note: -.B mom +.I mom has macros for setting lists. . This recipe exists to demonstrate the use of @@ -1845,30 +1834,30 @@ This recipe exists to demonstrate the use of only. .RS .EX -.B ".PAGE 8.5i 11i 1i 1i 1i 1i" -.B ".FAMILY T" -.B ".FT R" -.B ".PT_SIZE 12" -.B ".LS 14" -.B ".JUSTIFY" -.B ".KERN" -.B ".SS 0" -.B ".IL \[rs]w'\[rs]0\[rs]0.'" -.B ".HI \[rs]w'\[rs]0\[rs]0.'" -\fB1.\[rs]0The most important point to be considered is whether the -answer to the meaning of Life, the Universe, and Everything -really is 42. We have no-one's word on the subject except -Mr.\& Adams'. -.B .HI +\&.PAGE 8.5i 11i 1i 1i 1i 1i +\&.FAMILY T +\&.FT R +\&.PT_SIZE 12 +\&.LS 14 +\&.JUSTIFY +\&.KERN +\&.SS 0 +\&.IL \[rs]w\[aq]\[rs]0\[rs]0.\[aq] +\&.HI \[rs]w\[aq]\[rs]0\[rs]0.\[aq] +1.\[rs]0The most important point to be considered is whether +the answer to the meaning of Life, the Universe, and +Everything really is 42.\& We have no one\[aq]s word on the +subject except Mr.\& Adams\[aq]s. +\&.HI 2.\[rs]0If the answer to the meaning of Life, the Universe, and Everything is indeed 42, what impact does this have on -the politics of representation? 42 is, after all not a -prime number. Are we to infer that prime numbers don't +the politics of representation?\& 42 is, after all not a +prime number.\& Are we to infer that prime numbers don\[aq]t deserve equal rights and equal access in the universe? -.B .HI -3.\[rs]0If 42 is deemed non-exclusionary, how do we present it -as the answer and, at the same time, forestall debate on its -exclusionary implications? +\&.HI +3.\[rs]0If 42 is deemed non-exclusionary, how do we present +it as the answer and, at the same time, forestall debate +on its exclusionary implications? .EE .RE . @@ -1876,7 +1865,7 @@ exclusionary implications? First, we invoke a left indent with a measure equal to the width of 2 figures spaces plus a period (using the \[rs]w inline escape). . -At this point, the left indent is active; text afterwards would +At this point, the left indent is active; text afterward would normally be indented. . However, we invoke a hanging indent of exactly the same width, which @@ -1886,7 +1875,7 @@ margin\[rq]). . Because we begin the first line with a number, a period, and a figure space, the actual text -.RI ( "The most important point\*[Ellipsis]" ) +.RI ( "The most important point.\|.\|.\&" ) starts at exactly the same spot as the indented lines that follow. . .P @@ -1908,9 +1897,9 @@ to see hanging indents in action. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" IB - INDENT BOTH -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.IB [" " " ] Indent both \[em] the optional argument requires a unit of measure @@ -1998,9 +1987,9 @@ and .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" IL - INDENT LEFT -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.IL [" " " ] Indent left \[em] the optional argument requires a unit of measure @@ -2039,7 +2028,7 @@ which case no unit of measure is required. For example, .RS .EX -.B .IL \[rs]w'margarine' +.B .IL \[rs]w\[aq]margarine\[aq] .EE .RE indents text by the width of the word @@ -2051,7 +2040,7 @@ With no argument, indents by its last active value. . See the brief explanation of how -.B mom +.I mom handles indents for more details. . .P @@ -2072,9 +2061,9 @@ automatically turns off .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" IQ - quit any/all indents -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.IQ [" " " ] IQ \[em] quit any/all indents @@ -2091,7 +2080,7 @@ This usage has been deprecated in favour of . .B .IX will continue to behave as before, but -.B mom +.I mom will issue a warning to .I stderr indicating that you should update your documents. @@ -2134,9 +2123,9 @@ styles at once. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" IR - INDENT RIGHT -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.IR [" " " ] Indent right \[em] the optional argument requires a unit of measure @@ -2173,7 +2162,7 @@ is required. For example, .RS .EX -.B .IR \[rs]w'jello' +.B .IR \[rs]w\[aq]jello\[aq] .EE .RE indents text by the width of the word @@ -2185,7 +2174,7 @@ With no argument, indents by its last active value. . See the brief explanation of how -.B mom +.I mom handles indents for more details. . .P @@ -2206,9 +2195,9 @@ automatically turns off .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Left Margin -.\" ====================================================================== +.\" ==================================================================== .TP .BI .L_MARGIN " " Left Margin @@ -2219,7 +2208,8 @@ Left Margin L_MARGIN establishes the distance from the left edge of the printer sheet at which you want your type to start. . -It may be used any time, and remains in effect until you enter a new value. +It may be used any time, +and remains in effect until you enter a new value. . .P Left indents and tabs are calculated from the value you pass to @@ -2231,7 +2221,9 @@ A unit of measure is required. . Decimal fractions are allowed. . -Therefore, to set the left margin at 3 picas (1/2 inch), you'd enter either +Therefore, +to set the left margin at 3 picas (1/2 inch), +you'd enter either .RS .EX .B .L_MARGIN 3P @@ -2252,8 +2244,8 @@ or .B .PAPER without invoking .B .L_MARGIN -(either before or afterwards), -.B mom +(either before or afterward), +.I mom automatically sets .B .L_MARGIN to @@ -2268,9 +2260,9 @@ macros. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" MCO - BEGIN MULTI-COLUMN SETTING -.\" ====================================================================== +.\" ==================================================================== .TP .B .MCO Begin multi-column setting. @@ -2303,9 +2295,9 @@ macro in the document processing macros. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" MCR - RETURN TO TOP OF COLUMN -.\" ====================================================================== +.\" ==================================================================== .TP .B \%.MCR Once you've turned @@ -2313,13 +2305,14 @@ Once you've turned on (with .BR \%.MCO ), .BR .MCR , -at any time, returns you to the -.IR "top of your columns". +at any time, +returns you to the +.IR "top of your columns" . \" XXX: Are italics truly required here? . . -.\" ====================================================================== +.\" ==================================================================== .\" MCX - EXIT MULTI-COLUMNS -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.MCX [ " "" " ]" Optional argument requires a unit of measure. @@ -2327,6 +2320,9 @@ Optional argument requires a unit of measure. .RS . .P +Exit multi-columns. +. +.P .B .MCX takes you out of any .I tab @@ -2393,9 +2389,9 @@ below the baseline of the longest column. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Start a new Page -.\" ====================================================================== +.\" ==================================================================== .TP .B .NEWPAGE . @@ -2414,9 +2410,9 @@ a new one (subject to the top margin set with .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Page -.\" ====================================================================== +.\" ==================================================================== .TP .BI ".PAGE " " [ " " [ " " [ " " [ " \ " [ " " ] ] ] ] ]" @@ -2477,7 +2473,9 @@ would look like this: .RE . .P -Now suppose you also want to set the top margin, say, at 1\(en1/2 inches. +Now suppose you also want to set the top margin, +say, +at 1\(en1/2 inches. . .I comes after @@ -2490,10 +2488,12 @@ The macro would look like this: .RS .EX -\f[CB].PAGE 11i 17i 1i 1i 1.5i +.tr -\- +\&.PAGE 11i 17i 1i 1i 1.5i | | required right---+ +---top margin - margin\f[R] + margin +.tr -- .EE .RE . @@ -2501,7 +2501,7 @@ required right---+ +---top margin Clearly, .B .PAGE is best used when you want a convenient way to tell -.B mom +.I mom just the dimensions of your printer sheet (width and length), or when you want to tell her everything about the page (dimensions and all the margins), for example @@ -2535,7 +2535,8 @@ the last macro you invoke prior to entering text. .P Please read the .I Important note -on page dimensions and papersize for information on ensuring groff +on page dimensions and papersize for information on ensuring +.I groff respects your .B .PAGE dimensions and margins. @@ -2543,13 +2544,13 @@ dimensions and margins. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Page Length -.\" ====================================================================== +.\" ==================================================================== .TP .BI .PAGELENGTH " " tells -.B mom +.I mom how long your printer sheet is. . It works just like @@ -2559,7 +2560,7 @@ It works just like . .P Therefore, to tell -.B mom +.I mom your printer sheet is 11 inches long, you enter .RS .EX @@ -2568,15 +2569,17 @@ your printer sheet is 11 inches long, you enter .RE . Please read the important note on page dimensions and papersize for -information on ensuring groff respects your +information on ensuring +.I groff +respects your .IR PAGELENGTH . . .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Page Width -.\" ====================================================================== +.\" ==================================================================== .TP .BI .PAGEWIDTH " " . @@ -2594,7 +2597,7 @@ requires a unit of measure. Decimal fractions are allowed. . Hence, to tell -.B mom +.I mom that the width of your printer sheet is 8\(12 inches, you enter .RS .EX @@ -2604,15 +2607,17 @@ that the width of your printer sheet is 8\(12 inches, you enter . .P Please read the Important note on page dimensions and papersize for -information on ensuring groff respects your +information on ensuring +.I groff +respects your .IR PAGEWIDTH . . .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Paper -.\" ====================================================================== +.\" ==================================================================== .TP .BI .PAPER " " provides a convenient way to set the page dimensions for some common @@ -2641,9 +2646,9 @@ can be one of: .B .PRINTSTYLE . . -.\" ====================================================================== +.\" ==================================================================== .\" PT_SIZE - POINT SIZE OF TYPE -.\" ====================================================================== +.\" ==================================================================== .TP .BI .PT_SIZE " " Point size of type, does not require a @@ -2686,7 +2691,7 @@ enter .I Point sizes may be .I fractional -(e.g.\& +(e.g., .I 10.25 or .IR 12.5 ). @@ -2706,12 +2711,13 @@ or .I \- the original value. . -For example, if the +For example, +if the .I point size is -.I 12 , +.IR 12 , and you want -.I 14 , +.IR 14 , you can do .RS .EX @@ -2763,9 +2769,9 @@ with .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Right Margin -.\" ====================================================================== +.\" ==================================================================== .TP .BI .R_MARGIN " " Right Margin @@ -2788,7 +2794,8 @@ and/or . The reason is that .B .R_MARGIN -calculates line length from the overall page dimensions and the left margin. +calculates line length from the overall page dimensions and the left +margin. . .P Obviously, it can't make the calculation if it doesn't know the page @@ -2835,7 +2842,7 @@ length. . On the other hand, if you know the line length for a patch of type should be 17 picas and 3 points, entering the line length with LL is -much easier than calculating the right margin, e.g.\& +much easier than calculating the right margin, e.g., .RS .EX .B .LL 17P+3p @@ -2850,8 +2857,8 @@ or .B PAPER without invoking .B .R_MARGIN -afterwards, -.B mom +afterward, +.I mom automatically sets .B .R_MARGIN to @@ -2872,9 +2879,9 @@ macros. .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" ST - Set String Tabs -.\" ====================================================================== +.\" ==================================================================== .TP .FONT B .ST I " " B "L | R | C | J [ QUAD ]" . @@ -2883,7 +2890,7 @@ macros. After .I string tabs have been marked off on an input line (see -.BR \[rs]*[ST]\*[Ellipsis]\[rs]*[STX] ), +.BR \[rs]*[ST].\|.\|.\&\[rs]*[STX] ), you need to .I set them by giving them a direction and, optionally, the @@ -2899,7 +2906,7 @@ except that you don't have to give .B .ST an indent or a line length (that's already taken care of, inline, by -.BR \[rs]*[ST]\*[Ellipsis]\[rs]*[STX] ). +.BR \[rs]*[ST].\|.\|.\&\[rs]*[STX] ). . .P If you want string @@ -2934,9 +2941,9 @@ If you want it to be justified, enter .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" TAB - Call Tabs -.\" ====================================================================== +.\" ==================================================================== .TP .BI \%.TAB " " After @@ -2984,14 +2991,19 @@ produces, on output .EE .RE . +. .P -If you want the tabs to line up, use +If you want the tabs to line up, +use .B .TN -.RI ( "Tab Next" ) -or, more conveniently, the inline escape \[rs]*[TB+]: +(\[lq]Tab Next\[rq]) +or, +more conveniently, +the inline escape sequence +.BR \[rs]*[TB+] : .RS .EX -\fB.TAB 1 +.BR .TAB \~1 A line of text in tab 1.\[rs]*[TB+] A line of text in tab 2. .EE @@ -2999,10 +3011,11 @@ A line of text in tab 2. which produces .RS .EX -.B "A line of text in tab 1. A line of text in tab 2." +.B "A line of text in tab 1.\& A line of text in tab 2." .EE .RE . +. .P If the text in your tabs runs to several lines, and you want the first lines of each tab to align, you must use the multi-column macros. @@ -3039,7 +3052,7 @@ does not automatically move to the baseline of the first line in the To demonstrate: .RS .EX -\f[B]TAB 1 +TAB 1 Carrots Potatoes Broccoli @@ -3052,7 +3065,7 @@ $0.99/bunch produces, on output .RS .EX -\fBCarrots +Carrots Potatoes Broccoli $1.99/5 lbs @@ -3063,18 +3076,18 @@ Broccoli . .RE . -.\" ====================================================================== +.\" ==================================================================== .\" TB - Call Tabs Alias -.\" ====================================================================== +.\" ==================================================================== .TP .BI .TB " " Alias to .B .TAB . . -.\" ====================================================================== +.\" ==================================================================== .\" TI - TEMPORARY (LEFT) INDENT -.\" ====================================================================== +.\" ==================================================================== .TP .BI "\%.TI [" " " ] Temporary left indent \[em] the optional argument requires a @@ -3110,7 +3123,7 @@ the first line of a paragraph by, say, 2 ems, do Subsequent invocations of .B .TI do not require you to supply a measure; -.B mom +.I mom keeps track of the last measure you gave it. . .P @@ -3136,9 +3149,9 @@ is exactly .RS .EX .B .TI 1P -.B The beginning of a paragraph\*[Ellipsis] +.B The beginning of a paragraph.\|.\|.\& .B .TI 2P -.B The beginning of another paragraph\*[Ellipsis] +.B The beginning of another paragraph.\|.\|.\& .EE .RE . @@ -3146,9 +3159,9 @@ is exactly . . . -.\" ====================================================================== +.\" ==================================================================== .\" TN - Tab Next -.\" ====================================================================== +.\" ==================================================================== .TP .B .TN Tab Next @@ -3187,7 +3200,7 @@ you must terminate the line preceding .B .TN with the .B \[rs]c -inline escape. +inline escape sequence. . Conversely, if you did give a .B QUAD @@ -3219,13 +3232,13 @@ is not allowed. In other words, you cannot do .RS .EX -\fB.TAB 1 +\&.TAB 1 Some text\[rs]c \&.TN Some more text\[rs]c \&.TN \&.TN -Yet more text\fR +Yet more text .EE .RE . @@ -3238,7 +3251,7 @@ to should be entered .RS .EX -\fB.TAB 1 +\&.TAB 1 Some text\[rs]c \&.TN Some more text\[rs]c @@ -3258,9 +3271,9 @@ following .RE . . -.\" ====================================================================== +.\" ==================================================================== .\" Tab Quit -.\" ====================================================================== +.\" ==================================================================== .TP .B .TQ .B TQ @@ -3278,9 +3291,9 @@ that were in effect prior to invoking any .IR tabs . . . -.\" ====================================================================== +.\" ==================================================================== .\" Top Margin -.\" ====================================================================== +.\" ==================================================================== .TP .BI .T_MARGIN " " Top margin @@ -3346,56 +3359,69 @@ after NEWPAGE, like this: . . .\" ==================================================================== -.SH AUTHORS +.SH Authors .\" ==================================================================== +. .I mom was written by -.MT peter@\:schaffter.ca +.MT peter@\:schaffter\:.ca Peter Schaffter .ME . . PDF support was provided by -.MT deri@\:chuzzlewit.demon.co.uk +.MT deri@\:chuzzlewit\:.myzen\:.co\:.uk Deri James .ME . . -The alphabetical documentation of macros and escape sequences in this -man page were written by the -.I mom -team. +This manual page was written by Bernd Warken. . . .\" ==================================================================== -.SH "SEE ALSO" +.SH "See also" .\" ==================================================================== . -.BR groff (@MAN1EXT@), -.BR groff_mom (@MAN7EXT@), -. .TP -.I \%@HTMLDOCDIR@/\:mom/\:toc.html -\[en] entry point to the HTML documentation +.I @HTMLDOCDIR@/\:mom/\:toc\:.html +entry point to the HTML documentation +. . .TP -.UR http://\:www.schaffter.ca/\:mom/\:momdoc/\:toc.html +.UR http://\:www\:.schaffter\:.ca/\:mom/\:momdoc/\:toc\:.html .UE -\[en] HTML documentation online +HTML documentation online +. . .TP -.UR http://\:www.schaffter.ca/\:mom/ +.UR http://\:www\:.schaffter\:.ca/\:mom/ .UE -\[en] the mom macros homepage +the +.I mom +macros homepage . . -.\" Restore compatibility mode (for, e.g., Solaris 10/11). -.cp \n[groff_mom_C] +.P +.IR "Groff: The GNU Implementation of troff" , +by Trent A.\& Fisher and Werner Lemberg, +is the primary +.I groff +manual. . +You can browse it interactively with \[lq]info groff\[rq]. +. +. +.P +.MR pdfmom @MAN1EXT@ , +.MR groff @MAN1EXT@ , +.MR @g@troff @MAN1EXT@ +. +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_groff_mom_7_man_C] +.do rr *groff_groff_mom_7_man_C . -.\" ==================================================================== -.\" Emacs settings -.\" ==================================================================== . .\" Local Variables: +.\" fill-column: 72 .\" mode: nroff .\" End: -.\" vim: set filetype=groff: +.\" vim: set filetype=groff textwidth=72: diff --git a/contrib/mom/mom.am b/contrib/mom/mom.am index 57ae357..3bbbc9a 100644 --- a/contrib/mom/mom.am +++ b/contrib/mom/mom.am @@ -1,17 +1,17 @@ -# Copyright (C) 2002-2018 Free Software Foundation, Inc. -# Written by Werner Lemberg (wl@gnu.org) +# Copyright (C) 2002-2020 Free Software Foundation, Inc. +# Written by Werner Lemberg # Automake migration by Bertrand Garrigues -# +# # # This file is part of groff. # # groff is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Software Foundation, either version 3 of the License, or (at your +# option) any later version. # -# groff is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# groff is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # @@ -20,14 +20,14 @@ mom_srcdir = $(top_srcdir)/contrib/mom -# pdfmom command used to generated .pdf -MOM_TFLAG = -M$(mom_srcdir) -MOM_KFLAG = -k -p -e -t +# pdfmom command used to generate .pdf +# +# Use '-K utf8', not '-k', in case 'configure' didn't find uchardet. MOMPDFMOM = \ GROFF_COMMAND_PREFIX= \ GROFF_BIN_PATH="$(GROFF_BIN_PATH)" \ PDFMOM_BIN_PATH="$(top_builddir)" \ - $(PDFMOMBIN) $(FFLAG) $(TFLAG) $(MOM_TFLAG) $(MOM_KFLAG) + $(PDFMOMBIN) $(FFLAG) $(MFLAG) -M$(mom_srcdir) -K utf8 -p -e -t man7_MANS += contrib/mom/groff_mom.7 @@ -40,7 +40,6 @@ momtmacdir = $(tmacdir) dist_momtmac_DATA = $(MOMNORMALFILES) # Files installed in htmldocdir/mom -if INSTALL_SHIPPED_HTML MOMHTMLDOCFILES=\ contrib/mom/momdoc/stylesheet.css \ contrib/mom/momdoc/appendices.html \ @@ -67,7 +66,6 @@ MOMHTMLDOCFILES=\ contrib/mom/momdoc/version-2.html momhtmldir = $(htmldocdir)/mom momhtml_DATA = $(MOMHTMLDOCFILES) -endif # Files installed in $(examplesdir)/mom. MOMEXAMPLEFILES are located # in the source tree, while MOMPROCESSEDEXAMPLEFILES are generated in @@ -85,39 +83,44 @@ MOMEXAMPLEFILES=\ contrib/mom/examples/penguin.ps \ contrib/mom/examples/penguin.pdf \ contrib/mom/examples/mom.vim \ - contrib/mom/examples/slide-demo.mom -if BUILD_EXAMPLES + contrib/mom/examples/slide-demo.mom \ + contrib/mom/examples/copyright-default.mom \ + contrib/mom/examples/copyright-chapter.mom momexampledir = $(exampledir)/mom dist_momexample_DATA = $(MOMEXAMPLEFILES) -else -EXTRA_DIST += $(MOMEXAMPLEFILES) -endif -if BUILD_PDFEXAMPLES +if USE_GROPDF MOMPROCESSEDEXAMPLEFILES = \ contrib/mom/examples/letter.pdf \ contrib/mom/examples/mom-pdf.pdf \ contrib/mom/examples/mon_premier_doc.pdf \ contrib/mom/examples/sample_docs.pdf \ - contrib/mom/examples/typesetting.pdf \ - contrib/mom/examples/slide-demo.pdf + contrib/mom/examples/slide-demo.pdf \ + contrib/mom/examples/copyright-default.pdf \ + contrib/mom/examples/copyright-chapter.pdf +if HAVE_URW_FONTS +MOMPROCESSEDEXAMPLEFILES += contrib/mom/examples/typesetting.pdf +endif momprocessedexampledir = $(exampledir)/mom nodist_momprocessedexample_DATA = $(MOMPROCESSEDEXAMPLEFILES) +endif + +mom_test_template = contrib/mom/examples/test-mom.sh.in -if HAVE_PDFTOOLS # Small test suite on mom examples mom_TESTS = contrib/mom/examples/tests-mom.sh TESTS += $(mom_TESTS) -contrib/mom/examples/tests-mom.sh: $(top_builddir)/config.status \ - $(MOMPROCESSEDEXAMPLEFILES) $(top_srcdir)/contrib/mom/examples/test-mom.sh.in - sed -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ - -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \ - $(top_srcdir)/contrib/mom/examples/test-mom.sh.in > $@ - chmod +x $@ +contrib/mom/examples/tests-mom.sh: \ + $(top_builddir)/config.status \ + $(MOMPROCESSEDEXAMPLEFILES) \ + $(top_srcdir)/$(mom_test_template) + $(AM_V_GEN)sed \ + -e "s|[@]abs_top_builddir[@]|$(abs_top_builddir)|g" \ + -e "s|[@]groff_have_urw_fonts[@]|$(groff_have_urw_fonts)|g" \ + $(top_srcdir)/$(mom_test_template) > $@ \ + && chmod +x $@ MOSTLYCLEANFILES += $(mom_TESTS) -endif -endif -EXTRA_DIST += contrib/mom/examples/test-mom.sh.in +EXTRA_DIST += $(mom_test_template) # For this list of files we add a symlink from $(exampledir)/mom to $(pdfdocdir) PDFDOCFILE = mom-pdf.pdf @@ -135,24 +138,23 @@ MOSTLYCLEANFILES += \ penguin.ps \ penguin.pdf -# Rule to generated .pdf files from .mom files +# rule to generate .pdf files from .mom files SUFFIXES += .mom .pdf .mom.pdf: $(GROFF_V)$(MKDIR_P) `dirname $@` \ && LC_ALL=C $(MOMPDFMOM) $< >$@ $(MOMPROCESSEDEXAMPLEFILES): $(MOMNORMALFILES) \ - groff troff gropdf pdfmom penguin.ps penguin.pdf \ - gnu.eps font/devpdf/build_font_files + groff troff gropdf pdfmom penguin.ps penguin.pdf font/devpdf/stamp penguin.ps: - cp $(mom_srcdir)/examples/penguin.ps $@ + $(AM_V_at)cp $(mom_srcdir)/examples/penguin.ps $@ penguin.pdf: - cp $(mom_srcdir)/examples/penguin.pdf $@ + $(AM_V_at)cp $(mom_srcdir)/examples/penguin.pdf $@ install-data-hook: install_mom install_mom: -if BUILD_PDFEXAMPLES +if USE_GROPDF for f in $(PDFDOCFILE); do \ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \ ln -s $(exampledir)/mom/$$f $(DESTDIR)$(pdfdocdir)/$$f; \ @@ -164,6 +166,7 @@ uninstall_mom: for f in $(PDFDOCFILE); do \ $(RM) $(DESTDIR)$(pdfdocdir)/$$f; \ done + -rmdir $(DESTDIR)$(pdfdocdir) if test -d $(DESTDIR)$(exampledir)/mom; then \ rmdir $(DESTDIR)$(exampledir)/mom; \ fi @@ -172,9 +175,8 @@ uninstall_mom: fi -######################################################################## -### Emacs settings # Local Variables: +# fill-column: 72 # mode: makefile-automake # End: -# vim: set filetype=automake: +# vim: set autoindent filetype=automake textwidth=72: diff --git a/contrib/mom/momdoc/appendices.html b/contrib/mom/momdoc/appendices.html index 21a7a15..964a2ab 100644 --- a/contrib/mom/momdoc/appendices.html +++ b/contrib/mom/momdoc/appendices.html @@ -2,7 +2,7 @@ @@ -878,7 +877,7 @@ If you want to visit mom’s website, you’ll find a link to it at
- http://www.schaffter.ca + https://www.schaffter.ca The site contains links to some of my fiction, all of which was typeset with mom and groff. diff --git a/contrib/mom/momdoc/color.html b/contrib/mom/momdoc/color.html index c03ceb4..f53b5c0 100644 --- a/contrib/mom/momdoc/color.html +++ b/contrib/mom/momdoc/color.html @@ -2,7 +2,7 @@
-

Invoking a color

+

Invoking a colour

-Macro: COLOR <colorname> +Macro: COLOR <colourname>

-Inline: \*[<colorname>] +Inline: \*[<colourname>]

-Once you've told mom about a colour (via +Once you’ve told mom about a colour (via NEWCOLOR or XCOLOR, you use either the macro COLOR or the inline escape, -\*[<colorname>], to cause mom to -set subsequent text in that colour. See the +\*[<colourname>], to cause mom to set +subsequent text in that colour. See the example, above, which shows both in action.

@@ -453,35 +455,32 @@ above, which shows both in action.

Note: -You can use the \*[<colorname>] inline escape in -any +You can use the \*[<colourname>] +inline escape in any document processing macro that takes a string argument. However, you must remember to reset the colour at the end of the -argument (typically with \*[black]) unless you want all -subsequent invocations of that particular macro to be colourized. +argument (typically with \*[black]) unless +you want all subsequent invocations of that particular macro to be +colourised.

-Furthermore, if you use \*[<colorname>] in the -string argument passed to -HEAD, -SUBHEAD -or -PARAHEAD, -and you've requested that any of these types of heads be numbered, -the numbers themselves will not be coloured, only the text you -passed the macro. If you wish the numbers to be colourized as well, -you must explicitly tell mom that you wish all of the head(s), -subhead(s) or parahead(s), including the numbers, colourized by -invoking the appropriate -control macro. +Furthermore, if you use +\*[<colourname>] in the string +argument passed to +HEADING <n> +and you’ve requested that the heading level be numbered, the +numbers themselves will not be colourised, only the text you pass to +the macro. If you wish the numbers to be colourised along with the +text, you must explicitly tell mom with +HEADING_STYLE <n>.

-For colorizing underscored text, see -Colorizing underscored text +For colourising underscored text, see +Colourising underscored text in the notes at the end of UNDERSCORE.

diff --git a/contrib/mom/momdoc/cover.html b/contrib/mom/momdoc/cover.html index e18a1c3..7efee1f 100644 --- a/contrib/mom/momdoc/cover.html +++ b/contrib/mom/momdoc/cover.html @@ -2,7 +2,7 @@
@@ -750,7 +748,7 @@ If you wish to change the family for regular text paragraphs only, invoke .FAMILY immediately after .PP in every paragraph whose family you wish to differ from the prevailing document family. Alternatively, set the family and font for -paragraphs with PP_FONT, giving it a complete family+font name, e.g., +paragraphs with PP_FONT, giving it a complete family+font name, e.g.
PP_FONT TI @@ -799,7 +797,7 @@ Mom’s default paragraph font is medium roman. Note: PP_FONT has no effect when the PRINTSTYLE is TYPEWRITE. If you wish to set whole typewritten paragraphs in italic, invoke -invoke .FT I immediately after .PP. Depending +.FT I immediately after .PP. Depending on which of UNDERLINE_ITALIC or @@ -812,12 +810,12 @@ italic. Neither persists past the end of the paragraph.

3. Paragraph colour

-Mom has no special control macro for colourizing paragraphs. If you -wish a colourized paragraph, you must use the macro +Mom has no special control macro for colourising paragraphs. If you +wish a colourised paragraph, you must use the macro COLOR or the inline escape, -\*[<colourname>], +\*[<colourname>], after .PP. The colour must be one pre-defined (or “initialized”) with NEWCOLOR @@ -877,9 +875,9 @@ paragraph whose leading you wish to change.

Warning: -Changing a paragraph’s leading will almost certaininly screw -up mom’s ability to balance the bottom margin of pages. -Should you absolutely require a change of paragraph’s leading and +Changing a paragraph’s leading will almost certainly screw up +mom’s ability to balance the bottom margin of pages. Should +you absolutely require a change to a paragraph’s leading and need to get mom back on track leading-wise afterwards, use the SHIM or @@ -895,10 +893,10 @@ Mom’s default paragraph leading (document leading) is 16 points, adjusted to fill the page.

-

5. Justification/quad

+

5. Justification / quad

-The justification/quad-direction of regular text paragraphs (ie +The justification/quad-direction of regular text paragraphs (i.e. justified, or filled @@ -1007,12 +1005,12 @@ that run to more than one paragraph.

If you wish to have first paragraphs indented, invoke the macro -.INDENT_FIRST_PARAS without an argument, either before or -after +INDENT_FIRST_PARAS without an argument, either before or after START. INDENT_FIRST_PARAS is a toggle macro, therefore passing it any -argument (OFF, QUIT, Q, X...) cancels its effect, meaning -that first paragraphs will once again not be indented. +argument (OFF, QUIT, Q, +X...) cancels its effect, meaning that first paragraphs +will once again not be indented.

8. Inter-paragraph spacing

@@ -1020,11 +1018,12 @@ that first paragraphs will once again not be indented.

By default, mom does not insert a blank line between paragraphs. If you would like her to do so, invoke the macro -.PARA_SPACE without an argument, either before or after +PARA_SPACE without an argument, either before or after START. PARA_SPACE is a toggle macro, therefore passing it any argument -(OFF, QUIT, Q, X...) cancels its effect, meaning that -paragraphs will once again not be separated by a blank line. +(OFF, QUIT, Q, X...) +cancels its effect, meaning that paragraphs will once again not be +separated by a blank line.

@@ -1065,7 +1064,7 @@ If PARA_SPACE is on, mom spaces only those paragraphs that come after an initial paragraph. Initial paragraphs are those that come immediately after the docheader -(ie the start of a document), +(i.e. the start of a document), epigraphs, headings, and @@ -1105,11 +1104,13 @@ expect the blank line to appear.

-Heads, subheads, and deeper levels of section headings are handled by -a single macro HEADING to which you pass an argument stating the -desired level. .HEADING 1 "<text>", for -example, would be a main head; .HEADING 2 -"<text>" would be a subhead; etc. +Heads, subheads, and deeper levels of section headings are +handled by a single macro, HEADING, to which you pass an argument +stating the desired level. +.HEADING 1 "<text>", +for example, would be a main head; +.HEADING 2 "<text>" +would be a subhead; etc.

@@ -1124,7 +1125,7 @@ bookmark for

Headings can also be numbered on a per-heading-level basis, -hierarchically and concatenatively, e.g., +hierarchically and concatenatively, e.g.
1. @@ -1140,7 +1141,7 @@ By default, a blank line precedes headings, regardless of the level. Mom initially sets up a very basic style for nine levels of heading, of which you can have an infinite number, although as has been said, if you need more than four levels of heading, you should consider -re-organizing your material. The pared-down style of mom’s +re-organising your material. The pared-down style of mom’s defaults is intentional; it is expected that you will design headings to your own specifications with the control macro, @@ -1164,7 +1165,7 @@ a particular heading level just because its style appeals to you.

Macro: HEADING <level> [ -PARAHEAD ] [ NAMED <pdf-id> ] "<heading text>" +PARAHEAD ] [ NAMED <pdf-id> ] "<heading text>"

@@ -1194,8 +1195,8 @@ subsequent paragraphs.

-The optional third argument, NAMED <id>, gives the -heading a unique, non-printing identifier that allows it to +The optional third argument, NAMED <id>, gives +the heading a unique, non-printing identifier that allows it to be referenced from anywhere in the final PDF document with the PDF_LINK macro, provided the mom file is processed with pdfmom. @@ -1269,7 +1270,7 @@ This results in slightly less whitespace than normal, but the difference is usually not apparent. Alternatively, you may pass the NO_SHIM or NO_FLEX argument to HEADING_STYLE -to prevent shimming or flex-spacing of any particlar heading level +to prevent shimming or flex-spacing of any particular heading level either globally or selectively. If shimming/flex-spacing is disabled selectively with
@@ -1326,7 +1327,8 @@ which may be given in any order: CAPS | NO_CAPS \ SMALLCAPS | NO_SMALLCAPS \ BASELINE_ADJUST <amount to raise heading from the baseline> \ - NEEDS <lines of text required beneath the heading > + NEEDS <lines of text required beneath the heading> \ + PREFIX_CHAPTER [<n>] \ SPACE_AFTER | NO_SPACE_AFTER \ NUMBER | NO_NUMBER \ NO_SHIM | SHIM \ @@ -1337,7 +1339,7 @@ which may be given in any order:

You may enter your entire argument list on a single line, or, if it is very long, break it into shorter lines with the -“line-continued” backslash {\), as shown +“line-continued” backslash (\), as shown above.

@@ -1355,10 +1357,10 @@ ending in _FAMILY, _FONT, _SIZE, _QUAD, or _COLOR. See UNDERSCORE and UNDERSCORE2 require that a weight for the underscore be given, in points (decimal fractions allowed), but without the unit of measure p appended. -They also require that the underscore's distance from the baseline -be supplied; in the case of UNDERSCORE2, an additional gap argument -representing the distance between the two underscores must be -provided. +They also require that the underscore’s distance from the +baseline be supplied; in the case of UNDERSCORE2, an additional gap +argument representing the distance between the two underscores must +be provided.

@@ -1383,21 +1385,38 @@ appended to it.

NEEDS lets you reserve the number of lines of text -required beneath a heading, including fractions thereof (e.g., +required beneath a heading, including fractions thereof (e.g. “1.5” for one line of text plus half a linespace). If a heading falls near the bottom margin and there isn’t sufficient room for both the heading and the reserved space, mom will break to a new page for the heading. A unit of measure should not be appended to the argument. +Note: If you have +DROPCAPs +after headings, you must increase the value of NEEDS +to match the number of dropcap lines. +

+ +

+PREFIX_CHAPTER instructs mom to prefix the current +chapter number to numbered headings. If mom is unable to determine +a chapter number, she will ask for one. +

+ +

+Note that using PREFIX_CHAPTER with an explicit chapter +number will also set the chapter number for subsequent +automatically-generated image and pre-processor labels +as well.

SPACE_AFTER inserts a blank line equal to the current leading after a HEADING. -If you'd like a full linespace after a heading level, use -SPACE_AFTER. If you'd like additional space before a -heading level, you must introduce it yourself with +If you’d like a full linespace after a heading level, use +SPACE_AFTER. If you’d like additional space before +a heading level, you must introduce it yourself with SPACE or ALD. @@ -1426,7 +1445,7 @@ the same way if flex-spacing is enabled.

The argument list is long, so you may want to break it into several lines by using the backslash character (\). -Here's an example of how you might style a level 1 heading: +Here’s an example of how you might style a level 1 heading:
.HEADING_STYLE 1 \ @@ -1436,7 +1455,7 @@ Here's an example of how you might style a level 1 heading: BASELINE_ADJUST 3p \ NUMBER -This creates a level-1 heading style that's bold, centred, +This creates a level-1 heading style that’s bold, centred, underscored and numbered, raised by 3 points from the baseline.

@@ -1453,16 +1472,25 @@ Macro: PREFIX_CHAPTER_NUMBER <none> | <c

-If you’ve requested numbering for any level of heading and -you’d like mom, in addition, to prefix a chapter number to the -numbering scheme, you can do so with PREFIX_CHAPTER_NUMBER. +If, in addition to numbering heads, you want mom to prepend the +chapter number, invoke .PREFIX_CHAPTER_NUMBER. +

+ +

+When you invoke .PREFIX_CHAPTER_NUMBER without an +argument, mom checks to see whether the argument you passed to CHAPTER (if it’s been +called) is a digit. If it isn’t (say you’ve numbered your +chapter “One” instead of “1”), mom will +abort with a request that you pass PREFIX_CHAPTER_NUMBER a digit +representing the chapter number.

After you invoke .PREFIX_CHAPTER_NUMBER, mom will prepend -the current chapter number to all headings you have requested be -numbered with -.HEADING_STYLE <n> NUMBER. +the chapter number to all headings you have requested be numbered +with +.HEADING_STYLE <n> NUMBER. Thus, assuming chapter number twelve (12):
@@ -1477,31 +1505,27 @@ would become

+
+

+Note: +If a chapter number is given to PREFIX_CHAPTER_NUMBER, automatically +generated labels with a prepended chapter number are also affected. +

+
+

-When you invoke .PREFIX_CHAPTER_NUMBER without an -argument, mom checks to see whether the argument you passed to -CHAPTER -is a digit. If it is, she immediately starts pre-pending the -current chapter number to numbered head elements. If it isn’t -(say you’ve called your chapter “One” instead -of “1”), mom will abort with a request that you pass -PREFIX_CHAPTER_NUMBER a digit representing the current chapter -number. -

- -

-In collated documents, mom automatically increments -the digit used by PREFIX_CHAPTER_NUMBER by one -(current chapter digit + 1) every time you invoke .COLLATE, even if -you’ve (temporarily) turned off the prefixing of chapter -numbers. Thus, even if you call your chapters “One”, -“Two”, “Three” instead of “1”, -“2”, “3”, mom will Do The Right Thing -with respect to numbering head elements in all collated chapters -following the first invocation of PREFIX_CHAPTER_NUMBER (assuming, -of course, that the collated chapters are in incrementing order; if -not, you must must put +In collated documents, mom automatically increments the digit used +by PREFIX_CHAPTER_NUMBER by one (current chapter digit + 1) every +time you invoke +.COLLATE, +even if you’ve (temporarily) turned off the prefixing +of chapter numbers. Thus, even if you number your chapters +“One”, “Two”, “Three” instead of +“1”, “2”, “3”, mom will Do The +Right Thing with respect to numbering head (and label) elements +in all collated chapters following the first invocation of +PREFIX_CHAPTER_NUMBER (assuming, of course, that the collated +chapters are in incrementing order; if not, you must put
.PREFIX_CHAPTER_NUMBER <chapter number> @@ -1512,14 +1536,15 @@ numbered head element of each collated document).

PREFIX_CHAPTER_NUMBER can be disabled by passing it any argument -other than a digit (e.g., OFF, QUIT, END, X, etc), although, -as noted above, mom will keep, and—in the case of collated -documents—increment the chapter number, allowing you to turn -prefixing of chapter numbers to numbered head elements off and on -according to your needs or whims. +other than a digit (e.g. (OFF, QUIT, Q, +X...), although, as noted above, mom will keep, +and—in the case of collated documents—increment the +chapter number, allowing you to turn prefixing of chapter numbers to +numbered head elements off and on according to your needs or whims.

-

+

+

Note: Because PREFIX_CHAPTER_NUMBER takes an (optional) digit representing the chapter number, it’s use need not be restricted to @@ -1533,7 +1558,7 @@ with a numeric argument in your document setup.

- +

@@ -1570,19 +1595,20 @@ description of the default styles in the sections SUBHEAD (now HEADING 2), and SUBSUBHEAD (now HEADING 3). -Mom also emits a message to stderr alerting you to what she's doing. +Mom also emits a message to stderr alerting you to what she’s +doing.

The control macros formerly associated with oldstyle headings are no -longer present in mom's macro file, which means that if you -made changes to mom's default for those headings, you must recreate -the changes with the +longer present in mom’s macro file, which means that if you +made changes to mom’s default for those headings, you must +recreate the changes with the HEADING_STYLE macro. The entire style need not be recreated, only those -parameters that differed from mom's defaults. Thus, if your HEADs -were set flush left, instead of the oldstyle default, centred, but -otherwise kept mom's settings, you need only do +parameters that differed from mom’s defaults. Thus, if your +HEADs were set flush left, instead of the oldstyle default, centred, +but otherwise kept mom’s settings, you need only do
.HEADING_STYLE 1 QUAD L @@ -1606,7 +1632,7 @@ paraheads, the former defaults for PARAHEAD can be set up like this: Equally, the macro NUMBER_PARAHEADS is no longer available. You must enable numbering of the correct level for paraheads with HEADING_STYLE. Again assuming a heading level of 3 for paraheads, -it's simply done: +it’s simply done:
.HEADING_STYLE 3 NUMBER @@ -1748,7 +1774,7 @@ The former style defaults for SUBHEAD were:
FAMILY = prevailing document family - FONT = bold (TYPESET); italic, ie underlined (TYPEWRITE) + FONT = bold (TYPESET); italic, i.e. underlined (TYPEWRITE) SIZE = +.5 (TYPESET); +0 (TYPEWRITE) QUAD = L BASELINE_ADJUST = 1/8 the current leading @@ -1824,7 +1850,7 @@ Mom will alert you to this on stderr.

Linebreaks (“author linebreaks”, “section breaks”) are gaps in the vertical flow of running text that -indicate a shift in content (e.g., a scene change in story). They +indicate a shift in content (e.g. a scene change in story). They are frequently set off by typographic symbols, sometimes whimsical in nature.

@@ -1884,8 +1910,8 @@ and a vertical adjustment factor.

-The first argument is any valid groff character (e.g., * -[an asterisk], \[dg] [a dagger], \f[ZD]\N'141\fP +The first argument is any valid groff character (e.g. * +[an asterisk], \[dg] [a dagger], \f[ZD]\N'141'\fP [an arbitrary character from Zapf Dingbats], \l'4P' [a 4-pica long rule]). Mom sets the character centred on the current line length. (See man groff_char for a list of all @@ -1897,7 +1923,7 @@ The second argument is the number of times to repeat the character.

-The third argument is a +|-value by which to raise (+) or lower (-) +The third argument is a +|-value by which to raise (-) or lower (+) the character in order to make it appear visually centred between sections of text. This lets you make vertical adjustments to characters that don’t sit on the @@ -1918,7 +1944,7 @@ Mom’s default for LINEBREAK_CHAR is .LINEBREAK_CHAR * 3 -3p -ie three asterisks, lowered 3 points from their normal vertical +i.e. three asterisks, raised 3 points from their normal vertical position (for PRINTSTYLE TYPESET; the vertical adjustment is -2 points for @@ -1979,7 +2005,7 @@ cited text.)

Since mom originally came into being to serve the needs of creative -writers (ie novelists, short story writers, etc.—not +writers (i.e. novelists, short story writers, etc.—not to cast aspersions on the creativity of mathematicians and programmers), she sets quotes in italics (PRINTSTYLE TYPESET) @@ -1988,7 +2014,7 @@ or underlined indented from the left margin. Obviously, she’s thinking “quotes from poetry or song lyrics”, but with the QUOTE control macros -you can change her defaults so QUOTE serves other needs, e.g., +you can change her defaults so QUOTE serves other needs, e.g. entering verbatim snippets of programming code, command-line instructions, and so on. (See the CODE @@ -2007,7 +2033,7 @@ this is always one full linespace. In PRINTSTYLE TYPESET, it’s 1/2 of the prevailing leading -if the quote fits fully on the page (ie with running text above +if the quote fits fully on the page (i.e. with running text above and below it), otherwise it’s a full linespace either above or below as is necessary to balance the page to the bottom margin. This behaviour can be changed with the control macro @@ -2033,10 +2059,10 @@ differently.

If you don’t want the behaviour -described above (ie you don’t want mom putting additional shim +described above (i.e., you don’t want mom putting additional shim or flex-spacing around quotes and blockquotes), put .NO_SHIM or/and .NO_FLEX -in the style sheet section of your document (ie after PRINTSTYLE +in the style sheet section of your document (i.e. after PRINTSTYLE but before START), which will disable shimming or/and flex-spacing globally for all tags, or disable shimming/flex-spacing on a per-instance basis prior to .QUOTE or @@ -2054,11 +2080,11 @@ The text of quotes and blockquotes is output immediately, and may therefore start on one page and finish on the next. If you wish to keep the text together as a block, deferred to the following page if the block doesn’t all fit on one page, wrap -(BLOCK)QUOTE / (BLOCK)QUOTE OFF +(BLOCK)QUOTE...(BLOCK)QUOTE OFF inside a -float. If you further wish to -force a page break before the floated quote or blockquote (leaving -whitespace at the bottom of the page, pass +float. +If you further wish to force a page break before the floated quote +or blockquote (leaving whitespace at the bottom of the page, pass FLOAT the FORCE argument. @@ -2081,7 +2107,9 @@ Quotes and blockquotes may be labelled and/or captioned identically to with the macros LABEL and -CAPTION. +CAPTION +(see +Labelling and captioning floats).

@@ -2101,7 +2129,7 @@ Macro: QUOTE [ ADJUST +|-<space> ] | <an

QUOTE is a toggle macro. To begin a section of quoted text, invoke it with no argument, then type in your quote. When you’re -finished, invoke .QUOTE with any argument (e.g., OFF, +finished, invoke .QUOTE with any argument (e.g. OFF, END, X, Q...) to turn it off. Example:
@@ -2164,7 +2192,7 @@ and QUOTE_RIGHT must be entered as: .QUOTE_FAMILY default = prevailing document family; default is Times Roman .QUOTE_FONT default = italic; underlined in TYPEWRITE -.QUOTE_SIZE default = +0 (ie same size as paragraph text) +.QUOTE_SIZE default = +0 (i.e. same size as paragraph text) .QUOTE_AUTOLEAD default = none; leading of quotes is the same as paragraphs .QUOTE_COLOR default = black .QUOTE_INDENT (see below, "Quote indent") @@ -2186,8 +2214,19 @@ for TYPESET, 3 picas for TYPEWRITE) to arrive at the quote indent, or a distance with a unit of measure -appended. Both result in quotes being indented equally from the -left and right margins. +appended. +

+ +

+Be careful when using QUOTE. If a quote is set flush left (the +default), the QUOTE_INDENT applies only to the left margin. Because +quote lines are output as-is (see +no-fill mode), +they do not respect line length and may extend beyond a document's +right margin. Similarly, if a quote is being set flush right, the +indent applies only to the right margin; long lines may extend into +the left margin. Centered quotes are never indented, so long lines +may extend beyond both the left and right margins.

@@ -2200,7 +2239,7 @@ and 1 (for

Note: -If your PARA_INDENT is 0 (ie no indenting of the first line of +If your PARA_INDENT is 0 (i.e. no indenting of the first line of paragraphs), you must set a QUOTE_INDENT yourself, with a unit of measure appended to the argument. Mom has no default for QUOTE_INDENT if paragraph first lines are not being indented. @@ -2219,7 +2258,8 @@ below quotes, invoke with no argument. If you wish to restore mom’s default behaviour regarding the spacing of quotes (see Quote spacing), -invoke the macro with any argument (OFF, QUIT, END, X...) +invoke the macro with any argument (OFF, QUIT, +END, X...)

@@ -2236,10 +2276,10 @@ This macro also sets mom’s spacing policy for By default in PRINTSTYLE TYPEWRITE, mom underlines quotes. If you’d rather she didn’t, -invoke .UNDERLINE_QUOTES with any argument (OFF, -QUIT, END, X...) to disable the feature. Invoke it without -an argument to restore mom’s default underlining of -quotes. +invoke .UNDERLINE_QUOTES with any argument +(OFF, QUIT, END, X...) +to disable the feature. Invoke it without an argument to restore +mom’s default underlining of quotes.

@@ -2248,7 +2288,7 @@ she set them in italic, you must follow each instance of QUOTE with the typesetting macro FT I. Furthermore, since mom underlines all instances of italics by -default in PRINTSTYLE TYPEWRITE, you must also make sure that +default in PRINTSTYLE TYPEWRITE, you must also make sure that ITALIC_MEANS_ITALIC is enabled (see PRINTSTYLE TYPEWRITE control macros).

@@ -2260,7 +2300,7 @@ ITALIC_MEANS_ITALIC is enabled (see

Blockquotes (cited material)

@@ -2322,7 +2362,7 @@ Macro: BLOCKQUOTE [ ADJUST +|-<space> ] | BLOCKQUOTE is a toggle macro. To begin a cited passage, invoke the tag with no argument, then type in your blockquote. When you’re finished, invoke .BLOCKQUOTE with any -argument (e.g., OFF, END, X, Q...) to turn it off. +argument (e.g. OFF, END, X, Q...) to turn it off. Example:
@@ -2365,7 +2405,7 @@ space allotted for it, you’d do Note: The aliases CITE and CITATION may be used in place of the BLOCKQUOTE tag, as well as in any of the control macros that begin or end with -BLOCKQUOTE_. +BLOCKQUOTE_.

@@ -2406,7 +2446,7 @@ using BLOCKQUOTE_STYLE. BLOCKQUOTE_INDENT takes one of two kinds of argument: an integer representing the amount by which to multiply the argument passed to -.PARA_INDENT +PARA_INDENT (by default, 2 ems for TYPESET, 3 @@ -2427,8 +2467,8 @@ and 1 (for

Note: -If your PARA_INDENT is 0 (ie no indenting of the first line of -paragraphs), you must set a BLOCKQUOTE_INDENT yourself, with +If your PARA_INDENT is 0 (i.e. no indenting of the first line of +paragraphs), you must set a BLOCKQUOTE_INDENT yourself, with a unit of measure appended to the argument. Mom has no default for BLOCKQUOTE_INDENT if paragraph first lines are not being indented.

@@ -2448,8 +2488,8 @@ below blockquotes, invoke with no argument. If you wish to restore mom’s default behaviour regarding the spacing of blockquotes (see Quote spacing), -invoke the macro with any argument (OFF, QUIT, END, -X...). +invoke the macro with any argument (OFF, QUIT, +END, X...).

@@ -2483,7 +2523,7 @@ using mom’s document processing macros; it can be used for
-Macro: CODE [BR | BREAK | SPREAD] toggle +Macro: CODE [BR | BREAK | SPREAD] <anything>

@@ -2491,8 +2531,9 @@ Inline escape: \*[CODE]

-When you invoke the macro .CODE or insert \*[CODE] into -running text, mom switches to a +When you invoke the macro CODE or insert +\*[CODE] into running text, mom switches to +a fixed-width font (Courier, by default) and turns SMARTQUOTES @@ -2516,7 +2557,7 @@ The correct order for changing the escape character inside .CODE .ESC_CHAR character <code> - .ESC_CHAR . + .ESC_CHAR \ .CODE OFF Be aware that changing the escape character prevents subsequent @@ -2538,7 +2579,7 @@ to print a literal backslash. .CODE does not cause a line break when you’re in a fill mode -(ie +(i.e. JUSTIFY or QUAD @@ -2553,12 +2594,12 @@ it as well, invoke .CODE with the argument, you want a break afterwards, you must supply it manually with BR unless what follows immediately is a macro that automatically causes -a break (e.g., +a break (e.g. PP).

-

-In all likelihood, if you want the situation described above (ie a +

+In all likelihood, if you want the situation described above (i.e. a break before and after CODE), what you probably want is to use QUOTE in conjunction with CODE, like this: @@ -2581,32 +2622,32 @@ introducing unwanted vertical whitespace.

Passing any argument other than BR, BREAK or -SPREAD to CODE (e.g., OFF, QUIT, END, X, etc.) -turns CODE off and returns the family, font, and smartquotes back to -their former state. +SPREAD to CODE (e.g. OFF, QUIT, +END, X, etc) turns CODE off and returns the +family, font, and smartquotes back to their former state.

Using \*[CODE] inline

-\*[CODE] invokes .CODE, allowing you to +\*[CODE] invokes .CODE, allowing you to bracket code snippets inline. It does not accept the BR, BREAK, or SPREAD arguments. It is most useful for short snippets, as in the following example.
- \*[CODE]apropos\*[CODE OFF] and \*[CODE]man -k\*[CODE] are identical. + \*[CODE]apropos\*[CODE X] and \*[CODE]man -k\*[CODE X] are identical.

-\*[CODE] does not permit changing the escape character, -so \e or a doubled backslash must be used. Furthermore, -if your code starts with a period, you must enter it as -“\&.”. +\*[CODE] does not permit changing the escape +character, so \e or a doubled backslash must be used. +Furthermore, if your code starts with a period, you must enter it as +“\&.”.
- Registers are created with the \*[CODE]\&.nr\*[CODE OFF] request. + Registers are created with the \*[CODE]\&.nr\*[CODE X] request.

@@ -2628,15 +2669,15 @@ it with .CODE echo "Hello, world" | sed -e 's/Hello,/Goodbye, cruel/'\c .CODE OFF - \&. As this demonstrates... + \&. As this demonstrates... -Use of \*[CODE] inline does not require the -\c, however periods and apostrophes after -\*[CODE OFF] still need to be introduced with -\&, as in this example: +Use of \*[CODE] inline does not require +the \c, however periods and apostrophes after +\*[CODE X] still need to be introduced +with \&, as in this example:
- ...append the unit of measure \*[CODE]p\*[CODE OFF]\&. New sentence... + ...append the unit of measure \*[CODE]p\*[CODE OFF]\&. New sentence...

@@ -2677,9 +2718,9 @@ PRINTSTYLE TYPESET and PRINTSTYLE TYPEWRITE. CODE_SIZE works a little differently from the other _SIZE macros (see Arguments to the control macros). The argument you pass it is a percentage of the -prevailing document point size. It does not require a pre-pended +prevailing document point size. It does not require a prepended plus (+) or minus (-) sign, nor an appended -percent sign (%). Thus, is you want the point size of your CODE font to be +percent sign (%). Thus, if you want the point size of your CODE font to be 90% of the prevailing document point size, you enter:
@@ -2688,13 +2729,14 @@ percent sign (%). Thus, is you want the point size of your CODE font Fixed-width fonts have notoriously whimsical x-heights, meaning that they frequently look bigger (or, in some cases, -smaller) than the type surrounding them, even if they're technically -the same point size. CODE_SIZE lets you choose a percentage of the -prevailing point size for your fixed-width CODE font so it doesn't look -gangly or miniscule in relation to the type around it. All -invocations of .CODE or \*[CODE] will use this -size, so that if you decide to change the prevailing point size of your -document, the CODE font will be scaled proportionally. +smaller) than the type surrounding them, even if they’re +technically the same point size. CODE_SIZE lets you choose a +percentage of the prevailing point size for your fixed-width +CODE font so it doesn’t look gangly or minuscule in relation +to the type around it. All invocations of .CODE or +\*[CODE] will use this size, so that if you +decide to change the prevailing point size of your document, the +CODE font will be scaled proportionally.


@@ -2724,7 +2766,8 @@ Setting lists with mom is easy. First, you initialize a list with the LIST macro. Then, for every item in the list, you invoke the macro .ITEM followed by the text of the item. When a list is finished, you exit the list with -.LIST OFF (or QUIT, END, BACK, etc.) +.LIST OFF (or QUIT, END, +BACK, etc.)

@@ -2732,7 +2775,7 @@ By default mom starts each list with the enumerator flush with the left margin of running text that comes before it, like this:
- My daily schedule needs organizing. I can’t + My daily schedule needs organising. I can’t seem to get everything done I want. o an hour’s worth of exercise o time to prepare at least one healthy @@ -2784,7 +2827,7 @@ or Mom centres lists over the entire line length, disregarding IB if it is in effect. If there are lines in the list that exceed -the the margins of IB, they must be broken manually with +the margins of IB, they must be broken manually with .BR if you wish to keep them within the indented margins.

@@ -2807,9 +2850,9 @@ Macro: LIST [ BULLET | DASH | DIGIT | ALPHA | alp

-Invoked by itself (ie with no argument), LIST +Invoked by itself (i.e. with no argument), LIST initializes a list with bullets as the default enumerator. -Afterward,s each block of input text preceded by +Afterwards, each block of input text preceded by .ITEM, on a line by itself, is treated as a list item.

@@ -2822,7 +2865,7 @@ Every time you invoke .LIST to start a list (as opposed to you must supply an enumerator (and optionally, a separator) for the list, unless you want mom’s default enumerator, which is a bullet. Within nested lists, mom stores the enumerator, separator -and indent for any list you return backwards to (ie with +and indent for any list you return backwards to (i.e. with .LIST OFF), but does not store any information for lists you move forward to.

@@ -2840,14 +2883,14 @@ The optional arguments BULLET, DASH, uppercase letters), alpha (for lowercase letters), ROMAN<n> (for uppercase roman numerals), roman<n> (for lowercase roman numerals) tell -mom what kind of enumerator to use for a given list. +mom what kind of enumerator to use for a given list.

The arguments, ROMAN<n> and roman<n>, are special. You must append to them -a digit (arabic, e.g., "1" or "9" or "17") saying how many items a -particular roman-numeralled LIST is going to have. Mom requires this +a digit (arabic, e.g. "1" or "9" or "17") saying how many items a +particular roman-numeraled LIST is going to have. Mom requires this information in order to align roman numerals sensibly, and will abort—with a message — if you don’t provide it. (For setting roman numeral and digit lists with the enumerators @@ -2856,7 +2899,7 @@ aligned flush right—the default is flush left—see

-A roman-numeralled list containing, say, five items, would be set +A roman-numeraled list containing, say, five items, would be set up like this:
@@ -2896,8 +2939,7 @@ or If your enumerator contains spaces, you must enclose the <character> argument in both LIST and ITEM in -double-quotes, -e.g. +double-quotes, e.g.
.LIST VARIABLE "\*[UP 1p]\[bu]\*[DOWN 1p]" @@ -2935,7 +2977,7 @@ The size and vertical positioning of special characters may be adjusted with inline escapes in the argument passed to USER. For example, to raise the position -of \[sq] slightly, you might do +of \[sq] slightly, you might do .LIST USER "\*[UP .25p]\[sq]\*[DOWN .25p]" or @@ -3002,7 +3044,7 @@ separator.

The third argument – prefix style

-Additionally, you may give a prefix (ie a character +Additionally, you may give a prefix (i.e. a character that comes before the enumerator) when your enumerator style for a particular list is DIGIT, ALPHA, alpha, ROMAN<n> or @@ -3040,13 +3082,13 @@ which would produce

-

Exiting lists – LIST OFF/BACK or QUIT_LISTS

+

Exiting lists – LIST OFF / BACK or QUIT_LISTS

Any single argument to LIST other than BULLET, DASH, DIGIT, ALPHA, alpha, ROMAN<n>, -roman<n> or USER (e.g., +roman<n> or USER (e.g. LIST OFF or LIST BACK) takes you out of the current list.

@@ -3059,12 +3101,12 @@ prior to setting the list are fully restored.

If you are in a nested list, mom moves you back one list-level -(ie does not take you out of the list structure) and restores the +(i.e., does not take you out of the list structure) and restores the enumerator, separator and indent appropriate to that level.

-Each invocation of .LIST should thus be be matched by +Each invocation of .LIST should thus be matched by a corresponding .LIST OFF in order to fully exit lists. For example,
@@ -3227,12 +3269,12 @@ produces (approximately) Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore. - o List 1 item - o List 1 item + • List 1 item + • List 1 item - List 2 item - List 2 item - o List 1 item - o List 1 item + • List 1 item + • List 1 item Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore. @@ -3241,7 +3283,7 @@ produces (approximately)

2. Resetting an initialized list’s enumerator – RESET_LIST

-In nested lists, if your choice of list enumerator for a given level +In nested lists, if your choice of enumerator for a given level of list is DIGIT, ALPHA, alpha, ROMAN or roman, you may sometimes want to reset the list’s enumerator when you return to that list. @@ -3249,37 +3291,34 @@ Consider the following:
Things to do religiously each and every day: - 1. Take care of the dog - a) walk every day - b) brush once a week - - trim around the eyes every fourth brushing - - don’t forget to check nails - 2. Feed the cat - a) soft food on Mon., Wed. and Fri. - b) dry food on Tues., Thurs. and Sat. - c) canned tuna on Sunday + • take care of the dog + a) walk every day + b) brush once a week + - trim around the eyes every fourth brushing + - don’t forget to check nails + • feed the cat + d) soft food on Mon., Wed. and Fri. + e) dry food on Tues., Thurs. and Sat. + f) canned tuna on Sunday

-Normally, within a nested list, when you return to an -incrementally-enumerated list, the enumerator continues incrementing -from where it left off. That means, in the example above, the -normal state of affairs for the alpha'ed list under -
- - 2. Feed the cat - -would be d), e) and f). The solution, in such a case, is simply -to reset the enumerator—before .ITEM—with -the macro .RESET_LIST. By default, with no argument, -.RESET_LIST resets the enumerator to 1, A, a, I or i -depending on the style of enumerator. You may, if you wish, pass -.RESET_LIST a -numeric argument -representing the starting enumerator for the reset (if different -from "1"), although I can’t at present think of a use for this -feature. +The alpha-enumerated items under “Feed the cat” +would be normally a), b), c), but we want d), e), f). The +solution is to reset the second .LIST alpha’s +enumerator—before the first .ITEM—with +the macro RESET_LIST. +

+ +

+With no argument, .RESET_LIST resets an incrementing +enumerator to 1, A, a, I or i depending on the style of enumerator. +If you pass .RESET_LIST a +numeric argument, +it represents the starting position for an incrementing enumerator. In +the example above, .RESET_LIST 4 starts the second +alpha-ed list at d).

3. Padding digit enumerators – PAD_LIST_DIGITS

@@ -3332,7 +3371,7 @@ lines up properly.

If you’d like the roman numerals to line -up flush right (ie be padded "left"), simply +up flush right (i.e. be padded "left"), simply invoke .PAD_LIST_DIGITS LEFT after .LIST ROMAN<n> or .LIST roman<n> and before .ITEM. @@ -3424,7 +3463,7 @@ for instructions on line-numbered endnotes.)

Note: -Do not use NUMBER_LINES inside +Do not use NUMBER_LINES inside QUOTE or BLOCKQUOTE. @@ -3444,9 +3483,9 @@ The first time you invoke you must, at a minimum, tell it what line number you want the next output line -to have. The optional arguments which lines to number -and gutter allow you to state which lines should -be numbered (e.g., every five or every ten lines), and the gutter to +to have. The optional arguments <which lines to number> +and <gutter> allow you to state which lines should +be numbered (e.g. every five or every ten lines), and the gutter to place between line numbers and running text.

@@ -3462,7 +3501,7 @@ subsequent output lines sequentially.

If you want only every five lines numbered, pass mom the optional -which lines to number argument, like this: +<which lines to number> argument, like this: .NUMBER_LINES 1 5 @@ -3479,15 +3518,16 @@ Hence, in the above example, line number 1 will

-If you want line number 1 to be numbered, you have to -invoke .NUMBER_LINES 1 1 before the first output line -you want numbered, then study your output copy and determine -where best to insert the following in your input input text: +If you want line number 1 to be numbered, you have +to invoke .NUMBER_LINES 1 1 before the +first output line you want numbered, then study your output +copy and determine where best to insert the following in your +input text:
.NUMBER_LINES \n[ln] 5 -(The escape, \n[ln], ensures that NUMBER_LINES +(The escape \n[ln] ensures that NUMBER_LINES automatically supplies the correct value for the first argument, <start number>.)

@@ -3539,7 +3579,7 @@ option to resume, using .NUMBER_LINES OFF -(or END, QUIT, X, etc). +(or END, QUIT, X, etc).

To resume line numbering: @@ -3568,7 +3608,7 @@ desired result. you should re-invoke, at a minimum, .NUMBER_LINES 1 for each collated document, in order to ensure that each begins with the - number, 1, prepended to the first line. + number 1 prepended to the first line.

  • Occasionally, you may want to change the current gutter between line numbers and running @@ -3672,27 +3712,25 @@ or .NUMBER_BLOCKQUOTE_LINES -either before or after NUMBER_LINES. Both behave -identically with respect to the affected macro (ie QUOTE -or BLOCKQUOTE). +either before or after NUMBER_LINES. Both behave identically with +respect to the affected macro (i.e. QUOTE or BLOCKQUOTE).

    • Selectively enabling line numbering for QUOTEs and BLOCKQUOTEs

    -If you’d like to enable line numbering -selectively for quotes and blockquotes only, enable -NUMBER_QUOTE_LINES or NUMBER_BLOCKQUOTE_LINES -first, followed by NUMBER_LINES <n>, where -<n> is the first line number of the quote -or blockquote. Afterwards, enter your QUOTE or -BLOCKQUOTE. When the quote or blockquote is finished (ie -after QUOTE OFF or BLOCKQUOTE OFF), -turn line numbering off. Each subsequent quote or blockquote you -want line numbered requires only NUMBER_LINES <n> -(with a corresponding NUMBER_LINES OFF) until you turn -NUMBER_QUOTE_LINES or NUMBER_BLOCKQUOTE_LINES -off. +If you’d like to enable line numbering selectively for quotes +and blockquotes only, invoke .NUMBER_QUOTE_LINES +or .NUMBER_BLOCKQUOTE_LINES first, followed by +.NUMBER_LINES <n>, where <n> +is the first line number of the quote or blockquote. Afterwards, +enter your QUOTE or BLOCKQUOTE. When the quote or blockquote +is finished (i.e. after .QUOTE OFF or +.BLOCKQUOTE OFF), turn line numbering off. Each +subsequent quote or blockquote you want line numbered requires +only .NUMBER_LINES <n> (with a corresponding +.NUMBER_LINES OFF) until you turn NUMBER_QUOTE_LINES or +NUMBER_BLOCKQUOTE_LINES off.

    @@ -3725,15 +3763,15 @@ space as the line number unit of measure, it is not possible for line numbers in quotes or blockquotes to hang outside a document’s overall left margin and be reliably flush with the line numbers of paragraph -text. Conseqently, line numbers in quotes or blockquotes hang +text. Consequently, line numbers in quotes or blockquotes hang to the left of the quote, separated by the currently active -gutter for NUMBER_LINES. +gutter for NUMBER_LINES.

    -If you’d like to change the line number gutter for -quotes or blockquotes, invoke NUMBER_QUOTE_LINES or -NUMBER_BLOCKQUOTE_LINES with a digit representing the +If you’d like to change the line number gutter for quotes +or blockquotes, invoke .NUMBER_QUOTE_LINES or +.NUMBER_BLOCKQUOTE_LINES with a digit representing the number of figure spaces you’d like between the line numbers and the quoted text, like this: @@ -3766,8 +3804,8 @@ appear in the output copy.

    -Once having turned NUMBER_QUOTE_LINES or -NUMBER_BLOCKQUOTE_LINES on, you may disable them with +Once having turned NUMBER_QUOTE_LINES or NUMBER_BLOCKQUOTE_LINES on, +you may disable them with .NUMBER_QUOTE_LINES OFF @@ -3872,7 +3910,7 @@ first footnote is always the same.

    If mom sees that a portion of a footnote cannot be fit on its page, she carries that portion over to the next page. If an entire -footnote can’t be fit on its page (ie FOOTNOTE has been +footnote can’t be fit on its page (i.e., FOOTNOTE has been called too close to the bottom), she defers the footnote to the next page, but sets it with the appropriate marker from the previous page. @@ -3889,7 +3927,7 @@ page if it allows her to complete the cited text on one page.

    In the unfortunate happenstance that a deferred footnote is the -only footnote on its page (ie it’s marked in the document +only footnote on its page (i.e., it’s marked in the document body with a star) and the page it’s deferred to has its own footnotes, mom separates the deferred footnote from the page’s proper footnote(s) with a blank line. This avoids the confusion @@ -3920,7 +3958,8 @@ the page the deferred ones were moved to, add the space manually by putting a .SPACE command at the end of the footnote text, before -.FOOTNOTE OFF (or X, QUIT, EXIT, etc). +.FOOTNOTE OFF (or OFF, QUIT, +END, X, etc).

    @@ -4052,8 +4091,9 @@ for fill modes. In the second instance, you must explicitly tell mom that you want input text after .FOOTNOTE OFF to begin on a new output line. This is accomplished by passing -.FOOTNOTE OFF (or QUIT, END, X, etc) an -additional argument: BREAK or BR. +.FOOTNOTE OFF (or OFF, QUIT, +END, X, etc) an additional argument: +BREAK or BR.

    @@ -4133,7 +4173,7 @@ you insert footnotes into quotes.

  • -Tag: FOOTNOTE <toggle> [ BREAK | BR ] | INDENT LEFT | RIGHT | BOTH <indent value> +Tag: FOOTNOTE <toggle> [ BREAK | BR ] [ INDENT LEFT | RIGHT | BOTH <indent value> ]

    @@ -4145,8 +4185,9 @@ See HYPER-IMPORTANT NO

    FOOTNOTE is a toggle macro, therefore invoking it on a line by itself allows you to enter a footnote in the body of a document. -Invoking it with any argument other than INDENT (ie OFF, -QUIT, END, X...) tells mom you’re finished. +Invoking it with any argument other than INDENT (i.e. +OFF, QUIT, END, X...) +tells mom you’re finished.

    @@ -4196,7 +4237,7 @@ modes or QUAD), the line after a .FOOTNOTE OFF should be -entered as if there were no interruption in the input text, ie +entered as if there were no interruption in the input text, i.e., the line should begin with a literal space or punctuation mark (see explanation and examples here). @@ -4206,9 +4247,10 @@ explanation and examples In no-fill modes, the optional argument BREAK or BR may -be used after the OFF (or QUIT, END, X, etc.) -argument to instruct mom not to join the next input line to the -previous output. See +be used after the OFF (or OFF, +QUIT, END, X, etc) argument to +instruct mom not to join the next input line to the previous output. +See here for a more complete explanation, with examples.

    @@ -4224,7 +4266,7 @@ should be entered normally.
    -

    FOOTNOTE control macros macros and defaults

    +

    FOOTNOTE control macros and defaults

    1. Family/font/size/colour/lead/quad
    2. @@ -4272,13 +4314,13 @@ using FOOTNOTE_STYLE.

      2. Footnote markers – FOOTNOTE_MARKERS

      -If you don’t want footnote markers, in either the body of +If you don’t want footnote markers in either the body of the document or beside footnote entries themselves, toggle them -off with .FOOTNOTE_MARKERS OFF (or END, QUIT, -X...). This means, of course, that you’ll -have to roll your own. If you want them back on, invoke -.FOOTNOTE_MARKERS with no argument. Footnote markers are -on by default. +off with .FOOTNOTE_MARKERS OFF (or OFF, +QUIT, END, X...). This means, +of course, that you’ll have to roll your own. If you want +them back on, invoke .FOOTNOTE_MARKERS with no argument. +Footnote markers are on by default.

      @@ -4390,22 +4432,27 @@ footnotes either by single line numbers, or line ranges. If what you want is a single line number, you need only invoke .FOOTNOTE, without the terminating \c, at the appropriate place in running text. Input lines after the -footnote has been terminated (e.g., with .FOOTNOTE OFF) -must begin at the left margin. -

      - -

      -If you want a range of line numbers (e.g., [5-11] ), -insert, directly into the first line of the range you want, -the inline escape, -\*[FN_MARK]. For the terminating line number of the -range, you need only invoke .FOOTNOTE (again, without the -terminating \c); mom is smart enough to figure out that -where .FOOTNOTE was invoked represents the terminating -line number. Range-numbered footnotes are always output on the -page where .FOOTNOTE was invoked, not the page where -\*[FN_MARK] appears (subject, of course, to the rules for -footnotes that fall too close to the bottom of a page, as outlined +footnote has been terminated (e.g. with +.FOOTNOTE OFF) are entered normally. +

      + +

      +If you want a range of line numbers (e.g. [5-11] ), +insert, directly into the first line of the range you want, the +inline escape, +\*[FN_MARK]. For the terminating line +number of the range, you need only invoke .FOOTNOTE +(again, without the terminating \c); mom is smart enough +to figure out that where .FOOTNOTE was invoked represents +the terminating line number. +

      + +

      +Range-numbered footnotes are always output on the page +where .FOOTNOTE was invoked, not the page where +\*[FN_MARK] appears (subject, of course, to +the rules for footnotes that fall too close to the bottom of a page, +as outlined here).

      @@ -4484,7 +4531,7 @@ separator with a space after it, you’d do

      Finally, if your footnote marker style is LINE, you may instruct mom to do “run-on style” footnotes. Run-on -footnotes do not treat footnotes as discrete entities, ie each +footnotes do not treat footnotes as discrete entities, i.e. each beginning on a new line. Rather, each footnote is separated from the footnote before it by horizontal space in the running line, so that the footnotes on any given page form a continuous block, like @@ -4553,10 +4600,11 @@ you can accomplish with .FOOTNOTE_SPACING 1v.

      7. Footnote rule – FOOTNOTE_RULE

      -If you don’t want a footnote separator rule, toggle it off with -.FOOTNOTE_RULE OFF (or END, QUIT, X...). -Toggle it back on by invoking .FOOTNOTE_RULE with no -argument. The default is to print the rule. +If you don’t want a footnote separator rule, toggle it +off with .FOOTNOTE_RULE OFF (or END, +QUIT, X...). Toggle it back on by invoking +.FOOTNOTE_RULE with no argument. The default is to print +the rule.

      8. Footnote rule length – FOOTNOTE_RULE_LENGTH

      @@ -4574,7 +4622,7 @@ which sets the length to 1 inch. Note that a is required. The default is 4 picas for both -PRINTSTYLES. +PRINTSTYLEs.

      9. Footnote rule weight – FOOTNOTE_RULE_WEIGHT

      @@ -4731,7 +4779,7 @@ or blockquote control macros. However, you must make the changes within each endnote, prior to invoking .QUOTE or .BLOCKQUOTE, -and undo them prior to terminating the endnote (ie before +and undo them prior to terminating the endnote (i.e. before .ENDNOTE OFF), otherwise the changes will affect subsequent quotes and blockquotes that appear in the document body as well. @@ -4765,7 +4813,7 @@ is removed. By default, mom starts the endnotes page with a bold, centred head, “ENDNOTES”. Subsequently, for each section in a collated -document (e.g., chapters in a book), she identifies the section in bold +document (e.g. chapters in a book), she identifies the section in bold type, flush left and underscored, followed by one-half linespace. Endnotes pertaining to the section are output underneath, identified by superscript numbers. The text of the endnotes themselves is @@ -4818,8 +4866,9 @@ See HYPER-IMPORTANT NOT

      ENDNOTE is a toggle macro, therefore invoking it on a line by itself allows you to enter an endnote in the body of a document. Invoking -it with any other argument (ie OFF, QUIT, END, X...) -tells mom that you’ve finished the endnote. +it with any other argument (i.e. OFF, QUIT, +END, X...) tells mom that you’ve +finished the endnote.

      @@ -4858,7 +4907,7 @@ modes or QUAD, the line after .ENDNOTE OFF should be -entered as if there were no interruption in the input text, ie +entered as if there were no interruption in the input text, i.e., the line should begin with a literal space or punctuation mark (see explanation and examples for footnotes, which apply equally to endnotes, @@ -4869,9 +4918,10 @@ endnotes, In no-fill modes, the optional argument BREAK or BR may -be used after the OFF (or QUIT, END, X, etc.) -argument to instruct mom not to join the next input line to the -previous output. See +be used after the OFF (or OFF, +QUIT, END, X, etc) argument to +instruct mom not to join the next input line to the previous output. +See here for a more complete explanation. The examples are for .FOOTNOTE, but apply equally to .ENDNOTE. @@ -4897,13 +4947,13 @@ Macro: ENDNOTES

      Unlike footnotes, which mom automatically outputs at the bottom of pages, endnotes must be explicitly output by you, the -user. ENDNOTES, by itself (ie without any argument), is the macro +user. ENDNOTES, by itself (i.e. without any argument), is the macro to do this.

      Typically, you’ll use ENDNOTES at the end of a document. If -it’s a single (ie not collated) document, mom will print +it’s a single (i.e. not collated) document, mom will print the endnotes pertaining to it. If it’s a collated document, mom will print all the endnotes contained within all sections of the document (typically chapters), appropriately identified and @@ -5140,8 +5190,8 @@ Macro: ENDNOTE_SPACING <space to insert betwee

      -If you'd like some whitespace between endnotes, just invoke -ENDNOTE_SPACING with the amount of space you want, e.g., +If you’d like some whitespace between endnotes, just invoke +ENDNOTE_SPACING with the amount of space you want, e.g.
      .ENDNOTE_SPACING 6p @@ -5185,7 +5235,7 @@ with no argument. And if, god help you, you want to change endnote single-spacing back to double-spacing for different spacing of endnotes output at the ends of separate documents in a collated document, invoke .SINGLESPACE_ENDNOTES with any argument -(OFF, QUIT, Q, X...). +(OFF, QUIT, END, X...).

      @@ -5305,7 +5355,7 @@ Macro: ENDNOTES_FIRST_PAGENUMBER <page # that

      Use this macro with caution. If all endnotes for several collated -documents are to be output at once, ie not at the end of each +documents are to be output at once, i.e. not at the end of each separate doc, ENDNOTES_FIRST_PAGENUMBER tells mom what page number to put on the first page of the endnotes.

      @@ -5434,8 +5484,8 @@ default is not to print the centre string.

      If, for some reason, having enabled the header/footer centre string on endnotes pages, you wish to disable it, invoke the same macro -with any argument (OFF, QUIT, Q, X...). -

      +with any argument (OFF, QUIT, END, +X...).

      • Allow headers on endnotes pages
      @@ -5536,7 +5586,7 @@ Macro: ENDNOTES_HEADER_V_POS <distance from to

      -• Argument requires a unit of measusure +• Argument requires a unit of measure

      @@ -5566,7 +5616,7 @@ mom about it like this:

      - +
      • Header (first-page title) underscoring
      @@ -5595,7 +5645,7 @@ Invoked without an argument, .ENDNOTES_HEADER_UNDERSCORE will place a single rule underneath the endnotes page title. Invoked with the argument, DOUBLE, ENDNOTES_HEADER_UNDERSCORE will double-underscore the title. Invoked with any other non-numeric -argument, (e.g., OFF, NO, X, etc.) the macro disables +argument, (e.g. OFF, NO, X, etc.) the macro disables underscoring of the title.

      @@ -5663,7 +5713,7 @@ title. If you’re generating a table of contents, you may want the endnotes pages title to be in caps, but the toc entry in caps/lower case. If the argument to -ENDNOTES_HEADER_STRING +ENDNOTES_HEADER_STRING is in caps/lower case and ENDNOTES_HEADER_CAPS is on, this is exactly what will happen.

      @@ -5696,7 +5746,7 @@ with the identifying title you want, surrounded by double-quotes. If you don’t want any identifying title, invoke .ENDNOTE_TITLE with a blank argument, either two double-quotes side by side ("") or no argument -at all. This is particularly useful if you have a single (ie +at all. This is particularly useful if you have a single (i.e. non-collated) document and find having the document’s title included in the endnotes redundant.

      @@ -5756,7 +5806,7 @@ endnotes either by single line numbers or by line ranges. If what you want is a single line number, you need only invoke .ENDNOTE at the appropriate place in running text without the terminating \c. Input lines -after the endnote has been terminated (e.g., with .ENDNOTE +after the endnote has been terminated (e.g. with .ENDNOTE OFF) must begin at the left margin.

      @@ -5770,14 +5820,14 @@ nothing to prevent you from doing so.)

      -If you want a range of line numbers (e.g., [5-11] ), +If you want a range of line numbers (e.g. [5-11] ), insert, directly into the first line of the range you want, the inline escape, -\*[EN-MARK]. For the terminating line number of the -range, you need only invoke .ENDNOTE (again, without the -terminating \c). Mom is smart enough to figure out that -where .ENDNOTE is invoked represents the terminating line -number. +\*[EN-MARK]. For the terminating line +number of the range, you need only invoke .ENDNOTE +(again, without the terminating \c). Mom is smart enough +to figure out that where .ENDNOTE is invoked represents +the terminating line number.

      @@ -5847,7 +5897,7 @@ If you need less space (the total number of endnotes is less than 10) or more (the total number of endnotes is greater than 99), use the macro ENDNOTE_NUMBERS_ALIGN, -to set the desired amount of reserved space, e.g., +to set the desired amount of reserved space, e.g.
      .ENDNOTE_NUMBERS_ALIGN RIGHT 1 @@ -6149,7 +6199,7 @@ margin note entirely and issues a warning, letting you know what she’s done, and where.

      -In the event that a margin note, sucessfully begun on a page, runs +In the event that a margin note, successfully begun on a page, runs past your bottom margin (or the last line before footnotes begin), the margin note will “flow” onto the next page. If it is a “left” margin note, it will continue in the @@ -6182,7 +6232,7 @@ page.

      Adjustments to the vertical position of margin notes must be done -inside the margin note (ie after .MN), at the top, +inside the margin note (i.e. after .MN), at the top, before entering text. The commands to use are \!.ALD (to lower the margin note) and @@ -6226,7 +6276,7 @@ If you forget to do so, mom will issue a warning and abort.

      The arguments may be entered in any order, and since the list is long, use of the backslash character ( \ ) to put each on -a separate line is recommended, e.g., +a separate line is recommended, e.g.
      .MN_INIT \ @@ -6336,7 +6386,7 @@ of margin notes. <LEAD> takes points as its unit of measure, so don’t tack a unit of measure onto the end of the argument. The default lead is the same as paragraph -text (ie the document’s base leading). +text (i.e. the document’s base leading).

      COLOR <value>

      @@ -6366,7 +6416,7 @@ notes hyphenated. The values can be added together, so, for example, if you want neither the first two nor the last two characters of words hyphenated, the hyphenation-flag would be 12. The default value is -14 (ie 2+4+8). +14 (i.e. 2+4+8).

      @@ -6388,8 +6438,9 @@ argument of RIGHT will set a right margin note.

      -Any argument, such as OFF (or QUIT, END, X, -etc) exits the current margin note. +Any argument, such as OFF (or OFF, +QUIT, END, X, etc) exits the +current margin note.


      @@ -6477,7 +6528,7 @@ two lines of your document file, like this: -

      Finis contol macros

      +

      Finis control macros

      Since FINIS is only used once in a document, it has few control @@ -6509,7 +6560,7 @@ Double-quotes must enclose the macro’s argument.

      Note: -If you pass FINIS_STRING a blank string, ie +If you pass FINIS_STRING a blank string,
      .FINIS_STRING "" @@ -6536,7 +6587,7 @@ this: .FINIS_STRING_CAPS OFF -OFF, above, could be anything, e.g., NO or +OFF, above, could be anything, e.g. NO or X.

      @@ -6546,11 +6597,11 @@ this:

      Invoking the control macro .FINIS_COLOR with a -pre-defined (or “initalized”) colour changes the colour +pre-defined (or “initialized”) colour changes the colour of both the FINIS string and the em-dashes that surround it. If you use the inline escape, -\*[<colourname>], +\*[<colourname>], in the argument passed to FINIS, only the text will be in the new colour; the em-dashes will be in the default document colour (usually black). diff --git a/contrib/mom/momdoc/docprocessing.html b/contrib/mom/momdoc/docprocessing.html index 573f54d..4d09553 100644 --- a/contrib/mom/momdoc/docprocessing.html +++ b/contrib/mom/momdoc/docprocessing.html @@ -2,7 +2,7 @@ @@ -449,8 +450,8 @@ flex-spacing Near the bottom of some pages, you may find that floated or -pre-proccesor material, -including images, or a single line of text afterward, is not flush +pre-processor material, +including images, or a single line of text afterwards, is not flush with the bottom margin. This is a result of mom flex-spacing after such material but not before. The solution to is insert .FLEX immediately beforehand. @@ -458,10 +459,10 @@ insert .FLEX immediately beforehand.

      There are some instances where mom inhibits flex-spacing, notably -after outputting deferred floats and pre-processor material. -Introducing FLEX by itself in these instances—say, before a head -or paragraph—will not have any effect; you must pass FLEX the -FORCE argument. +after outputting floated material deferred from one page to the +next. Introducing FLEX by itself in these instances—say, +before a head or paragraph—will not have any effect; you must +pass FLEX the FORCE argument.

      @@ -521,7 +522,7 @@ is a

      It is typographically acceptable for there to be space between -insertions in running text (e.g., an image) and the bottom margin when +insertions in running text (e.g. an image) and the bottom margin when the next page begins with a paragraph. If you’d like to nudge the insertion a little closer to the bottom margin—not all the way; that isn’t possible without pushing it to the @@ -558,8 +559,9 @@ shimmed.

      -NO_FLEX with any argument (e.g., OFF, QUIT, END, X, etc) -re-enables flex-spacing if it has been disabled. +NO_FLEX with any argument (e.g. OFF, QUIT, +END, X, etc) re-enables flex-spacing if it has +been disabled.


      @@ -632,9 +634,9 @@ reference information (metadata). The reference macros are:
    3. SUBTITLE
    4. AUTHOR
    5. CHAPTER – chapter number
    6. -
    7. CHAPTER_TITLE – chapter name
    8. -
    9. DRAFT – the draft number
    10. -
    11. REVISION – the revision number
    12. +
    13. CHAPTER_TITLE
    14. +
    15. DRAFT – draft number
    16. +
    17. REVISION – revision number
    18. @@ -673,12 +675,12 @@ tell her how you want your document formatted. What kind of document is it? Should it be typeset or typewritten? Is this a final copy (for the world to see) or just a draft? Mom calls the macros that answer these questions “the docstyle -macros”, and they're essentially templates. +macros”, and they’re essentially templates.

      • PRINTSTYLE—typeset or typewritten
      • -
      • DOCTYPE—the type of document (default, chapter, user-defined, letter)
      • -
      • COPYSTYLE —draft or final copy
      • +
      • DOCTYPE—the type of document (default, chapter, user-defined, letter, slide)
      • +
      • COPYSTYLE—draft or final copy

      @@ -723,7 +725,7 @@ here to change mom’s document defaults (paper size, margins, family, point size, line space, rag, etc), or any of the document processing control macros. -This is the style-sheet section of a document, and +This is the stylesheet section of a document, and must come after the PRINTSTYLE directive. Failure to observe this condition will result in @@ -887,6 +889,7 @@ processing macros.

    19. COVERTITLE – frontispiece, title page, etc
    20. DOC_COVERTITLE – book cover, collated document cover, etc
    21. PDF_TITLE – window title for PDF viewers
    22. +
    23. TOC_HEADING – single, non-pagenumbered line of text in table of contents
    24. @@ -897,7 +900,7 @@ processing macros.
      -Macro: TITLE "<title string>" ["<2nd line>" ["<3rd line>" ... ] ] +Macro: TITLE [COVER | DOC_COVER] "<title string>" ["<2nd line>" ["<3rd line>" ... ] ]

      • Arguments must be enclosed in double-quotes @@ -932,6 +935,50 @@ should be the title of the opus, not “CHAPTER whatever”.

      +

      +If the optional argument, COVER or DOC_COVER, +is given to TITLE, the remaining string arguments represent the +title that will appear on cover or document cover pages (see the +Introduction to cover pages +for a description of the difference between “document +covers” and “covers”). Thus, it is possible +to have differing titles appear on the document cover, the cover +(“title”) page, and in the document header. For +example, +
      + + .TITLE DOC_COVER "Collected Essays" + .TITLE COVER "The Meming of Meaning" + .TITLE "LOL Cat Corruption" + .AUTHOR "D. Rawkins" + .DOC_COVER TITLE AUTHOR + .COVER TITLE + .START + +creates a document cover with “Collected Essays” and the +author, a cover page with “The Meming of Meaning”, +and a docheader title, “LOL Cat Corruption” at the top +of the essay. +

      + +

      +Alternatively, you can use the macros +DOC_COVERTITLE +and +COVERTITLE +to accomplish the same thing. +

      + +

      Table of Contents exceptions

      +

      +Except for standalone documents (i.e. non-collated documents such +as essays), the TITLE string appears as an entry in the Table of +Contents. If you would like a document section not to appear in the +Table of Contents (e.g. the copyright page), invoke the macro +.NO_TOC_ENTRY after .TITLE. +

      + +
      @@ -978,7 +1025,7 @@ the title of each article or entitled section), and appears

        -
      1. as the window title in PDF viewers (e.g., Okular or Evince)
      2. +
      3. as the window title in PDF viewers (e.g. Okular or Evince)
      4. in the initial rightmost position of page headers in the document
      @@ -1010,16 +1057,6 @@ and/or Doc covers.

      -
      -

      -Note: -If your -DOCTYPE -is CHAPTER, you don’t need DOCTITLE. TITLE takes care of -everything. -

      -
      -
      @@ -1096,7 +1133,7 @@ Macro: AUTHOR [COVER | DOC_COVER] "<autho

      -Each author string can hold as many names as you like, e.g., +Each author string can hold as many names as you like, e.g.
      .AUTHOR "Joe Blow" @@ -1207,9 +1244,9 @@ what it is with the CHAPTER_STRING macro, like this:

      -If you would like a blank chapter string, ie you’d like -the chapter number to appear without “Chapter” -beforehand, enter .CHAPTER_STRING "\&". +If you would like a blank chapter string, i.e., you’d like the +chapter number to appear without “Chapter” beforehand, +enter .CHAPTER_STRING "\&".

      @@ -1269,7 +1306,7 @@ page headers.

      The style of the chapter title can be altered by control macros, -e.g., CHAPTER_TITLE_FAMILY, CHAPTER_TITLE_FONT, etc. The default +e.g. CHAPTER_TITLE_FAMILY, CHAPTER_TITLE_FONT, etc. The default family, font and point size are Times Roman, Bold Italic, 4 points larger than running text. @@ -1300,7 +1337,7 @@ possible to do either

      -Mom prints the argument to .DRAFT (ie the draft number) +Mom prints the argument to .DRAFT (i.e. the draft number) beside the word “Draft” in the middle part of page headers.

      @@ -1474,7 +1511,7 @@ Macro: COPYRIGHT [COVER | DOC_COVER] "<co

      -The argument passed to COPYRIGHT is only used on cover or doc cover +The required argument to COPYRIGHT is only used on cover or doc cover pages, and then only if the argument COPYRIGHT is passed to COVER or @@ -1484,10 +1521,9 @@ COPYRIGHT; mom puts it in for you.

      -If the optional argument, COVER or DOC_COVER, -is given to COPYRIGHT, the string argument represents the copyright -information that will appear on cover or document cover pages (see -the +The optional argument, COVER or DOC_COVER, +should only be used if you have both a doc cover and a cover and want +differing copyright information on each (see the Introduction to cover pages for a description of the difference between “document covers” and “covers”). Thus, it is possible to @@ -1518,7 +1554,7 @@ or Style parameters for the copyright line may be entered as individual macros or grouped, -e.g., +e.g.
      .COPYRIGHT_FAMILY H @@ -1644,19 +1680,13 @@ Macro: DOC_COVERTITLE "<user defined docu

      The arguments passed to COVERTITLE or DOC_COVERTITLE are only used on cover or doc cover pages, and then only if the argument -COVERTITLE or DOC_COVERTITLE is passed to +COVERTITLE or DOC_COVERTITLE is explicitly +passed to COVER or DOC_COVER.

      -

      -The only time you require a COVERTITLE or DOC_COVERTITLE is when -none of the required first arguments to COVER or DOC_COVER fits -your needs for the title you want to appear on cover (or doc cover) -pages. -

      -

      COVERTITLE and DOC_COVERTITLE accept multiple arguments, each surrounded by double-quotes. Each argument is printed on a separate @@ -1664,15 +1694,22 @@ line, permitting you to create multi-line titles on your cover and/or doc cover pages.

      +

      +You only require COVERTITLE or DOC_COVERTITLE if they differ from +TITLE. Note that +TITLE +itself has two optional arguments that accomplish the same thing. +

      +

      PDF Title

      -Macro: PDF_TITLE "<pdf viewer window title>" +Macro: PDF_TITLE "<pdf viewer window title>"

      -• Arguments must be enclosed in double-quotes +• Argument must be enclosed in double-quotes

      @@ -1682,6 +1719,93 @@ mom does not, by default, provide PDF viewers with a document title. You may set one, if you like, with PDF_TITLE.

      +
      +

      TOC heading

      +
      + +
      +Macro: TOC_HEADING "<single line TOC heading>" +
      +

      +• Argument must be enclosed in double-quotes +

      + +

      +Mom generates tables of contents automatically (see +TOC). +You may sometimes want to insert a line of text into the table of +contents without it referring to a page number, for example to +identify a “Part I” and a “Part II.” +

      + +

      +Placed before any instance of +START, +TOC_HEADING inserts its text into the table of contents with a +modest amount of whitespace around it to distinguish it easily +from table of contents entries. +

      + +

      +The appearance of the heading may be controlled with +the macro +TOC_HEADING_STYLE. +

      + +
      +Macro: TOC_HEADING_STYLE "<arguments>" +
      + +

      +TOC_HEADING_STYLE controls the look of TOC headings. It is a +“grouping” +style macro with multiple arguments. It is recommended that +you use the backslash character to separate them into individual +lines rather than entering a single, very long line. +

      + +

      +TOC_HEADING_STYLE accepts as many or as few arguments as you need: + + FAMILY <family> \ + FONT <font> \ + SIZE <+|-n> \ + COLOR <colorname>* \ + QUAD L | C | R \ + SPACE_ABOVE <n>** \ + SPACE_BENEATH <n>** + +  * COLOR must be pre-initialized with +NEWCOLOR +or +XCOLOR. +
      +** SPACE_ABOVE and SPACE_BENEATH require a +unit of measure +to be appended to their numeric argument. +

      + +

      +For example, if you want your TOC headings to be bold, slightly +larger than the rest of the table of contents, centred, and with +one linespace beforehand, + + FONT B \ + SIZE +.5 \ + QUAD C \ + SPACE_ABOVE 1v + +

      + +

      + See +Arguments to the control macros +for further information about the arguments. Note that +SPACE_ABOVE and SPACE_BENEATH are unique to +TOC_HEADING_STYLE. + +

      +

      @@ -1698,7 +1822,7 @@ and revision information in the headers) or a final copy.

      Docstyle macros

        -
      • DOCTYPE +
      • DOCTYPE
      • PRINTSTYLE – non-optional macro required for document processing
        • Defaults for PRINTSTYLE TYPESET
        • @@ -1780,7 +1904,7 @@ the page header.

          NAMED takes an additional argument: a name for this -particular kind of document (e.g., outline, synopsis, abstract, +particular kind of document (e.g. outline, synopsis, abstract, memorandum), enclosed in double-quotes. NAMED is identical to DEFAULT except that mom prints the argument to NAMED beneath the @@ -1792,18 +1916,19 @@ for how mom outputs each part of the page header.)

          -

          +

          Note: version 2.1 change
          -DOCTYPE NAMED "string" no longer accepts a color argument -after "string". Setting the color of the string is now -done with DOCTYPE_COLOR <color>. Default -underscoring of "string" in the docheader and on covers -has been removed. Use DOCTYPE_UNDERLINE, -DOC_COVER_DOCTYPE_UNDERLINE and/or -COVER_DOCTYPE_UNDERLINE to re-enable it. All three -take the same arguments listed in the -Underline style, rule weight +DOCTYPE NAMED "string" no longer accepts a colour +argument after "string". Setting the colour +of the string is now done with DOCTYPE_COLOR +<color>. Default underscoring of +"string" in the docheader and on covers +has been removed. Use DOCTYPE_UNDERSCORE, +DOC_COVER_DOCTYPE_UNDERSCORE and/or +COVER_DOCTYPE_UNDERSCORE to re-enable it. All three take +the same arguments listed in the +Underscore style, rule weight section of Arguments to the control macros.

          @@ -1896,7 +2021,7 @@ numbered, the slide number must be given to one of the header/footer parts with the inline escape
          -\*[SLIDE#]. For example: +\*[SLIDE#]. For example: HEADER "" "My slide presentation" "" \ FOOTER "" "" "\*[SLIDE#]" @@ -1938,11 +2063,11 @@ black and two points larger, this is how you’d do it:

          Note: Do not use mom’s -\*[SIZE ±n] -inline escape to change point size in the strings passed to HEADER -or FOOTER. Prefer either mom’s \*S[±n] or -groff's \s[±n]. - +\*[SIZE ±n] +inline escape to change point size in the strings +passed to HEADER or FOOTER. Prefer either mom’s +\*S[±n] or groff’s +\s[±n].

          @@ -1955,12 +2080,12 @@ each with a choice of configurable parameters. Modes include Box, Blinds, Wipe, Fade, and several others. Parameters include things like duration, dimension, and direction. There are a total of twelve modes; for each one there are from one to six configurable -parameters. Consult man gropdf(1) for a complete listing +parameters. Consult man gropdf(1) for a complete listing of modes and parameters.

          -If you pass SLIDES the TRANSTION argument, you must +If you pass SLIDES the TRANSITION argument, you must at a minimum follow it with a mode. Afterwards, you may give as many or as few parameters as you wish. Parameters are, in order, @@ -1971,13 +2096,13 @@ many or as few parameters as you wish. Parameters are, in order, 5. scale 6. bool -You don't have to fill them all out. If you only need the first -three, that's all you need to input. If you need the first and -third, enter the second as a period (dot), which is used any time -you want to leave a parameter at its current default or when it -isn’t applicable. For example, if you want a Box transition -that lasts 1 second, filling the screen from the centre outwards, -you'd enter +You don’t have to fill them all out. If you only need the +first three, that’s all you need to input. If you need the +first and third, enter the second as a period (dot), which is used +any time you want to leave a parameter at its current default or +when it isn’t applicable. For example, if you want a Box +transition that lasts 1 second, filling the screen from the centre +outwards, you’d enter TRANSITION "Box 1 . O" @@ -1997,7 +2122,6 @@ Not all PDF viewers support all modes. Any that are not supported are replaced by the “R” mode, which simply replaces one slide with the next unless the PDF viewer has a different default transition mode. -

      @@ -2025,7 +2149,7 @@ Macro: NEWSLIDE ["<transition mode and paramet Unless you want material from one slide to flow onto the next, you need to tell mom when to start a new slide with the macro NEWSLIDE. Without any arguments, the new slide will appear with the default -TRANSTION you gave to DOCTYPE SLIDES. +TRANSITION you gave to DOCTYPE SLIDES.

      @@ -2111,13 +2235,12 @@ page with a nasty message.

      Just as important: -PRINTSTYLE must precede any and all page and style +PRINTSTYLE must precede any and all page and style parameters associated with a document with the exception of -PAPER, PAGEWIDTH, and/or -PAGELENGTH, which should be placed at the top of your -file. PRINTSTYLE sets up complete templates that include default -margins, family, fonts, point sizes, and so on. Therefore, changes -to any aspect of document style must come afterwards. For example, +PAPER, which should be placed at the top of your file. +PRINTSTYLE sets up complete templates that include default margins, +family, fonts, point sizes, and so on. Therefore, changes to any +aspect of document style must come afterwards. For example,
      .PAPER A4 @@ -2166,7 +2289,7 @@ are (mostly) ignored. An important exception is point size of headers/footers should they become too crowded. Most of mom’s inlines affecting the appearance of type are also ignored -(\*S[<size>] +(\*S[<size>] is an exception; there may be a few others).

      @@ -2239,8 +2362,8 @@ If, for some reason, you would prefer the output of

      If you’d prefer a monospace family -for PRINTSTYLE TYPEWRITE other than than mom's default, -Courier, you can change it with +for PRINTSTYLE TYPEWRITE other than mom’s +default, Courier, you can change it with .TYPEWRITER_FAMILY <family> (or .TYPEWRITER_FAM). Since groff ships with only the Courier family, you will have to install any other monospace family @@ -2253,7 +2376,7 @@ groff.

      If you’d like a smaller or larger point size for -for PRINTSTYLE TYPEWRITE (mom’s default is 12-point), +PRINTSTYLE TYPEWRITE (mom’s default is 12-point), you can change it with .TYPEWRITER_SIZE <size>. There’s no need to add a @@ -2269,14 +2392,17 @@ for double-spaced, and 12-point for single-spaced.

      In PRINTSTYLE TYPEWRITE, mom, by default, underlines anything that looks like italics. This includes the -\*[SLANT] +\*[SLANT] inline escape -for pseudo-italics. +for pseudo-italics. (See +UNDERLINE +for a note on how to process TYPEWRITE files that underline +italics.)

      If you’d prefer that mom were less bloody-minded -about pretending to be a typewriter (ie you’d like italics and +about pretending to be a typewriter (i.e., you’d like italics and pseudo-italics to come out as italics), use the control macros
      @@ -2314,19 +2440,28 @@ To turn underlining of quotes back on, use UNDERLINE_QUOTES without an argument.

      -

      +

      While most of the control macros -have no effect on PRINTSTYLE TYPEWRITE, there +have no effect on PRINTSTYLE TYPEWRITE, there is an important exception: HEADER_SIZE (and by extension, FOOTER_SIZE). This is particularly useful for reducing the point size of headers/footers should they become crowded (quite likely to happen if the title of your document is long and your -COPYSTYLE -is DRAFT). +COPYSTYLE +is DRAFT). +

      + +

      +Finally, note that colour is disabled for TYPEWRITE. If +you would like it enabled, for example so PDF links are colourised, +invoke the groff +primitive +'.color' after PRINTSTYLE.

      +
      @@ -2445,7 +2580,7 @@ Macro: START

      START takes no arguments. It simply instructs mom to begin document -processing. If you don’t want document processing (ie you +processing. If you don’t want document processing (i.e., you only want the typesetting macros), don’t use START. @@ -2476,7 +2611,7 @@ and justification style.

      -Two additional style concerns have to be addressed here (ie in +Two additional style concerns have to be addressed here (i.e. in macros before START): changes to the @@ -2489,19 +2624,19 @@ adjusted to fill pages fully to the bottom margin.

      Type & formatting parameters before START

      @@ -2569,10 +2704,10 @@ below have the following meanings: L_MARGIN Left margin of pages, including headers/footers R_MARGIN Right margin of pages, including headers/footers - T_MARGIN The point at which running text (ie not + T_MARGIN The point at which running text (i.e. not headers/footers or page numbers) starts on each page - B_MARGIN* The point at which running text (ie not + B_MARGIN* The point at which running text (i.e. not (see note) headers/footers or page numbers) ends on each page PAGE If you use PAGE, its final four arguments have the @@ -2584,7 +2719,7 @@ below have the following meanings: FAMILY The family of all type in the document PT_SIZE The point size of type in paragraphs; mom uses this to calculate automatic point size changes - (e.g., for heads, footnotes, quotes, headers, etc) + (e.g. for heads, footnotes, quotes, headers, etc) LS/AUTOLEAD** The leading used in paragraphs; all leading and spacing of running text is calculated from this @@ -2603,9 +2738,13 @@ below have the following meanings:

      Other macros that deal with type style, or refinements thereof -(KERN, LIGATURES, HY, WS, SS, etc.), behave normally. -It is not recommended that you set up tabs or indents prior to -START. +(KERN, +LIGATURES, +HY, +WS, +SS, +etc.), behave normally. It is not recommended that you set up tabs +or indents prior to START.

      @@ -2613,7 +2752,7 @@ If you want to change any of the basic parameters (above) after START and have them affect a document globally (as if you’d entered them before START), you must use the macros listed in -Changing document-wide style parameters after START. +Changing document-wide typesetting parameters after START.

      Special note on LEFT, RIGHT and CENTER prior to START

      @@ -2624,8 +2763,12 @@ when invoked prior to START.

      -All mom’s document element tags (PP, HEAD, BLOCKQUOTE, -FOOTNOTE, etc.) except +All mom’s document element tags +(PP, +HEADING, +BLOCKQUOTE, +FOOTNOTE, +etc.) except QUOTE set a fill mode @@ -2646,9 +2789,10 @@ or .CENTER immediately after every invocation of the tag.

      If you routinely make the same changes to mom’s defaults in order to create similar documents in a similar style—in other -words, you need a template— you can create style-sheet files -and include, or "source", them into your mom documents with the -macro INCLUDE. The right place for such style sheets is after +words, you need a template— you can create stylesheet files +and include, or “source”, them into your mom documents +with the macro .INCLUDE. The right place for such style +sheets is after PRINTSTYLE and before START. @@ -2656,10 +2800,10 @@ and before

      Say, for example, in a particular kind of document, you always -want main heads set in Helvetica Bold Italic, flush left, -with no underscore. You’d create a file, let’s call it -head-template, in which you’d place the pertinent HEAD -control macros. +want main heads set in Helvetica Bold Italic, flush left, with +no underscore. You’d create a file, let’s call it +head-template, in which you’d place the pertinent +HEADIING control macros.
      .HEADING_STYLE 1 \ @@ -2691,7 +2835,7 @@ you’re working, you simply enter the filename after .INCLUDE. If the file’s in another directory, you must provide a full path name to it. For example, if you’re working in a directory called /home/joe/stories and your -style-sheet is in /home/joe/style-sheets, the above +stylesheet is in /home/joe/stylesheets, the above example would have to look like this:
      @@ -2699,7 +2843,7 @@ example would have to look like this: .AUTHOR "Joe Blow .PRINTSTYLE TYPESET \# - .INCLUDE /home/joe/style-sheets/head-template + .INCLUDE /home/joe/stylesheets/head-template \# .START @@ -2716,9 +2860,18 @@ well.

      -Experts: -INCLUDE is an alias for the groff request, .so. Mix 'n' -match with impunity. +Note: +INCLUDE is an alias for the groff request .so. If the +sourced file contains material that requires pre-processing (e.g. +a table made with tbl(1) or non-English characters), use +.so rather than INCLUDE and invoke pdfmom thus: +
      + + soelim file.mom | pdfmom [flags] > file.pdf + +soelim only looks for lines that begin with .so, +which furthermore must not have any space between the period and +the “s”.

      @@ -2743,15 +2896,24 @@ The macro COLOR and the inline escape, -\*[<colorname>] +\*[<colorname>] can be used at any time during document processing for occasional -colour effects. However, consistent and reliable colourizing of +colour effects. However, consistent and reliable colourising of various document elements (the docheader, heads, linebreaks, footnotes, pagenumbers, and so on) must be managed through the use of the document element control macros.

      +

      +Please note that colour is disabled if your +PRINTSTYLE +is TYPEWRITE. If you would like it enabled, for example +so PDF links are colourised, invoke the groff +primitive +'.color' after PRINTSTYLE. +

      +

      Note: @@ -2759,7 +2921,7 @@ If you plan to have mom generate a table of contents, do not embed colour inline escapes -(\*[<colorname>]) +(\*[<colourname>]) in the string arguments given to any of the @@ -2768,7 +2930,7 @@ nor in the string arguments given to HEADING. Use, rather, the control macros -mom provides to automatically colourize these elements. +mom provides to automatically colourise these elements.

      @@ -2811,7 +2973,7 @@ that fit on the page coincides perfectly with the bottom margin of In most instances, the difference between the requested lead and the adjusted lead is unnoticeable, and since in almost all cases adjusted leading is what you want, it’s mom’s default -and you don't have to invoke it explicitly. +and you don’t have to invoke it explicitly.

      @@ -2828,7 +2990,7 @@ If you set the document leading prior to START with LS or AUTOLEAD, -DOC_LEAD_ADJUST OFF must come afterwards, like +.DOC_LEAD_ADJUST OFF must come afterwards, like this:
      @@ -2914,10 +3076,10 @@ argument. .DOCHEADER OFF 1.5i -This starts the document 1.5 inches from the top of the page PLUS +This starts the document 1.5 inches from the top of the page plus whatever spacing adjustment mom has to make in order to ensure that the first baseline of running text falls on a “valid” -baseline (ie one that ensures that the bottom margin of the first +baseline (i.e., one that ensures that the bottom margin of the first page falls where it should). The distance is measured from the top edge of the paper to the baseline @@ -2925,14 +3087,14 @@ of the first line of type.

      -With DOCHEADER OFF, it is possible to create your own +With .DOCHEADER OFF, it is possible to create your own custom docheaders (after START) using mom’s typesetting macros. It is recommended that if you do create a custom docheader, you make .SHIM the last macro before the first item of your document (for -example, PP or HEADING 1. +example, .PP or .HEADING 1.

      @@ -2997,7 +3159,7 @@ Chapter Title bold italic, 4 points larger than running text The family is the prevailing family of the whole document. Title, subtitle, -author and document type are what you supply with the +author, and document type are what you supply with the reference macros. Any you leave out will not appear; mom will compensate:

      @@ -3021,10 +3183,10 @@ the space with

      With the docheader control macros, you can change the family, -colour, leading and quad direction of the entire docheader. You can +colour, leading, and quad direction of the entire docheader. You can also set the style parameters for each part individually. Style parameters include family, font, size, colour, lead, space before, -caps, smallcaps and underscoring. +caps, smallcaps, and underscoring.

        @@ -3091,7 +3253,7 @@ to place them where you want.

        By default, mom centres the docheader. If you’d prefer to have your docheaders set flush left or right, or need to restore -the default centreing, invoke .DOCHEADER_QUAD with the +the default centering, invoke .DOCHEADER_QUAD with the quad direction you want, either LEFT (or L), RIGHT (or R) or CENTER (or C). @@ -3125,13 +3287,13 @@ Please note that if you use DOCHEADER_FAMILY, you can still alter the family of individual parts of the docheader.

        -
        Change the color of the entire docheader
        +
        Change the colour of the entire docheader

        -The default color for docheaders is black, as you’d expect. +The default colour for docheaders is black, as you’d expect. If you wish to change it, use -.DOCHEADER_COLOR <color>, where - <color> is a color pre-initialized with +.DOCHEADER_COLOR <colour>, where + <colour> is a colour pre-initialized with XCOLOR or NEWCOLOR. @@ -3156,10 +3318,10 @@ by which to make the adjustment. Whenever you want to change the style parameters for any part of the docheader, simply join the name of the part to the parameter you wish to change using an underscore, then supply any necessary -arguments. The subitle double-underlined? No problem. +arguments. The subtitle double-underlined? No problem.
        - .SUBTITLE_UNDERLINE DOUBLE + .SUBTITLE_UNDERSCORE DOUBLE Author in red?
        @@ -3200,7 +3362,7 @@ as the name for the string passed to DOCTYPE NAMED "string".

        _COLOR
        Takes the same argument as COLOR. - Colors should be pre-initialized with + Colours should be pre-initialized with XCOLOR or NEWCOLOR. @@ -3340,7 +3502,7 @@ appears.

        -If the optional argument, COVER or DOC_COVER, +If the optional argument COVER or DOC_COVER is given to ATTRIBUTE_STRING, the string argument represents the attribution string that will appear on cover or document cover pages (see the @@ -3378,7 +3540,7 @@ arguments, is sufficient.

        Setting documents in columns is easy with mom. All you have to do -is is say how many columns you want and how much space you want +is say how many columns you want and how much space you want between them (the gutters). That’s it. Mom takes care of everything else, from soup to @@ -3663,7 +3825,8 @@ in document processing. Additionally, see if you encounter the problem of trying to get mom to put space at the tops of pages after the first.)

        -
        + +
        MACRO EFFECT DURING DOCUMENT PROCESSING ----- --------------------------------- @@ -3732,7 +3895,7 @@ the tops of pages after the first.) AUTOLEAD •Invoked before START, sets the overall document leading as a function of the overall document - point size (ie the point size used in paragraphs); + point size (i.e. the point size used in paragraphs); subsequently disabled after START, except for calls to DOC_PT_SIZE @@ -3742,7 +3905,7 @@ the tops of pages after the first.) •Invoked after START, remains in effect for all subsequent point size changes made with PT_SIZE, but does not affect the leading of the document - element tags (e.g., HEADING, PP, QUOTE...), or calls + element tags (e.g. HEADING, PP, QUOTE...), or calls to DOC_PT_SIZE QUAD •Changes quad for the duration of the @@ -3832,7 +3995,7 @@ If your DOCTYPE is DEFAULT, CHAPTER, NAMED, or LETTER, ADD_SPACE takes as its single argument the distance you want mom to advance from the normal -baseline position at the top of any page after the first (ie +baseline position at the top of any page after the first (i.e. the one on which the docheader is normally printed). A unit of measure is required. @@ -3889,7 +4052,7 @@ RESTORE_SPACE before issuing the spacing command. -

        Changing document-wide style parameters after START

        +

        Changing document-wide typesetting parameters after START

        In the normal course of things, you establish the basic type style @@ -3958,7 +4121,7 @@ Macro: DOC_LEFT_MARGIN <left margin>

      • any document elements that use a left indent calculate the indent from the new value
      • -
      • the line length remains the same (ie the right margin +
      • the line length remains the same (i.e., the right margin shifts when you change the left margin)
      @@ -4048,7 +4211,7 @@ Macro: DOC_FAMILY <family>
    25. endnotes pages
    26. table of contents
    27. -
    28. any page elements (e.g., headers page numbers, footnotes) whose +
    29. any page elements (e.g. headers page numbers, footnotes) whose families you wish to remain at their old values must be reset with the appropriate control macros @@ -4175,7 +4338,7 @@ You need do nothing special to terminate a document. When groff finishes processing the last input line of a file, the page is ejected, subject to whatever routines are -needed to complete it (e.g., printing footnotes or adding the page +needed to complete it (e.g. printing footnotes or adding the page number).

      @@ -4189,7 +4352,7 @@ page at the end of the formatted document.

      The situation is rare, generally occurring only when some additional -macro is required after the input text, e.g., to exit a +macro is required after the input text, e.g. to exit a list or terminate a quote. @@ -4234,7 +4397,7 @@ text, not any macros following.

      Note: -\*[B] +\*[B] cannot be used as a replacement for .EL when terminating a document.

      diff --git a/contrib/mom/momdoc/goodies.html b/contrib/mom/momdoc/goodies.html index 24c1a27..7c39e14 100644 --- a/contrib/mom/momdoc/goodies.html +++ b/contrib/mom/momdoc/goodies.html @@ -2,7 +2,7 @@
      -

      Suspend/re-invoke traps

      +

      Suspend / re-invoke traps

      @@ -313,7 +307,7 @@ happens, surround just the offending macros and input lines with ... .TRAP -TRAP is a toggle, therefore any argument turns it off (ie suspends +TRAP is a toggle, therefore any argument turns it off (i.e., suspends the trap), and no argument turns it (back) on.

      @@ -345,7 +339,7 @@ quoting styles.)

      Typographically, there is a difference between the inch-mark and -quotation marks—a BIG difference. Sadly, typewriters and computer +quotation marks—a big difference. Sadly, typewriters and computer keyboards supply only one: the inch-mark. While using inches for doublequotes is, and always has been, acceptable in typewriter-style copy, it has never been, and, God willing, never will be acceptable in @@ -359,7 +353,7 @@ And you don’t want to look like an amateur, do you? If you invoke SMARTQUOTES with one of the optional arguments (,, or >> or <<) you can use -" (ie the inch-mark/doublequotes key) +" (i.e. the inch-mark/doublequotes key) as “cheap” open-and close-quotes when inputting text in a language other than English, and have mom convert them, on output, into the chosen open-and close-quote style. @@ -414,16 +408,16 @@ output the correct quotes.

      Turn SMARTQUOTES off by passing it any argument not in the argument -list (e.g. OFF, QUIT, X, etc.) +list (e.g. OFF, QUIT, X, etc)

      If you’re using the document processing macros with -PRINTSTYLE TYPESET, -SMARTQUOTES is on by default (in the Anglo-American style); with -PRINTSTYLE TYPEWRITE, +PRINTSTYLE TYPESET, +smartquotes are on by default (in the Anglo-American style); with +PRINTSTYLE TYPEWRITE, it’s off by default (and should probably stay that way).

      @@ -432,7 +426,7 @@ Finally, if you’re fussy about the kerning of quote marks in relation to the text they surround, or have special quoting needs, you have to enter quote marks by hand using groff’s native inline escapes -for special characters (see man groff-char +for special characters (see man groff-char for a complete list of special characters). Entering quote marks this way allows you to use mom’s inline kerning escapes @@ -461,8 +455,8 @@ single quotes: Whether or not you have SMARTQUOTES turned on, get into the habit of entering the foot-and inch-marks, when you need them, with the inline escapes -\*[FOOT] and -\*[INCH], instead of +\*[FOOT] and +\*[INCH], instead of ' and ".

      @@ -482,8 +476,8 @@ CAPS converts all lower case letters to upper case. Primarily, it’s a support macro used by the document processing macros, but you may find it helpful on occasion. CAPS is a toggle, therefore -no argument turns it on, any argument (OFF, QUIT, X, etc.) turns -it off. +no argument turns it on, any argument (OFF, +QUIT, X, etc) turns it off.
      .CAPS @@ -498,7 +492,7 @@ produces, on output If you wish to capitalise a section of type inline, use the inline escapes, -\*[UC]...\*[LC] +\*[UC]...\*[LC] like this:
      @@ -524,6 +518,21 @@ not \*[UC]All work and no play makes Jack a dull boy\*[LC]. +Conversely, an initial period must come before +\*[UC], or be preceded by \&, like this: +
      + + .\*[UC]start\*[LC] is used to begin document processing. + +or + + \*[UC]\&.start\*[LC] is used to begin document processing. + +Upon output, either will produce +
      + + START is used to begin document processing. +

      @@ -555,7 +564,7 @@ this: Once a string is defined, you can call it any time with the inline escape -\*[<stringname>]. Using the example +\*[<name>]. Using the example string above
      @@ -588,8 +597,8 @@ in order to avoid spaces you can’t see, like this

      Experts: -STRING is an alias for -ds. You can use either, or mix 'n' match with impunity. +STRING is an alias for ds. You can use either, or mix +’n’ match with impunity.

      @@ -634,7 +643,7 @@ escape character to its default.

      Experts: -ESC_CHAR is an alias of .ec. Mix 'n' match +ESC_CHAR is an alias of .ec. Mix ’n’ match the two with impunity.

      @@ -658,8 +667,10 @@ or depth of type at the current point size, invoke .SIZESPECS, which takes no argument. The dimensions are stored in the string registers -\*[$CAP_HEIGHT], \*[$X_HEIGHT] and -\*[$DESCENDER], respectively, in +\*[$CAP_HEIGHT], +\*[$X_HEIGHT], +and +\*[$DESCENDER], respectively, in machine units to which the unit of measure, @@ -685,11 +696,11 @@ would do the trick.
    30. -Macro: UNDERSCORE [ <distance below baseline> ] "<string>" +Macro: UNDERSCORE [ <distance below baseline> ] [ PREFIX <prefix> ] [ SUFFIX <suffix> ] "<string>"

      -• Optional argument requires a unit of measure +• <distance below baseline> requires a unit of measure

      @@ -699,7 +710,7 @@ required The string must be enclosed in double-quotes, like this:
      - .UNDERSCORE "Unmonitored monopolies breed high prices and poor products."  + .UNDERSCORE "Unmonitored monopolies breed high prices and poor products" If you wish to change the distance of the rule from the baseline, use the optional argument @@ -707,12 +718,33 @@ use the optional argument (with a unit of measure).
      - .UNDERSCORE 3p "Unmonitored monopolies breed high prices and poor products."  + .UNDERSCORE 3p "Unmonitored monopolies breed high prices and poor products" -The above places upper edge of the underscore 3 points below the +The above places the upper edge of the underscore 3 points below the baseline.

      +
      +

      +Tip: +UNDERSCORE can also be used for strikethrough effects by supplying a +negative value to the distance argument. +

      +
      + +

      +PREFIX and SUFFIX allow you to add +non-underscored punctuation (or other glyphs) to the beginning +and/or end of the underscored string. If the argument to either +PREFIX or SUFFIX contains spaces, surround the +argument with double-quotes. For example, the following underscores +the text string but not the surrounding punctuation. +
      + + .UNDERSCORE PREFIX ( SUFFIX .) "Unmonitored monopolies breed high prices and poor products" + +

      +

      Note: @@ -766,14 +798,14 @@ UNDERSCORE_WEIGHT also sets the weight of

      -

      Colorizing underscored text

      +

      Colourising underscored text

      If you want underscored text to be in a different colour from the text around it, use the COLOR -macro, rather than the -inline escape for changing color. -In other words, assuming your prevailing text color is black and +macro rather than the +inline escape for changing colour. +In other words, assuming your prevailing text colour is black and you want underscored text in red
      @@ -786,9 +818,10 @@ rather than .UNDERSCORE "\*[red]text to underscore\*[black]" -The latter will render the text in red, and the underscore in black. -You can use this to create truly rainbow effects if you want, e.g. -text in red, underscore in blue, and prevailing type in black: +The latter will render the text in red but the underscore in black. +You can, of course, use this to create rainbow effects if that's +what you want, e.g. text in red, underscore in blue, and prevailing +type in black:
      .UNDERSCORE "\*[red]text to underscore\*[blue]" @@ -803,11 +836,14 @@ text in red, underscore in blue, and prevailing type in black:

    -Macro: UNDERSCORE2 [ <distance below baseline> [ <distance between rules> ] ] "<string>" +Macro: UNDERSCORE2 [ <distance below baseline> [ <distance between rules> ] [ PREFIX <prefix> ] [ SUFFIX <suffix> ] "<string>"

    -• Optional arguments require a unit of measure +• <distance below baseline> +and +<distance between rules> +require a unit of measure

    @@ -817,7 +853,7 @@ the required The string must be enclosed in double-quotes, like this:
    - .UNDERSCORE2 "Unmonitored monopolies breed high prices and poor products." + .UNDERSCORE2 "Unmonitored monopolies breed high prices and poor products" The default distance between the two rules is 2 points, measured from the bottom edge of the upper rule to the top edge of the lower @@ -829,10 +865,10 @@ If you wish to change the distance of the double underscore from the baseline, use the optional argument <distance below baseline> -(with a unit of measure), e.g., +(with a unit of measure), e.g.
    - .UNDERSCORE2 3p "Unmonitored monopolies breed high prices and poor products." + .UNDERSCORE2 3p "Unmonitored monopolies breed high prices and poor products" which places the upper edge of the first rule of the double underscore 3 points below the baseline. @@ -842,19 +878,37 @@ underscore 3 points below the baseline. If you wish to change the distance between the two rules as well, use the second optional argument <distance between rules> -(with a unit of measure). Be aware that you must give a value for -the first optional argument if you want to use the second. The -distance between the two rules is measured from the bottom edge of -the upper rule to the top edge of the lower one. +(with a unit of measure). The distance between the two rules +is measured from the bottom edge of the upper rule to the top +edge of the lower one. Be aware that you must give a value for +<distance below baseline> if you want to +use <distance between rules>.

    +PREFIX and SUFFIX allow you to add +non-underscored punctuation (or other glyphs) to the beginning +and/or end of the double-underscored string. If the argument to +either PREFIX or SUFFIX contains spaces, +surround the argument with double-quotes. For example, the +following double-underscores the text string but not the surrounding +punctuation. +
    + + .UNDERSCORE2 PREFIX ( SUFFIX .) "Unmonitored monopolies breed high prices and poor products" + The weight (thickness) of double underscores may be controlled with the macro UNDERSCORE_WEIGHT (q.v).

    +

    +See +here +for advice on colourising double-underscored text. +

    +

    Note: @@ -884,22 +938,38 @@ Macro: UNDERLINE toggle The distinction between underscoring and underlining is that underscoring is suitable for occasional effects (a word here, a phrase there), whereas underlining underlines whole passages -of type. Furthermore, you cannot colorize underlining, and -there’s a special macro -UNDERLINE_SPECS +of type. Furthermore, you cannot colourise underlining. +There’s a special macro, +UNDERLINE_SPECS, to control the weight and distance from the baseline of the -underline. Lastly, files that use UNDERLINE must be processed with +underline. +

    + +

    +Lastly, files that use UNDERLINE must be processed with
    pdfmom -Tps filename.mom | ps2pdf - filename.pdf -since groff's native pdf driver does not recognize UNDERLINE. +since groff’s pdf driver does not recognize UNDERLINE. +

    + +

    +Note that +PRINTSTYLE TYPEWRITE +uses UNDERLINE to underline italics +and pseudo-italics (SLANT) +by default. The default may be changed (see +Underlining of italics) +but if it's what you want, you must process your document as shown +above.

    -UNDERLINE is a toggle macro, therefore you invoke it by itself (ie +UNDERLINE is a toggle macro, therefore you invoke it by itself (i.e. with no argument) to initiate underlining, and with any argument -(OFF, QUIT, X, etc) to turn it off. +(OFF, QUIT, END, X, etc) +to turn it off.

    @@ -908,13 +978,13 @@ with no argument) to initiate underlining, and with any argument Underlining may also be turned on and off inline with the escapes -\*[UL]...\*[ULX]. +\*[UL]...\*[ULX].

    Additional note: In document processing, neither .UNDERLINE nor -\*[UL] persist past the current document element tag. +\*[UL] persist past the current document element tag. For example, if you turn underlining on in a paragraph (.PP), your next paragraph will not be underlined. @@ -945,8 +1015,8 @@ mom’s default is 1-1/4 points (1.25p). The macro pair, .UNDERLINE / .UNDERLINE OFF, and the inline escapes, -\*[UL] / \*[ULX], are functionally identical, -hence, in +\*[UL] / \*[ULX], are +functionally identical, hence, in fill modes
    @@ -1044,7 +1114,7 @@ The following uses the Date/Signature example, above, but adds rules into the whitespace through the use of string tabs and mom’s inline escape -\*[RULE]. +\*[RULE].
    .LL 30P @@ -1161,7 +1231,7 @@ Whenever you want to fill a line or tab with leaders, use the inline escape -\*[LEADER]. The remainder of the line or +\*[LEADER]. The remainder of the line or tab will be filled with the leader character. Mom’s default leader character is a period (dot), but you can change it to any character you like with @@ -1221,7 +1291,7 @@ LEADER_CHARACTER takes one argument: a single character you would like to be used for leaders. (See -\*[LEADER] +\*[LEADER] for an explanation of how to fill lines with leaders.)

    @@ -1316,18 +1386,32 @@ When using the PP, DROPCAP only works

    -
      -
    • with initial paragraphs (ie at the start of the document, +
        +
      • with initial paragraphs (i.e. at the start of the document, or after - HEAD),
      • + HEADING),
      • when .DROPCAP comes immediately after .PP,
      • the PRINTSTYLE is TYPESET.
      -

      +

      If these conditions aren’t met, DROPCAP is silently ignored.

      + +

      +Additional note: +If you have dropcaps after +HEADINGs, +you must increase the NEEDS argument to +HEADING_STYLE +to match the number of dropcap lines. For example, assuming +dropcaps that are three lines tall: +
      + + .HEADING_STYLE 1 NEEDS 3 + +

    @@ -1451,9 +1535,10 @@ Inlines: \*[SUP]...\*[SUPX]

    Superscripts are accomplished inline. -Whenever you need one, typically for numerals, all you need to do is -surround the superscript with the inlines above. \*[SUP] -begins superscripting; \*[SUPX] turns it off. +Whenever you need one, typically for numerals, all you need +to do is surround the superscript with the inlines above. +\*[SUP] begins superscripting; +\*[SUPX] turns it off.

    @@ -1464,8 +1549,8 @@ or and you want your superscripts to be equivalently pseudo-condensed or -extended, use
    -\*[CONDSUP]...\*[CONDSUPX] or -\*[EXTSUP]...\*[EXTSUPX]. +\*[CONDSUP]...\*[CONDSUPX] or +\*[EXTSUP]...\*[EXTSUPX].

    @@ -1528,8 +1613,9 @@ left-quadded

    -Whenever you want to centre a block of type on the page, surround it with -.CENTER_BLOCK/.CENTER_BLOCK OFF (or QUIT, X, etc.). +Whenever you want to centre a block of type on the page, surround it +with .CENTER_BLOCK/.CENTER_BLOCK OFF (or QUIT, +X, etc).

    @@ -1537,67 +1623,149 @@ Whenever you want to centre a block of type on the page, surround it with

    -Macro: LEFT_HANG <character> +Macro: LEFT_HANG <character> [ <gutter> ]
    +

    +• left-hung characters +

    Inline: \*[HANG <character>]
    +

    +• right-hung characters +

    +

    +Hung characters, frequently punctuation, fall outside the left or +right margin. Their purpose is usually to fine-tune justification. +Consider the following: +

    + + + + + + + + +
    +“Play the man, Master Ridley; we +shall this day light such a candle, +by God's grace, in England, as I +trust shall never be put out.” + +   + +“ +
    +
    +
    +
    +
    +Play the man, Master Ridley; we +shall this day light such a candle, +by God's grace, in England, as I +trust shall never be put out.”

    -LEFT_HANG hangs its argument to the left of the left margin. -If enclosed in double-quotes, the argument may contain local -horizontal motions. +In the right hand example, the opening double-quote hangs outside +the left margin, creating a uniform left margin for the text.

    +

    Left hung characters

    +

    -Input text after LEFT_HANG must begin by repeating the text of the -argument, including horizontal motions. If the hung character is -a left double-quote, \[lq] must be used in the argument -and the usual keyboard double-quote (") used for the -input text so as not to confuse SMARTQUOTES. +LEFT_HANG hangs its first argument, the character to be hung, to +the left of the left margin. The optional second argument lets you +specify an amount of space to insert between the hung character and +the text.

    +Input text after LEFT_HANG must begin with the character to be hung +PLUS a +horizontal motion +corresponding to <gutter> if one was given. +If the hung character is a left double-quote, \[lq] +must be used as the argument to LEFT_HANG and the usual keyboard +double-quote (") entered as the input text so as not to +confuse +SMARTQUOTES The following example demonstrates: -
    +
    - .LEFT_HANG "\[lq]\*[FU3]" - "\*[FU3]This line will have its opening double-quote - plus three kern units of space hung outside the - left margin." + .LEFT_HANG \[lq] 1p + "\*[FWD 1p]This line will have its opening double-quote + plus one point of space hung outside the left margin."

    -The \*[HANG] inline escape hangs its single-character -argument, typically a punctuation mark, outside the right margin of -justified copy, like this: -
    - - This line will have its closing period hung outside - the right margin\*[HANG .] - -For the exceptionally fussy, \*[HANG] may also be used -with centred text to centre the text visually without taking the -hung punctuation into account. +Note that what follows LEFT_HANG must be an input line and therefore +it cannot be used to left-hang a +HEADING +character. +

    + +
    +

    +Important: +Versions of mom lower than 2.5_a that included LEFT_HANG required +that the character and its gutter be entered as a single, +concatenated argument, using horizontal motions to establish the +gutter +(e.g. +FWD, +BCK). +Documents created with versions prior to 2.5_a may have to be +updated.

    +
    + +

    Right hung characters

    +The \*[HANG c] inline escape hangs its argument outside +the right margin of justified or quad right copy. The argument may +be a single character, or a single character preceded by a +horizontal motion, effectively establishing a gutter between the +right margin and the hung character: +
    + + This line will have its closing period hung outside + the right margin with a one point gutter\*[HANG \*[FWD 1p].] + If the hung character is a right double-quote, "\[rq]" -must be used as the argument (that is, the \[rq] character surrounded -by double-quotes). The double-quotes are required for all special -characters of the form \[xx]. +must be used as the argument (that is, the \[rq] +character surrounded by double-quotes). The double-quotes are +required for all special characters of the form +\[name]. +Horizontal motion, if any, must fall inside the double-quotes: +
    + + ...and they all lived happily ever after.\*[HANG "\*[FWD 1p]\[rq]"] +

    -If the hung character is a hyphen, \*[HANG -] must -come at the end of an +If the hung character is a hyphen, +\*[HANG -] +must come at the end of an input line. -All other characters may be used mid-line if groff breaks the line -naturally at the point the hung character is introduced. +This restriction does not apply to other characters, which may come +anywhere in an input line provided that, on output, the line breaks +at the point you introduced the hung character.

    + +

    +For the exceptionally fussy, \*[HANG] may also be used to +improve visual centring; when text is centred, \*[HANG c] +hangs the character to the right of the centred line instead of the +margin. +

    +

    diff --git a/contrib/mom/momdoc/graphical.html b/contrib/mom/momdoc/graphical.html index ae8c6ea..0f373b7 100644 --- a/contrib/mom/momdoc/graphical.html +++ b/contrib/mom/momdoc/graphical.html @@ -2,7 +2,7 @@ diff --git a/contrib/mom/momdoc/images.html b/contrib/mom/momdoc/images.html index 15ecbd7..dc1837f 100644 --- a/contrib/mom/momdoc/images.html +++ b/contrib/mom/momdoc/images.html @@ -2,7 +2,7 @@ +

    PDF_IMAGE

    -Macro: PDF_IMAGE [ -L | -C | -R | -I <indent> ] \ +Macro: PDF_IMAGE \
    -<image-file.pdf> <width> <height> [ SCALE <factor> ] \ +[ -L | -C | -R | -I <indent> ] \ +
    +<pdf image file> <width> <height> [ SCALE <factor> ] \
    [ ADJUST +|-<vertical adjustment> ] [ NO_SHIM ] [ NO_FLEX ] \
    @@ -212,8 +230,10 @@ require a

    Note: -Arguments may be broken into several lines using the -“line-continued” backslash (\), as shown above. +Mom files with embedded PDF images must be processed with +pdfmom doc.mom > doc.pdf. Arguments may be broken +into several lines using the “line-continued” backslash +(\), as shown above.

    @@ -273,7 +293,7 @@ order, although it’s best to put CAPTION, SHORT_CAPTION, and LABEL last.

    -
    'SCALE'
    +
    SCALE

    SCALE allows you to scale the image by @@ -283,10 +303,11 @@ scales the image to 50 percent of its original size. No percent sign or unit of measure should be appended.

    -
    'ADJUST'
    +
    ADJUST

    -ADJUST lets you raise (+) or lower (-) the image +ADJUST lets you raise (-) or lower +(+) the image within the space allotted for it by the amount you specify. This is useful for achieving good optical centering between surrounding blocks of type. A unit of @@ -309,7 +330,7 @@ with PDF_IMAGE’s ADJUST argument.

    -
    'NO_SHIM'
    +
    NO_SHIM

    NO_SHIM instructs mom not to apply @@ -319,15 +340,15 @@ enabled, which it is by default. Shimming ensures that running text after the image falls properly on the page’s baseline grid, but can result in slightly unequal spacing above and below -(correctible with the ADJUST argument). +(correctable with the ADJUST argument). NO_SHIM is useful when you have several images on the page and there are visible differences in the spacing beneath them as a result of shimming. To ensure a flush bottom margin, the last -image on the page should be shimmed, ie should not be given the +image on the page should be shimmed, i.e. should not be given the NO_SHIM argument.

    -
    'NO_FLEX'
    +
    NO_FLEX

    NO_FLEX instructs mom not to apply @@ -337,10 +358,10 @@ enabled. NO_FLEX is useful when you have several images on the page and you want to distribute excess vertical whitespace on the page amongst other flex-spacing points on the page. If there are no others, the final image should be -flex-spaced, ie not given the NO_FLEX argument. +flex-spaced, i.e. not given the NO_FLEX argument.

    -
    'FRAME'
    +
    FRAME

    FRAME instructs mom to put a frame around the image. @@ -348,7 +369,7 @@ Parameters for the frame are set with PDF_IMAGE_FRAME.

    -
    'CAPTION'
    +
    CAPTION

    CAPTION allows you to give the image a caption. By @@ -360,7 +381,7 @@ in The text of the caption must be surrounded by double-quotes.

    -
    'SHORT_CAPTION'
    +
    SHORT_CAPTION

    SHORT_CAPTION allows you to trim long captions for @@ -368,7 +389,7 @@ inclusion in the List of Figures. The text you supply, surrounded by double-quotes, is what will appear in the List.

    -
    'LABEL'
    +
    LABEL

    LABEL, if given, appears beneath the image. The text you @@ -379,7 +400,7 @@ an auto-labelling facility for images (see which, if enabled, overrides the LABEL argument.

    -
    'TARGET'
    +
    TARGET

    TARGET followed by a unique name surrounded by @@ -388,16 +409,21 @@ linked to from other places in the file (with PDF_LINK; see Producing PDFs with groff and mom).

    +

    +Please note: The following functionality is available +only with groff 1.22.4 or later. +

    +

    When autolabelling is enabled and the document is processed with pdfmom, the target name can be used to generate the target’s label -number in running text if it is entered as a groff string, ie of the -form \*[name]. For example, if you create a target named -“foo” for a pdf image whose autolabel number would be 3, -entering +number in running text if it is entered as a groff string, i.e. of the +form \*[name]. For example, if you create +a target named “foo” for a pdf image whose autolabel +number would be 3, entering
    See @@ -409,15 +435,6 @@ labels, the same string in, say, chapter 5 would produce the pdf link “Figure 5.3”.

    -

    -Remember that mom files with embedded PDF images must be processed -with -
    - - pdfmom doc.mom > doc.pdf - -

    -

    Note: Version 2.0-c change @@ -472,6 +489,8 @@ entered as two adjacent double-quotes. So, for example, leaves the inset value and rule weight at their current value and changes the frame colour to blue. +

    +

    Frames are drawn outside the image at its requested dimensions inclusive of scaling. Colours must be @@ -639,6 +658,19 @@ necessary, quotes and blockquotes are output immediately, and may start on one page and finish on the next.

    +

    +Floats always begin in +no-fill mode. +Text entered immediately after FLOAT will be set line-for-line +unless a +JUSTIFY +or +QUAD L|R|C +precedes it. Alternatively, any macro that sets a quad direction +may be used, e.g. +PP. +

    +

    Floats always deposit a break before they begin, which means the line beforehand will not be @@ -693,7 +725,28 @@ or

    -Macro: FLOAT [ ADJUST +|-<amount> ] [ FORCE ] [ SPAN ] [ INDENT <value> ] [ CENTER ] [ RIGHT ] [ NO_SHIM] [ NO_FLEX ] | TARGET "<name>" | <anything> +Macro: FLOAT <arguments> | <anything> +
    +Arguments: +
    +[ ADJUST +|-<amount> ] \ +
    +[ FORCE ] \ +
    +[ SPAN ] \ +
    +[ INDENT <value> ] \ +
    +[ CENTER ] \ +
    +[ RIGHT ] \ +
    +[ NO_SHIM] \ +
    +[ NO_FLEX ] \ +
    +[ TARGET "<name>" ]
    +
    @@ -733,10 +786,11 @@ additional material is included in what is floated.

    To begin a float, simply invoke .FLOAT and follow it with whatever you want the float to contain. When you’re done, -invoke .FLOAT OFF (or QUIT, END, X, etc). +invoke .FLOAT OFF (or OFF, +QUIT, END, X, etc).

    -
    'ADJUST'
    +
    ADJUST

    The optional ADJUST argument tells mom to raise @@ -746,7 +800,7 @@ the space allotted to it by the specified amount. unit of measure appended. ADJUST gives you precise control over the vertical centering of floats, allowing you to compensate for -unequal spacing that may result of from the automatic +unequal spacing that may result from the automatic shimming or flex-spacing @@ -756,17 +810,17 @@ floats.

    ADJUST is ignored for the first float deferred to a following page but respected for subsequent deferred floats -output immediately afterward. +output immediately afterwards.

    -
    'FORCE'
    +
    FORCE

    The FORCE argument instructs mom to output the float exactly where it occurs in the input file. With FORCE, mom immediately breaks to a new page to output the float if it does not fit on the current page. While this is somewhat contrary to the -notion of floats (ie that running text should continue to fill the +notion of floats (i.e. that running text should continue to fill the page), there are circumstances where it may be desirable.

    @@ -776,7 +830,7 @@ has been deferred to a subsequent page, insert \!.bp immediately before terminating the float.

    -
    'SPAN'
    +
    SPAN

    The SPAN argument tells mom that a float, if deferred, @@ -786,7 +840,7 @@ a warning should this occur. Unboxed tables, on the other hand, are acceptable within floats that are given the SPAN argument.

    -
    'INDENT'
    +
    INDENT

    INDENT allows you to indent a float from the left margin @@ -795,22 +849,22 @@ by a specified value. The value must have a appended to it.

    -
    'CENTER'
    +
    CENTER

    CENTER instructs mom to center a float if it is not already centered by default.

    -
    'RIGHT'
    +
    RIGHT

    -RIGHT instructs mom to place a float a the right of the -page; the longest line in the float will be flush with the page's -right margin. +RIGHT instructs mom to place a float at the right of the +page; the longest line in the float will be flush with the +page’s right margin.

    -
    'NO_SHIM'
    +
    NO_SHIM

    NO_SHIM instructs mom not to apply @@ -820,15 +874,15 @@ enabled, which it is by default. Shimming ensures that running text after the float falls properly on the page’s baseline grid, but can result in slightly unequal spacing above and below -(correctible with the ADJUST argument). +(correctable with the ADJUST argument). NO_SHIM is useful when you have several floats on the page and there are visible differences in the spacing beneath them as a result of shimming. To ensure a flush bottom margin, the last -float on the page should be shimmed, ie should not be given the +float on the page should be shimmed, i.e. should not be given the NO_SHIM argument.

    -
    'NO_FLEX'
    +
    NO_FLEX

    NO_FLEX instructs mom not to apply @@ -838,10 +892,10 @@ enabled. NO_FLEX is useful when you have several floats on the page and you want to distribute excess vertical whitespace on the page amongst other flex-spacing points on the page. If there are no others, the final float should be -flex-spaced, ie not given the NO_FLEX argument. +flex-spaced, i.e. not given the NO_FLEX argument.

    -
    'TARGET'
    +
    TARGET

    TARGET followed by a unique name surrounded by @@ -870,7 +924,7 @@ Floats use no-fill mode, with each input line beginning at the left margin. If this is not what you want, you must specify the preferred horizontal alignment -within the float (e.g., +within the float (e.g. CENTER or RIGHT). @@ -987,7 +1041,7 @@ is 1/4 linespace.

    -Macro: LABEL +Macro: LABEL "<label>" [ CAPTION "<caption>" ] [ SHORT_CAPTION ] \
    [ TO_LIST FIGURES | TABLES | EQUATIONS ]
    @@ -1022,12 +1076,14 @@ before ending the float:

    Reserved variables for labels

    -Mom reserves strings you may use when entering label text after -the LABEL argument. \*[chapter] holds the -current chapter or major section number. \*[fig-label], -\*[tbl-label], and \*[eqn-label] -increment the label number of the appropriate label type by one, -and are initially set to zero after each invocation of +Mom reserves strings you may use when entering +label text after the LABEL argument. +\*[chapter] holds the current chapter +or major section number. \*[fig-label], +\*[tbl-label], and +\*[eqn-label] increment the label number of +the appropriate label type by one, and are initially set to zero +after each invocation of START when the DOCTYPE @@ -1043,7 +1099,8 @@ produce Fig. 2.3.

    If your DOCTYPE is DEFAULT or NAMED, -you must reset \*[<type>-label] after each +you must reset \*[<type>-label] after +each COLLATE by entering
    @@ -1056,7 +1113,7 @@ before .START.

    If autolabelling -is enabled, e.g., .AUTOLABEL_IMAGES (List +is enabled, e.g. .AUTOLABEL_IMAGES (List of Figures) or .AUTOLABEL_PIC (also List of Figures), the prefix is stripped from the label when it appears in the List. Thus, if you have invoked .AUTOLABEL_PIC, @@ -1120,12 +1177,13 @@ which may be one of FIGURES, TABLES, or

    If, for some reason, you want only the caption appended to the List, -give \& as the first argument to LABEL, followed by +give \& as the first argument to LABEL, followed by CAPTION “caption”:
    - .LABEL \& \ - CAPTION "caption" + .LABEL \& \ + CAPTION "caption" +

    @@ -1146,6 +1204,7 @@ List of Examples with
    .TO_FIGURES EQUATIONS +

    @@ -1154,7 +1213,7 @@ List of Examples with
    -Macro: CAPTION +Macro: CAPTION "<caption>" \
    [ "<additional line>" [ "<additional line>"... ] ] \ @@ -1168,7 +1227,7 @@ inside the float.

    -If you want a caption at the top, put CAPTIO immediately +If you want a caption at the top, put CAPTION immediately underneath FLOAT and follow it with the text of the caption surrounded by double-quotes: @@ -1222,19 +1281,19 @@ with the CAPTION argument.

    Preprocessor support

    -Mom offers full support for the eqn (equations), -pic (diagrams), tbl (tables), and refer -(bibliographies/citations) preprocessors, including captions, -labelling, autolabelling, and inclusion in the Lists of Equations, -Figures, and Tables. +Mom offers full support for the eqn (equations), pic +(diagrams), grap (graphs), tbl (tables) and +refer (bibliographies/citations) preprocessors, including +captions, labelling, autolabelling, and inclusion in the Lists of +Equations, Figures, and Tables.

    Other than refer, which is discussed at length in the Bibliographies and references section, it is beyond the scope of this documentation to cover full preprocessor -usage. Consult the manpages eqn(1), pic(1), and -tbl(1) for instructions. +usage. Consult the manpages eqn(1), pic(1), +grap(1) and tbl(1) for instructions.

    @@ -1251,7 +1310,7 @@ documents created with versions prior to 2.0-c as necessary.

    Mom documents can include tables generated with the groff -preprocessor, tbl. If you are unfamiliar with tbl, I +preprocessor tbl. If you are unfamiliar with tbl, I recommend downloading a copy of Tbl - A Program to Format Tables, which, in addition to providing a thorough introduction, contains @@ -1311,7 +1370,7 @@ span as many pages as necessary to complete output. A table header will be printed at the top of each page’s table output. In the event that there is not enough room to print the table header and at least one row of table data near the bottom of a page, mom will -break to a new page before beginning table output, leaving a blank +break to a new page before beginning table output, leaving a gap in running text.

    @@ -1350,7 +1409,7 @@ or NO_FLEX, or by passing the NO_SHIM or NO_FLEX argument to .TS. In either case, you will still likely want to -adjust the spacing around with table with the AJUST +adjust the spacing around with table with the ADJUST argument to .TS. Tables inside floats should be adjusted with the ADJUST argument to FLOAT, @@ -1396,7 +1455,7 @@ required)
    Macro: TH (optional, only if .TS H)
    -Macro: TE [ SOURCE "<text of table source>" ] +Macro: TE [ SOURCE "<text of table source>" ]

    @@ -1459,7 +1518,7 @@ in any order, although it is advisable to put CAPTION, SHORT_CAPTION, and/or LABEL last.

    -
    'H'
    +
    H

    With the H argument, a table will span as many pages as @@ -1501,10 +1560,10 @@ circumstances under which it fails, whereas .TS without

    -
    'BOXED'
    +
    BOXED

    -If a table is to be boxed (ie tbl is given the flags +If a table is to be boxed (i.e., tbl is given the flags 'box' or 'allbox') you must pass the argument BOXED to .TS, as in this example:
    @@ -1519,10 +1578,10 @@ If a table is to be boxed (ie tbl is given the flags

    -
    'CENTER'
    +
    CENTER

    -If a table is to be centered on the page, (ie tbl is +If a table is to be centered on the page, (i.e., tbl is given the 'center' flag), you must pass the argument CENTER to .TS, as in this example, which creates a (possibly) multipage boxed table, centered on the page, @@ -1542,17 +1601,17 @@ with a running header.

    -
    'NEEDS'
    +
    NEEDS

    If a table is not inside a float and you pass .TS the H argument (which you should; see the tip here), -mom begins output immediately where the table occurs in the input -file if there is enough room on the output page for the table -header plus at least one row of table data. If there isn't -enough room, mom breaks to a new page before beginning the table, -leaving a gap in +mom begins output immediately where the table occurs in the +input file if there is enough room on the output page for the +table header plus at least one row of table data. If there +isn’t enough room, mom breaks to a new page before beginning +the table, leaving a gap in running text at the bottom of the previous page. If, for aesthetic reasons, you would prefer that mom require more than one row of table data @@ -1561,17 +1620,18 @@ number with the NEEDS argument, followed by the desired number of rows.

    -
    'ADJUST'
    +
    ADJUST

    -ADJUST lets you raise (+) or lower -(-) the table within -the space allotted for it by the amount you specify. This -is useful for achieving good optical centering between surrounding -blocks of type. A unit of measure is required. +ADJUST lets you raise (-) or lower +(+) the table +within the space allotted for it +by the amount you specify. This is useful for achieving good +optical centering between surrounding blocks of type. A unit of +measure is required.

    -
    'NO_SHIM'
    +
    NO_SHIM

    NO_SHIM instructs mom not to apply @@ -1581,15 +1641,15 @@ enabled, which it is by default. Shimming ensures that running text after the table falls properly on the page’s baseline grid, but can result in slightly unequal spacing above and below -(correctible with the ADJUST argument). +(correctable with the ADJUST argument). NO_SHIM is useful when you have several tables on the page and there are visible differences in the spacing beneath them as a result of shimming. To ensure a flush bottom margin, the last -table on the page should be shimmed, ie should not be given the +table on the page should be shimmed, i.e. should not be given the NO_SHIM argument.

    -
    'NO_FLEX'
    +
    NO_FLEX

    NO_FLEX instructs mom not to apply @@ -1599,10 +1659,10 @@ enabled. NO_FLEX is useful when you have several tables on the page and you want to distribute excess vertical whitespace on the page amongst other flex-spacing points on the page. If there are no others, the final table should be -flex-spaced, ie not given the NO_FLEX argument. +flex-spaced, i.e. not given the NO_FLEX argument.

    -
    'CAPTION'
    +
    CAPTION

    CAPTION allows you to give the table a caption. By @@ -1621,7 +1681,7 @@ of TH.

    -
    'SHORT_CAPTION'
    +
    SHORT_CAPTION

    SHORT_CAPTION allows you to trim long captions for @@ -1629,7 +1689,7 @@ inclusion in the List of Tables. The text you supply, surrounded by double-quotes, is what will appear in the List.

    -
    'LABEL'
    +
    LABEL

    LABEL, if given, appears beneath the table. The text you @@ -1640,7 +1700,7 @@ an auto-labelling facility for tables (see which, if enabled, overrides the LABEL argument.

    -
    'TARGET'
    +
    TARGET

    TARGET followed by a unique name surrounded by @@ -1649,16 +1709,21 @@ linked to from other places in the file (with PDF_LINK; see Producing PDFs with groff and mom).

    +

    +Please note: The following functionality is available +only with groff 1.22.4 or later. +

    +

    When autolabelling is enabled and the document is processed with pdfmom, the target name can be used to generate the target’s label -number in running text if it is entered as a groff string, ie of -the form \*[name]. For example, if you create a target -called “foo” for a table whose autolabel number would be -3, entering +number in running text if it is entered as a groff string, i.e. of +the form \*[name]. For example, if you +create a target called “foo” for a table whose autolabel +number would be 3, entering
    See @@ -1690,7 +1755,7 @@ you don’t, in fact, want a running header (e.g. when your table has a caption), you can suppress it by placing .TH immediately underneath your tbl formatting specifications, the last line of which always ends with a period -(see tbl(1)).

    +(see tbl(1)).

    @@ -1721,7 +1786,7 @@ double-quotes. The SOURCE argument may only be used if

    Mom documents can include diagrams generated with the groff -preprocessor, pic. If you are unfamiliar with pic, I +preprocessor pic. If you are unfamiliar with pic, I recommend downloading a copy of Making Pictures with GNU PIC which provides a thorough introduction and contains many examples. @@ -1734,7 +1799,10 @@ flag when you process the file. Diagrams created with pic begin with the macro .PS (Pic Start) and end with .PE (Pic End). Everything between them is -intrepreted by the preprocessor as pic instructions. +interpreted by the preprocessor as pic instructions. Please note: +Making Pictures with GNU PIC says that .PF can +also be used to terminate a pic diagram, but this is not supported +by mom.

    @@ -1776,13 +1844,11 @@ doing so. Macro: PS
    -Arguments: +Arguments: [ <width> <height> ] + +
    +  [ LEFT ]

    -  [ width ]
    (in inches; no unit of measure required) -
    -  [ height ]
    (in -inches; no unit of measure required) -
      [ ADJUST +|-<vertical adjustment>]
    (unit of measure @@ -1823,44 +1889,59 @@ itself, not groff or mom.

    The width and height arguments to .PS are idiosyncratic owing to the preprocessor itself. -If a width argument is supplied, the diagram, but not any text it -contains, is scaled to the given width. If a literal width argument -of 0 (zero) is given and a height argument is supplied, -the diagram, but not any text it contains, will be scaled to the -requested height. In the case of two non-zero arguments being -given, only the height scaling is applied. +Both are optional and both expect a value in inches, so neither +argument should have a +(unit of measure +appended.

    -
    'ADJUST'
    +

    +If the width argument is supplied, the diagram, but +not any text it contains, is scaled to the given width. If a +literal width argument of 0 (zero) is given and a +height argument is supplied, the diagram, but not any +text it contains, will be scaled to the requested height. In the +case of two non-zero arguments being given, only the height scaling +is applied. +

    + +
    LEFT

    -ADJUST lets you raise (+) or lower -(-) a diagram +By default, pic diagrams are centred on the page. If you would +prefer them to be flush left, pass PS the LEFT +argument. +

    +
    ADJUST
    + +

    +ADJUST lets you raise (-) or lower +(+) a diagram within the space allotted for it by the amount you specify. This is useful for achieving good optical centering between surrounding blocks of type. A unit of measure is required.

    -
    'NO_SHIM'
    +
    NO_SHIM

    NO_SHIM instructs mom not to apply shimming -after a pic diagrame, which she will do automatically when +after a pic diagram, which she will do automatically when shimming is enabled, which it is by default. Shimming ensures that -running text after the diagrame falls properly on the page’s +running text after the diagram falls properly on the page’s baseline grid, but can result in slightly unequal spacing above and below -(correctible with the ADJUST argument). +(correctable with the ADJUST argument). NO_SHIM is useful when you have several diagrams on the page and there are visible differences in the spacing beneath them as a result of shimming. To ensure a flush bottom margin, the last -diagram on the page should be shimmed, ie should not be given the +diagram on the page should be shimmed, i.e. should not be given the NO_SHIM argument.

    -
    'NO_FLEX'
    +
    NO_FLEX

    NO_FLEX instructs mom not to apply @@ -1870,10 +1951,10 @@ flex-spacing is enabled. NO_FLEX is useful when you have several diagrams on the page and you want to distribute excess vertical whitespace on the page amongst other flex-spacing points on the page. If there are no others, the final diagram should be -flex-spaced, ie not given the NO_FLEX argument. +flex-spaced, i.e. not given the NO_FLEX argument.

    -
    'CAPTION'
    +
    CAPTION

    CAPTION allows you to give the diagram a caption. By @@ -1885,7 +1966,7 @@ in The text of the caption must be surrounded by double-quotes.

    -
    'SHORT_CAPTION'
    +
    SHORT_CAPTION

    SHORT_CAPTION allows you to trim long captions for @@ -1893,7 +1974,7 @@ inclusion in the List of Figures. The text you supply, surrounded by double-quotes, is what will appear in the List.

    -
    'LABEL'
    +
    LABEL

    LABEL, if given, appears beneath the diagram. The text you @@ -1904,7 +1985,7 @@ an auto-labelling facility for diagrams (see which, if enabled, overrides the LABEL argument.

    -
    'TARGET'
    +
    TARGET

    TARGET followed by a unique name surrounded by @@ -1913,16 +1994,21 @@ linked to from other places in the file (with PDF_LINK; see Producing PDFs with groff and mom).

    +

    +Please note: The following functionality is available +only with groff 1.22.4 or later. +

    +

    When autolabelling is enabled and the document is processed with pdfmom, the target name can be used to generate the target’s label -number in running text if it is entered as a groff string, ie of -the form \*[name]. For example, if you create a target -called “foo” for a diagram whose autolabel number would -be 3, entering +number in running text if it is entered as a groff string, i.e. of +the form \*[name]. For example, if you +create a target called “foo” for a diagram whose +autolabel number would be 3, entering
    See @@ -1934,7 +2020,7 @@ labels, the same string in, say, chapter 5 would produce the pdf link “Figure 5.3”.

    - +

    PIC_TEXT_STYLE

    @@ -2026,8 +2112,9 @@ Support for eqn is provided via extensions to the standard the scope of this documentation, but is covered in the manpage eqn(1). You can also download a copy of Ted Harding’s - -A Guide to Typesetting Mathematics Using GNU eqn, + +A Guide to Typesetting Mathematics Using GNU eqn +, which contains useful examples. If you use eqn, you must give groff or pdfmom the -e flag. @@ -2042,7 +2129,7 @@ Macro: EQ
    Arguments:
    -  [ -L | -C | -I <ident> ]
    +  [ -L | -C | -I <indent> ] (unit of measure required) @@ -2068,7 +2155,7 @@ required)
      [ TARGET "<name>" ]
    -Macro: EN [ CONTINUED | CONT | ... ] +  [ CONTINUED | CONT | ... ]
    @@ -2111,18 +2198,18 @@ if -L or -I are passed as arguments to .EQ.

    -
    'ADJUST'
    +
    ADJUST

    -ADJUST lets you raise (+) or lower -(-) an equation +ADJUST lets you raise (-) or lower +(+) an equation within the space allotted for it by the amount you specify. This is useful for achieving good optical centering between surrounding blocks of type. A unit of measure is required.

    -
    'NO_SHIM'
    +
    NO_SHIM

    NO_SHIM instructs mom not to apply @@ -2132,15 +2219,15 @@ enabled, which it is by default. Shimming ensures that running text after the equation falls properly on the page’s baseline grid, but can result in slightly unequal spacing above and -below (correctible with the ADJUST argument). +below (correctable with the ADJUST argument). NO_SHIM is useful when you have several equations on the page and there are visible differences in the spacing beneath them as a result of shimming. To ensure a flush bottom margin, the last -equation on the page should be shimmed, ie should not be given the +equation on the page should be shimmed, i.e. should not be given the NO_SHIM argument.

    -
    'NO_FLEX'
    +
    NO_FLEX

    NO_FLEX instructs mom not to apply @@ -2150,18 +2237,17 @@ is enabled. NO_FLEX is useful when you have several equations on the page and you want to distribute excess vertical whitespace on the page amongst other flex-spacing points on the page. If there are no others, the final equation should be -flex-spaced, ie not given the NO_FLEX argument. +flex-spaced, i.e. not given the NO_FLEX argument.

    -

    -
    'CAPTION'
    +
    CAPTION

    CAPTION allows you to give the equation a caption. Equation captions always appear beneath the equation.

    -
    'SHORT_CAPTION'
    +
    SHORT_CAPTION

    SHORT_CAPTION allows you to trim long captions for @@ -2169,7 +2255,7 @@ inclusion in the List of Equations. The text you supply, surrounded by double-quotes, is what will appear in the List.

    -
    'LABEL'
    +
    LABEL

    LABEL, if given, appears on the same baseline as the last line of the @@ -2182,7 +2268,7 @@ Equations. Mom provides an auto-labelling facility for equations (see which, if enabled, overrides the LABEL argument.

    -
    'SHIFT_LABEL'
    +
    SHIFT_LABEL

    SHIFT_LABEL allows you to raise (-) or lower @@ -2193,7 +2279,7 @@ with the last line. Assuming a three-line equation, one line, thus centering it vertically on the equation.

    -
    'TARGET'
    +
    TARGET

    TARGET followed by a unique name surrounded by @@ -2202,16 +2288,21 @@ be linked to from other places in the file (with PDF_LINK; see Producing PDFs with groff and mom).

    +

    +Please note: The following functionality is available +only with groff 1.22.4 or later. +

    +

    When autolabelling is enabled and the document is processed with pdfmom, the target name can be used to generate the target’s label -number in running text if it is entered as a groff string, ie of -the form \*[name]. For example, if you create a target -called “foo” for an equation whose autolabel number -would be 3, entering +number in running text if it is entered as a groff string, i.e. of +the form \*[name]. For example, if you +create a target called “foo” for an equation whose +autolabel number would be 3, entering
    See @@ -2235,17 +2326,17 @@ A block of eqn code is terminated with .EN.

    If an equation needs to span multiple lines, possibly aligned with eqn’s 'mark' and 'lineup' -directives, separate invocations of .EQ/.EN are required -for each line, and the optional argument, CONTINUED (or -CONT, or ... [three dots, an ellipsis]), must -be passed to .EN. +directives, separate invocations of .EQ/.EN +are required for each line, and the optional argument, +CONTINUED (or CONT, or ... [three +dots, an ellipsis]), must be passed to .EN.

    If -L or -I is given to the first .EQ of a multi-line equation, they remain in effect -until the final .EN, which does not have the -CONTINUED argument. +until an .EN without the CONTINUED argument +is reached.

    @@ -2346,7 +2437,7 @@ Tables. Autolabelling may be disabled on-the-fly by giving any argument other than PREFIX, SUFFIX, or PREFIX_CHAPTER to the appropriate macro. For example, -
    +
    .AUTOLABEL_IMAGES NO @@ -2358,9 +2449,9 @@ would disable autolabelling of images.

    By default, when AUTOLABEL is enabled, the label numbers are prefixed, and, in the case of equations, suffixed, with strings such -that they appear for tables as “Table <n>”, for -pic diagrams and pdf images as “Fig. <n>”, -and for equations as “(<n>)”. +that they appear for tables as “Table <n>”, for +pic diagrams and pdf images as “Fig. <n>”, +and for equations as “Eq. (<n>)”.

    @@ -2420,12 +2511,13 @@ For the purposes of labelling, mom treats DOCTYPE DEFAULT as if it were DOCTYPE CHAPTER, hence, with PREFIX_CHAPTER, each collated DEFAULT -doctype's prefixed “chapter” number is incremented -and the label number itself reset to “1”. If -you do not give PREFIX_CHAPTER, the label number -is not reset automatically. To reset it, invoke +doctype’s prefixed “chapter” number is +incremented and the label number itself reset to “1”. +If you do not supply the PREFIX_CHAPTER argument, the +label number is not reset automatically. To reset it, invoke .AUTOLABEL_<type> after each COLLATE. +

    @@ -2466,8 +2558,7 @@ means the next autolabelled Figure will be “Fig. 6.”
    -Macro: CAPTION_AFTER_LABEL IMG | PIC | TBL | ALL [ <anything> ] - +Macro: CAPTION_AFTER_LABEL IMG | PIC | TBL | ALL [ <anything> ]

    @@ -2498,8 +2589,8 @@ would disable captions after labels for pdf images only.

    If MLA -is enabled, there's no need to invoke CAPTION_AFTER_LABEL -as this is implied. +is enabled, there’s no need to invoke +CAPTION_AFTER_LABEL as this is implied.

    @@ -2526,8 +2617,7 @@ Rather, you must do
    -Macro: MLA [ <anything> ] - +Macro: MLA [ <anything> ]

    @@ -2639,8 +2729,8 @@ set quad right, and their captions centered. Regardless of the quad direction, captions, labels and sources are set on the width of the figure, table, or pdf image unless you pass the optional ON_LL argument to -QUAD <direction>, in which case the prevailing -document line length is used instead. +QUAD <direction>, in which case +the prevailing document line length is used instead.

    • eqn
    @@ -2651,9 +2741,10 @@ set flush right with the page’s right margin regardless of equation positioning, which is, again by default, centered. If the equation is positioned left, the label will appear at the right margin regardless of the direction you give to QUAD. If -the equation is indented with the -I <indent> -option, a quad direction of LEFT is observed, but may -overprint the last line of the equation. +the equation is indented with the +-I <indent> option, a quad +direction of LEFT is observed, but may overprint the last +line of the equation.

    @@ -2751,8 +2842,8 @@ to the end of your input file.

    -Also like the Table of Contents, entries in the Lists' output are -clickable PDF links when a document is viewed at the screen. +Also like the Table of Contents, entries in the Lists’ output +are clickable PDF links when a document is viewed at the screen.

    Placement of Lists

    @@ -2796,6 +2887,7 @@ Macro: LIST_OF_TABLES Arguments:
      [ TITLE_STRING "<string>" ] [ START_PAGENUM <page number> ] +

    @@ -2992,6 +3084,418 @@ macro. NO_PAGINATION disables pagination of Lists pages.

    +

    Shaded backgrounds and frames (boxes)

    + +

    +Mom lets you add shaded backgrounds and frames to text and other +material. For convenience, she calls backgrounds and frames +“boxes.” Entire passages may be boxed, or individual +document elements like headings, quotes, or pre-processor output. +Furthermore, boxes may be nested. +

    + +

    +Boxes start on the baseline where the boxed material would have +started were it not for the box, subject to minor aesthetic +corrections mom takes the liberty of making. +

    + +

    +Boxes extend from the current left margin to the current right +margin, respecting any active left and/or right indents. There are +two exceptions, +EPIGRAPH BLOCK +and +BLOCKQUOTE, +which are discussed +here. +

    + +

    +After a box is started, active left and right indents are +cleared. The box’s inset determines the new left and right +margins. Indents set inside a box are relative to the inset. +When a box is stopped, formerly active left and right indents +are restored. +

    + +

    +Frames are drawn from the perimeter inward. The inset is +relative to the inner edge of the frame. +

    + +

    +If a box (including the bottom inset) can complete on a page, it +does, even if there is no further room for type. This may, on +occasion, result in slight deviations from normal bottom margin +alignment. +

    + +

    +Boxes span pages whenever the boxed material continues on the next +page. Spanning boxes extend fully to the bottom margin of the page +on which they begin, leaving a slightly larger inset at the bottom +than around the other sides. +

    + +

    +When there is not enough room to set at least one line of type +inside a box, mom defers starting the box until the next page, +leaving a gap. +

    + +

    +Boxed material is not +shimmed +or +flexed. +If either was active prior to the box, it is restored when the box +ends and mom automatically shims or flexes whatever comes next. +

    + +
    +

    +NOTE: +Shaded backgrounds and frames are not available when your +PRINTSTYLE +is TYPEWRITE or when +COLUMNS are enabled. +

    +
    + +
    +

    BOX

    +
    + +
    +Macro: BOX [ <arguments> ] | <anything> +
    +Arguments: +
    +[ SHADED <color> | OUTLINED <colour> ] \ +
    +[ INSET <dist> ] \ +
    +[ WEIGHT <wt> ] \ +
    +[ ADJUST +|-<amount> ] \ +
    +[ EQN | PIC | GRAP | IMG ] +
    +
    + +

    +Without arguments, BOX begins a shaded grey background. +The material inside is inset by one +pica. +Any other type of box requires at a minimum either +SHADED or OUTLINED. In the case of boxes +that are to contain pdf images or pre-processor material for +eqn, +pic, +or +grap, +IMG, EQN, PIC, or GRAP +must also be given. Note that +tbl +does not have this requirement. +

    + +

    +BOX is a +toggle macro, +so any argument other than one in the list completes the box +(QUIT, END, X, etc). +

    + +

    +Boxes should be started inside toggle macros like +QUOTE +or +FLOAT +just after the macro is called, and terminated just before toggling +the macro off (unless you wish the box to enclose further material). +

    + +

    +Non-toggle macros like +HEADING +or +PP +require that the box be started beforehand. Boxed pre-processor +material must be fully enclosed by BOX / BOX OFF, as +in this recipe for a one-off boxed pic diagram: + +.BOX +.PS +<pic commands> +.PE +.BOX OFF + +Arguments to BOX are not sticky. Each time you invoke BOX, you +must invoke it with arguments unless you want mom’s default grey +background. If all or several boxes in a document require the same +arguments, create a macro at the top of the input file that calls +BOX with the arguments you want, e.g. + +  .de PINK_BOX +  .BOX \ +    SHADED pink \ +    OUTLINED darkred \ +    WEIGHT 1p \ +    INSET 9p +  .. + +.PINK_BOX may then be used instead of .BOX any +time you want a box with those arguments. +

    + +

    SHADED | OUTLINED

    + +

    +SHADED or OUTLINED are required. Both may +be given, resulting in a shaded background with a frame, and both +require a colour, e.g. + +  .BOX SHADED blue OUTLINED black + +The colour may be +

    + +
      +
    • an xcolor name
    • +
    • a colour initialized with + NEWCOLOR + or + XCOLOR +
    • +
    • an RGB hexadecimal string beginning with (e.g. #FF0000)
    • +
    + +

    +Note that without SHADED, the above would simply draw a +black frame. +

    + +

    WEIGHT

    + +

    +Mom’s default weight for OUTLINED is 1/2 +point. +If you’d like to change it, give WEIGHT the desired +value with a unit of measure appended, typically points, e.g. + +  .BOX OUTLINED black WEIGHT 1p + +

    + +

    INSET

    + +

    +Mom’s default inset for boxes is one +pica +on all sides. If you’d like a larger or smaller inset, give +INSET the distance you want with a unit of measure +appended, e.g. + +  .BOX SHADED pink INSET 2m + +

    + +

    ADJUST

    + +

    +If you are not happy with the starting position of a box, you can +change it by giving ADJUST the distance you want it +raised (-) or lowered (+) with a unit of measure appended. For +example, to lower a box three points, + +  .BOX OUTLINED black ADJUST +3p + +To raise it, + +  .BOX OUTLINED black ADJUST -3p + +

    + +

    PIC / GRAP / EQN / IMG

    + +

    +The PIC argument must be given to BOX if the box contains +any +pic +diagrams. Likewise, graphs made with +grap, +equations made with +eqn, +and +pdf images +require a corresponding GRAP, EQN, or +IMG argument. +

    + +

    +If you’re boxing a single diagram, graph, or pdf image, wrap +it in a float, like this: + +  .FLOAT +  .BOX PIC <other parameters> +  .PS +  <pic input> +  .PE +  .BOX OFF +  .FLOAT OFF + +Notice that in the case of pdf images, pic, and grap, this +represents a change from the norm, where the use of FLOAT may be +destructive and is discouraged. +

    + +

    Additional notes on BOX usage and behaviour

    + +

    QUOTE, BLOCKQUOTE, EPIGRAPH, FLOAT

    + +

    +QUOTE, +BLOCKQUOTE, +EPIGRAPH, +and +FLOAT +require that boxes be started after they are +invoked and stopped just before they are toggled off: + +  .QUOTE +  .BOX <parameters> +  Text of quote +  .BOX OFF +  .QUOTE OFF + +

    + +

    CODE

    + +

    +If you’re boxing +CODE +that’s wrapped inside +QUOTE, +as described +here, +set the quote indent to “0” with + +  .QUOTE_STYLE INDENT 0 + +so that the box’s leftmost inset is respected. +

    + +

    +Here’s a recipe for setting boxed code with an 18-point inset: + +  .QUOTE_STYLE INDENT 0 +  .QUOTE +  .CODE +  .BOX INSET 18p +  Hello, world. +  .BOX OFF +  .QUOTE OFF + +Note that CODE, wrapped inside QUOTE, does not require a corresponding CODE OFF. +

    + +

    Description of boxed BLOCKQUOTES and EPIGRAPH BLOCKS

    + +

    +When you box a BLOCKQUOTE, or an EPIGRAPH with the BLOCK +argument, the box is centred on the page and is only as wide as the +blockquote or epigraph plus the box’s inset. +

    + +

    +QUOTE and EPIGRAPH (without the BLOCK argument), on the +other hand, set the box fully to the left and right margins. +

    + +

    Leftover box syndrome

    + +

    +Boxed quotes and blockquotes sometimes exhibit leftover box +syndrome, where the page after a fully terminated boxed quote or +blockquote begins with an empty bit of box. Equally, you may +sometimes see the lower edge of a quote’s or +blockquote’s box falling slightly below the page’s +bottom margin. +

    + +

    +The solution in both situations is to use the ADJUST +argument to raise or lower the box’s starting position. +Leftover box syndrome is usually fixed by raising the box slightly. +When the box runs too deep, lowering it is generally recommended, +although this will result in a widowed line at the top of the next +page. In either case, some experimentation is necessary. +

    + +

    SLIDES

    + +

    +On a slide with no pauses, boxes behave as they do in printed +documents. +

    + +

    +When a slide contains pauses, only the material up to the first +pause is boxed. As subsequent material is revealed, the box changes +location, moving down to surround each new item. This behaviour +persists until the box is stopped, making it useful for highlighting +material as it is revealed. +

    + +

    Footnotes

    + +

    +You don’t have to worry about boxes encroaching on footnotes. +Mom makes sure they don’t. +

    + +

    Page colour

    + +

    +Mom lets you change the page (“paper”) colour +from white to anything you like. While this has limited application +in printed documents, it can be effective in +slide presentations. +

    + +
    +

    PAGE_COLOR

    +
    + +
    +Macro: PAGE_COLOR <color> | OFF | off +
    +

    +Aliased as PAGE_COLOUR, SLIDE_COLOR, +and SLIDE_COLOUR. +

    + +

    +When you invoke PAGE_COLOR with a color argument, the +current and subsequent pages turn the colour you request. If +more than one instance of PAGE_COLOR appears before a page break, +including PAGE_COLOR OFF, only the last applies. +

    + +
    +

    +Note: +Unlike other +toggle macros, +PAGE_COLOR requires the use of OFF or off +to terminate it rather than an arbitrary string (OFF, +QUIT, END, X, etc). +

    +
    +

    diff --git a/contrib/mom/momdoc/inlines.html b/contrib/mom/momdoc/inlines.html index d700ffe..8613161 100644 --- a/contrib/mom/momdoc/inlines.html +++ b/contrib/mom/momdoc/inlines.html @@ -2,7 +2,7 @@ @@ -1697,7 +1694,7 @@ If, for some reason, you’d prefer that bibliographies be single-spaced in an otherwise double-spaced document (including double-spaced collated -documents), invoke .SINGLESPACE_BIBLIOGRAPHY with with no +documents), invoke .SINGLESPACE_BIBLIOGRAPHY with no argument.

    @@ -1837,9 +1834,9 @@ on bibliography pages. Chapters get treated differently in that, by default, mom does not print the header/footer centre string (normally the chapter number or chapter title.) In most cases, this is what you want. However, should you not want mom to remove the -centre string from the bibliography pages headers/footers, or you -would like her to add one in cases where there hasn't been one -before (e.g. DOCTYPE DEFAULT) invoke +centre string from the bibliography pages’ headers/footers, or +you would like her to add one in cases where there hasn’t been +one before (e.g. DOCTYPE DEFAULT) invoke .BIBLIOGRAPHY_HEADER_CENTER with no argument.

    @@ -1898,7 +1895,8 @@ centre string.

    If, for some reason, having enabled the header/footer centre string on bibliography pages, you wish to disable it, invoke the same macro -with any argument (OFF, QUIT, Q, X...). +with any argument (OFF, QUIT, Q, +X...).

    • Allow headers on bibliography pages
    @@ -1927,7 +1925,7 @@ If you want headers on every page including the first, do Note: If FOOTERS are on, mom prints footers on every bibliography page. This is a style convention. In mom, there is no such beast as -BIBLIOGRAPHY_ALLOWS_FOOTERS OFF. +BIBLIOGRAPHY_ALLOWS_FOOTERS OFF.

    @@ -2038,8 +2036,8 @@ Invoked without an argument, underneath the bibliography’s first-page title. Invoked with the argument, DOUBLE, BIBLIOGRAPHY_STRING_UNDERSCORE will double-underscore the title. Invoked with any other non-numeric -argument, (e.g., OFF, NO, X, etc.) the macro disables -underlining of the title. +argument, (e.g. OFF, NO, X, etc.) +the macro disables underlining of the title.

    diff --git a/contrib/mom/momdoc/reserved.html b/contrib/mom/momdoc/reserved.html index 2cfc463..4cdab3b 100644 --- a/contrib/mom/momdoc/reserved.html +++ b/contrib/mom/momdoc/reserved.html @@ -2,7 +2,7 @@ @@ -588,7 +623,7 @@ the following:

    3. Header string and style

    -The table of contents header string is the title that appears at to top of the +The table of contents header string is the title that appears at the top of the table of contents. By default, it’s “Contents”.

    @@ -607,7 +642,7 @@ example
    Header string vertical placement
    -
    +
    Macro: TOC_HEADER_V_POS <distance from top of page>

    @@ -662,7 +697,7 @@ documents) and headings as they appear in the table of contents: Head level 3 ... -The style for title entries (e.g., chapter numbers or titles) and +The style for title entries (e.g. chapter numbers or titles) and heading levels is controlled by TOC_TITLE_STYLE and @@ -681,15 +716,14 @@ here.

    See Arguments to the control macros. -

    .TOC_PN_FAMILY default = prevailing doc family .TOC_PN_FONT default = roman .TOC_PN_SIZE default = 0 -

    +
    @@ -800,8 +834,8 @@ Mom sensibly indents and aligns all levels of entry. If you change the indent for any level, all levels beneath it are still indented according to mom’s normal arrangement, but with the indent assigned to level taken into account. When you use -INDENT, the indent is measured from the left margin of -the entire text of the previous level, including numbering, if any. +INDENT, the indent is measured from the left edge of +the text of the previous level, including numbering, if any.

    @@ -839,16 +873,17 @@ Macro: TOC_PREFIX_CHAPTER_NUMBER <none> <

    By default, mom does not prefix a chapter number to chapters or section titles in the table of contents. If you would like her to -do so, invoke TOC_PREFIX_CHAPTER_NUMBER without an +do so, invoke .TOC_PREFIX_CHAPTER_NUMBER without an argument before START.

    -You may subsequently disable the prefixing of chapter numbers by -supplying the macro with any argument (OFF, QUIT, Q, X...) -prior to the START that comes after -COLLATE. +You may subsequently disable the prefixing of chapter numbers +by supplying the macro with any argument (OFF, +QUIT, Q, X...) prior to the +.START that comes after +.COLLATE.

    @@ -959,7 +994,7 @@ when PREFIX_CHAPTER_NUMBER is enabled. To enable the numbering of chapter or section titles in this circumstance, use -TOC_PREFIX_CHAPTER_NUMBER. +TOC_PREFIX_CHAPTER_NUMBER.

    @@ -1062,17 +1097,24 @@ would identify chapter 6 in the table of contents simply as
    -Macro: SPACE_TOC_ITEMS +Macro: SPACE_TOC_ITEMS

    If you’d like mom to add a small amount of space between table of contents entry levels, use .SPACE_TOC_ITEMS. Mom will -visually group entry levels in a way that's pleasing to the eye. -The only catch to this macro is that the bottom margins of table of -contents pages may not align perfectly. +visually group entry levels in a way that’s pleasing to the +eye. The only catch to this macro is that the bottom margins of +table of contents pages may not align perfectly.

    +

    +Please note that +SPACE_TOC_ITEMS is only available with +PRINTSTYLE TYPESET. +

    + +
    @@ -1124,8 +1166,8 @@ TOC_PAGE_SETTINGS allows you to enter extra formatting changes for the Table of Contents as if it were simply another collated section or chapter of a document. Because it’s a toggle macro, invoking it by itself begins collecting your formatting directives, -and invoking it with any argument (OFF, QUIT, END...) stops -the collection. +and invoking it with any argument (OFF, QUIT, +END...) stops the collection.

    @@ -1155,7 +1197,7 @@ set/change the footer gap, see

    TOC_PAGE_SETTINGS can be put in the stylesheet section of a document -(ie after +(i.e. after PRINTSTYLE and before START) diff --git a/contrib/mom/momdoc/toc.html b/contrib/mom/momdoc/toc.html index eb1df1d..6273751 100644 --- a/contrib/mom/momdoc/toc.html +++ b/contrib/mom/momdoc/toc.html @@ -2,7 +2,7 @@ -

    Full Table of Contents

    +

    Detailed Table of Contents

    VERSION 2.0 NOTES

    @@ -145,8 +150,8 @@ FDL in the main directory of the groff source package.
  • 1.1 Who is mom meant for?
  • 1.2 Typesetting with mom
  • 1.3 Document processing with mom
  • -
  • 1.4 Mom's philosophy
  • -
  • 1.5 A note on mom's documentation +
  • 1.4 Mom’s philosophy
  • +
  • 1.5 A note on mom’s documentation
    • 1.5.1 Canonical reference materials
    • 1.5.2 How to read macro arguments
    • @@ -161,7 +166,7 @@ FDL in the main directory of the groff source package.

      3. USING MOM

      @@ -240,7 +245,7 @@ FDL in the main directory of the groff source package.
      • 4.12.1 Introduction to inline escapes
      • 4.12.2 List of inline escapes
      • -
      • 4.12.3 Mom's personal inline escapes
      • +
      • 4.12.3 Mom’s personal inline escapes
      • 4.12.4 Commonly-used groff inline escapes

        6. QUICK REFERENCE GUIDE

        diff --git a/contrib/mom/momdoc/typesetting.html b/contrib/mom/momdoc/typesetting.html index fc71165..51d199e 100644 --- a/contrib/mom/momdoc/typesetting.html +++ b/contrib/mom/momdoc/typesetting.html @@ -2,7 +2,7 @@ @@ -332,13 +312,6 @@ Please read the for information on ensuring groff respects your PAGELENGTH.

        -
        -

        -Important: PAGELENGTH, -when you need it, should be placed at the top of your files. -

        -
        -
        @@ -377,6 +350,8 @@ than to remember the correct dimensions and enter If you’d like landscape orientation for your paper type, pass PAPER the LANDSCAPE argument. +

        +

        Please read the Important note on page dimensions and papersize @@ -385,8 +360,8 @@ for information on ensuring groff respects your PAPER size.

        -Important: PAPER when you -need it, should be placed at the top of your files. +Important: If you need PAPER, +it should always be placed at the very top of your file.

        @@ -405,19 +380,23 @@ Macro: L_MARGIN <left margin>

        L_MARGIN establishes the distance from the left edge of the printer -sheet at which you want your type to start. It may be used any -time, and remains in effect until you enter a new value. -

        - -

        +sheet at which you want your type to start. Left indents and tabs -are calculated from the value you pass to L_MARGIN, hence it’s -always a good idea to invoke it before starting any serious -typesetting. A unit of measure is required. Decimal fractions are -allowed. Therefore, to set the left margin at 3 picas (1/2 inch), -you’d enter either +are calculated from the value you pass to L_MARGIN. +If you use the macros +PAGEWIDTH +or +PAPER +without setting L_MARGIN, mom automatically sets the left margin to +1 inch. +

        + +

        +A unit of measure is required and decimal fractions are allowed. +Therefore, to set the left margin at 3 picas (1/2 inch), you’d +enter either
        .L_MARGIN 3P @@ -426,13 +405,6 @@ or .L_MARGIN .5i -If you use the macros -PAGE, -PAGEWIDTH -or -PAPER -without invoking L_MARGIN (either before or afterwards), mom -automatically sets L_MARGIN to 1 inch.

        @@ -470,8 +442,8 @@ and/or PAGE (if a right margin isn’t given to PAGE). The reason is that R_MARGIN calculates line length from the overall page dimensions and -the left margin. Obviously, it can’t make the calculation if -it doesn’t know the page width and the left margin. +the left margin. Mom can’t make the calculation if +she doesn’t know the page width and the left margin.

        @@ -504,7 +476,7 @@ and right margin, like this: That way, you don’t have to worry about calculating the line length. On the other hand, if you know the line length for a patch of type should be 17 picas and 3 points, entering the line length -with LL is much easier than calculating the right margin, e.g., +with LL is much easier than calculating the right margin, e.g.
        .LL 17P+3p @@ -674,7 +646,7 @@ different than when you’re using just the typesetting macros PAGE lets you establish paper dimensions and page margins with a single macro. The only required argument is page width. The rest are optional, but they must appear in order and you can’t -skip over any. <lm>, <rm>, <tm> and +skip over any. <lm>, <rm>, <tm>, and <bm> refer to the left, right, top and bottom margins respectively.

        @@ -717,17 +689,17 @@ This sets up an 8-1/2 by 11 inch page with margins of 45 points

        -Additionally, if you invoke .PAGE with a top margin -argument, any macros you invoke after .PAGE will almost -certainly move the +Additionally, if you are not using the +document processing macros +and invoke PAGE with a top margin argument, any macro you invoke +after PAGE will likely move the baseline of the first line of text down by one linespace. To compensate, do
        .RLD 1v -immediately before entering any text, or, if it’s feasible, -make PAGE the last macro you invoke prior to entering text. +immediately before entering any text.

        @@ -762,8 +734,8 @@ you to the top of a new one (subject to the top margin set with

        The basic typesetting parameter macros deal with fundamental -requirements for setting type: family, font, point size, leading and -line length. +requirements for setting type: family, font, point size, leading, +and line length.

        @@ -839,6 +811,19 @@ only exists in one style: Italic (I). Therefore, ZCM, then setting the font to I.

        +

        +Furthermore, if you need to access a character from groff's Zapf +Dingbats font directly, use .FT ZD or the +inline escape +\f[ZD]. Commonly-used dingbats are +available without changing to the ZD font by using groff's +pre-defined character escapes, e.g. \[rh] for a pointing +right hand; see man groff_char for a complete list. +Dingbats that have not been pre-defined must be accessed with the +\N escape. For example, \f[ZD]\N'37' prints +the (undefined) telephone dingbat. +

        +

        Additional note: If you are running a version of groff lower than 1.19.2, you must @@ -867,7 +852,7 @@ However, if the font style does not exist in the new family, mom will set all subsequent type in the fallback font (by default, Courier Medium Roman) until she encounters a -.FT +FT request that’s valid for the family. For example, assuming you don’t have the font “Medium Condensed Roman” (mom extension “CD”) in the Helvetica family: @@ -961,7 +946,7 @@ though, that you must have the fonts, correctly installed and named, in order to use the arguments. (See Adding fonts to groff for instructions and information.) Please also read the -ADDITIONAL NOTE +Additional note found in the description of the FAMILY macro.

        @@ -1009,7 +994,7 @@ Macro: FALLBACK_FONT <fallback font> [ ABOR

        In the event that you pass an invalid argument to .FAMILY -(ie a non-existent family), mom, by default, uses the fallback +(i.e. a non-existent family), mom, by default, uses the fallback font, Courier Medium Roman (CR), in order to continue processing your file.

        @@ -1106,7 +1091,7 @@ is measured in points. Therefore, to change the type size to, say, .PT_SIZE 11 -Point sizes may be fractional (e.g., 10.25 or 12.5). +Point sizes may be fractional (e.g. 10.25 or 12.5).

        @@ -1157,7 +1142,7 @@ would allow you to set point sizes with .PS.

        -

        Line spacing/leading

        +

        Line spacing / leading

        @@ -1170,7 +1155,7 @@ Macro: LS <distance between lines>

        LS (Line Space) takes one argument: the distance you want, typically in points, from baseline to baseline of type. The argument may be -fractional (e.g., 12.25 or 14.5). Like PT_SIZE, LS does not require +fractional (e.g. 12.25 or 14.5). Like PT_SIZE, LS does not require a unit of measure, since leading is most often given in points. Therefore, to set the linespace to @@ -1241,7 +1226,7 @@ requests automatically update the linespacing by the autolead amount. Used in this way, AUTOLEAD does not require a unit of measure; points is assumed. However, you may use an alternate unit of measure by appending it to the argument. The argument may be a -decimal fraction (e.g., .5 or 2.75). +decimal fraction (e.g. .5 or 2.75).

        @@ -1544,7 +1529,7 @@ for a definition of the difference between “fill” and

        -LEFT, RIGHT and CENTER let you enter text on a line for line basis +LEFT, RIGHT, and CENTER let you enter text on a line for line basis without having to use the BR macro after each line. Consider the following: @@ -1560,7 +1545,7 @@ macro after each line. Consider the following: And with no language but a cry. .BR -Because text after .QUAD LEFT is +Because text after .QUAD LEFT is filled, you have to use the BR @@ -1580,7 +1565,7 @@ better to do

        IMPORTANT: Because LEFT, -RIGHT and CENTER are nofill modes, groff does not always respect the +RIGHT, and CENTER are nofill modes, groff does not always respect the current line length. Input lines that run long may exceed it, or get broken in undesirable ways. @@ -1671,7 +1656,7 @@ with the bothersome, you may prefer to use the inline escape alternative to EL, -\*[B], +\*[B], which works consistently regardless of the fill mode. EL does not work after the PAD @@ -1681,7 +1666,7 @@ with the

        -EL ("End Line") +EL (“End Line”) is conceptually equivalent to the notion of a carriage return with no linefeed. Its function is simple: it breaks a line without advancing on the page. As an example of where you might use it, @@ -1729,7 +1714,7 @@ which is covered in the section

        -Macro: SPACE <space to add between lines> +Macro: SPACE [<space to add between lines>]

        Alias: SP @@ -1739,9 +1724,7 @@ Macro: SPACE <space to add between lines>BR, then adds space after the line. With no argument, it adds an extra -line space of a value equal to the current -leading. -If you pass it a numeric argument without supplying a +line space. If you pass it a numeric argument without supplying a unit of measure, it advances that number of extra line spaces. For example:
        @@ -1757,16 +1740,13 @@ breaks the line and adds two extra linespaces.

        -If you supply a unit of measure, SPACE breaks the line then advances -one linespace (at the current -leading) -PLUS the specified amount of extra space given to SPACE, as in +If you supply a unit of measure, SPACE breaks the line and advances +the specified vertical distance, as in
        .SPACE 6p -which breaks the line and advances one full linespace plus six -points. +which breaks the line and advances six points further.

        @@ -1781,10 +1761,21 @@ line space (or multiple thereof), and ALD whenever you want some other value of space after a line.

        -

        +

        Experts: SPACE is an alias of .sp. You can use either, or mix ’n’ match -with impunity. +with impunity. Because SPACE aliases .sp, it may be used +with groff’s absolute position modifier +“|” (the pipe +character) to move to a specified vertical location on the page. +Consult + + info groff “Manipulating Spacing” + +or, more simply, + + info groff sp. +

        @@ -1956,8 +1947,8 @@ to stretch the word spacing.

        Word space is relative to point size. Generally, in/decreasing the word space by a value of 1 or 2 produces a difference that in many -cases is scarcely visible; in/decreasing by a value between 3 and 5 -produces a subtle but noticeable difference; and in/decreasing by a +cases is scarcely visible. In/decreasing by a value between 3 and 5 +produces a subtle but noticeable difference. In/decreasing by a value greater than 6 is almost always apparent. You should preview your work to assess the effect of WS.

        @@ -2025,17 +2016,17 @@ normal word space PLUS the +2 value passed to SS. Like WS, increasing the sentence space by a value of 1 or 2 produces a -difference that in many cases is scarcely visible; increasing by a -value of 5 or so produces a subtle but noticeable difference (ie -the space between double-spaced input sentences will be slightly but -visibly greater than the space between words); and increasing by a +difference that in many cases is scarcely visible. Increasing by a +value of 5 or so produces a subtle but noticeable difference (i.e., +the space between double-spaced input sentences will be slightly +but visibly greater than the space between words). Increasing by a value greater than 10 is always apparent. You should preview your work to assess the effect of SS.

        There’s an additional argument you can pass SS: the number -zero (without the + sign). It’s the argument you’ll +zero (without the plus sign). It’s the argument you’ll use most often. Typeset copy should never have two spaces between sentences, and the "zero" argument tells groff to give the extra spaces no space at all (effectively removing them). Therefore, if @@ -2052,7 +2043,7 @@ at the top of your files. If you do use SS for something other than ensuring that you don’t get unwanted sentence spaces in output copy, you can set or reset the sentence space to the groff default (the same width -as a word space, ie double-spaced input sentences will appear +as a word space, i.e., double-spaced input sentences will appear double-spaced on output as well) with
        @@ -2109,8 +2100,8 @@ to HY, I’ve broken them down into separate sections.

        1.  HY

        -HY by itself (ie with no argument) simply turns automatic -hyphenation on. Any argument other than LINES, MARGIN, SPACE or +HY by itself (i.e. with no argument) simply turns automatic +hyphenation on. Any argument other than LINES, MARGIN, SPACE, or DEFAULT, turns automatic hyphenation off. For example, as explained in How to read macro arguments, @@ -2135,7 +2126,7 @@ LINES, MARGIN, or SPACE that were formerly in effect (see below). HY observes the following default hyphenation rules:

          -
        • Last lines (ie ones that will spring a trap—typically +
        • Last lines (i.e. ones that will spring a trap—typically the last line on a page) will not be hyphenated.
        • The first and last two characters of a word are never @@ -2162,7 +2153,7 @@ limit to the number of consecutive hyphenated lines. Note: Discretionary hyphens count when groff is figuring out how many lines to hyphenate; -explicit hyphens (ie the actual hyphen character) do not. +explicit hyphens (i.e. the actual hyphen character) do not.

        @@ -2198,9 +2189,9 @@ MARGIN requires a

        4.  HY SPACE

        -HY SPACE sets an amount of extra interword space that groff will try -to put between words on a line in order to PREVENT hyphenation. HY -SPACE applies only to +HY SPACE sets an amount of extra interword space that groff will +try to put between words on a line in order to prevent +hyphenation. HY SPACE applies only to justified lines. Generally speaking, you’ll want this value to be quite small, since too big a value will result in lines with gaping holes between @@ -2271,10 +2262,10 @@ Macro: HY_SET <lines> [ <margin> [ &l

        HY_SET lets you set the parameters for hyphenation with a single macro. <lines>, -<margin> and +<margin>, and <space> correspond to the numeric values required by LINES, -MARGIN and SPACE as described +MARGIN, and SPACE as described above.

        @@ -2353,9 +2344,9 @@ recommend previewing your work to assess the effect of RW. break when it’s invoked if you’re in one of the fill -modes (ie +modes (i.e. QUAD -L, R, C, J or +L, R, C, J, or JUSTIFY). If you want RW to break at the ends of the previous @@ -2369,7 +2360,7 @@ that’s what you want by invoking

        IMPORTANT: -RW (and its complement, EW; see below) only affects the current +RW (and its complement, EW, see below) only affects the current font, and remains in effect for that font every time it’s called, hence it must be reset to zero to cancel its effect (.RW 0). @@ -2416,9 +2407,9 @@ assess the effect of EW. break when it’s invoked if you’re in one of the fill -modes (ie +modes (i.e. QUAD -L, R, C, J or +L, R, C, J, or JUSTIFY). If you want EW to break at the ends of the previous @@ -2433,7 +2424,7 @@ toggle macro.

        IMPORTANT: -EW (and its complement, RW; see above) only affects the current +EW (and its complement, RW, see above) only affects the current font, and remains in effect for that font every time it’s called, hence it must be reset to zero to cancel its effect (.RW 0). @@ -2453,9 +2444,9 @@ Macro: BR_AT_LINE_KERN toggle

        By default, in fill -modes (ie +modes (i.e. QUAD -L, R, C, J or +L, R, C, J, or JUSTIFY) mom does not break input lines @@ -2466,7 +2457,8 @@ or If you’d like her to break input lines prior to RW or EW, invoke .BR_AT_INPUT_LINE without any argument. To disable the breaks, invoke .BR_AT_INPUT_LINE with any -argument (OFF, QUIT, Q, X...), like this +argument (OFF, QUIT, END, +X...), like this
        .BR_AT_LINE_KERN OFF @@ -2475,7 +2467,7 @@ or .BR_AT_LINE_KERN X -With QUAD L, R or C, mom simply breaks the line. With QUAD J (or +With QUAD L, R, or C, mom simply breaks the line. With QUAD J (or just JUSTIFY, which is the same thing), she breaks and force justifies the line prior to .EW or .RW. @@ -2492,17 +2484,18 @@ Macro: KERN toggle

        -By itself (ie with no argument), KERN turns automatic pairwise +By itself (i.e. with no argument), KERN turns automatic pairwise kerning -on. With any argument (e.g., OFF, Q, X), pairwise kerning is turned -off. +on. With any argument (e.g. OFF, Q, +X), pairwise kerning is turned off.

        -Kerning of individual character pairs can be controlled with the +Kerning of individual character pairs can be controlled with the two inline escapes -\*[BU <n>] and -\*[FU <n>]. See +
        +\*[BU <n>] and +\*[FU <n>]. See Inline Escapes, kerning.

        @@ -2644,9 +2637,9 @@ Inline: \*[SLANTX]

        -\*[SLANT] begins pseudo-italicizing type. -\*[SLANTX] turns the feature off. Both are -inline escapes, +\*[SLANT] begins pseudo-italicizing. \*[SLANTX] turns +the feature off. Both are inline +escapes, therefore they should not appear as separate lines, but rather be embedded in text lines, like this:
        @@ -2659,8 +2652,8 @@ you’d do \*[SLANT]Not everything is as it seems.\*[SLANTX] -Once \*[SLANT] is invoked, it remains in effect until -turned off. +Once \*[SLANT] is invoked, it remains in +effect until turned off.

        @@ -2712,7 +2705,7 @@ to the mom default, do emboldening type; it merely tells mom what you want the emboldening offset to be. To start emboldening, use the inline escape -\*[BOLDER]. +\*[BOLDER].

        @@ -2730,7 +2723,8 @@ Inline: \*[BOLDERX]

        \*[BOLDER] begins emboldening type. -\*[BOLDERX] turns the feature off. Both are +\*[BOLDERX] turns the +feature off. Both are inline escapes, therefore they should not appear as separate lines, but rather be embedded in text lines, like this: @@ -2744,8 +2738,8 @@ you’d do \*[BOLDER]Not everything is as it seems.\*[BOLDERX] -Once \*[BOLDER] is invoked, it remains in effect -until turned off. +Once \*[BOLDER] is invoked, it remains in +effect until turned off.

        @@ -2780,7 +2774,7 @@ want the characters to be condensed. Mom has no default value for CONDENSE, therefore you must set it before using the inline escape -\*[COND]. +\*[COND]. 80 percent of the normal character width is a good value, and you’d set it like this:
        @@ -2796,14 +2790,14 @@ pseudo-condensing type; it merely tells mom what percentage of the normal character width you want characters to be condensed. To start pseudo-condensing, use the inline escape -\*[COND]. +\*[COND].

        Additional note: Make sure that pseudo-condensing is off (with -\*[CONDX]) -before before making any changes to the pseudo-condense percentage +\*[CONDX]) +before making any changes to the pseudo-condense percentage with CONDENSE.

        @@ -2822,7 +2816,7 @@ Inline: \*[CONDX]

        \*[COND] begins pseudo-condensing type. -\*[CONDX] turns the feature off. Both are +\*[CONDX] turns the feature off. Both are inline escapes, therefore they should not appear as separate lines, but rather be embedded in text lines, like this: @@ -2830,21 +2824,21 @@ embedded in text lines, like this: \*[COND]Not everything is as it seems.\*[CONDX] -\*[COND] remains in effect until you turn it -off with \*[CONDX]. +\*[COND] remains in effect until you turn it +off with \*[CONDX].

        IMPORTANT: You must turn -\*[COND] -off before making any changes to the point size of your type, either -via the +\*[COND] off before making any changes to +the point size of your type, either via the PT_SIZE macro or with the \s inline escape. If you wish -the new point size to be pseudo-condensed, simply reinvoke -\*[COND] afterwards. Equally, \*[COND] must -be turned off before changing the condense percentage with +the new point size to be pseudo-condensed, simply re-invoke +\*[COND] afterwards. Equally, +\*[COND] must be turned off before changing +the condense percentage with .CONDENSE.

        @@ -2881,9 +2875,9 @@ characters to be extended. Mom has no default value for EXTEND, therefore you must set it before using the inline escape -\*[EXT]. -120% of the normal character width is a good value, and you’d -set it like this: +\*[EXT]. 120% of +the normal character width is a good value, and you’d set it +like this:
        .EXTEND 120 @@ -2897,14 +2891,14 @@ pseudo-extending type; it merely tells mom what percentage of the normal character width you want characters to be extended. To start pseudo-extending, use the inline escape -\*[EXT]. +\*[EXT].

        Additional note: Make sure that pseudo-extending is off (with \*[EXTX]) -before before making any changes to the pseudo-extend percentage +before making any changes to the pseudo-extend percentage with EXTEND.

        @@ -2923,7 +2917,7 @@ Inline: \*[EXTX]

        \*[EXT] begins pseudo-extending type. -\*[EXTX] turns the feature off. Both are +\*[EXTX] turns the feature off. Both are inline escapes, therefore they should not appear as separate lines, but rather be embedded in text lines, like this: @@ -2932,16 +2926,17 @@ embedded in text lines, like this: \*[EXT]Not everything is as it seems.\*[EXTX] \*[EXT] remains in effect until you turn it off with -\*[EXTX]. +\*[EXTX].

        IMPORTANT: You must turn -\*[EXT] off before making any changes to the point size -of your type, either via the +\*[EXT] off before making any changes to the +point size of your type, either via the PT_SIZE -macro or with the \s inline escape. If you wish the new -point size to be pseudo-extended, simply reinvoke \*[EXT] -afterwards. Equally, \*[EXT] must be turned off before -changing the extend percentage with +macro or with the \s inline escape. If you wish +the new point size to be pseudo-extended, simply re-invoke +\*[EXT] afterwards. Equally, +\*[EXT] must be turned off before changing +the extend percentage with EXTEND.

        @@ -2951,7 +2946,7 @@ changing the extend percentage with document processing macros with PRINTSTYLE TYPEWRITE, -mom ignores \*[EXT] requests. +mom ignores \*[EXT] requests.

  • @@ -2971,7 +2966,11 @@ To begin setting type in pseudo-smallcaps, simply invoke SMALLCAPS OFF (or END, STOP, DONE, etc). If you are currently in a no-fill mode, -(i.e. .LEFT, .CENTER, or .RIGHT) +(i.e. +LEFT, +CENTER, +or +RIGHT) and you want the smallcaps to continue on the same line, append a \c to the line, like this
    @@ -2981,7 +2980,7 @@ append a \c to the line, like this with a few words in smallcaps. .SMALLCAPS OFF -The line preceding .SMALLCAPS OFF should also have a +The line preceding .SMALLCAPS OFF should also have a \c appended to it if you wish it to continue unbroken.

    @@ -2989,7 +2988,9 @@ The line preceding .SMALLCAPS OFF should also have a

    Note: SMALLCAPS does not have an inline equivalent to -\*[UC] / \*[LC]. + +\*[UC] / \*[LC] +. Furthermore, if you’re using the document processing macros with @@ -3016,7 +3017,7 @@ Macro: SMALLCAPS_STYLE SIZE <percentage> WE True smallcaps are not a font effect, but, like designer cuts of bold, condensed, and extended, actual fonts provided with some families. It is highly recommended that you acquire real smallcaps -fonts rather than relying on mom's pseudo version. +fonts rather than relying on mom’s pseudo version.

    @@ -3072,6 +3073,7 @@ page relative to the current

    • ALD – Advance Lead
    • RLD – Reverse Lead
    • +
    • (see also SPACE)
    @@ -3094,12 +3096,30 @@ relative to the current vertical position.

    -Used by itself, or preceded by -BR, -ALD will advance by one line space plus the distance you specify. -Preceded by -EL, -it will advance by exactly the distance you specify. +ALD causes a line break, which means the argument is added to the +current +leading. +For example, if your current leading is 12 points, a line of type +after .ALD 6p will be 18 points distant from the previous +line. +

    + +

    +If you wish to advance the argument's distance from the +current baseline, it should be preceded by +EL. +For example, +
    + + .LEFT + .LS 12 + First line. + Second line.\c + .EL + .ALD 15p + Third line. + +would place the third line exactly 15 points beneath the second.

    @@ -3125,7 +3145,7 @@ of lead.

    Note: if you want to use ALD at the top -of a page (ie to advance to the starting position of type on a +of a page (i.e. to advance to the starting position of type on a page), combine the value you want with -1v (minus one line space), like this:
    @@ -3157,12 +3177,33 @@ relative to the current vertical position.

    -Used by itself, or preceded by -BR, -RLD will advance by one line space, then reverse by the distance you -specify. Preceded by -EL, -it will reverse by exactly the distance you specify. +RLD causes a line break, which means the argument is subtracted from +the current +leading. +For example, if your current leading is 12 points, a line of type +after .RLD 6p will be 6 points distant from the previous +line. +

    + +

    +If you wish to move upward from the current baseline by the +argument's distance, RLD should be preceded by +EL. +For example, +
    + + .LEFT + .LS 18 + First line. + Second line.\c + .EL + .RLD 3p + Third line. + +would raise the third line by 3 points relative to the baseline of +the second line. Put another way, if the .RLD in the +example were 18p, the third line would fall on the same baseline as +the second.

    @@ -3257,7 +3298,7 @@ Team spirit Needs work Persistently gives higher priority You want the first tab, CRITERION,

      -
    • to begin at the left margin of the page – ie no indent
    • +
    • to begin at the left margin of the page – i.e. no indent
    • to have a line length of 5 picas
    • to be set flush left
    @@ -3320,7 +3361,7 @@ Once the tabs are set up, you can call them in one of two ways: advances one linespace and calls the tab.
  • with .TN (Tab Next), which keeps you on the current line and moves over to the next - tab in sequence (ie from 1 to 2, 2 to 3, etc.), or, more + tab in sequence (i.e. from 1 to 2, 2 to 3, etc.), or, more conveniently, with the \*[TB+] inline escape
  • @@ -3378,7 +3419,7 @@ than respecting organizational hierarchy.

    -Try setting this up and processing it it with +Try setting this up and processing it with
    pdfmom filename.mom > filename.pdf @@ -3435,7 +3476,7 @@ In combination with the macro and the groff inline escape \h (move horizontally across the page) or mom’s -\*[FWD <distance>] +\*[FWD <distance>] (move forward) inline, string tabs provide tremendous flexibility in setting up complex tab structures.

    @@ -3467,9 +3508,9 @@ The first thing you need for string tabs is an input line with tab positions marked on it. Tabs are marked with the inline escapes -\*[ST<n>] +\*[ST<n>] and -\*[ST<n>X], +\*[ST<n>X], where <n> is the number you want the tab to have. (In this example, we enclose the input line with the @@ -3508,7 +3549,7 @@ into its component parts:
  • We want a 1 pica (12 points) gutter between tab 1 and 2, - so we insert 12 points of space with \*[FWD 12p]: + so we insert 12 points of space with \*[FWD 12p]:
    \*[FWD 12p] @@ -3560,7 +3601,7 @@ From here on in, you call the tabs with .TAB, .TN, or -\*[TB+] +\*[TB+] just like typesetting tabs (see typesetting tabs tutorial).

    @@ -3631,9 +3672,11 @@ of the tabs have altered because of the new point size.

    Now try increasing the gutters to 2 picas -(\*[FWD 24p] or \*[FWD 2P] instead -of \*[FWD 12p]). Preview the file again, and notice -how the tab structure remains the same, but the gutters are wider. +(\*[FWD 24p] or +\*[FWD 2P] instead of +\*[FWD 12p]). Preview the file again, +and notice how the tab structure remains the same, but the gutters +are wider.

    @@ -3714,7 +3757,7 @@ this: .TAB 1 9p 6P J
    Once tabs are set, they can be called at any time with the -TAB <n> +TAB <n> macro, where <n> is the number of the desired tab.

    @@ -3722,10 +3765,11 @@ macro, where <n> is the number of the desired tab. You can set up any number of typesetting tabs. However, be aware that string tabs -are also called with TAB <n>, so be careful that you +are also called with TAB <n>, so be careful that you don’t set up a typesetting tab numbered, say, 4, when you already have a string tab numbered 4. Every tab, typesetting or -string, must have a unique numeric identifier.

    +string, must have a unique numeric identifier. +

    @@ -3772,7 +3816,7 @@ or the set to LEFT in order for these inlines to function properly. Please see -IMPORTANT, +IMPORTANT, below.

    @@ -3791,7 +3835,7 @@ string tab markers. String tab 1 begins at the start of the line and ends after the word “time”. String tab 2 starts at “good” and -ends after “men”. Inline escapes (e.g., font or point +ends after “men”. Inline escapes (e.g. font or point size changes, or horizontal movements, including padding) are taken into account when mom determines the position and length @@ -3814,7 +3858,7 @@ after which they may be called, by number, with

    Note: Lines with string tabs marked off -in them are normal input lines, ie they get printed, just like +in them are normal input lines, i.e., they get printed, just like any input line. If you want to set up string tabs without the line printing, use the SILENT @@ -3824,7 +3868,7 @@ macro.

    -IMPORTANT: +IMPORTANT: Owing to the way groff processes input lines and turns them into @@ -3844,7 +3888,7 @@ justified and broken with In other words, in order to use string tabs, LEFT must be active, or, if -QUAD LEFT +QUAD LEFT or JUSTIFY are active, the line on which the string tabs are marked must be @@ -3902,15 +3946,15 @@ Macro: ST <tab number> L | R | C | J [ QUA

    After string tabs have been marked off on an input line (see -\*[ST]...\*[STX]), +\*[ST]...\*[STX]), you need to “set” them by giving them a direction and, optionally, the QUAD argument. In this respect, ST is like TAB_SET except that you don’t have to give ST an indent or a line length (that’s already taken care of, inline, by -\*[ST]...\*[STX]). If you want string tab 1 to be left, -enter +\*[ST]...\*[STX]). If you want string tab 1 +to be left, enter
    .ST 1 L @@ -3979,7 +4023,7 @@ If you want the tabs to line up, use TN (Tab Next) or, more conveniently, the inline escape -\*[TB+]: +\*[TB+]:
    .TAB 1 @@ -4027,7 +4071,7 @@ in the description of the TAB macro for an example of how TN works.

    In tabs that aren’t given the QUAD argument when they’re set up with -TAB_SET +TAB SET or ST, you must terminate the line preceding .TN @@ -4042,7 +4086,7 @@ If you find remembering whether to put in the inline escape alternative to .TN, -\*[TB+], +\*[TB+], which works consistently regardless of the fill mode.

    @@ -4070,12 +4114,12 @@ The above example, assuming tabs numbered from 1 to 4, should be entered .TN Some more text\c .TN - \&\c + \&\c .TN Yet more text -\& is a zero-width, non-printing character that groff +\& is a zero-width, non-printing character that groff recognizes as valid input, hence meets the requirement for input text following .TN.

    @@ -4186,13 +4230,13 @@ macro in the

    Additional Note: Do not use multi-columns with -DOCTYPE SLIDES +DOCTYPE SLIDES because MCX uses the lowest line on the page to determine column depth. Owing to the fact that both headers and footers are printed prior to slides receiving text, MCX will always go to the footer position. If you need functionality similar to MCO/MCX, use the groff requests .mk and .rt. See -info groff --index-search=mk. +info groff mk.

    @@ -4324,7 +4368,7 @@ of the longest column.

    With mom’s indents, you can indent from the left, the right, or both margins. In addition, mom provides temporary left indents -(ie only one line is indented, as at the start of a paragraph) +(i.e., only one line is indented, as at the start of a paragraph) and “hanging” left indents (the reverse of a temporary indent; the first line isn’t indented, subsequent lines are).

    @@ -4355,7 +4399,7 @@ indents:

    -This section deals exclusively with IL, IR and IB. For an +This section deals exclusively with IL, IR, and IB. For an explanation of hanging and temporary indents—how they work and how to use them—see Hanging indents @@ -4393,7 +4437,7 @@ As you can see, once you’ve supplied a measure to an indent macro, mom stores the value, obviating the need to repeat it on subsequent invocations. And mom doesn’t just store the measure—she hangs on to it tenaciously. Arguments passed to -IL, IR and IB are additive. Consider the following: +IL, IR, and IB are additive. Consider the following:
    .LL 20P @@ -4405,17 +4449,17 @@ IL, IR and IB are additive. Consider the following: A second block of text... ... ... - .IR 2P \"Indent right by an additional 2 picas (ie 4 picas) + .IR 2P \"Indent right by an additional 2 picas (i.e. 4 picas) A third block of text... ... ... -The first block of text is right indented by 2 picas (ie the line +The first block of text is right indented by 2 picas (i.e. the line length is shortened by 2 picas to 18 picas). The second block of text, after IQ, is, as you’d expect, set to the full measure. The third block of text—the one to pay attention to—is not right indented by 2 picas, but rather by 4 picas. Mom adds -the value of arguments to IL, IR and IB to whatever value is already +the value of arguments to IL, IR, and IB to whatever value is already in effect.

    @@ -4551,7 +4595,7 @@ for more details.

    Note: Calling a tab (with -.TAB <n>) +.TAB <n>) automatically cancels any active indents.

    @@ -4603,7 +4647,7 @@ for more details.

    Note: Calling a tab (with -.TAB <n>) +.TAB <n>) automatically cancels any active indents.

    @@ -4673,7 +4717,7 @@ for more details.

    Note: Calling a tab (with -.TAB <n>) +.TAB <n>) automatically cancels any active indents.

    @@ -4725,9 +4769,9 @@ turn them off.

    -IMPORTANT: Unlike IL, IR and IB, -measures given to TI are NOT additive. In the following example, -the second .TI 2P is exactly 2 picas. +IMPORTANT: Unlike IL, IR, and IB, +measures given to TI are not additive. In the following +example, the second .TI 2P is exactly 2 picas.
    .TI 1P @@ -4790,7 +4834,7 @@ mom keeps track of the last measure you gave it.

    Generally speaking, you should invoke HI immediately prior to the -line you want hung (ie without any intervening +line you want hung (i.e. without any intervening control lines). And because hanging indents affect only one line, there’s no need to turn them off. @@ -4798,7 +4842,7 @@ need to turn them off.

    -IMPORTANT: Unlike IL, IR and IB, +IMPORTANT: Unlike IL, IR, and IB, measures given to HI are NOT additive. Each time you pass a measure to HI, the measure is treated literally.

    diff --git a/contrib/mom/momdoc/using.html b/contrib/mom/momdoc/using.html index 851d637..c93e385 100644 --- a/contrib/mom/momdoc/using.html +++ b/contrib/mom/momdoc/using.html @@ -2,7 +2,7 @@ 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

  • ye#21GAkhcVSvq@M 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

    Oj$tspyq+^`%M}2b(?61X51L^;t znwZ(RE0K+hJ-=fog)a` zla5tZEw!p~Zf+Ww+tM`9*4i|HGEDwo8~%sJI}YWEBqJ}N=NV5wgeK8Bb#mdHDV#F5 zuV^YZI{-tdngILlx_JcHQ~`Y|hWv<&&pg6Fl|Kg>8W3G@N`%plP)=M%AcB0I$Bcps zfam^B-lhi_)kEvM_z=L+PF?{3Qz>05GyYCMc*|0OGX7|LIJ7Y(L23m9f|IKAAdfeE zXB3o_E2nbrr^cu5K5m>;RY*GaU8IiS+A60~D@hQRz=={Q1dQ7dcC{69nNood(g) zV|pEGce%14>*(j;K5+jM<)W`yec9~R{%yunJN`%IA@f@7X#kgg$MJQFNOfL> zM_Fiao|}gPiEuzIn+N7w2{Lc^GuA|BIG`~>^fdX}WClpgm%(Vi17vcQXJ07=4JyIP zlgbE>NE%+BIS~qT$$aL6o`{HGMha3S?*NgC5JCAF=V>(!MEqpj+$mc7g;x~EqFXK%=}@&S&I8% zQvi|1UPx5+Fag=!NFhmIRSMElsj5Qe@kpsa(TnY+Z9;N)FfMek<>DlqOh?>5z{If6 zyo@s{{xa_fax3-CrQS#8H;+RxoddD#DaUar(Puodab~A9d*{2&Kk{X2B_R zio1ssiT%Rdy!TBB9`z%FuPAU8JX^0S!-(5?c5o{1IyVgj-7d!Di~ZXXSR!lgT_C-f ztRhhx8EBo%^!FY*!lOzZo=V?G)+tXQkC3}%sd<+xA)AGbDL*>Lrf?2_xR(8&$a>%v zM4g-sL!K_?*Ege)gguA%pOi=K?~jNo_j z>c|as z?|;c#mVYtgiOYWtn2t~nm*rovFmp*1`}(Fs+ksyu$WVDJw`Ym~OTl$&*sCJn%u3*Jllk~hYM69 zX2JP5iISqwJRP=q$efK1Re&IX`RPc>(F8PjP9*~iWWLaa3g`YEr!4JKRdDY@)T-^c zzU*c!Jbv*zSg*NEemydz5g}djn>x}0tqu8~WF8H*2A;v5zRlRuDMna3(0L#e3}chE z8P|B1vukS|vO{M3bs(SPAnrI|)tL}Q`}t#$|6Pju!JJ(_D`V8TqQ8nJM)%~#qLAlF#6qIzzsD9MLfLx8O+GRDBjzhC_QiJ@s-;WC8Np#(MU2Z_H#17_8;6g+KxmHZbp%_917&x*Lvugg1{uS9+9j{eVLDQ{suXZtnb&F!f~f61wywyJjfJgZQm)l?gq;ETDr=HjKNNo~ zRxCl&qy@967vsXnKNwTf`2D|+VJJ0kWPasKGNijtdgKi-WpcoNZU5fsz7v#T%l7ig zjX$ocRi)!_CYf^>)Qg{Hn+67Z89v82^v*F*Mdtm@3b4+mWUaOugIh$)a?bfr8PD@= zEx<~BQscoTa`v#pSyQ$E>~glVRx&U*?6-|Lxo(Sq1g(Y0ea}_{*nzCQ0CH%Z+Yfr| zWqS+nm!mS>0mcIe2UzWlpF6KIU06Okw?w0ipl>``NnkrN2LPc5Y!3c&>&wQ>NBVp> zZ~OL}FXZ^;QO`D*d!?R9p+HOqm?39P#-b62+u;IRg>pv$~?I%P+xOcrgm+$pHx8vPkzIv*2Z(|@5 z$E^W*ndeq{+4b^(6PDba^MJK-uji`Vd$nAh`K=rDy>j)k1J5n$F^;i$J{shPSsFtZ z$L?;vLhfW)FdJc9eVg3P#M)Qo-o?T)%UIvbEMGKrXZuAWdHX6@ZXSB8JVD>1iLotbacvwWcnhzN>|8q&h0sQ$t DtOY01 literal 0 HcmV?d00001 diff --git a/doc/groff.html b/doc/groff.html new file mode 100644 index 0000000..e085b9e --- /dev/null +++ b/doc/groff.html @@ -0,0 +1,24945 @@ + + + + + + +The GNU Troff Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +

    GNU troff

    + + +

    This manual documents GNU troff version 1.23.0. +

    +

    Copyright © 1994–2023 Free Software Foundation, Inc. +

    +
    +

    Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A +copy of the license is included in the section entitled “GNU Free +Documentation License”. +

    + + + + + +
    +

    Table of Contents

    + +
    + + +
    +
    +
    +
    + +

    1 Introduction

    + + +

    GNU roff (or groff) is a programming system for +typesetting documents. It is highly flexible and has been used +extensively for over thirty years. +

    + + + + +
    +
    + +

    1.1 Background

    + + +

    M. Douglas McIlroy, formerly of AT&T Bell Laboratories and present at +the creation of the Unix operating system, offers an authoritative +historical summary. +

    +
    +

    The prime reason for Unix was the desire of Ken [Thompson], Dennis +[Ritchie], and Joe Ossanna to have a pleasant environment for software +development. The fig leaf that got the nod from … +management was that an early use would be to develop a “stand-alone” +word-processing system for use in typing pools and secretarial offices. +Perhaps they had in mind “dedicated”, as distinct from +“stand-alone”; that’s what eventuated in various cases, most notably +in the legal/patent department and in the AT&T CEO’s office. +

    +

    Both those systems were targets of opportunity, not foreseen from the +start. When Unix was up and running on the PDP-11, Joe got wind of +the legal department having installed a commercial word processor. +He went to pitch Unix as an alternative and clinched a trial by +promising to make roff able to number lines by tomorrow in order +to fulfill a patent-office requirement that the commercial system did +not support. +

    +

    Modems were installed so legal-department secretaries could try the +Research machine. They liked it and Joe’s superb customer service. +Soon the legal department got a system of their own. Joe went on to +create nroff and troff. Document preparation became a +widespread use of Unix, but no stand-alone word-processing system was +ever undertaken. +

    + +

    A history relating groff to its predecessors roff, +nroff, and troff is available in the roff(7) +man page. +

    + + +
    +
    +
    + +

    1.2 What Is groff?

    + + + +

    groff (GNU roff) is a typesetting system that reads plain +text input files that include formatting commands to produce output in +PostScript, PDF, HTML, DVI, or other formats, or for display to a +terminal. Formatting commands can be low-level typesetting primitives, +macros from a supplied package, or user-defined macros. All three +approaches can be combined. +

    +

    A reimplementation and extension of the typesetter from AT&T +Unix, groff is present on most POSIX systems owing to +its long association with Unix manuals (including man pages). It and +its predecessor are notable for their production of several best-selling +software engineering texts. groff is capable of producing +typographically sophisticated documents while consuming minimal system +resources. +

    + + +
    +
    +
    + +

    1.3 groff Capabilities

    + + + +

    GNU troff is a typesetting document formatter; it provides a wide +range of low-level text and page operations within the framework of a +programming language. These operations compose to generate footnotes, +tables of contents, mathematical equations, diagrams, multi-column text, +and other elements of typeset works. Here is a survey of formatter +features; all are under precise user control. +

    +
      +
    • text filling, breaking, alignment to the left or right margin; centering + +
    • adjustment of inter-word space size to justify text, and of +inter-sentence space size to suit local style conventions + +
    • automatic and manual determination of hyphenation break points + +
    • pagination + +
    • selection of any font available to the output device + +
    • adjustment of type size and vertical spacing (or “leading”) + +
    • configuration of line length and indentation amounts; columnation + +
    • drawing of geometric primitives (lines, arcs, polygons, circles, +…) + +
    • setup of stroke and fill colors (where supported by the output +device) + +
    • embedding of hyperlinks, images, document metadata, and other inclusions +(where supported by the output device) +
    + + + +
    +
    +
    + +

    1.4 Macro Packages

    + + + +

    Elemental typesetting functions can be be challenging to use directly +with complex documents. A macro facility specifies how certain +routine operations, such as starting paragraphs, or printing headers and +footers, should be performed in terms of those low-level instructions. +Macros can be specific to one document or collected together into a +macro package for use by many. Several macro packages available; +the most widely used are provided with groff. They are +man, mdoc, me, mm, mom, and +ms. +

    + + +
    +
    +
    + +

    1.5 Preprocessors

    + + +

    An alternative approach to complexity management, particularly when +constructing tables, setting mathematics, or drawing diagrams, lies in +preprocessing. A preprocessor employs a domian-specific language +to ease the generation of tables, equations, and so forth in terms that +are convenient for human entry. Each preprocessor reads a document and +translates the parts of it that apply to it into GNU troff input. +Command-line options to groff tell it which preprocessors to +use. +

    +

    groff provides preprocessors for laying out tables +(gtbl), typesetting equations (geqn), drawing +diagrams (gpic and ggrn), inserting bibliographic +references (grefer), and drawing chemical structures +(gchem). An associated program that is useful when dealing +with preprocessors is gsoelim.1 +

    +

    groff also supports grap, a preprocessor for drawing +graphs. A free implementation of it can be obtained separately. +

    +

    Unique to groff is the preconv preprocessor that enables +groff to handle documents in a variety of input encodings. +

    +

    Other preprocessors exist, but no free implementations +are known. An example is ideal, which draws diagrams using a +mathematical constraint language. +

    + + +
    +
    +
    + +

    1.6 Output Devices

    + + + + +

    GNU troff’s output is in a device-independent page description +language, which is then read by an output driver that translates +this language into a file format or byte stream that a piece of +(possibly emulated) hardware understands. groff features output +drivers for PostScript devices, terminal emulators (and other simple +typewriter-like machines), X11 (for previewing), TeX DVI, HP +LaserJet 4/PCL5 and Canon LBP printers (which use CaPSL), +HTML, XHTML, and PDF. +

    + + +
    +
    +
    + +

    1.7 Installation

    + + +

    Locate installation instructions in the files INSTALL, +INSTALL.extra, and INSTALL.REPO in the groff source +distribution. Being a GNU project, groff supports the familiar +‘./configure && make’ command sequence. +

    + + +
    +
    +
    + +

    1.8 Conventions Used in This Manual

    + +

    We apply the term “groff” to the language documented here, the GNU +implementation of the overall system, the project that develops that +system, and the command of that name. In the first sense, groff +is an extended dialect of the roff language, for which many +similar implementations exist. +

    +

    The roff language features several major categories for which +many items are predefined. Presentations of these items feature the +form in which the item is most commonly used on the left, and, aligned +to the right margin, the name of the category in brackets. +

    +
    +
    Register: \n[example]
    +

    The register ‘example’ is one that that groff doesn’t +predefine. You can create it yourself, though; see Setting Registers. +

    + +

    To make this document useful as a reference and not merely amiable +bedtime reading, we tend to present these syntax items in exhaustive +detail when they arise. References to topics discussed later in the +text are frequent; skip material you don’t understand yet. +

    +

    We use Texinfo’s “result” (⇒) and error→ notations to +present output written to the standard output and standard error +streams, respectively. Diagnostic messages from the GNU troff +formatter and other programs are examples of the latter, but the +formatter can also be directed to write user-specified messages to the +standard error stream. The notation then serves to identify the +output stream and does not necessarily mean that an error has +occurred.2 +

    +
    +
    $ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d'
    +    ⇒ Twelve o'clock and
    +$ echo '.tm all is well.' | groff > /dev/null
    +    error→ all is well.
    +
    + +

    Sometimes we use ⇒ somewhat abstractly to represent formatted +text that you will need to use a PostScript or PDF viewer program (or a +printer) to observe. While arguably an abuse of notation, we think this +preferable to requiring the reader to understand the syntax of these +page description languages. +

    +

    We also present diagnostic messages in an abbreviated form, often +omitting the name of the program issuing them, the input file name, and +line number or other positional information when such data do not serve +to illuminate the topic under discussion. +

    +

    Most examples are of roff language input that would be placed in +a text file. Occasionally, we start an example with a ‘$’ +character to indicate a shell prompt, as seen above. +

    +

    You are encouraged to try the examples yourself, and to alter them to +better learn groff’s behavior. Our examples frequently need to +direct the formatter to set a line length (with ‘.ll’) that will +fit within the page margins of this manual. We mention this so that you +know why it is there before we discuss the ll request +formally.3 +

    + + +
    +
    +
    + +

    1.9 Credits

    + + +

    We adapted portions of this manual from existing documents. James +Clark’s man pages were an essential resource; we have updated them in +parallel with the development of this manual. We based the tutorial for +macro users on Eric Allman’s introduction to his me macro package +(which we also provide, little altered from 4.4BSD). Larry Kollar +contributed much of the material on the ms macro package. +

    + + +
    +
    +
    +
    + +

    2 Invoking groff

    + + + +

    This chapter focuses on how to invoke the groff front end. This +front end takes care of the details of constructing the pipeline among +the preprocessors, gtroff and the postprocessor. +

    +

    It has become a tradition that GNU programs get the prefix ‘g’ to +distinguish them from their original counterparts provided by the host +(see Environment). Thus, for example, geqn is GNU +eqn. On operating systems like GNU/Linux or the Hurd, which +don’t contain proprietary versions of troff, and on +MS-DOS/MS-Windows, where troff and associated programs are not +available at all, this prefix is omitted since GNU troff is the +only incarnation of troff used. Exception: ‘groff’ is never +replaced by ‘roff’. +

    +

    In this document, we consequently say ‘gtroff’ when talking about +the GNU troff program. All other implementations of troff are called AT&T +troff, which is the common origin of almost all troff +implementations4 (with more or less compatible changes). Similarly, we say +‘gpic’, ‘geqn’, and so on. +

    + + + + +
    +
    + +

    2.1 Options

    + + + + + + + + + + + + + +

    groff normally runs the gtroff program and a +postprocessor appropriate for the selected device. The default device +is ‘ps’ (but it can be changed when groff is configured and +built). It can optionally preprocess with any of gpic, +geqn, gtbl, ggrn, grap, gchem, +grefer, gsoelim, or preconv. +

    +

    This section documents only options to the groff front end. Many +of the arguments to groff are passed on to gtroff; +therefore, those are also included. Arguments to preprocessors and +output drivers can be found in the man pages gpic(1), +geqn(1), gtbl(1), ggrn(1), +grefer(1), gchem(1), gsoelim(1), +preconv(1), grotty(1), grops(1), +gropdf(1), grohtml(1), grodvi(1), +grolj4(1), grolbp(1), and gxditview(1). +

    +

    The command-line format for groff is: +

    +
    +
    groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -dcs ] [ -Darg ]
    +      [ -ffam ] [ -Fdir ] [ -Idir ] [ -Karg ]
    +      [ -Larg ] [ -mname ] [ -Mdir ] [ -nnum ]
    +      [ -olist ] [ -Parg ] [ -rcn ] [ -Tdev ]
    +      [ -wname ] [ -Wname ] [ files… ]
    +
    + +

    The command-line format for gtroff is as follows. +

    +
    +
    gtroff [ -abcivzCERU ] [ -dcs ] [ -ffam ] [ -Fdir ]
    +       [ -mname ] [ -Mdir ] [ -nnum ] [ -olist ]
    +       [ -rcn ] [ -Tname ] [ -wname ] [ -Wname ]
    +       [ files… ]
    +
    + +

    Obviously, many of the options to groff are actually passed on to +gtroff. +

    +

    Options without an argument can be grouped behind a +single -. A filename of - denotes the +standard input. Whitespace is permitted between an option and its +argument. +

    +

    The grog command can be used to guess the correct groff +command to format a file. See its man page grog(1); type +‘man grog’ at the command line to view it. +

    +

    groff’s command-line options are as follows. +

    + +
    +
    -a
    +

    Generate a plain text approximation of the typeset output. The +read-only register .A is set to 1. See Built-in Registers. This option produces a sort of abstract preview of the +formatted output. +

    +
      +
    • Page breaks are marked by a phrase in angle brackets; for example, +‘<beginning of page>’. + +
    • Lines are broken where they would be in the formatted output. + +
    • A horizontal motion of any size is represented as one space. Adjacent +horizontal motions are not combined. Inter-sentence space nodes (those +arising from the second argument to the ss request) are not +represented. + +
    • Vertical motions are not represented. + +
    • Special characters are rendered in angle brackets; for example, the +default soft hyphen character appears as ‘<hy>’. +
    + +

    The above description should not be considered a specification; the +details of -a output are subject to change. +

    +
    +
    -b
    +

    Write a backtrace reporting the state of gtroff’s input parser +to the standard error stream with each diagnostic message. The line +numbers given in the backtrace might not always be correct, because +gtroff’s idea of line numbers can be confused by requests that +append to +macros. +

    +
    +
    -c
    +

    Start with color output disabled. +

    +
    +
    -C
    +

    Enable AT&T troff compatibility mode; implies -c. +See Implementation Differences, for the list of incompatibilities +between groff and AT&T troff. +

    +
    +
    -dctext
    +
    -dstring=text
    +

    Define roff string c or string as t or +text. c must be one character; string can be +of arbitrary length. Such string assignments happen before any macro +file is loaded, including the startup file. Due to getopt_long +limitations, c cannot be, and string cannot contain, an +equals sign, even though that is a valid character in a roff +identifier. +

    +
    +
    -Denc
    +

    Set fallback input encoding used by preconv to enc; +implies -k. +

    +
    +
    -e
    +

    Run geqn preprocessor. +

    +
    +
    -E
    +

    Inhibit gtroff error messages. This option does not +suppress messages sent to the standard error stream by documents or +macro packages using tm or related requests. +

    +
    +
    -ffam
    +

    Use fam as the default font family. See Font Families. +

    +
    +
    -Fdir
    +

    Search in directory dir for the selected output device’s +directory of device and font description files. See the description of +GROFF_FONT_PATH in Environment below for the default search +locations and ordering. +

    +
    +
    -g
    +

    Run ggrn preprocessor. +

    +
    +
    -G
    +

    Run grap preprocessor; implies -p. +

    +
    +
    -h
    +

    Display a usage message and exit. +

    +
    +
    -i
    +

    Read the standard input after all the named input files have been +processed. +

    +
    +
    -Idir
    +

    Search the directory dir for files named in several contexts; +implies -g and -s. +

    +
      +
    • gsoelim replaces so requests with the contents of their +file name arguments. + +
    • gtroff searches for files named as operands in its command +line and as arguments to psbb, so, and soquiet +requests. + +
    • Output drivers may search for files; for instance, grops looks +for files named in ‘\X'ps: import '’, ‘\X'ps: file +'’, and ‘\X'pdf: pdfpic '’ device control +escape sequences. +
    + +

    This option may be specified more than once; the directories are +searched in the order specified. If you want to search the current +directory before others, add ‘-I .’ at the desired place. The +current working directory is otherwise searched last. -I works +similarly to, and is named for, the “include” option of Unix C +compilers. +

    +

    -I options are passed to gsoelim, gtroff, +and output drivers; with the flag letter changed to -M, they +are also passed to ggrn. +

    +
    +
    -j
    +

    Run gchem preprocessor. Implies -p. +

    +
    +
    -k
    +

    Run preconv preprocessor. Refer to its man page for its +behavior if neither of groff’s -K or -D +options is also specified. +

    +
    +
    -Kenc
    +

    Set input encoding used by preconv to enc; implies +-k. +

    +
    +
    -l
    +

    Send the output to a spooler for printing. The print directive +in the device description file specifies the default command to be used; +see Device and Font Description Files. +See options -L and -X. +

    +
    +
    -Larg
    +

    Pass arg to the print spooler program. If multiple args are +required, pass each with a separate -L option. groff +does not prefix an option dash to arg before passing it to the +spooler program. +

    +
    +
    -mname
    +

    Process the file name.tmac prior to any input files. +If not found, tmac.name is attempted. name +(in both arrangements) is presumed to be a macro file; see the +description of GROFF_TMAC_PATH in Environment below for the +default search locations and ordering. This option and its argument are +also passed to geqn, grap, and ggrn. +

    +
    +
    -Mdir
    +

    Search directory dir for macro files; see the description +of GROFF_TMAC_PATH in Environment below for the default +search locations and ordering. This option and its argument are also +passed to geqn, grap, and ggrn. +

    +
    +
    -nnum
    +

    Number the first page num. +

    +
    +
    -N
    +

    Prohibit newlines between eqn delimiters: pass -N to +geqn. +

    +
    +
    -olist
    +

    Output only pages in list, which is a comma-separated list of page +ranges; ‘n’ means page n, ‘m-n’ +means every page between m and n, ‘-n’ means +every page up to n, ‘n-’ means every page from +n on. gtroff stops processing and exits after +formatting the last page enumerated in list. +

    +
    +
    -p
    +

    Run gpic preprocessor. +

    +
    +
    -Parg
    +

    Pass arg to the postprocessor. If multiple args are +required, pass each with a separate -P option. groff +does not prefix an option dash to arg before passing it to the +postprocessor. +

    +
    +
    -rcnumeric-expression
    +
    -rregister=expr
    +

    Set roff register c or register to the value +numeric-expression (see Numeric Expressions). +c must be one character; register can be of arbitrary +length. Such register assignments happen before any macro file is +loaded, including the startup file. Due to getopt_long +limitations, c cannot be, and register cannot contain, +an equals sign, even though that is a valid character in a roff +identifier. +

    +
    +
    -R
    +

    Run grefer preprocessor. No mechanism is provided for passing +arguments to grefer because most grefer options have +equivalent language elements that can be specified within the document. +

    + + +

    gtroff also accepts a -R option, which is not +accessible via groff. This option prevents the loading of the +troffrc and troffrc-end files. +

    +
    +
    -s
    +

    Run gsoelim preprocessor. +

    +
    +
    -S
    +
    + + + + + +

    Operate in “safer” mode; see -U below for its opposite. For +security reasons, safer mode is enabled by default. +

    +
    +
    -t
    +

    Run gtbl preprocessor. +

    +
    +
    -Tdev
    +

    Direct gtroff to format the input for the output device +dev. groff then calls an output driver to convert +gtroff’s output to a form appropriate for dev. The +following output devices are available. +

    +
    +
    ps
    +

    For PostScript printers and previewers. +

    +
    +
    pdf
    +

    For PDF viewers or printers. +

    +
    +
    dvi
    +

    For TeX DVI format. +

    +
    +
    X75
    +

    For a 75dpi X11 previewer. +

    +
    +
    X75-12
    +

    For a 75dpi X11 previewer with a 12-point base font in the +document. +

    +
    +
    X100
    +

    For a 100dpi X11 previewer. +

    +
    +
    X100-12
    +

    For a 100dpi X11 previewer with a 12-point base font in the +document. +

    +
    +
    ascii
    +
    + + + + +

    For typewriter-like devices using the (7-bit) ASCII +(ISO 646) character set. +

    +
    +
    latin1
    +
    + + +

    For typewriter-like devices that support the Latin-1 +(ISO 8859-1) character set. +

    +
    +
    utf8
    +
    + +

    For typewriter-like devices that use the Unicode (ISO 10646) +character set with UTF-8 encoding. +

    +
    +
    cp1047
    +
    + + + + + + +

    For typewriter-like devices that use the EBCDIC encoding IBM +code page 1047. +

    +
    +
    lj4
    +

    For HP LaserJet4-compatible (or other PCL5-compatible) printers. +

    +
    +
    lbp
    +

    For Canon CaPSL printers (LBP-4 and LBP-8 series laser +printers). +

    + + + +
    +
    html
    +
    xhtml
    +

    To produce HTML and XHTML output, respectively. +This driver consists of two parts, a preprocessor +(pre-grohtml) and a postprocessor (post-grohtml). +

    +
    + + + +

    The predefined GNU troff string .T contains the name of +the output device; the read-only register .T is set to 1 if +this option is used (which is always true if groff is used to +call GNU troff). See Built-in Registers. +

    +

    The postprocessor to be used for a device is specified by the +postpro command in the device description file. (See Device and Font Description Files.) This can be overridden with the +-X option. +

    +
    +
    -U
    +
    +

    Operate in unsafe mode, which enables the open, +opena, pi, pso, and sy requests. These +requests are disabled by default because they allow an untrusted input +document to write to arbitrary file names and run arbitrary commands. +This option also adds the current directory to the macro package search +path; see the -m option above. -U is passed to +gpic and gtroff. +

    +
    +
    -v
    +

    Write version information for groff and all programs run by it +to the standard output stream; that is, the given command line is +processed in the usual way, passing -v to the formatter and any +pre- or postprocessors invoked. +

    +
    +
    -V
    +

    Output the pipeline that would be run by groff +(as a wrapper program) to the standard output stream, but do not execute +it. If given more than once, the pipeline is both written to the +standard error stream and run. +

    +
    +
    -wcategory
    +

    Enable warnings in category. Categories are listed in +Warnings. +

    +
    +
    -Wcategory
    +

    Inhibit warnings in category. Categories are listed in +Warnings. +

    +
    +
    -X
    +

    Use gxditview instead of the usual postprocessor to (pre)view +a document on an X11 display. Combining this option with +-Tps uses the font metrics of the PostScript device, whereas +the -TX75 and -TX100 options use the metrics of X11 +fonts. +

    +
    +
    -z
    +

    Suppress formatted output from gtroff. +

    +
    +
    -Z
    +

    Disable postprocessing. gtroff output will appear on the +standard output stream (unless suppressed with -z; see +gtroff Output for a description of this format. +

    +
    + + + +
    +
    +
    + +

    2.2 Environment

    + + + +

    There are also several environment variables (of the operating system, +not within gtroff) that can modify the behavior of groff. +

    +
    +
    GROFF_BIN_PATH
    +

    This search path, followed by PATH, is used for commands executed +by groff. +

    +
    +
    GROFF_COMMAND_PREFIX
    +
    + +

    If this is set to X, then groff runs +Xtroff instead of gtroff. This also applies +to tbl, pic, eqn, grn, +chem, refer, and soelim. It does not +apply to grops, grodvi, grotty, +pre-grohtml, post-grohtml, preconv, +grolj4, gropdf, and gxditview. +

    +

    The default command prefix is determined during the installation +process. If a non-GNU troff system is found, prefix ‘g’ is +used, none otherwise. +

    +
    +
    GROFF_ENCODING
    +

    The value of this variable is passed to the preconv +preprocessor’s -e option to select the character encoding of +input files. This variable’s existence implies the groff option +-k. If set but empty, groff calls preconv +without an -e option. groff’s -K option +overrides GROFF_ENCODING. See the preconv(7) man page; +type ‘man preconv’ at the command line to view it. +

    +
    +
    GROFF_FONT_PATH
    +

    A list of directories in which to seek the selected output device’s +directory of device and font description files. GNU troff +will search directories given as arguments to any specified -F +options before these, and a built-in list of directories after them. +See Font Directories and the troff(1) or +gtroff(1) man pages. +

    +
    +
    GROFF_TMAC_PATH
    +

    A list of directories in which to seek macro files. GNU troff +will search directories given as arguments to any specified -M +options before these, and a built-in list of directories after them. +See Macro Directories and the troff(1) or +gtroff(1) man pages. +

    +
    +
    GROFF_TMPDIR
    +
    +

    The directory in which groff creates temporary files. If this is +not set and TMPDIR is set, temporary files are created in that +directory. Otherwise temporary files are created in a system-dependent +default directory (on Unix and GNU/Linux systems, this is usually +/tmp). grops, grefer, pre-grohtml, and +post-grohtml can create temporary files in this directory. +

    +
    +
    GROFF_TYPESETTER
    +

    Sets the default output device. If empty or not set, a build-time +default (often ps) is used. The -Tdev option +overrides GROFF_TYPESETTER. +

    +
    +
    SOURCE_DATE_EPOCH
    +

    A timestamp (expressed as seconds since the Unix epoch) to use as the +output creation timestamp in place of the current time. The time is +converted to human-readable form using localtime(3) when the +formatter starts up and stored in registers usable by documents and +macro packages (see Built-in Registers). +

    +
    +
    TZ
    +

    The time zone to use when converting the current time (or value of +SOURCE_DATE_EPOCH) to human-readable form; see +tzset(3). +

    +
    + +

    MS-DOS and MS-Windows ports of groff use semicolons, rather than +colons, to separate the directories in the lists described above. +

    + + +
    +
    +
    + +

    2.3 Macro Directories

    + + + + + +

    A macro file must have a name in the form name.tmac or +tmac.name and be placed in a tmac directory to be +found by the -mname command-line option.5 + + + + + + + + + + +Together, these directories constitute the tmac path. Each +directory is searched in the following order until the desired macro +file is found or the list is exhausted. +

    +
      +
    • Directories specified with GNU troff’s or groff’s +-M command-line option. + +
    • +Directories listed in the GROFF_TMAC_PATH environment variable. + +
    • + + + + + +The current working directory (only if in unsafe mode using the +-U command-line option). + +
    • + +The user’s home directory, HOME. + +
    • + + + +A platform-dependent directory, a site-local (platform-independent) +directory, and the main tmac directory. The locations +corresponding to your installation are listed in section “Environment” +of gtroff(1). If not otherwise configured, they are as +follows. + +
      +
      /usr/local/lib/groff/site-tmac
      +/usr/local/share/groff/site-tmac
      +/usr/local/share/groff/1.23.0/tmac
      +
      + +

      The foregoing assumes that the version of groff is 1.23.0, and +that the installation prefix was /usr/local. It is possible to +fine-tune these locations during the source configuration process. +

    + + + +
    +
    +
    + +

    2.4 Font Directories

    + + + + + +

    groff enforces few restrictions on how font description files are +named. For its family/style mechanism to work (see Font Families), +the names of fonts within a family should start with the family name, +followed by the style. For example, the Times family uses ‘T’ for +the family name and ‘R’, ‘B’, ‘I’, and ‘BI’ to +indicate the styles ‘roman’, ‘bold’, ‘italic’, and ‘bold italic’, +respectively. Thus the final font names are ‘TR’, ‘TB’, +‘TI’, and ‘TBI’. +

    + + +

    Font description files are kept in font directories, which +together constitute the font path. The search procedure +always appends the directory devname, where name is +the name of the output device. Assuming TeX DVI output, and +/foo/bar as a font directory, the font description files for +grodvi must be in /foo/bar/devdvi. +Each directory in the font path is searched in the following order until +the desired font description file is found or the list is exhausted. +

    +
      +
    • Directories specified with GNU troff’s or groff’s +-f command-line option. All output drivers (and some +preprocessors) support this option as well, because they require +information about the glyphs to be rendered in the document. + +
    • +Directories listed in the GROFF_FONT_PATH environment variable. + +
    • + +A site-local directory and the main font description directory. +The locations corresponding to your installation are listed in section +“Environment” of gtroff(1). If not otherwise configured, +they are as follows. + +
      +
      /usr/local/share/groff/site-font
      +/usr/local/share/groff/1.23.0/font
      +
      + +

      The foregoing assumes that the version of groff is 1.23.0, and +that the installation prefix was /usr/local. It is possible to +fine-tune these locations during the source configuration process. +

    + + + +
    +
    +
    + +

    2.5 Paper Format

    + + + + + + + + +

    In groff, the page dimensions for the formatter GNU troff +and for output devices are handled separately. See Page Layout, for +vertical manipulation of the page size, and See Line Layout, for +horizontal changes. + + +The papersize macro package, normally loaded by troffrc at +startup, provides an interface for configuring page dimensions by +convenient names, like ‘letter’ or ‘a4’; see +groff_tmac(5). The default used by the formatter depends on +its build configuration, but is usually one of the foregoing, as +geographically appropriate. +

    +

    It is up to each macro package to respect the page dimensions configured +in this way. +

    +

    For each output device, the size of the output medium can be set in its +DESC file. Most output drivers also recognize a command-line +option -p to override the default dimensions and an option +-l to use landscape orientation. See DESC File Format, for +a description of the papersize keyword, which takes an argument +of the same form as -p. The output driver’s man page, such as +grops(1), may also be helpful. +

    +

    groff uses the command-line option -P to pass options to +postprocessors; for example, use the following for PostScript output on +A4 paper in landscape orientation. +

    +
    +
    groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
    +
    + + + +
    +
    +
    + +

    2.6 Invocation Examples

    + + + +

    roff systems are best known for formatting man pages. Once a +man librarian program has located a man page, it may execute +a groff command much like the following. +

    +
    +
    groff -t -man -Tutf8 /usr/share/man/man1/groff.1
    +
    + +

    The librarian will also pipe the output through a pager, which might not +interpret the SGR terminal escape sequences groff emits for +boldface, underlining, or italics; see the grotty(1) man page +for a discussion. +

    +

    To process a roff input file using the preprocessors +gtbl and gpic and the me macro package in the +way to which AT&T troff users were accustomed, one would type (or +script) a pipeline. +

    +
    +
    gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
    +
    + +

    Using groff, this pipe can be shortened to an equivalent +command. +

    +
    +
    groff -p -t -me -T utf8 foo.me
    +
    + +

    An even easier way to do this is to use grog to guess the +preprocessor and macro options and execute the result by using the +command substitution feature of the shell. +

    +
    +
    $(grog -Tutf8 foo.me)
    +
    + +

    Each command-line option to a postprocessor must be specified with any +required leading dashes ‘-’ +because groff passes the arguments as-is to the postprocessor; +this permits arbitrary arguments to be transmitted. For example, to +pass a title to the gxditview postprocessor, +the shell commands +

    +
    +
    groff -X -P -title -P 'trial run' mydoc.t
    +
    + +

    and +

    +
    +
    groff -X -Z mydoc.t | gxditview -title 'trial run' -
    +
    + +

    are equivalent. +

    + + + +
    +
    +
    +
    + +

    3 Tutorial for Macro Users

    + + + + + +

    Most users of the roff language employ a macro package to format +their documents. Successful macro packages ease the composition +process; their users need not have mastered the full formatting +language, nor understand features like diversions, traps, and +environments. This chapter aims to familiarize you with basic concepts +and mechanisms common to many macro packages (like “displays”). If +you prefer a meticulous and comprehensive presentation, try GNU troff Reference instead. +

    + + + + +
    +
    + +

    3.1 Basics

    + + + +

    Let us first survey some basic concepts necessary to use a macro package +fruitfully.6 +References are made throughout to more detailed information. +

    +

    GNU troff reads an input file prepared by the user and outputs a +formatted document suitable for publication or framing. The input +consists of text, or words to be printed, and embedded commands +(requests and escape sequences), which tell GNU +troff how to format the output. See Formatter Instructions. +

    +

    The word argument is used in this chapter to mean a word or +number that appears on the same line as a request, and which modifies +the meaning of that request. For example, the request +

    +
    +
    .sp
    +
    + +

    spaces one line, but +

    +
    +
    .sp 4
    +
    + +

    spaces four lines. The number 4 is an argument to the sp +request, which says to space four lines instead of one. Arguments are +separated from the request and from each other by spaces (not +tabs). See Invoking Requests. +

    +

    The primary function of GNU troff is to collect words from input +lines, fill output lines with those words, adjust the line to the +right-hand margin by widening spaces, and output the result. For +example, the input: +

    +
    +
    Now is the time
    +for all good men
    +to come to the aid
    +of their party.
    +Four score and seven
    +years ago, etc.
    +
    + +

    is read, packed onto output lines, and justified to produce: +

    +
    +
      ⇒ Now is the time for all good men to come to the aid of
    +  ⇒ their party.  Four score and seven years ago, etc.
    +
    + +

    Sometimes a new output line should be started even though the current +line is not yet full—for example, at the end of a paragraph. To do +this it is possible to force a break, starting a new output +line. Some requests cause a break automatically, as do (normally) blank +input lines and input lines beginning with a space or tab. +

    +

    Not all input lines are text lines—words to be formatted. +Some are control lines that tell a macro package (or GNU +troff directly) how to format the text. Control lines start with +a dot (‘.’) or an apostrophe (‘'’) as the first character, and +can be followed by a macro call. +

    +

    The formatter also does more complex things, such as automatically +numbering pages, skipping over page boundaries, putting footnotes in the +correct place, and so forth. +

    +

    Here are a few hints for preparing text for input to GNU troff. +

    +
      +
    • First, keep the input lines short. Short input lines are easier to +edit, and GNU troff packs words onto longer lines anyhow. + +
    • In keeping with this, it is helpful to begin a new line after every +comma or phrase, since common corrections are to add or delete sentences +or phrases. + +
    • End each sentence with two spaces—or better, start each sentence on a +new line. GNU troff recognizes characters that usually end a +sentence, and inserts inter-sentence space accordingly. + +
    • Do not hyphenate words at the end of lines—GNU troff is smart +enough to hyphenate words as needed, but is not smart enough to take +hyphens out and join a word back together. Also, words such as +“mother-in-law” should not be broken over a line, since then a space +can occur where not wanted, such as “mother- in-law”. +
    + +

    We offer further advice in Input Conventions. +

    + + +

    GNU troff permits alteration of the distance between lines of +text. This is termed vertical spacing and is expressed in the +same units as the type size—the point. The default is 10-point type +on 12-point spacing. To get double-spaced text you would set +the vertical spacing to 24 points. Some, but not all, macro packages +expose a macro or register to configure the vertical spacing. +

    +

    A number of requests allow you to change the way the output is arranged +on the page, sometimes called the layout of the output page. +Most macro packages don’t supply macros for performing these (at least +not without performing other actions besides), as they are such basic +operations. The macro packages for writing man pages, man and +mdoc, don’t encourage explicit use of these requests at all. +

    + +

    The request ‘.sp N leaves N lines of blank +space. N can be omitted (skipping a single line) or can +be of the form Ni (for N inches) or Nc (for +N centimeters). For example, the input: +

    +
    +
    .sp 1.5i
    +My thoughts on the subject
    +.sp
    +
    + +

    leaves one and a half inches of space, followed by the line “My +thoughts on the subject”, followed by a single blank line (more +measurement units are available; see Measurements). +

    +

    If you seek precision in spacing, be advised when using a macro package +that it might not honor sp requests as you expect; it can use a +formatter feature called no-space mode to prevent excess space +from accumulating. Macro packages typically offer registers to control +spacing between paragraphs, before section headings, and around displays +(discussed below); use these facilities preferentially. +See Manipulating Spacing. +

    + + +

    Text lines can be centered by using the ce request. The line +after ce is centered (horizontally) on the page. To center more +than one line, use ‘.ce N (where N is the number +of lines to center), followed by the N lines. To center many +lines without counting them, type: +

    +
    +
    .ce 1000
    +lines to center
    +.ce 0
    +
    + +

    The ‘.ce 0 request tells GNU troff to center zero more +lines, in other words, stop centering. +

    + + + + +

    GNU troff also offers the rj request for right-aligning +text. It works analogously to ce and is convenient for setting +epigraphs. +

    + + +

    The bp request starts a new page; this necessarily implies an +ordinary (line) break. +

    + + +

    All of these requests cause a break; that is, they always start a new +line. To start a new line without performing any other action, use +br. If you invoke them with the apostrophe ‘'’, the +no-break control character, the (initial) break they normally +perform is suppressed. ‘'br’ does nothing. +

    + + +
    +
    +
    + +

    3.2 Common Features

    + + + +

    GNU troff provides low-level operations for formatting a +document. Many routine operations are undertaken in nearly all +documents that require a series of such primitive operations to be +performed. These common tasks are grouped into macros, which +are then collected into a macro package. +

    +

    Macro packages come in two varieties: “major” or “full-service” +ones that manage page layout, and “minor” or “auxiliary” ones that +do not, instead fulfilling narrow, specific tasks. Find a list in the +groff_tmac(5) man page. Type ‘man groff_tmac’ at the +command line to view it. +

    +

    We survey several capabilities of full-service macro package below. +Each package employs its own macros to exercise them. For details, +consult its man page or, for ms, see ms. +

    + + + +
    +
    + +

    3.2.1 Paragraphs

    + + +

    Paragraphs can be separated and indented in various ways. Some start +with a blank line and have a first-line indentation, like most of the +ones in this manual. Block paragraphs omit the indentation. +

    +
    +
      ⇒ Some  men  look  at constitutions with sanctimonious
    +  ⇒ reverence,  and  deem  them  like  the  ark  of  the
    +  ⇒ covenant, too sacred to be touched.
    +
    + + + + +

    We also frequently encounter tagged paragraphs, which begin +with a tag or label at the left margin and indent the remaining text. +

    +
    +
      ⇒ one  This  is the first paragraph.  Notice how the
    +  ⇒      first line of the resulting  paragraph  lines
    +  ⇒      up with the other lines in the paragraph.
    +
    + +

    If the tag is too wide for the indentation, the line is broken. +

    +
    +
      ⇒ longlabel
    +  ⇒      The  label does not align with the subsequent
    +  ⇒      lines, but they align with each other.
    +
    + +

    A variation of the tagged paragraph is the itemized or enumerated +paragraph, which might use punctuation or a digit for a tag, +respectively. These are frequently used to construct lists. +

    +
    +
      ⇒ o    This  list  item  starts with a bullet.  When
    +  ⇒      producing output for a device using the ASCII
    +  ⇒      character set, an 'o' is formatted instead.
    +
    + +

    Often, use of the same macro without a tag continues such a discussion. +

    +
    +
      ⇒ -xyz  This option is recognized but ignored.
    +  ⇒
    +  ⇒       It had a security hole that we don't discuss.
    +
    + + +
    +
    +
    + +

    3.2.2 Sections and Chapters

    + +

    The simplest kind of section heading is unnumbered, set in a bold or +italic style, and occupies a line by itself. Others possess +automatically numbered multi-level headings and/or different typeface +styles or sizes at different levels. More sophisticated macro packages +supply macros for designating chapters and appendices. +

    + +
    +
    +
    + +

    3.2.3 Headers and Footers

    + +

    Headers and footers occupy the top and bottom of +each page, respectively, and contain data like the page number and the +article or chapter title. Their appearance is not affected by the +running text. Some packages allow for different titles on even- and +odd-numbered pages (for printed, bound material). +

    +

    Headers and footers are together called titles, and comprise +three parts: left-aligned, centered, and right-aligned. A ‘%’ +character appearing anywhere in a title is automatically replaced by the +page number. See Page Layout. +

    + +
    +
    +
    + +

    3.2.4 Page Layout

    + +

    Most macro packages let the user specify the size of the page margins. +The top and bottom margins are typically handled differently than the +left and right margins; the latter two are derived from the +page offset, indentation, and line length. +See Line Layout. Commonly, packages support registers to tune these +values. +

    + +
    +
    +
    + +

    3.2.5 Displays and Keeps

    + + +

    Displays are sections of text set off from the surrounding +material (typically paragraphs), often differing in indentation, and/or +spacing. Tables, block quotations, and figures are displayed. +Equations and code examples, when not much shorter than an output line, +often are. Lists may or may not be. Packages for setting man pages +support example displays but not keeps. +

    + +

    A keep is a group of output lines, often a display, that is +formatted on a single page if possible; it causes a page break to happen +early so as to not interrupt the kept material. +

    + + +

    Floating keeps can move, or “float”, relative to the text +around them in the input. They are useful for displays that are +captioned and referred to by name, as with “See figure 3”. +Depending on the package, a floating keep appears at the bottom of the +current page if it fits, and at the top of the next otherwise. +Alternatively, floating keeps might be deferred to the end of a section. +Using a floating keep can avoid the large vertical spaces that may +precede a tall keep of the ordinary sort when it won’t fit on the page. +

    + +
    +
    +
    + +

    3.2.6 Footnotes and Endnotes

    + + + +

    Footnotes and endnotes are forms of delayed +formatting. They are recorded at their points of relevance in +the input, but not formatted there. Instead, a mark cues the +reader to check the “foot”, or bottom, of the current page, or in the +case of endnotes, an annotation list later in the document. Macro +packages that support these features also supply a means of +automatically numbering either type of annotation. +

    + +
    +
    +
    + +

    3.2.7 Table of Contents

    + + + +

    A package may handle a table of contents by directing section +heading macros to save section heading text and the page number where it +occurs for use in a later entry for a table of contents. It +writes the collected entries at the end of the document, once all are +known, upon request. A row of dots (a leader) bridges the +text on the left with its location on the right. Other collections +might work in this manner, providing lists of figures or tables. +

    +

    A table of contents is often found at the end of a GNU troff +document because the formatter processes the document in a single pass. +The gropdf output driver supports a PDF feature that relocates +pages at the time the document is rendered; see the gropdf(1) +man page. Type ‘man gropdf’ at the command line to view it. +

    + +
    +
    +
    + +

    3.2.8 Indexing

    + + + +

    An index is similar to a table of contents, in that entry labels and +locations must be collected, but poses a greater challenge because it +needs to be sorted before it is output. Here, processing the document +in multiple passes is inescapable, and tools like the makeindex +program are necessary. +

    + +
    +
    +
    + +

    3.2.9 Document Formats

    + + +

    Some macro packages supply stock configurations of certain documents, +like business letters and memoranda. These often also have provision +for a cover sheet, which may be rigid in its format. With +these features, it is even more important to use the package’s macros in +preference to the formatter requests presented earlier, where possible. +

    + +
    +
    +
    + +

    3.2.10 Columnation

    + +

    Macro packages apart from man and mdoc for man page +formatting offer a facility for setting multiple columns on the page. +

    + +
    +
    +
    + +

    3.2.11 Font and Size Changes

    + +

    The formatter’s requests and escape sequences for setting the typeface +and size are not always intuitive, so all macro packages provide macros +to make these operations simpler. They also make it more convenient to +change typefaces in the middle of a word and can handle italic +corrections automatically. See Italic Corrections. +

    + +
    +
    +
    + +

    3.2.12 Predefined Text

    + +

    Most macro packages supply predefined strings to set prepared text like +the date, or to perform operations like super- and subscripting. +

    + +
    +
    +
    + +

    3.2.13 Preprocessor Support

    + +

    All macro packages provide support for various preprocessors and may +extend their functionality by defining macros to set their contents in +displays. Examples include TS and TE for gtbl, +EQ and EN for geqn, and PS and PE +for gpic. +

    + +
    +
    +
    + +

    3.2.14 Configuration and Customization

    + +

    Packages provide means of customizing many of the details of how the +package behaves. These range from setting the default type size to +changing the appearance of section headers. +

    + + + + +
    +
    +
    +
    +
    + +

    4 Macro Packages

    + + + + +

    This chapter surveys the “major” macro packages that come with +groff. One, ms, is presented in detail. +

    + + + +

    Major macro packages are also sometimes described as full-service +due to the breadth of features they provide and because more than one +cannot be used by the same document; for example +

    +
    +
    groff -m man foo.man -m ms bar.doc
    +
    + +

    doesn’t work. Option arguments are processed before non-option +arguments; the above (failing) sample is thus reordered to +

    +
    +
    groff -m man -m ms foo.man bar.doc
    +
    + + + + + + + +

    Many auxiliary, or “minor”, macro packages are also available. They +may in general be used with any full-service macro package and handle a +variety of tasks from character encoding selection, to language +localization, to inlining of raster images. See the +groff_tmac(5) man page for a list. Type ‘man +groff_tmac’ at the command line to view it. +

    + + + + +
    +
    + +

    4.1 man

    + + + + + +

    The man macro package is the most widely used and probably the +most important ever developed for troff. It is easy to use, and +a vast majority of manual pages (“man pages”) are written in it. +

    +

    groff’s implementation is documented in the +groff_man(7) man page. Type ‘man groff_man’ at the +command line to view it. +

    + + + +
    +
    + +

    4.1.1 Optional man extensions

    + + +

    Use the file man.local for local extensions to the man +macros or for style changes. +

    + +
    +

    Custom headers and footers

    + + +

    In groff versions 1.18.2 and later, you can specify custom +headers and footers by redefining the following macros in +man.local. +

    +
    +
    Macro: .PT
    +
    +

    Control the content of the headers. Normally, the header prints the +command name and section number on either side, and the optional fifth +argument to TH in the center. +

    + +
    +
    Macro: .BT
    +
    +

    Control the content of the footers. Normally, the footer prints the +page number and the third and fourth arguments to TH. +

    +

    Use the FT register to specify the footer position. The default +is −0.5i. +

    + +
    +
    +

    Ultrix-specific man macros

    + + + + +

    The groff source distribution includes a file named +man.ultrix, containing macros compatible with the Ultrix variant +of man. Copy this file into man.local (or use the +mso request to load it) to enable the following macros. +

    +
    +
    Macro: .CT key
    +
    +

    Print ‘<CTRL/key>’. +

    + +
    +
    Macro: .CW
    +
    +

    Print subsequent text using a “constant-width” (monospaced) typeface +(Courier roman). +

    + +
    +
    Macro: .Ds
    +
    +

    Begin a non-filled display. +

    + +
    +
    Macro: .De
    +
    +

    End a non-filled display started with Ds. +

    + +
    +
    Macro: .EX [indent]
    +
    +

    Begin a non-filled display using a monospaced typeface (Courier roman). +Use the optional indent argument to indent the display. +

    + +
    +
    Macro: .EE
    +
    +

    End a non-filled display started with EX. +

    + +
    +
    Macro: .G [text]
    +
    +

    Set text in Helvetica. If no text is present on the line where +the macro is called, then the text of the next line appears in +Helvetica. +

    + +
    +
    Macro: .GL [text]
    +
    +

    Set text in Helvetica oblique. If no text is present on the line +where the macro is called, then the text of the next line appears in +Helvetica Oblique. +

    + +
    +
    Macro: .HB [text]
    +
    +

    Set text in Helvetica bold. If no text is present on the line +where the macro is called, then all text up to the next HB +appears in Helvetica bold. +

    + +
    +
    Macro: .TB [text]
    +
    +

    Identical to HB. +

    + +
    +
    Macro: .MS title sect [punct]
    +
    +

    Set a man page reference in Ultrix format. The title is in +Courier instead of italic. Optional punctuation follows the section +number without an intervening space. +

    + +
    +
    Macro: .NT [C] [title]
    +
    +

    Begin a note. Print the optional title, or the word “Note”, +centered on the page. Text following the macro makes up the body of the +note, and is indented on both sides. If the first argument is C, +the body of the note is printed centered (the second argument replaces +the word “Note” if specified). +

    + +
    +
    Macro: .NE
    +
    +

    End a note begun with NT. +

    + +
    +
    Macro: .PN path [punct]
    +
    +

    Set the path name in a monospaced typeface (Courier roman), followed by +optional punctuation. +

    + +
    +
    Macro: .Pn [punct] path [punct]
    +
    +

    If called with two arguments, identical to PN. If called with +three arguments, set the second argument in a monospaced typeface +(Courier roman), bracketed by the first and third arguments in the +current font. +

    + +
    +
    Macro: .R
    +
    +

    Switch to roman font and turn off any underlining in effect. +

    + +
    +
    Macro: .RN
    +
    +

    Print the string ‘<RETURN>’. +

    + +
    +
    Macro: .VS [4]
    +
    +

    Start printing a change bar in the margin if the number 4 is +specified. Otherwise, this macro does nothing. +

    + +
    +
    Macro: .VE
    +
    +

    End printing the change bar begun by VS. +

    + +
    +
    +

    Simple example

    + +

    The following example man.local file alters the SH macro +to add some extra vertical space before printing the heading. Headings +are printed in Helvetica bold. +

    +
    +
    .\" Make the heading fonts Helvetica
    +.ds HF HB
    +.
    +.\" Put more space in front of headings.
    +.rn SH SH-orig
    +.de SH
    +.  if t .sp (u;\\n[PD]*2)
    +.  SH-orig \\$*
    +..
    +
    + + + +
    +
    +
    +
    +
    + +

    4.2 mdoc

    + + +

    groff’s implementation of the BSD doc package for man +pages is documented in the groff_mdoc(7) man page. Type +‘man groff_mdoc’ at the command line to view it. +

    + + +
    +
    +
    + +

    4.3 me

    + + +

    groff’s implementation of the BSD me macro package is +documented using itself. A tutorial, meintro.me, and reference, +meref.me, are available in groff’s documentation +directory. A groff_me(7) man page is also available and +identifies the installation path for these documents. Type ‘man +groff_me’ at the command line to view it. +

    +

    A French translation of the tutorial is available as +meintro_fr.me and installed parallel to the English version. +

    + + +
    +
    +
    + +

    4.4 mm

    + + +

    groff’s implementation of the AT&T memorandum macro +package is documented in the groff_mm(7) man page. Type +‘man groff_mm’ at the command line) to view it. +

    +

    A Swedish localization of mm is also available; see +groff_mmse(7). +

    + + +
    +
    +
    + +

    4.5 mom

    + + +

    The main documentation files for the mom macros are in +HTML format. Additional, useful documentation is in +PDF format. See the groff(1) man page, section +“Installation Directories”, for their location. +

    +
      +
    • toc.html +Entry point to the full mom manual. + +
    • macrolist.html +Hyperlinked index of macros with brief descriptions, arranged by +category. + +
    • mom-pdf.pdf +PDF features and usage. +
    + +

    The mom macros are in active development between groff releases. +The most recent version, along with up-to-date documentation, is +available at http://www.schaffter.ca/mom/mom-05.html. +

    +

    The groff_mom(7) man page (type ‘man groff_mom’ at +the command line) contains a partial list of available macros, however +their usage is best understood by consulting the HTML +documentation. +

    + + + +
    +
    +
    + +

    4.6 ms

    + + +

    The ms (“manuscript”) package is suitable for the preparation +of letters, memoranda, reports, and books. These groff +macros feature cover page and table of contents generation, +automatically numbered headings, several paragraph styles, a variety of +text styling options, footnotes, and multi-column page layouts. +ms supports the tbl, eqn, pic, and +refer preprocessors for inclusion of tables, mathematical +equations, diagrams, and standardized bibliographic citations. This +implementation is mostly compatible with the documented interface and +behavior of AT&T Unix Version 7 ms. Many extensions from +4.2BSD (Berkeley) +and Tenth Edition Research Unix have been recreated. +

    + + + +
    +
    + +

    4.6.1 Introduction

    + +

    The ms macros are the oldest surviving package for roff +systems.7 While the man +package was designed for brief reference documents, the ms macros +are also suitable for longer works intended for printing and possible +publication. +

    + + + +
    +
    + +

    4.6.1.1 Basic information

    + +

    ms documents are plain text files; prepare them with your +preferred text editor. If you’re in a hurry to start, know that +ms needs one of its macros called at the beginning of a document +so that it can initialize. A macro is a formatting instruction to +ms. Put a macro call on a line by itself. Use ‘.PP’ if you +want your paragraph’s first line to be indented, or ‘.LP’ if you +don’t. +

    +

    After that, start typing normally. It is a good practice to start each +sentence on a new line, or to put two spaces after sentence-ending +punctuation, so that the formatter knows where the sentence boundaries +are. You can separate paragraphs with further paragraphing macros, or +with blank lines, and you can indent with tabs. When you need one of +the features mentioned earlier (see ms), return to this part of the +manual. +

    +

    Format the document with the groff command. nroff +can be useful for previewing. +

    +
    +
    +
    $ editor radical.ms
    +$ nroff -ww -z -ms radical.ms # check for errors
    +$ nroff -ms radical.ms | less -R
    +$ groff -T ps -ms radical.ms > radical.ps
    +$ see radical.ps
    +
    +
    + +

    Our radical.ms document might look like this. +

    +
    +
    +
    .LP
    +Radical novelties are so disturbing that they tend to be
    +suppressed or ignored, to the extent that even the
    +possibility of their existence in general is more often
    +denied than admitted.
    +
    +→That's what Dijkstra said, anyway.
    +
    +
    + +

    ms exposes many aspects of document layout to user control via +groff’s registers and strings, which store numbers +and text, respectively. Measurements in groff are expressed with +a suffix called a scaling unit. +

    +
    +
    i
    +

    inches +

    +
    +
    c
    +

    centimeters +

    +
    +
    p
    +

    points (1/72 inch) +

    +
    +
    P
    +

    picas (1/6 inch) +

    +
    +
    v
    +

    vees; current vertical spacing +

    +
    +
    m
    +

    ems; width of an “M” in the current font +

    +
    +
    n
    +

    ens; one-half em +

    +
    + +

    Set registers with the nr request and strings with the ds +request. Requests are like macro calls; they go on lines by +themselves and start with the control character, a dot (.). +The difference is that they directly instruct the formatter program, +rather than the macro package. We’ll discuss a few as applicable. It +is wise to specify a scaling unit when setting any register that +represents a length, size, or distance. +

    +
    +
    +
    .nr PS 10.5p \" Use 10.5-point type.
    +.ds FAM P    \" Use Palatino font family.
    +
    +
    + +

    In the foregoing, we see that \" begins a comment. This is an +example of an escape sequence, the other kind of formatting +instruction. Escape sequences can appear anywhere. They begin with the +escape character (\) and are followed by at least one more +character. ms documents +tend to use only a few of groff’s many requests and escape +sequences; see Request Index and Escape Sequence Index or +the groff(7) man page for complete lists. +

    +
    +
    \"
    +

    Begin comment; ignore remainder of line. +

    +
    +
    \n[reg]
    +

    Interpolate value of register reg. +

    +
    +
    \*[str]
    +

    Interpolate contents of string str. +

    +
    +
    \*s
    +

    abbreviation of \*[s]; the name s must be only one +character +

    +
    +
    \[char]
    +

    Interpolate glyph of special character named char. +

    +
    +
    \&
    +

    dummy character +

    +
    +
    \~
    +

    Insert an unbreakable space that is adjustable like a normal space. +

    +
    +
    \|
    +

    Move horizontally by one-sixth em (“thin space”). +

    +
    + +

    Prefix any words that start with a dot ‘.’ or neutral apostrophe +‘'’ with \& if they are at the beginning of an input line +(or might become that way in editing) to prevent them from being +interpreted as macro calls or requests. Suffix ‘.’, ‘?’, and +‘!’ with \& when needed to cancel end-of-sentence detection. +

    +
    +
    +
    My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\&
    +Wallace after the criticality incident.
    +
    +
    + + +
    +
    +
    +
    + +

    4.6.2 Document Structure

    + + +

    The ms macro package expects a certain amount of structure: +a well-formed document contains at least one paragraphing or heading +macro call. Longer documents have a structure as follows. +

    +
    +
    Document type
    +

    Calling the RP macro at the beginning of your document puts the +document description (see below) on a cover page. Otherwise, ms +places the information (if any) on the first page, followed immediately +by the body text. Some document types found in other ms +implementations are specific to AT&T or Berkeley, and are not +supported by groff ms. +

    +
    +
    Format and layout
    +

    By setting registers and strings, you can configure your document’s +typeface, margins, spacing, headers and footers, and footnote +arrangement. See Document Control Settings. +

    +
    +
    Document description
    +

    A document description consists of any of: a title, one or more authors’ +names and affiliated institutions, an abstract, and a date or other +identifier. See Document Description Macros. +

    +
    +
    Body text
    +

    The main matter of your document follows its description (if any). +ms supports highly structured text consisting of paragraphs +interspersed with multi-level headings (chapters, sections, subsections, +and so forth) and augmented by lists, footnotes, tables, diagrams, and +similar material. See Body Text. +

    +
    +
    Tables of contents
    +

    Macros enable the collection of entries for a table of contents (or +index) as the material they discuss appears in the document. You then +call a macro to emit the table of contents at the end of your document. +The table of contents must necessarily follow the rest of the text since +GNU troff is a single-pass formatter; it thus cannot determine +the page number of a division of the text until it has been set and +output. Since ms was designed for the production of hard copy, +the traditional procedure was to manually relocate the pages containing +the table of contents between the cover page and the body text. Today, +page resequencing is more often done in the digital domain. An index +works similarly, but because it typically needs to be sorted after +collection, its preparation requires separate processing. +

    +
    + + +
    +
    +
    + +

    4.6.3 Document Control Settings

    + + +

    ms exposes many aspects of document layout to user control via +groff requests. To use them, you must understand how to define +registers and strings. +

    +
    +
    Request: .nr reg value
    +
    +

    Set register reg to value. If reg doesn’t exist, GNU +troff creates it. +

    + +
    +
    Request: .ds name contents
    +
    +

    Set string name to contents. +

    + +

    A list of document control registers and strings follows. For any +parameter whose default is unsatisfactory, define its register or string +before calling any ms macro other than RP. +

    + +
    +

    Margin settings

    + +
    +
    Register: \n[PO]
    +
    +

    Defines the page offset (i.e., the left margin). +

    +

    Effective: next page. +

    +

    Default: Varies by output device and paper format; 1i is used for +typesetters using U.S. letter paper, and zero for terminals. +See Paper Format. +

    + +
    +
    Register: \n[LL]
    +
    +

    Defines the line length (i.e., the width of the body text). +

    +

    Effective: next paragraph. +

    +

    Default: Varies by output device and paper format; 6.5i is used +for typesetters using U.S. letter paper (see Paper Format) and +65n on terminals. +

    + +
    +
    Register: \n[LT]
    +
    +

    Defines the title line length (i.e., the header and footer width). This +is usually the same as LL, but need not be. +

    +

    Effective: next paragraph. +

    +

    Default: Varies by output device and paper format; 6.5i is used +for typesetters using U.S. letter paper (see Paper Format) and +65n on terminals. +

    + +
    +
    Register: \n[HM]
    +
    +

    Defines the header margin height at the top of the page. +

    +

    Effective: next page. +

    +

    Default: 1i. +

    + +
    +
    Register: \n[FM]
    +
    +

    Defines the footer margin height at the bottom of the page. +

    +

    Effective: next page. +

    +

    Default: 1i. +

    + +
    +
    +

    Titles (headers, footers)

    + +
    +
    String: \*[LH]
    +
    +

    Defines the text displayed in the left header position. +

    +

    Effective: next header. +

    +

    Default: empty. +

    + +
    +
    String: \*[CH]
    +
    +

    Defines the text displayed in the center header position. +

    +

    Effective: next header. +

    +

    Default: ‘-\n[%]-’. +

    + +
    +
    String: \*[RH]
    +
    +

    Defines the text displayed in the right header position. +

    +

    Effective: next header. +

    +

    Default: empty. +

    + +
    +
    String: \*[LF]
    +
    +

    Defines the text displayed in the left footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    String: \*[CF]
    +
    +

    Defines the text displayed in the center footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    String: \*[RF]
    +
    +

    Defines the text displayed in the right footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    +

    Text settings

    + +
    +
    Register: \n[PS]
    +
    +

    Defines the type size of the body text. +

    +

    Effective: next paragraph. +

    +

    Default: 10p. +

    + +
    +
    Register: \n[VS]
    +
    +

    Defines the vertical spacing (type size plus leading). +

    +

    Effective: next paragraph. +

    +

    Default: 12p. +

    + +
    +
    Register: \n[HY]
    +
    +

    Defines the automatic hyphenation mode used with the hy request. +Setting HY to 0 is equivalent to using the nh +request. This is a Tenth Edition Research Unix extension. +

    +

    Effective: next paragraph. +

    +

    Default: 6. +

    + +
    +
    String: \*[FAM]
    +
    +

    Defines the font family used to typeset the document. This is a GNU +extension. +

    +

    Effective: next paragraph. +

    +

    Default: defined by the output device; often ‘T’ (see Body Text) +

    + +
    +
    +

    Paragraph settings

    + +
    +
    Register: \n[PI]
    +
    +

    Defines the indentation amount used by the PP, IP (unless +overridden by an optional argument), XP, and RS macros. +

    +

    Effective: next paragraph. +

    +

    Default: 5n. +

    + +
    +
    Register: \n[PD]
    +
    +

    Defines the space between paragraphs. +

    +

    Effective: next paragraph. +

    +

    Default: 0.3v (1v on low-resolution devices). +

    + +
    +
    Register: \n[QI]
    +
    +

    Defines the indentation amount used on both sides of a paragraph set +with the QP or between the QS and QE macros. +

    +

    Effective: next paragraph. +

    +

    Default: 5n. +

    + +
    +
    Register: \n[PORPHANS]
    +
    +

    Defines the minimum number of initial lines of any paragraph that must +be kept together to avoid isolated lines at the bottom of a page. If a +new paragraph is started close to the bottom of a page, and there is +insufficient space to accommodate PORPHANS lines before an +automatic page break, then a page break is forced before the start of +the paragraph. This is a GNU extension. +

    +

    Effective: next paragraph. +

    +

    Default: 1. +

    + +
    +
    +

    Heading settings

    + +
    +
    Register: \n[PSINCR]
    +
    +

    Defines an increment in type size to be applied to a heading at a +lesser depth than that specified in GROWPS. The value of +PSINCR should be specified in points with the p scaling +unit and may include a fractional component; for example, ‘.nr PSINCR 1.5p sets a type size increment of 1.5p. This is a GNU +extension. +

    +

    Effective: next heading. +

    +

    Default: 1p. +

    + +
    +
    Register: \n[GROWPS]
    +
    +

    Defines the heading depth above which the type size increment set by +PSINCR becomes effective. For each heading depth less than the +value of GROWPS, the type size is increased by PSINCR. +Setting GROWPS to any value less than 2 disables the +incremental heading size feature. This is a GNU extension. +

    +

    Effective: next heading. +

    +

    Default: 0. +

    + +
    +
    Register: \n[HORPHANS]
    +
    +

    Defines the minimum number of lines of an immediately succeeding +paragraph that should be kept together with any heading introduced by +the NH or SH macros. If a heading is placed close to the +bottom of a page, and there is insufficient space to accommodate both +the heading and at least HORPHANS lines of the following +paragraph, before an automatic page break, then the page break is forced +before the heading. This is a GNU extension. +

    +

    Effective: next paragraph. +

    +

    Default: 1. +

    + +
    +
    String: \*[SN-STYLE]
    +
    +

    Defines the style used to print numbered headings. See Headings. This is a GNU extension. +

    +

    Effective: next heading. +

    +

    Default: alias of SN-DOT +

    + +
    +
    +

    Footnote settings

    + +
    +
    Register: \n[FI]
    +
    +

    Defines the footnote indentation. This is a Berkeley extension. +

    +

    Effective: next footnote. +

    +

    Default: 2n. +

    + +
    +
    Register: \n[FF]
    +
    +

    Defines the format of automatically numbered footnotes, +and those for which the FS request is given a marker argument, at +the bottom of a column or page. This is a Berkeley extension. +

    +
    0
    +

    Set an automatic number8 as a +superscript (on typesetter devices) or surrounded by square brackets (on +terminals). The footnote paragraph is indented as with PP if +there is an FS argument or an automatic number, and as with +LP otherwise. This is the default. +

    +
    +
    1
    +

    As 0, but set the marker as regular text and follow an +automatic number with a period. +

    +
    +
    2
    +

    As 1, but without indentation (like LP). +

    +
    +
    3
    +

    As 1, but set the footnote paragraph with the marker hanging +(like IP). +

    +
    + +

    Effective: next footnote. +

    +

    Default: 0. +

    + +
    +
    Register: \n[FPS]
    +
    +

    Defines the footnote type size. +

    +

    Effective: next footnote. +

    +

    Default: \n[PS] - 2p. +

    + +
    +
    Register: \n[FVS]
    +
    +

    Defines the footnote vertical spacing. +

    +

    Effective: next footnote. +

    +

    Default: \n[FPS] + 2p. +

    + +
    +
    Register: \n[FPD]
    +
    +

    Defines the footnote paragraph spacing. This is a GNU extension. +

    +

    Effective: next footnote. +

    +

    Default: \n[PD] / 2. +

    + +
    +
    String: \*[FR]
    +
    +

    Defines the ratio of the footnote line length to the current line +length. This is a GNU extension. +

    +

    Effective: next footnote in single-column arrangements, next page +otherwise. +

    +

    Default: 11/12. +

    + +
    +
    +

    Display settings

    + +
    +
    Register: \n[DD]
    +
    +

    Sets the display distance—the vertical spacing before and after a +display, a tbl table, an eqn equation, or a pic +image. This is a Berkeley extension. +

    +

    Effective: next display boundary. +

    +

    Default: 0.5v (1v on low-resolution devices). +

    + +
    +
    Register: \n[DI]
    +
    +

    Sets the default amount by which to indent a display started with +DS and ID without arguments, to ‘.DS I’ without +an indentation argument, and to equations set with ‘.EQ I’. +This is a GNU extension. +

    +

    Effective: next indented display. +

    +

    Default: 0.5i. +

    + +
    +
    +

    Other settings

    + +
    +
    Register: \n[MINGW]
    +
    +

    Defines the default minimum width between columns in a multi-column +document. This is a GNU extension. +

    +

    Effective: next page. +

    +

    Default: 2n. +

    + +
    +
    Register: \n[TC-MARGIN]
    +
    +

    Defines the width of the field in which page numbers are set in a table +of contents entry; the right margin thus moves inboard by this amount. +This is a GNU extension. +

    +

    Effective: next PX call. +

    +

    Default: \w'000' +

    + + + +
    +
    +
    +
    + +

    4.6.4 Document Description Macros

    + + + +

    Only the simplest document lacks a title.9 As its level of sophistication (or +complexity) increases, it tends to acquire a date of revision, +explicitly identified authors, sponsoring institutions for authors, and, +at the rarefied heights, an abstract of its content. Define these +data by calling the macros below in the order shown; DA or +ND can be called to set the document date (or other identifier) +at any time before (a) the abstract, if present, or (b) its information +is required in a header or footer. Use of these macros is optional, +except that TL is mandatory if any of RP, AU, +AI, or AB is called, and AE is mandatory if +AB is called. +

    +
    +
    Macro: .RP [no-repeat-info] [no-renumber]
    +
    +

    Use the “report” (AT&T: “released paper”) format for your +document, creating a separate cover page. The default arrangement is to +place most of the document description (title, author names and +institutions, and abstract, but not the date) at the top of the first +page. If the optional no-repeat-info argument is given, +ms produces a cover page but does not repeat any of its +information subsequently (but see the DA macro below regarding +the date). Normally, RP sets the page number following the cover +page to 1. Specifying the optional no-renumber argument +suppresses this alteration. Optional arguments can occur in any order. +no is recognized as a synonym of no-repeat-info for +AT&T compatibility. +

    + +
    +
    Macro: .TL
    +
    +

    Specify the document title. ms collects text on input lines +following this call into the title until reaching AU, AB, +or a heading or paragraphing macro call. +

    + +
    +
    Macro: .AU
    +
    +

    Specify an author’s name. ms collects text on input lines +following this call into the author’s name until reaching AI, +AB, another AU, or a heading or paragraphing macro call. +Call it repeatedly to specify multiple authors. +

    + +
    +
    Macro: .AI
    +
    +

    Specify the preceding author’s institution. An AU call is +usefully followed by at most one AI call; if there are more, the +last AI call controls. ms collects text on input lines +following this call into the author’s institution until reaching +AU, AB, or a heading or paragraphing macro call. +

    + +
    +
    Macro: .DA [x …]
    +
    +

    Typeset the current date, or any arguments x, in the center +footer, and, if RP is also called, left-aligned at the end of the +description information on the cover page. +

    + +
    +
    Macro: .ND [x …]
    +
    +

    Typeset the current date, or any arguments x, if RP is also +called, left-aligned at the end of the document description on the cover +page. This is groff ms’s default. +

    + +
    +
    Macro: .AB [no]
    +
    +

    Begin the abstract. ms collects text on input lines following +this call into the abstract until reaching an AE call. By +default, ms places the word “ABSTRACT” centered and in italics +above the text of the abstract. The optional argument no +suppresses this heading. +

    + +
    +
    Macro: .AE
    +
    +

    End the abstract. +

    + +

    An example document description, using a cover page, follows. + + +

    +
    +
    +
    .RP
    +.TL
    +The Inevitability of Code Bloat
    +in Commercial and Free Software
    +.AU
    +J.\& Random Luser
    +.AI
    +University of West Bumblefuzz
    +.AB
    +This report examines the long-term growth of the code
    +bases in two large,
    +popular software packages;
    +the free Emacs and the commercial Microsoft Word.
    +While differences appear in the type or order of
    +features added,
    +due to the different methodologies used,
    +the results are the same in the end.
    +.PP
    +The free software approach is shown to be superior in
    +that while free software can become as bloated as
    +commercial offerings,
    +free software tends to have fewer serious bugs and the
    +added features are more in line with user demand.
    +.AE
    +
    +…the rest of the paper…
    +
    +
    + + +
    +
    +
    + +

    4.6.5 Body Text

    + + +

    A variety of macros, registers, and strings can be used to structure and +style the body of your document. They organize your text into +paragraphs, headings, footnotes, and inclusions of material such as +tables and figures. +

    + + + +
    +
    + +

    4.6.5.1 Text settings

    + + +

    The FAM string, a GNU extension, sets the font family for body +text; the default is ‘T’. The PS and VS registers +set the type size and vertical spacing (distance between text +baselines), respectively. The font family and type size are ignored on +terminal devices. Setting these parameters before the first call of a +heading, paragraphing, or (non-date) document description macro also +applies them to headers, footers, and (for FAM) footnotes. +

    +

    Which font families are available depends on the output device; as a +convention, T selects a serif family (“Times”), H a +sans-serif family (“Helvetica”), and C a monospaced family +(“Courier”). The man page for the output driver documents its font +repertoire. Consult the groff(1) man page for lists of +available output devices and their drivers. +

    +

    The hyphenation mode (as used by the hy request) is set from the +HY register. Setting HY to ‘0’ is equivalent to +using the nh request. This is a Tenth Edition Research Unix +extension. +

    + +
    +
    +
    + +

    4.6.5.2 Typographical symbols

    + + +

    ms provides a few strings to obtain typographical symbols not +easily entered with the keyboard. These and many others are available +as special character escape sequences—see the groff_char(7) +man page. +

    +
    +
    String: \*[-]
    +
    +

    Interpolate an em dash. +

    + +
    +
    String: \*[Q]
    +
    +
    String: \*[U]
    +
    +

    Interpolate typographer’s quotation marks where available, and neutral +double quotes otherwise. \*Q is the left quote and \*U +the right. +

    + + +
    +
    +
    + +

    4.6.5.3 Paragraphs

    + + +

    Paragraphing macros break, or terminate, any pending output line +so that a new paragraph can begin. Several paragraph types are +available, differing in how indentation applies to them: to left, right, +or both margins; to the first output line of the paragraph, all output +lines, or all but the first. All paragraphing macro calls cause the +insertion of vertical space in the amount stored in the PD +register, except at page or column breaks. Alternatively, a blank input +line breaks the output line and vertically spaces by one vee. +

    +
    +
    Macro: .LP
    +
    +

    Set a paragraph without any (additional) indentation. +

    + +
    +
    Macro: .PP
    +
    +

    Set a paragraph with a first-line left indentation in the amount stored +in the PI register. +

    + +
    +
    Macro: .IP [marker [width]]
    +
    +

    Set a paragraph with a left indentation. The optional marker is +not indented and is empty by default. It has several applications; +see Lists. width overrides the indentation amount +stored in the PI register; its default unit is ‘n’. Once +specified, width applies to further IP calls until +specified again or a heading or different paragraphing macro is called. +

    + +
    +
    Macro: .QP
    +
    +

    Set a paragraph indented from both left and right margins by the amount +stored in the QI register. +

    + +
    +
    Macro: .QS
    +
    +
    Macro: .QE
    +
    +

    Begin (QS) and end (QE) a region where each paragraph is +indented from both margins by the amount stored in the QI +register. The text between QS and QE can be structured +further by use of other paragraphing macros. +

    + +
    +
    Macro: .XP
    +
    +

    Set an “exdented” paragraph—one with a left indentation in the +amount stored in the PI register on every line except the +first (also known as a hanging indent). This is a Berkeley extension. +

    + +

    The following example illustrates the use of paragraphing macros. +

    +
    +
    +
    .NH 2
    +Cases used in the 2001 study
    +.LP
    +Two software releases were considered for this report.
    +.PP
    +The first is commercial software;
    +the second is free.
    +.IP \[bu]
    +Microsoft Word for Windows,
    +starting with version 1.0 through the current version
    +(Word 2000).
    +.IP \[bu]
    +GNU Emacs,
    +from its first appearance as a standalone editor through
    +the current version (v20).
    +See [Bloggs 2002] for details.
    +.QP
    +Franklin's Law applied to software:
    +software expands to outgrow both RAM and disk space over
    +time.
    +.SH
    +Bibliography
    +.XP
    +Bloggs, Joseph R.,
    +.I "Everyone's a Critic" ,
    +Underground Press, March 2002.
    +A definitive work that answers all questions and
    +criticisms about the quality and usability of free
    +software.
    +
    +
    + + +
    +
    +
    + +

    4.6.5.4 Headings

    + + +

    Use headings to create a sequential or hierarchical structure for your +document. The ms macros print headings in bold using +the same font family and, by default, type size as the body text. +Headings are available with and without automatic numbering. Text on +input lines following the macro call becomes the heading’s title. Call +a paragraphing macro to end the heading text and start the section’s +content. +

    +
    +
    Macro: .NH [depth]
    +
    +
    Macro: .NH S heading-depth-index
    +

    Set an automatically numbered heading. +

    +

    ms produces a numbered heading the form a.b.c…, to +any depth desired, with the numbering of each depth increasing +automatically and being reset to zero when a more significant level is +increased. “1” is the most significant or coarsest division of +the document. Only non-zero values are output. If depth is +omitted, it is taken to be ‘1’. +

    +

    If you specify depth such that an ascending gap occurs relative to +the previous NH call—that is, you “skip a depth”, as by +‘.NH 1’ and then ‘.NH 3’—groff ms emits a +warning on the standard error stream. +

    +

    Alternatively, you can give NH a first argument of S, +followed by integers to number the heading depths explicitly. Further +automatic numbering, if used, resumes using the specified indices as +their predecessors. +This feature is a Berkeley extension. +

    + +

    An example may be illustrative. +

    +
    +
    +
    .NH 1
    +Animalia
    +.NH 2
    +Arthropoda
    +.NH 3
    +Crustacea
    +.NH 2
    +Chordata
    +.NH S 6 6 6
    +Daimonia
    +.NH 1
    +Plantae
    +
    +
    + +

    The above results in numbering as follows; the vertical space that +normally precedes each heading is omitted. +

    +
    +
    1.  Animalia
    +1.1.  Arthropoda
    +1.1.1.  Crustacea
    +1.2.  Chordata
    +6.6.6.  Daimonia
    +7.  Plantae
    +
    + +
    +
    String: \*[SN-STYLE]
    +
    +
    String: \*[SN-DOT]
    +
    +
    String: \*[SN-NO-DOT]
    +
    +
    String: \*[SN]
    +
    +

    After NH is called, the assigned number is made available in the +strings SN-DOT (as it appears in a printed heading with default +formatting, followed by a terminating period) and SN-NO-DOT (with +the terminating period omitted). These are GNU extensions. +

    +

    You can control the style used to print numbered headings by defining an +appropriate alias for the string SN-STYLE. By default, +SN-STYLE is aliased to SN-DOT. If you prefer to omit the +terminating period from numbers appearing in numbered headings, you may +define the alias as follows. +

    +
    +
    .als SN-STYLE SN-NO-DOT
    +
    + +

    Any such change in numbering style becomes effective from the next use +of NH following redefinition of the alias for SN-STYLE. +The formatted number of the current heading is available in the +SN string (a feature first documented by Berkeley), which +facilitates its inclusion in, for example, table captions, equation +labels, and XS/XA/XE table of contents entries. +

    + +
    +
    Macro: .SH [depth]
    +
    +

    Set an unnumbered heading. +

    +

    The optional depth argument is a GNU extension indicating the +heading depth corresponding to the depth argument of NH. +It matches the type size at which the heading is set to that of a +numbered heading at the same depth when the GROWPS and +PSINCR heading size adjustment mechanism is in effect. +

    + +

    If the GROWPS register is set to a value greater than the +level argument to NH or SH, the type size of a +heading produced by these macros increases by PSINCR units over +the size specified by PS multiplied by the difference of +GROWPS and level. The value stored in PSINCR is +interpreted in groff basic units; the p scaling unit +should be employed when assigning a value specified in points. For +example, the sequence +

    +
    +
    +
    .nr PS 10
    +.nr GROWPS 3
    +.nr PSINCR 1.5p
    +.NH 1
    +Carnivora
    +.NH 2
    +Felinae
    +.NH 3
    +Felis catus
    +.SH 2
    +Machairodontinae
    +
    +
    + +

    will cause “1. Carnivora” to be printed in 13-point text, followed by +“1.1. Felinae” in 11.5-point text, while “1.1.1. Felis catus” and +all more deeply nested heading levels will remain in the 10-point text +specified by the PS register. “Machairodontinae” is printed at +11.5 points, since it corresponds to heading level 2. +

    +

    The HORPHANS register operates in conjunction with the NH +and SH macros to inhibit the printing of isolated headings at the +bottom of a page; it specifies the minimum number of lines of an +immediately subsequent paragraph that must be kept on the same page as +the heading. If insufficient space remains on the current page to +accommodate the heading and this number of lines of paragraph text, a +page break is forced before the heading is printed. Any display macro +call or tbl, pic, or eqn region between the heading +and the subsequent paragraph suppresses this grouping. See Keeps, boxed keeps, and displays and Tables, figures, equations, and references. +

    + +
    +
    +
    + +

    4.6.5.5 Typeface and decoration

    + +

    The ms macros provide a variety of ways to style text. +Attend closely to the ordering of arguments labeled pre and +post, which is not intuitive. Support for pre +arguments is a GNU extension.10 +

    +
    +
    Macro: .B [text [post [pre]]]
    +
    +

    Style text in bold, followed by post in the previous +font style without intervening space, and preceded by pre +similarly. Without arguments, ms styles subsequent text in bold +until the next paragraphing, heading, or no-argument typeface macro +call. +

    + +
    +
    Macro: .R [text [post [pre]]]
    +
    +

    As B, but use the roman style (upright text of normal weight) +instead of bold. Argument recognition is a GNU extension. +

    + +
    +
    Macro: .I [text [post [pre]]]
    +
    +

    As B, but use an italic or oblique style instead of bold. +

    + +
    +
    Macro: .BI [text [post [pre]]]
    +
    +

    As B, but use a bold italic or bold oblique style instead of +upright bold. This is a Tenth Edition Research Unix extension. +

    + +
    +
    Macro: .CW [text [post [pre]]]
    +
    +

    As B, but use a constant-width (monospaced) roman typeface +instead of bold. This is a Tenth Edition Research Unix extension. +

    + +
    +
    Macro: .BX [text]
    +
    +

    Typeset text and draw a box around it. On terminal devices, +reverse video is used instead. If you want text to contain space, +use unbreakable space or horizontal motion escape sequences (\~, +\SP, \^, \|, \0 or \h). +

    + +
    +
    Macro: .UL [text [post]]
    +
    +

    Typeset text with an underline. post, if present, is set +after text with no intervening space. +

    + +
    +
    Macro: .LG
    +
    +

    Set subsequent text in larger type (two points larger than the +current size) until the next type size, paragraphing, or heading macro +call. You can specify this macro multiple times to enlarge the type +size as needed. +

    + +
    +
    Macro: .SM
    +
    +

    Set subsequent text in smaller type (two points smaller than the current +size) until the next type size, paragraphing, or heading macro call. +You can specify this macro multiple times to reduce the type size as +needed. +

    + +
    +
    Macro: .NL
    +
    +

    Set subsequent text at the normal type size (the amount in the PS +register). +

    + +

    pre and post arguments are typically used to simplify the +attachment of punctuation to styled words. When pre is used, +a hyphenation control escape sequence \% that would ordinarily +start text must start pre instead to have the desired +effect. +

    +
    +
    +
    The CS course's students found one C language keyword
    +.CW static ) \%(
    +most troublesome.
    +
    +
    + +

    The foregoing example produces output as follows. +

    +
    +
    +
    The CS course’s students found one C language keyword (static)
    +most troublesome.
    +
    +
    + +

    You can use the output line continuation escape sequence \c to +achieve the same result (see Line Continuation). It is also +portable to older ms implementations. +

    +
    +
    +
    The CS course's students found one C language keyword
    +\%(\c
    +.CW \%static )
    +most troublesome.
    +
    +
    + +

    groff ms also offers strings to begin and end super- and +subscripting. These are GNU extensions. +

    +
    +
    String: \*[{]
    +
    +
    String: \*[}]
    +
    +

    Begin and end superscripting, respectively. +

    + +
    +
    String: \*[<]
    +
    +
    String: \*[>]
    +
    +

    Begin and end subscripting, respectively. +

    + +

    Rather than calling the CW macro, in groff ms you +might prefer to change the font family to Courier by setting the +FAM string to ‘C’. You can then use all four style macros +above, returning to the default family (Times) with ‘.ds FAM T’. +Because changes to FAM take effect only at the next paragraph, +CW remains useful to “inline” a change to the font family, +similarly to the practice of this document in noting syntactical +elements of ms and groff. +

    + +
    +
    +
    + +

    4.6.5.6 Lists

    + + +

    The marker argument to the IP macro can be employed to +present a variety of lists; for instance, you can use a bullet glyph +(\[bu]) for unordered lists, a number (or auto-incrementing +register) for numbered lists, or a word or phrase for glossary-style or +definition lists. If you set the paragraph indentation register +PI before calling IP, you can later reorder the items in +the list without having to ensure that a width argument remains +affixed to the first call. +

    +

    The following is an example of a bulleted list. + + +

    +
    +
    +
    .nr PI 2n
    +A bulleted list:
    +.IP \[bu]
    +lawyers
    +.IP \[bu]
    +guns
    +.IP \[bu]
    +money
    +
    +
    + +
    +
    A bulleted list:
    +
    +• lawyers
    +
    +• guns
    +
    +• money
    +
    + +

    The following is an example of a numbered list. + + +

    +
    +
    +
    .nr step 0 1
    +.nr PI 3n
    +A numbered list:
    +.IP \n+[step]
    +lawyers
    +.IP \n+[step]
    +guns
    +.IP \n+[step]
    +money
    +
    +
    + +
    +
    A numbered list:
    +
    +1. lawyers
    +
    +2. guns
    +
    +3. money
    +
    + +

    Here we have employed the nr request to create a register of our +own, ‘step’. We initialized it to zero and assigned it an +auto-increment of 1. Each time we use the escape sequence +‘\n+[PI]’ (note the plus sign), the formatter applies the increment +just before interpolating the register’s value. Preparing the PI +register as well enables us to rearrange the list without the tedium of +updating macro calls. +

    +

    The next example illustrates a glossary-style list. + + +

    +
    +
    +
    A glossary-style list:
    +.IP lawyers 0.4i
    +Two or more attorneys.
    +.IP guns
    +Firearms,
    +preferably large-caliber.
    +.IP money
    +Gotta pay for those
    +lawyers and guns!
    +
    +
    + +
    +
    A glossary-style list:
    +
    +lawyers
    +      Two or more attorneys.
    +
    +guns  Firearms, preferably large-caliber.
    +
    +money
    +      Gotta pay for those lawyers and guns!
    +
    + +

    In the previous example, observe how the IP macro places the +definition on the same line as the term if it has enough space. If this +is not what you want, there are a few workarounds we will illustrate by +modifying the example. First, you can use a br request to force +a break after printing the term or label. +

    +
    +
    +
    .IP guns
    +.br
    +Firearms,
    +
    +
    + +

    Second, you could apply the \p escape sequence to force a break. +The space following the escape sequence is important; if you omit it, +groff prints the first word of the paragraph text on the same +line as the term or label (if it fits) then breaks the line. +

    +
    +
    +
    .IP guns
    +\p Firearms,
    +
    +
    + +

    Finally, you may append a horizontal motion to the marker with the +\h escape sequence; using the same amount as the indentation will +ensure that the marker is too wide for groff to treat it as +“fitting” on the same line as the paragraph text. +

    +
    +
    +
    .IP guns\h'0.4i'
    +Firearms,
    +
    +
    + +

    In each case, the result is the same. +

    +
    +
    A glossary-style list:
    +
    +lawyers
    +      Two or more attorneys.
    +
    +guns
    +      Firearms, preferably large-caliber.
    +
    +money
    +      Gotta pay for those lawyers and guns!
    +
    + + +
    +
    +
    + +

    4.6.5.7 Indented regions

    + +

    You may need to indent a region of text while otherwise formatting it +normally. Indented regions can be nested; you can change \n[PI] +before each call to vary the amount of inset. +

    +
    +
    Macro: .RS
    +
    +

    Begin a region where headings, paragraphs, and displays are indented +(further) by the amount stored in the PI register. +

    + +
    +
    Macro: .RE
    +
    +

    End the (next) most recent indented region. +

    + +

    This feature enables you to easily line up text under hanging and +indented paragraphs. + + +For example, you may wish to structure lists hierarchically. +

    +
    +
    +
    .IP \[bu] 2
    +Lawyers:
    +.RS
    +.IP \[bu]
    +Dewey,
    +.IP \[bu]
    +Cheatham,
    +and
    +.IP \[bu]
    +and Howe.
    +.RE
    +.IP \[bu]
    +Guns
    +
    +
    + +
    +
    • Lawyers:
    +
    +  •  Dewey,
    +
    +  •  Cheatham, and
    +
    +  •  Howe.
    +
    +• Guns
    +
    + + +
    +
    +
    + +

    4.6.5.8 Keeps, boxed keeps, and displays

    + + + + +

    On occasion, you may want to keep several lines of text, or a +region of a document, together on a single page, preventing an automatic +page break within certain boundaries. This can cause a page break to +occur earlier than it normally would. For example, you may want to keep +two paragraphs together, or a paragraph that refers to a table, list, or +figure adjacent to the item it discusses. ms provides the +KS and KE macros for this purpose. +

    +

    You can alternatively specify a floating keep: if a keep cannot +fit on the current page, ms holds its contents and +allows material following the keep (in the source document) to fill the +remainder of the current page. When the page breaks, whether by +reaching the end or bp request, ms puts the floating keep +at the beginning of the next page. This is useful for placing large +graphics or tables that do not need to appear exactly where they occur +in the source document. +

    +
    +
    Macro: .KS
    +
    +
    Macro: .KF
    +
    +
    Macro: .KE
    +
    +

    KS begins a keep, KF a floating keep, and KE ends a +keep of either kind. +

    + +

    As an alternative to the keep mechanism, the ne request forces a +page break if there is not at least the amount of vertical space +specified in its argument remaining on the page (see Page Control). +One application of ne is to reserve space on the page for a +figure or illustration to be included later. +

    + +

    A boxed keep has a frame drawn around it. +

    +
    +
    Macro: .B1
    +
    +
    Macro: .B2
    +
    +

    B1 begins a keep with a box drawn around it. B2 ends a +boxed keep. +

    + +

    Boxed keep macros cause breaks; if you need to box a word or phrase +within a line, see the BX macro in Typeface and decoration. +Box lines are drawn as close as possible to the text they enclose so +that they are usable within paragraphs. If you wish to box one or more +paragraphs, you may improve the appearance by calling B1 after +the first paragraphing macro, and by adding a small amount of vertical +space before calling B2. +

    +
    +
    +
    .LP
    +.B1
    +.I Warning:
    +Happy Fun Ball may suddenly accelerate to dangerous
    +speeds.
    +.sp \n[PD]/2 \" space by half the inter-paragraph distance
    +.B2
    +
    +
    + +

    If you want a boxed keep to float, you will need to enclose the +B1 and B2 calls within a pair of KF and KE +calls. +

    + +

    Displays turn off filling; lines of verse or program code are +shown with their lines broken as in the source document without +requiring br requests between lines. Displays can be kept on a +single page or allowed to break across pages. The DS macro +begins a kept display of the layout specified in its first argument; +non-kept displays are begun with dedicated macros corresponding to their +layout. +

    +
    +
    Macro: .DS L
    +
    +
    Macro: .LD
    +
    +

    Begin (DS: kept) left-aligned display. +

    + +
    +
    Macro: .DS [I [indent]]
    +
    +
    Macro: .ID [indent]
    +
    +

    Begin (DS: kept) display indented by indent if specified, +and by the amount of the DI register otherwise. +

    + +
    +
    Macro: .DS B
    +
    +
    Macro: .BD
    +
    +

    Begin a (DS: kept) a block display: the entire display is +left-aligned, but indented such that the longest line in the display +is centered on the page. +

    + +
    +
    Macro: .DS C
    +
    +
    Macro: .CD
    +
    +

    Begin a (DS: kept) centered display: each line in the display +is centered. +

    + +
    +
    Macro: .DS R
    +
    +
    Macro: .RD
    +
    +

    Begin a (DS: kept) right-aligned display. This is a GNU +extension. +

    + +
    +
    Macro: .DE
    +
    +

    End any display. +

    + +

    The distance stored in the DD register is inserted before and +after each pair of display macros; this is a Berkeley extension. In +groff ms, this distance replaces any adjacent +inter-paragraph distance or subsequent spacing prior to a section +heading. The DI register is a GNU extension; its value is an +indentation applied to displays created with ‘.DS’ and ‘.ID’ +without arguments, to ‘.DS I’ without an indentation argument, and +to indented equations set with ‘.EQ’. Changes to either register +take effect at the next display boundary. +

    + +
    +
    +
    + +

    4.6.5.9 Tables, figures, equations, and references

    + + + + + + + + + +

    The ms package is often used with the tbl, pic, +eqn, and refer preprocessors. + + + + +Mark text meant for preprocessors by enclosing it in pairs of tokens +as follows, with nothing between the dot and the macro name. The +preprocessors match these tokens only at the start of an input line. +

    +
    +
    Macro: .TS [H]
    +
    +
    Macro: .TE
    +
    +

    Demarcate a table to be processed by the tbl preprocessor. The +optional argument H to TS instructs ms to +repeat table rows (often column headings) at the top of each new page +the table spans, if applicable; calling the TH macro marks the +end of such rows. The GNU tbl(1) man page provides a +comprehensive reference to the preprocessor and offers examples of its +use. +

    + +
    +
    Macro: .PS
    +
    +
    Macro: .PE
    +
    +
    Macro: .PF
    +
    +

    PS begins a picture to be processed by the gpic +preprocessor; either of PE or PF ends it, the latter with +“flyback” to the vertical position at its top. You can create +pic input manually or with a program such as xfig. +

    + +
    +
    Macro: .EQ [align [label]]
    +
    +
    Macro: .EN
    +
    +

    Demarcate an equation to be processed by the eqn preprocessor. +The equation is centered by default; align can be ‘C’, +‘L’, or ‘I’ to (explicitly) center, left-align, or indent it +by the amount stored in the DI register, respectively. If +specified, label is set right-aligned. +

    + +
    +
    Macro: .[
    +
    +
    Macro: .]
    +
    +

    Demarcate a bibliographic citation to be processed by the refer +preprocessor. The GNU refer(1) man page provides a +comprehensive reference to the preprocessor and the format of its +bibliographic database. Type ‘man refer’ at the command line to +view it. +

    + +

    When refer emits collected references (as might be done on a +“Works Cited” page), it interpolates the REFERENCES string as +an unnumbered heading (SH). +

    + + +

    The following is an example of how to set up a table that may print +across two or more pages. +

    +
    +
    +
    .TS H
    +allbox;
    +Cb | Cb .
    +Part→Description
    +_
    +.TH
    +.T&
    +GH-1978→Fribulating gonkulator
    +…the rest of the table follows…
    +.TE
    +
    +
    + +

    Attempting to place a multi-page table inside a keep can lead to +unpleasant results, particularly if the tbl allbox option +is used. +

    + +

    Mathematics can be typeset using the language of the eqn +preprocessor. +

    +
    +
    +
    .EQ C (\*[SN-NO-DOT]a)
    +p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
    +.EN
    +
    +
    + +

    This input formats a labelled equation. We used the SN-NO-DOT +string to base the equation label on the current heading number, giving +us more flexibility to reorganize the document. +

    +

    Use groff options to run preprocessors on the input: +-e for geqn, -p for gpic, +-R for grefer, and -t for gtbl. +

    + +
    +
    +
    + +

    4.6.5.10 Footnotes

    + + + + + +

    A footnote is typically anchored to a place in the text with a +marker, which is a small integer, a symbol such as a dagger, or +arbitrary user-specified text. +

    +
    +
    String: \*[*]
    +
    +

    Place an automatic number, an automatically generated numeric +footnote marker, in the text. Each time this string is interpolated, +the number it produces increments by one. Automatic numbers start at 1. +This is a Berkeley extension. +

    + +

    Enclose the footnote text in FS and FE macro calls to set +it at the nearest available “foot”, or bottom, of a text column or +page. +

    +
    +
    Macro: .FS [marker]
    +
    +
    Macro: .FE
    +
    +

    Begin (FS) and end (FE) a footnote. FS calls +FS-MARK with any supplied marker argument, which is then +also placed at the beginning of the footnote text. If marker is +omitted, the next pending automatic footnote number enqueued by +interpolation of the * string is used, and if none exists, +nothing is prefixed. +

    + +

    You may not desire automatically numbered footnotes in spite of their +convenience. You can indicate a footnote with a symbol or other text by +specifying its marker at the appropriate place (for example, by using +\[dg] for the dagger glyph) and as an argument to the +FS macro. Such manual marks should be repeated as arguments to +FS or as part of the footnote text to disambiguate their +correspondence. You may wish to use \*{ and \*} to +superscript the marker at the anchor point, in the footnote text, or +both. +

    +

    groff ms provides a hook macro, FS-MARK, for +user-determined operations to be performed when the FS macro is +called. It is passed the same arguments as FS itself. An +application of FS-MARK is anchor placement for a hyperlink +reference, so that a footnote can link back to its referential +context.11 By default, this macro has an empty definition. +FS-MARK is a GNU extension. +

    + + + + +

    Footnotes can be safely used within keeps and displays, but you should +avoid using automatically numbered footnotes within floating keeps. You +can place a second \** interpolation between a \** and its +corresponding FS call as long as each FS call occurs +after the corresponding \** and occurrences of FS +are in the same order as corresponding occurrences of \**. +

    +

    Footnote text is formatted as paragraphs are, using analogous +parameters. The registers FI, FPD, FPS, and +FVS correspond to PI, PD, PS, and CS, +respectively; FPD, FPS, and FVS are GNU extensions. +

    +

    The FF register controls the formatting of automatically numbered +footnote paragraphs and those for which FS is given a marker +argument. See Document Control Settings. +

    +

    The default footnote line length is 11/12ths of the normal line length +for compatibility with the expectations of historical ms +documents; you may wish to set the FR string to ‘1’ to align +with contemporary typesetting practices. In the +past,12 an FL register +was used for the line length in footnotes; however, setting this +register at document initialization time had no effect on the footnote +line length in multi-column arrangements.13 +

    +

    FR should be used in preference to the old FL register in +contemporary documents. The footnote line length is effectively +computed as ‘column-width * \*[FR]’. If an absolute +footnote line length is required, recall that arithmetic expressions in +roff input are evaluated strictly from left to right, with no +operator precedence (parentheses are honored). +

    +
    +
    .ds FR 0+3i \" Set footnote line length to 3 inches.
    +
    + + +
    +
    +
    + +

    4.6.5.11 Language and localization

    + + + + + +

    groff ms provides several strings that you can customize +for your own purposes, or redefine to adapt the macro package to +languages other than English. It is already localized for +Czech, German, French, Italian, and Swedish. Load the desired +localization macro package after ms; see the +groff_tmac(5) man page. +

    +
    +
    +
    $ groff -ms -mfr bienvenue.ms
    +
    +
    + +

    The following strings are available. +

    +
    +
    String: \*[REFERENCES]
    +
    +

    Contains the string printed at the beginning of a references +(bibliography) page produced with GNU refer(1). The default +is ‘References’. +

    + +
    +
    String: \*[ABSTRACT]
    +
    +

    Contains the string printed at the beginning of the abstract. The +default is ‘\f[I]ABSTRACT\f[]’; it includes font selection escape +sequences to set the word in italics. +

    + +
    +
    String: \*[TOC]
    +
    +

    Contains the string printed at the beginning of the table of contents. +The default is ‘Table of Contents’. +

    + +
    +
    String: \*[MONTH1]
    +
    +
    String: \*[MONTH2]
    +
    +
    String: \*[MONTH3]
    +
    +
    String: \*[MONTH4]
    +
    +
    String: \*[MONTH5]
    +
    +
    String: \*[MONTH6]
    +
    +
    String: \*[MONTH7]
    +
    +
    String: \*[MONTH8]
    +
    +
    String: \*[MONTH9]
    +
    +
    String: \*[MONTH10]
    +
    +
    String: \*[MONTH11]
    +
    +
    String: \*[MONTH12]
    +
    +

    Contain the full names of the calendar months. The defaults are in +English: ‘January’, ‘February’, and so on. +

    + + +
    +
    +
    +
    + +

    4.6.6 Page layout

    + + + +

    ms’s default page layout arranges text in a single column with +the page number between hyphens centered in a header on each page except +the first, and produces no footers. You can customize this arrangement. +

    + + + +
    +
    + +

    4.6.6.1 Headers and footers

    + + + + + +

    There are multiple ways to produce headers and footers. One is to +define the strings LH, CH, and RH to set the left, +center, and right headers, respectively; and LF, CF, and +RF to set the left, center, and right footers. This approach +suffices for documents that do not distinguish odd- and even-numbered +pages. +

    +

    Another method is to call macros that set headers or footers for odd- or +even-numbered pages. Each such macro takes a delimited argument +separating the left, center, and right header or footer texts from each +other. You can replace the neutral apostrophes (') shown below +with any character not appearing in the header or footer text. These +macros are Berkeley extensions. +

    +
    +
    Macro: .OH 'left'center'right'
    +
    +
    Macro: .EH 'left'center'right'
    +
    +
    Macro: .OF 'left'center'right'
    +
    +
    Macro: .EF 'left'center'right'
    +
    +

    The OH and EH macros define headers for odd- (recto) +and even-numbered (verso) pages, respectively; the OF and +EF macros define footers for them. +

    + +

    With either method, a percent sign % in header or footer text is +replaced by the current page number. By default, ms places no +header on a page numbered “1” (regardless of its number format). +

    +
    +
    Macro: .P1
    +
    +

    Typeset the header even on page 1. To be effective, this macro +must be called before the header trap is sprung on any page numbered +“1”; in practice, unless your page numbering is unusual, this means +that you should call it early, before TL or any heading or +paragraphing macro. This is a Berkeley extension. +

    + +

    For even greater flexibility, ms is designed to permit the +redefinition of the macros that are called when the groff traps +that ordinarily cause the headers and footers to be output are sprung. +PT (“page trap”) is called by ms when the header is to +be written, and BT (“bottom trap”) when the footer is to be. +The groff page location trap that ms sets up to format the +header also calls the (normally undefined) HD macro after +PT; you can define HD if you need additional processing +after setting the header (for example, to draw a line below it). +The HD hook is a Berkeley extension. Any such macros you +(re)define must implement any desired specialization for odd-, even-, or +first numbered pages. +

    + +
    +
    +
    + +

    4.6.6.2 Tab stops

    + +

    Use the ta request to define tab stops as needed. See Tabs and Fields. +

    +
    +
    Macro: .TA
    +
    +

    Reset the tab stops to the ms default (every 5 ens). +Redefine this macro to create a different set of default tab stops. +

    + + +
    +
    +
    + +

    4.6.6.3 Margins

    + + +

    Control margins using the registers summarized in “Margin settings” in +Document Control Settings above. There is no setting for the +right margin; the combination of page offset \n[PO] and line +length \n[LL] determines it. +

    + +
    +
    +
    + +

    4.6.6.4 Multiple columns

    + + + +

    ms can set text in as many columns as reasonably fit on the page. +The following macros force a page break if a multi-column layout is +active when they are called. The MINGW register stores the +default minimum gutter width; it is a GNU extension. When multiple +columns are in use, keeps and the HORPHANS and PORPHANS +registers work with respect to column breaks instead of page breaks. +

    +
    +
    Macro: .1C
    +
    +

    Arrange page text in a single column (the default). +

    + +
    +
    Macro: .2C
    +
    +

    Arrange page text in two columns. +

    + +
    +
    Macro: .MC [column-width [gutter-width]]
    +
    +

    Arrange page text in multiple columns. If you specify no arguments, it +is equivalent to the 2C macro. Otherwise, column-width is +the width of each column and gutter-width is the minimum distance +between columns. +

    + + +
    +
    +
    + +

    4.6.6.5 Creating a table of contents

    + + + +

    Because roff formatters process their input in a single pass, +material on page 50, for example, cannot influence what appears on +page 1—this poses a challenge for a table of contents at its +traditional location in front matter, if you wish to avoid manually +maintaining it. ms enables the collection of material to be +presented in the table of contents as it appears, saving its page number +along with it, and then emitting the collected contents on demand toward +the end of the document. The table of contents can then be resequenced +to its desired location by physically rearranging the pages of a printed +document, or as part of post-processing—with a sed(1) +script to reorder the pages in troff’s output, with +pdfjam(1), or with gropdf(1)’s +‘.pdfswitchtopage’ feature, for example. +

    +

    Define an entry to appear in the table of contents by bracketing its +text between calls to the XS and XE macros. A typical +application is to call them immediately after NH or SH and +repeat the heading text within them. The XA macro, used within +‘.XS’/‘.XE’ pairs, supplements an entry—for instance, when +it requires multiple output lines, whether because a heading is too long +to fit or because style dictates that page numbers not be repeated. You +may wish to indent the text thus wrapped to correspond to its heading +depth; this can be done in the entry text by prefixing it with tabs or +horizontal motion escape sequences, or by providing a second argument to +the XA macro. XS and XA automatically associate +the page number where they are called with the text following them, but +they accept arguments to override this behavior. At the end of the +document, call TC or PX to emit the table of contents; +TC resets the page number to ‘i’ (Roman numeral one), and +then calls PX. All of these macros are Berkeley extensions. +

    +
    +
    Macro: .XS [page-number]
    +
    +
    Macro: .XA [page-number [indentation]]
    +
    +
    Macro: .XE
    +
    +

    Begin, supplement, and end a table of contents entry. Each entry is +associated with page-number (otherwise the current page number); a +page-number of ‘no’ prevents a leader and page number from +being emitted for that entry. Use of XA within +XS/XE is optional; it can be repeated. If +indentation is present, a supplemental entry is indented by that +amount; ens are assumed if no unit is indicated. Text on input lines +between XS and XE is stored for later recall by PX. +

    + +
    +
    Macro: .PX [no]
    +
    +

    Switch to single-column layout. Unless no is specified, center +and interpolate the TOC string in bold and two points larger than +the body text. Emit the table of contents entries. +

    + +
    +
    Macro: .TC [no]
    +
    +

    Set the page number to 1, the page number format to lowercase Roman +numerals, and call PX (with a no argument, if present). +

    + +

    Here’s an example of typical ms table of contents preparation. +We employ horizontal escape sequences \h to indent the entries by +sectioning depth. +

    +
    +
    +
    .NH 1
    +Introduction
    +.XS
    +Introduction
    +.XE
    +
    +.NH 2
    +Methodology
    +.XS
    +\h'2n'Methodology
    +.XA
    +\h'4n'Fassbinder's Approach
    +\h'4n'Kahiu's Approach
    +.XE
    +
    +.NH 1
    +Findings
    +.XS
    +Findings
    +.XE
    +
    +.TC
    +
    +
    + +

    The remaining features in this subsubsection are GNU extensions. +groff ms obviates the need to repeat heading text after +XS calls. Call XN and XH after NH and +SH, respectively. +

    +
    +
    Macro: .XN heading-text
    +
    +
    Macro: .XH depth heading-text
    +
    +

    Format heading-text and create a corresponding table of contents +entry. XN computes the indentation from the depth of the +preceding NH call; XH requires a depth argument to +do so. +

    + +

    groff ms encourages customization of table of contents +entry production. +

    +
    +
    Macro: .XN-REPLACEMENT heading-text
    +
    +
    Macro: .XH-REPLACEMENT depth heading-text
    +
    +

    These hook macros implement XN and XH, respectively. +They call XN-INIT and pass their heading-text arguments to +XH-UPDATE-TOC. +

    + +
    +
    Macro: .XN-INIT
    +
    +
    Macro: .XH-UPDATE-TOC depth heading-text
    +
    +

    The XN-INIT hook macro does nothing by default. +XH-UPDATE-TOC brackets heading-text with XS and +XE calls, indenting it by 2 ens per level of depth beyond +the first. +

    + +

    We could therefore produce a table of contents similar to that in the +previous example with fewer macro calls. (The difference is that this +input follows the “Approach” entries with leaders and page numbers.) +

    +
    +
    +
    .NH 1
    +.XN Introduction
    +
    +.NH 2
    +.XN Methodology
    +.XH 3 "Fassbinder's Approach"
    +.XH 3 "Kahiu's Approach"
    +
    +.NH 1
    +.XN Findings
    +
    +
    +
    + +

    To get the section number of the numbered headings into the table of +contents entries, we might define XN-REPLACEMENT as follows. +(We obtain the heading depth from groff ms’s internal +register nh*hl.) +

    +
    +
    +
    .de XN-REPLACEMENT
    +.XN-INIT
    +.XH-UPDATE-TOC \\n[nh*hl] \\$@
    +\&\\*[SN] \\$*
    +..
    +
    +
    + +

    You can change the style of the leader that bridges each table of +contents entry with its page number; define the TC-LEADER special +character by using the char request. A typical leader combines +the dot glyph ‘.’ with a horizontal motion escape sequence to +spread the dots. The width of the page number field is stored in the +TC-MARGIN register. +

    + +
    +
    +
    +
    + +

    4.6.7 Differences from AT&T ms

    + + + +

    The groff ms macros are an independent reimplementation, +using no AT&T code. Since they take advantage of the extended +features of groff, they cannot be used with AT&T +troff. groff ms supports features described above +as Berkeley and Tenth Edition Research Unix extensions, and adds several +of its own. +

    +
      +
    • The internals of groff ms differ from the internals of +AT&T ms. Documents that depend upon implementation +details of AT&T ms may not format properly with +groff ms. Such details include macros whose function was +not documented in the AT&T ms +manual.14 + +
    • The error-handling policy of groff ms is to detect and +report errors, rather than to ignore them silently. + +
    • Tenth Edition Research Unix supported P1/P2 macros to bracket code +examples; groff ms does not. + +
    • groff ms does not work in GNU troff’s +AT&T compatibility mode. If loaded when that mode is enabled, +it aborts processing with a diagnostic message. + +
    • Multiple line spacing is not supported. Use a larger vertical spacing +instead. + +
    • groff ms uses the same header and footer defaults in both +nroff and troff modes as AT&T ms does in +troff mode; AT&T’s default in nroff mode is to +put the date, in U.S. traditional format (e.g., “January 1, 2021”), +in the center footer (the CF string). + +
    • Many groff ms macros, including those for paragraphs, +headings, and displays, cause a reset of paragraph rendering parameters, +and may change the indentation; they do so not by incrementing or +decrementing it, but by setting it absolutely. This can cause problems +for documents that define additional macros of their own that try to +manipulate indentation. Use the ms RS and RE +macros instead of the in request. + +
    • + +AT&T ms interpreted the values of the registers +PS and VS in points, and did not support the use of +scaling units with them. groff ms interprets values of +the registers PS, VS, FPS, and FVS equal to +or larger than 1,000 (one thousand) as decimal fractions multiplied +by 1,000.15 This threshold makes use of a +scaling unit with these parameters practical for high-resolution +devices while preserving backward compatibility. It also permits +expression of non-integral type sizes. For example, ‘groff +-rPS=10.5p’ at the shell prompt is equivalent to placing ‘.nr PS +10.5p’ at the beginning of the document. + +
    • AT&T ms’s AU macro supported arguments used with +some document types; groff ms does not. + +
    • Right-aligned displays are available. The AT&T ms +manual observes that “it is tempting to assume that ‘.DS R’ will +right adjust lines, but it doesn’t work”. In groff ms, +it does. + +
    • To make groff ms use the default page offset (which also +specifies the left margin), the PO register must stay undefined +until the first ms macro is called. + +

      This implies that ‘\n[PO]’ should not be used early in the +document, unless it is changed also: accessing an undefined register +automatically defines it. +

      +
    • groff ms supports the PN register, but it is not +necessary; you can access the page number via the usual % +register and invoke the af request to assign a different format +to it if desired.16 + +
    • The AT&T ms manual documents registers CW and +GW as setting the default column width and “intercolumn gap”, +respectively, and which applied when MC was called with fewer +than two arguments. groff ms instead treats MC +without arguments as synonymous with 2C; there is thus no +occasion for a default column width register. Further, the MINGW +register and the second argument to MC specify a minimum +space between columns, not the fixed gutter width of AT&T +ms. + +
    • The AT&T ms manual did not document the QI +register; Berkeley and groff ms do. +
    + +
    +
    Register: \n[GS]
    +
    +

    The register GS is set to 1 by the groff ms +macros, but is not used by the AT&T ms package. +Documents that need to determine whether they are being formatted with +groff ms or another implementation should test this +register. +

    + + + + +
    +
    + +

    4.6.7.1 Unix Version 7 ms macros not implemented by groff ms

    + +

    Several macros described in the Unix Version 7 ms +documentation are unimplemented by groff ms because they +are specific to the requirements of documents produced internally by +Bell Laboratories, some of which also require a glyph for the Bell +System logo that groff does not support. These macros +implemented several document type formats +(EG, IM, MF, MR, TM, TR), were meaningful only in conjunction with the use of certain document +types +(AT, CS, CT, OK, SG), stored the postal addresses of Bell Labs sites +(HO, IH, MH, PY, WH), or lacked a stable definition over time +(UX). To compatibly render historical ms documents using these macros, +we advise your documents to invoke the rm request to remove any +such macros it uses and then define replacements with an authentically +typeset original at hand.17 For +informal purposes, a simple definition of UX should maintain the +readability of the document’s substance. +

    +
    +
    +
    .rm UX
    +.ds UX Unix\"
    +
    +
    + + +
    +
    +
    +
    + +

    4.6.8 Legacy Features

    + + + + + + + +

    groff ms retains some legacy features solely to support +formatting of historical documents; contemporary ones should not use +them because they can render poorly. See the groff_char(7) +man page. +

    + +
    +

    AT&T accent mark strings

    + +

    AT&T ms defined accent mark strings as follows. +

    +
    +
    String: \*[']
    +
    +

    Apply acute accent to subsequent glyph. +

    + +
    +
    String: \*[`]
    +
    +

    Apply grave accent to subsequent glyph. +

    + +
    +
    String: \*[:]
    +
    +

    Apply dieresis (umlaut) to subsequent glyph. +

    + +
    +
    String: \*[^]
    +
    +

    Apply circumflex accent to subsequent glyph. +

    + +
    +
    String: \*[~]
    +
    +

    Apply tilde accent to subsequent glyph. +

    + +
    +
    String: \*[C]
    +
    +

    Apply caron to subsequent glyph. +

    + +
    +
    String: \*[,]
    +
    +

    Apply cedilla to subsequent glyph. +

    + +
    +
    +

    Berkeley accent mark and glyph strings

    + +

    Berkeley ms offered an AM macro; calling it redefined the +AT&T accent mark strings (except for ‘\*C’), applied them to the +preceding glyph, and defined additional strings, some for spacing +glyphs. +

    +
    +
    Macro: .AM
    +
    +

    Enable alternative accent mark and glyph-producing strings. +

    + +
    +
    String: \*[']
    +
    +

    Apply acute accent to preceding glyph. +

    + +
    +
    String: \*[`]
    +
    +

    Apply grave accent to preceding glyph. +

    + +
    +
    String: \*[:]
    +
    +

    Apply dieresis (umlaut) to preceding glyph. +

    + +
    +
    String: \*[^]
    +
    +

    Apply circumflex accent to preceding glyph. +

    + +
    +
    String: \*[~]
    +
    +

    Apply tilde accent to preceding glyph. +

    + +
    +
    String: \*[,]
    +
    +

    Apply cedilla to preceding glyph. +

    + +
    +
    String: \*[/]
    +
    +

    Apply stroke (slash) to preceding glyph. +

    + +
    +
    String: \*[v]
    +
    +

    Apply caron to preceding glyph. +

    + +
    +
    String: \*[_]
    +
    +

    Apply macron to preceding glyph. +

    + +
    +
    String: \*[.]
    +
    +

    Apply underdot to preceding glyph. +

    + +
    +
    String: \*[o]
    +
    +

    Apply ring accent to preceding glyph. +

    + +
    +
    String: \*[?]
    +
    +

    Interpolate inverted question mark. +

    + +
    +
    String: \*[!]
    +
    +

    Interpolate inverted exclamation mark. +

    + +
    +
    String: \*[8]
    +
    +

    Interpolate small letter sharp s. +

    + +
    +
    String: \*[q]
    +
    +

    Interpolate small letter o with hook accent (ogonek). +

    + +
    +
    String: \*[3]
    +
    +

    Interpolate small letter yogh. +

    + +
    +
    String: \*[d-]
    +
    +

    Interpolate small letter eth. +

    + +
    +
    String: \*[D-]
    +
    +

    Interpolate capital letter eth. +

    + +
    +
    String: \*[th]
    +
    +

    Interpolate small letter thorn. +

    + +
    +
    String: \*[Th]
    +
    +

    Interpolate capital letter thorn. +

    + +
    +
    String: \*[ae]
    +
    +

    Interpolate small æ ligature. +

    + +
    +
    String: \*[Ae]
    +
    +

    Interpolate capital Æ ligature. +

    + +
    +
    String: \*[oe]
    +
    +

    Interpolate small oe ligature. +

    + +
    +
    String: \*[OE]
    +
    +

    Interpolate capital OE ligature. +

    + + +
    +
    +
    +
    + +

    4.6.9 Naming Conventions

    + + + +

    The following conventions are used for names of macros, strings, and +registers. External names available to documents that use the +groff ms macros contain only uppercase letters and digits. +

    +

    Internally, the macros are divided into modules. Conventions for +identifier names are as follows. +

    +
      +
    • Names used only within one module are of the form +module*name. + +
    • Names used outside the module in which they are defined are of the form +module@name. + +
    • Names associated with a particular environment are of the form +environment:name; these are used only within the +par module. + +
    • name does not have a module prefix. + +
    • Constructed names used to implement arrays are of the form +array!index. +
    + +

    Thus the groff ms macros reserve the following names. +

    +
      +
    • Names containing the characters *, @, and :. + +
    • Names containing only uppercase letters and digits. +
    + + + +
    +
    +
    +
    +
    + +

    5 GNU troff Reference

    + + + +

    This chapter covers all of the facilities of the GNU +troff formatting engine. Users of macro packages may skip it if +not interested in details. +

    + + + + + +
    +
    + +

    5.1 Text

    + + +

    AT&T troff was designed to take input as it would be +composed on a typewriter, including the teletypewriters used as early +computer terminals, and relieve the user drafting a document of concern +with details like line length, hyphenation breaking, and the achievement +of straight margins. Early in its development, the program gained the +ability to prepare output for a phototypesetter; a document could then +be prepared for output to either a teletypewriter, a phototypesetter, or +both. GNU troff continues this tradition of permitting an author +to compose a single master version of a document which can then be +rendered for a variety of output formats or devices. +

    +

    roff input files contain text interspersed with instructions to +control the formatter. Even in the absence of such instructions, GNU +troff still processes its input in several ways, by filling, +hyphenating, breaking, and adjusting it, and supplementing it with +inter-sentence space. +

    + + + +
    +
    + +

    5.1.1 Filling

    + +

    When GNU troff starts up, it obtains information about the device +for which it is preparing output.18 An essential property is the length of the output +line, such as “6.5 inches”. +

    + + +

    GNU troff interprets plain text files employing the Unix +line-ending convention. It reads input a character at a time, +collecting words as it goes, and fits as many words together on an +output line as it can—this is known as filling. To GNU +troff, a word is any sequence of one or more characters +that aren’t spaces or newlines. The exceptions separate +words.19 To disable filling, see +Manipulating Filling and Adjustment. +

    +
    +
    It is a truth universally acknowledged
    +that a single man in possession of a
    +good fortune must be in want of a wife.
    +    ⇒ It is a truth universally acknowledged that a
    +    ⇒ single man in possession of a good fortune must
    +    ⇒ be in want of a wife.
    +
    + + +
    +
    +
    + +

    5.1.2 Sentences

    + + +

    A passionate debate has raged for decades among writers of the English +language over whether more space should appear between adjacent +sentences than between words within a sentence, and if so, how much, and +what other circumstances should influence this spacing.20 +GNU troff follows the example of AT&T troff; +it attempts to detect the boundaries between sentences, and supplies +additional inter-sentence space between them. +

    +
    +
    Hello, world!
    +Welcome to groff.
    +    ⇒ Hello, world!  Welcome to groff.
    +
    + + + + + +

    GNU troff flags certain characters (normally ‘!’, ‘?’, +and ‘.’) as potentially ending a sentence. When GNU troff +encounters one of these end-of-sentence characters at the end of +an input line, or one of them is followed by two (unescaped) spaces on +the same input line, it appends an inter-word space followed by an +inter-sentence space in the output. +

    +
    +
    R. Harper subscribes to a maxim of P. T. Barnum.
    +    ⇒ R. Harper subscribes to a maxim of P. T. Barnum.
    +
    + +

    In the above example, inter-sentence space is not added after ‘P.’ +or ‘T.’ because the periods do not occur at the end of an input +line, nor are they followed by two or more spaces. Let’s imagine that +we’ve heard something about defamation from Mr. Harper’s attorney, +recast the sentence, and reflowed it in our text editor. +

    +
    +
    I submit that R. Harper subscribes to a maxim of P. T.
    +Barnum.
    +    ⇒ I submit that R. Harper subscribes to a maxim of
    +    ⇒ P. T.  Barnum.
    +
    + +

    “Barnum” doesn’t begin a sentence! What to do? Let us meet our first +escape sequence, a series of input characters that give +instructions to GNU troff instead of being used to construct +output device glyphs.21 An escape sequence begins with the backslash character \ +by default, an uncommon character in natural language text, and is +always followed by at least one other character, hence the term +“sequence”. +

    + +

    The dummy character escape sequence \& can be used after an +end-of-sentence character to defeat end-of-sentence detection on a +per-instance basis. We can therefore rewrite our input more +defensively. +

    +
    +
    I submit that R.\& Harper subscribes to a maxim of P.\&
    +T.\& Barnum.
    +    ⇒ I submit that R. Harper subscribes to a maxim of
    +    ⇒ P. T. Barnum.
    +
    + +

    Adding text caused our input to wrap; now, we don’t need \& after +‘T.’ but we do after ‘P.’. Consistent use of the escape +sequence ensures that potential sentence boundaries are robust to +editing activities. Further advice along these lines will follow in +Input Conventions. +

    + + + + + + + + + + + + + +

    Normally, the occurrence of a visible non-end-of-sentence character (as +opposed to a space or tab) immediately after an end-of-sentence +character cancels detection of the end of a sentence. For example, it +would be incorrect for GNU troff to infer the end of a sentence +after the dot in ‘3.14159’. However, several characters are +treated transparently after the occurrence of an end-of-sentence +character. That is, GNU troff does not cancel end-of-sentence +detection when it processes them. This is because such characters are +often used as footnote markers or to close quotations and +parentheticals. The default set is ‘"’, ‘'’, ‘)’, +‘]’, ‘*’, \[dg], \[dd], \[rq], and +\[cq]. The last four are examples of special characters, +escape sequences whose purpose is to obtain glyphs that are not easily +typed at the keyboard, or which have special meaning to GNU troff +(like \ itself).22 +

    +
    +
    \[lq]The idea that the poor should have leisure has always
    +been shocking to the rich.\[rq]
    +(Bertrand Russell, 1935)
    +    ⇒ "The idea that the poor should have
    +    ⇒ leisure has always been shocking to
    +    ⇒ the rich."  (Bertrand Russell, 1935)
    +
    + +

    The sets of characters that potentially end sentences or are transparent +to sentence endings are configurable. See the cflags request in +Using Symbols. To change the additional inter-sentence space +amount—even to remove it entirely—see Manipulating Filling and Adjustment. +

    + +
    +
    +
    + +

    5.1.3 Hyphenation

    + + +

    When an output line is nearly full, it is uncommon for the next word +collected from the input to exactly fill it—typically, there is room +left over only for part of the next word. The process of splitting a +word so that it appears partially on one line (with a hyphen to indicate +to the reader that the word has been broken) with its remainder on the +next is hyphenation. Hyphenation points can be manually +specified; GNU troff also uses a hyphenation algorithm and +language-specific pattern files (based on those used in TeX) to +decide which words can be hyphenated and where. +

    +

    Hyphenation does not always occur even when the hyphenation rules for a +word allow it; it can be disabled, and when not disabled there are +several parameters that can prevent it in certain circumstances. +See Manipulating Hyphenation. +

    + +
    +
    +
    + +

    5.1.4 Breaking

    + + + + + +

    Once an output line is full, the next word (or remainder of a hyphenated +one) is placed on a different output line; this is called a break. +In this manual and in roff discussions generally, a “break” if +not further qualified always refers to the termination of an output +line. When the formatter is filling text, it introduces breaks +automatically to keep output lines from exceeding the configured line +length. After an automatic break, GNU troff adjusts the line if +applicable (see below), and then resumes collecting and filling text on +the next output line. +

    +

    Sometimes, a line cannot be broken automatically. This usually does +not happen with natural language text unless the output line length has +been manipulated to be extremely short, but it can with specialized +text like program source code. We can use perl at the shell +prompt to contrive an example of failure to break the line. We also +employ the -z option to suppress normal output. +

    +
    +
    $ perl -e 'print "#" x 80, "\n";' | nroff -z
    +    error→ warning: cannot break line
    +
    + +

    The remedy for these cases is to tell GNU troff where the line +may be broken without hyphens. This is done with the non-printing break +point escape sequence ‘\:’; see Manipulating Hyphenation. +

    + + + + +

    What if the document author wants to stop filling lines temporarily, for +instance to start a new paragraph? There are several solutions. A +blank input line not only causes a break, but by default it also outputs +a one-line vertical space (effectively a blank output line). This +behavior can be modified; see Blank Line Traps. Macro packages +may discourage or disable the blank line method of paragraphing in favor +of their own macros. +

    + + + + +

    A line that begins with one or more spaces causes a break. The spaces +are output at the beginning of the next line without being +adjusted (see below); however, this behavior can be modified +(see Leading Space Traps). Again, macro packages may provide other +methods of producing indented paragraphs. Trailing spaces on text lines +are discarded.23 +

    +

    What if the file ends before enough words have been collected to fill an +output line? Or the output line is exactly full but not yet broken, and +there is no more input? GNU troff interprets the end of input as +a break. Certain requests also cause breaks, implicitly or explicitly. +This is discussed in Manipulating Filling and Adjustment. +

    + +
    +
    +
    + +

    5.1.5 Adjustment

    + + +

    After GNU troff performs an automatic break, it may then +adjust the line, widening inter-word spaces until the text reaches +the right margin. Extra spaces between words are preserved. Leading +and trailing spaces are handled as noted above. Text can be aligned to +the left or right margin only, or centered; see Manipulating Filling and Adjustment. +

    + +
    +
    +
    + +

    5.1.6 Tabs and Leaders

    + + + + + + + + +

    GNU troff translates input horizontal tab characters (“tabs”) +and Control+A characters (“leaders”) into movements to the next +tab stop. Tabs simply move to the next tab stop; leaders place enough +periods to fill the space. Tab stops are by default located every half +inch measured from the drawing position corresponding to the beginning +of the input line; see Page Geometry. Tabs and leaders do not +cause breaks and therefore do not interrupt filling. Below, we use +arrows → and bullets • to indicate input tabs and +leaders, respectively. +

    +
    +
    1
    +→ 2 → 3 • 4
    +→ • 5
    +⇒ 1         2       3.......4         ........5
    +
    + +

    Tabs and leaders lend themselves to table construction.24 The tab and leader glyphs can be +configured, and further facilities for sophisticated table composition +are available; see Tabs and Fields. There are many details to +track when using such low-level features, so most users turn to the +tbl(1) preprocessor to lay out tables. +

    + +
    +
    +
    + +

    5.1.7 Requests and Macros

    + +

    We have now encountered almost all of the syntax there is in the +roff language, with an exception already noted in passing. + + + + + + +A request is an instruction to the formatter that occurs after a +control character, which is recognized at the beginning of an +input line. The regular control character is a dot (.). Its +counterpart, the no-break control character, a neutral apostrophe +('), suppresses the break that is implied by some requests. +These characters were chosen because it is uncommon for lines of text in +natural languages to begin with them. + + +If you require a formatted period or apostrophe (closing single +quotation mark) where GNU troff is expecting a control character, +prefix the dot or neutral apostrophe with the dummy character escape +sequence, ‘\&’. +

    + +

    An input line beginning with a control character is called a +control line. + +Every line of input that is not a control line is a text +line.25 +

    + +

    Requests often take arguments, words (separated from the request +name and each other by spaces) that specify details of the action GNU +troff is expected to perform. If a request is meaningless +without arguments, it is typically ignored. +

    +

    GNU troff’s requests and escape sequences comprise the control +language of the formatter. Of key importance are the requests that +define macros. Macros are invoked like requests, enabling the request +repertoire to be extended or overridden.26 +

    + + + +

    A macro can be thought of as an abbreviation you can define for a +collection of control and text lines. When the macro is called by +giving its name after a control character, it is replaced with what it +stands for. The process of textual replacement is known as +interpolation.27 Interpolations are handled as soon as they are +recognized, and once performed, a roff formatter scans the +replacement for further requests, macro calls, and escape sequences. +

    +

    In roff systems, the de request defines a +macro.28 +

    +
    +
    .de DATE
    +2020-11-14
    +..
    +
    + +

    The foregoing input produces no output by itself; all we have done is +store some information. Observe the pair of dots that ends the macro +definition. This is a default; you can specify your own terminator for +the macro definition as the second argument to the de request. +

    +
    +
    .de NAME ENDNAME
    +Heywood Jabuzzoff
    +.ENDNAME
    +
    + +

    In fact, the ending marker is itself the name of a macro to be +called, or a request to be invoked, if it is defined at the time its +control line is read. +

    +
    +
    .de END
    +Big Rip
    +..
    +.de START END
    +Big Bang
    +.END
    +.START
    +    ⇒ Big Rip Big Bang
    +
    + +

    In the foregoing example, “Big Rip” printed before “Big Bang” +because its macro was called first. Consider what would happen +if we dropped END from the ‘.de START’ line and added +.. after .END. Would the order change? +

    +

    Let us consider a more elaborate example. +

    +
    +
    .de DATE
    +2020-10-05
    +..
    +.
    +.de BOSS
    +D.\& Kruger,
    +J.\& Peterman
    +..
    +.
    +.de NOTICE
    +Approved:
    +.DATE
    +by
    +.BOSS
    +..
    +.
    +Insert tedious regulatory compliance paragraph here.
    +
    +.NOTICE
    +
    +Insert tedious liability disclaimer paragraph here.
    +
    +.NOTICE
    +    ⇒ Insert tedious regulatory compliance paragraph here.
    +    ⇒
    +    ⇒ Approved: 2020-10-05 by D. Kruger, J. Peterman
    +    ⇒
    +    ⇒ Insert tedious liability disclaimer paragraph here.
    +    ⇒
    +    ⇒ Approved: 2020-10-05 by D. Kruger, J. Peterman
    +
    + +

    The above document started with a series of control lines. Three macros +were defined, with a de request declaring each macro’s name, and +the “body” of the macro starting on the next line and continuing until +a line with two dots ‘..’ marked its end. The text proper +began only after the macros were defined; this is a common pattern. +Only the NOTICE macro was called “directly” by the document; +DATE and BOSS were called only by NOTICE itself. +Escape sequences were used in BOSS, two levels of macro +interpolation deep. +

    +

    The advantage in typing and maintenance economy may not be obvious from +such a short example, but imagine a much longer document with dozens of +such paragraphs, each requiring a notice of managerial approval. +Consider what must happen if you are in charge of generating a new +version of such a document with a different date, for a different boss. +With well-chosen macros, you only have to change each datum in one +place. +

    +

    In practice, we would probably use strings (see Strings) instead of +macros for such simple interpolations; what is important here is to +glimpse the potential of macros and the power of recursive +interpolation. +

    +

    We could have defined DATE and BOSS in the opposite order; +perhaps less obviously, we could also have defined them after +NOTICE. “Forward references” like this are acceptable because +the body of a macro definition is not (completely) interpreted, but +stored instead (see Copy Mode). While a macro is being defined (or +appended to), requests are not interpreted and macros not interpolated, +whereas some commonly used escape sequences are interpreted. +roff systems also support recursive macro calls, as long as you +have a way to break the recursion (see Conditionals and Loops). +Maintainable roff documents tend to arrange macro definitions to +minimize forward references. +

    + +
    +
    +
    + +

    5.1.8 Macro Packages

    + + + +

    Macro definitions can be collected into macro files, roff +input files designed to produce no output themselves but instead ease +the preparation of other roff documents. There is no syntactical +difference between a macro file and any other roff document; only +its purpose distinguishes it. When a macro file is installed at a +standard location and suitable for use by a general audience, it is +often termed a macro package.29 Macro packages can be +loaded by supplying the -m option to GNU troff or a +groff front end. Alternatively, a document requiring a macro +package can load it with the mso (“macro source”) request. +

    + + +
    +
    +
    + +

    5.1.9 Input Encodings

    + +

    The groff command’s -k option calls the +preconv preprocessor to perform input character encoding +conversions. Input to the GNU troff formatter itself, on the +other hand, must be in one of two encodings it can recognize. +

    +
    +
    cp1047
    +
    + + + + + + +

    The code page 1047 input encoding works only on EBCDIC +platforms (and conversely, the other input encodings don’t work with +EBCDIC); the file cp1047.tmac is loaded at startup. +

    +
    +
    latin1
    +
    + + + +

    ISO Latin-1, an encoding for Western European languages, is the +default input encoding on non-EBCDIC platforms; the file +latin1.tmac is loaded at startup. +

    +
    + +

    Any document that is encoded in ISO 646:1991 (a descendant of USAS +X3.4-1968 or “US-ASCII”), or, equivalently, uses only code points +from the “C0 Controls” and “Basic Latin” parts of the Unicode +character set is also a valid ISO Latin-1 document; the standards +are interchangeable in their first 128 code points.30 +

    +

    Other encodings are supported by means of macro packages. +

    +
    +
    latin2
    +
    + + + +

    To use ISO Latin-2, an encoding for Central and Eastern European +languages, invoke ‘.mso latin2.tmac at the beginning of your +document or supply ‘-mlatin2’ as a command-line argument to +groff. +

    +
    +
    latin5
    +
    + + + +

    To use ISO Latin-5, an encoding for the Turkish language, invoke +‘.mso latin5.tmac at the beginning of your document or +supply ‘-mlatin5’ as a command-line argument to groff. +

    +
    +
    latin9
    +
    + + + +

    ISO Latin-9 succeeds Latin-1; it includes a Euro sign and better +glyph coverage for French. To use this encoding, invoke ‘.mso latin9.tmac at the beginning of your document or supply +‘-mlatin9’ as a command-line argument to groff. +

    +
    + +

    Some characters from an input encoding may not be available with a +particular output driver, or their glyphs may not have representation in +the font used. For terminal devices, fallbacks are defined, like +‘EUR’ for the Euro sign and ‘(C)’ for the copyright sign. For +typesetter devices, you may need to “mount” fonts that support glyphs +required by the document. See Font Positions. +

    + + +

    Because a Euro glyph was not historically defined in PostScript fonts, +groff comes with a font called freeeuro.pfa that provides +the Euro in several styles. Standard PostScript fonts contain the +glyphs from Latin-5 and Latin-9 that Latin-1 lacks, so these +encodings are supported for the ps and pdf output +devices as groff ships, while Latin-2 is not. +

    +

    Unicode supports characters from all other input encodings; the +utf8 output driver for terminals therefore does as well. The +DVI output driver supports the Latin-2 and Latin-9 encodings if +the command-line option -mec is used as well. 31 +

    + +
    +
    +
    + +

    5.1.10 Input Conventions

    + + + +

    Since GNU troff fills text automatically, it is common practice +in the roff language to avoid visual composition of text in input +files: the esthetic appeal of the formatted output is what matters. +Therefore, roff input should be arranged such that it is easy for +authors and maintainers to compose and develop the document, understand +the syntax of roff requests, macro calls, and preprocessor +languages used, and predict the behavior of the formatter. Several +traditions have accrued in service of these goals. +

    +
      +
    • Follow sentence endings in the input with newlines to ease their +recognition (see Sentences). It is frequently convenient to end +text lines after colons and semicolons as well, as these typically +precede independent clauses. Consider doing so after commas; they often +occur in lists that become easy to scan when itemized by line, or +constitute supplements to the sentence that are added, deleted, or +updated to clarify it. Parenthetical and quoted phrases are also good +candidates for placement on text lines by themselves. + +
    • Set your text editor’s line length to 72 characters or +fewer.32 +This limit, combined with the previous item of advice, makes it less +common that an input line will wrap in your text editor, and thus will +help you perceive excessively long constructions in your text. Recall +that natural languages originate in speech, not writing, and that +punctuation is correlated with pauses for breathing and changes in +prosody. + +
    • Use \& after ‘!’, ‘?’, and ‘.’ if they are +followed by space, tab, or newline characters and don’t end a sentence. + +
    • In filled text lines, use \& before ‘.’ and ‘'’ if they +are preceded by space, so that reflowing the input doesn’t turn them +into control lines. + +
    • Do not use spaces to perform indentation or align columns of a table. +Leading spaces are reliable when text is not being filled. + +
    • Comment your document. It is never too soon to apply comments to +record information of use to future document maintainers (including your +future self). We thus introduce another escape sequence, \", +which causes GNU troff to ignore the remainder of the input line. + +
    • Use the empty request—a control character followed immediately by a +newline—to visually manage separation of material in input files. +Many of the groff project’s own documents use an empty request +between sentences, after macro definitions, and where a break is +expected, and two empty requests between paragraphs or other requests or +macro calls that will introduce vertical space into the document. + +

      You can combine the empty request with the comment escape sequence to +include whole-line comments in your document, and even “comment out” +sections of it. +

    + +

    We conclude this section with an example sufficiently long to illustrate +most of the above suggestions in practice. For the purpose of fitting +the example between the margins of this manual with the font used for +its typeset version, we have shortened the input line length to 56 +columns. As before, an arrow → indicates a tab character. +

    +
    +
    +
    .\"   nroff this_file.roff | less
    +.\"   groff -T ps this_file.roff > this_file.ps
    +→The theory of relativity is intimately connected with
    +the theory of space and time.
    +.
    +I shall therefore begin with a brief investigation of
    +the origin of our ideas of space and time,
    +although in doing so I know that I introduce a
    +controversial subject.  \" remainder of paragraph elided
    +.
    +.
    +
    +→The experiences of an individual appear to us arranged
    +in a series of events;
    +in this series the single events which we remember
    +appear to be ordered according to the criterion of
    +\[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped
    +which cannot be analysed further.
    +.
    +There exists,
    +therefore,
    +for the individual,
    +an I-time,
    +or subjective time.
    +.
    +This itself is not measurable.
    +.
    +I can,
    +indeed,
    +associate numbers with the events,
    +in such a way that the greater number is associated with
    +the later event than with an earlier one;
    +but the nature of this association may be quite
    +arbitrary.
    +.
    +This association I can define by means of a clock by
    +comparing the order of events furnished by the clock
    +with the order of a given series of events.
    +.
    +We understand by a clock something which provides a
    +series of events which can be counted,
    +and which has other properties of which we shall speak
    +later.
    +.\" Albert Einstein, _The Meaning of Relativity_, 1922
    +
    +
    + +
    +
    +
    +
    + +

    5.2 Page Geometry

    + + + +

    roff systems format text under certain assumptions about the size +of the output medium, or page. For the formatter to correctly break a +line it is filling, it must know the line length, which it derives from +the page width (see Line Layout). For it to decide whether to write +an output line to the current page or wait until the next one, it must +know the page length (see Page Layout). +

    + + + + + + +

    A device’s resolution converts practical units like inches or +centimeters to basic units, a convenient length measure for the +output device or file format. The formatter and output driver use basic +units to reckon page measurements. The device description file defines +its resolution and page dimensions (see DESC File Format). +

    + +

    A page is a two-dimensional structure upon which a roff +system imposes a rectangular coordinate system with its upper left +corner as the origin. Coordinate values are in basic units and increase +down and to the right. Useful ones are therefore always positive and +within numeric ranges corresponding to the page boundaries. +

    + + +

    While the formatter (and, later, output driver) is processing a page, it +keeps track of its drawing position, which is the location at +which the next glyph will be written, from which the next motion will be +measured, or where a geometric object will commence rendering. + + +Notionally, glyphs are drawn from the text baseline upward and to the +right.33 The text baseline is a (usually invisible) line upon +which the glyphs of a typeface are aligned. A glyph therefore +“starts” at its bottom-left corner. If drawn at the origin, a typical +letter glyph would lie partially or wholly off the page, depending on +whether, like “g”, it features a descender below the baseline. +

    + + +

    Such a situation is nearly always undesirable. It is furthermore +conventional not to write or draw at the extreme edges of the page. +Therefore the initial drawing position of a roff formatter is not +at the origin, but below and to the right of it. This rightward shift +from the left edge is known as the page +offset.34 The downward shift leaves room for a text output +line. +

    +

    Text is arranged on a one-dimensional lattice of text baselines from the +top to the bottom of the page. + + + +Vertical spacing is the distance between adjacent text baselines. +Typographic tradition sets this quantity to 120% of the type size. The +initial drawing position is one unit of vertical spacing below the page +top. Typographers term this unit a vee. +

    + + + + +

    Vertical spacing has an impact on page-breaking decisions. Generally, +when a break occurs, the formatter moves the drawing position to the +next text baseline automatically. If the formatter were already writing +to the last line that would fit on the page, advancing by one vee would +place the next text baseline off the page. Rather than let that happen, +roff formatters instruct the output driver to eject the page, +start a new one, and again set the drawing position to one vee below the +page top; this is a page break. +

    +

    When the last line of input text corresponds to the last output line +that fits on the page, the break caused by the end of input will also +break the page, producing a useless blank one. Macro packages keep +users from having to confront this difficulty by setting “traps” +(see Traps); moreover, all but the simplest page layouts tend to +have headers and footers, or at least bear vertical margins larger than +one vee. +

    + + +
    +
    +
    + +

    5.3 Measurements

    + + + + + + +

    The formatter sometimes requires the input of numeric parameters to +specify measurements. These are specified as integers or decimal +fractions with an optional scaling unit suffixed. A scaling unit +is a letter that immediately follows the last digit of a number. Digits +after the decimal point are optional. Measurement expressions include +‘10.5p’, ‘11i’, and ‘3.c’. +

    + + + +

    Measurements are scaled by the scaling unit and stored internally (with +any fractional part discarded) in basic units. + + +The device resolution can therefore be obtained by storing a value of +‘1i’ to a register. The only constraint on the basic unit is that +it is at least as small as any other unit. +

    +
    +
    + + + +
    +
    u
    +

    Basic unit. +

    +
    +
    i
    +
    + + +

    Inch; defined as 2.54 centimeters. +

    +
    +
    c
    +
    + + +

    Centimeter; a centimeter is about 0.3937 inches. +

    +
    +
    p
    +
    + + +

    Point; a typesetter’s unit used for measuring type size. +There are 72 points to an inch. +

    +
    +
    P
    +
    + + +

    Pica; another typesetter’s unit. There are 6 picas to an inch and +12 points to a pica. +

    +
    +
    s
    +
    z
    +

    See Using Fractional Type Sizes, for a discussion of these units. +

    +
    +
    f
    +

    GNU troff defines this unit to scale decimal fractions in the +interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity +by 65,536. See Colors, for usage. +

    +
    + +

    The magnitudes of other scaling units depend on the text formatting +parameters in effect. These are useful when specifying measurements +that need to scale with the typeface or vertical spacing. +

    +
    +
    m
    +
    + + +

    Em; an em is equal to the current type size in points. It is named thus +because it is approximately the width of the letter ‘M’. +

    +
    +
    n
    +
    + + +

    En; an en is one-half em. +

    +
    +
    v
    +
    + + + + +

    Vee; recall Page Geometry. +

    +
    +
    M
    +
    + +

    Hundredth of an em. +

    +
    + + + + +
    +
    + +

    5.3.1 Motion Quanta

    + + + +

    An output device’s basic unit u is not necessarily its smallest +addressable length; u can be smaller to avoid problems with +integer roundoff. The minimum distances that a device can work with in +the horizontal and vertical directions are termed its motion +quanta. Measurements are rounded to applicable motion quanta. +Half-quantum fractions round toward zero. +

    + + + + +
    +
    Register: \n[.H]
    +
    +
    Register: \n[.V]
    +
    +

    These read-only registers interpolate the horizontal and vertical motion +quanta, respectively, of the output device in basic units. +

    + +

    For example, we might draw short baseline rules on a terminal device as +follows. See Drawing Geometric Objects. +

    +
    +
    .tm \n[.H]
    +    error→ 24
    +.nf
    +\l'36u' 36u
    +\l'37u' 37u
    +    ⇒ _ 36u
    +    ⇒ __ 37u
    +
    + + +
    +
    +
    + +

    5.3.2 Default Units

    + + + +

    A general-purpose register (one created or updated with the nr +request; see see Registers) is implicitly dimensionless, or reckoned +in basic units if interpreted in a measurement context. But it is +convenient for many requests and escape sequences to infer a scaling +unit for an argument if none is specified. An explicit scaling unit +(not after a closing parenthesis) can override an undesirable default. +Effectively, the default unit is suffixed to the expression if a scaling +unit is not already present. GNU troff’s use of integer +arithmetic should also be kept in mind (see Numeric Expressions). +

    +

    The ll request interprets its argument in ems by default. +Consider several attempts to set a line length of 3.5 inches when +the type size is 10 points on a terminal device with a resolution +of 240 basic units and horizontal motion quantum of 24. Some +expressions become zero; the request clamps them to that quantum. +

    +
    +
    .ll 3.5i      \" 3.5i (= 840u)
    +.ll 7/2       \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u
    +.ll (7 / 2)u  \" 7u/2u -> as above
    +.ll 7/2i      \" 7u/2i -> 7u/480u -> 0 -> as above
    +.ll 7i/2      \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u
    +.ll 7i/2u     \" 3.5i (= 840u)
    +
    + + +

    The safest way to specify measurements is to attach a scaling unit. To +multiply or divide by a dimensionless quantity, use ‘u’ as its +scaling unit. +

    + + +
    +
    +
    +
    + +

    5.4 Numeric Expressions

    + + + +

    A numeric expression evaluates to an integer: it can be as +simple as a literal ‘0’ or it can be a complex sequence of register +and string interpolations interleaved with measurements and operators. +

    +

    GNU troff provides a set of mathematical and logical operators +familiar to programmers—as well as some unusual ones—but supports +only integer arithmetic.35 The internal data type +used for computing results is usually a 32-bit signed integer, which +suffices to represent magnitudes within a range of ±2 +billion.36 +

    + + + + + + + + + + + + + +

    Arithmetic infix operators perform a function on the numeric expressions +to their left and right; they are + (addition), - +(subtraction), * (multiplication), / (truncating +division), and % (modulus). Truncating division rounds to +the integer nearer to zero, no matter how large the fractional portion. +Overflow and division (or modulus) by zero are errors and abort +evaluation of a numeric expression. + + + + + + + + +

    +

    Arithmetic unary operators operate on the numeric expression to their +right; they are - (negation) and + (assertion—for +completeness; it does nothing). The unary minus must often be used +with parentheses to avoid confusion with the decrementation operator, +discussed below. +

    +

    Observe the rounding behavior and effect of negative operands on the +modulus and truncating division operators. +

    +
    +
    .nr T 199/100
    +.nr U 5/2
    +.nr V (-5)/2
    +.nr W 5/-2
    +.nr X 5%2
    +.nr Y (-5)%2
    +.nr Z 5%-2
    +T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
    +    ⇒ T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
    +
    + +

    The sign of the modulus of operands of mixed signs is determined by the +sign of the first. Division and modulus operators satisfy the following +property: given a dividend a and a divisor b, a +quotient q formed by ‘(a / b)’ and a +remainder r by ‘(a % b)’, then qb + r = a. +

    + + + +

    GNU troff’s scaling operator, used with parentheses as +(c;e), evaluates a numeric expression e +using c as the default scaling unit. If c is omitted, +scaling units are ignored in the evaluation of e. This +operator can save typing by avoiding the attachment of scaling units to +every operand out of caution. Your macros can select a sensible default +unit in case the user neglects to supply one. +

    +
    +
    .\" Indent by amount given in first argument; assume ens.
    +.de Indent
    +.  in (n;\\$1)
    +..
    +
    + +

    Without the scaling operator, the foregoing macro would, if called with +a unitless argument, cause indentation by the in request’s +default scaling unit (ems). The result would be twice as much +indentation as expected. +

    + + + + + + +

    GNU troff also provides a pair of operators to compute the +extrema of two operands: >? (maximum) and <? (minimum). +

    +
    +
    .nr slots 5
    +.nr candidates 3
    +.nr salaries (\n[slots] <? \n[candidates])
    +Looks like we'll end up paying \n[salaries] salaries.
    +    ⇒ Looks like we'll end up paying 3 salaries.
    +
    + + + + + + + + + + + + +

    Comparison operators comprise < (less than), > (greater +than), <= (less than or equal), >= (greater than or +equal), and = (equal). == is a synonym for =. +When evaluated, a comparison is replaced with ‘0’ if it is false +and ‘1’ if true. In the roff language, positive values are +true, others false. +

    + + + + + + + + +

    We can operate on truth values with the logical operators & +(logical conjunction or “and”) and : (logical disjunction or +“or”). They evaluate as comparison operators do. +

    + + + + + +

    A logical complementation (“not”) operator, !, works only +within if, ie, and while requests. +Furthermore, ! is recognized only at the beginning of a numeric +expression not contained by another numeric expression. In other words, +it must be the “outermost” operator. Including it elsewhere in the +expression produces a warning in the ‘number’ category +(see Warnings), and its expression evaluates false. This +unfortunate limitation maintains compatibility with AT&T +troff. Test a numeric expression for falsity by +comparing it to a false value.37 +

    +
    +
    .nr X 1
    +.nr Y 0
    +.\" This does not work as expected.
    +.if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false
    +.
    +.\" Use this construct instead.
    +.if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false
    +    error→ warning: expected numeric expression, got '!'
    +    ⇒ B: X is true, Y is false
    +
    + + + + + + +

    The roff language has no operator precedence: expressions are +evaluated strictly from left to right, in contrast to schoolhouse +arithmetic. Use parentheses ( ) to impose a desired +precedence upon subexpressions. +

    +
    +
    .nr X 3+5*4
    +.nr Y (3+5)*4
    +.nr Z 3+(5*4)
    +X=\n[X] Y=\n[Y] Z=\n[Z]
    +    ⇒ X=32 Y=32 Z=23
    +
    + + + + + + + +

    For many requests and escape sequences that cause motion on the page, +the unary operators + and - work differently when leading +a numeric expression. They then indicate a motion relative to the +drawing position: positive is down in vertical contexts, right in +horizontal ones. +

    + + + + + + + + + + + + + + + + +

    + and - are also treated differently by the following +requests and escape sequences: bp, in, ll, +lt, nm, nr, pl, pn, po, +ps, pvs, rt, ti, \H, \R, and +\s. Here, leading plus and minus signs serve as incrementation +and decrementation operators, respectively. To negate an expression, +subtract it from zero or include the unary minus in parentheses with its +argument. See Setting Registers, for examples. +

    + + + + + +

    A leading | operator indicates a motion relative not to the +drawing position but to a boundary. For horizontal motions, the +measurement specifies a distance relative to a drawing position +corresponding to the beginning of the input line. By default, +tab stops reckon movements in this way. Most escape sequences do not; +| tells them to do so. +

    +
    +
    Mind the \h'1.2i'gap.
    +.br
    +Mind the \h'|1.2i'gap.
    +.br
    +Mind the
    +\h'|1.2i'gap.
    +    ⇒ Mind the             gap.
    +    ⇒ Mind the    gap.
    +    ⇒ Mind the             gap.
    +
    + +

    One use of this feature is to define macros whose scope is limited to +the output they format. +

    +
    +
    .\" underline word $1 with trailing punctuation $2
    +.de Underline
    +.  nop \\$1\l'|0\[ul]'\\$2
    +..
    +Typographical emphasis is best used
    +.Underline sparingly .
    +
    + +

    In the above example, ‘|0’ specifies a negative motion from the +current position (at the end of the argument just emitted, \$1) +to the beginning of the input line. Thus, the \l escape sequence +in this case draws a line from right to left. A macro call occurs at +the beginning of an input line;38 if the | +operator were omitted, then the underline would be drawn at zero +distance from the current position, producing device-dependent, and +likely undesirable, results. On the ‘ps’ output device, it +underlines the period. +

    +

    For vertical motions, the | operator specifies a distance from +the first text baseline on the page or in the current +diversion,39 using the current vertical +spacing. +

    +
    +
    A
    +.br
    +B \Z'C'\v'|0'D
    +    ⇒ A D
    +    ⇒ B C
    +
    + +

    In the foregoing example, we’ve used the \Z escape sequence +(see Page Motions) to restore the drawing position after formatting +‘C’, then moved vertically to the first text baseline on the page. +

    +
    +
    Escape sequence: \B'anything'
    +
    + + +

    Interpolate 1 if anything is a valid numeric expression, +and 0 otherwise. The delimiter need not be a neutral apostrophe; +see Delimiters. +

    + +

    You might use \B along with the if request to filter out +invalid macro or string arguments. See Conditionals and Loops. +

    +
    +
    .\" Indent by amount given in first argument; assume ens.
    +.de Indent
    +.  if \B'\\$1' .in (n;\\$1)
    +..
    +
    + +

    A register interpolated as an operand in a numeric expression must have +an Arabic format; luckily, this is the default. See Assigning Register Formats. +

    + + +

    Because spaces separate arguments to requests, spaces are not allowed in +numeric expressions unless the (sub)expression containing them is +surrounded by parentheses. See Invoking Requests, and +Conditionals and Loops. +

    +
    +
    .nf
    +.nr a 1+2 + 2+1
    +\na
    +    error→ expected numeric expression, got a space
    +    ⇒ 3
    +.nr a 1+(2 + 2)+1
    +\na
    +    ⇒ 6
    +
    + +

    The nr request (see Setting Registers) expects its second and +optional third arguments to be numeric expressions; a bare + does +not qualify, so our first attempt got a warning. +

    + + +
    +
    +
    + +

    5.5 Identifiers

    + + +

    An identifier labels a GNU troff datum such as a register, +name (macro, string, or diversion), typeface, color, special character, +character class, environment, or stream. Valid identifiers consist of +one or more ordinary characters. + + +An ordinary character is an input character that is not the +escape character, a leader, tab, newline, or invalid as GNU troff +input. +

    + + + + +

    Invalid input characters are a subset of control characters (from the +sets “C0 Controls” and “C1 Controls” as Unicode describes them). +When GNU troff encounters one in an identifier, it produces a +warning in category ‘input’ (see Warnings). They are removed +during interpretation: an identifier ‘foo’, followed by an invalid +character and then ‘bar’, is processed as ‘foobar’. +

    +

    On a machine using the ISO 646, 8859, or 10646 character encodings, +invalid input characters are 0x00, 0x08, 0x0B, +0x0D0x1F, and 0x800x9F. On an +EBCDIC host, they are 0x000x01, 0x08, +0x09, 0x0B, 0x0D0x14, +0x170x1F, and +0x300x3F.40 Some of these code points are used +by GNU troff internally, making it non-trivial to extend the +program to accept UTF-8 or other encodings that use characters from +these ranges.41 +

    +

    Thus, the identifiers ‘br’, ‘PP’, ‘end-list’, +‘ref*normal-print’, ‘|’, ‘@_’, and ‘!"#$%'()*+,-./’ +are all valid. Discretion should be exercised to prevent confusion. +Identifiers starting with ‘(’ or ‘[’ require care. +

    +
    +
    .nr x 9
    +.nr y 1
    +.nr (x 2
    +.nr [y 3
    +.nr sum1 (\n(x + \n[y])
    +    error→ a space character is not allowed in an escape
    +    error→   sequence parameter
    +A:2+3=\n[sum1]
    +.nr sum2 (\n((x + \n[[y])
    +B:2+3=\n[sum2]
    +.nr sum3 (\n[(x] + \n([y)
    +C:2+3=\n[sum3]
    +    ⇒ A:2+3=1 B:2+3=5 C:2+3=5
    +
    + + +

    An identifier with a closing bracket (‘]’) in its name can’t be +accessed with bracket-form escape sequences that expect an identifier as +a parameter. For example, ‘\[foo]]’ accesses the glyph ‘foo’, +followed by ‘]’ in whatever the surrounding context is, whereas +‘\C'foo]'’ formats a glyph named ‘foo]’. Similarly, the +identifier ‘(’ can’t be interpolated except with bracket +forms. +

    + + + + +

    If you begin a macro, string, or diversion name with either of the +characters ‘[’ or ‘]’, you foreclose use of the grefer +preprocessor, which recognizes ‘.[’ and ‘.]’ as bibliographic +reference delimiters. +

    +
    +
    Escape sequence: \A'anything'
    +
    +

    Interpolate 1 if anything is a valid identifier, and 0 +otherwise. The delimiter need not be a neutral apostrophe; see +Delimiters. Because invalid input characters are removed (see +above), invalid identifiers are empty or contain spaces, tabs, or +newlines. +

    +

    You can employ \A to validate a macro argument before using it to +construct another escape sequence or identifier. +

    +
    +
    .\" usage: .init-coordinate-pair name val1 val2
    +.\" Create a coordinate pair where name!x=val1 and
    +.\" name!y=val2.
    +.de init-coordinate-pair
    +.  if \A'\\$1' \{\
    +.    if \B'\\$2' .nr \\$1!x \\$2
    +.    if \B'\\$3' .nr \\$1!y \\$3
    +.  \}
    +..
    +.init-coordinate-pair center 5 10
    +The center is at (\n[center!x], \n[center!y]).
    +.init-coordinate-pair "poi→nt" trash garbage \" ignored
    +.init-coordinate-pair point trash garbage \" ignored
    +    ⇒ The center is at (5, 10).
    +
    + +

    In this example, we also validated the numeric arguments; the registers +‘point!x’ and ‘point!y’ remain undefined. See Numeric Expressions for the \B escape sequence. +

    + + + +

    How GNU troff handles the interpretation of an undefined +identifier depends on the context. There is no way to invoke an +undefined request; such syntax is interpreted as a macro call instead. +If the identifier is interpreted as a string, macro, or diversion, GNU +troff emits a warning in category ‘mac’, defines it as +empty, and interpolates nothing. If the identifier is interpreted as a +register, GNU troff emits a warning in category ‘reg’, +initializes it to zero, and interpolates that value. See Warnings, +Interpolating Registers, and Strings. Attempting to use an +undefined typeface, special character, color, character class, +environment, or stream generally provokes an error diagnostic. +

    + + + + + +

    Identifiers for requests, macros, strings, and diversions share one name +space; special characters and character classes another. No other +object types do. +

    +
    +
    .de xxx
    +.  nop foo
    +..
    +.di xxx
    +bar
    +.br
    +.di
    +.
    +.xxx
    +    ⇒ bar
    +
    + +

    The foregoing example shows that GNU troff reuses the identifier +‘xxx’, changing it from a macro to a diversion. No warning is +emitted, and the previous contents of ‘xxx’ are lost. +

    + + +
    +
    +
    + +

    5.6 Formatter Instructions

    + + + +

    To support documents that require more than filling, automatic line +breaking and hyphenation, adjustment, and supplemental inter-sentence +space, the roff language offers two means of embedding +instructions to the formatter. +

    + +

    One is a request, which begins with a control character and takes +up the remainder of the input line. Requests often perform relatively +large-scale operations such as setting the page length, breaking the +line, or starting a new page. They also conduct internal operations +like defining macros. +

    + + +

    The other is an escape sequence, which begins with the escape +character and can be embedded anywhere in the input, even in arguments +to requests and other escape sequences. Escape sequences interpolate +special characters, strings, or registers, and handle comparatively +minor formatting tasks like sub- and superscripting. +

    +

    Some operations, such as font selection and type size alteration, are +available via both requests and escape sequences. +

    + + + +
    +
    + +

    5.6.1 Control Characters

    + + + + +

    The mechanism of using roff’s control characters to invoke +requests and call macros was introduced in Requests and Macros. +Control characters are recognized only at the beginning of an input +line, or at the beginning of the branch of a control structure request; +see Conditionals and Loops. +

    +

    A few requests cause a break implicitly; use the no-break control +character to prevent the break. Break suppression is its sole +behavioral distinction. Employing the no-break control character to +invoke requests that don’t cause breaks is harmless but poor style. +See Manipulating Filling and Adjustment. +

    + + + + + +

    The control ‘.’ and no-break control ‘'’ characters can each +be changed to any ordinary character42 +with the cc and c2 requests, respectively. +

    +
    +
    Request: .cc [o]
    +
    +

    Recognize the ordinary character o as the control character. +If o is absent or invalid, the default control character +‘.’ is selected. The identity of the control character is +associated with the environment (see Environments). +

    + +
    +
    Request: .c2 [o]
    +
    +

    Recognize the ordinary character o as the no-break control +character. If o is absent or invalid, the default no-break +control character ‘'’ is selected. The identity of the no-break +control character is associated with the environment +(see Environments). +

    + +

    When writing a macro, you might wish to know which control character was +used to call it. +

    +
    +
    Register: \n[.br]
    +
    +

    This read-only register interpolates 1 if the currently executing +macro was called using the normal control character and 0 +otherwise. If a macro is interpolated as a string, the .br +register’s value is inherited from the context of the string +interpolation. See Strings. +

    + + + + +

    Use this register to reliably intercept requests that imply breaks. +

    +
    +
    .als bp*orig bp
    +.de bp
    +.  ie \\n[.br] .bp*orig
    +.  el          'bp*orig
    +..
    +
    + +

    Testing the .br register outside of a macro definition makes no +sense. +

    + + +
    +
    +
    + +

    5.6.2 Invoking Requests

    + + + +

    A control character is optionally followed by tabs and/or spaces and +then an identifier naming a request or macro. The invocation of an +unrecognized request is interpreted as a macro call. Defining a macro +with the same name as a request replaces the request. Deleting a +request name with the rm request makes it unavailable. The +als request can alias requests, permitting them to be wrapped or +non-destructively replaced. See Strings. +

    + + + + + + + + +

    There is no inherent limit on argument length or quantity. Most +requests take one or more arguments, and ignore any they do not expect. +A request may be separated from its arguments by tabs or spaces, but +only spaces can separate an argument from its successor. Only one +between arguments is necessary; any excess is ignored. GNU troff +does not allow tabs for argument separation.43 +

    +

    Generally, a space within a request argument is not relevant, not +meaningful, or is supported by bespoke provisions, as with the tl +request’s delimiters (see Page Layout). Some requests, like +ds, interpret the remainder of the control line as a single +argument. See Strings. +

    + + + + + +

    Spaces and tabs immediately after a control character are ignored. +Commonly, authors structure the source of documents or macro files with +them. +

    +
    +
    .de center
    +.  if \\n[.br] \
    +.    br
    +.  ce \\$1
    +..
    +.
    +.
    +.de right-align
    +.→if \\n[.br] \
    +.→→br
    +.→rj \\$1
    +..
    +
    + + + +

    If you assign an empty blank line trap, you can separate macro +definitions (or any input lines) with blank lines. +

    +
    +
    .de do-nothing
    +..
    +.blm do-nothing  \" activate blank line trap
    +
    +.de center
    +.  if \\n[.br] \
    +.    br
    +.  ce \\$1
    +..
    +
    +
    +.de right-align
    +.→if \\n[.br] \
    +.→→br
    +.→rj \\$1
    +..
    +
    +.blm             \" deactivate blank line trap
    +
    + +

    See Blank Line Traps. +

    + +
    +
    +
    + +

    5.6.3 Calling Macros

    + + + + +

    If a macro of the desired name does not exist when called, it is +created, assigned an empty definition, and a warning in category +‘mac’ is emitted. Calling an undefined macro does end a +macro definition naming it as its end macro (see Writing Macros). +

    + +

    To embed spaces within a macro argument, enclose the argument in +neutral double quotes ". Horizontal motion escape sequences are +sometimes a better choice for arguments to be formatted as text. +

    +

    Consider calls to a hypothetical section heading macro ‘uh’. +

    +
    +
    .uh The Mouse Problem
    +.uh "The Mouse Problem"
    +.uh The\~Mouse\~Problem
    +.uh The\ Mouse\ Problem
    +
    + + + +

    The first line calls uh with three arguments: ‘The’, +‘Mouse’, and ‘Problem’. The remainder call the uh +macro with one argument, ‘The Mouse Problem’. The last solution, +using escaped spaces, can be found in documents prepared for +AT&T troff. It can cause surprise when text is +adjusted, because \SP inserts a fixed-width, +non-breaking space. GNU troff’s \~ escape sequence +inserts an adjustable, non-breaking space.44 +

    + + + + +

    The foregoing raises the question of how to embed neutral double quotes +or backslashes in macro arguments when those characters are +desired as literals. In GNU troff, the special character escape +sequence \[rs] produces a backslash and \[dq] a neutral +double quote. +

    +

    In GNU troff’s AT&T compatibility mode, these +characters remain available as \(rs and \(dq, +respectively. AT&T troff did not consistently define +these special characters, +but its descendants can be made to support them. See Device and Font Description Files. +

    +

    If even that is not feasible, options remain. To obtain a literal +escape character in a macro argument, you can simply type it if you +change or disable the escape character first. See Using Escape Sequences. Otherwise, you must escape the escape character repeatedly +to a context-dependent extent. See Copy Mode. +

    +

    For the (neutral) double quote, you have recourse to an obscure +syntactical feature of AT&T troff. Because a double +quote can begin a macro argument, the formatter keeps track of whether +the current argument was started thus, and doesn’t require a space after +the double quote that ends it.45 In +the argument list to a macro, a double quote that isn’t preceded +by a space doesn’t start a macro argument. If not preceded by a +double quote that began an argument, this double quote becomes part of +the argument. Furthermore, within a quoted argument, a pair of adjacent +double quotes becomes a literal double quote. +

    +
    +
    .de eq
    +.  tm arg1:\\$1 arg2:\\$2 arg3:\\$3
    +.  tm arg4:\\$4 arg5:\\$5 arg6:\\$6
    +.. \" 4 backslashes on the next line
    +.eq a" "b c" "de"f\\\\g" h""i "j""k"
    +    error→ arg1:a" arg2:b c arg3:de
    +    error→ arg4:f\g" arg5:h""i arg6:j"k
    +
    + +

    Apart from the complexity of the rules, this traditional solution has +the disadvantage that double quotes don’t survive repeated argument +expansion in AT&T troff or GNU troff’s +compatibility mode. This can frustrate efforts to pass such arguments +intact through multiple macro calls. +

    +
    +
    .cp 1
    +.de eq
    +.  tm arg1:\\$1 arg2:\\$2 arg3:\\$3
    +.  tm arg4:\\$4 arg5:\\$5 arg6:\\$6
    +..
    +.de xe
    +.  eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
    +.. \" 8 backslashes on the next line
    +.xe a" "b c" "de"f\\\\\\\\g" h""i "j""k"
    +    error→ arg1:a" arg2:b arg3:c
    +    error→ arg4:de arg5:f\g" arg6:h""i
    +
    + + + + + +

    Outside of compatibility mode, GNU troff doesn’t exhibit this +problem because it tracks the nesting depth of interpolations. +See Implementation Differences. +

    + +
    +
    +
    + +

    5.6.4 Using Escape Sequences

    + + + +

    Whereas requests must occur on control lines, escape sequences can occur +intermixed with text and may appear in arguments to requests, macros, +and other escape sequences. + +An escape sequence is introduced by the escape character, a backslash +\ (but see the ec request below). The next character +selects the escape’s function. +

    +

    Escape sequences vary in length. Some take an argument, and of those, +some have different syntactical forms for a one-character, +two-character, or arbitrary-length argument. Others accept only +an arbitrary-length argument. In the former scheme, a one-character +argument follows the function character immediately, an opening +parenthesis ‘(’ introduces a two-character argument (no closing +parenthesis is used), and an argument of arbitrary length is enclosed in +brackets ‘[]’. In the latter scheme, the user selects a delimiter +character. A few escape sequences are idiosyncratic, and support both +of the foregoing conventions (\s), designate their own +termination sequence (\?), consume input until the next newline +(\!, \", \#), or support an additional modifier +character (\s again, and \n). As with requests, use of +some escape sequences in source documents may interact poorly with a +macro package you use; consult its documentation to learn of “safe” +sequences or alternative facilities it provides to achieve the desired +result. +

    +

    If an escape character is followed by a character that does not +identify a defined operation, the escape character is ignored (producing +a diagnostic of the ‘escape’ warning category, which is not enabled +by default) and the following character is processed normally. +

    +
    +
    $ groff -Tps -ww
    +.nr N 12
    +.ds co white
    +.ds animal elephant
    +I have \fI\nN \*(co \*[animal]s,\f[]
    +said \P.\&\~Pseudo Pachyderm.
    +    error→ warning: escape character ignored before 'P'
    +    ⇒ I have 12 white elephants, said P. Pseudo Pachyderm.
    +
    + +

    Escape sequence interpolation is of higher precedence than escape +sequence argument interpretation. This rule affords flexibility in +using escape sequences to construct parameters to other escape +sequences. +

    +
    +
    .ds family C\" Courier
    +.ds style I\" oblique
    +Choice a typeface \f(\*[family]\*[style]wisely.
    +    ⇒ Choose a typeface wisely.
    +
    + +

    In the above, the syntax form ‘\f(’ accepts only two characters for +an argument; the example works because the subsequent escape sequences +are interpolated before the selection escape sequence argument is +processed, and strings family and style interpolate one +character each.46 +

    +

    The escape character is nearly always interpreted when encountered; it +is therefore desirable to have a way to interpolate it, disable it, or +change it. +

    + + +
    +
    Escape sequence: \e
    +
    +

    Interpolate the escape character. +

    + + + +

    The \[rs] special character escape sequence formats a backslash +glyph. In macro and string definitions, the input sequences \\ +and \E defer interpretation of escape sequences. See Copy Mode. +

    +
    +
    Request: .eo
    +
    + + +

    Disable the escape mechanism except in copy mode. Once this request is +invoked, no input character is recognized as starting an escape +sequence in interpretation mode. +

    + +
    +
    Request: .ec [o]
    +
    + + +

    Recognize the ordinary character o as the escape character. +If o is absent or invalid, the default escape character +‘\’ is selected. +

    + +

    Switching escape sequence interpretation off to define a macro and back +on afterward can obviate the need to double the escape character within +the definition. See Writing Macros. This technique is not available +if your macro needs to interpolate values at the time it is +defined—but many do not. +

    +
    +
    .\" simplified `BR` macro from the man(7) macro package
    +.eo
    +.de BR
    +.  ds result \&
    +.  while (\n[.$] >= 2) \{\
    +.    as result \fB\$1\fR\$2\"
    +.    shift 2
    +.  \}
    +.  if \n[.$] .as result \fB\$1\"
    +\*[result]
    +.  rm result
    +.  ft R
    +..
    +.ec
    +
    + +
    +
    Request: .ecs
    +
    +
    Request: .ecr
    +
    +

    The ecs request stores the escape character for recall with +ecr. ecr sets the escape character to ‘\’ if none +has been saved. +

    +

    Use these requests together to temporarily change the escape character. +

    + +

    Using a different escape character, or disabling it, when calling macros +not under your control will likely cause errors, since GNU troff +has no mechanism to “intern” macros—that is, to convert a macro +definition into a form independent of its +representation.47 When a +macro is called, its contents are interpreted literally. +

    + +
    +
    +
    + +

    5.6.5 Delimiters

    + + + + + + + +

    Some escape sequences that require parameters use delimiters. The +neutral apostrophe ' is a popular choice and shown in this +document. The neutral double quote " is also commonly seen. +Letters, numerals, and leaders can be used. Punctuation characters +are likely better choices, except for those defined as infix operators +in numeric expressions; see below. +

    +
    +
    \l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    The following escape sequences don’t take arguments and thus are allowed +as delimiters: +\SP, \%, \|, \^, \{, +\}, \', \`, \-, \_, \!, +\?, \), \/, \,, \&, \:, +\~, \0, \a, \c, \d, \e, +\E, \p, \r, \t, and \u. However, +using them this way is discouraged; they can make the input confusing to +read. +

    + + + + + + + +

    A few escape sequences, +\A, +\b, +\o, +\w, +\X, +and \Z, accept a newline as a delimiter. Newlines that serve +as delimiters continue to be recognized as input line terminators. +

    +
    +
    A caf\o
    +e\(aa
    +in Paris
    +    ⇒ A café in Paris
    +
    + +

    Use of newlines as delimiters in escape sequences is also discouraged. +

    + + + + + + + + + + + +

    Finally, the escape sequences \D, \h, \H, +\l, \L, \N, \R, \s, \S, +\v, and \x prohibit many delimiters. +

    +
      +
    • + + + + +the numerals 0-9 and the decimal point . + +
    • + + + + + + + + + + + + +the (single-character) operators ‘+-/*%<>=&:()’ + +
    • + +the space and tab characters + +
    • + + + + + + + + + + + + +any escape sequences other than \%, \:, \{, +\}, \', \`, \-, \_, \!, +\/, \c, \e, and \p +
    + +

    Delimiter syntax is complex and flexible primarily for historical +reasons; the foregoing restrictions need be kept in mind mainly when +using groff in AT&T compatibility mode. GNU +troff keeps track of the nesting depth of escape sequence +interpolations, so the only characters you need to avoid using as +delimiters are those that appear in the arguments you input, not any +that result from interpolation. Typically, ' works fine. +See Implementation Differences. +

    +
    +
    $ groff -Tps
    +.de Mw
    +.  nr wd \w'\\$1'
    +.  tm "\\$1" is \\n(wd units wide.
    +..
    +.Mw Wet'suwet'en
    +.Mw Wet+200i
    +.cp 1 \" turn on compatibility mode
    +.Mw Wet'suwet'en
    +.Mw Wet'
    +.Mw Wet+200i
    +    error→ "Wet'suwet'en" is 54740 units wide.
    +    error→ "Wet'+200i" is 42610 units wide.
    +    error→ "Wet'suwet'en" is 15860 units wide.
    +    error→ "Wet'" is 15860 units wide.
    +    error→ "Wet'+200i" is 14415860 units wide.
    +
    + +

    We see here that in compatibility mode, the part of the argument after +the ' delimiter escapes from its context and, if nefariously +crafted, influences the computation of the wd register’s value in +a surprising way. +

    +
    +
    +
    +
    + +

    5.7 Comments

    + + +

    One of the most common forms of escape sequence is the +comment.48 +

    +
    +
    Escape sequence: \"
    +
    +

    Start a comment. Everything up to the next newline is ignored. +

    +

    This may sound simple, but it can be tricky to keep the comments from +interfering with the appearance of the output. + + +If the escape sequence is to the right of some text or a request, that +portion of the line is ignored, but spaces preceding it are processed +normally by GNU troff. This affects only the ds and +as requests and their variants. +

    + + +

    One possibly irritating idiosyncrasy is that tabs should not be used to +vertically align comments in the source document. Tab characters are +not treated as separators between a request name and its first argument, +nor between arguments. +

    + + +

    A comment on a line by itself is treated as a blank line, because after +eliminating the comment, that is all that remains. +

    +
    +
    Test
    +\" comment
    +Test
    +    ⇒ Test
    +    ⇒
    +    ⇒ Test
    +
    + +

    To avoid this, it is common to combine the empty request with the +comment escape sequence as ‘.\"’, causing the input line to be +ignored. +

    + +

    Another commenting scheme sometimes seen is three consecutive single +quotes (''') at the beginning of a line. This works, but GNU +troff emits a warning diagnostic (if enabled) about an undefined +macro (namely ‘''’). +

    + +
    +
    Escape sequence: \#
    +
    +

    Start a comment; everything up to and including the next newline is +ignored. This groff extension was introduced to avoid the +problems described above. +

    +
    +
    Test
    +\# comment
    +Test
    +    ⇒ Test Test
    +
    +
    + +
    +
    Request: .ig [end]
    +
    +

    Ignore input until, in the current conditional block (if +any),49 the macro end is called +at the start of a control line, or the control line ‘..’ is +encountered if end is not specified. ig is parsed as if it +were a macro definition, but its contents are discarded, not +stored.50 +

    +
    +
    hand\c
    +.de TX
    +fasting
    +..
    +.ig TX
    +This is part of a large block of input that has been
    +temporarily(?) commented out.
    +We can restore it simply by removing the .ig request and
    +the call of its end macro.
    +.TX
    +
    +
    +
        ⇒ handfasting
    +
    +
    + + + +
    +
    +
    + +

    5.8 Registers

    + + +

    In the roff language, numbers can be stored in registers. +Many built-in registers exist, supplying anything from the date to +details of formatting parameters. You can also define your own. +See Identifiers, for information on constructing a valid name for a +register. +

    + + + +
    +
    + +

    5.8.1 Setting Registers

    + + + +

    Define registers and update their values with the nr request or +the \R escape sequence. +

    +
    +
    Request: .nr ident value
    +
    +
    Escape sequence: \R'ident value'
    +
    +

    Set register ident to value. If ident doesn’t exist, +GNU troff creates it. In the \R escape sequence, the +delimiter need not be a neutral apostrophe; see Delimiters. It +also does not produce an input token in GNU troff. See gtroff Internals. +

    +
    +
    .nr a (((17 + (3 * 4))) % 4)
    +\n[a]
    +.\R'a (((17 + (3 * 4))) % 4)'
    +\n[a]
    +    ⇒ 1 1
    +
    + +

    (Later, we will discuss additional forms of nr and \R that +can change a register’s value after it is dereferenced but before it is +interpolated. See Auto-increment.) +

    +

    The complete transparency of \R can cause surprising effects if +you use registers like .k, which get evaluated at the time they +are accessed. +

    +
    +
    .ll 1.6i
    +.
    +aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
    +.tm :k == \n[:k]
    +    ⇒ :k == 126950
    +.
    +.br
    +.
    +aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
    +.tm :k == \n[:k]
    +    ⇒ :k == 15000
    +
    + +

    If you process this with the PostScript device (-Tps), there will +be a line break eventually after ggg in both input lines. +However, after processing the space after ggg, the partially +collected line is not overfull yet, so GNU troff continues to +collect input until it sees the space (or in this case, the newline) +after hhh. At this point, the line is longer than the line +length, and the line gets broken. +

    +

    In the first input line, since the \R escape sequence leaves no +traces, the check for the overfull line hasn’t been done yet at the +point where \R gets handled, and you get a value for the +.k register that is even greater than the current line length. +

    +

    In the second input line, the insertion of \h'0' to cause a +zero-width motion forces GNU troff to check the line length, +which in turn causes the start of a new output line. Now .k +returns the expected value. +

    + +

    nr and \R each have two additional special forms to +increment or decrement a register. +

    +
    +
    Request: .nr ident +value
    +
    +
    Request: .nr ident -value
    +
    Escape sequence: \R'ident +value'
    +
    +
    Escape sequence: \R'ident -value'
    +

    Increment (decrement) register ident by value. In the +\R escape sequence, the delimiter need not be a neutral +apostrophe; see Delimiters. +

    +
    +
    .nr a 1
    +.nr a +1
    +\na
    +    ⇒ 2
    +
    + + +

    A leading minus sign in value is always interpreted as a +decrementation operator, not an algebraic sign. To assign a register a +negative value or the negated value of another register, you can +force GNU troff to interpret ‘-’ as a negation or minus, +rather than decrementation, operator: enclose it with its operand in +parentheses or subtract it from zero. +

    +
    +
    .nr a 7
    +.nr b 3
    +.nr a -\nb
    +\na
    +    ⇒ 4
    +.nr a (-\nb)
    +\na
    +    ⇒ -3
    +.nr a 0-\nb
    +\na
    +    ⇒ -3
    +
    + +

    If a register’s prior value does not exist (the register was undefined), +an increment or decrement is applied as if to 0. +

    + +
    +
    Request: .rr ident
    +
    + + +

    Remove register ident. If ident doesn’t exist, the request +is ignored. Technically, only the name is removed; the register’s +contents are still accessible under aliases created with aln, if +any. +

    + +
    +
    Request: .rnn ident1 ident2
    +
    + + +

    Rename register ident1 to ident2. If ident1 doesn’t +exist, the request is ignored. Renaming a built-in register does not +otherwise alter its properties. +

    + +
    +
    Request: .aln new old
    +
    + + + +

    Create an alias new for an existing register old, causing +the names to refer to the same stored object. If old is +undefined, a warning in category ‘reg’ is produced and the request +is ignored. See Warnings, for information about the enablement and +suppression of warnings. +

    + + + +

    To remove a register alias, invoke rr on its name. A register’s +contents do not become inaccessible until it has no more names. +

    + + +
    +
    +
    + +

    5.8.2 Interpolating Registers

    + + + +

    Register contents are interpolated with the \n escape sequence. +

    +
    +
    Escape sequence: \ni
    +
    +
    Escape sequence: \n(id
    +
    Escape sequence: \n[ident]
    +
    + + + +

    Interpolate register with name ident (one-character +name i, two-character name id). \n is +interpreted even in copy mode (see Copy Mode). If the register is +undefined, it is created and assigned a value of ‘0’, that +value is interpolated, and a warning in category ‘reg’ is emitted. +See Warnings, for information about the enablement and suppression of +warnings. +

    +
    +
    .nr a 5
    +.nr as \na+\na
    +\n(as
    +    ⇒ 10
    +
    + +
    +
    .nr a1 5
    +.nr ab 6
    +.ds str b
    +.ds num 1
    +\n[a\n[num]]
    +    ⇒ 5
    +\n[a\*[str]]
    +    ⇒ 6
    +
    +
    + + +
    +
    +
    + +

    5.8.3 Auto-increment

    + + + + +

    Registers can also be incremented or decremented by a configured amount +at the time they are interpolated. The value of the increment is +specified with a third argument to the nr request, and a special +interpolation syntax is used to alter and then retrieve the register’s +value. Together, these features are called +auto-increment.51 +

    +
    +
    Request: .nr ident value incr
    +
    + +

    Set register ident to value and its auto-incrementation +amount to to incr. The \R escape sequence doesn’t support +an incr argument. +

    + +

    Auto-incrementation is not completely automatic; the \n +escape sequence in its basic form never alters the value of a register. +To apply auto-incrementation to a register, interpolate it with +‘\n±’. +

    +
    +
    Escape sequence: \n+i
    +
    +
    Escape sequence: \n-i
    +
    Escape sequence: \n+(id
    +
    Escape sequence: \n-(id
    +
    Escape sequence: \n+[ident]
    +
    Escape sequence: \n-[ident]
    +

    Increment or decrement ident (one-character +name i, two-character name id) by the register’s +auto-incrementation value and then interpolate the new register value. +If ident has no auto-incrementation value, interpolate as with +\n. +

    + +
    +
    .nr a 0 1
    +.nr xx 0 5
    +.nr foo 0 -2
    +\n+a, \n+a, \n+a, \n+a, \n+a
    +.br
    +\n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
    +.br
    +\n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
    +    ⇒ 1, 2, 3, 4, 5
    +    ⇒ -5, -10, -15, -20, -25
    +    ⇒ -2, -4, -6, -8, -10
    +
    + + + +

    To change the increment value without changing the value of a register, +assign the register’s value to itself by interpolating it, and specify +the desired increment normally. Apply an increment of ‘0’ to +disable auto-incrementation of the register. +

    + +
    +
    +
    + +

    5.8.4 Assigning Register Formats

    + + + + +

    A writable register’s value can be interpolated in several number +formats. By default, conventional Arabic numerals are used. +Other formats see use in sectioning and outlining schemes and +alternative page numbering arrangements. +

    +
    +
    Request: .af reg fmt
    +
    +

    Use number format fmt when interpolating register reg. +Valid number formats are as follows. +

    +
    +
    0
    +

    Arabic numerals 0, 1, 2, and so on. +Any decimal digit is equivalent to ‘0’; the formatter merely counts +the digits specified. Multiple Arabic numerals in fmt cause +interpolations to be zero-padded on the left if necessary to at least as +many digits as specified (interpolations never truncate a register +value). A register with format ‘00’ interpolates values 1, 2, 3 as +‘01’, ‘02’, ‘03’. The default format for all writable +registers is ‘0’. +

    +
    +
    I
    +
    +

    Uppercase Roman numerals: 0, I, II, III, IV, ... +

    +
    +
    i
    +

    Lowercase Roman numerals: 0, i, ii, iii, iv, ... +

    +
    +
    A
    +

    Uppercase letters: 0, A, B, C, …, Z, AA, AB, ... +

    +
    +
    a
    +

    Lowercase letters: 0, a, b, c, …, z, aa, ab, ... +

    +
    + +

    Omitting fmt causes a warning in category ‘missing’. +See Warnings, for information about the enablement and suppression of +warnings. Specifying an unrecognized format is an error. +

    +

    Zero values are interpolated as ‘0’ in non-Arabic formats. +Negative quantities are prefixed with ‘-’ irrespective of format. +In Arabic formats, the sign supplements the field width. If reg +doesn’t exist, it is created with a zero value. +

    +
    +
    .nr a 10
    +.af a 0           \" the default format
    +\na,
    +.af a I
    +\na,
    +.af a 321
    +.nr a (-\na)
    +\na,
    +.af a a
    +\na
    +    ⇒ 10, X, -010, -j
    +
    + + + + + +

    The representable extrema in the ‘i’ and ‘I’ formats +correspond to Arabic ±39,999. GNU troff uses ‘w’ and +‘z’ to represent 5,000 and 10,000 in Roman numerals, respectively, +following the convention of AT&T troff—currently, the +correct glyphs for Roman numerals five thousand (U+2181) and ten +thousand (U+2182) are not used. +

    + + +

    Assigning the format of a read-only register is an error. Instead, copy +the read-only register’s value to, and assign the format of, a writable +register. +

    + +
    +
    Escape sequence: \gr
    +
    +
    Escape sequence: \g(rg
    +
    Escape sequence: \g[reg]
    +
    + +

    Interpolate the format of the register reg (one-character +name r, two-character name rg). Zeroes represent +Arabic formats. If reg is not defined, reg is not created +and nothing is interpolated. \g is interpreted even in copy mode +(see Copy Mode). +

    + + + +

    GNU troff interprets only Arabic numerals. The Roman numeral or +alphabetic formats cannot be used as operands to arithmetic operators in +expressions (see Numeric Expressions). For instance, it may be +desirable to test the page number independently of its format. +

    +
    +
    .af % i \" front matter
    +.de header-trap
    +.  \" To test the page number, we need it in Arabic.
    +.  ds saved-page-number-format \\g%\"
    +.  af % 0
    +.  nr page-number-in-decimal \\n%
    +.  af % \\*[saved-page-number-format]
    +.  ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
    +.  el \{\
    +.    ie o .do-odd-numbered-page-stuff
    +.    el   .do-even-numbered-page-stuff
    +.  \}
    +.  rm saved-page-number-format
    +..
    +.wh 0 header-trap
    +
    + + +
    +
    +
    + +

    5.8.5 Built-in Registers

    + + + +

    Predefined registers whose identifiers start with a dot are read-only. +Many are Boolean-valued, interpolating a true or false value testable +with the if, ie, or while requests. Some read-only +registers are string-valued, meaning that they interpolate text. +

    + + + +

    Caution: Built-in registers are subject to removal like +others; once removed, they can be recreated only as normal writable +registers and will not reflect formatter state. +

    +

    A register name (without the dot) is often associated with a request of +the same name. A complete listing of all built-in registers can be +found in Register Index. +

    +

    We present here a few built-in registers that are not described +elsewhere in this manual; they have to do with invariant properties of +GNU troff, or obtain information about the formatter’s +command-line options, processing progress, or the operating environment. +

    +
    +
    \n[.A]
    +
    + +

    Approximate output is being formatted (Boolean-valued); see +groff -a option (Options). +

    +
    +
    \n[.c]
    +
    +
    +
    \n[c.]
    +
    + +

    Input line number. ‘c.’ is a writable synonym, +affecting subsequent interpolations of both ‘.c’ and ‘c.’. +

    +
    +
    \n[.F]
    +
    + +

    Name of input file (string-valued). +

    +
    +
    \n[.g]
    +
    + +

    Always true in GNU troff (Boolean-valued). Documents can use +this to ask the formatter if it claims groff compatibility. +

    +
    +
    \n[.P]
    +

    Output page selection status (Boolean-valued); see groff +-o option (Options). +

    +
    +
    \n[.R]
    +
    + +

    Count of available unused registers; always 10,000 in GNU +troff.52 +

    +
    +
    \n[.T]
    +

    Indicator of output device selection (Boolean-valued); see +groff -T option (Options). +

    +
    +
    \n[.U]
    +
    + + + +

    Unsafe mode enablement status (Boolean-valued); see groff +-U option (Options). +

    +
    +
    \n[.x]
    +
    + +

    Major version number of the running GNU troff formatter. For +example, if the version number is 1.23.0, then .x +contains ‘1’. +

    +
    +
    \n[.y]
    +
    + +

    Minor version number of the running GNU troff formatter. For +example, if the version number is 1.23.0, then .y +contains ‘23’. +

    +
    +
    \n[.Y]
    +
    +

    Revision number of the running GNU troff formatter. For example, +if the version number is 1.23.0, then .Y contains ‘0’. +

    +
    +
    \n[$$]
    +
    + + + +

    Process identifier (PID) of the GNU troff program in its +operating environment. +

    +
    + +

    Date- and time-related registers are set per the local time as +determined by localtime(3) when the formatter launches. This +initialization can be overridden by SOURCE_DATE_EPOCH and +TZ; see Environment. +

    +
    +
    \n[seconds]
    +
    + + +

    Count of seconds elapsed in the minute (0–60).

    +
    +
    \n[minutes]
    +
    + + +

    Count of minutes elapsed in the hour (0–59). +

    +
    +
    \n[hours]
    +
    + + +

    Count of hours elapsed since midnight (0–23). +

    +
    +
    \n[dw]
    +
    + +

    Day of the week (1–7; 1 is Sunday). +

    +
    +
    \n[dy]
    +
    + +

    Day of the month (1–31). +

    +
    +
    \n[mo]
    +
    + +

    Month of the year (1–12). +

    +
    +
    \n[year]
    +
    + +

    Gregorian year. +

    + + +
    +
    \n[yr]
    +

    Gregorian year minus 1900. This register is incorrectly documented +in the AT&T troff manual as storing the last two digits +of the current year. That claim stopped being true in 2000. Old +troff input that looks like: +

    +
    +
    '\" The year number is a surprise after 1999.
    +This document was formatted in 19\n(yr.
    +
    + +

    can be corrected to: +

    +
    +
    This document was formatted in \n[year].
    +
    + +

    or, for portability across many roff programs, to the following. +

    +
    +
    .nr y4 1900+\n(yr
    +This document was formatted in \n(y4.
    +
    +
    +
    + + + +
    +
    +
    +
    + +

    5.9 Manipulating Filling and Adjustment

    + + + + + + + + + + + + + + + + + + + +

    When an output line is pending (see below), a break moves the drawing +position to the beginning of the next text baseline, interrupting +filling. Various ways of causing breaks were shown in Breaking. +The br request likewise causes a break. Several other requests +imply breaks: bp, ce, cf, fi, fl, +in, nf, rj, sp, ti, and trf. +If the no-break control character is used with any of these requests, +GNU troff suppresses the break; instead the requested operation +takes effect at the next break. ‘'br’ does nothing. +

    +
    +
    .ll 55n
    +This line is normally filled and adjusted.
    +.br
    +A line's alignment is decided
    +'ce \" Center the next input line (no break).
    +when it is output.
    +This line returns to normal filling and adjustment.
    +    ⇒ This line is normally filled and adjusted.
    +    ⇒    A line's alignment is decided when it is output.
    +    ⇒ This line returns to normal filling and adjustment.
    +
    + + + + + +

    Output line properties like page offset, indentation, adjustment, and +even the location of its text baseline, are not determined until the +line has been broken. An output line is said to be pending if +some input has been collected but an output line corresponding to it has +not yet been written; such an output line is also termed partially +collected. If no output line is pending, it is as if a break has +already happened; additional breaks, whether explicit or implicit, have +no effect. If the vertical drawing position is negative—as it is when +the formatter starts up—a break starts a new page (even if no output +line is pending) unless an end-of-input macro is being interpreted. +See End-of-input Traps. +

    +
    +
    Request: .br
    +
    +

    Break the line: emit any pending output line without adjustment. +

    +
    +
    foo bar
    +.br
    +baz
    +'br
    +qux
    +    ⇒ foo bar
    +    ⇒ baz qux
    +
    +
    + +

    Sometimes you want to prevent a break within a phrase or between a +quantity and its units. +

    +
    +
    Escape sequence: \~
    +
    + + +

    Insert an unbreakable space that is adjustable like an ordinary space. +It is discarded from the end of an output line if a break is forced. +

    +
    +
    Set the output speed to\~1.
    +There are 1,024\~bytes in 1\~KiB.
    +J.\~F.\~Ossanna wrote the original CSTR\~#54.
    +
    +
    + +

    By default, GNU troff fills text and adjusts it to reach the +output line length. The nf request disables filling; the +fi request reënables it. +

    +
    +
    Request: .fi
    +
    +
    Register: \n[.u]
    +
    + + + + +

    Enable filling of output lines; a pending output line is broken. The +read-only register .u is set to 1. The filling enablement +status, sometimes called fill mode, is associated with the +environment (see Environments). See Line Continuation, for +interaction with the \c escape sequence. +

    + +
    +
    Request: .nf
    +
    + + + + + + +

    Disable filling of output lines: the output line length (see Line Layout) is ignored and output lines are broken where the input lines +are. A pending output line is broken and adjustment is suppressed. The +read-only register .u is set to 0. The filling enablement +status is associated with the environment (see Environments). See +Line Continuation, for interaction with the \c escape +sequence. +

    + +
    +
    Request: .ad [mode]
    +
    +
    Register: \n[.j]
    +
    +

    Enable output line adjustment in mode, taking effect when the +pending (or next) output line is broken. Adjustment is suppressed when +filling is. mode can have one of the following values. +

    +
    +
    b
    +
    n
    +

    Adjust “normally”: if the output line does not consume the distance +between the indentation and the configured output line length, GNU +troff stretches adjustable spaces within the line until that +length is reached. When the indentation is zero, this mode spreads the +line to both the left and right margins. This is the GNU troff +default. +

    +
    +
    c
    +

    Center filled text. Contrast with the ce request, which centers +text without filling it. +

    +
    +
    l
    +

    Align text to the left without adjusting it. +

    +
    +
    r
    +

    Align text to the right without adjusting it. +

    +
    + +

    mode can also be a value previously stored in the .j +register. Using ad without an argument is the same as ‘.ad +\n[.j]’; unless filling is disabled, GNU troff resumes adjusting +lines in the same way it did before adjustment was disabled by +invocation of the na request. +

    + +

    The adjustment mode and enablement status are encoded in the read-only +register .j. These parameters are associated with the +environment (see Environments). +

    +

    The value of .j for any adjustment mode is an implementation +detail and should not be relied upon as a programmer’s interface. Do +not write logic to interpret or perform arithmetic on it. +

    +
    +
    .ll 48n
    +.de AD
    +.  br
    +.  ad \\$1
    +..
    +.de NA
    +.  br
    +.  na
    +..
    +left
    +.AD r
    +.nr ad \n(.j
    +right
    +.AD c
    +center
    +.NA
    +left
    +.AD
    +center
    +.AD \n(ad
    +right
    +
    +
    +
        ⇒ left
    +    ⇒                                            right
    +    ⇒                      center
    +    ⇒ left
    +    ⇒                      center
    +    ⇒                                            right
    +
    +
    + +
    +
    Request: .na
    +
    +

    Disable output line adjustment. This produces the same output as +left-alignment, but the value of the adjustment mode register .j +is altered differently. The adjustment mode and enablement status are +associated with the environment (see Environments). +

    + +
    +
    Request: .brp
    +
    +
    Escape sequence: \p
    +
    +

    Break, adjusting the line per the current adjustment mode. \p +schedules a break with adjustment at the next word boundary. The escape +sequence is itself neither a break nor a space of any kind; it can thus +be placed in the middle of a word to cause a break at the end of that +word. +

    +

    Breaking with immediate adjustment can produce ugly results since GNU +troff doesn’t have a sophisticated paragraph-building algorithm, +as TeX has, for example. Instead, GNU troff fills and adjusts +a paragraph line by line. +

    +
    +
    .ll 4.5i
    +This is an uninteresting sentence.
    +This is an uninteresting sentence.\p
    +This is an uninteresting sentence.
    +
    + +

    is formatted as follows. +

    +
    +
    This  is  an uninteresting sentence.  This is
    +an          uninteresting           sentence.
    +This is an uninteresting sentence.
    +
    +
    + + + + +

    To clearly present the next couple of requests, we must introduce the +concept of “productive” input lines. A productive input line is +one that directly produces formatted output. Text lines produce +output,53 as do control +lines containing requests like tl or escape sequences like +\D. Macro calls are not directly productive, and thus not +counted, but their interpolated contents can be. Empty requests, and +requests and escape sequences that define registers or strings or alter +the formatting environment (as with changes to the size, face, height, +slant, or color of the type) are not productive. We will also preview +the output line continuation escape sequence, \c, which +“connects” two input lines that would otherwise be counted separately. +54 +

    +
    +
    .de hello
    +Hello, world!
    +..
    +.ce \" center output of next productive input line
    +.
    +.nr junk-reg 1
    +.ft I
    +Chorus: \c
    +.ft
    +.hello
    +Went the day well?
    +  ⇒                  Chorus: Hello, world!
    +  ⇒ Went the day well?
    +
    + +
    +
    Request: .ce [n]
    +
    +
    Register: \n[.ce]
    +
    + + + +

    Break (unless the no-break control character is used), center the output +of the next n productive input lines with respect to the line +length and indentation without filling, then break again regardless of +the invoking control character. +If the argument is not positive, centering is disabled. Omitting the +argument implies an n of ‘1’. The count of lines remaining +to be centered is stored in the read-only register .ce and is +associated with the environment (see Environments). +

    + +

    While the ‘.ad c request also centers text, it fills the text +as well. +

    +
    +
    .de FR
    +This is a small text fragment that shows the differences
    +between the `.ce' and the `.ad c' requests.
    +..
    +.ll 4i
    +.ce 1000
    +.FR
    +.ce 0
    +
    +.ad c
    +.FR
    +    ⇒ This is a small text fragment that shows
    +    ⇒              the differences
    +    ⇒ between the ‘.ce’ and the ‘.ad c’ requests.
    +    ⇒
    +    ⇒ This is a small text fragment that shows
    +    ⇒  the differences between the ‘.ce’ and
    +    ⇒         the ‘.ad c’ requests.
    +
    + +

    The previous example illustrates a common idiom of turning centering on +for a quantity of lines far in excess of what is required, and off again +after the text to be centered. This technique relieves humans of +counting lines for requests that take a count of input lines as an +argument. +

    + +
    +
    Request: .rj [n]
    +
    +
    Register: \n[.rj]
    +
    + + + +

    Break (unless the no-break control character is used), align the output +of the next n productive input lines to the right margin without +filling, then break again regardless of the control character. +If the argument is not positive, right-alignment is disabled. Omitting +the argument implies an n of ‘1’. The count of lines +remaining to be right-aligned is stored in the read-only register +.rj and is associated with the environment +(see Environments). +

    +
    +
    .ll 49n
    +.rj 3
    +At first I hoped that such a technically unsound
    +project would collapse but I soon realized it was
    +doomed to success. \[em] C. A. R. Hoare
    +    ⇒  At first I hoped that such a technically unsound
    +    ⇒ project would collapse but I soon realized it was
    +    ⇒              doomed to success. -- C. A. R. Hoare
    +
    +
    + +
    +
    Request: .ss word-space-size [additional-sentence-space-size]
    +
    +
    Register: \n[.ss]
    +
    +
    Register: \n[.sss]
    +
    + + + + + + + +

    Set the sizes of spaces between words and +sentences55 in twelfths +of font’s space width (typically one-fourth to one-third em for Western +scripts). The default for both parameters is 12. Negative values +are erroneous. + + + +The first argument is a minimum; if an output line undergoes adjustment, +such spaces may increase in width. + + + +The optional second argument sets the amount of additional space +separating sentences on the same output line. If omitted, this amount +is set to word-space-size. The request is ignored if there are no +parameters. +

    + + +

    Additional inter-sentence space is used only if the output line is not +full when the end of a sentence occurs in the input. If a sentence ends +at the end of an input line, then both an inter-word space and an +inter-sentence space are added to the output; if two spaces follow the +end of a sentence in the middle of an input line, then the second space +becomes an inter-sentence space in the output. Additional +inter-sentence space is not adjusted, but the inter-word space that +always precedes it may be. Further input spaces after the second, if +present, are adjusted as normal. +

    +

    The read-only registers .ss and .sss hold the minimal +inter-word space and additional inter-sentence space amounts, +respectively. These parameters are part of the environment +(see Environments), and rounded down to the nearest multiple +of 12 on terminals. +

    + + + +

    The ss request can insert discardable horizontal space; that is, +space that is discarded at a break. For example, some footnote styles +collect the notes into a single paragraph with large gaps between +each note. +

    +
    +
    .ll 48n
    +1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
    +.ss 12 48 \" applies to next sentence ending
    +Reprints no longer available through FCS.
    +.ss 12 \" go back to normal
    +2.\~Better known for other work.
    +    ⇒ 1.  J.  Fict. Ch. Soc. 6 (2020), 3-14.  Reprints
    +    ⇒ no longer available through FCS.      2.  Better
    +    ⇒ known for other work.
    +
    + +

    If undiscardable space is required, use the \h escape +sequence. +

    + + + +
    +
    +
    + +

    5.10 Manipulating Hyphenation

    + + + + + +

    When filling, GNU troff hyphenates words as needed at +user-specified and automatically determined hyphenation points. The +machine-driven determination of hyphenation points in words requires +algorithms and data, and is susceptible to conventions and preferences. +Before tackling such automatic hyphenation, let us consider how +hyphenation points can be set explicitly. +

    + + + + +

    Explicitly hyphenated words such as “mother-in-law” are eligible for +breaking after each of their hyphens. Relatively few words in a +language offer such obvious break points, however, and automatic +detection of syllabic (or phonetic) boundaries for hyphenation is not +perfect,56 particularly for +unusual words found in technical literature. We can instruct GNU +troff how to hyphenate specific words if the need arises. +

    + +
    +
    Request: .hw word …
    +
    +

    Define each hyphenation exception word with each hyphen ‘-’ +in the word indicating a hyphenation point. For example, the request +

    +
    +
    .hw in-sa-lub-rious alpha
    +
    + +

    marks potential hyphenation points in “insalubrious”, and prevents +“alpha” from being hyphenated at all. +

    +

    Besides the space character, any character whose hyphenation code is +zero can be used to separate the arguments of hw (see the +hcode request below). In addition, this request can be used more +than once. +

    + +

    Hyphenation points specified with hw are not subject to the +within-word placement restrictions imposed by the hy request (see +below). +

    +

    Hyphenation exceptions specified with the hw request are +associated with the hyphenation language (see the hla request +below) and environment (see Environments); invoking the hw +request in the absence of a hyphenation language is an error. +

    +

    The request is ignored if there are no parameters. +

    + +

    These are known as hyphenation exceptions in the expectation +that most users will avail themselves of automatic hyphenation; these +exceptions override any rules that would normally apply to a word +matching a hyphenation exception defined with hw. +

    +

    Situations also arise when only a specific occurrence of a word needs +its hyphenation altered or suppressed, or when a URL or similar string +needs to be breakable in sensible places without hyphenation. +

    +
    +
    Escape sequence: \%
    +
    +
    Escape sequence: \:
    +
    + + + + +

    To tell GNU troff how to hyphenate words as they occur in input, +use the \% escape sequence; it is the default hyphenation +character. Each instance within a word indicates to GNU troff +that the word may be hyphenated at that point, while prefixing a word +with this escape sequence prevents it from being otherwise hyphenated. +This mechanism affects only that occurrence of the word; to change the +hyphenation of a word for the remainder of input processing, use the +hw request. +

    + + + +

    GNU troff regards the escape sequences \X and \Y as +starting a word; that is, the \% escape sequence in, say, +‘\X'...'\%foobar or ‘\Y'...'\%foobar no longer +prevents hyphenation of ‘foobar’ but inserts a hyphenation point +just prior to it; most likely this isn’t what you want. +See Postprocessor Access. +

    + + + + + + +

    \: inserts a non-printing break point; that is, a word can break +there, but the soft hyphen glyph (see below) is not written to the +output if it does. This escape sequence is an input word boundary, so +the remainder of the word is subject to hyphenation as normal. +

    +

    You can combine \: and \% to control breaking of a file +name or URL, or to permit hyphenation only after certain explicit +hyphens within a word. +

    +
    +
    The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
    +was, in retrospect, inevitable once the contents of
    +\%/var/log/\:\%httpd/\:\%access_log on the family web
    +server came to light, revealing visitors from Hogwarts.
    +
    +
    + +
    +
    Request: .hc [char]
    +
    +

    Change the hyphenation character to char. This character then +works as the \% escape sequence normally does, and thus no longer +appears in the output.57 Without an +argument, hc resets the hyphenation character to \% (the +default). The hyphenation character is associated with the environment +(see Environments). +

    + +
    +
    Request: .shc [c]
    +
    + + + + + + +

    Set the soft hyphen character, inserted when a word is hyphenated +automatically or at a hyphenation character, to the ordinary or special +character c.58 If the argument is omitted, the soft +hyphen character is set to the default, \[hy]. If no glyph for +c exists in the font in use at a potential hyphenation point, then +the line is not broken there. Neither character definitions (specified +with the char and similar requests) nor translations (specified +with the tr request) are applied to c. +

    + + + +

    Several requests influence automatic hyphenation. Because conventions +vary, a variety of hyphenation modes is available to the hy +request; these determine whether hyphenation will apply to a +word prior to breaking a line at the end of a page (more or less; see +below for details), and at which positions within that word +automatically determined hyphenation points are permissible. The places +within a word that are eligible for hyphenation are determined by +language-specific data and lettercase relationships. Furthermore, +hyphenation of a word might be suppressed due to a limit on +consecutive hyphenated lines (hlm), a minimum line length +threshold (hym), or because the line can instead be adjusted with +additional inter-word space (hys). +

    + +
    +
    Request: .hy [mode]
    +
    +
    Register: \n[.hy]
    +
    +

    Set automatic hyphenation mode to mode, an integer encoding +conditions for hyphenation; if omitted, ‘1’ is implied. The +hyphenation mode is available in the read-only register ‘.hy’; it +is associated with the environment (see Environments). The default +hyphenation mode depends on the localization file loaded when GNU +troff starts up; see the hpf request below. +

    +

    Typesetting practice generally does not avail itself of every +opportunity for hyphenation, but the details differ by language and site +mandates. The hyphenation modes of AT&T troff were +implemented with English-language publishing practices of the 1970s in +mind, not a scrupulous enumeration of conceivable parameters. GNU +troff extends those modes such that finer-grained control is +possible, favoring compatibility with older implementations over a more +intuitive arrangement. The means of hyphenation mode control is a set +of numbers that can be added up to encode the behavior +sought.59 The entries in the +following table are termed values; the sum of the desired +values is the mode. +

    +
    +
    0
    +

    disables hyphenation. +

    +
    +
    1
    +

    enables hyphenation except after the first and before the last character +of a word. +

    +
    + +

    The remaining values “imply” 1; that is, they enable hyphenation +under the same conditions as ‘.hy 1’, and then apply or lift +restrictions relative to that basis. +

    +
    +
    2
    +

    disables hyphenation of the last word on a page,60 even for explicitly hyphenated words. +

    +
    +
    4
    +

    disables hyphenation before the last two characters of a word. +

    +
    +
    8
    +

    disables hyphenation after the first two characters of a word. +

    +
    +
    16
    +

    enables hyphenation before the last character of a word. +

    +
    +
    32
    +

    enables hyphenation after the first character of a word. +

    +
    + +

    Apart from value 2, restrictions imposed by the hyphenation mode +are not respected for words whose hyphenations have been +specified with the hyphenation character (‘\%’ by default) or the +hw request. +

    +

    Nonzero values in the previous table are additive. For example, +mode 12 causes GNU troff to hyphenate neither the last two +nor the first two characters of a word. Some values cannot be used +together because they contradict; for instance, values 4 and 16, +and values 8 and 32. As noted, it is superfluous to add 1 to any +non-zero even mode. +

    + + +

    The automatic placement of hyphens in words is determined by +pattern files, which are derived from TeX and available for +several languages. The number of characters at the beginning of a word +after which the first hyphenation point should be inserted is determined +by the patterns themselves; it can’t be reduced further without +introducing additional, invalid hyphenation points (unfortunately, this +information is not part of a pattern file—you have to know it in +advance). The same is true for the number of characters at the end of +a word before the last hyphenation point should be inserted. For +example, you can supply the following input to ‘echo $(nroff)’. +

    +
    +
    .ll 1
    +.hy 48
    +splitting
    +
    + +

    You will get +

    +
    +
    s- plit- t- in- g
    +
    + +

    instead of the correct ‘split- ting’. English patterns as distributed +with GNU troff need two characters at the beginning and three +characters at the end; this means that value 4 of hy is +mandatory. Value 8 is possible as an additional restriction, but +values 16 and 32 should be avoided, as should mode 1. +Modes 4 and 6 are typical. +

    +

    A table of left and right minimum character counts for hyphenation as +needed by the patterns distributed with GNU troff follows; see +the groff_tmac(5) man page for more information on GNU +troff’s language macro files. +

    + + + + + + + + + + +
    languagepattern nameleft minright min
    Czechcs22
    Englishen23
    Frenchfr23
    German traditionaldet22
    German reformedden22
    Italianit22
    Swedishsv12
    + +

    Hyphenation exceptions within pattern files (i.e., the words within a +TeX \hyphenation group) obey the hyphenation restrictions +given by hy. +

    + +
    +
    Request: .nh
    +
    +

    Disable automatic hyphenation; i.e., set the hyphenation mode to 0 +(see above). The hyphenation mode of the last call to hy is not +remembered. +

    + +
    +
    Request: .hpf pattern-file
    +
    +
    Request: .hpfa pattern-file
    +
    +
    Request: .hpfcode a b [c d] …
    +
    + + +

    Read hyphenation patterns from pattern-file, which is sought +in the same way that macro files are with the mso request or the +-mname command-line option to groff. The +pattern-file should have the same format as (simple) TeX +pattern files. More specifically, the following scanning rules are +implemented. +

    +
      +
    • A percent sign starts a comment (up to the end of the line) even if +preceded by a backslash. + +
    • “Digraphs” like \$ are not supported. + +
    • ^^xx (where each x is 0–9 or a–f) and +^^c (character c in the code point range 0–127 +decimal) are recognized; other uses of ^ cause an error. + +
    • No macro expansion is performed. + +
    • hpf checks for the expression \patterns{…} +(possibly with whitespace before or after the braces). Everything +between the braces is taken as hyphenation patterns. Consequently, +{ and } are not allowed in patterns. + +
    • Similarly, \hyphenation{…} gives a list of hyphenation +exceptions. + +
    • \endinput is recognized also. + +
    • For backward compatibility, if \patterns is missing, the whole +file is treated as a list of hyphenation patterns (except that the +% character is recognized as the start of a comment). +
    + +

    The hpfa request appends a file of patterns to the current list. +

    +

    The hpfcode request defines mapping values for character codes in +pattern files. It is an older mechanism no longer used by GNU +troff’s own macro files; for its successor, see hcode +below. hpf or hpfa apply the mapping after reading the +patterns but before replacing or appending to the active list of +patterns. Its arguments are pairs of character codes—integers from 0 +to 255. The request maps character code a to +code b, code c to code d, and so on. +Character codes that would otherwise be invalid in GNU troff can +be used. By default, every code maps to itself except those for letters +‘A’ to ‘Z’, which map to those for ‘a’ to ‘z’. +

    + + + + + + + + + + +

    The set of hyphenation patterns is associated with the language set by +the hla request (see below). The hpf request is usually +invoked by a localization file loaded by the troffrc +file.61 +

    +

    A second call to hpf (for the same language) replaces the +hyphenation patterns with the new ones. Invoking hpf or +hpfa causes an error if there is no hyphenation language. If no +hpf request is specified (either in the document, in a file +loaded at startup, or in a macro package), GNU troff won’t +automatically hyphenate at all. +

    + +
    +
    Request: .hcode c1 code1 [c2 code2] …
    +
    + + +

    Set the hyphenation code of character c1 to code1, that of +c2 to code2, and so on. A hyphenation code must be an +ordinary character (not a special character escape sequence) other than +a digit or a space. The request is ignored if given no arguments. +

    +

    For hyphenation to work, hyphenation codes must be set up. At +startup, GNU troff assigns hyphenation codes to the letters +‘a’–‘z’ (mapped to themselves), to the letters +‘A’–‘Z’ (mapped to ‘a’–‘z’), and zero to all other +characters. Normally, hyphenation patterns contain only lowercase +letters which should be applied regardless of case. In other words, +they assume that the words ‘FOO’ and ‘Foo’ should be hyphenated exactly +as ‘foo’ is. The hcode request extends this principle to letters +outside the Unicode basic Latin alphabet; without it, words containing +such letters won’t be hyphenated properly even if the corresponding +hyphenation patterns contain them. +

    +

    For example, the following hcode requests are necessary to assign +hyphenation codes to the letters ‘ÄäÖöÜüß’, needed for German. +

    +
    +
    .hcode ä ä  Ä ä
    +.hcode ö ö  Ö ö
    +.hcode ü ü  Ü ü
    +.hcode ß ß
    +
    + +

    Without these assignments, GNU troff treats the German word +‘Kindergärten’ (the plural form of ‘kindergarten’) as two words +‘kinderg’ and ‘rten’ because the hyphenation code of the +umlaut a is zero by default, just like a space. There is a German +hyphenation pattern that covers ‘kinder’, so GNU troff finds +the hyphenation ‘kin-der’. The other two hyphenation points +(‘kin-der-gär-ten’) are missed. +

    + +
    +
    Request: .hla lang
    +
    +
    Register: \n[.hla]
    +
    + + + + +

    Set the hyphenation language to lang. Hyphenation exceptions +specified with the hw request and hyphenation patterns and +exceptions specified with the hpf and hpfa requests are +associated with the hyphenation language. The hla request is +usually invoked by a localization file, which is turn loaded by the +troffrc or troffrc-end file; see the hpf request +above. +

    + +

    The hyphenation language is available in the read-only string-valued +register ‘.hla’; it is associated with the environment +(see Environments). +

    + +
    +
    Request: .hlm [n]
    +
    +
    Register: \n[.hlm]
    +
    +
    Register: \n[.hlc]
    +
    + + + + + +

    Set the maximum quantity of consecutive hyphenated lines to n. If +n is negative, there is no maximum. If omitted, n +is −1. This value is associated with the environment +(see Environments). Only lines output from a given environment +count toward the maximum associated with that environment. Hyphens +resulting from \% are counted; explicit hyphens are not. +

    + + +

    The .hlm read-only register stores this maximum. The count of +immediately preceding consecutive hyphenated lines is available in the +read-only register .hlc. +

    + +
    +
    Request: .hym [length]
    +
    +
    Register: \n[.hym]
    +
    + + + +

    Set the (right) hyphenation margin to length. If the adjustment +mode is not ‘b’ or ‘n’, the line is not hyphenated if it is +shorter than length. Without an argument, the hyphenation margin +is reset to its default value, 0. The default scaling unit is ‘m’. +The hyphenation margin is associated with the environment +(see Environments). +

    +

    A negative argument resets the hyphenation margin to zero, emitting a +warning in category ‘range’. +

    + +

    The hyphenation margin is available in the .hym read-only +register. +

    + +
    +
    Request: .hys [hyphenation-space]
    +
    +
    Register: \n[.hys]
    +
    + + + +

    Suppress hyphenation of the line in adjustment modes ‘b’ or +‘n’ if it can be justified by adding no more than +hyphenation-space extra space to each inter-word space. Without +an argument, the hyphenation space adjustment threshold is set to its +default value, 0. The default scaling unit is ‘m’. The +hyphenation space adjustment threshold is associated with the +environment (see Environments). +

    +

    A negative argument resets the hyphenation space adjustment threshold to +zero, emitting a warning in category ‘range’. +

    + +

    The hyphenation space adjustment threshold is available in the +.hys read-only register. +

    + + + +
    +
    +
    + +

    5.11 Manipulating Spacing

    + + + +

    A break causes the formatter to update the vertical drawing position at +which the new text baseline is aligned. You can alter this location. +

    +
    +
    Request: .sp [distance]
    +
    +

    Break and move the next text baseline down by distance, or until +springing a page location trap.62 +If invoked with the no-break control character, sp moves the +pending output line’s text baseline by distance. A negative +distance will not reduce the position of the text baseline below +zero. Inside a diversion, any distance argument is ignored. The +default scaling unit is ‘v’. If distance is not specified, +‘1v’ is assumed. +

    +
    +
    .pl 5v \" Set page length to 5 vees.
    +.de xx
    +\-\-\-
    +.  br
    +..
    +.wh 0 xx \" Set a trap at the top of the page.
    +foo on page \n%
    +.sp 2v
    +bar on page \n%
    +.sp 50v \" This will cause a page break.
    +baz on page \n%
    +.pl \n(nlu \" Truncate page to current position.
    +    ⇒ ---
    +    ⇒ foo on page 1
    +    ⇒
    +    ⇒
    +    ⇒ bar on page 1
    +    ⇒ ---
    +    ⇒ baz on page 2
    +
    + +

    You might use the following macros to set the baseline of the next +output text at a given distance from the top or the bottom of the page. +We subtract one line height (\n[.v]) because the | +operator moves to one vee below the page top (recall Numeric Expressions). +

    +
    +
    .de y-from-top-down
    +.  sp |\\$1-\\n[.v]u
    +..
    +.
    +.de y-from-bot-up
    +.  sp |\\n[.p]u-\\$1-\\n[.v]u
    +..
    +
    + +

    A call to ‘.y-from-bot-up 10c’ means that the next text baseline +will be 10 cm from the bottom edge of the paper. +

    + +
    +
    Request: .ls [count]
    +
    +
    Register: \n[.L]
    +
    + +

    Set the line spacing; add count−1 blank lines after each +line of text. With no argument, GNU troff uses the previous +value before the last ls call. The default is 1. +

    + + +

    The read-only register .L contains the current line spacing; it +is associated with the environment (see Environments). +

    + +

    The ls request is a coarse mechanism. See Changing the Type Size, for the requests vs and pvs as alternatives to +ls. +

    +
    +
    Escape sequence: \x'spacing'
    +
    +
    Register: \n[.a]
    +
    +

    Sometimes, an output line requires additional vertical spacing, for +instance to allow room for a tall construct like an inline equation with +exponents or subscripts (particularly if they are iterated). The +\x escape sequence takes a delimited measurement (like +‘\x'3p'’) to increase the vertical spacing of the pending output +line. The default scaling unit is ‘v’. If the measurement is +positive, extra vertical space is inserted below the current line; a +negative measurement adds space above. If \x is applied to the +pending output line multiple times, the maxima of the positive and +negative adjustments are separately applied. The delimiter need not be +a neutral apostrophe; see Delimiters. +

    + +

    The .a read-only register contains the extra vertical spacing +after the text baseline of the most recently emitted output line. +(In other words, it is the largest positive argument to \x +encountered on that line.) This quantity is exposed via a register +because if an output line requires this “extra post-vertical line +spacing”, and the subsequent output line requires “extra pre-vertical +line spacing” (a negative argument to \x), then applying both +can lead to excessive spacing between the output lines. Text that is +piling high on line n might not require (as much) extra +pre-vertical line spacing if line n−1 carries extra +post-vertical line spacing. +

    +

    Use of \x can be necessary in combination with the +bracket-building escape sequence \b,63 as the following example shows. +

    +
    +
    .nf
    +This is a test of \[rs]b (1).
    +This is a test of \[rs]b (2).
    +This is a test of \b'xyz'\x'-1m'\x'1m' (3).
    +This is a test of \[rs]b (4).
    +This is a test of \[rs]b (5).
    +    ⇒ This is a test of \b (1).
    +    ⇒ This is a test of \b (2).
    +    ⇒                   x
    +    ⇒ This is a test of y (3).
    +    ⇒                   z
    +    ⇒ This is a test of \b (4).
    +    ⇒ This is a test of \b (5).
    +
    +
    + +

    Without \x, the backslashes on the lines marked ‘(2)’ and +‘(4)’ would be overprinted. +

    +
    +
    Request: .ns
    +
    +
    Request: .rs
    +
    +
    Register: \n[.ns]
    +
    + + + + + +

    Enable no-space mode. Vertical spacing, whether by sp +requests or blank input lines, is disabled. The bp request to +advance to the next page is also disabled, unless it is accompanied by a +page number (see Page Control). No-space mode ends automatically +when text64 is formatted for output 65 or the rs request is invoked, which ends +no-space mode. The read-only register .ns interpolates a Boolean +value indicating the enablement of no-space mode. +

    +

    A paragraphing macro might ordinarily insert vertical space to separate +paragraphs. A section heading macro could invoke ns to suppress +this spacing for the first paragraph in a section. +

    + + + +
    +
    +
    + +

    5.12 Tabs and Fields

    + + + + +

    A tab character (ISO code point 9, EBCDIC +code point 5) causes a horizontal movement to the next tab stop, if +any. +

    +
    +
    Escape sequence: \t
    +
    + + + + + +

    Interpolate a tab in copy mode; see Copy Mode. +

    + +
    +
    Request: .ta [[n1 n2nn ]T r1 r2rn]
    +
    +
    Register: \n[.tabs]
    +
    +

    Change tab stop positions. This request takes a series of tab +specifiers as arguments (optionally divided into two groups with the +letter ‘T’) that indicate where each tab stop is to be, overriding +any previous settings. The default scaling unit is ‘m’. Invoking +ta without an argument removes all tab stops. + + +GNU troff’s startup value is ‘T 0.5i. +

    +

    Tab stops can be specified absolutely—as distances from the left +margin. The following example sets six tab stops, one every inch. +

    +
    +
    .ta 1i 2i 3i 4i 5i 6i
    +
    + +

    Tab stops can also be specified using a leading ‘+’, which means +that the specified tab stop is set relative to the previous tab stop. +For example, the following is equivalent to the previous example. +

    +
    +
    .ta 1i +1i +1i +1i +1i +1i
    +
    + +

    GNU troff supports an extended syntax to specify repeating tab +stops. These stops appear after a ‘T’ argument. Their values are +always taken as distances relative to the previous tab stop. This is +the idiomatic way to specify tab stops at equal intervals in +groff. The following is, yet again, the same as the previous +examples. It does more, in fact, since it defines an infinite number of +tab stops at one-inch intervals. +

    +
    +
    .ta T 1i
    +
    + +

    Now we are ready to interpret the full syntax given above. The +ta request sets tabs at positions n1, n2, …, +nn, then at nn+r1, nn+r2, …, +nn+rn, then at nn+rn+r1, +nn+rn+r2, …, nn+rn+rn, and so +on. +

    +

    For example, ‘4c +6c T 3c 5c 2c’ is equivalent to ‘4c 10c 13c +18c 20c 23c 28c 30c …’. +

    +

    Text written to a tab column (i.e., between two tab stops, or between a +tab stop and an output line boundary) may be aligned to the right or +left, or centered in the column. This alignment is determined by +appending ‘R’, ‘L’, or ‘C’ to the tab specifier. The +default is ‘L’. +

    +
    +
    .ta 1i 2iC 3iR
    +
    + +

    The beginning of an output line is not a tab stop; the text that begins +an output line is placed according to the configured alignment and +indentation; see Manipulating Filling and Adjustment and Line Layout. +

    +

    A tab stop is converted into a non-breakable horizontal movement that +cannot be adjusted. +

    +
    +
    .ll 2i
    +.ds foo a\tb\tc
    +.ta T 1i
    +\*[foo]
    +    error→ warning: cannot break line
    +    ⇒ a         b         c
    +
    + +

    The above creates a single output line that is a bit longer than two +inches (we use a string to show exactly where the tab stops are). +Now consider the following. +

    +
    +
    .ll 2i
    +.ds bar a\tb c\td
    +.ta T 1i
    +\*[bar]
    +    error→ warning: cannot adjust line
    +    ⇒ a         b
    +    ⇒ c       d
    +
    + +

    GNU troff first converts the line’s tab stops into unbreakable +horizontal movements, then breaks after ‘b’. This usually isn’t +what you want. +

    +

    Superfluous tab characters—those that do not correspond to a tab +stop—are ignored except for the first, which delimits the characters +belonging to the last tab stop for right-alignment or centering. +

    +
    +
    .ds Z   foo\tbar\tbaz
    +.ds ZZ  foo\tbar\tbazqux
    +.ds ZZZ foo\tbar\tbaz\tqux
    +.ta 2i 4iR
    +\*[Z]
    +.br
    +\*[ZZ]
    +.br
    +\*[ZZZ]
    +.br
    +    ⇒ foo                 bar              baz
    +    ⇒ foo                 bar           bazqux
    +    ⇒ foo                 bar              bazqux
    +
    + +

    The first line right-aligns “baz” within the second tab stop. The +second line right-aligns “bazqux” within it. The third line +right-aligns only “baz” because of the additional tab character, which +marks the end of the text occupying the last tab stop defined. +

    +

    Tab stops are associated with the environment (see Environments). +

    + + + +

    The read-only register .tabs contains a string +representation of the current tab settings suitable for use as an +argument to the ta request.66 +

    +
    +
    .ds tab-string \n[.tabs]
    +\*[tab-string]
    +    ⇒ T120u
    +
    +
    + +
    +
    Request: .tc [c]
    +
    + + + +

    Set the tab repetition character to the ordinary or special character +c; normally, no glyph is written when moving to a tab stop (and +some output devices may output space characters to achieve this motion). +A tab repetition character causes the formatter to write as many +instances of c as are necessary to occupy the interval from the +horizontal drawing position to the next tab stop. With no argument, GNU +troff reverts to the default behavior. The tab repetition +character is associated with the environment (see Environments). +Only a single character of c is recognized; any excess is ignored. +

    + +
    +
    Request: .linetabs n
    +
    +
    Register: \n[.linetabs]
    +
    + + + +

    If n is missing or non-zero, activate line-tabs; deactivate +it otherwise (the default). Active line-tabs cause GNU troff +to compute tab distances relative to the start of the output line +instead of the input line. +

    +
    +
    .de Tabs
    +.  ds x a\t\c
    +.  ds y b\t\c
    +.  ds z c
    +.  ta 1i 3i
    +\\*x
    +\\*y
    +\\*z
    +..
    +.Tabs
    +.br
    +.linetabs
    +.Tabs
    +    ⇒ a         b         c
    +    ⇒ a         b                   c
    +
    + +

    Line-tabs activation is associated with the environment +(see Environments). The read-only register .linetabs +interpolates 1 if line-tabs are active, and 0 otherwise. +

    + + + + +
    +
    + +

    5.12.1 Leaders

    + + +

    Sometimes it is desirable to fill a tab stop with a given glyph, +but also use tab stops normally on the same output line. An example is +a table of contents entry that uses dots to bridge the entry name with +its page number, which is itself aligned between tab stops. The +roff language provides leaders for this +purpose.67 +

    + +

    A leader character (ISO and EBCDIC code +point 1, also known as SOH or “start of heading”), +behaves similarly to a tab character: it moves to the next tab stop. +The difference is that for this movement, the default fill character is +a period ‘.’. +

    +
    +
    Escape sequence: \a
    +
    + + + + + +

    Interpolate a leader in copy mode; see Copy Mode. +

    + +
    +
    Request: .lc [c]
    +
    + + + +

    Set the leader repetition character to the ordinary or special character +c. Recall Tabs and Leaders: when encountering a leader +character in the input, the formatter writes as many dots ‘.’ as +are necessary until +reaching the next tab stop; this is the leader definition +character. Omitting c unsets the leader +character. With no argument, GNU troff treats leaders the same +as tabs. The leader repetition character is associated with the +environment (see Environments). Only a single c is +recognized; any excess is ignored. +

    + + + +

    A table of contents, for example, may define tab stops after a section +number, a title, and a gap to be filled with leader dots. The page +number follows the leader, after a right-aligned final tab stop wide +enough to house the largest page number occurring in the document. +

    +
    +
    .ds entry1 19.\tThe Prophet\a\t98
    +.ds entry2 20.\tAll Astir\a\t101
    +.ta .5i 4.5i +.5iR
    +.nf
    +\*[entry1]
    +\*[entry2]
    +    ⇒ 19.  The Prophet.............................   98
    +    ⇒ 20.  All Astir...............................  101
    +
    + + +
    +
    +
    + +

    5.12.2 Fields

    + + + + + + + + +

    Fields are a more general way of laying out tabular data. A field +is defined as the data between a pair of delimiting characters. +It contains substrings that are separated by padding characters. +The width of a field is the distance on the input line from the +position where the field starts to the next tab stop. A padding +character inserts an adjustable space similar to TeX’s \hss +command (thus it can even be negative) to make the sum of all substring +lengths plus the adjustable space equal to the field width. If more +than one padding character is inserted, the available space is evenly +distributed among them. +

    +
    +
    Request: .fc [delim-char [padding-char]]
    +
    +

    Define a delimiting and a padding character for fields. If the latter +is missing, the padding character defaults to a space character. If +there is no argument at all, the field mechanism is disabled (which is +the default). In contrast to, e.g., the tab repetition character, +delimiting and padding characters are not associated with the +environment (see Environments). +

    +
    +
    .fc # ^
    +.ta T 3i
    +#foo^bar^smurf#
    +.br
    +#foo^^bar^smurf#
    +    ⇒ foo         bar          smurf
    +    ⇒ foo            bar       smurf
    +
    +
    + + + +
    +
    +
    +
    + +

    5.13 Character Translations

    + + + +

    A translation is a mapping of an input character to an output +glyph. The mapping occurs at output time, i.e., the input character +gets assigned the metric information of the mapped output character +right before input tokens are converted to nodes (see gtroff Internals, for more on this process). +

    +
    +
    Request: .tr abcd
    +
    +
    Request: .trin abcd
    +
    +

    Translate character a to glyph b, character c to +glyph d, and so on. If there is an odd number of characters +in the argument, the last one is translated to a fixed-width space (the +same one obtained by the \SP escape sequence). +

    +

    The trin request is identical to tr, but when you unformat +a diversion with asciify it ignores the translation. +See Diversions, for details about the asciify request. +

    +

    Some notes: +

    +
      +
    • + + + + + + + + + + + + +Special characters (\(xx, \[xxx], +\C'xxx', \', \`, \-, \_), +glyphs defined with the char request, and numbered glyphs +(\N'xxx') can be translated also. + +
    • +The \e escape can be translated also. + +
    • + +Characters can be mapped onto the \% and \~ escape +sequences (but \% and \~ can’t be mapped onto another +glyph). + +
    • + + + + + + + + + +The following characters can’t be translated: space (with one exception, +see below), backspace, newline, leader (and \a), tab (and +\t). + +
    • +Translations are not considered for finding the soft hyphen character +set with the shc request. + +
    • +The pair ‘c\&’ (an arbitrary character c followed +by the dummy character) maps this character to “nothing”. + +
      +
      .tr a\&
      +foo bar
      +    ⇒ foo br
      +
      + +

      Even the space character can be mapped to the dummy character. +

      +
      +
      .tr aa \&
      +foo bar
      +    ⇒ foobar
      +
      + +

      As shown in the example, the space character can’t be the first +character/glyph pair as an argument of tr. Additionally, it is +not possible to map the space character to any other glyph; requests +like ‘.tr aa x undo ‘.tr aa \& instead. +

      +

      If justification is active, lines are justified in spite of the ‘empty’ +space character (but there is no minimal distance, i.e., the space +character, between words). +

      +
    • After an output glyph has been constructed (this happens at the moment +immediately before the glyph is appended to an output glyph list, either +by direct output, in a macro, diversion, or string), it is no longer +affected by tr. + +
    • Translating character to glyphs where one of them or both are undefined +is possible also; tr does not check whether the elements of its +argument exist. + +

      See gtroff Internals. +

      +
    • Without an argument, the tr request is ignored. +
    +
    + +
    +
    Request: .trnt abcd
    +
    + +

    trnt is the same as the tr request except that the +translations do not apply to text that is transparently throughput into +a diversion with \!. See Diversions. +

    +

    For example, +

    +
    +
    .tr ab
    +.di x
    +\!.tm a
    +.di
    +.x
    +
    + +

    prints ‘b’ to the standard error stream; if trnt is used +instead of tr it prints ‘a’. +

    + + + +
    +
    +
    + +

    5.14 troff and nroff Modes

    + + + + + +

    Historically, nroff and troff were two separate programs; +the former for terminal output, the latter for typesetters. GNU +troff merges both functions into one executable68 that sends its output to a +device driver (grotty for terminal devices, grops for +PostScript, and so on) which interprets this intermediate output format. +When discussing AT&T troff, it makes sense to talk +about nroff mode and troff mode since the +differences are hard-coded. GNU troff takes information from +device and font description files without handling requests specially if +a terminal output device is used, so such a strong distinction is +unnecessary. +

    +

    Usually, a macro package can be used with all output devices. +Nevertheless, it is sometimes necessary to make a distinction between +terminal and non-terminal devices: GNU troff provides two +built-in conditions ‘n’ and ‘t’ for the if, ie, +and while requests to decide whether GNU troff shall +behave like nroff or like troff. +

    +
    +
    Request: .troff
    +
    + + +

    Make the ‘t’ built-in condition true (and the ‘n’ built-in +condition false) for if, ie, and while conditional +requests. This is the default if GNU troff (not +groff) is started with the -R switch to avoid loading of +the startup files troffrc and troffrc-end. Without +-R, GNU troff stays in troff mode if the output +device is not a terminal (e.g., ‘ps’). +

    + +
    +
    Request: .nroff
    +
    + +

    Make the ‘n’ built-in condition true (and the ‘t’ built-in +condition false) for if, ie, and while conditional +requests. This is the default if GNU troff uses a terminal +output device; the code for switching to nroff mode is in the +file tty.tmac, which is loaded by the startup file +troffrc. +

    + +

    See Conditionals and Loops, for more details on built-in conditions. +

    + + +
    +
    +
    + +

    5.15 Line Layout

    + + + + + +

    The following drawing shows the dimensions that gtroff uses for +placing a line of output onto the page. They are labeled with the +request that manipulates each dimension. +

    +
    +
         -->| in |<--
    +        |<-----------ll------------>|
    +   +----+----+----------------------+----+
    +   |    :    :                      :    |
    +   +----+----+----------------------+----+
    +-->| po |<--
    +   |<--------paper width---------------->|
    +
    + +

    These dimensions are: +

    +
    +
    po
    +
    + + + +

    Page offset—this is the leftmost position of text on the final +output, defining the left margin. +

    +
    +
    in
    +
    + +

    Indentation—this is the distance from the left margin where +text is printed. +

    +
    +
    ll
    +
    + +

    Line length—this is the distance from the left margin to right +margin. +

    +
    + + + +

    The right margin is not explicitly configured; the combination of page +offset and line length provides the information necessary to derive it. +

    +

    A simple demonstration: +

    +
    +
    .ll 3i
    +This is text without indentation.
    +The line length has been set to 3\~inches.
    +.in +.5i
    +.ll -.5i
    +Now the left and right margins are both increased.
    +.in
    +.ll
    +Calling .in and .ll without parameters restores
    +the previous values.
    +
    + +
    +
        ⇒ This  is text without indenta-
    +    ⇒ tion.   The  line  length  has
    +    ⇒ been set to 3 inches.
    +    ⇒      Now   the  left  and
    +    ⇒      right  margins   are
    +    ⇒      both increased.
    +    ⇒ Calling  .in  and  .ll without
    +    ⇒ parameters restores the previ-
    +    ⇒ ous values.
    +
    + +
    +
    Request: .po [offset]
    +
    +
    Request: .po +offset
    +
    Request: .po -offset
    +
    Register: \n[.o]
    +
    + +

    Set page offset to offset (or increment or decrement its current +value by offset). If invoked without an argument, the page offset +is restored to the value before the previous po request. +This request does not cause a break; the page offset in effect when an +output line is broken prevails (see Manipulating Filling and Adjustment). The initial value is 1i and the default scaling +unit is ‘m’. On terminal devices, the page offset is set to zero +by a driver-specific macro file, tty.tmac. The current page +offset can be found in the read-only register ‘.o’. + + +This request is incorrectly documented in the AT&T +troff manual as using a default scaling unit of ‘v’. +

    +
    +
    .po 3i
    +\n[.o]
    +    ⇒ 720
    +.po -1i
    +\n[.o]
    +    ⇒ 480
    +.po
    +\n[.o]
    +    ⇒ 720
    +
    +
    + +
    +
    Request: .in [indent]
    +
    +
    Request: .in +indent
    +
    Request: .in -indent
    +
    Register: \n[.i]
    +
    +

    Set indentation to indent (or increment or decrement the current +value by indent). This request causes a break. Initially, there +is no indentation. +

    +

    If in is called without an argument, the indentation is reset to +the previous value before the last call to in. The default +scaling unit is ‘m’. +

    +

    If a negative indentation value is specified (which is not allowed), +gtroff emits a warning in category ‘range’ and sets the +indentation to zero. +

    +

    The effect of in is delayed until a partially collected line (if +it exists) is output. A temporary indentation value is reset to zero +also. +

    +

    The current indentation (as set by in) can be found in the +read-only register ‘.i’. The indentation is associated with the +environment (see Environments). +

    + +
    +
    Request: .ti offset
    +
    +
    Request: .ti +offset
    +
    Request: .ti -offset
    +
    Register: \n[.in]
    +
    +

    Temporarily indent the next output line by offset. If an +increment or decrement value is specified, adjust the temporary +indentation relative to the value set by the in request. +

    +

    This request causes a break; its value is associated with the +environment (see Environments). The default scaling unit is +‘m’. A call of ti without an argument is ignored. +

    +

    If the total indentation value is negative (which is not allowed), +gtroff emits a warning in category ‘range’ and sets the +temporary indentation to zero. ‘Total indentation’ is either +offset if specified as an absolute value, or the temporary plus +normal indentation, if offset is given as a relative value. +

    +

    The effect of ti is delayed until a partially collected line (if +it exists) is output. +

    +

    The read-only register .in is the indentation that applies to the +current output line. +

    +

    The difference between .i and .in is that the latter takes +into account whether a partially collected line still uses the old +indentation value or a temporary indentation value is active. +

    + +
    +
    Request: .ll [length]
    +
    +
    Request: .ll +length
    +
    Request: .ll -length
    +
    Register: \n[.l]
    +
    +
    Register: \n[.ll]
    +
    +

    Set the line length to length (or increment or decrement the +current value by length). Initially, the line length is set to +6.5i. The effect of ll is delayed until a partially +collected line (if it exists) is output. The default scaling unit is +‘m’. +

    +

    If ll is called without an argument, the line length is reset to +the previous value before the last call to ll. If a negative +line length is specified (which is not allowed), gtroff emits a +warning in category ‘range’ and sets the line length to zero. The +line length is associated with the environment (see Environments). +

    + +

    The current line length (as set by ll) can be found in the +read-only register ‘.l’. The read-only register .ll is the +line length that applies to the current output line. +

    +

    Similar to .i and .in, the difference between .l +and .ll is that the latter takes into account whether a partially +collected line still uses the old line length value. +

    + + + +
    +
    +
    + +

    5.16 Line Continuation

    + + + +

    When filling is enabled, input and output line breaks generally do not +correspond. The roff language therefore distinguishes input and +output line continuation. +

    +
    +
    Escape sequence: \RET
    +
    + + + + +

    \RET (a backslash immediately followed by a newline) +suppresses the effects of that newline in the input. The next input +line thus retains the classification of its predecessor as a control or +text line. \RET is useful for managing line lengths in the +input during document maintenance; you can break an input line in the +middle of a request invocation, macro call, or escape sequence. Input +line continuation is invisible to the formatter, with two exceptions: +the | operator recognizes the new input line +(see Numeric Expressions), and the input line counter register +.c is incremented. +

    +
    +
    .ll 50n
    +.de I
    +.  ft I
    +.  nop \\$*
    +.  ft
    +..
    +Our film class watched
    +.I The Effect of Gamma Rays on Man-in-the-Moon
    +Marigolds. \" whoops, the input line wrapped
    +.br
    +.I My own opus begins on line \n[.c] \
    +and ends on line \n[.c].
    +
    +
    +
        ⇒ Our film class watched The Effect of Gamma Rays on
    +    ⇒ Man-in-the-Moon Marigolds.
    +    ⇒ My own opus begins on line 11 and ends on line 12.
    +
    +
    + +
    +
    Escape sequence: \c
    +
    +
    Register: \n[.int]
    +
    + + + + + + +

    \c continues an output line. Nothing after it on the input line +is formatted. In contrast to \RET, a line after \c +remains a new input line, so a control character is recognized at its +beginning. The visual results depend on whether filling is enabled; see +Manipulating Filling and Adjustment. +

    +
      +
    • + + +If filling is enabled, a word interrupted with \c is continued +with the text on the next input text line, without an intervening space. + +
      +
      This is a te\c
      +st.
      +    ⇒ This is a test.
      +
      + +
    • + + +If filling is disabled, the next input text line after \c is +handled as a continuation of the same input text line. + +
      +
      .nf
      +This is a \c
      +test.
      +    ⇒ This is a test.
      +
      +
    + +

    An intervening control line that causes a break overrides \c, +flushing out the pending output line in the usual way. +

    + + +

    The .int register contains a positive value if the last output +line was continued with \c; this datum is associated with the +environment (see Environments).69 +

    + + + +
    +
    +
    + +

    5.17 Page Layout

    + + + +

    The formatter permits configuration of the page length and page number. +

    +
    +
    Request: .pl [length]
    +
    +
    Request: .pl +length
    +
    Request: .pl -length
    +
    Register: \n[.p]
    +
    + + + + +

    Change (increase or decrease) the page length per the numeric expression +length. The default scaling unit is ‘v’. A negative +length is valid, but an uncommon application: it prevents page +location traps from being sprung,70 and each +output line is placed on a new page. If length is invalid, GNU +troff emits a warning in category ‘number’. If length +is absent or invalid, ‘11i’ is assumed. +

    + +

    The read-only register ‘.p’ interpolates the current page length. +

    + +
    +
    Request: .pn num
    +
    +
    Request: .pn +num
    +
    Request: .pn -num
    +
    Register: \n[.pn]
    +
    + + + +

    Change (increase or decrease) the page number of the next page +per the numeric expression num. If num is invalid, GNU +troff emits a warning in category ‘number’ and ignores the +request. Without an argument, pn is ignored. +

    + + +

    The read-only register .pn interpolates num if set by +pn on the current page, or the current page number plus 1. +

    + + + + +

    The formatter offers special support for typesetting headers and +footers, collectively termed titles. Titles have an independent +line length, and their placement on the page is not restricted. +

    +
    +
    Request: .tl 'left'center'right'
    +
    + + + + +

    Format an output line as a title consisting of left, center, +and right, each aligned accordingly. The delimiter need not be a +neutral apostrophe: tl accepts the same delimiters as most escape +sequences; see Delimiters. If not used as the delimiter, any +page number character character is replaced with the current page +number; the default is ‘%’; see the the pc request below. +Without an argument, tl is ignored. tl writes the title +line immediately, ignoring any partially collected line. +

    +

    It is not an error to omit delimiters after the first. For example, +‘.tl /Thesis is interpreted as ‘.tl /Thesis///: it +sets a title line comprising only the left-aligned word ‘Thesis’. +

    + +
    +
    Request: .lt [length]
    +
    +
    Request: .lt +length
    +
    Request: .lt -length
    +
    Register: \n[.lt]
    +
    + + +

    Change (increase or decrease) the line length used by titles per the +numeric expression length. The default scaling unit is ‘m’. +If length is negative, GNU emits a warning in category +‘range’ and treats length as ‘0’. If length is +invalid, GNU troff emits a warning in category ‘number’ and +ignores the request. The formatter’s default title length is +‘6.5i’. With no argument, the title length is restored to the +previous value. The title length is is associated with the environment +(see Environments). +

    + +

    The read-only register ‘.lt’ interpolates the title line length. +

    + +
    +
    Request: .pc [char]
    +
    + + + +

    Set the page number character to char. With no argument, the page +number character is disabled. pc does not affect the +register %. +

    + +

    The following example exercises title features. +

    +
    +
    .lt 50n
    +This is my partially collected
    +.tl 'Isomers 2023'%'Dextrose Edition'
    +line.
    +    ⇒ Isomers 2023             1        Dextrose Edition
    +    ⇒ This is my partially collected line.
    +
    + +

    We most often see titles used in page header and footer traps. +See Traps. +

    + +
    +
    +
    + +

    5.18 Page Control

    + + + + + + + +

    Discretionary page breaks can prevent the unwanted separation of +content. A new page number takes effect during page ejection; see +The Implicit Page Trap. +

    +
    +
    Request: .bp [page-number]
    +
    +
    Request: .bp +page-number
    +
    Request: .bp -page-number
    +
    Register: \n[%]
    +
    + + +

    Break the page and change (increase or decrease) the next page number +per the numeric expression page-number. If page-number is +invalid, GNU troff emits a warning in category ‘number’ and +ignores the argument. This request causes a break. A page break +advances the vertical drawing position to the bottom of the page, +springing traps. See Page Location Traps. + + + +bp has effect only if invoked within the top-level +diversion.71 + + +This request is incorrectly documented in the AT&T +troff manual as having a default scaling unit of ‘v’. +

    + + +

    The register % interpolates the current page number. +

    +
    +
    .de BP
    +'  bp \" schedule page break once current line is output
    +..
    +
    +
    + +
    +
    Request: .ne [space]
    +
    + + + +

    Force a page break if insufficient vertical space is available (assert +“needed” space). ne tests the distance to the next page +location trap; see Page Location Traps, and breaks the page if +that amount is less than space. The default scaling unit is +‘v’. If space is invalid, GNU troff emits a warning +in category ‘number’ and ignores the argument. If space is +not specified, ‘1v’ is assumed. +

    + +

    We can require space for at least the first two output lines of a +paragraph, preventing its first line from being widowed at the +page bottom. +

    +
    +
    .ne 2v
    +Considering how common illness is,
    +how tremendous the spiritual change that it brings,
    +how astonishing,
    +when the lights of health go down,
    +the undiscovered countries that are then disclosed,
    +what wastes and deserts of the soul a slight attack
    +of influenza brings to view,
    +
    + +

    This method is reliable only if no output line is pending when ne +is invoked. When macro packages are used, this is often not the case: +their paragraphing macros perform the break. You may need to experiment +with placing the ne after the paragraphing macro, or br +and ne before it. +

    + + +

    ne is also useful to force grouping of section headings with +their subsequent paragraphs, or tables with their captions and/or +explanations. Macro packages often use ne with diversions to +implement keeps and displays; see Diversions. They may also offer +parameters for widow and orphan management. +

    + +
    +
    Request: .sv [space]
    +
    +
    Request: .os
    +
    + +

    Require vertical space as ne does, but also save it for +later output by the os request. If space is available +before the next page location trap, it is output immediately. Both +requests ignore a partially collected line, taking effect at the next +break. + + +sv and os ignore no-space mode (recall Manipulating Spacing). While the sv request allows negative values for +space, os ignores them. The default scaling unit is +‘v’. If space is not specified, ‘1v’ is assumed. +

    + +
    +
    Register: \n[nl]
    +
    + + + +

    nl interpolates or sets the vertical drawing position. When the +formatter starts, the first page transition hasn’t happened yet, and +nl is negative. If a header trap has been planted on the page +(typically at vertical position 0), you can assign a negative +value to nl to spring it if that page has already started +(see Page Location Traps). +

    +
    +
    .de HD
    +.  sp
    +.  tl ''Goldbach Solution''
    +.  sp
    +..
    +.
    +First page.
    +.bp
    +.wh 0 HD \" plant header trap at top of page
    +.nr nl (-1)
    +Second page.
    +    ⇒ First page.
    +    ⇒
    +    ⇒ (blank lines elided)
    +    ⇒
    +    ⇒                         Goldbach Solution
    +    ⇒
    +    ⇒ (blank lines elided)
    +    ⇒
    +    ⇒ Second page.
    +
    + +

    Without resetting nl to a negative value, the trap just planted +would be active beginning with the next page, not the current +one. +

    +

    See Diversions, for a comparison of nl with the .h and +.d registers. +

    + + + +
    +
    +
    + +

    5.19 Using Fonts

    + + + + + + + + + + + + + +

    In digital typography, a font is a collection of characters in a +specific typeface that a device can render as glyphs at a desired +size.72 A roff formatter can change typefaces at any +point in the text. The basic faces are a set of styles combining +upright and slanted shapes with normal and heavy stroke weights: +‘R’, ‘I’, ‘B’, and ‘BI’—these stand for +roman, italic, bold, and +bold-italic. For linguistic text, GNU troff groups +typefaces into families containing each of these +styles.73 A text font is thus often a family +combined with a style, but it need not be: consider the ps and +pdf devices’ ZCMI (Zapf Chancery Medium italic)—often, +no other style of Zapf Chancery Medium is provided. On typesetting +devices, at least one special font is available, comprising +unstyled glyphs for mathematical operators and other purposes. +

    + + + + + + + + +

    Like AT&T troff, GNU troff does not itself load +or manipulate a digital font file;74 instead it +works with a font description file that characterizes it, +including its glyph repertoire and the metrics (dimensions) of +each glyph.75 This +information permits the formatter to accurately place glyphs with +respect to each other. Before using a font description, the formatter +associates it with a mounting position, a place in an ordered list +of available typefaces. + + + +So that a document need not be strongly coupled to a specific font +family, in GNU troff an output device can associate a style in +the abstract sense with a mounting position. Thus the default family +can be combined with a style dynamically, producing a resolved font +name. +

    +

    Fonts often have trademarked names, and even Free Software fonts can +require renaming upon modification. groff maintains a +convention that a device’s serif font family is given the name ‘T’ +(“Times”), its sans-serif family ‘H’ (“Helvetica”), and its +monospaced family ‘C’ (“Courier”). Historical inertia has driven +groff’s font identifiers to short uppercase abbreviations of font +names, as with ‘TR’, ‘TI’, ‘TB’, ‘TBI’, and a +special font ‘S’. +

    +

    The default family used with abstract styles can be changed at any time; +initially, it is ‘T’. Typically, abstract styles are arranged in +the first four mounting positions in the order shown above. The default +mounting position, and therefore style, is always ‘1’ (‘R’). +By issuing appropriate formatter instructions, you can override these +defaults before your document writes its first glyph. +

    + + + + + +

    Terminal output devices cannot change font families and lack special +fonts. They support style changes by overstriking, or by altering +ISO 6429/ECMA-48 graphic renditions (character cell +attributes). +

    + + + +
    +
    + +

    5.19.1 Selecting Fonts

    + + +

    We use font to refer to any of several means of identifying a +font: by mounting position (‘3’), by abstract style (‘B’), or +by its identifier (‘TB’). +

    +
    +
    Request: .ft [font]
    +
    +
    Escape sequence: \ff
    +
    +
    Escape sequence: \f(fn
    +
    Escape sequence: \f[font]
    +
    Register: \n[.fn]
    +
    + + + + + + + + + + + +

    The ft request selects the typeface font. If the argument +is absent or ‘P’, it selects the previously chosen font. If +font is a non-negative integer, it is interpreted as mounting +position; the font mounted there is selected. If that position refers +to an abstract style, it is combined with the default family (see +fam and \F below) to make a resolved font name. If the +mounting position is not a style and no font is mounted there, GNU +troff emits a warning in category ‘font’ and ignores the +request. +

    +

    If font matches a style name, it is combined with the current +family to make a resolved font name. Otherwise, font is assumed +to already be a resolved font name. +

    + + + +

    The resolved font name is subject to translation (see request ftr +below). Next, the (possibly translated) font name’s mounting position +is looked up; if not mounted, font is sought on the file system as +a font description file and, if located, automatically mounted at the +next available position (see register .fp below). If the font +was mounted using an identifier different from its font description file +name (see request fp below), that file name is then looked up. +If a font description file for the resolved font name is not found, GNU +troff emits a warning in category ‘font’ and ignores the +request. +

    +

    The \f escape sequence is similar, using one-character name (or +mounting position) f, two-character name fn, or a name +font of arbitrary length. + + +‘\f[]’ selects the previous font. The syntax form ‘\fP’ is +supported for backward compatibility, and ‘\f[P]’ for consistency. +

    +
    +
    eggs, bacon,
    +.ft I
    +spam,
    +.ft
    +and sausage.
    +.br
    +eggs, bacon, \fIspam,\fP and sausage.
    +    ⇒ eggs, bacon, spam, and sausage
    +    ⇒ eggs, bacon, spam, and sausage
    +
    + +

    The current and previously selected fonts are properties of the +environment (see Environments). +

    +

    The read-only string-valued register .fn contains the resolved +font name of the selected font. +

    +

    \f doesn’t produce an input token in GNU troff; it thus +can be used in requests that expect a single-character argument. We can +assign a font to a margin character as follows (see Miscellaneous). +

    +
    +
    .mc \f[I]x\f[]
    +
    +
    + +
    +
    Request: .ftr f [g]
    +
    + + + + + + + + + + + + + + +

    Translate font f to font g. Whenever a font +named f is referred to in a \f escape sequence, in the +F and S conditional operators, or in the ft, +ul, bd, cs, tkf, special, +fspecial, fp, or sty requests, font g is +used. If g is missing or equal to f the translation is +undone. +

    +

    Font translations cannot be chained. +

    +
    +
    .ftr XXX TR
    +.ftr XXX YYY
    +.ft XXX
    +    error→ warning: can't find font 'XXX'
    +
    +
    + +
    +
    Request: .fzoom f [zoom]
    +
    +
    Register: \n[.zoom]
    +
    + + + + + + + + +

    Set magnification of font f to factor zoom, which must +be a non-negative integer multiple of 1/1000th. This request is useful +to adjust the optical size of a font in relation to the others. In the +example below, font CR is magnified by 10% (the zoom factor is +thus 1.1). +

    +
    +
    .fam P
    +.fzoom CR 1100
    +.ps 12
    +Palatino and \f[CR]Courier\f[]
    +
    + +

    A missing or zero value of zoom is the same as a value of 1000, +which means no magnification. f must be a resolved font +name, not an abstract style. +

    +

    The magnification of a font is completely transparent to GNU +troff; a change of the zoom factor doesn’t cause any effect +except that the dimensions of glyphs, (word) spaces, kerns, etc., of the +affected font are adjusted accordingly. +

    +

    The zoom factor of the current font is available in the read-only +register ‘.zoom’, in multiples of 1/1000th. It returns zero if +there is no magnification. +

    + + +
    +
    +
    + +

    5.19.2 Font Families

    + + + + + +

    To accommodate the wide variety of fonts available, GNU troff +distinguishes font families and font styles. A resolved +font name is the catenation of a font family and a style. Selecting an +abstract style causes GNU troff to combine it with the default +font family. +

    +

    You can thus compose a document using abstract styles exclusively for +its body or running text, selecting a specific family only for titles or +examples, for instance, and change the default family on the command +line (recall Options). +

    +

    Fonts for the devices ps, pdf, dvi, lj4, +lbp, and the X11 devices support this mechanism. By default, +GNU troff uses the Times family with the four styles ‘R’, +‘I’, ‘B’, and ‘BI’. +

    +
    +
    Request: .fam [family]
    +
    +
    Register: \n[.fam]
    +
    +
    Escape sequence: \Ff
    +
    +
    Escape sequence: \F(fm
    +
    Escape sequence: \F[family]
    +
    + +

    Set the default font family, used in combination with abstract styles to +construct a resolved font name, to family (one-character +name f, two-character name fm). If no argument is +given, GNU troff selects the previous font family; if there none, +is it falls back to the device’s default76 or its own (‘T’). +

    +

    The \F escape sequence works similarly. In disanalogy to +\f, ‘\FP’ makes ‘P’ the default family. Use +‘\F[]’ to select the previous default family. The default font +family is available in the read-only string-valued register .fam; +it is associated with the environment (see Environments). +

    +
    +
    spam,     \" startup defaults are T (Times) R (roman)
    +.fam H    \" make Helvetica the default family
    +spam,     \" family H + style R = HR
    +.ft B     \" family H + style B = HB
    +spam,
    +.ft CR    \" Courier roman (default family not changed)
    +spam,
    +.ft       \" back to Helvetica bold
    +spam,
    +.fam T    \" make Times the default family
    +spam,     \" family T + style B = TB
    +.ft AR    \" font AR (not a style)
    +baked beans,
    +.ft R     \" family T + style R = TR
    +and spam.
    +
    + +

    \F doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font family on the fly. +

    +
    +
    .mc \F[P]x\F[]
    +
    +
    + +
    +
    Request: .sty n style
    +
    +
    Register: \n[.sty]
    +
    + + + + + + + + + +

    Associate an abstract style style with mounting +position n, which must be a non-negative integer. If the +requests cs, bd, tkf, uf, or fspecial +are applied to an abstract style, they are instead applied to the member +of the current family corresponding to that style. +

    + + +

    The default family can be set with the -f option (see Options). The styles command in the DESC file controls +which font positions (if any) are initially associated with abstract +styles rather than fonts. +

    +

    Caution: The style argument is not validated. +Errors may occur later, when the formatter attempts to construct a +resolved font name, or format a character for output. +

    +
    +
    .nr BarPos \n[.fp]
    +.sty \n[.fp] Bar
    +.fam Foo
    +.ft \n[BarPos]
    +.tm .f=\n[.f]
    +A
    +    error→ error: no font family named 'Foo' exists
    +    error→ .f=41
    +    error→ error: cannot format glyph: no current font
    +
    + +

    When an abstract style has been selected, the read-only string-valued +register ‘.sty’ interpolates its name; this datum is associated +with the environment (see Environments). Otherwise, ‘.sty’ +interpolates nothing. +

    + + +
    +
    +
    + +

    5.19.3 Font Positions

    + + + +

    To support typeface indirection through abstract styles, and for +compatibility with AT&T troff, the formatter maintains +a list of font positions at which fonts required by a document are +mounted. An output device’s description file DESC +typically configures a set of pre-mounted fonts; see Device and Font Description Files. A font need not be explicitly mounted before +it is selected; GNU troff will search GROFF_FONT_PATH for +it by name and mount it at the first free mounting position on demand. +

    +
    +
    Request: .fp pos id [font-description-file-name]
    +
    +
    Register: \n[.f]
    +
    +
    Register: \n[.fp]
    +
    + + +

    Mount a font under the name id at mounting position pos, a +non-negative integer. When the formatter starts up, it reads the output +device’s description to mount an initial set of faces, and selects font +position 1. Position 0 is unused by default. Unless the +font-description-file-name argument is given, id should be +the name of a font description file stored in a directory corresponding +to the selected output device. GNU troff does not traverse +directories to locate the font description file. +

    + + +

    The optional third argument enables font names to be aliased, which can +be necessary in compatibility mode since AT&T troff syntax +affords no means of identifying fonts with names longer than two +characters, like ‘TBI’ or ‘ZCMI’, in a font selection escape +sequence. See Compatibility Mode. You can also alias fonts on +mounting for convenience or abstraction. (See below regarding the +.fp register.) +

    +
    +
    .fp \n[.fp] SC ZCMI
    +Send a \f(SChand-written\fP thank-you note.
    +.fp \n[.fp] Emph TI
    +.fp \n[.fp] Strong TB
    +Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
    +
    + +

    DESC’, ‘P’, and non-negative integers are not usable as font +identifiers. +

    + +

    The position of the currently selected font (or abstract style) is +available in the read-only register ‘.f’. It is associated with +the environment (see Environments). +

    +

    You can copy the value of .f to another register to save it for +later use. +

    +
    +
    .nr saved-font \n[.f]
    +text involving many font changes
    +.ft \n[saved-font]
    +
    + + +

    The index of the next (non-zero) free font position is available in the +read-only register ‘.fp’. + +Fonts not listed in the DESC file are automatically mounted at +position ‘\n[.fp]’ when selected with the ft request or +\f escape sequence. When mounting a font at a position +explicitly with the fp request, this same practice should be +followed, although GNU troff does not enforce this strictly. +

    + + +
    +
    +
    + +

    5.19.4 Using Symbols

    + + + + + + + + +

    A glyph is a graphical representation of a character. While +a character is an abstraction of semantic information, a glyph is +something that can be seen on screen or paper. A character has many +possible representation forms (for example, the character ‘A’ can be +written in an upright or slanted typeface, producing distinct +glyphs). Sometimes, a sequence of characters map to a single glyph: +this is a ligature—the most common is ‘fi’. +

    +

    Space characters never become glyphs in GNU troff. If not +discarded (as when trailing on text lines), they are represented by +horizontal motions in the output. +

    + + + + + + +

    A symbol is simply a named glyph. Within gtroff, all glyph +names of a particular font are defined in its font file. If the user +requests a glyph not available in this font, gtroff looks up an +ordered list of special fonts. By default, the PostScript output +device supports the two special fonts ‘SS’ (slanted symbols) and +‘S’ (symbols) (the former is looked up before the latter). Other +output devices use different names for special fonts. Fonts mounted +with the fonts keyword in the DESC file are globally +available. To install additional special fonts locally (i.e., for a +particular font), use the fspecial request. +

    +

    Here are the exact rules how gtroff searches a given symbol: +

    +
      +
    • If the symbol has been defined with the char request, use it. +This hides a symbol with the same name in the current font. + +
    • Check the current font. + +
    • If the symbol has been defined with the fchar request, use it. + +
    • Check whether the current font has a font-specific list of special +fonts; test all fonts in the order of appearance in the last +fspecial call if appropriate. + +
    • If the symbol has been defined with the fschar request for the +current font, use it. + +
    • Check all fonts in the order of appearance in the last special +call. + +
    • If the symbol has been defined with the schar request, use it. + +
    • As a last resort, consult all fonts loaded up to now for special fonts +and check them, starting with the lowest font number. This can +sometimes lead to surprising results since the fonts line in +the DESC file often contains empty positions, which are filled +later on. For example, consider the following: + +
      +
      fonts 3 0 0 FOO
      +
      + +

      This mounts font foo at font position 3. We assume that +FOO is a special font, containing glyph foo, and that no +font has been loaded yet. The line +

      +
      +
      .fspecial BAR BAZ
      +
      + +

      makes font BAZ special only if font BAR is active. We +further assume that BAZ is really a special font, i.e., the font +description file contains the special keyword, and that it also +contains glyph foo with a special shape fitting to font +BAR. After executing fspecial, font BAR is loaded +at font position 1, and BAZ at position 2. +

      +

      We now switch to a new font XXX, trying to access glyph +foo that is assumed to be missing. There are neither +font-specific special fonts for XXX nor any other fonts made +special with the special request, so gtroff starts the +search for special fonts in the list of already mounted fonts, with +increasing font positions. Consequently, it finds BAZ before +FOO even for XXX, which is not the intended behaviour. +

    + +

    See Device and Font Description Files, and Special Fonts, for +more details. +

    + + + + + +

    The groff_char(7) man page houses a complete list of +predefined special character names, but the availability of any as a +glyph is device- and font-dependent. For example, say +

    +
    +
    man -Tdvi groff_char > groff_char.dvi
    +
    + +

    to obtain those available with the DVI device and default font +configuration.77 If you want to use an additional macro package to change +the fonts used, groff (or gtroff) must be run directly. +

    +
    +
    groff -Tdvi -mec -man groff_char.7 > groff_char.dvi
    +
    + + + + + + +

    Special character names not listed in groff_char(7) are +derived algorithmically, using a simplified version of the Adobe Glyph +List (AGL) algorithm, which is described in +https://github.com/adobe-type-tools/agl-aglfn. The (frozen) +set of names that can’t be derived algorithmically is called the +groff glyph list (GGL). +

    +
      +
    • A glyph for Unicode character U+XXXX[X[X]], which is +not a composite character is named +uXXXX[X[X]]. X must be an +uppercase hexadecimal digit. Examples: u1234, u008E, +u12DB8. The largest Unicode value is 0x10FFFF. There must be at +least four X digits; if necessary, add leading zeroes (after the +‘u’). No zero padding is allowed for character codes greater than +0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF +represented with character codes from the surrogate area U+D800-U+DFFF) +are not allowed either. + +
    • A glyph representing more than a single input character is named + +
      +
      ucomponent1_component2_component3 …
      +
      + +

      Example: u0045_0302_0301. +

      +

      For simplicity, all Unicode characters that are composites must be +maximally decomposed to NFD;78 for example, +u00CA_0301 is not a valid glyph name since U+00CA (LATIN +CAPITAL LETTER E WITH CIRCUMFLEX) can be further decomposed into U+0045 +(LATIN CAPITAL LETTER E) and U+0302 (COMBINING CIRCUMFLEX +ACCENT). u0045_0302_0301 is thus the glyph name for U+1EBE, +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE. +

      +
    • groff maintains a table to decompose all algorithmically derived glyph +names that are composites itself. For example, u0100 (LATIN +LETTER A WITH MACRON) is automatically decomposed into +u0041_0304. Additionally, a glyph name of the GGL is preferred +to an algorithmically derived glyph name; groff also +automatically does the mapping. Example: The glyph u0045_0302 is +mapped to ^E. + +
    • glyph names of the GGL can’t be used in composite glyph names; for +example, ^E_u0301 is invalid. +
    + +
    +
    Escape sequence: \(nm
    +
    +
    Escape sequence: \[name]
    +
    Escape sequence: \[base-glyph combining-component …]
    +
    + +

    Typeset a special character name (two-character name nm) or +a composite glyph consisting of base-glyph overlaid with one or +more combining-components. For example, ‘\[A ho]’ is a +capital letter “A” with a “hook accent” (ogonek). +

    +

    There is no special syntax for one-character names—the analogous form +‘\n’ would collide with other escape sequences. However, the +four escape sequences \', \-, \_, and \`, +are translated on input to the special character escape sequences +\[aa], \[-], \[ul], and \[ga], respectively. +

    +

    A special character name of length one is not the same thing as an +ordinary character: that is, the character a is not the same as +\[a]. +

    +

    If name is undefined, a warning in category ‘char’ is +produced and the escape is ignored. See Warnings, for information +about the enablement and suppression of warnings. +

    +

    GNU troff resolves \[] with more than a single +component as follows: +

    +
      +
    • Any component that is found in the GGL is converted to the +uXXXX form. + +
    • Any component uXXXX that is found in the list of +decomposable glyphs is decomposed. + +
    • The resulting elements are then concatenated with ‘_’ in between, +dropping the leading ‘u’ in all elements but the first. +
    + +

    No check for the existence of any component (similar to tr +request) is done. +

    +

    Examples: +

    +
    +
    \[A ho]
    +

    A’ maps to u0041, ‘ho’ maps to u02DB, thus the +final glyph name would be u0041_02DB. This is not the expected +result: the ogonek glyph ‘ho’ is a spacing ogonek, but for a +proper composite a non-spacing ogonek (U+0328) is necessary. Looking +into the file composite.tmac, one can find ‘.composite ho u0328, which changes the mapping of ‘ho’ while a composite glyph +name is constructed, causing the final glyph name to be +u0041_0328. +

    +
    +
    \[^E u0301]
    +
    \[^E aa]
    +
    \[E a^ aa]
    +
    \[E ^ ']
    +

    ^E’ maps to u0045_0302, thus the final glyph name is +u0045_0302_0301 in all forms (assuming proper calls of the +composite request). +

    +
    + +

    It is not possible to define glyphs with names like ‘A ho +within a groff font file. This is not really a limitation; +instead, you have to define u0041_0328. +

    + +
    +
    Escape sequence: \C'xxx'
    +
    + + +

    Typeset the glyph of the special character xxx. Normally, it is +more convenient to use \[xxx], but \C has some +advantages: it is compatible with AT&T device-independent +troff (and therefore available in compatibility +mode79) and can interpolate special +characters with ‘]’ in their names. The delimiter need not be +a neutral apostrophe; see Delimiters. +

    + +
    +
    Request: .composite id1 id2
    +
    + +

    Map special character name id1 to id2 if id1 is used +in \[...] with more than one component. See above for examples. +This is a strict rewriting of the special character name; no check is +performed for the existence of a glyph for either. A set of default +mappings for many accents can be found in the file +composite.tmac, loaded by the default troffrc at startup. +

    + +
    +
    Escape sequence: \N'n'
    +
    + + + + +

    Typeset the glyph with code n in the current font +(n is not the input character code). The number +n can be any non-negative decimal integer. Most devices only +have glyphs with codes between 0 and 255; the Unicode output device +uses codes in the range 0–65535. If the current font does not contain +a glyph with that code, special fonts are not searched. The +\N escape sequence can be conveniently used in conjunction with +the char request: +

    +
    +
    .char \[phone] \f[ZD]\N'37'
    +
    + + + + +

    The code of each glyph is given in the fourth column in the font +description file after the charset command. It is possible to +include unnamed glyphs in the font description file by using a name of +‘---’; the \N escape sequence is the only way to use these. +

    +

    No kerning is applied to glyphs accessed with \N. The delimiter +need not be a neutral apostrophe; see Delimiters. +

    + +

    A few escape sequences are also special characters. +

    +
    +
    Escape sequence: \'
    +
    +

    An escaped neutral apostrophe is a synonym for \[aa] (acute +accent). +

    + +
    +
    Escape sequence: \`
    +
    +

    An escaped grave accent is a synonym for \[ga] (grave accent). +

    + +
    +
    Escape sequence: \-
    +
    +

    An escaped hyphen-minus is a synonym for \[-] (minus sign). +

    + +
    +
    Escape sequence: \_
    +
    +

    An escaped underscore (“low line”) is a synonym for \[ul] +(underrule). On typesetting devices, the underrule is font-invariant +and drawn lower than the underscore ‘_’. +

    + +
    +
    Request: .cflags n c1 c2 …
    +
    + + + + +

    Assign properties encoded by the number n to characters c1, +c2, and so on. +

    +

    Input characters, including special characters introduced by an escape, +have certain properties associated with them.80 +These properties can be modified with this request. The first argument +is the sum of the desired flags and the remaining arguments are the +characters to be assigned those properties. Spaces between the cn +arguments are optional. Any argument cn can be a character class +defined with the class request rather than an individual +character. See Character Classes. +

    +

    The non-negative integer n is the sum of any of the following. +Some combinations are nonsensical, such as ‘33’ (1 + 32). +

    +
    +
    1
    +
    +

    Recognize the character as ending a sentence if followed by a newline +or two spaces. Initially, characters ‘.?!’ have this property. +

    +
    +
    2
    +
    +

    Enable breaks before the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, no characters have this property. +

    +
    +
    4
    +
    + +

    Enable breaks after the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, characters ‘\-\[hy]\[em]’ have this property. +

    +
    +
    8
    +
    + + + + + +

    Mark the glyph associated with this character as overlapping other +instances of itself horizontally. Initially, characters +‘\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]’ have this property. +

    +
    +
    16
    +

    Mark the glyph associated with this character as overlapping other +instances of itself vertically. Initially, the character ‘\[br]’ +has this property. +

    +
    +
    32
    +
    + + + + + + + + + +

    Mark the character as transparent for the purpose of end-of-sentence +recognition. In other words, an end-of-sentence character followed by +any number of characters with this property is treated as the end of a +sentence if followed by a newline or two spaces. This is the same as +having a zero space factor in TeX. Initially, characters +‘"')]*\[dg]\[dd]\[rq]\[cq]’ have this property. +

    +
    +
    64
    +

    Ignore hyphenation codes of the surrounding characters. Use this in +combination with values 2 and 4 (initially, no characters have this +property). +

    +

    For example, if you need an automatic break point after the en-dash in +numeric ranges like “3000–5000”, insert +

    +
    +
    .cflags 68 \[en]
    +
    + +

    into your document. However, this practice can lead to bad layout if +done thoughtlessly; in most situations, a better solution instead of +changing the cflags value is to insert \: right after the +hyphen at the places that really need a break point. +

    +
    + +

    The remaining values were implemented for East Asian language support; +those who use alphabetic scripts exclusively can disregard them. +

    +
    +
    128
    +

    Prohibit a line break before the character, but allow a line break after +the character. This works only in combination with flags 256 and 512 +and has no effect otherwise. Initially, no characters have this +property. +

    +
    +
    256
    +

    Prohibit a line break after the character, but allow a line break before +the character. This works only in combination with flags 128 and 512 +and has no effect otherwise. Initially, no characters have this +property. +

    +
    +
    512
    +

    Allow line break before or after the character. This works only in +combination with flags 128 and 256 and has no effect otherwise. +Initially, no characters have this property. +

    +
    + +

    In contrast to values 2 and 4, the values 128, 256, and 512 work +pairwise. If, for example, the left character has value 512, and the +right character 128, no break will be automatically inserted between +them. If we use value 6 instead for the left character, a break +after the character can’t be suppressed since the neighboring character +on the right doesn’t get examined. +

    + +
    +
    Request: .char c [contents]
    +
    +
    Request: .fchar c [contents]
    +
    +
    Request: .fschar f c [contents]
    +
    +
    Request: .schar c [contents]
    +
    + + + + + + + + + + + + + + + + + + + + + +

    Define a new character or glyph c to be contents, which +can be empty. More precisely, char defines a groff object +(or redefines an existing one) that is accessed with the +name c on input, and produces contents on output. +Every time glyph c needs to be printed, contents is +processed in a temporary environment and the result is wrapped up into a +single object. Compatibility mode is turned off and the escape +character is set to \ while contents is processed. +Any emboldening, constant spacing, or track kerning is applied to this +object rather than to individual glyphs in contents. +

    +

    An object defined by these requests can be used just like a normal glyph +provided by the output device. In particular, other characters can be +translated to it with the tr or trin requests; it can be +made the leader character with the lc request; repeated patterns +can be drawn with it using the \l and \L escape sequences; +and words containing c can be hyphenated correctly if the +hcode request is used to give the object a hyphenation code. +

    +

    There is a special anti-recursion feature: use of the object within its +own definition is handled like a normal character (not +defined with char). +

    +

    The tr and trin requests take precedence if char +accesses the same symbol. +

    +
    +
    .tr XY
    +X
    +    ⇒ Y
    +.char X Z
    +X
    +    ⇒ Y
    +.tr XX
    +X
    +    ⇒ Z
    +
    + +

    The fchar request defines a fallback glyph: gtroff only +checks for glyphs defined with fchar if it cannot find the glyph +in the current font. gtroff carries out this test before +checking special fonts. +

    +

    fschar defines a fallback glyph for font f: +gtroff checks for glyphs defined with fschar after the +list of fonts declared as font-specific special fonts with the +fspecial request, but before the list of fonts declared as global +special fonts with the special request. +

    +

    Finally, the schar request defines a global fallback glyph: +gtroff checks for glyphs defined with schar after the list +of fonts declared as global special fonts with the special +request, but before the already mounted special fonts. +

    +

    See Character Classes. +

    + +
    +
    Request: .rchar c …
    +
    +
    Request: .rfschar f c …
    +
    + + + +

    Remove definition of each ordinary or special character c, +undoing the effect of a char, fchar, or schar +request. Those supplied by font description files cannot be removed. +Spaces and tabs may separate c arguments. +

    +

    The request rfschar removes glyph definitions defined with +fschar for font f. +

    + + +
    +
    +
    + +

    5.19.5 Character Classes

    + + + +

    Classes are particularly useful for East Asian languages such as +Chinese, Japanese, and Korean, where the number of needed characters is +much larger than in European languages, and where large sets of +characters share the same properties. +

    +
    +
    Request: .class name c1 c2 …
    +
    + + + +

    Define a character class (or simply “class”) name comprising +the characters c1, c2, and so on. +

    +

    A class thus defined can then be referred to in lieu of listing all the +characters within it. Currently, only the cflags request can +handle references to character classes. +

    +

    In the request’s simplest form, each cn is a character (or special +character). +

    +
    +
    .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
    +
    + +

    Since class and glyph names share the same name space, it is recommended +to start and end the class name with [ and ], +respectively, to avoid collisions with existing character names defined +by GNU troff or the user (with char and related requests). +This practice applies the presence of ] in the class name to +prevent the use of the special character escape form +\[], thus you must use the \C escape to access +a class with such a name. +

    + + +

    You can also use a character range notation consisting of a +start character followed by ‘-’ and then an end character. +Internally, GNU troff converts these two symbol names to +Unicode code points (according to the groff glyph list [GGL]), +which then give the start and end value of the range. If that fails, +the class definition is skipped. +

    +

    Furthermore, classes can be nested. +

    +
    +
    .class [prepunct] , : ; > }
    +.class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
    +
    + +

    The class ‘[prepunctx]’ thus contains the contents of the class +[prepunct] as defined above (the set ‘, : ; > }’), and +characters in the range between U+2013 and U+2016. +

    +

    If you want to include ‘-’ in a class, it must be the first +character value in the argument list, otherwise it gets misinterpreted +as part of the range syntax. +

    +

    It is not possible to use class names as end points of range +definitions. +

    +

    A typical use of the class request is to control line-breaking +and hyphenation rules as defined by the cflags request. For +example, to inhibit line breaks before the characters belonging to the +prepunctx class defined in the previous example, you can write +the following. +

    +
    +
    .cflags 2 \C'[prepunctx]'
    +
    + +

    See the cflags request in Using Symbols, for more details. +

    + + +
    +
    +
    + +

    5.19.6 Special Fonts

    + + + +

    Special fonts are those that gtroff searches when it cannot find +the requested glyph in the current font. The Symbol font is usually a +special font. +

    +

    gtroff provides the following two requests to add more special +fonts. See Using Symbols, for a detailed description of the glyph +searching mechanism in gtroff. +

    +

    Usually, only non-TTY devices have special fonts. +

    +
    +
    Request: .special [s1 s2 …]
    +
    +
    Request: .fspecial f [s1 s2 …]
    +
    + + +

    Use the special request to define special fonts. Initially, this +list is empty. +

    +

    Use the fspecial request to designate special fonts only when +font f is active. Initially, this list is empty. +

    +

    Previous calls to special or fspecial are overwritten; +without arguments, the particular list of special fonts is set to empty. +Special fonts are searched in the order they appear as arguments. +

    +

    All fonts that appear in a call to special or fspecial +are loaded. +

    +

    See Using Symbols, for the exact search order of glyphs. +

    + + +
    +
    +
    + +

    5.19.7 Artificial Fonts

    + + + +

    There are a number of requests and escape sequences for artificially +creating fonts. These are largely vestiges of the days when output +devices did not have a wide variety of fonts, and when nroff and +troff were separate programs. Most of them are no longer +necessary in GNU troff. Nevertheless, they are supported. +

    +
    +
    Escape sequence: \H'height'
    +
    +
    Escape sequence: \H'+height'
    +
    Escape sequence: \H'-height'
    +
    Register: \n[.height]
    +
    + + + +

    Change (increment, decrement) the height of the current font, but not +the width. If height is zero, restore the original height. +Default scaling unit is ‘z’. +

    +

    The read-only register .height contains the font height as set by +\H. +

    +

    Currently, only the -Tps and -Tpdf devices support +this feature. +

    +

    \H doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font on the fly: +

    +
    +
    .mc \H'+5z'x\H'0'
    +
    + +

    In compatibility mode, gtroff behaves differently: If an +increment or decrement is used, it is always taken relative to the +current type size and not relative to the previously selected font +height. Thus, +

    +
    +
    .cp 1
    +\H'+5'test \H'+5'test
    +
    + +

    prints the word ‘test’ twice with the same font height (five points +larger than the current font size). +

    + +
    +
    Escape sequence: \S'slant'
    +
    +
    Register: \n[.slant]
    +
    + + + +

    Slant the current font by slant degrees. Positive values slant to +the right. Only integer values are possible. +

    +

    The read-only register .slant contains the font slant as set by +\S. +

    +

    Currently, only the -Tps and -Tpdf devices support +this feature. +

    +

    \S doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font on the fly: +

    +
    +
    .mc \S'20'x\S'0'
    +
    + + + +

    This escape is incorrectly documented in the AT&T +troff manual; the slant is always set to an absolute value. +

    + +
    +
    Request: .ul [lines]
    +
    + +

    The ul request normally underlines subsequent lines if a TTY +output device is used. Otherwise, the lines are printed in italics +(only the term ‘underlined’ is used in the following). The single +argument is the quantity of input lines to be underlined; with no +argument, the next line is underlined. If lines is zero or +negative, stop the effects of ul (if it was active). Requests +and empty lines do not count for computing the number of underlined +input lines, even if they produce some output like tl. Lines +inserted by macros (e.g., invoked by a trap) do count. +

    +

    At the beginning of ul, the current font is stored and the +underline font is activated. Within the span of a ul request, it +is possible to change fonts, but after the last line affected by +ul the saved font is restored. +

    +

    This number of lines still to be underlined is associated with the +environment (see Environments). The underline font can be changed +with the uf request. +

    + + +

    The ul request does not underline spaces. +

    + +
    +
    Request: .cu [lines]
    +
    + + +

    The cu request is similar to ul but underlines spaces as +well (if a TTY output device is used). +

    + +
    +
    Request: .uf font
    +
    + + +

    Set the underline font (globally) used by ul and cu. By +default, this is the font at position 2. font can be either +a non-negative font position or the name of a font. +

    + +
    +
    Request: .bd font [offset]
    +
    +
    Request: .bd font1 font2 [offset]
    +
    Register: \n[.b]
    +
    + + +

    Embolden font by overstriking its glyphs offset by offset +units minus one. +

    +

    Two syntax forms are available. +

    +
      +
    • Imitate a bold font unconditionally. The first argument specifies the +font to embolden, and the second is the number of basic units, minus +one, by which the two glyphs are offset. If the second argument is +missing, emboldening is turned off. + +

      font can be either a non-negative font position or the name of a +font. +

      +

      offset is available in the .b read-only register if a +special font is active; in the bd request, its default unit is +‘u’. +

      +
    • + + + +Imitate a bold form conditionally. Embolden font1 by offset +only if font font2 is the current font. This request can be +issued repeatedly to set up different emboldening values for different +current fonts. If the second argument is missing, emboldening is turned +off for this particular current font. + +

      This affects special fonts only (either set up with the special +command in font files or with the fspecial request). +

    +
    + +
    +
    Request: .cs font [width [em-size]]
    +
    + + + + +

    Switch to and from constant glyph space mode. If activated, the +width of every glyph is width/36 ems. The em size is given +absolutely by em-size; if this argument is missing, the em value +is taken from the current font size (as set with the ps request) +when the font is effectively in use. Without second and third argument, +constant glyph space mode is deactivated. +

    +

    Default scaling unit for em-size is ‘z’; width is an +integer. +

    + + +
    +
    +
    + +

    5.19.8 Ligatures and Kerning

    + + + +

    Ligatures are groups of characters that are run together, i.e, producing +a single glyph. For example, the letters ‘f’ and ‘i’ can form a +ligature ‘fi’ as in the word ‘file’. This produces a cleaner look +(albeit subtle) to the printed output. Usually, ligatures are not +available in fonts for TTY output devices. +

    +

    Most PostScript fonts support the fi and fl ligatures. The C/A/T +typesetter that was the target of AT&T troff also +supported ‘ff’, ‘ffi’, and ‘ffl’ ligatures. Advanced typesetters or +‘expert’ fonts may include ligatures for ‘ft’ and ‘ct’, although GNU +troff does not support these (yet). +

    +

    Only the current font is checked for ligatures and kerns; neither +special fonts nor special charcters defined with the char request +(and its siblings) are taken into account. +

    +
    +
    Request: .lg [flag]
    +
    +
    Register: \n[.lg]
    +
    + + + +

    Switch the ligature mechanism on or off; if the parameter is non-zero or +missing, ligatures are enabled, otherwise disabled. Default is on. The +current ligature mode can be found in the read-only register .lg +(set to 1 or 2 if ligatures are enabled, 0 otherwise). +

    +

    Setting the ligature mode to 2 enables the two-character ligatures +(fi, fl, and ff) and disables the three-character ligatures (ffi and +ffl). +

    + +

    Pairwise kerning is another subtle typesetting mechanism that +modifies the distance between a glyph pair to improve readability. In +most cases (but not always) the distance is decreased. +Typewriter-like fonts and fonts for terminals where all glyphs have the +same width don’t use kerning. +

    +
    +
    Request: .kern [flag]
    +
    +
    Register: \n[.kern]
    +
    + + + +

    Switch kerning on or off. If the parameter is non-zero or missing, +enable pairwise kerning, otherwise disable it. The read-only register +.kern is set to 1 if pairwise kerning is enabled, +0 otherwise. +

    + + +

    If the font description file contains pairwise kerning information, +glyphs from that font are kerned. Kerning between two glyphs can be +inhibited by placing \& between them: ‘V\&A’. +

    +

    See Font Description File Format. +

    + + + +

    Track kerning expands or reduces the space between glyphs. This +can be handy, for example, if you need to squeeze a long word onto a +single line or spread some text to fill a narrow column. It must be +used with great care since it is usually considered bad typography if +the reader notices the effect. +

    +
    +
    Request: .tkf f s1 n1 s2 n2
    +
    + + +

    Enable track kerning for font f. If the current font +is f the width of every glyph is increased by an amount +between n1 and n2 (n1, n2 can be negative); if +the current type size is less than or equal to s1 the width is +increased by n1; if it is greater than or equal to s2 the +width is increased by n2; if the type size is greater than or +equal to s1 and less than or equal to s2 the increase in +width is a linear function of the type size. +

    +

    The default scaling unit is ‘z’ for s1 and s2, ‘p’ +for n1 and n2. +

    +

    The track kerning amount is added even to the rightmost glyph in a line; +for large values it is thus recommended to increase the line length by +the same amount to compensate. +

    + + +
    +
    +
    + +

    5.19.9 Italic Corrections

    + +

    When typesetting adjacent glyphs from typefaces of different slants, the +space between them may require adjustment. +

    +
    +
    Escape sequence: \/
    +
    + + + + + +

    Apply an italic correction: modify the spacing of the preceding +glyph so that the distance between it and the following glyph is correct +if the latter is of upright shape. For example, if an +italic ‘f’ is followed immediately by a roman right +parenthesis, then in many fonts the top right portion of +the ‘f’ overlaps the top left of the right parenthesis, which +is ugly. Use this escape sequence whenever an oblique glyph is +immediately followed by an upright glyph without any intervening space. +

    + +
    +
    Escape sequence: \,
    +
    + + + + + +

    Apply a left italic correction: modify the spacing of the +following glyph so that the distance between it and the preceding +glyph is correct if the latter is of upright shape. For example, +if a roman left parenthesis is immediately followed by an +italic ‘f’, then in many fonts the bottom left portion of +the ‘f’ overlaps the bottom of the left parenthesis, which is +ugly. Use this escape sequence whenever an upright glyph is followed +immediately by an oblique glyph without any intervening space. +

    + +
    +
    +
    + +

    5.19.10 Dummy Characters

    + +

    As discussed in Requests and Macros, the first character on an +input line is treated specially. Further, formatting a glyph has many +consequences on formatter state (see Environments). Occasionally, +we want to escape this context or embrace some of those consequences +without actually rendering a glyph to the output. +

    +
    +
    Escape sequence: \&
    +
    + + +

    Interpolate a dummy character, which is constitutive of output but +invisible.81 Its presence alters the interpretation context of a +subsequent input character, and enjoys several applications. +

    +
      +
    • Prevent insertion of extra space after an end-of-sentence character. + +
      +
      Test.
      +Test.
      +    ⇒ Test.  Test.
      +Test.\&
      +Test.
      +    ⇒ Test. Test.
      +
      + +
    • Prevent recognition of a control character. + +
      +
      .Test
      +    error→ warning: macro 'Test' not defined
      +\&.Test
      +    ⇒ .Test
      +
      + +
    • Prevent kerning between two glyphs. + + +
    • Translate a character to “nothing”. + +
      +
      .tr JIjiK\&k\&UVuv
      +Post universitum, alea jacta est, OK?
      +    ⇒ Post vniversitvm, alea iacta est, O?
      +
      +
    + +

    The dummy character escape sequence sees use in macro definitions as a +means of ensuring that arguments are treated as text even if they begin +with spaces or control characters. +

    +
    +
    .de HD \" typeset a simple bold heading
    +.  sp
    +.  ft B
    +\&\\$1 \" exercise: remove the \&
    +.  ft
    +.  sp
    +..
    +.HD .\|.\|.\|surprised?
    +
    +
    + +

    One way to think about the dummy character is to imagine placing the +symbol ‘&’ in the input at a certain location; if doing so has all +the side effects on formatting that you desire except for sticking an +ugly ampersand in the midst of your text, the dummy character is what +you want in its place. +

    +
    +
    Escape sequence: \)
    +
    + + + +

    Interpolate a transparent dummy character—one that is +transparent to end-of-sentence detection. It behaves as \&, +except that \& is treated as letters and numerals normally are +after ‘.’, ‘?’ and ‘!’; \& cancels end-of-sentence +detection, and \) does not. +

    +
    +
    .de Suffix-&
    +.  nop \&\\$1
    +..
    +.
    +.de Suffix-)
    +.  nop \)\\$1
    +..
    +.
    +Here's a sentence.\c
    +.Suffix-& '
    +Another one.\c
    +.Suffix-) '
    +And a third.
    +    ⇒ Here's a sentence.' Another one.'  And a third.
    +
    +
    + + + + +
    +
    +
    +
    + +

    5.20 Manipulating Type Size and Vertical Spacing

    + + + + + + + + +

    These concepts were introduced in Page Geometry. The height of a +font’s tallest glyph is one em, which is equal to the type size in +points.82 A vertical spacing of less than 120% of +the type size can make a document hard to read. Larger proportions can +be useful to spread the text for annotations or proofreader’s marks. By +default, GNU troff uses 10 point type on 12 point +spacing. + +Typographers call the difference between type size and vertical spacing +leading.83 +

    + + + +
    +
    + +

    5.20.1 Changing the Type Size

    + +
    +
    Request: .ps [size]
    +
    +
    Request: .ps +size
    +
    Request: .ps -size
    +
    Escape sequence: \ssize
    +
    +
    Register: \n[.s]
    +
    + + + +

    Use the ps request or the \s escape sequence to change +(increase, decrease) the type size (in scaled points). Specify +size as either an absolute type size, or as a relative change from +the current size. ps with no argument restores the previous +size. The ps request’s default scaling unit is ‘z’. The +requested size is rounded to the nearest valid size (with ties rounding +down) within the limits supported by the device. If the requested size +is non-positive, it is treated as 1u. +

    + + + +

    Type size alteration is incorrectly documented in the AT&T +troff manual, which claims “if [the requested size] is invalid, +the next larger valid size will result, with a maximum of +36”.84 +

    + + +

    The read-only string-valued register .s interpolates the type +size in points as a decimal fraction; it is associated with the +environment (see Environments). To obtain the type size in scaled +points, interpolate the .ps register instead (see Using Fractional Type Sizes). +

    +

    The \s escape sequence supports a variety of syntax forms. +

    +
    +
    \sn
    +

    Set the type size to n points. n must be a single +digit. If n is 0, restore the previous size. +

    +
    +
    \s+n
    +
    \s-n
    +

    Increase or decrease the type size by n points. +n must be exactly one digit. +

    +
    +
    \s(nn
    +

    Set the type size to nn points. nn must be exactly two +digits. +

    +
    +
    \s+(nn
    +
    \s-(nn
    +
    \s(+nn
    +
    \s(-nn
    +

    Alter the type size in points by the two-digit value nn. +

    +
    + +

    See Using Fractional Type Sizes, for further syntactical forms of the +\s escape sequence that additionally accept decimal fractions. +

    +
    +
    snap, snap,
    +.ps +2
    +grin, grin,
    +.ps +2
    +wink, wink, \s+2nudge, nudge,\s+8 say no more!
    +.ps 10
    +
    +
    + +

    The \s escape sequence affects the environment immediately and +doesn’t produce an input token. Consequently, it can be used in +requests like mc, which expects a single character as an +argument, to change the type size on the fly. +

    +
    +
    .mc \s[20]x\s[0]
    +
    + +
    +
    Request: .sizes s1 s2 … sn [0]
    +
    +

    The DESC file specifies which type sizes are allowed by the +output device; see DESC File Format. Use the sizes request +to change this set of permissible sizes. Arguments are in scaled +points; see Using Fractional Type Sizes. Each can be a single +type size (such as ‘12000’), or a range of sizes (such as +‘4000-72000’). You can optionally end the list with a ‘0’. +

    + +
    +
    +
    + +

    5.20.2 Changing the Vertical Spacing

    + +
    +
    Request: .vs [space]
    +
    +
    Request: .vs +space
    +
    Request: .vs -space
    +
    Register: \n[.v]
    +
    + + + +

    Set the vertical spacing to, or alter it by, space. The default +scaling unit is ‘p’. If vs is called without an argument, +the vertical spacing is reset to the previous value before the last call +to vs. + +GNU troff emits a warning in category ‘range’ if space +is negative; the vertical spacing is then set to the smallest possible +positive value, the vertical motion quantum (as found in the .V +register). +

    +

    .vs 0 isn’t saved in a diversion since it doesn’t result in +a vertical motion. You must explicitly issue this request before +interpolating the diversion. +

    +

    The read-only register .v contains the vertical spacing; it is +associated with the environment (see Environments). +

    + + +

    When a break occurs, GNU troff performs the following procedure. +

    +
      +
    • + +Move the drawing position vertically by the extra pre-vertical line +space, the minimum of all negative \x escape sequence arguments +in the pending output line. + +
    • Move the drawing position vertically by the vertical line spacing. + +
    • Write out the pending output line. + +
    • + +Move the drawing position vertically by the extra post-vertical line +space, the maximum of all positive \x escape sequence arguments +in the line that has just been output. + +
    • + +Move the drawing position vertically by the post-vertical line +spacing (see below). +
    + + +

    Prefer vs or pvs over ls to produce double-spaced +documents. vs and pvs have finer granularity than +ls; moreover, some preprocessors assume single spacing. +See Manipulating Spacing, regarding the \x escape sequence and +the ls request. +

    +
    +
    Request: .pvs [space]
    +
    +
    Request: .pvs +space
    +
    Request: .pvs -space
    +
    Register: \n[.pvs]
    +
    + + + +

    Set the post-vertical spacing to, or alter it by, space. The +default scaling unit is ‘p’. If pvs is called without an +argument, the post-vertical spacing is reset to the previous value +before the last call to pvs. GNU troff emits a warning in +category ‘range’ if space is negative; the post-vertical +spacing is then set to zero. +

    +

    The read-only register .pvs contains the post-vertical spacing; +it is associated with the environment (see Environments). +

    + + +
    +
    +
    + +

    5.20.3 Using Fractional Type Sizes

    + + + + + + +

    AT&T troff interpreted all type size measurements in points. +Combined with integer arithmetic, this design choice made it impossible +to support, for instance, ten and a half-point type. In GNU +troff, an output device can select a scaling factor that +subdivides a point into “scaled points”. A type size expressed in +scaled points can thus represent a non-integral type size. +

    + + + + + + + + + + + +

    A scaled point is equal to 1/sizescale points, where +sizescale is specified in the device description file DESC, +and defaults to 1.85 Requests and escape sequences in GNU troff interpret +arguments that represent a type size in scaled points, which the +formatter multiplies by sizescale and converts to an integer. +Arguments treated in this way comprise those to the escape sequences +\H and \s, to the request ps, the third argument to +the cs request, and the second and fourth arguments to the +tkf request. Scaled points may be specified explicitly with the +z scaling unit. +

    +

    For example, if sizescale is 1000, then a scaled point is one +thousandth of a point. The request ‘.ps 10.5’ is synonymous with +‘.ps 10.5z’ and sets the type size to 10,500 scaled points, or +10.5 points. Consequently, in GNU troff, the register +.s can interpolate a non-integral type size. +

    +
    +
    Register: \n[.ps]
    +
    +

    This read-only register interpolates the type size in scaled points; it +is associated with the environment (see Environments). +

    + +

    It makes no sense to use the ‘z’ scaling unit in a numeric +expression whose default scaling unit is neither ‘u’ nor ‘z’, +so GNU troff disallows this. Similarly, it is nonsensical to use +a scaling unit other than ‘z’ or ‘u’ in a numeric expression +whose default scaling unit is ‘z’, and so GNU troff +disallows this as well. +

    +

    Another GNU troff scaling unit, ‘s’, multiplies by the +number of basic units in a scaled point. Thus, ‘\n[.ps]s’ is equal +to ‘1m’ by definition. Do not confuse the ‘s’ and ‘z’ +scaling units. +

    +
    +
    Register: \n[.psr]
    +
    +
    Register: \n[.sr]
    +
    + + + + + + +

    Output devices may be limited in the type sizes they can employ. The +.s and .ps registers represent the type size selected by +the output driver as it understands a device’s capability. The last +requested type size is interpolated in scaled points by the +read-only register .psr and in points as a decimal fraction by +the read-only string-valued register .sr. Both are associated +with the environment (see Environments). +

    +

    For example, if a type size of 10.95 points is requested, and the +nearest size permitted by a sizes request (or by the sizes +or sizescale directives in the device’s DESC file) is 11 +points, the output driver uses the latter value. +

    + +

    The \s escape sequence offers the following syntax forms that +work with fractional type sizes and accept scaling units. You may of +course give them integral arguments. The delimited forms need not use +the neutral apostrophe; see Delimiters. +

    +
    +
    \s[n]
    +
    \s'n'
    +

    Set the type size to n scaled points; n is a +numeric expression with a default scaling unit of ‘z’. +

    +
    +
    \s[+n]
    +
    \s[-n]
    +
    \s+[n]
    +
    \s-[n]
    +
    \s'+n'
    +
    \s'-n'
    +
    \s+'n'
    +
    \s-'n'
    +

    Increase or decrease the type size by n scaled points; +n is a numeric expression (which may start with a minus sign) +with a default scaling unit of ‘z’. +

    +
    + + + +
    +
    +
    +
    + +

    5.21 Colors

    + + + + + + +

    GNU troff supports color output with a variety of color spaces +and up to 16 bits per channel. Some devices, particularly terminals, +may be more limited. When color support is enabled, two colors are +current at any given time: the stroke color, with which glyphs, +rules (lines), and geometric objects like circles and polygons are +drawn, and the fill color, which can be used to paint the interior +of a closed geometric figure. +

    +
    +
    Request: .color [n]
    +
    +
    Register: \n[.color]
    +
    +

    If n is missing or non-zero, enable the output of color-related +device-independent output commands (this is the default); otherwise, +disable them. This request sets a global flag; it does not produce an +input token (see gtroff Internals). +

    +

    The read-only register .color is 1 if colors are enabled, +0 otherwise. +

    +

    Color can also be disabled with the -c command-line option. +

    + +
    +
    Request: .defcolor ident scheme color-component …
    +
    +

    Define a color named ident. scheme selects a color space +and determines the quantity of required color-components; it must +be one of ‘rgb’ (three components), ‘cmy’ (three), ‘cmyk’ +(four), or ‘gray’ (one). ‘grey’ is accepted as a synonym of +‘gray’. The color components can be encoded as a single +hexadecimal value starting with ‘#’ or ‘##’. The former +indicates that each component is in the range 0–255 (0–FF), the latter +the range 0–65,535 (0–FFFF). +

    +
    +
    .defcolor half gray #7f
    +.defcolor pink rgb #FFC0CB
    +.defcolor magenta rgb  ##ffff0000ffff
    +
    + + + + +

    Alternatively, each color component can be specified as a decimal +fraction in the range 0–1, interpreted using a default scaling +unit of f, which multiplies its value by 65,536 (but +clamps it at 65,535). +

    +
    +
    .defcolor gray50 rgb 0.5 0.5 0.5
    +.defcolor darkgreen rgb 0.1f 0.5f 0.2f
    +
    +
    + + + +

    Each output device has a color named ‘default’, which cannot be +redefined. A device’s default stroke and fill colors are not +necessarily the same. For the dvi, html, pdf, +ps, and xhtml output devices, GNU troff +automatically loads a macro file defining many color names at startup. +By the same mechanism, the devices supported by grotty recognize +the eight standard ISO 6429/EMCA-48 color names.86 +

    +
    +
    Request: .gcolor [color]
    +
    +
    Escape sequence: \mc
    +
    +
    Escape sequence: \m(co
    +
    Escape sequence: \m[color]
    +
    Register: \n[.m]
    +
    +

    Set the stroke color to color. +

    +
    +
    .gcolor red
    +The next words
    +.gcolor
    +\m[red]are in red\m[]
    +and these words are in the previous color.
    +
    + +

    The escape sequence \m[] restores the previous stroke color, as +does a gcolor request without an argument. +

    + + + +

    The name of the current stroke color is available in the read-only +string-valued register ‘.m’; it is associated with the environment +(see Environments). It interpolates nothing when the stroke color +is the default. +

    +

    \m doesn’t produce an input token in GNU troff +(see gtroff Internals). It therefore can be used in requests like +mc (which expects a single character as an argument) to change +the color on the fly: +

    +
    +
    .mc \m[red]x\m[]
    +
    +
    + +
    +
    Request: .fcolor [color]
    +
    +
    Escape sequence: \Mc
    +
    +
    Escape sequence: \M(co
    +
    Escape sequence: \M[color]
    +
    Register: \n[.M]
    +
    +

    Set the fill color for objects drawn with \D'…' escape +sequences. The escape sequence \M[] restores the previous fill +color, as does an fcolor request without an argument. +

    + + + + + + +

    The name of the current fill color is available in the read-only +string-valued register ‘.M’; it is associated with the environment +(see Environments). It interpolates nothing when the fill color +is the default. \M doesn’t produce an input token in GNU +troff. +

    +

    Create an ellipse with a red interior as follows. +

    +
    +
    \M[red]\h'0.5i'\D'E 2i 1i'\M[]
    +
    +
    + + + +
    +
    +
    + +

    5.22 Strings

    + + +

    GNU troff supports strings primarily for user convenience. +Conventionally, if one would define a macro only to interpolate a small +amount of text, without invoking requests or calling any other macros, +one defines a string instead. Only one string is predefined by the +language. +

    +
    +
    String: \*[.T]
    +
    + + +

    Contains the name of the output device (for example, ‘utf8’ or +‘pdf’). +

    + +

    The ds request creates a string with a specified name and +contents and the \* escape sequence dereferences its name, +interpolating its contents. If the string named by the \* escape +sequence does not exist, it is defined as empty, nothing is +interpolated, and a warning in category ‘mac’ is emitted. +See Warnings, for information about the enablement and suppression of +warnings. +

    +
    +
    Request: .ds name [contents]
    +
    +
    Request: .ds1 name [contents]
    +
    +
    Escape sequence: \*n
    +
    +
    Escape sequence: \*(nm
    +
    Escape sequence: \*[name [arg1 arg2 …]]
    +
    + + + + + +

    Define a string called name with contents contents. If +name already exists as an alias, the target of the alias is +redefined; see als and rm below. If ds is called +with only one argument, name is defined as an empty string. +Otherwise, GNU troff stores contents in copy +mode.87 +

    +

    The \* escape sequence interpolates a previously defined string +variable name (one-character name n, two-character name +nm). The bracketed interpolation form accepts arguments that are +handled as macro arguments are; recall Calling Macros. In +contrast to macro calls, however, if a closing bracket ‘]’ occurs +in a string argument, that argument must be enclosed in double quotes. +\* is interpreted even in copy mode. When defining strings, +argument interpolations must be escaped if they are to reference +parameters from the calling context; See Parameters. +

    +
    +
    .ds cite (\\$1, \\$2)
    +Gray codes are explored in \*[cite Morgan 1998].
    +    ⇒ Gray codes are explored in (Morgan, 1998).
    +
    + + + + + +

    Caution: Unlike other requests, the second argument to the +ds request consumes the remainder of the input line, including +trailing spaces. This means that comments on a line with such a request +can introduce unwanted space into a string when they are set off from +the material they annotate, as is conventional. +

    +
    +
    .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water
    +
    + +

    Instead, place the comment on another line or put the comment escape +sequence immediately adjacent to the last character of the string. +

    +
    +
    .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water
    +
    + +

    Ending string definitions (and appendments) with a comment, even an +empty one, prevents unwanted space from creeping into them during source +document maintenance. +

    +
    +
    .ds author Alice Pleasance Liddell\"
    +.ds empty \" might be appended to later with .as
    +
    + + + + + + + +

    An initial neutral double quote " in contents is stripped +to allow embedding of leading spaces. Any other " is interpreted +literally, but it is wise to use the special character escape sequence +\[dq] instead if the string might be interpolated as part of a +macro argument; see Calling Macros. +

    +
    +
    .ds salutation "         Yours in a white wine sauce,\"
    +.ds c-var-defn "  char mydate[]=\[dq]2020-07-29\[dq];\"
    +
    + + + + + +

    Strings are not limited to a single input line of text. +\RET works just as it does elsewhere. The resulting string +is stored without the newlines. Care is therefore required when +interpolating strings while filling is disabled. +

    +
    +
    .ds foo This string contains \
    +text on multiple lines \
    +of input.
    +
    + +

    It is not possible to embed a newline in a string that will be +interpreted as such when the string is interpolated. To achieve that +effect, use \* to interpolate a macro instead; see Punning Names. +

    +

    Because strings are similar to macros, they too can be defined so as to +suppress AT&T troff compatibility mode when used; see +Writing Macros and Compatibility Mode. The ds1 +request defines a string such that compatibility mode is off when the +string is later interpolated. To be more precise, a compatibility +save input token is inserted at the beginning of the string, and a +compatibility restore input token at the end. +

    +
    +
    .nr xxx 12345
    +.ds aa The value of xxx is \\n[xxx].
    +.ds1 bb The value of xxx is \\n[xxx].
    +.
    +.cp 1
    +.
    +\*(aa
    +    error→ warning: register '[' not defined
    +    ⇒ The value of xxx is 0xxx].
    +\*(bb
    +    ⇒ The value of xxx is 12345.
    +
    +
    + +
    +
    Request: .as name [contents]
    +
    +
    Request: .as1 name [contents]
    +
    + + +

    The as request is similar to ds but appends contents +to the string stored as name instead of redefining it. If +name doesn’t exist yet, it is created. If as is called +with only one argument, no operation is performed (beyond dereferencing +the string). +

    +
    +
    .as salutation " with shallots, onions and garlic,\"
    +
    + +

    The as1 request is similar to as, but compatibility mode +is switched off when the appended portion of the string is later +interpolated. To be more precise, a compatibility save input +token is inserted at the beginning of the appended string, and a +compatibility restore input token at the end. +

    + +

    Several requests exist to perform rudimentary string operations. +Strings can be queried (length) and modified (chop, +substring, stringup, stringdown), and their names +can be manipulated through renaming, removal, and aliasing (rn, +rm, als). +

    +
    +
    Request: .length reg anything
    +
    + + + + + +

    Compute the number of characters of anything and store the count +in the register reg. If reg doesn’t exist, it is created. +anything is read in copy mode. +

    +
    +
    .ds xxx abcd\h'3i'efgh
    +.length yyy \*[xxx]
    +\n[yyy]
    +    ⇒ 14
    +
    +
    + +
    +
    Request: .chop object
    +
    +

    Remove the last character from the macro, string, or diversion named +object. This is useful for removing the newline from the end of a +diversion that is to be interpolated as a string. This request can be +used repeatedly on the same object; see gtroff Internals, +for details on nodes inserted additionally by GNU troff. +

    + +
    +
    Request: .substring str start [end]
    +
    + +

    Replace the string named str with its substring bounded by the +indices start and end, inclusively. The first character in +the string has index 0. If end is omitted, it is implicitly +set to the largest valid value (the string length minus one). Negative +indices count backward from the end of the string: the last character +has index −1, the character before the last has +index −2, and so on. +

    +
    +
    .ds xxx abcdefgh
    +.substring xxx 1 -4
    +\*[xxx]
    +    ⇒ bcde
    +.substring xxx 2
    +\*[xxx]
    +    ⇒ de
    +
    +
    + +
    +
    Request: .stringdown str
    +
    +
    Request: .stringup str
    +
    + + + + + +

    Alter the string named str by replacing each of its bytes with its +lowercase (stringdown) or uppercase (stringup) version (if +one exists). Special characters in the string will often transform in +the expected way due to the regular naming convention for accented +characters. When they do not, use substrings and/or catenation. +

    +
    +
    .ds resume R\['e]sum\['e]
    +\*[resume]
    +.stringdown resume
    +\*[resume]
    +.stringup resume
    +\*[resume]
    +    ⇒ Résumé résumé RÉSUMÉ
    +
    +
    + +

    (In practice, we would end the ds request with a comment escape +\" to prevent space from creeping into the definition during +source document maintenance.) +

    +
    +
    Request: .rn old new
    +
    + + + + + + + + +

    Rename the request, macro, diversion, or string old to new. +

    + +
    +
    Request: .rm name
    +
    + + + + + + + + +

    Remove the request, macro, diversion, or string name. GNU +troff treats subsequent invocations as if the name had never +been defined. +

    + +
    +
    Request: .als new old
    +
    + + + + + + + + + +

    Create an alias new for the existing request, string, macro, or +diversion object named old, causing the names to refer to the same +stored object. If old is undefined, a warning in category +‘mac’ is produced, and the request is ignored. See Warnings, +for information about the enablement and suppression of warnings. +

    +

    To understand how the als request works, consider two different +storage pools: one for objects (macros, strings, etc.), and another +for names. As soon as an object is defined, GNU troff adds it to +the object pool, adds its name to the name pool, and creates a link +between them. When als creates an alias, it adds a new name to +the name pool that gets linked to the same object as the old name. +

    +

    Now consider this example. +

    +
    +
    .de foo
    +..
    +.
    +.als bar foo
    +.
    +.de bar
    +.  foo
    +..
    +.
    +.bar
    +    error→ input stack limit exceeded (probable infinite
    +    error→ loop)
    +
    + +

    In the above, bar remains an alias—another name +for—the object referred to by foo, which the second de +request replaces. Alternatively, imagine that the de request +dereferences its argument before replacing it. Either way, the +result of calling bar is a recursive loop that finally leads to +an error. See Writing Macros. +

    + + + + + + + + + +

    To remove an alias, call rm on its name. The object itself is +not destroyed until it has no more names. +

    +

    When a request, macro, string, or diversion is aliased, redefinitions +and appendments “write through” alias names. To replace an alias with +a separately defined object, you must use the rm request on its +name first. +

    + + + +
    +
    +
    + +

    5.23 Conditionals and Loops

    + + + +

    groff has if and while control structures like +other languages. However, the syntax for grouping multiple input lines +in the branches or bodies of these structures is unusual. +

    + + + +
    +
    + +

    5.23.1 Operators in Conditionals

    + + + + + + +

    In if, ie, and while requests, in addition to the +numeric expressions described in Numeric Expressions, several +Boolean operators are available; the members of this expanded class are +termed conditional expressions. +

    +
    +
    c glyph
    +

    True if glyph is available, where glyph is an ordinary +character, a special character ‘\(xx’ or ‘\[xxx]’, +‘\N'xxx'’, or has been defined by any of the char, +fchar, fschar, or schar requests. +

    +
    +
    d name
    +

    True if a string, macro, diversion, or request called name exists. +

    +
    +
    e
    +

    True if the current page is even-numbered. +

    +
    +
    F font
    +

    True if font exists. font is handled as if it were opened +with the ft request (that is, font translation and styles are +applied), without actually mounting it. +

    +
    +
    m color
    +

    True if color is defined. +

    +
    +
    n
    +
    + +

    True if the document is being processed in nroff mode. +See troff and nroff Modes. +

    +
    +
    o
    +

    True if the current page is odd-numbered. +

    +
    +
    r register
    +

    True if register exists. +

    +
    +
    S style
    +

    True if style is available for the current font family. Font +translation is applied. +

    +
    +
    t
    +

    True if the document is being processed in troff mode. +See troff and nroff Modes. +

    + +
    +
    v
    +

    Always false. This condition is recognized only for compatibility with +certain other troff implementations.88 +

    +
    + +

    If the first argument to an if, ie, or while +request begins with a non-alphanumeric character apart from ! +(see below); it performs an output comparison test. +89 +

    + +
    +
    'xxx'yyy'
    +

    True if formatting the comparands xxx and yyy produces the +same output commands. The delimiter need not be a neutral apostrophe: +the output comparison operator accepts the same delimiters as most +escape sequences; see Delimiters. This output comparison +operator formats xxx and yyy in separate environments; +after the comparison, the resulting data are discarded. +

    +
    +
    .ie "|"\fR|\fP" true
    +.el false
    +    ⇒ true
    +
    + +

    The resulting glyph properties, including font family, style, size, and +slant, must match, but not necessarily the requests and/or escape +sequences used to obtain them. In the previous example, ‘|’ and +‘\fR|\fP’ result in ‘|’ glyphs in the same typefaces at the +same positions, so the comparands are equal. If ‘.ft I’ had +been added before the ‘.ie’, they would differ: the first ‘|’ +would produce an italic ‘|’, not a roman one. Motions must match +in orientation and magnitude to within the applicable horizontal and +vertical motion quanta of the device, after rounding. ‘.if +"\u\d"\v'0'"’ is false even though both comparands result in zero net +motion, because motions are not interpreted or optimized but sent as-is +to the output.90 On the other hand, ‘.if "\d"\v'0.5m'"’ is true, because +\d is defined as a downward motion of one-half em.91 +

    + + +

    Surround the comparands with \? to avoid formatting them; this +causes them to be compared character by character, as with string +comparisons in other programming languages. +

    +
    +
    .ie "\?|\?"\?\fR|\fP\?" true
    +.el false
    +    ⇒ false
    +
    + + + + +

    Since comparands protected with \? are read in copy mode +(see Copy Mode), they need not even be valid groff syntax. +The escape character is still lexically recognized, however, and +consumes the next character. +

    +
    +
    .ds a \[
    +.ds b \[
    +.if '\?\*a\?'\?\*b\?' a and b equivalent
    +.if '\?\\?'\?\\?' backslashes equivalent
    +    ⇒ a and b equivalent
    +
    +
    +
    + +

    The above operators can’t be combined with most others, but a leading +‘!’, not followed immediately by spaces or tabs, complements an +expression. +

    +
    +
    .nr x 1
    +.ie !r x register x is not defined
    +.el      register x is defined
    +    ⇒ register x is defined
    +
    + +

    Spaces and tabs are optional immediately after the ‘c’, ‘d’, +‘F’, ‘m’, ‘r’, and ‘S’ operators, but right after +‘!’, they end the predicate and the conditional evaluates +true.92 +

    +
    +
    .nr x 1
    +.ie ! r x register x is not defined
    +.el       register x is defined
    +    ⇒ r x register x is not defined
    +
    + +

    The unexpected ‘r x’ in the output is a clue that our conditional +was not interpreted as we planned, but matters may not always be so +obvious. +

    + +
    +
    +
    + +

    5.23.2 if-then

    + + +
    +
    Request: .if cond-expr anything
    +
    +

    Evaluate the conditional expression cond-expr, and if it evaluates +true (or to a positive value), interpret the remainder of the line +anything as if it were an input line. Recall from Invoking Requests that any quantity of spaces between arguments to requests +serves only to separate them; leading spaces in anything are thus +not seen. anything effectively cannot be omitted; if +cond-expr is true and anything is empty, the newline at the +end of the control line is interpreted as a blank input line (and +therefore a blank text line). +

    +
    +
    super\c
    +tanker
    +.nr force-word-break 1
    +super\c
    +.if ((\n[force-word-break] = 1) & \n[.int])
    +tanker
    +    ⇒ supertanker super tanker
    +
    +
    + +
    +
    Request: .nop anything
    +
    +

    Interpret anything as if it were an input line. This is similar +to ‘.if 1’. nop is not really “no operation”; its +argument is processed—unconditionally. It can be used to cause +text lines to share indentation with surrounding control lines. +

    +
    +
    .als real-MAC MAC
    +.de wrapped-MAC
    +.  tm MAC: called with arguments \\$@
    +.  nop \\*[real-MAC]\\
    +..
    +.als MAC wrapped-MAC
    +\# Later...
    +.als MAC real-MAC
    +
    + +

    In the above, we’ve used aliasing, nop, and the interpolation of +a macro as a string to interpose a wrapper around the macro ‘MAC’ +(perhaps to debug it). +

    + + +
    +
    +
    + +

    5.23.3 if-else

    + + +
    +
    Request: .ie cond-expr anything
    +
    +
    Request: .el anything
    +
    +

    Use the ie and el requests to write an if-then-else. The +first request is the “if” part and the latter is the “else” part. +Unusually among programming languages, any number of non-conditional +requests may be interposed between the ie branch and the +el branch. +

    +
    +
    .nr a 0
    +.ie \na a is non-zero.
    +.nr a +1
    +.el a was not positive but is now \na.
    +    ⇒ a was not positive but is now 1.
    +
    + +

    Another way in which el is an ordinary request is that it does +not lexically “bind” more tightly to its ie counterpart than it +does to any other request. This fact can surprise C programmers. +

    +
    +
    .nr a 1
    +.nr z 0
    +.ie \nz \
    +.  ie \na a is true
    +.  el     a is false
    +.el z is false
    +    error→ warning: unbalanced 'el' request
    +    ⇒ a is false
    +
    + +

    To conveniently nest conditionals, keep reading. +

    +
    + + +
    +
    +
    + +

    5.23.4 Conditional Blocks

    + + + +

    It is frequently desirable for a control structure to govern more than +one request, macro call, text line, or a combination of the foregoing. +The opening and closing brace escape sequences \{ and \} +define such groups. These conditional blocks can furthermore be +nested. +

    +
    +
    Escape sequence: \{
    +
    +
    Escape sequence: \}
    +
    + + + + + + + + + + + + + +

    \{ begins a conditional block; it must appear (after optional +spaces and tabs) immediately subsequent to the conditional expression of +an if, ie, or while +request,93 or as the argument to an el +request. +

    +

    \} ends a condition block and should appear on a line with other +occurrences of itself as necessary to match \{ sequences. It +can be preceded by a control character, spaces, and tabs. Input after +any quantity of \} sequences on the same line is processed only +if all of the preceding conditions to which they correspond are true. +Furthermore, a \} closing the body of a while request +must be the last such escape sequence on an input line. +

    +

    Brace escape sequences outside of control structures have no meaning and +produce no output. +

    +

    Caution: Input lines using \{ often end with +\RET, especially in macros that consist primarily of control +lines. Forgetting to use \RET on an input line after \{ +is a common source of error. +

    + +

    We might write the following in a page header macro. If we delete +\RET, the header will carry an unwanted extra empty line (except +on page 1). +

    +
    +
    .if (\\n[%] != 1) \{\
    +.  ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
    +.  el                    .tl \\*[odd-numbered-page-title]
    +.\}
    +
    + +

    Let us take a closer look at how conditional blocks nest. +

    +
    +
    A
    +.if 0 \{ B
    +C
    +D
    +\}E
    +F
    +    ⇒ A F
    +
    + +
    +
    N
    +.if 1 \{ O
    +.  if 0 \{ P
    +Q
    +R\} S\} T
    +U
    +    ⇒ N O U
    +
    + +

    The above behavior may challenge the intuition; it was implemented to +retain compatibility with AT&T troff. For clarity, it +is idiomatic to end input lines with \{ (followed by +\RET if appropriate), and to precede \} on an input +line with nothing more than a control character, spaces, tabs, and other +instances of itself. +

    +

    We can use ie, el, and conditional blocks to simulate the +multi-way “switch” or “case” control structures of other languages. +The following example is adapted from the groff man +package. Indentation is used to clarify the logic. +

    +
    +
    .\" Simulate switch/case in roff.
    +.      ie '\\$2'1' .ds title General Commands\"
    +.el \{.ie '\\$2'2' .ds title System Calls\"
    +.el \{.ie '\\$2'3' .ds title Library Functions\"
    +.el \{.ie '\\$2'4' .ds title Kernel Interfaces\"
    +.el \{.ie '\\$2'5' .ds title File Formats\"
    +.el \{.ie '\\$2'6' .ds title Games\"
    +.el \{.ie '\\$2'7' .ds title Miscellaneous Information\"
    +.el \{.ie '\\$2'8' .ds title System Management\"
    +.el \{.ie '\\$2'9' .ds title Kernel Development\"
    +.el                .ds title \" empty
    +.\}\}\}\}\}\}\}\}
    +
    + + +
    +
    +
    + +

    5.23.5 while

    + + +

    groff provides a looping construct: the while request. +Its syntax matches the if request. +

    + +
    +
    Request: .while cond-expr anything
    +
    +

    Evaluate the conditional expression cond-expr, and repeatedly +execute anything unless and until cond-expr evaluates false. +anything, which is often a conditional block, is referred to as +the while request’s body. +

    +
    +
    .nr a 0 1
    +.while (\na < 9) \{\
    +\n+a,
    +.\}
    +\n+a
    +    ⇒ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    +
    + + +

    GNU troff treats the body of a while request similarly to +that of a de request (albeit one not read in copy +mode94), but stores it under an internal name +and deletes it when the loop finishes. The operation of a macro +containing a while request can slow significantly if the +while body is large. Each time the macro is executed, the +while body is parsed and stored again. +

    +
    +
    .de xxx
    +.  nr num 10
    +.  while (\\n[num] > 0) \{\
    +.    \" many lines of code
    +.    nr num -1
    +.  \}
    +..
    +
    + + + +

    An often better solution—and one that is more portable, since +AT&T troff lacked the while request—is to +instead write a recursive macro. It will be parsed only +once.95 +

    +
    +
    .de yyy
    +.  if (\\n[num] > 0) \{\
    +.    \" many lines of code
    +.    nr num -1
    +.    yyy
    +.  \}
    +..
    +.
    +.de xxx
    +.  nr num 10
    +.  yyy
    +..
    +
    + +

    To prevent infinite loops, the default number of available recursion +levels is 1,000 or somewhat less.96 You can +disable this protective measure, or raise the limit, by setting the +slimit register. See Debugging. +

    +

    As noted above, if a while body begins with a conditional block, +its closing brace must end an input line. +

    +
    +
    .if 1 \{\
    +.  nr a 0 1
    +.  while (\n[a] < 10) \{\
    +.    nop \n+[a]
    +.\}\}
    +    error→ unbalanced brace escape sequences
    +
    +
    + +
    +
    Request: .break
    +
    + + + +

    Exit a while loop. Do not confuse this request with a +typographical break or the br request. +

    + +
    +
    Request: .continue
    +
    +

    Skip the remainder of a while loop’s body, immediately starting +the next iteration. +

    + + + +
    +
    +
    +
    + +

    5.24 Writing Macros

    + + + +

    A macro is a stored collection of text and control lines that can +be interpolated multiple times. Use macros to define common operations. +Macros are called in the same way that requests are invoked. While +requests exist for the purpose of creating macros, simply calling an +undefined macro, or interpolating it as a string, will cause it to be +defined as empty. See Identifiers. +

    +
    +
    Request: .de name [end]
    +
    +

    Define a macro name, replacing the definition of any existing +request, macro, string, or diversion called name. If +name already exists as an alias, the target of the alias is +redefined; recall Strings. GNU troff enters copy +mode,97 storing subsequent input lines as the +macro definition. If the optional second argument is not specified, the +definition ends with the control line ‘..’ (two dots). +Alternatively, end identifies a macro whose call syntax at the +start of a control line ends the definition of name; end is +then called normally. A macro definition must end in the same +conditional block (if any) in which it began (see Conditional Blocks). Spaces or tabs are permitted after the control character in +the line containing this ending token (either ‘.’ or +‘end’), but a tab immediately after the token prevents its +recognition as the end of a macro definition. The macro end can +be called with arguments.98 +

    +

    Here is a small example macro called ‘P’ that causes a break and +inserts some vertical space. It could be used to separate paragraphs. +

    +
    +
    .de P
    +.  br
    +.  sp .8v
    +..
    +
    + +

    We can define one macro within another. Attempting to nest ‘..’ +naïvely will end the outer definition because the inner definition +isn’t interpreted as such until the outer macro is later interpolated. +We can use an end macro instead. Each level of nesting should use a +unique end macro. +

    +

    An end macro need not be defined until it is called. This fact enables +a nested macro definition to begin inside one macro and end inside +another. Consider the following example.99 +

    +
    +
    .de m1
    +.  de m2 m3
    +you
    +..
    +.de m3
    +Hello,
    +Joe.
    +..
    +.de m4
    +do
    +..
    +.m1
    +know?
    +.  m3
    +What
    +.m4
    +.m2
    +    ⇒ Hello, Joe.  What do you know?
    +
    + +

    A nested macro definition can be terminated with ‘..’ and +nested macros can reuse end macros, but these control lines must +be escaped multiple times for each level of nesting. The necessity of +this escaping and the utility of nested macro definitions will become +clearer when we employ macro parameters and consider the behavior of +copy mode in detail. +

    + +

    de defines a macro that inherits the compatibility mode +enablement status of its context (see Implementation Differences). +Often it is desirable to make a macro that uses groff features +callable from contexts where compatibility mode is on; for instance, +when writing extensions to a historical macro package. To achieve this, +compatibility mode needs to be switched off while such a macro is +interpreted—without disturbing that state when it is finished. +

    +
    +
    Request: .de1 name [end]
    +
    +

    The de1 request defines a macro to be interpreted with +compatibility mode disabled. When name is called, compatibility +mode enablement status is saved; it is restored when the call completes. +Observe the extra backlash before the interpolation of register +‘xxx’; we’ll explore this subject in Copy Mode. +

    +
    +
    .nr xxx 12345
    +.de aa
    +The value of xxx is \\n[xxx].
    +.  br
    +..
    +.de1 bb
    +The value of xxx is \\n[xxx].
    +..
    +.cp 1
    +.aa
    +    error→ warning: register '[' not defined
    +    ⇒ The value of xxx is 0xxx].
    +.bb
    +    ⇒ The value of xxx is 12345.
    +
    +
    + +
    +
    Request: .dei name [end]
    +
    +
    Request: .dei1 name [end]
    +
    +

    The dei request defines a macro with its name and end +macro indirected through strings. That is, it interpolates strings +named name and end before performing the definition. +

    +

    The following examples are equivalent. +

    +
    +
    .ds xx aa
    +.ds yy bb
    +.dei xx yy
    +
    + +
    +
    .de aa bb
    +
    + +

    The dei1 request bears the same relationship to dei as +de1 does to de; it temporarily turns compatibility mode +off when name is called. +

    + +
    +
    Request: .am name [end]
    +
    +
    Request: .am1 name [end]
    +
    +
    Request: .ami name [end]
    +
    +
    Request: .ami1 name [end]
    +
    + + +

    am appends subsequent input lines to macro name, extending +its definition, and otherwise working as de does. +

    +

    To make the previously defined ‘P’ macro set indented instead of +block paragraphs, add the necessary code to the existing macro. +

    +
    +
    .am P
    +.ti +5n
    +..
    +
    + +

    The other requests are analogous to their ‘de’ counterparts. The +am1 request turns off compatibility mode during interpretation of +the appendment. The ami request appends indirectly, meaning that +strings name and end are interpolated with the resulting +names used before appending. The ami1 request is similar to +ami, disabling compatibility mode during interpretation of the +appended lines. +

    + + +

    Using trace.tmac, you can trace calls to de, +de1, am, and am1. You can also use the +backtrace request at any point desired to troubleshoot tricky +spots (see Debugging). +

    +

    See Strings, for the als, rm, and rn requests to +create an alias of, remove, and rename a macro, respectively. +

    + +

    Macro identifiers share their name space with requests, strings, and +diversions; see Identifiers. The am, as, da, +de, di, and ds requests (together with their +variants) create a new object only if the name of the macro, diversion, +or string is currently undefined or if it is defined as a request; +normally, they modify the value of an existing object. See the +description of the als request, for pitfalls when redefining a +macro that is aliased. +

    +
    +
    Request: .return [anything]
    +
    +

    Exit a macro, immediately returning to the caller. If called with an +argument anything, exit twice—the current macro and the macro +one level higher. This is used to define a wrapper macro for +return in trace.tmac. +

    + + + + +
    +
    + +

    5.24.1 Parameters

    + + +

    Macro calls and string interpolations optionally accept a list of +arguments; recall Calling Macros. At the time such an +interpolation takes place, these parameters can be examined using +a register and a variety of escape sequences starting with ‘\$’. +All such escape sequences are interpreted even in copy mode, a fact we +shall motivate and explain below (see Copy Mode). +

    +
    +
    Register: \n[.$]
    +
    + +

    The count of parameters available to a macro or string is kept in this +read-only register. The shift request can change its value. +

    + +

    Any individual parameter can be accessed by its position in the list of +arguments to the macro call, numbered from left to right starting at 1, +with one of the following escape sequences. +

    +
    +
    Escape sequence: \$n
    +
    +
    Escape sequence: \$(nn
    +
    Escape sequence: \$[nnn]
    +

    Interpolate the nth, nnth, or nnnth parameter. The +first form expects only a single digit (1≤n≤9)), the +second two digits (01≤nn≤99)), and the third any +positive integer nnn. Macros and strings accept an unlimited +number of parameters. +

    + +
    +
    Request: .shift [n]
    +
    +

    Shift the parameters n places (1 by default). This is a +“left shift”: what was parameter i becomes parameter +i-n. The parameters formerly in positions 1 +to n are no longer available. Shifting by a non-positive +amount performs no operation. The register .$ is adjusted +accordingly. +

    + + + + + +

    In practice, parameter interpolations are usually seen prefixed with an +extra escape character. This is because the \$ family of escape +sequences is interpreted even in copy mode.100 +

    +
    +
    Escape sequence: \$*
    +
    +
    Escape sequence: \$@
    +
    +
    Escape sequence: \$^
    +
    +

    In some cases it is convenient to interpolate all of the parameters at +once (to pass them to a request, for instance). The \$* escape +concatenates the parameters, separating them with spaces. \$@ +is similar, concatenating the parameters, surrounding each with double +quotes and separating them with spaces. If not in compatibility mode, +the interpolation depth of double quotes is preserved (see Calling Macros). \$^ interpolates all parameters as if they were +arguments to the ds request. +

    +
    +
    .de foo
    +. tm $1='\\$1'
    +. tm $2='\\$2'
    +. tm $*='\\$*'
    +. tm $@='\\$@'
    +. tm $^='\\$^'
    +..
    +.foo " This is a "test"
    +    error→ $1=' This is a '
    +    error→ $2='test"'
    +    error→ $*=' This is a  test"'
    +    error→ $@='" This is a " "test""'
    +    error→ $^='" This is a "test"'
    +
    + +

    \$* is useful when writing a macro that doesn’t need to +distinguish its arguments, or even to not interpret them; examples +include macros that produce diagnostic messages by wrapping the +tm or ab requests. Use \$@ when writing a macro +that may need to shift its parameters and/or wrap a macro or request +that finds the count significant. If in doubt, prefer \$@ to +\$*. An application of \$^ is seen in trace.tmac, +which redefines some requests and macros for debugging purposes. +

    + +
    +
    Escape sequence: \$0
    +
    + + +

    Interpolate the name by which the macro being interpreted was called. +The als request can cause a macro to have more than one name. +Applying string interpolation to a macro does not change this name. +

    +
    +
    .de foo
    +.  tm \\$0
    +..
    +.als bar foo
    +.
    +.de aaa
    +.  foo
    +..
    +.de bbb
    +.  bar
    +..
    +.de ccc
    +\\*[foo]\\
    +..
    +.de ddd
    +\\*[bar]\\
    +..
    +.
    +.aaa
    +    error→ foo
    +.bbb
    +    error→ bar
    +.ccc
    +    error→ ccc
    +.ddd
    +    error→ ddd
    +
    +
    + + +
    +
    +
    + +

    5.24.2 Copy Mode

    + + + + + + + + + +

    When GNU troff processes certain requests, most importantly those +which define or append to a macro or string, it does so in copy +mode: it copies the characters of the definition into a dedicated +storage region, interpolating the escape sequences \n, \g, +\$, \*, \V, and \? normally; interpreting +\RET immediately; discarding comments \" and +\#; interpolating the current leader, escape, or tab character +with \a, \e, and \t, respectively; and storing all +other escape sequences in an encoded form. +

    + + +

    The complement of copy mode—a roff formatter’s behavior when +not defining or appending to a macro, string, or diversion—where all +macros are interpolated, requests invoked, and valid escape sequences +processed immediately upon recognition, can be termed +interpretation mode. +

    +
    +
    Escape sequence: \\
    +
    +

    The escape character, \ by default, can escape itself. This +enables you to control whether a given \n, \g, \$, +\*, \V, or \? escape sequence is interpreted at the +time the macro containing it is defined, or later when the macro is +called.101 +

    +
    +
    .nr x 20
    +.de y
    +.nr x 10
    +\&\nx
    +\&\\nx
    +..
    +.y
    +    ⇒ 20 10
    +
    + +

    You can think of \\ as a “delayed” backslash; it is the escape +character followed by a backslash from which the escape character has +removed its special meaning. Consequently, ‘\\’ is not an escape +sequence in the usual sense. In any escape sequence ‘\X’ +that GNU troff does not recognize, the escape character is +ignored and X is output. An unrecognized escape sequence causes +a warning in category ‘escape’, with two exceptions—‘\\’ is +the first. +

    + + +
    +
    Escape sequence: \.
    +
    +

    \. escapes the control character. It is similar to \\ in +that it isn’t a true escape sequence. It is used to permit nested macro +definitions to end without a named macro call to conclude them. Without +a syntax for escaping the control character, this would not be possible. +

    +
    +
    .de m1
    +foo
    +.
    +.  de m2
    +bar
    +\\..
    +.
    +..
    +.m1
    +.m2
    +    ⇒ foo bar
    +
    + +

    The first backslash is consumed while the macro is read, and the second +is interpreted when macro m1 is called. +

    + +

    roff documents should not use the \\ or \. +character sequences outside of copy mode; they serve only to obfuscate +the input. Use \e to represent the escape character, +\[rs] to obtain a backslash glyph, and \& before ‘.’ +and ‘'’ where GNU troff expects them as control characters +if you mean to use them literally (recall Requests and Macros). +

    +

    Macro definitions can be nested to arbitrary depth. The mechanics of +parsing the escape character have significant consequences for this +practice. +

    +
    +
    .de M1
    +\\$1
    +.  de M2
    +\\\\$1
    +.    de M3
    +\\\\\\\\$1
    +\\\\..
    +.    M3 hand.
    +\\..
    +.  M2 of
    +..
    +This understeer is getting
    +.M1 out
    +    ⇒ This understeer is getting out of hand.
    +
    + +

    Each escape character is interpreted twice—once in copy mode, when the +macro is defined, and once in interpretation mode, when the macro is +called. As seen above, this fact leads to exponential growth in the +quantity of escape characters required to delay interpolation of +\n, \g, \$, \*, \V, and \? at +each nesting level, which can be daunting. GNU troff offers a +solution. +

    +
    +
    Escape sequence: \E
    +
    +

    \E represents an escape character that is not interpreted in copy +mode. You can use it to ease the writing of nested macro definitions. +

    +
    +
    .de M1
    +.  nop \E$1
    +.  de M2
    +.    nop \E$1
    +.    de M3
    +.      nop \E$1
    +\\\\..
    +.    M3 better.
    +\\..
    +.  M2 bit
    +..
    +This vehicle handles
    +.M1 a
    +    ⇒ This vehicle handles a bit better.
    +
    + +

    Observe that because \. is not a true escape sequence, we can’t +use \E to keep ‘..’ from ending a macro definition +prematurely. If the multiplicity of backslashes complicates +maintenance, use end macros. +

    +

    \E is also convenient to define strings containing escape +sequences that need to work when used in copy mode (for example, as +macro arguments), or which will be interpolated at varying macro nesting +depths. We might define strings to begin and end superscripting +as follows.102 +

    +
    +
    .ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
    +.ds } \v'-.7m\s0+.9m'
    +
    + +

    When the ec request is used to redefine the escape character, +\E also makes it easier to distinguish the semantics of an escape +character from the other meaning(s) its character might have. Consider +the use of an unusual escape character, ‘-’. +

    +
    +
    .nr a 1
    +.ec -
    +.de xx
    +--na
    +..
    +.xx
    +    ⇒ -na
    +
    + +

    This result may surprise you; some people expect ‘1’ to be output +since register ‘a’ has clearly been defined with that value. What +has happened? The robotic replacement of ‘\’ with ‘-’ has led +us astray. You might recognize the sequence ‘--’ more readily with +the default escape character as ‘\-’, the special character escape +sequence for the minus sign glyph. +

    +
    +
    .nr a 1
    +.ec -
    +.de xx
    +-Ena
    +..
    +.xx
    +    ⇒ 1
    +
    +
    + + + +
    +
    +
    +
    + +

    5.25 Page Motions

    + + + +

    See Manipulating Spacing, for a discussion of the most commonly used +request for vertical motion, sp, which spaces downward by one +vee. +

    +
    +
    Request: .mk [reg]
    +
    +
    Request: .rt [dist]
    +
    + + + + + + + + +

    You can mark a location on a page for subsequent return. +mk takes an argument, a register name in which to store the +current page location. If given no argument, it stores the location in +an internal register. This location can be used later by the rt +or the sp requests (or the \v escape). +

    +

    The rt request returns upward to the location marked with +the last mk request. If used with an argument, it returns to a +vertical position dist from the top of the page (no previous +call to mk is necessary in this case). The default scaling +unit is ‘v’. +

    +

    If a page break occurs between a mk request and its matching +rt request, the rt request is silently ignored. +

    +

    A simple implementation of a macro to set text in two columns follows. +

    +
    +
    .nr column-length 1.5i
    +.nr column-gap 4m
    +.nr bottom-margin 1m
    +.
    +.de 2c
    +.  br
    +.  mk
    +.  ll \\n[column-length]u
    +.  wh -\\n[bottom-margin]u 2c-trap
    +.  nr right-side 0
    +..
    +.
    +.de 2c-trap
    +.  ie \\n[right-side] \{\
    +.    nr right-side 0
    +.    po -(\\n[column-length]u + \\n[column-gap]u)
    +.    \" remove trap
    +.    wh -\\n[bottom-margin]u
    +.  \}
    +.  el \{\
    +.    \" switch to right side
    +.    nr right-side 1
    +.    po +(\\n[column-length]u + \\n[column-gap]u)
    +.    rt
    +.  \}
    +..
    +
    + +

    Now let us apply our two-column macro. +

    +
    +
    .pl 1.5i
    +.ll 4i
    +This is a small test that shows how the
    +rt request works in combination with mk.
    +
    +.2c
    +Starting here, text is typeset in two columns.
    +Note that this implementation isn't robust
    +and thus not suited for a real two-column
    +macro.
    +    ⇒ This is a small test that shows how the
    +    ⇒ rt request works in combination with mk.
    +    ⇒
    +    ⇒ Starting  here,    isn't    robust
    +    ⇒ text is typeset    and   thus  not
    +    ⇒ in two columns.    suited  for   a
    +    ⇒ Note that  this    real two-column
    +    ⇒ implementation     macro.
    +
    +
    + +

    Several escape sequences enable fine control of movement about the page. +

    +
    +
    Escape sequence: \v'expr'
    +
    + + +

    Vertically move the drawing position. expr indicates the +magnitude of motion: positive is downward and and negative upward. The +default scaling unit is ‘v’. The motion is relative to the current +drawing position unless expr begins with the boundary-relative +motion operator ‘|’. See Numeric Expressions. +

    +

    Text processing continues at the new drawing position; usually, vertical +motions should be in balanced pairs to avoid a confusing page layout. +

    +

    \v will not spring a vertical position trap. This can be useful; +for example, consider a page bottom trap macro that prints a marker in +the margin to indicate continuation of a footnote. See Traps. +

    + +

    A few escape sequences that produce vertical motion are unusual. They +are thought to originate early in AT&T nroff history to achieve +super- and subscripting by half-line motions on line printers and +teletypewriters before the phototypesetter made more precise positioning +available. They are reckoned in ems—not vees—to maintain continuity +with their original purpose of moving relative to the size of the type +rather than the distance between text baselines (vees).103 +

    +
    +
    Escape sequence: \r
    +
    +
    Escape sequence: \u
    +
    +
    Escape sequence: \d
    +
    +

    Move upward 1m, upward .5m, and +downward .5m, respectively. +

    + +

    Let us see these escape sequences in use. +

    +
    +
    Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
    +
    + +

    In the foregoing we have paired \u and \d to typeset a +superscript, and later a full em negative (“reverse”) motion to place +a superscript above a subscript. A numeral-width horizontal motion +escape sequence aligns the proton and nucleon numbers, while \k +marks a horizontal position to which \h returns so that we could +stack them. (We shall discuss these horizontal motion escape sequences +presently.) In serious applications, we often want to alter the type +size of the -scripts and to fine-tune the vertical motions, as the +groff ms package does with its super- and subscripting +string definitions. +

    +
    +
    Escape sequence: \h'expr'
    +
    + + + + + +

    Horizontally move the drawing position. expr indicates the +magnitude of motion: positive is rightward and negative leftward. The +default scaling unit is ‘m’. The motion is relative to the current +drawing position unless expr begins with the boundary-relative +motion operator ‘|’. See Numeric Expressions. +

    + +

    The following string definition sets the TeX +logo.104 +

    +
    +
    .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
    +
    + +

    There are a number of special-case escape sequences for horizontal +motion. +

    +
    +
    Escape sequence: \SP
    +
    + + + + +

    Move right one word space. (The input is a backslash followed by a +space.) This escape sequence can be thought of as a non-adjustable, +unbreakable space. Usually you want \~ instead; see +Manipulating Filling and Adjustment. +

    + + + +
    +
    Escape sequence: \|
    +
    +

    Move one-sixth em to the right on typesetting output devices. If +a glyph named ‘\|’ is defined in the current font, its width is +used instead, even on terminal output devices. +

    + + + +
    +
    Escape sequence: \^
    +
    +

    Move one-twelfth em to the right on typesetting output devices. +If a glyph named ‘\^’ is defined in the current font, its width is +used instead, even on terminal output devices. +

    + +
    +
    Escape sequence: \0
    +
    + + + + +

    Move right by the width of a numeral in the current font. +

    + +

    Horizontal motions are not discarded at the end of an output line as +word spaces are. See Breaking. +

    +
    +
    Escape sequence: \w'anything'
    +
    +
    Register: \n[st]
    +
    +
    Register: \n[sb]
    +
    +
    Register: \n[rst]
    +
    +
    Register: \n[rsb]
    +
    +
    Register: \n[ct]
    +
    +
    Register: \n[ssc]
    +
    +
    Register: \n[skw]
    +
    + +

    Interpolate the width of anything in basic units. This escape +sequence allows several properties of formatted output to be measured +without writing it out. +

    +
    +
    The length of the string 'abc' is \w'abc'u.
    +    ⇒ The length of the string 'abc' is 72u.
    +
    + + + +

    anything is processed in a dummy environment: this means that +font and type size changes, for example, may occur within it without +affecting subsequent output. +

    +

    After each use, \w sets several registers. +

    + + + +
    +
    st
    +
    sb
    +

    The maximum vertical displacements of the text baseline above and below, +respectively. The sign convention is opposite that of relative vertical +motions; that is, depth below the (original) baseline is negative. +These registers are incorrectly documented in the AT&T +troff manual as “the highest and lowest extent of [the argument +to \w] relative to the baseline”. +

    +
    +
    rst
    +
    rsb
    +

    Like st and sb, but taking account of the heights and +depths of glyphs. In other words, these registers store the highest and +lowest vertical positions attained by anything, doing what +AT&T troff documented st and sb as doing. +

    +
    +
    ct
    +

    Characterizes the geometry of glyphs occurring in anything. +

    +
    +
    0
    +

    only short glyphs, no descenders or tall glyphs +

    +
    +
    1
    +

    at least one descender +

    +
    +
    2
    +

    at least one tall glyph +

    +
    +
    3
    +

    at least one each of a descender and a tall glyph +

    +
    + +
    +
    ssc
    +

    The amount of horizontal space (possibly negative) that should be added +to the last glyph before a subscript. +

    +
    +
    skw
    +

    How far to right of the center of the last glyph in the \w +argument, the center of an accent from a roman font should be placed +over that glyph. +

    +
    +
    + +
    +
    Escape sequence: \kp
    +
    +
    Escape sequence: \k(ps
    +
    Escape sequence: \k[position]
    +
    + + + + +

    Store the current horizontal position in the input line in a +register with the name position (one-character name p, +two-character name ps). Use this, for example, to return to the +beginning of a string for highlighting or other decoration. +

    + +
    +
    Register: \n[hp]
    +
    + + + + +

    The current horizontal position at the input line. +

    + +
    +
    Register: \n[.k]
    +
    + + + + +

    A read-only register containing the current horizontal output position +(relative to the current indentation). +

    + +
    +
    Escape sequence: \o'abc…'
    +
    + + +

    Overstrike the glyphs of characters a, b, c, …; +the glyphs are centered, written, and the drawing position advanced by +the widest of the glyphs. +

    + +
    +
    Escape sequence: \zc
    +
    + + +

    Format the character c with zero width; that is, without advancing +the drawing position. Use \z to overstrike glyphs aligned to +their left edges, in contrast to \o’s centering. +

    + +
    +
    Escape sequence: \Z'anything'
    +
    + + +

    Save the drawing position, format anything, then restore it. Tabs +and leaders in the argument are ignored with an error diagnostic. +

    +

    We might implement a strike-through macro thus. +

    +
    +
    .de ST
    +.nr width \w'\\$1'
    +\Z@\v'-.25m'\l'\\n[width]u'@\\$1
    +..
    +.
    +This is
    +.ST "a test"
    +an actual emergency!
    +
    +
    + + + +
    +
    +
    + +

    5.26 Drawing Geometric Objects

    + + + +

    A few of the formatter’s escape sequences draw lines and other geometric +objects. Combined with each other and with page motion commands +(see Page Motions), a wide variety of figures is possible. For +complex drawings, these operations can be cumbersome; the preprocessors +gpic or ggrn are typically used instead. +

    +

    The \l and \L escape sequences draw horizontal and +vertical sequences of glyphs, respectively. Even the simplest of +output devices supports them. +

    +
    +
    Escape sequence: \l'l'
    +
    +
    Escape sequence: \l'lc'
    +
    + + +

    Draw a horizontal line of length l from the drawing position. +Rightward motion is positive. Afterward, the drawing position is at the +right end of the line. The default scaling unit is ‘m’. +

    + + + + +

    The optional second parameter c is a character with which to +draw the line. The default is the baseline rule special character, +\[ru]. +

    + + +

    If c is a valid scaling unit, put \& after l to +disambiguate the input. +

    +
    +
    .de textbox
    +\[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
    +..
    +
    + +

    The foregoing outputs a box rule (a vertical line), the text +argument(s), and another box rule. We employ the boundary-relative +motion operator ‘|’. Finally, the line-drawing escape sequences +draw a radical extender (a form of overline) and an underline from the +drawing position to the position coresponding to beginning of the +input line. The drawing position returns to just after the +right-hand box rule because the lengths of the drawn lines are negative, +as noted above. +

    + +
    +
    Escape sequence: \L'l'
    +
    +
    Escape sequence: \L'lc'
    +
    + + + + + + +

    Draw a vertical line of length l from the drawing position. +Downward motion is positive. The default scaling unit is ‘v’. The +default character is the box rule, \[br]. As with vertical +motion escape sequences, text processing continues where the line ends. +\L is otherwise similar to \l. +

    +
    +
    $ nroff <<EOF
    +This is a \L'3v'test.
    +EOF
    +    ⇒ This is a
    +    ⇒           |
    +    ⇒           |
    +    ⇒           |test.
    +
    + +

    When writing text, the drawing position is at the text baseline; recall +Page Geometry. +

    + +

    The \D escape sequence provides drawing commands that +direct the output device to render geometrical objects rather than +glyphs. Specific devices may support only a subset, or may feature +additional ones; consult the man page for the output driver in use. +Terminal devices in particular implement almost none. See Graphics Commands. +

    +

    Rendering starts at the drawing position; when finished, the drawing +position is left at the rightmost point of the object, even for closed +figures, except where noted. GNU troff draws stroked (outlined) +objects with the stroke color, and shades filled ones with the fill +color. See Colors. Coordinates h and v are horizontal +and vertical motions relative to the drawing position or previous point +in the command. The default scaling unit for horizontal measurements +(and diameters of circles) is ‘m’; for vertical ones, ‘v’. +

    +

    Circles, ellipses, and polygons can be drawn filled or stroked. These +are independent properties; if you want a filled, stroked figure, you +must draw the same figure twice using each drawing command. A filled +figure is always smaller than an outlined one because the former is +drawn only within its defined area, whereas strokes have a line +thickness (set with ‘\D't'’). +

    +
    +
    \h'1i'\v'1i'\
    +\# increase line thickness
    +\Z'\D't 5p''\
    +\# draw stroked (unfilled) polygon
    +\Z'\D'p 3 3 -6 0''\
    +\# draw filled (solid) polygon
    +\Z'\D'P 3 3 -6 0''
    +
    + +
    +
    Escape sequence: \D'command argument …'
    +
    +

    Drawing command escape sequence parameters begin with an ordinary +character, command, selecting the type of object to be drawn, +followed by arguments whose meaning is determined by +command. +

    +
    +
    \D'~ h1 v1hn vn'
    +
    +

    Draw a B-spline to each point in sequence, leaving the drawing position +at (hn, vn). +

    +
    +
    \D'a hc vc h v'
    +
    +

    Draw a circular arc centered at (hc, vc) counterclockwise +from the drawing position to a point (h, v) relative to the +center. 105 +

    +
    +
    \D'c d'
    +
    + + + + +

    Draw a circle of diameter d with its leftmost point at the drawing +position. +

    +
    +
    \D'C d'
    +
    + + + + +

    As ‘\D'C '’, but the circle is filled. +

    +
    +
    \D'e h v'
    +
    + + + + +

    Draw an ellipse of width h and height v with its leftmost +point at the drawing position. +

    +
    +
    \D'E x y'
    +
    + + + + +

    As ‘\D'e '’, but the ellipse is filled. +

    +
    +
    \D'l dx dy'
    +
    +

    Draw line from the drawing position to (h, v). +

    +

    The following is a macro for drawing a box around a text argument; for +simplicity, the box margin is a fixed at 0.2m. +

    +
    +
    .de TEXTBOX
    +.  nr @wd \w'\\$1'
    +\h'.2m'\
    +\h'-.2m'\v'(.2m - \\n[rsb]u)'\
    +\D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
    +\D'l (\\n[@wd]u + .4m) 0'\
    +\D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
    +\D'l -(\\n[@wd]u + .4m) 0'\
    +\h'.2m'\v'-(.2m - \\n[rsb]u)'\
    +\\$1\
    +\h'.2m'
    +..
    +
    + +

    The argument is measured with the \w escape sequence. Its width +is stored in register @wd. \w also sets the registers +rst and rsb; these contain its maximum vertical extents of +the argument. Then, four lines are drawn to form a box, offset by the +box margin. +

    +
    +
    \D'p h1 v1hn vn'
    +
    + + + + +

    Draw polygon with vertices at drawing position and each point in +sequence. GNU troff closes the polygon by drawing a line from +(hn, vn) back to the initial drawing position. +Afterward, the drawing position is left at (hn, vn). +

    +
    +
    \D'P dx1 dy1 dx2 dy2 …'
    +
    + + + + +

    As ‘\D'P '’, but the polygon is filled. +

    +

    The following macro is like the ‘\D'l'’ example, but shades the +box. We draw the box before writing the text because colors in GNU +troff have no transparency; in othe opposite order, the filled +polygon would occlude the text. +

    +
    +
    .de TEXTBOX
    +.  nr @wd \w'\\$1'
    +\h'.2m'\
    +\h'-.2m'\v'(.2m - \\n[rsb]u)'\
    +\M[lightcyan]\
    +\D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
    +     (\\n[@wd]u + .4m) 0 \
    +     0 (\\n[rst]u - \\n[rsb]u + .4m) \
    +     -(\\n[@wd]u + .4m) 0'\
    +\h'.2m'\v'-(.2m - \\n[rsb]u)'\
    +\M[]\
    +\\$1\
    +\h'.2m'
    +..
    +
    + +
    +
    \D't n'
    +
    +

    Set the stroke thickness of geometric objects to n basic units. A +zero n selects the minimal supported thickness. A negative +n selects a thickness proportional to the type size; this is the +default. +

    +
    +
    + +

    In a hazy penumbra between text rendering and drawing commands we locate +the bracket-building escape sequence, \b. It can assemble +apparently large glyphs by vertically stacking ordinary ones. +

    +
    +
    Escape sequence: \b'contents'
    +
    + + + +

    Pile and center a sequence of glyphs vertically on the output line. +Piling stacks glyphs corresponding to each character in +contents, read from left to right, and placed from top to bottom. +GNU troff separates the glyphs vertically by 1m, and the +pile itself is centered 0.5m above the text baseline. The +horizontal drawing position is then advanced by the width of the widest +glyph in the pile. +

    + + +

    This rather inflexible positioning algorithm doesn’t work with the +dvi output device since its bracket pieces vary in height. +Instead, use the geqn preprocessor. +

    +

    Manipulating Spacing describes how to adjust the vertical spacing +of the output line with the \x escape sequence. +

    +

    The application of \b that lends its name is construction of +brackets, braces, and parentheses when typesetting mathematics. We +might construct a large opening (left) brace as follows. +

    +
    +
    \b'\[lt]\[bv]\[lk]\[bv]\[lb]'
    +
    + +

    See groff_char(7) for a list of special character +identifiers. +

    + + + +
    +
    +
    + +

    5.27 Deferring Output

    + + + + + +

    A few roff language elements are generally not used in simple +documents, but arise as page layouts become more sophisticated and +demanding. Environments collect formatting parameters like line +length and typeface. A diversion stores formatted output for +later use. A trap is a condition on the input or output, tested +automatically by the formatter, that is associated with a macro, causing +it to be called when that condition is fulfilled. +

    +

    Footnote support often exercises all three of the foregoing features. A +simple implementation might work as follows. A pair of macros is +defined: one starts a footnote and the other ends it. The author calls +the first macro where a footnote marker is desired. The macro +establishes a diversion so that the footnote text is collected at the +place in the body text where its corresponding marker appears. An +environment is created for the footnote so that it is set at a smaller +typeface. The footnote text is formatted in the diversion using that +environment, but it does not yet appear in the output. The document +author calls the footnote end macro, which returns to the previous +environment and ends the diversion. Later, after much more body text in +the document, a trap, set a small distance above the page bottom, is +sprung. The macro called by the trap draws a line across the page and +emits the stored diversion. Thus, the footnote is rendered. +

    +

    Diversions and traps make the text formatting process non-linear. Let +us imagine a set of text lines or paragraphs labelled ‘A’, +‘B’, and so on. If we set up a trap that produces text ‘T’ +(as a page footer, say), and we also use a diversion to store the +formatted text ‘D’, then a document with input text in the order +‘A B C D E F’ might render as ‘A B C E T F’. The diversion +‘D’ will never be output if we do not call for it. +

    +

    Environments of themselves are not a source of non-linearity in document +formatting: environment switches have immediate effect. One could +always write a macro to change as many formatting parameters as desired +with a single convenient call. But because diversions can be nested and +macros called by traps that are sprung by other trap-called macros, they +may be called upon in varying contexts. For example, consider a page +header that is always to be set in Helvetica. A document that uses +Times for most of its body text, but Courier for displayed code +examples, poses a challenge if a page break occurs in the middle of a +code display; if the header trap assumes that the “previous font” is +always Times, the rest of the example will be formatted in the wrong +typeface. One could carefully save all formatting parameters upon +entering the trap and restore them upon leaving it, but this is verbose, +error-prone, and not future-proof as the groff language develops. +Environments save us considerable effort. +

    + +
    +
    +
    + +

    5.28 Traps

    + + +

    Traps are locations in the output or conditions on the input that, +when reached or fulfilled, call a specified macro. These traps can +occur at a given location on the page, at a given location in the +current diversion (together, these are known as vertical +position traps), at a blank line, at a line with leading space +characters, after a quantity of input lines, or at the end of input. +Macros called by traps are passed no arguments. + + +Setting a trap is also called planting one. + + +It is said that a trap is sprung if its condition is fulfilled. +

    + + + +
    +
    + +

    5.28.1 Vertical Position Traps

    + + + +

    A vertical position trap calls a macro when the formatter’s +vertical drawing position reaches or passes, in the downward direction, +a certain location on the output page or in a diversion. Its +applications include setting page headers and footers, body text in +multiple columns, and footnotes. +

    +
    +
    Request: .vpt [flag]
    +
    +
    Register: \n[.vpt]
    +
    + + + +

    Enable vertical position traps if flag is non-zero or absent; +disable them otherwise. Vertical position traps are those set by the +wh request or by dt within a diversion. The parameter +that controls whether vertical position traps are enabled is global. +Initially, vertical position traps are enabled. The current value is +stored in the .vpt read-only register. +

    + + + + +

    A page can’t be ejected if vpt is set to zero; see The Implicit Page Trap. +

    + + + + +
    +
    + +

    5.28.1.1 Page Location Traps

    + + + +

    A page location trap is a vertical position trap that applies to +the page; that is, to undiverted output. Many can be present; manage +them with the wh and ch requests. +

    +
    +
    Request: .wh dist [name]
    +
    +

    Plant macro name as page location trap at dist. The default +scaling unit is ‘v’. Non-negative values for dist set the +trap relative to the top of the page; negative values set the trap +relative to the bottom of the page. It is not possible to plant a trap +less than one basic unit from the page bottom: a dist of -0 +is interpreted as 0, the top of the page.106 An existing visible trap (see below) at +dist is removed; this is wh’s sole function if name +is missing. +

    +

    A trap is sprung only if it is visible, meaning that its location +is reachable on the page107 and it +is not hidden by another trap at the same location already planted +there. +

    + + + + + + + + +

    A macro package might set headers and footers as follows; this example +configures vertical margins of one inch to the body text, and one +half-inch to the titles. Observe the use of the no-break control +character with sp request to position our text baselines, +and the page number character ‘%’ used with the tl request. +

    +
    +
    .\" hdfo.roff
    +.de hd                  \" page header
    +'  sp .5i
    +'  tl '\\*(Ti''\\*(Da'  \" title and date strings
    +'  sp .5i
    +..
    +.de fo                  \" page footer
    +'  sp .5i
    +.  tl ''%''
    +.  bp
    +..
    +.wh 0   hd             \" trap at top of the page
    +.wh -1i fo             \" trap 1 inch from bottom
    +
    + +

    To use these traps, copy the above (or load it from a file with the +so or mso requests), then set up the strings it uses. +

    +
    +
    .so hdfo.roff
    +.ds Ti Final Report\"
    +.ds Da 21 May 2023\"
    +.ti
    +On 5 August of last year,
    +this committee tasked me with the investigation of the
    +CFIT (controlled flight into terrain) incident of
    +.\" ...and so on...
    +
    + +

    A trap above the top or at or below the bottom of the page can be made +visible by either moving it into the page area or increasing the page +length so that the trap is on the page. Negative trap values always use +the current page length; they are not converted to an absolute +vertical position. + + +We can use the ptr request to dump our page location traps to the +standard error stream (see Debugging). Their positions are reported +in basic units; an nroff device example follows. +

    +
    +
    .pl 5i
    +.wh -1i xx
    +.ptr
    +    error→ xx      -240
    +.pl 100i
    +.ptr
    +    error→ xx      -240
    +
    + +

    It is possible to have more than one trap at the same location (although +only one at a time can be visible); to achieve this, the traps must be +defined at different locations, then moved to the same place with the +ch request. In the following example, the many empty lines +caused by the bp request are not shown in the output. +

    +
    +
    .de a
    +.  nop a
    +..
    +.de b
    +.  nop b
    +..
    +.de c
    +.  nop c
    +..
    +.
    +.wh 1i a
    +.wh 2i b
    +.wh 3i c
    +.bp
    +    ⇒ a b c
    +
    +
    +
    .ch b 1i
    +.ch c 1i
    +.bp
    +    ⇒ a
    +
    +
    +
    .ch a 0.5i
    +.bp
    +    ⇒ a b
    +
    +
    + +
    +
    Register: \n[.t]
    +
    + + +

    The read-only register .t holds the distance to the next vertical +position trap. If there are no traps between the current position and +the bottom of the page, it contains the distance to the page bottom. +Within a diversion, in the absence of a diversion trap, this distance is +the largest representable integer in basic units—effectively infinite. +

    + +
    +
    Request: .ch name [dist]
    +
    + + +

    Change the location of a trap by moving macro name to new location +dist, or by unplanting it altogether if dist is absent. The +default scaling unit is ‘v’. Parameters to ch are specified +in the opposite order from wh. If name is the earliest +planted macro of multiple traps at the same location, (re)moving it from +that location exposes the macro next least recently planted at the same +place.108 +

    +

    Changing a trap’s location is useful for building up footnotes in a +diversion to allow more space at the bottom of the page for them. +

    + +
    + +

    The same macro can be installed simultaneously at multiple locations; +however, only the earliest-planted instance—that has not yet been +deleted with wh—will be moved by ch. The following +example (using an nroff device) illustrates this behavior. Blank +lines have been elided from the output. +

    +
    +
    .de T
    +Trap sprung at \\n(nlu.
    +.br
    +..
    +.wh 1i T
    +.wh 2i T
    +foo
    +.sp 11i
    +.bp
    +.ch T 4i
    +bar
    +.sp 11i
    +.bp
    +.ch T 5i
    +baz
    +.sp 11i
    +.bp
    +.wh 5i
    +.ch T 6i
    +qux
    +.sp 11i
    +
    +
    +
        ⇒ foo
    +    ⇒ Trap sprung at 240u.
    +    ⇒ Trap sprung at 480u.
    +    ⇒ bar
    +    ⇒ Trap sprung at 480u.
    +    ⇒ Trap sprung at 960u.
    +    ⇒ baz
    +    ⇒ Trap sprung at 480u.
    +    ⇒ Trap sprung at 1200u.
    +    ⇒ qux
    +    ⇒ Trap sprung at 1440u.
    +
    + +
    +
    Register: \n[.ne]
    +
    +

    The read-only register .ne contains the amount of space that was +needed in the last ne request that caused a trap to be sprung; +it is useful in conjunction with the .trunc register. See Page Control. Since the .ne register is set only by traps, it +doesn’t make sense to interpolate it outside of macros called by traps. +

    + +
    +
    Register: \n[.trunc]
    +
    + + +

    A read-only register containing the amount of vertical space truncated +from an sp request by the most recently sprung vertical +position trap, or, if the trap was sprung by an ne request, +minus the amount of vertical motion produced by the ne +request. In other words, at the point a trap is sprung, it +represents the difference of what the vertical position would have +been but for the trap, and what the vertical position actually is. +Since the .trunc register is set only by traps, it doesn’t make +sense to interpolate it outside of macros called by traps. +

    + +
    +
    Register: \n[.pe]
    +
    + + + +

    This Boolean-valued, read-only register interpolates 1 while a page +is being ejected, and 0 otherwise. +

    +

    In the following example, we plant the same trap at the top and the +bottom of the page. We also make the trap report its name and the +vertical drawing position. +

    +
    +
    .de T
    +.tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
    +..
    +.ll 46n
    +.wh 0 T
    +.wh -1v T
    +Those who can make you believe absurdities can make you
    +commit atrocities. \[em] Voltaire
    +    error→ T: page 1, nl=0 .pe=0
    +    error→ T: page 1, nl=2600 .pe=1
    +    ⇒ Those who can make you believe absurdities can
    +    ⇒ make you commit atrocities. -- Voltaire
    +
    +
    + + + +

    When designing macros, keep in mind that diversions and traps do +normally interact. For example, if a trap calls a header macro (while +outputting a diversion) that tries to change the font on the current +page, the effect is not visible before the diversion has completely been +printed (except for input protected with \! or \?) since +the data in the diversion is already formatted. In most cases, this is +not the expected behaviour. +

    + +
    +
    +
    + +

    5.28.1.2 The Implicit Page Trap

    + + + + + + + +

    If, after starting GNU troff without loading a macro package, you +use the ptr request to dump a list of the active traps to the +standard error stream,109 nothing is reported. +Yet the .t register will report a steadily decreasing value with +every output line your document produces, and once the value of +.t gets to within .V of zero, you will notice that +something trap-like happens—the page is ejected, a new one begins, and +the value of .t becomes large once more. +

    +

    This implicit page trap always exists in the top-level +diversion;110 it works like a trap in some +ways but not others. Its purpose is to eject the current page and start +the next one. It has no name, so it cannot be moved or deleted with +wh or ch requests. You cannot hide it by placing another +trap at its location, and can move it only by redefining the page length +with pl. Its operation is suppressed when vertical page traps +are disabled with GNU troff’s vpt request. +

    + +
    +
    +
    + +

    5.28.1.3 Diversion Traps

    + + + +

    A diversion is not formatted in the context of a page, so it lacks page +location traps; instead it can have a diversion trap. There can +exist at most one such vertical position trap per diversion. +

    +
    +
    Request: .dt [dist name]
    +
    + + + + +

    Set a trap within a diversion at location dist, which is +interpreted relative to diversion rather than page boundaries. If invoked with +fewer than two arguments, any diversion trap in the current diversion is +removed. The register .t works within diversions. It is an +error to invoke dt in the top-level diversion. +See Diversions. +

    + + +
    +
    +
    +
    + +

    5.28.2 Input Line Traps

    + + + +
    +
    Request: .it [n name]
    +
    +
    Request: .itc [n name]
    +
    + + + + + + +

    Set an input line trap, calling macro name after processing the +next n productive input lines (recall Manipulating Filling and Adjustment). Any existing input line trap in the +environment is replaced. Without arguments, it and itc +clear any input line trap that has not yet sprung. +

    +

    Consider a macro ‘.ST s n’ which sets the next +n input lines in the font style s. +

    +
    +
    .de ST \" Use style $1 for next $2 text lines.
    +.  it \\$2 ES
    +.  ft \\$1
    +..
    +.de ES \" end ST
    +.  ft R
    +..
    +.ST I 1
    +oblique
    +face
    +.ST I 1
    +oblique\c
    +face
    +    ⇒ oblique face obliqueface  (second “face” upright)
    +
    + + + + + +

    Unlike the ce and rj requests, it counts lines +interrupted with the \c escape sequence separately (see Line Continuation); itc does not. To see the difference, let’s +change the previous example to use itc instead. +

    +
    +
    
    +.  itc \\$2 ES
    +
    +    ⇒ oblique face obliqueface  (second “face” oblique)
    +
    + +

    You can think of the ce and rj requests as implicitly +creating an input line trap with itc that schedules a break when +the trap is sprung. +

    +
    +
    .de BR
    +.  br
    +.  internal: disable centering-without-filling
    +..
    +.
    +.de ce
    +.  if \\n[.br] .br
    +.  itc \\$1 BR
    +.  internal: enable centering-without-filling
    +..
    +
    + +

    Let us consider in more detail the sorts of input lines that are or are +not “productive”. +

    +
    +
    .de Trap
    +TRAP SPRUNG
    +..
    +.de Mac
    +.if r a \l'5n'
    +..
    +.it 2 Trap
    +.
    +foo
    +.Mac
    +bar
    +baz
    +.it 1 Trap
    +.sp \" moves, but does not write or draw
    +qux
    +.itc 1 Trap
    +\h'5n'\c \" moves, but does not write or draw
    +jat
    +
    + +

    When ‘Trap’ gets called depends on whether the ‘a’ register is +defined; the control line with the if request may or may not +produce written output. We also see that the spacing request sp, +while certainly affecting the output, does not spring the input line +trap. Similarly, the horizontal motion escape sequence \h also +affected the output, but was not “written”. Observe that we had to +follow it with \c and use itc to prevent the newline at +the end of the text line from causing a word break, which, like an +ordinary space character, counts as written output. +

    +
    +
    $ groff -Tascii input-trap-example.groff
    +    ⇒ foo bar TRAP SPRUNG baz
    +    ⇒
    +    ⇒ qux TRAP SPRUNG      jat TRAP SPRUNG
    +$ groff -Tascii -ra1 input-trap-example.groff
    +    ⇒ foo _____ TRAP SPRUNG bar baz
    +    ⇒
    +    ⇒ qux TRAP SPRUNG      jat TRAP SPRUNG
    +
    +
    + +

    Input line traps are associated with the environment +(see Environments); switching to another environment suspends the +current input line trap, and going back resumes it, restoring the count +of qualifying lines enumerated in that environment. +

    + +
    +
    +
    + +

    5.28.3 Blank Line Traps

    + + + +
    +
    Request: .blm [name]
    +
    + +

    Set a blank line trap, calling the macro name when GNU +troff encounters a blank line in an input file, instead of the +usual behavior (see Breaking). A line consisting only of spaces is +also treated as blank and subject to this trap. If no argument is +supplied, the default blank line behavior is (re-)established. +

    + + +
    +
    +
    + +

    5.28.4 Leading Space Traps

    + + + +
    +
    Request: .lsm [name]
    +
    +
    Register: \n[lsn]
    +
    +
    Register: \n[lss]
    +
    + +

    Set a leading space trap, calling the macro name when GNU +troff encounters leading spaces in an input line; the implicit +line break that normally happens in this case is suppressed. If no +argument is supplied, the default leading space behavior is +(re-)established (see Breaking). +

    +

    The count of leading spaces on an input line is stored in register +lsn, and the amount of corresponding horizontal motion in +register lss, irrespective of whether a leading space trap is +set. When it is, the leading spaces are removed from the input line, +and no motion is produced before calling name. +

    +
    + + +
    +
    +
    + +

    5.28.5 End-of-input Traps

    + + + +
    +
    Request: .em [name]
    +
    + + + + + +

    Set a trap at the end of input, calling macro name after the last +line of the last input file has been processed. If no argument is +given, any existing end-of-input trap is removed. +

    +

    For example, if the document had to have a section at the bottom of the +last page for someone to approve it, the em request could be +used. +

    +
    +
    .de approval
    +\c
    +.  ne 3v
    +.  sp (\\n[.t]u - 3v)
    +.  in +4i
    +.  lc _
    +.  br
    +Approved:\t\a
    +.  sp
    +Date:\t\t\a
    +..
    +.
    +.em approval
    +
    + +

    The \c in the above example needs explanation. For historical +reasons (compatibility with AT&T troff), the +end-of-input macro exits as soon as it causes a page break if no +partially collected line remains.111 +

    + + + + +

    Let us assume that there is no \c in the above approval +macro, that the page is full, and last output line has been broken with, +say, a br request. Because there is no more room, a ne +request at this point causes a page ejection, which in turn makes +troff exit immediately as just described. In most situations, +this is not desired; people generally want to format the input after +ne. +

    +

    To force processing of the whole end-of-input macro independently of +this behavior, it is thus advisable to (invisibly) ensure the existence +of a partially collected line (\c) whenever there is a chance +that a page break can happen. In the above example, invoking the +ne request ensures that there is room for the subsequent +formatted output on the same page, so we need insert \c only +once. +

    +

    The next example shows how to append three lines, then start a new page +unconditionally. Since ‘.ne 1 doesn’t give the desired +effect—there is always one line available or we are already at the +beginning of the next page—we temporarily increase the page length by +one line so that we can use ‘.ne 2. +

    +
    +
    .de EM
    +.pl +1v
    +\c
    +.ne 2
    +line one
    +.br
    +\c
    +.ne 2
    +line two
    +.br
    +\c
    +.ne 2
    +line three
    +.br
    +.pl -1v
    +\c
    +'bp
    +..
    +.em EM
    +
    + +

    This specific feature affects only the first potential page break caused +by the end-of-input macro; further page breaks emitted by the macro are +handled normally. +

    +

    Another possible use of the em request is to make GNU +troff emit a single large page instead of multiple pages. For +example, one may want to produce a long plain text file for reading +in a terminal or emulator without page footers and headers interrupting +the body of the document. One approach is to set the page length at the +beginning of the document to a very large value to hold all the +text,112 and +automatically adjust it to the exact height of the document after the +text has been output. +

    +
    +
    .de adjust-page-length
    +.  br
    +.  pl \\n[nl]u \" \n[nl]: current vertical position
    +..
    +.
    +.de single-page-mode
    +.  pl 99999
    +.  em adjust-page-length
    +..
    +.
    +.\" Activate the above code if configured.
    +.if \n[do-continuous-rendering] \
    +.  single-page-mode
    +
    + +

    Since only one end-of-input trap exists and another macro package may +already use it, care must be taken not to break the mechanism. A simple +solution would be to append the above macro to the macro package’s +end-of-input macro using the am request. +

    + + + +
    +
    +
    +
    + +

    5.29 Diversions

    + + +

    In roff systems it is possible to format text as if for output, +but instead of writing it immediately, one can divert the +formatted text into a named storage area. It is retrieved later by +specifying its name after a control character. The same name space is +used for such diversions as for strings and macros; see +Identifiers. Such text is sometimes said to be “stored in a +macro”, but this coinage obscures the important distinction between +macros and strings on one hand and diversions on the other; the former +store unformatted input text, and the latter capture +formatted output. Diversions also do not interpret arguments. +Applications of diversions include “keeps” (preventing a page break +from occurring at an inconvenient place by forcing a set of output lines +to be set as a group), footnotes, tables of contents, and indices. + + +For orthogonality it is said that GNU troff is in the +top-level diversion if no diversion is active (that is, formatted +output is being “diverted” immediately to the output device). +

    +

    Dereferencing an undefined diversion will create an empty one of that +name and cause a warning in category ‘mac’ to be emitted. +See Warnings, for information about the enablement and suppression of +warnings. A diversion does not exist for the purpose of testing with +the d conditional operator until its initial definition ends +(see Operators in Conditionals). The following requests are used to +create and alter diversions. +

    +
    +
    Request: .di [name]
    +
    +
    Request: .da [name]
    +
    + + + + + + +

    Start collecting formatted output in a diversion called name. The +da request appends to a diversion called name, creating it +if necessary. If name already exists as an alias, the target of +the alias is replaced or appended to; recall Strings. The pending +output line is diverted as well. Switching to another environment (with +the ev request) before invoking di or da avoids +including any pending output line in the diversion; see +Environments. +

    +

    Invoking di or da without an argument stops diverting +output to the diversion named by the most recent corresponding request. +If di or da is called without an argument when there is no +current diversion, a warning in category ‘di’ is produced. +See Warnings, for information about the enablement and suppression +of warnings. +

    +
    +
    Before the diversion.
    +.di yyy
    +In the diversion.
    +.br
    +.di
    +After the diversion.
    +.br
    +    ⇒ After the diversion.
    +.yyy
    +    ⇒ Before the diversion.  In the diversion.
    +
    +
    + + +

    GNU troff supports box requests to exclude a partially +collected line from a diversion, as this is often desirable. +

    +
    +
    Request: .box [name]
    +
    +
    Request: .boxa [name]
    +
    +

    Divert (or append) output to name, similarly to the di and +da requests, respectively. Any pending output line is not +included in the diversion. Without an argument, stop diverting output; +any pending output line inside the diversion is discarded. +

    +
    +
    Before the box.
    +.box xxx
    +In the box.
    +.br
    +Hidden treasure.
    +.box
    +After the box.
    +.br
    +    ⇒ Before the box.  After the box.
    +.xxx
    +    ⇒ In the box.
    +
    +
    + +

    Apart from pending output line inclusion and the request names that +populate them, boxes are handled exactly as diversions are. All of the +following groff language elements can be used with them +interchangeably. +

    +
    +
    Register: \n[.z]
    +
    +
    Register: \n[.d]
    +
    + + + + + + + +

    Diversions may be nested. The read-only string-valued register +.z contains the name of the current diversion. The read-only +register .d contains the current vertical place in the diversion. +If the input text is not being diverted, .d reports the same +location as the register nl. +

    + +
    +
    Register: \n[.h]
    +
    + + + + +

    The read-only register .h stores the high-water mark on the +current page or in the current diversion. It corresponds to the text +baseline of the lowest line on the page.113 +

    +
    +
    .tm .h==\n[.h], nl==\n[nl]
    +    ⇒ .h==0, nl==-1
    +This is a test.
    +.br
    +.sp 2
    +.tm .h==\n[.h], nl==\n[nl]
    +    ⇒ .h==40, nl==120
    +
    + + + +

    As implied by the example, vertical motion does not produce text +baselines and thus does not increase the value interpolated by +‘\n[.h]’. +

    + +
    +
    Register: \n[dn]
    +
    +
    Register: \n[dl]
    +
    + + + + +

    After completing a diversion, the writable registers dn and +dl contain its vertical and horizontal sizes. Only the lines +just processed are counted: for the computation of dn and +dl, the requests da and boxa are handled as if +di and box had been used, respectively—lines that have +been already stored in the diversion (box) are not taken into account. +

    +
    +
    .\" Center text both horizontally and vertically.
    +.\" Macro .(c starts centering mode; .)c terminates it.
    +.
    +.\" Disable the escape character with .eo so that we
    +.\" don't have to double backslashes on the "\n"s.
    +.eo
    +.de (c
    +.  br
    +.  ev (c
    +.  evc 0
    +.  in 0
    +.  nf
    +.  di @c
    +..
    +
    +
    +
    .de )c
    +.  br
    +.  ev
    +.  di
    +.  nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
    +.  sp \n[@s]u
    +.  ce 1000
    +.  @c
    +.  ce 0
    +.  sp \n[@s]u
    +.  br
    +.  fi
    +.  rr @s
    +.  rm @c
    +..
    +.ec
    +
    +
    + +
    +
    Escape sequence: \!anything
    +
    +
    Escape sequence: \?anything\?
    +
    + + +

    Transparently embed anything into the current diversion, +preventing requests, macro calls, and escape sequences from being +interpreted when read into a diversion. This is useful for preventing +them from taking effect until the diverted text is actually output. The +\! escape sequence transparently embeds input up to and including +the end of the line. The \? escape sequence transparently embeds +input until its own next occurrence. +

    + + + + + + +

    anything may not contain newlines; use \! by itself to +embed newlines in a diversion. The escape sequence \? is also +recognized in copy mode and turned into a single internal code; it is +this code that terminates anything. Thus the following example +prints 4. +

    +
    +
    .nr x 1
    +.nf
    +.di d
    +\?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
    +.di
    +.nr x 2
    +.di e
    +.d
    +.di
    +.nr x 3
    +.di f
    +.e
    +.di
    +.nr x 4
    +.f
    +
    + +

    Both escape sequences read the data in copy mode. +

    + + + +

    If \! is used in the top-level diversion, its argument is +directly embedded into GNU troff’s intermediate output. This can +be used, for example, to control a postprocessor that processes the data +before it is sent to an output driver. +

    + + + +

    The \? escape used in the top-level diversion produces no output +at all; its argument is simply ignored. +

    + + + + + + +
    +
    Request: .output contents
    +
    +

    Emit contents directly to GNU troff’s intermediate output +(subject to copy mode interpretation); this is similar to \! used +at the top level. An initial neutral double quote in contents is +stripped to allow embedding of leading spaces. +

    +

    This request can’t be used before the first page has started—if you +get an error, simply insert .br before the output request. +

    +

    Use with caution! It is normally only needed for mark-up used by a +postprocessor that does something with the output before sending it to +the output device, filtering out contents again. +

    + +
    +
    Request: .asciify div
    +
    + + + +

    Unformat the diversion div in a way such that Unicode basic +Latin (ASCII) characters, characters translated with the +trin request, space characters, and some escape sequences, that +were formatted and diverted into div are treated like ordinary +input characters when div is reread. Doing so can be useful in +conjunction with the writem request. asciify can be also +used for gross hacks; for example, the following sets +register n to 1. +

    +
    +
    .tr @.
    +.di x
    +@nr n 1
    +.br
    +.di
    +.tr @@
    +.asciify x
    +.x
    +
    + +

    asciify cannot return all items in a diversion to their source +equivalent: nodes such as those produced by the \N escape +sequence will remain nodes, so the result cannot be guaranteed to be a +pure string. See Copy Mode. Glyph parameters such as the type face +and size are not preserved; use unformat to achieve that. +

    + +
    +
    Request: .unformat div
    +
    +

    Like asciify, unformat the diversion div. However, +unformat handles only tabs and spaces between words, the latter +usually arising from spaces or newlines in the input. Tabs are treated +as input tokens, and spaces become adjustable again. The vertical sizes +of lines are not preserved, but glyph information (font, type size, +space width, and so on) is retained. +

    + + + +
    +
    +
    + +

    5.30 Punning Names

    + + +

    Macros, strings, and diversions share a name space; recall +Identifiers. Internally, the same mechanism is used to store +them. You can thus call a macro with string interpolation syntax and +vice versa. +

    +
    +
    .de subject
    +Typesetting
    +..
    +.de predicate
    +rewards attention to detail
    +..
    +\*[subject] \*[predicate].
    +Truly.
    +    ⇒ Typesetting
    +    ⇒  rewards attention to detail Truly.
    +
    + +

    What went wrong? Strings don’t contain newlines, but macros do. String +interpolation placed a newline at the end of ‘\*[subject]’, and the +next thing on the input was a space. Then when ‘\*[predicate]’ was +interpolated, it was followed by the empty request ‘.’ on a line by +itself. If we want to use macros as strings, we must take interpolation +behavior into account. +

    +
    +
    .de subject
    +Typesetting\\
    +..
    +.de predicate
    +rewards attention to detail\\
    +..
    +\*[subject] \*[predicate].
    +Truly.
    +    ⇒ Typesetting rewards attention to detail.  Truly.
    +
    + +

    By ending each text line of the macros with an escaped +\RET, we get the desired effect (see Line Continuation).114 +What would have happened if we had used only one backslash at a time +instead? +

    +

    Interpolating a string does not hide existing macro arguments. We can +also place the escaped newline outside the string interpolation instead +of within the string definition. Thus, in a macro, a more efficient way +of doing +

    +
    +
    .xx \\$@
    +
    + +

    is +

    +
    +
    \\*[xx]\\
    +
    + +

    The latter calling syntax doesn’t change the value of \$0, which +is then inherited from the calling macro (see Parameters). +

    +

    Diversions can be also called with string syntax. It is sometimes +convenient to copy one-line diversions to a string. +

    +
    +
    .di xx
    +the
    +.ft I
    +interpolation system
    +.ft
    +.br
    +.di
    +.ds yy This is a test of \*(xx\c
    +\*(yy.
    +    ⇒ This is a test of the interpolation system.
    +
    + +

    As the previous example shows, it is possible to store formatted output +in strings. The \c escape sequence prevents the subsequent +newline from being interpreted as a break (again, +see Line Continuation). +

    +

    Copying multi-output line diversions produces unexpected results. +

    +
    +
    .di xxx
    +a funny
    +.br
    +test
    +.br
    +.di
    +.ds yyy This is \*[xxx]\c
    +\*[yyy].
    +    ⇒ test This is a funny.
    +
    + +

    Usually, it is not predictable whether a diversion contains one or more +output lines, so this mechanism should be avoided. With AT&T +troff, this was the only solution to strip off a final newline +from a diversion. Another disadvantage is that the spaces in the copied +string are already formatted, preventing their adjustment. This can +cause ugly results. +

    + + + + + + + +

    A clean solution to this problem is available in GNU troff, using +the requests chop to remove the final newline of a diversion, and +unformat to make the horizontal spaces adjustable again. +

    +
    +
    .box xxx
    +a funny
    +.br
    +test
    +.br
    +.box
    +.chop xxx
    +.unformat xxx
    +This is \*[xxx].
    +    ⇒ This is a funny test.
    +
    + +

    See gtroff Internals. +

    + +
    +
    +
    + +

    5.31 Environments

    + + +

    As discussed in Deferring Output, environments store most of the +parameters that determine the appearance of text. A default environment +named ‘0’ exists when GNU troff starts up; it is modified by +formatting-related requests and escape sequences. +

    + +

    You can create new environments and switch among them. Only one is +current at any given time. Active environments are managed using a +stack, a data structure supporting “push” and “pop” +operations. The current environment is at the top of the stack. +The same environment name can be pushed onto the stack multiple times, +possibly interleaved with others. Popping the environment stack does +not destroy the current environment; it remains accessible by name and +can be made current again by pushing it at any time. Environments +cannot be renamed or deleted, and can only be modified when current. To +inspect the environment stack, use the pev request; see +Debugging. +

    +

    Environments store the following information. +

    +
      +
    • a partially collected line, if any + +
    • data about the most recently output glyph and line (registers +.cdp, .cht, .csk, .n, .w) + +
    • typeface parameters (size, family, style, height and slant, inter-word +and inter-sentence space sizes) + +
    • page parameters (line length, title length, vertical spacing, line +spacing, indentation, line numbering, centering, right-alignment, +underlining, hyphenation parameters) + +
    • filling enablement; adjustment enablement and mode + +
    • tab stops; tab, leader, escape, control, no-break control, hyphenation, +and margin characters + +
    • input line traps + +
    • stroke and fill colors +
    + +
    +
    Request: .ev [ident]
    +
    +
    Register: \n[.ev]
    +
    + + + +

    Enter the environment ident, which is created if it does not +already exist, using the same parameters as for the default environment +used at startup. With no argument, GNU troff switches to the +previous environment. +

    +

    Invoking ev with an argument puts environment ident onto +the top of the environment stack. (If it isn’t already present in the +stack, this is a proper push.) Without an argument, ev pops the +environment stack, making the previous environment current. It is an +error to pop the environment stack with no previous environment +available. The read-only string-valued register .ev contains the +name of the current environment—the one at the top of the stack. +

    +
    +
    .ev footnote-env
    +.fam N
    +.ps 6
    +.vs 8
    +.ll -.5i
    +.ev
    +
    +
    +
    +.ev footnote-env
    +\[dg] Observe the smaller text and vertical spacing.
    +.ev
    +
    + +

    We can familiarize ourselves with stack behavior by wrapping the +ev request with a macro that reports the contents of the +.ev register to the standard error stream. +

    +
    +
    .de EV
    +.  ev \\$1
    +.  tm environment is now \\n[.ev]
    +..
    +.
    +.EV foo
    +.EV bar
    +.EV
    +.EV baz
    +.EV
    +.EV
    +.EV
    +
    + +
    +
        error→ environment is now foo
    +    error→ environment is now bar
    +    error→ environment is now foo
    +    error→ environment is now baz
    +    error→ environment is now foo
    +    error→ environment is now 0
    +    error→ error: environment stack underflow
    +    error→ environment is now 0
    +
    + +
    + +
    +
    Request: .evc environment
    +
    + + +

    Copy the contents of environment to the current environment. +

    +

    The following environment data are not copied. +

    +
      +
    • a partially collected line, if present; + +
    • the interruption status of the previous input line (due to use of the +\c escape sequence); + +
    • the count of remaining lines to center, to right-justify, or to +underline (with or without underlined spaces)—these are set to zero; + +
    • the activation status of temporary indentation; + +
    • input line traps and their associated data; + +
    • the activation status of line numbering (which can be reactivated with +‘.nm +0); and + +
    • the count of consecutive hyphenated lines (set to zero). +
    +
    + +
    +
    Register: \n[.w]
    +
    +
    Register: \n[.cht]
    +
    +
    Register: \n[.cdp]
    +
    +
    Register: \n[.csk]
    +
    + + + + + + + +

    The \n[.w] register contains the width of the last glyph +formatted in the environment. +

    +

    The \n[.cht] register contains the height of the last glyph +formatted in the environment. +

    +

    The \n[.cdp] register contains the depth of the last glyph +formatted in the environment. It is positive for glyphs extending below +the baseline. +

    +

    The \n[.csk] register contains the skew (how far to the +right of the glyph’s center that GNU troff should place an +accent) of the last glyph formatted in the environment. +

    + +
    +
    Register: \n[.n]
    +
    + + + + +

    The \n[.n] register contains the length of the previous output +line emitted in the environment. +

    + + + + +
    +
    +
    + +

    5.32 Suppressing Output

    + +
    +
    Escape sequence: \O[num]
    +
    + + +

    Suppress GNU troff output of glyphs and geometric objects. The +sequences \O2, \O3, \O4, and \O5 are +intended for internal use by grohtml. +

    +
    +
    \O0
    +

    Disable the emission of glyphs and geometric objects to the output +driver, provided that this sequence occurs at the outermost suppression +level (see \O3 and \04 below). Horizontal motions +corresponding to non-overstruck glyph widths still occur. +

    +
    +
    \O1
    +

    Enable the emission of glyphs and geometric objects to the output +driver, provided that this sequence occurs at the outermost suppression +level. +

    +
    + + + + + +

    \O0 and \O1 also reset the four registers opminx, +opminy, opmaxx, and opmaxy to −1. These +four registers mark the top left and bottom right hand corners of a box +encompassing all written or drawn output. +

    +
    +
    \O2
    +

    At the outermost suppression level, enable emission of glyphs and +geometric objects, and write to the standard error stream the page +number and values of the four aforementioned registers encompassing +glyphs written since the last interpolation of a \O sequence, as +well as the page offset, line length, image file name (if any), +horizontal and vertical device motion quanta, and input file name. +Numeric values are in basic units. +

    +
    +
    \O3
    +

    Begin a nested suppression level. grohtml uses this mechanism +to create images of output preprocessed with gpic, +geqn, and gtbl. At startup, GNU troff is at +the outermost suppression level. pre-grohtml generates these +sequences when processing the document, using GNU troff with +the ps output device, Ghostscript, and the PNM tools to produce +images in PNG format. They start a new page if the device is not +html or xhtml, to reduce the number of images crossing a +page boundary. +

    +
    +
    \O4
    +

    End a nested suppression level. +

    +
    + +
    +
    \O[5Pfile]
    +

    At the outermost suppression level, write the name file to the +standard error stream at position P, which must be one of +l, r, c, or i, corresponding to left, +right, centered, and inline alignments within the document, +respectively. file is a name associated with the production of +the next image. +

    +
    +
    + +
    +
    Register: \n[.O]
    +
    + + + +

    Output suppression nesting level applied by \O3 and \O4 +escape sequences. +

    + + + +
    +
    +
    + +

    5.33 I/O

    + + + + + +

    gtroff has several requests for including files: +

    +
    +
    Request: .so file
    +
    +
    Request: .soquiet file
    +
    + + +

    Replace the so request’s control line with the contents of the +file named by the argument, “sourcing” it. file is sought in +the directories specified by -I command-line option. If +file does not exist, a warning in category ‘file’ is produced +and the request has no further effect. See Warnings, for +information about the enablement and suppression of warnings. +

    +

    so can be useful for large documents; e.g., allowing each chapter +of a book to be kept in a separate file. However, files interpolated +with so are not preprocessed; to overcome this limitation, see +the gsoelim(1) man page. +

    +

    Since GNU troff replaces the entire control line with the +contents of a file, it matters whether file is terminated with a +newline or not. Assume that file xxx contains only the word +‘foo’ without a trailing newline. +

    +
    +
    $ printf 'foo' > xxx
    +
    +The situation is
    +.so xxx
    +bar.
    +    ⇒ The situation is foobar.
    +
    + +

    soquiet works the same way, except that no warning diagnostic is +issued if file does not exist. +

    + +
    +
    Request: .pso command
    +
    +

    Read the standard output from the specified command and include +it in place of the pso request. +

    + + + + +

    It is an error to use this request in safer mode, which is the +default. Invoke GNU troff or a front end with the -U +option to enable unsafe mode. +

    +

    The comment regarding a final newline for the so request is valid +for pso also. +

    + +
    +
    Request: .mso file
    +
    +
    Request: .msoquiet file
    +
    +

    Identical to the so and soquiet requests, respectively, +except that gtroff searches for the specified file in the +same directories as macro files for the -m command-line option. +If the file name to be included has the form name.tmac and +it isn’t found, these requests try to include tmac.name and +vice versa. +

    + +
    +
    Request: .trf file
    +
    +
    Request: .cf file
    +
    + + + + + + + + +

    Transparently output the contents of file. Each line is output as +if it were preceded by \!; however, the lines are not +subject to copy mode interpretation. If the file does not end with a +newline, trf adds one. Both requests cause a break. +

    +

    When used in a diversion, these requests embed a node (see gtroff Internals) in it that, when reread, causes the contents of file +to be transparently copied to the output. In AT&T +troff, the contents of file are immediately copied to the +output regardless of whether there is a current diversion; this +behaviour is so anomalous that it must be considered a bug. +

    + + + +

    While cf copies the contents of file completely +unprocessed, trf disallows characters such as NUL that are not +valid gtroff input characters (see Identifiers). +

    +

    For cf, within a diversion, “completely unprocessed” means that +each line of a file to be inserted is handled as if it were preceded by +\!\\!. +

    +

    To define a macro x containing the contents of +file f, use +

    +
    +
    .ev 1
    +.di x
    +.trf f
    +.di
    +.ev
    +
    + +

    The calls to ev prevent the partially collected output line +from becoming part of the diversion (see Diversions). +

    + +
    +
    Request: .nx [file]
    +
    + + + +

    Force gtroff to continue processing of the file specified as an +argument. If no argument is given, immediately jump to the end of file. +

    + +
    +
    Request: .rd [prompt [arg1 arg2 …]]
    +
    + + + +

    Read from standard input, and include what is read as though it were +part of the input file. Text is read until a blank line is encountered. +

    +

    If standard input is a TTY input device (keyboard), write prompt +to standard error, followed by a colon (or send BEL for a beep if no +argument is given). +

    +

    Arguments after prompt are available for the input. For example, +the line +

    +
    +
    .rd data foo bar
    +
    + +

    with the input ‘This is \$2. prints +

    +
    +
    This is bar.
    +
    +
    + + + +

    Using the nx and rd requests, it is easy to set up form +letters. The form letter template is constructed like this, putting the +following lines into a file called repeat.let: +

    +
    +
    .ce
    +\*(td
    +.sp 2
    +.nf
    +.rd
    +.sp
    +.rd
    +.fi
    +Body of letter.
    +.bp
    +.nx repeat.let
    +
    + + +

    When this is run, a file containing the following lines should be +redirected in. Requests included in this file are executed as though +they were part of the form letter. The last block of input is the +ex request, which tells GNU troff to stop processing. If +this were not there, troff would not know when to stop. +

    +
    +
    Trent A. Fisher
    +708 NW 19th Av., #202
    +Portland, OR  97209
    +
    +Dear Trent,
    +
    +Len Adollar
    +4315 Sierra Vista
    +San Diego, CA  92103
    +
    +Dear Mr. Adollar,
    +
    +.ex
    +
    + +
    +
    Request: .pi pipe
    +
    +

    Pipe the output of gtroff to the shell command(s) specified by +pipe. This request must occur before gtroff has a chance +to print anything. +

    + + + + +

    It is an error to use this request in safer mode, which is the +default. Invoke GNU troff or a front end with the -U +option to enable unsafe mode. +

    +

    Multiple calls to pi are allowed, acting as a chain. For +example, +

    +
    +
    .pi foo
    +.pi bar
    +...
    +
    + +

    is the same as ‘.pi foo | bar. +

    + + +

    The intermediate output format of GNU troff is piped to the +specified commands. Consequently, calling groff without the +-Z option normally causes a fatal error. +

    + + + +
    +
    Request: .sy cmds
    +
    +
    Register: \n[systat]
    +
    +

    Execute the shell command(s) specified by cmds. The output is not +saved anywhere, so it is up to the user to do so. +

    + + + + +

    It is an error to use this request in safer mode; this is the default. +Give GNU troff or a front end program the -U option to +enable unsafe mode. +

    +

    The following code fragment introduces the current time into a document. +

    + +
    +
    .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\
    +             (localtime(time))[2,1,0]' > /tmp/x\n[$$]
    +.so /tmp/x\n[$$]
    +.sy rm /tmp/x\n[$$]
    +\nH:\nM:\nS
    +
    + +

    This works by having the Perl script (run by sy) write +nr requests that set the registers H, M, and +S to a temporary file. The roff document then reads the +temporary file using the so request. +

    + + +

    The registers seconds, minutes, and hours, +initialized at startup of GNU troff, should satisfy most +requirements. Use the af request to format their values for +output. +

    +
    +
    .af hours 00
    +.af minutes 00
    +.af seconds 00
    +\n[hours]:\n[minutes]:\n[seconds]
    +    ⇒ 02:17:54
    +
    + + +

    The writable register systat contains the return value of the +system() function executed by the last sy request. +

    + +
    +
    Request: .open stream file
    +
    +
    Request: .opena stream file
    +
    + + + + +

    Open the specified file for writing and associates the specified +stream with it. +

    +

    The opena request is like open, but if the file exists, +append to it instead of truncating it. +

    + + + + +

    It is an error to use these requests in safer mode; this is the default. +Give GNU troff or a front end program the -U option to +enable unsafe mode. +

    + +
    +
    Request: .write stream data
    +
    +
    Request: .writec stream data
    +
    + + + + + + + + +

    Write to the file associated with the specified stream. The +stream must previously have been the subject of an open request. The +remainder of the line is interpreted as the ds request reads its +second argument: an initial neutral double quote in contents is +stripped to allow embedding of leading spaces, and it is read in copy +mode. +

    +

    The writec request is like write, but only write +appends a newline to the data. +

    + +
    +
    Request: .writem stream xx
    +
    + +

    Write the contents of the macro or string xx to the file +associated with the specified stream. +

    + + + +

    xx is read in copy mode, i.e., already formatted elements are +ignored. Consequently, diversions must be unformatted with the +asciify request before calling writem. Usually, this +means a loss of information. +

    + +
    +
    Request: .close stream
    +
    + + +

    Close the specified stream; the stream is no longer an acceptable +argument to the write request. +

    +

    Here a simple macro to write an index entry. +

    +
    +
    .open idx test.idx
    +.
    +.de IX
    +.  write idx \\n[%] \\$*
    +..
    +.
    +.IX test entry
    +.
    +.close idx
    +
    +
    + +
    +
    Escape sequence: \Ve
    +
    +
    Escape sequence: \V(ev
    +
    Escape sequence: \V[env]
    +
    + + +

    Interpolate the contents of the specified environment variable env +(one-character name e, two-character name ev) as +returned by the function getenv(3). \V is interpreted +even in copy mode (see Copy Mode). +

    + + + +
    +
    +
    + +

    5.34 Postprocessor Access

    + + + +

    Two escape sequences and two requests enable documents to pass +information directly to a postprocessor. These are useful for +exercising device-specific capabilities that the groff language +does not abstract or generalize; examples include the embedding of +hyperlinks and image files. Device-specific functions are documented in +each output driver’s man page, such as gropdf(1), +grops(1), or grotty(1). +

    +
    +
    Request: .device xxx
    +
    +
    Escape sequence: \X'xxx '
    +
    +

    Embed all xxx arguments into GNU troff output as parameters +to a device control command ‘x X. The meaning and +interpretation of such parameters is determined by the output driver or +other postprocessor. +

    + + + +

    The device request processes its arguments in copy mode +(see Copy Mode). An initial neutral double quote in contents +is stripped to allow embedding of leading spaces. + + + + +By contrast, within \X arguments, the escape sequences \&, +\), \%, and \: are ignored; \SP and +\~ are converted to single space characters; and \\ has +its escape character stripped. So that the basic Latin subset of the +Unicode character set115 can be reliably encoded in device control +commands, seven special character escape sequences (‘\-’, +‘\[aq]’, ‘\[dq]’, ‘\[ga]’, ‘\[ha]’, ‘\[rs]’, +and ‘\[ti]’,) are mapped to basic Latin characters; see the +groff_char(7) man page. For this transformation, character +translations and special character definitions are +ignored.116 The use of any +other escape sequence in \X parameters is normally an error. +

    + + + +

    If the use_charnames_in_special directive appears in the output +device’s DESC file, the use of special character escape sequences +is not an error; they are simply output verbatim (with the +exception of the seven mapped to Unicode basic Latin characters, +discussed above). use_charnames_in_special is currently employed +only by grohtml. +

    + +
    +
    Request: .devicem name
    +
    +
    Escape sequence: \Yn
    +
    +
    Escape sequence: \Y(nm
    +
    Escape sequence: \Y[name]
    +

    This is approximately equivalent to ‘\X'\*[name]'’ +(one-character name n, two-character name nm). +However, the contents of the string or macro name are not +interpreted; also it is permitted for name to have been defined as +a macro and thus contain newlines (it is not permitted for the argument +to \X to contain newlines). The inclusion of newlines requires +an extension to the AT&T troff output format, and +confuses drivers that do not know about this extension (see Device Control Commands). +

    + +
    +
    Request: .tag name
    +
    +
    Request: .taga name
    +
    +

    Reserved for internal use. +

    + + + +
    +
    +
    + +

    5.35 Miscellaneous

    + +

    We document here GNU troff features that fit poorly elsewhere. +

    +
    +
    Request: .nm [start [increment [space [indentation]]]]
    +
    +
    Register: \n[ln]
    +
    +
    Register: \n[.nm]
    +
    + + + +

    Begin (or, with no arguments, cease) numbering output lines. +start assigns the number of the next output line. Only +line numbers divisible by increment are marked (default: +‘1’). space configures the horizontal spacing between the +number and the text (default: ‘1’). Any given indentation is +applied to the numbers (default: ‘0’). The third and fourth +arguments are reckoned in numeral widths (\0). start must +be non-negative and increment positive. +

    +

    The formatter aligns the number to the right in a width of three numeral +spaces plus indentation, then catenates space and the output +line. The line length is not reduced. Depending on the value of +the page offset,117 numbers wider than +the allocated space protrude into the left margin, or shift the output +line to the right. +

    +

    Line numbering parameters corresponding to missing arguments are not +altered. After numbering is disabled, ‘.nm +0’ resumes it using +the previously active parameters. +

    +

    The parameters of nm are associated with the environment +(see Environments). +

    + + +

    While numbering is enabled, the output line number register ln is +updated as each line is output, even if no line number is formatted with +it because it is being skipped (it is not a multiple of increment) +or because numbering is suppressed (see the nn request below). +

    +

    The .nm register tracks the enablement status of numbering. +Temporary suspension of numbering with the nn request does +not alter its value. +

    +
    +
    .po 5n
    +.ll 44n
    +Programming,
    +when stripped of all its circumstantial irrelevancies,
    +.nm 999 1 1 -4
    +boils down to no more and no less than
    +.nm +0 3
    +very effective thinking so as to avoid unmastered
    +.nn 2
    +complexity,
    +to very vigorous separation of your many
    +different concerns.
    +.br
    +\(em Edsger Dijkstra
    +.sp
    +.nm 1 1 1
    +This guy's arrogance takes your breath away.
    +.br
    +\(em John Backus
    +    ⇒      Programming,  when  stripped of all its cir-
    +    ⇒  999 cumstantial irrelevancies, boils down to  no
    +    ⇒      more  and no less than very effective think-
    +    ⇒      ing so as to avoid unmastered complexity, to
    +    ⇒      very vigorous separation of your  many  dif-
    +    ⇒      ferent concerns.
    +    ⇒ 1002 -- Edsger Dijkstra
    +    ⇒
    +    ⇒    1 This guy’s arrogance takes your breath away.
    +    ⇒    2 -- John Backus
    +
    +
    + +
    +
    Request: .nn [skip]
    +
    +
    Register: \n[.nn]
    +
    +

    Suppress numbering of the next skip output lines that would +otherwise be numbered. The default is 1. nn can be invoked +when line numbering is not active; suppression of numbering will take +effect for skip lines once nm enables it. +

    +

    The .nn register stores the count of output lines still to have +their numbering suppressed. +

    +

    This count is associated with the environment (see Environments). +

    + +

    To test whether the current output line will be numbered, you must check +both the .nm and .nn registers. +

    +
    +
      .de is-numbered
    +  .  nop This line
    +  .  ie (\\n[.nm] & (1-\\n[.nn])) IS
    +  .  el                           ISN'T
    +  .  nop numbered.
    +  .  br
    +  ..
    +  Test line numbering.
    +  .is-numbered
    +  .nm 1
    +  .nn 1
    +  .is-numbered
    +  .is-numbered
    +  .nm
    +  .is-numbered
    +    ⇒ Test line numbering.  This line ISN’T numbered.
    +    ⇒ This line ISN’T numbered.
    +    ⇒   1 This line IS numbered.
    +    ⇒ This line ISN’T numbered.
    +
    + +
    +
    Request: .mc [margin-character [distance]
    +
    + + +

    Begin (or, with no arguments, cease) writing a margin-character to +the right of each output line. The distance argument separates +margin-character from the right margin. If absent, the most +recent value is used; the default is 10 points. If an output line +exceeds the line length, the margin character is appended to it. + +No margin character is written on lines produced by the tl +request. +

    +

    The margin character is a property of the output line; the margin +character last configured when the line is output controls. If the +margin character is disabled before an output line breaks, none is +output (but see below). +

    +

    The margin character is associated with the environment +(see Environments). +

    +
    +
    .ll 5i
    +.nf
    +.mc \[br]
    +This paragraph is marked with a margin character.
    +.sp
    +As seen above, vertical space isn't thus marked.
    +\&
    +An output line that is present, but empty, is.
    +    ⇒ This paragraph is marked with a margin character.  |
    +    ⇒
    +    ⇒ As seen above, vertical space isn’t thus marked.   |
    +    ⇒                                                    |
    +    ⇒ An output line that is present, but empty, is.     |
    +
    +
    + +

    For compatibility with AT&T troff, a call to mc +to set the margin character can’t be undone immediately; at least one +line gets a margin character. +

    +
    +
    .ll 10n
    +.nf
    +.mc |
    +.mc *
    +.mc
    +foo
    +bar
    +    ⇒ foo        *
    +    ⇒ bar
    +
    + + + + + +

    The margin character mechanism is commonly used to annotate changes in +documents. The groff distribution ships a program, +gdiffmk, to assist with this task.118 +

    +
    +
    Request: .psbb file
    +
    +
    Register: \n[llx]
    +
    +
    Register: \n[lly]
    +
    +
    Register: \n[urx]
    +
    +
    Register: \n[ury]
    +
    + + +

    Retrieve the bounding box of the PostScript image found in file, +which must conform to Adobe’s Document Structuring Conventions +(DSC), locate a %%BoundingBox comment, and store the (upper-, +lower-, -left, -right) values into the registers llx, +lly, urx, and ury. If an error occurs (for +example, if no %%BoundingBox comment is present), the formatter +sets these registers to 0. +

    +

    The search path for file can be controlled with the -I +command-line option. +

    + + + + +
    +
    +
    + +

    5.36 gtroff Internals

    + + + + + +

    gtroff processes input in three steps. One or more input +characters are converted to an input token.119 Then, one or more input tokens are converted to +an output node. Finally, output nodes are converted to the +intermediate output language understood by all output devices. +

    +

    Actually, before step one happens, gtroff converts certain escape +sequences into reserved input characters (not accessible by the user); +such reserved characters are used for other internal processing also – +this is the very reason why not all characters are valid input. +See Identifiers, for more on this topic. +

    +

    For example, the input string ‘fi\[:u]’ is converted into a +character token ‘f’, a character token ‘i’, and a special +token ‘:u’ (representing u umlaut). Later on, the character +tokens ‘f’ and ‘i’ are merged to a single output node +representing the ligature glyph ‘fi’ (provided the current font has +a glyph for this ligature); the same happens with ‘:u’. All output +glyph nodes are ‘processed’, which means that they are invariably +associated with a given font, font size, advance width, etc. During the +formatting process, gtroff itself adds various nodes to control +the data flow. +

    +

    Macros, diversions, and strings collect elements in two chained lists: a +list of input tokens that have been passed unprocessed, and a list of +output nodes. Consider the following diversion. +

    +
    +
    .di xxx
    +a
    +\!b
    +c
    +.br
    +.di
    +
    + +

    It contains these elements. +

    + + + + + + + + + + + + +
    node listtoken listelement number
    line start node1
    glyph node a2
    word space node3
    b4
    \n5
    glyph node c6
    vertical size node7
    vertical size node8
    \n9
    + + +

    Elements 1, 7, and 8 are inserted by gtroff; the latter two +(which are always present) specify the vertical extent of the last line, +possibly modified by \x. The br request finishes the +pending output line, inserting a newline input token, which is +subsequently converted to a space when the diversion is reread. Note +that the word space node has a fixed width that isn’t adjustable +anymore. To convert horizontal space nodes back to input tokens, use +the unformat request. +

    +

    Macros only contain elements in the token list (and the node list is +empty); diversions and strings can contain elements in both lists. +

    +

    The chop request simply reduces the number of elements in a +macro, string, or diversion by one. Exceptions are compatibility +save and compatibility ignore input tokens, which are ignored. +The substring request also ignores those input tokens. +

    +

    Some requests like tr or cflags work on glyph identifiers +only; this means that the associated glyph can be changed without +destroying this association. This can be very helpful for substituting +glyphs. In the following example, we assume that glyph ‘foo’ isn’t +available by default, so we provide a substitution using the +fchar request and map it to input character ‘x’. +

    +
    +
    .fchar \[foo] foo
    +.tr x \[foo]
    +
    + +

    Now let us assume that we install an additional special font ‘bar’ +that has glyph ‘foo’. +

    +
    +
    .special bar
    +.rchar \[foo]
    +
    + +

    Since glyphs defined with fchar are searched before glyphs in +special fonts, we must call rchar to remove the definition of the +fallback glyph. Anyway, the translation is still active; ‘x’ now +maps to the real glyph ‘foo’. +

    + + + + + + +

    Macro and request arguments preserve compatibility mode enablement. +

    +
    +
    .cp 1     \" switch to compatibility mode
    +.de xx
    +\\$1
    +..
    +.cp 0     \" switch compatibility mode off
    +.xx caf\['e]
    +    ⇒ café
    +
    + +

    Since compatibility mode is enabled while de is invoked, the +macro xx enables compatibility mode when it is called. Argument +$1 can still be handled properly because it inherits the +compatibility mode enablement status that was active at the point where +xx was called. +

    +

    After interpolation of the parameters, the compatibility save and +restore tokens are removed. +

    + + + +
    +
    +
    + +

    5.37 Debugging

    + + +

    Standard troff voodoo, just put a power of two backslashes in +front of it until it works and if you still have problems add a \c. +— Ron Natalie +

    +

    GNU troff is not the easiest language to debug, in part thanks to +its design features of recursive interpolation and the use of +multi-stage pipeline processing in the surrounding system. Nevertheless +there exist several features useful for troubleshooting. +

    +

    Preprocessors use the lf request to preserve the identity of the +line numbers and names of input files. GNU troff emits a variety +of error diagnostics and supports several categories of warning; the +output of these can be selectively suppressed. A trace of the +formatter’s input processing stack can be emitted when errors or +warnings occur by means of GNU troff’s -b option, or +produced on demand with the backtrace request. The tm +and related requests can be used to emit customized diagnostic messages +or for instrumentation while troubleshooting. The ex and +ab requests cause early termination with successful and error +exit codes respectively, to halt further processing when continuing +would be fruitless. Examine the state of the formatter with requests +that write lists of defined names (macros, strings, and diversions), +environments, registers, and page location traps to the standard error +stream. +

    +
    +
    Request: .lf line [file]
    +
    + + + + + + +

    Set the input line number (and, optionally, the file name) GNU +troff shall use for error and warning messages. line is +the input line number of the next line. Without an argument, the +request is ignored. +

    +

    lf’s primary purpose is to aid the debugging of documents that +undergo preprocessing. Programs like tbl that transform input +in their own languages into roff requests use it so that any +diagnostic messages emitted by troff correspond to the source +document. +

    + +
    +
    Request: .tm message
    +
    +
    Request: .tm1 message
    +
    +
    Request: .tmc message
    +
    + + +

    Send message, which consumes the remainder of the input line and +cannot contain special characters, to the standard error stream, +followed by a newline. Leading spaces in message are ignored. +

    +

    tm1 is similar, but recognizes and strips a leading neutral +double quote from message to allow the embedding of leading +spaces. +

    +

    tmc works as tm1, but does not append a newline. +

    + +
    +
    Request: .ab [message]
    +
    + +

    Write any message to the standard error stream (like tm) +and then abort GNU troff; that is, stop processing and terminate +with a failure status. +

    + +
    +
    Request: .ex
    +
    + + +

    Exit GNU troff; that is, stop processing and terminate with a +successful status. To stop processing only the current file, use the +nx request; see I/O. +

    + +

    When doing something involved, it is useful to leave the debugging +statements in the code and have them turned on by a command-line flag. +

    +
    +
    .if \n[DB] .tm debugging output
    +
    + +

    To activate such statements, use the -r option to set the +register. +

    +
    +
    groff -rDB=1 file
    +
    + +

    If it is known in advance that there are many errors and no useful +output, GNU troff can be forced to suppress formatted output with +the -z option. +

    +
    +
    Request: .pev
    +
    + + +

    Report the state of the current environment followed by that of all +other environments to the standard error stream. +

    + +
    +
    Request: .pm
    +
    + + +

    Report, to the standard error stream, the names of all defined macros, +strings, and diversions with their sizes in bytes. +

    + +
    +
    Request: .pnr
    +
    + + +

    Report the names and contents of all currently defined registers to the +standard error stream. +

    + +
    +
    Request: .ptr
    +
    + + + + +

    Report the names and positions of all page location traps to the +standard error stream. Empty slots in the list, where a trap has been +planted but subsequently (re)moved, are printed as well. +

    + +
    +
    Request: .fl
    +
    + + + + +

    Instruct gtroff to flush its output immediately. The intent is +for interactive use, but this behaviour is currently not implemented in +gtroff. Contrary to Unix troff, TTY output is sent to a +device driver also (grotty), making it non-trivial to communicate +interactively. +

    +

    This request causes a line break. +

    + +
    +
    Request: .backtrace
    +
    + + +

    Write the state of the input stack to the standard error stream. +

    +

    Consider the following in a file test. +

    +
    +
    .de xxx
    +.  backtrace
    +..
    +.de yyy
    +.  xxx
    +..
    +.
    +.yyy
    +    error→ troff: backtrace: 'test':2: macro 'xxx'
    +    error→ troff: backtrace: 'test':5: macro 'yyy'
    +    error→ troff: backtrace: file 'test':8
    +
    + +

    The -b option of GNU troff causes a backtrace to be +generated on each error or warning. Some warnings have to be enabled; +See Warnings. +

    + +
    +
    Register: \n[slimit]
    +
    + +

    If greater than 0, sets the maximum quantity of objects on GNU +troff’s internal input stack. If less than or equal to 0, +there is no limit: recursion can continue until program memory is +exhausted. The default is 1,000. +

    + +
    +
    Request: .warnscale su
    +
    +

    Set the scaling unit used in certain warnings to su, which can take the values ‘u’, ‘i’, ‘c’, +‘p’, and ‘P’. The default is ‘i’. +

    + +
    +
    Request: .spreadwarn [limit]
    +
    +

    Emit a break warning if the additional space inserted for each +space between words in an output line adjusted to both margins with +‘.ad b is larger than or equal to limit. A negative +value is treated as zero; an absent argument toggles the warning on and +off without changing limit. The default scaling unit is ‘m’. +At startup, spreadwarn is inactive and limit is 3m. +

    +

    For example, +

    +
    +
    .spreadwarn 0.2m
    +
    + +

    causes a warning if break warnings are not suppressed and +gtroff must add 0.2m or more for each inter-word space in a +line. See Warnings. +

    + + +

    GNU troff has command-line options for reporting warnings +(-w) and backtraces (-b) when a warning or an error +occurs. +

    +
    +
    Request: .warn [n]
    +
    +
    Register: \n[.warn]
    +
    + +

    Select the categories, or “types”, of reported warnings. +n is the sum of the numeric codes associated with each +warning category that is to be enabled; all other categories are +disabled. The categories and their associated codes are listed in +Warnings. For example, ‘.warn 0’ disables all warnings, and +‘.warn 1’ disables all warnings except those about missing glyphs. +If no argument is given, all warning categories are enabled. +

    +

    The read-only register .warn contains the sum of the numeric +codes of enabled warning categories. +

    + + + + +
    +
    + +

    5.37.1 Warnings

    + + +

    Warning diagnostics emitted by GNU troff are divided into named, +numbered categories. The name associated with each warning category is +used by the -w and -W options. Each category is also +assigned a power of two; the sum of enabled category values is used by +the warn request and the .warn register. +

    +

    Warnings of each category are produced under the following +circumstances. +

    + + +
    +
    char
    +
    1
    +

    No mounted font defines a glyph for the requested character. This +category is enabled by default. +

    +
    +
    number
    +
    2
    +

    An invalid numeric expression was encountered. This category is enabled +by default. +See Numeric Expressions. +

    +
    +
    break
    +
    4
    +
    +

    A filled output line could not be broken such that its length was less +than the output line length ‘\n[.l]’. This category is enabled by +default. +

    +
    +
    delim
    +
    8
    +

    The closing delimiter in an escape sequence was missing or mismatched. +

    +
    +
    el
    +
    16
    +
    +

    The el request was encountered with no prior corresponding +ie request. See if-else. +

    +
    +
    scale
    +
    32
    +

    A scaling unit inappropriate to its context was used in a numeric +expression. +

    +
    +
    range
    +
    64
    +

    A numeric expression was out of range for its context. +

    +
    +
    syntax
    +
    128
    +

    A self-contradictory hyphenation mode was requested; an empty or +incomplete numeric expression was encountered; an operand to a numeric +operator was missing; an attempt was made to define a recursive, empty, +or nonsensical character class; or a groff extension conditional +expression operator was used while in compatibility mode. +

    +
    +
    di
    +
    256
    +
    + + +

    A di, da, box, or boxa request was invoked +without an argument when there was no current diversion. +

    +
    +
    mac
    +
    512
    +
    + + + + + + +

    An undefined string, macro, or diversion was used. When such an object +is dereferenced, an empty one of that name is automatically created. +So, unless it is later deleted, at most one warning is given for each. +

    +

    This warning is also emitted upon an attempt to move an unplanted trap +macro (see Page Location Traps). In such cases, the unplanted macro +is not dereferenced, so it is not created if it does not exist. +

    +
    +
    reg
    +
    1024
    +
    + +

    An undefined register was used. When an undefined register is +dereferenced, it is automatically defined with a value of 0. So, +unless it is later deleted, at most one warning is given for each. +

    +
    +
    tab
    +
    2048
    +

    A tab character was encountered where a number was expected, or appeared +in an unquoted macro argument. +

    +
    +
    right-brace
    +
    4096
    +

    A right brace escape sequence \} was encountered where a number +was expected. +

    +
    +
    missing
    +
    8192
    +

    A request was invoked with a mandatory argument absent. +

    +
    +
    input
    +
    16384
    +

    An invalid character occurred on the input stream. +

    +
    +
    escape
    +
    32768
    +

    An unsupported escape sequence was encountered. +

    +
    +
    space
    +
    65536
    +

    A space was missing between a request or macro and its argument. This +warning is produced when an undefined name longer than two characters is +encountered and the first two characters of the name constitute a +defined name. No request is invoked, no macro called, and an empty +macro is not defined. This category is enabled by default. It never +occurs in compatibility mode. +

    +
    +
    font
    +
    131072
    +

    A non-existent font was selected, or the selection was ignored because a +font selection escape sequence was used after the output line +continuation escape sequence on an input line. This category is enabled +by default. +

    +
    +
    ig
    +
    262144
    +

    An invalid escape sequence occurred in input ignored using the ig +request. This warning category diagnoses a condition that is an error +when it occurs in non-ignored input. +

    +
    +
    color
    +
    524288
    +

    An undefined color was selected, an attempt was made to define a color +using an unrecognized color space, an invalid component in a color +definition was encountered, or an attempt was made to redefine a default +color. +

    +
    +
    file
    +
    1048576
    +

    An attempt was made to load a file that does not exist. This category +is enabled by default. +

    +
    + +

    Two warning names group other warning categories for convenience. +

    +
    +
    all
    +

    All warning categories except ‘di’, ‘mac’ and ‘reg’. +This shorthand is intended to produce all warnings that are useful with +macro packages written for AT&T troff and its +descendants, which have less fastidious diagnostics than GNU +troff. +

    +
    +
    w
    +

    All warning categories. Authors of documents and macro packages +targeting groff are encouraged to use this setting. +

    +
    + + +
    +
    +
    +
    + +

    5.38 Implementation Differences

    + + + + +

    GNU troff has a number of features that cause incompatibilities +with documents written for other versions of troff. Some GNU +extensions to troff have become supported by other +implementations. +

    + + + +
    +
    + +

    5.38.1 Safer Mode

    + + + + + +

    The formatter operates in “safer” mode by default; to mitigate risks +from untrusted input documents, the pi and sy requests are +disabled. GNU troff’s -U option enables “unsafe +mode”, restoring their function and enabling additional groff +extension requests, open, opena, and pso. +See I/O. +

    + +
    +
    +
    + +

    5.38.2 Compatibility Mode

    + + + + + + + +

    Long identifier names may be GNU troff’s most obvious innovation. +AT&T troff interprets ‘.dsabcd’ as defining a +string ‘ab’ with contents ‘cd’. Normally, GNU troff +interprets this as a call of a macro named dsabcd. +AT&T troff also interprets ‘\*[’ and ‘\n[’ as +an interpolation of a string or register, respectively, named ‘[’. +In GNU troff, however, the ‘[’ is normally interpreted as +delimiting a long name. In compatibility mode, GNU troff +interprets names in the traditional way; they thus can be two characters +long at most. +

    +
    +
    Request: .cp [n]
    +
    +
    Register: \n[.C]
    +
    +

    If n is missing or non-zero, turn on compatibility mode; +otherwise, turn it off. +

    +

    The read-only register .C is 1 if compatibility mode is on, +0 otherwise. +

    +

    Compatibility mode can be also turned on with the -C +command-line option. +

    + +
    +
    Request: .do name
    +
    +
    Register: \n[.cp]
    +
    +

    The do request interprets the string, request, diversion, or +macro name (along with any further arguments) with compatibility +mode disabled. Compatibility mode is restored (only if it was active) +when the expansion of name is interpreted; that is, the +restored compatibility state applies to the contents of the macro, +string, or diversion name as well as data read from files or pipes +if name is any of the so, soquiet, mso, +msoquiet, or pso requests. +

    +

    The following example illustrates several aspects of do behavior. +

    +
    +
    .de mac1
    +FOO
    +..
    +.de1 mac2
    +groff
    +.mac1
    +..
    +.de mac3
    +compatibility
    +.mac1
    +..
    +.de ma
    +\\$1
    +..
    +.cp 1
    +.do mac1
    +.do mac2 \" mac2, defined with .de1, calls "mac1"
    +.do mac3 \" mac3 calls "ma" with argument "c1"
    +.do mac3 \[ti] \" groff syntax accepted in .do arguments
    +    ⇒ FOO groff FOO compatibility c1 ~
    +
    + +

    The read-only register .cp, meaningful only when dereferenced +from a do request, is 1 if compatibility mode was on when +the do request was encountered, and 0 if it was not. This +register is specialized and may require a statement of rationale. +

    +

    When writing macro packages or documents that use GNU troff +features and which may be mixed with other packages or documents that do +not—common scenarios include serial processing of man pages or use of +the so or mso requests—you may desire correct operation +regardless of compatibility mode enablement in the surrounding context. +It may occur to you to save the existing value of ‘\n(.C’ into a +register, say, ‘_C’, at the beginning of your file, turn +compatibility mode off with ‘.cp 0’, then restore it from that +register at the end with ‘.cp \n(_C’. At the same time, a modular +design of a document or macro package may lead you to multiple layers of +inclusion. You cannot use the same register name everywhere lest you +“clobber” the value from a preceding or enclosing context. The +two-character register name space of AT&T troff is +confining and mnemonically challenging; you may wish to use the more +capacious name space of GNU troff. However, attempting ‘.nr +_my_saved_C \n(.C’ will not work in compatibility mode; the register +name is too long. “This is exactly what do is for,” you think, +‘.do nr _my_saved_C \n(.C’. The foregoing will always save zero to +your register, because do turns compatibility mode off +while it interprets its argument list. +

    +

    To robustly save compatibility mode before switching it off, use +

    +
    +
    .do nr _my_saved_C \n[.cp]
    +.cp 0
    +
    + +

    at the beginning of your file, followed by +

    +
    +
    .cp \n[_my_saved_C]
    +.do rr _my_saved_C
    +
    + +

    at the end. As in the C language, we all have to share one big +name space, so choose a register name that is unlikely to collide with +other uses. +

    + + + + +

    Normally, GNU troff preserves the interpolation depth in +delimited arguments, but not in compatibility mode. +

    +
    +
    .ds xx '
    +\w'abc\*(xxdef'
    +    ⇒ 168 (normal mode on a terminal device)
    +    ⇒ 72def' (compatibility mode on a terminal device)
    +
    + + + + + +

    Furthermore, the escape sequences \f, \H, \m, +\M, \R, \s, and \S are transparent for the +purpose of recognizing a control character at the beginning of a line +only in compatibility mode. For example, this code produces bold output +in both cases, but the text differs. +

    +
    +
    .de xx
    +Hello!
    +..
    +\fB.xx\fP
    +    ⇒ .xx (normal mode)
    +    ⇒ Hello! (compatibility mode)
    +
    + + +

    Normally, the syntax form \sn accepts only a single +character (a digit) for n, consistently with other forms that +originated in AT&T troff, like \*, \$, +\f, \g, \k, \n, and \z. In +compatibility mode only, a non-zero n must be in the range +4–39. Legacy documents relying upon this quirk of parsing120 should be migrated to another +\s form. +

    + +
    +
    +
    + +

    5.38.3 Other Differences

    + +

    groff request names unrecognized by other troff +implementations will likely be ignored by them; escape sequences that +are groff extensions are liable to be interpreted as if the +escape character were not present. + +For example, the adjustable, non-breaking escape sequence \~ +is also supported by Heirloom Doctools troff 050915 (September +2005), mandoc 1.9.5 (2009-09-21), neatroff (commit +1c6ab0f6e, 2016-09-13), and Plan 9 from User Space troff +(commit 93f8143600, 2022-08-12), but not by Solaris or Documenter’s +Workbench troffs. +See Manipulating Filling and Adjustment. +

    + + + + + + + + + + + + + + +

    GNU troff does not allow the use of the escape sequences +\|, \^, \&, \{, \}, +\SP, \', \`, \-, \_, \!, +\%, and \c in identifiers; AT&T troff +does. The \A escape sequence (see Identifiers) may be +helpful in avoiding use of these escape sequences in names. +

    + + +

    When adjusting to both margins, AT&T troff at first +adjusts spaces starting from the right; GNU troff begins from +the left. Both implementations adjust spaces from opposite ends on +alternating output lines in this adjustment mode to prevent “rivers” +in the text. +

    + +

    GNU troff does not always hyphenate words as AT&T +troff does. The AT&T implementation uses a set of +hard-coded rules specific to English, while GNU troff uses +language-specific hyphenation pattern files derived from TeX. +Furthermore, in old versions of troff there was a limited amount +of space to store hyphenation exceptions (arguments to the hw +request); GNU troff has no such restriction. +

    + +

    GNU troff predefines a string .T containing the argument +given to the -T command-line option, namely the current output +device (for example, ‘pdf’ or ‘utf8’). The existence of this +string is a common feature of post-CSTR #54 +troffs121 but valid values are specific +to each implementation. +

    + + + +

    AT&T troff ignored attempts to remove read-only +registers; GNU troff honors such requests. See Built-in Registers. +

    + +

    The (read-only) register .T interpolates 1 if GNU +troff is called with the -T command-line option, and +0 otherwise. This behavior differs from AT&T troff, which +interpolated 1 only if nroff was the formatter and was +called with -T. +

    + +

    AT&T troff and other implementations handle the +lf request differently. For them, its line argument +changes the line number of the current line. +

    + +

    AT&T troff had only environments named ‘0’, +‘1’, and ‘2’. In GNU troff, any number of environments +may exist, using any valid identifiers for their names +(see Identifiers.) +

    + + + + + + +

    Fractional type sizes cause one noteworthy incompatibility. In +AT&T troff the ps request ignores scaling units +and thus ‘.ps 10u’ sets the type size to 10 points, whereas in +GNU troff it sets the type size to 10 scaled points. +See Using Fractional Type Sizes. +

    + +

    The ab request differs from AT&T troff: +GNU troff writes no message to the standard error stream if no +arguments are given, and it exits with a failure status instead of a +successful one. +

    + +

    The bp request differs from AT&T troff: +GNU troff does not accept a scaling unit on the argument, a page +number; the former (somewhat uselessly) does. +

    + +

    The pm request differs from AT&T troff: +GNU troff reports the sizes of macros, strings, and diversions in +bytes and ignores an argument to report only the sum of the sizes. +

    + +

    Unlike AT&T troff, GNU troff does not ignore the +ss request if the output is a terminal device; instead, the +values of minimal inter-word and additional inter-sentence space are +each rounded down to the nearest multiple of 12. +

    + + + + + + + + +

    In GNU troff there is a fundamental difference between +(unformatted) characters and (formatted) glyphs. Everything that +affects how a glyph is output is stored with the glyph node; once a +glyph node has been constructed, it is unaffected by any subsequent +requests that are executed, including bd, cs, tkf, +tr, or fp requests. Normally, glyphs are constructed from +characters immediately before the glyph is added to an output line. +Macros, diversions, and strings are all, in fact, the same type of +object; they contain a sequence of intermixed character and glyph nodes. +Special characters transform from one to the other: before being added +to the output, they behave as characters; afterward, they are glyphs. A +glyph node does not behave like a character node when it is processed by +a macro: it does not inherit any of the special properties that the +character from which it was constructed might have had. For example, +the input +

    +
    +
    .di x
    +\\\\
    +.br
    +.di
    +.x
    +
    + +

    produces ‘\\’ in GNU troff. Each pair of backslashes +becomes one backslash glyph; the resulting backslashes are thus +not interpreted as escape characters when they are reread as the +diversion is output. AT&T troff would interpret +them as escape characters when rereading them and end up printing one +‘\’. +

    + + + + + + + +

    One correct way to obtain a printable backslash in most documents is to +use the \e escape sequence; this always prints a single instance +of the current escape character,122 regardless of whether or not it is used in a diversion; it +also works in both GNU troff and AT&T troff. +

    +

    The other correct way, appropriate in contexts independent of the +backslash’s common use as a troff escape character—perhaps in +discussion of character sets or other programming languages—is +the character escape \(rs or \[rs], for “reverse +solidus”, from its name in the ECMA-6 (ISO/IEC 646) +standard.123 +

    +

    To store an escape sequence in a diversion that is interpreted when the +diversion is reread, either use the traditional \! transparent +output facility, or, if this is unsuitable, the new \? escape +sequence. See Diversions and gtroff Internals. +

    +

    In the somewhat pathological case where a diversion exists containing a +partially collected line and a partially collected line at the top-level +diversion has never existed, AT&T troff will output the +partially collected line at the end of input; GNU troff will not. +

    + + + + +
    +
    +
    +
    +
    + +

    6 File Formats

    + + + +

    All files read and written by gtroff are text files. The +following two sections describe their format. +

    + + + + + +
    +
    + +

    6.1 gtroff Output

    + + + +

    This section describes the groff intermediate output format +produced by GNU troff. +

    +

    As groff is a wrapper program around GNU troff and +automatically calls an output driver (or “postprocessor”), this output +does not show up normally. This is why it is called +intermediate. groff provides the option -Z to +inhibit postprocessing such that the produced intermediate output is +sent to standard output just as it is when calling GNU troff +directly. +

    + + + + +

    Here, the term troff output describes what is output by +GNU troff, while intermediate output refers to the language +that is accepted by the parser that prepares this output for the output +drivers. This parser handles whitespace more flexibly than +AT&T’s implementation and implements obsolete elements for +compatibility; otherwise, both formats are the same.124 +

    +

    The main purpose of the intermediate output concept is to facilitate the +development of postprocessors by providing a common programming +interface for all devices. It has a language of its own that is +completely different from the gtroff language. While the +gtroff language is a high-level programming language for text +processing, the intermediate output language is a kind of low-level +assembler language by specifying all positions on the page for writing +and drawing. +

    +

    The intermediate output produced by gtroff is fairly readable, +while output from AT&T troff is rather hard to +understand because of strange habits that are still supported, but not +used any longer by gtroff. +

    + + + +
    +
    + +

    6.1.1 Language Concepts

    + +

    The fundamental operation of the GNU troff formatter is the +translation of the groff input language into a device-independent +form primarily concerned with what has to be written or drawn at +specific positions on the output device. This language is simple and +imperative. In the following discussion, the term command always +refers to this intermediate output language, and never to the +groff language intended for direct use by document authors. +Intermediate output commands comprise several categories: glyph output; +font, color, and text size selection; motion of the printing position; +page advancement; drawing of geometric objects; and device control +commands, a catch-all for operations not easily classified as any of the +foregoing, such as directives to start and stop output, identify the +intended output device, or place URL hyperlinks in supported output +formats. +

    + + +
    +
    + +

    6.1.1.1 Separation

    + +

    AT&T troff output has strange requirements regarding +whitespace. The gtroff output parser, however, is more tolerant, +making whitespace maximally optional. Such characters, i.e., the tab, +space, and newline, always have a syntactical meaning. They are never +printable because spacing within the output is always done by +positioning commands. +

    +

    Any sequence of space or tab characters is treated as a single +syntactical space. It separates commands and arguments, but is +only required when there would occur a clashing between the command code +and the arguments without the space. Most often, this happens when +variable-length command names, arguments, argument lists, or command +clusters meet. Commands and arguments with a known, fixed length need +not be separated by syntactical space. +

    +

    A line break is a syntactical element, too. Every command argument can +be followed by whitespace, a comment, or a newline character. Thus a +syntactical line break is defined to consist of optional +syntactical space that is optionally followed by a comment, and a +newline character. +

    +

    The normal commands, those for positioning and text, consist of a single +letter taking a fixed number of arguments. For historical reasons, the +parser allows stacking of such commands on the same line, but +fortunately, in gtroff’s intermediate output, every command with +at least one argument is followed by a line break, thus providing +excellent readability. +

    +

    The other commands—those for drawing and device controlling—have a +more complicated structure; some recognize long command names, and some +take a variable number of arguments. So all ‘D’ and ‘x’ +commands were designed to request a syntactical line break after their +last argument. Only one command, ‘x X, has an argument that +can span several input lines; all other commands must have all of +their arguments on the same line as the command, i.e., the arguments may +not be split by a line break. +

    +

    Empty lines (these are lines containing only space and/or a comment), +can occur everywhere. They are just ignored. +

    +
    +
    +
    + +

    6.1.1.2 Argument Units

    + +

    Some commands take integer arguments that are assumed to represent +values in a measurement unit, but the letter for the corresponding +scaling unit is not written with the output command arguments. Most +commands assume the scaling unit ‘u’, the basic unit of the device, +some use ‘z’, the scaled point unit of the device, while others, +such as the color commands, expect plain integers. +

    +

    Single characters can have the eighth bit set, as can the names of +fonts and special characters. The names of characters and fonts can be +of arbitrary length. A character that is to be printed is always in +the current font. +

    +

    A string argument is always terminated by the next whitespace character +(space, tab, or newline); an embedded ‘#’ character is regarded as +part of the argument, not as the beginning of a comment command. An +integer argument is already terminated by the next non-digit character, +which then is regarded as the first character of the next argument or +command. +

    +
    +
    +
    + +

    6.1.1.3 Document Parts

    + +

    A correct intermediate output document consists of two parts, the +prologue and the body. +

    +

    The task of the prologue is to set the general device parameters using +three exactly specified commands. gtroff’s prologue is +guaranteed to consist of the following three lines (in that order): +

    +
    +
    x T device
    +x res n h v
    +x init
    +
    + +

    with the arguments set as outlined in Device Control Commands. +The parser for the intermediate output format is able to interpret +additional whitespace and comments as well even in the prologue. +

    +

    The body is the main section for processing the document data. +Syntactically, it is a sequence of any commands different from the ones +used in the prologue. Processing is terminated as soon as the first +‘x stop command is encountered; the last line of any +gtroff intermediate output always contains such a command. +

    +

    Semantically, the body is page oriented. A new page is started by a +‘p’ command. Positioning, writing, and drawing commands are always +done within the current page, so they cannot occur before the first +‘p’ command. Absolute positioning (by the ‘H’ and ‘V’ +commands) is done relative to the current page; all other positioning is +done relative to the current location within this page. +

    + +
    +
    +
    +
    + +

    6.1.2 Command Reference

    + +

    This section describes all intermediate output commands, both from +AT&T troff as well as the gtroff extensions. +

    + + +
    +
    + +

    6.1.2.1 Comment Command

    + +
    +
    #anythingend of line
    +

    A comment. Ignore any characters from the ‘#’ character up to the +next newline character. +

    +

    This command is the only possibility for commenting in the intermediate +output. Each comment can be preceded by arbitrary syntactical space; +every command can be terminated by a comment. +

    +
    + +
    +
    +
    + +

    6.1.2.2 Simple Commands

    + +

    The commands in this subsection have a command code consisting of a +single character, taking a fixed number of arguments. Most of them are +commands for positioning and text writing. These commands are tolerant +of whitespace. Optionally, syntactical space can be inserted before, +after, and between the command letter and its arguments. All of these +commands are stackable; i.e., they can be preceded by other simple +commands or followed by arbitrary other commands on the same line. A +separating syntactical space is necessary only when two integer +arguments would clash or if the preceding argument ends with a string +argument. +

    +
    +
    C idwhitespace
    +

    Typeset the glyph of the special character id. Trailing +syntactical space is necessary to allow special character names of +arbitrary length. The drawing position is not advanced. +

    +
    +
    c g
    +

    Typeset the glyph of the ordinary character c. The drawing +position is not advanced. +

    +
    +
    f n
    +

    Select the font mounted at position n. n cannot +be negative. +

    +
    +
    H n
    +

    Horizontally move the drawing position to n basic units from +the left edge of the page. n cannot be negative. +

    +
    +
    h n
    +

    Move the drawing position right n basic units. AT&T +troff allowed negative n; GNU troff does not produce +such values, but groff’s output driver library handles them. +

    +
    +
    m color-scheme [component]
    +

    Select the stroke color using the components in the color space +scheme. Each component is an integer between 0 and 65535. +The quantity of components and their meanings vary with each +scheme. This command is a groff extension. +

    +
    +
    mc cyan magenta yellow
    +

    Use the CMY color scheme with components cyan, magenta, and yellow. +

    +
    +
    md
    +

    Use the default color (no components; black in most cases). +

    +
    +
    mg gray
    +

    Use a grayscale color scheme with a component ranging between 0 (black) +and 65535 (white). +

    +
    +
    mk cyan magenta yellow black
    +

    Use the CMYK color scheme with components cyan, magenta, yellow, and +black. +

    +
    +
    mr red green blue
    +

    Use the RGB color scheme with components red, green, and blue. +

    +
    + +
    +
    N n
    +

    Typeset the glyph with index n in the current font. +n is normally a non-negative integer. The drawing position +is not advanced. The html and xhtml devices use this +command with negative n to produce unbreakable space; the +absolute value of n is taken and interpreted in basic units. +

    +
    +
    n b a
    +

    Indicate a break. No action is performed; the command is present to +make the output more easily parsed. The integers b +and a describe the vertical space amounts before and after +the break, respectively. GNU troff issues this command but +groff’s output driver library ignores it. See v and +V below. +

    +
    +
    p n
    +

    Begin a new page, setting its number to n. Each page is +independent, even from those using the same number. The vertical +drawing position is set to 0. All positioning, writing, and +drawing commands are interpreted in the context of a page, so a +p command must precede them. +

    +
    +
    s n
    +

    Set type size to n scaled points (unit z in GNU +troff. +AT&T troff used unscaled points p instead; +see Output Language Compatibility. +

    +
    +
    t xyzwhitespace
    +
    t xyz dummy-argwhitespace
    +

    Typeset a word xyz; that is, set a sequence of ordinary glyphs +named x, y, z, …, terminated by a space +character or a line break; an optional second integer argument is +ignored (this allows the formatter to generate an even number of +arguments). Each glyph is set at the current drawing position, and the position is +then advanced horizontally by the glyph’s width. A glyph’s width is +read from its metrics in the font description file, scaled to the +current type size, and rounded to a multiple of the horizontal motion +quantum. Use the C command to emplace glyphs of special +characters. The t command is a groff extension and +is output only for devices whose DESC file contains the +tcommand directive; see DESC File Format. +

    +
    +
    u n xyzwhitespace
    +

    Typeset word xyz with track kerning. As t, but after +placing each glyph, the drawing position is further advanced +horizontally by n basic units (u). The +u command is a groff extension and is output only for +devices whose DESC file contains the tcommand directive; +see DESC File Format. +

    +
    +
    V n
    +

    Vertically move the drawing position to n basic units from +the top edge of the page. n cannot be negative. +

    +
    +
    v n
    +

    Move the drawing position down n basic units. AT&T +troff allowed negative n; GNU troff does not produce +such values, but groff’s output driver library handles them. +

    +
    +
    w
    +

    Indicate an inter-word space. No action is performed; the command is +present to make the output more easily parsed. Only adjustable, +breakable inter-word spaces are thus described; those resulting from +\~ or horizontal motion escape sequences are not. GNU +troff issues this command but groff’s output driver +library ignores it. See h and H above. +

    +
    + +
    +
    +
    + +

    6.1.2.3 Graphics Commands

    + +

    Each graphics or drawing command in the intermediate output starts with +the letter ‘D’, followed by one or two characters that specify a +subcommand; this is followed by a fixed or variable number of integer +arguments that are separated by a single space character. A ‘D’ +command may not be followed by another command on the same line (apart +from a comment), so each ‘D’ command is terminated by a syntactical +line break. +

    +

    gtroff output follows the classical spacing rules (no space +between command and subcommand, all arguments are preceded by a single +space character), but the parser allows optional space between the +command letters and makes the space before the first argument optional. +As usual, each space can be any sequence of tab and space characters. +

    +

    Some graphics commands can take a variable number of arguments. In this +case, they are integers representing a size measured in basic units +‘u’. The arguments called h1, h2, …, hn +stand for horizontal distances where positive means right, negative +left. The arguments called v1, v2, …, vn stand +for vertical distances where positive means down, negative up. All +these distances are offsets relative to the current location. +

    +

    Each graphics command directly corresponds to a similar gtroff +\D escape sequence. See Drawing Geometric Objects. +

    +

    Unknown ‘D’ commands are assumed to be device-specific. Its +arguments are parsed as strings; the whole information is then sent to +the postprocessor. +

    +

    In the following command reference, the syntax element ‹line +break› means a syntactical line break as defined above. +

    +
    +
    D~ h1 v1 h2 v2hn vnline break
    +

    Draw B-spline from current position to offset (h1,v1), then +to offset (h2,v2), if given, etc., up to +(hn,vn). This command takes a variable number of argument +pairs; the current position is moved to the terminal point of the drawn +curve. +

    +
    +
    Da h1 v1 h2 v2line break
    +

    Draw arc from current position to +(h1,v1)+(h2,v2) with center at +(h1,v1); then move the current position to the final point +of the arc. +

    +
    +
    DC dline break
    +
    DC d dummy-argline break
    +

    Draw a solid circle using the current fill color with +diameter d (integer in basic units ‘u’) with leftmost +point at the current position; then move the current position to the +rightmost point of the circle. An optional second integer argument is +ignored (this allows the formatter to generate an even number of +arguments). This command is a gtroff extension. +

    +
    +
    Dc dline break
    +

    Draw circle line with diameter d (integer in basic units +‘u’) with leftmost point at the current position; then move the +current position to the rightmost point of the circle. +

    +
    +
    DE h vline break
    +

    Draw a solid ellipse in the current fill color with a horizontal +diameter of h and a vertical diameter of v (both +integers in basic units ‘u’) with the leftmost point at the current +position; then move to the rightmost point of the ellipse. This command +is a gtroff extension. +

    +
    +
    De h vline break
    +

    Draw an outlined ellipse with a horizontal diameter of h and +a vertical diameter of v (both integers in basic units +‘u’) with the leftmost point at current position; then move to the +rightmost point of the ellipse. +

    +
    +
    DF color-scheme [component]line break
    +

    Set fill color for solid drawing objects using different color schemes; +the analogous command for setting the color of text, line graphics, and +the outline of graphic objects is ‘m’. The color components are +specified as integer arguments between 0 and 65535. The number of color +components and their meaning vary for the different color schemes. +These commands are generated by gtroff’s escape sequences +‘\D'F …'’ and \M (with no other corresponding +graphics commands). No position changing. This command is a +gtroff extension. +

    +
    +
    DFc cyan magenta yellowline break
    +

    Set fill color for solid drawing objects using the CMY color scheme, +having the 3 color components cyan, magenta, and +yellow. +

    +
    +
    DFd‹line break
    +

    Set fill color for solid drawing objects to the default fill color value +(black in most cases). No component arguments. +

    +
    +
    DFg grayline break
    +

    Set fill color for solid drawing objects to the shade of gray given by +the argument, an integer between 0 (black) and 65535 (white). +

    +
    +
    DFk cyan magenta yellow blackline break
    +

    Set fill color for solid drawing objects using the CMYK color scheme, +having the 4 color components cyan, magenta, +yellow, and black. +

    +
    +
    DFr red green blueline break
    +

    Set fill color for solid drawing objects using the RGB color scheme, +having the 3 color components red, green, and +blue. +

    +
    + +
    +
    Df nline break
    +

    The argument n must be an integer in the range -32767 +to 32767. +

    +
    +
    0 ≤ n ≤ 1000
    +

    Set the color for filling solid drawing objects to a shade of gray, +where 0 corresponds to solid white, 1000 (the default) to solid black, +and values in between to intermediate shades of gray; this is obsoleted +by command ‘DFg’. +

    +
    +
    n < 0 or n > 1000
    +

    Set the filling color to the color that is currently being used for the +text and the outline, see command ‘m’. For example, the command +sequence +

    +
    +
    mg 0 0 65535
    +Df -1
    +
    + +

    sets all colors to blue. +

    +
    + +

    No position changing. This command is a gtroff extension. +

    +
    +
    Dl h vline break
    +

    Draw line from current position to offset (h,v) (integers in +basic units ‘u’); then set current position to the end of the drawn +line. +

    +
    +
    Dp h1 v1 h2 v2hn vnline break
    +

    Draw a polygon line from current position to offset (h1,v1), +from there to offset (h2,v2), etc., up to offset +(hn,vn), and from there back to the starting position. For +historical reasons, the position is changed by adding the sum of all +arguments with odd index to the actual horizontal position and the even +ones to the vertical position. Although this doesn’t make sense it is +kept for compatibility. +This command is a gtroff extension. +

    +
    +
    DP h1 v1 h2 v2hn vnline break
    +

    Draw a solid polygon in the current fill color rather than an outlined +polygon, using the same arguments and positioning as the corresponding +‘Dp’ command. +This command is a gtroff extension. +

    +
    +
    Dt nline break
    +

    Set the current line thickness to n (an integer in basic +units ‘u’) if n>0; if n=0 select the +smallest available line thickness; if n<0 set the line +thickness proportional to the type size (this is the default before the +first ‘Dt’ command was specified). For historical reasons, the +horizontal position is changed by adding the argument to the actual +horizontal position, while the vertical position is not changed. +Although this doesn’t make sense it is kept for compatibility. +This command is a gtroff extension. +

    +
    + +
    +
    +
    + +

    6.1.2.4 Device Control Commands

    + +

    Each device control command starts with the letter ‘x’, followed by +a space character (optional or arbitrary space or tab in gtroff) +and a subcommand letter or word; each argument (if any) must be preceded +by a syntactical space. All ‘x’ commands are terminated by a +syntactical line break; no device control command can be followed by +another command on the same line (except a comment). +

    +

    The subcommand is basically a single letter, but to increase +readability, it can be written as a word, i.e., an arbitrary sequence of +characters terminated by the next tab, space, or newline character. All +characters of the subcommand word but the first are simply ignored. For +example, gtroff outputs the initialization command ‘x i +as ‘x init and the resolution command ‘x r as +‘x res. +

    +

    In the following, the syntax element ‹line break› means a +syntactical line break (see Separation). +

    +
    +
    xF nameline break
    +

    The ‘F’ stands for Filename. +

    +

    Use name as the intended name for the current file in error +reports. This is useful for remembering the original file name when +gtroff uses an internal piping mechanism. The input file is not +changed by this command. This command is a gtroff extension. +

    +
    +
    xf n sline break
    +

    The ‘f’ stands for font. +

    +

    Mount font position n (a non-negative integer) with font +named s (a text word). See Font Positions. +

    +
    +
    xH nline break
    +

    The ‘H’ stands for Height. +

    +

    Set glyph height to n (a positive integer in scaled points +‘z’). AT&T troff uses the unit points (‘p’) +instead. See Output Language Compatibility. +

    +
    +
    xi‹line break
    +

    The ‘i’ stands for init. +

    +

    Initialize device. This is the third command of the prologue. +

    +
    +
    xp‹line break
    +

    The ‘p’ stands for pause. +

    +

    Parsed but ignored. The AT&T troff manual documents +this command as +

    +
    +
    pause device, can be restarted
    +
    + +

    but GNU troff output drivers do nothing with this command. +

    +
    +
    xr n h vline break
    +

    The ‘r’ stands for resolution. +

    +

    Resolution is n, while h is the minimal horizontal +motion, and v the minimal vertical motion possible with this +device; all arguments are positive integers in basic units ‘u’ per +inch. This is the second command of the prologue. +

    +
    +
    xS nline break
    +

    The ‘S’ stands for Slant. +

    +

    Set slant to n (an integer in basic units ‘u’). +

    +
    +
    xs‹line break
    +

    The ‘s’ stands for stop. +

    +

    Terminates the processing of the current file; issued as the last +command of any intermediate troff output. +

    +
    +
    xt‹line break
    +

    The ‘t’ stands for trailer. +

    +

    Generate trailer information, if any. In GNU troff, this is +ignored. +

    +
    +
    xT xxxline break
    +

    The ‘T’ stands for Typesetter. +

    +

    Set the name of the output driver to xxx, a sequence of +non-whitespace characters terminated by whitespace. The possible names +correspond to those of groff’s -T option. This is the +first command of the prologue. +

    +
    +
    xu nline break
    +

    The ‘u’ stands for underline. +

    +

    Configure underlining of spaces. If n is 1, start +underlining of spaces; if n is 0, stop underlining of spaces. +This is needed for the cu request in nroff mode and is +ignored otherwise. This command is a gtroff extension. +

    +
    +
    xX anythingline break
    +

    The ‘x’ stands for X-escape. +

    +

    Send string anything uninterpreted to the device. If the line +following this command starts with a ‘+’ character this line is +interpreted as a continuation line in the following sense. The ‘+’ +is ignored, but a newline character is sent instead to the device, the +rest of the line is sent uninterpreted. The same applies to all +following lines until the first character of a line is not a ‘+’ +character. This command is generated by the gtroff escape +sequence \X. The line-continuing feature is a gtroff +extension. +

    +
    + +
    +
    +
    + +

    6.1.2.5 Obsolete Command

    +

    In AT&T troff output, the writing of a single glyph is +mostly done by a very strange command that combines a horizontal move +and a single character giving the glyph name. It doesn’t have a command +code, but is represented by a 3-character argument consisting of exactly +2 digits and a character. +

    +
    +
    ddg
    +

    Move right dd (exactly two decimal digits) basic units ‘u’, +then print glyph g (represented as a single character). +

    +

    In GNU troff, arbitrary syntactical space around and within this +command is allowed. Only when a preceding command on the same line ends +with an argument of variable length is a separating space obligatory. +In AT&T troff, large clusters of these and other +commands are used, mostly without spaces; this made such output almost +unreadable. +

    +
    + +

    For modern high-resolution devices, this command does not make sense +because the width of the glyphs can become much larger than two decimal +digits. In gtroff, this is only used for the devices X75, +X75-12, X100, and X100-12. For other devices, the +commands ‘t’ and ‘u’ provide a better functionality. +

    + +
    +
    +
    +
    + +

    6.1.3 Intermediate Output Examples

    + +

    This section presents the intermediate output generated from the same +input for three different devices. The input is the sentence ‘hell +world’ fed into gtroff on the command line. +

    +
    +
    High-resolution device ps
    +
    +

    This is the standard output of gtroff if no -T option is +given. +

    +
    +
    shell> echo "hell world" | groff -Z -T ps
    +
    +x T ps
    +x res 72000 1 1
    +x init
    +
    p1
    +x font 5 TR
    +f5
    +s10000
    +V12000
    +H72000
    +thell
    +wh2500
    +tw
    +H96620
    +torld
    +n12000 0
    +
    x trailer
    +V792000
    +x stop
    +
    + +

    This output can be fed into grops to get its representation as a +PostScript file. +

    +
    +
    Low-resolution device latin1
    +
    +

    This is similar to the high-resolution device except that the +positioning is done at a minor scale. Some comments (lines starting +with ‘#’) were added for clarification; they were not generated by +the formatter. +

    +
    +
    shell> echo "hell world" | groff -Z -T latin1
    +
    +# prologue
    +x T latin1
    +x res 240 24 40
    +x init
    +
    # begin a new page
    +p1
    +# font setup
    +x font 1 R
    +f1
    +s10
    +# initial positioning on the page
    +V40
    +H0
    +# write text 'hell'
    +thell
    +# inform about space, and issue a horizontal jump
    +wh24
    +# write text 'world'
    +tworld
    +# announce line break, but do nothing because...
    +n40 0
    +
    # ...the end of the document has been reached
    +x trailer
    +V2640
    +x stop
    +
    + +

    This output can be fed into grotty to get a formatted text +document. +

    +
    +
    AT&T troff output
    +

    Since a computer monitor has a much lower resolution than modern +printers, the intermediate output for X11 devices can use the +jump-and-write command with its 2-digit displacements. +

    +
    +
    shell> echo "hell world" | groff -Z -T X100
    +
    +x T X100
    +x res 100 1 1
    +x init
    +
    p1
    +x font 5 TR
    +f5
    +s10
    +V16
    +H100
    +# write text with jump-and-write commands
    +ch07e07l03lw06w11o07r05l03dh7
    +n16 0
    +
    x trailer
    +V1100
    +x stop
    +
    + +

    This output can be fed into xditview or gxditview for +displaying in X. +

    +

    Due to the obsolete jump-and-write command, the text clusters in the +AT&T troff output are almost unreadable. +

    +
    + + +
    +
    +
    + +

    6.1.4 Output Language Compatibility

    + +

    The intermediate output language of AT&T troff was +first documented in A Typesetter-independent TROFF, by Brian +Kernighan, and by 1992 the AT&T troff manual was +updated to incorprate a description of it. +

    +

    The GNU troff intermediate output format is compatible with this +specification except for the following features. +

    +
      +
    • The classical quasi-device independence is not yet implemented. + +
    • The old hardware was very different from what we use today. So the +groff devices are also fundamentally different from the ones +in AT&T troff. For example, the AT&T +PostScript device is called post and has a resolution of only 720 +units per inch, suitable for printers 20 years ago, while groff’s +ps device has a resolution of 72000 units per inch. Maybe, by +implementing some rescaling mechanism similar to the classical +quasi-device independence, groff could emulate AT&T’s +post device. + +
    • The B-spline command ‘D~’ is correctly handled by the intermediate +output parser, but the drawing routines aren’t implemented in some of +the postprocessor programs. + +
    • The argument of the commands ‘s’ and ‘x H has the +implicit unit scaled point ‘z’ in gtroff, while +AT&T troff has point (‘p’). This isn’t an +incompatibility but a compatible extension, for both units coincide for +all devices without a sizescale parameter in the DESC +file, including all postprocessors from AT&T and +groff’s text devices. The few groff devices with a +sizescale parameter either do not exist for AT&T +troff, have a different name, or seem to have a different +resolution. So conflicts are very unlikely. + +
    • The position changing after the commands ‘Dp’, ‘DP’, and +‘Dt’ is illogical, but as old versions of gtroff used this +feature it is kept for compatibility reasons. + + +
    + + + +
    +
    +
    +
    + +

    6.2 Device and Font Description Files

    + + + +

    The groff font and output device description formats are slight +extensions of those used by AT&T device-independent +troff. In distinction to the AT&T implementation, +groff lacks a binary format; all files are text +files.125 The device and font description files for a device name +are stored in a devname directory. The device description +file is called DESC, and, for each font supported by the device, +a font description file is called f, where +f is usually an abbreviation of a font’s name and/or style. +For example, the ps (PostScript) device has groff font +description files for Times roman (TR) and Zapf Chancery Medium +italic (ZCMI), among many others, while the utf8 device +(for terminal emulators) has only font descriptions for the roman, +italic, bold, and bold-italic styles (R, I, B, and +BI, respectively). +

    +

    Device and font description files are read both by the formatter, GNU +troff, and by output drivers. The programs delegate these files’ +processing to an internal library, libgroff, ensuring their +consistent interpretation. +

    + + + +
    +
    + +

    6.2.1 DESC File Format

    + + + + +

    The DESC file contains a series of directives; each begins a +line. Their order is not important, with two exceptions: (1) the +res directive must precede any papersize directive; and +(2) the charset directive must come last (if at all). If a +directive name is repeated, later entries in the file override previous +ones (except that the paper dimensions are computed based on the +res directive last seen when papersize is encountered). +Spaces and/or tabs separate words and are ignored at line boundaries. + + + +Comments start with the ‘#’ character and extend to the end of a +line. Empty lines are ignored. +

    +
    +
    family fam
    +

    The default font family is fam. +

    +
    +
    fonts n F1 Fn
    +

    Fonts F1, …, Fn are mounted at font positions +m+1, …, m+n where m is the number of +styles (see below). This directive may extend over more than one +line. A font name of 0 causes no font to be mounted at the +corresponding position. +

    +
    +
    hor n
    +
    + + + + +

    The horizontal motion quantum is n basic units. All +horizontal quantities are rounded to multiples of n. +

    +
    +
    image_generator program
    +
    + +

    Use program to generate PNG images from PostScript input. Under +GNU/Linux, this is usually gs, but under other systems (notably +Cygwin) it might be set to another name. The grohtml driver uses +this directive. +

    +
    +
    paperlength n
    +

    The vertical dimension of the output medium is n basic units +(deprecated: use papersize instead). +

    +
    +
    papersize format-or-dimension-pair-or-file-name
    +

    The dimensions of the output medium are as according to the +argument, which is either a standard paper format, a pair of dimensions, +or the name of a plain text file containing either of the foregoing. +

    +

    Recognized paper formats are the ISO and DIN formats +A0A7, B0B7, C0C7, +D0D7; the U.S. paper types letter, +legal, tabloid, ledger, statement, and +executive; and the envelope formats com10, monarch, +and DL. Matching is performed without regard for lettercase. +

    +

    Alternatively, the argument can be a custom paper format in the format +length,width (with no spaces before or after the +comma). Both length and width must have a unit appended; +valid units are ‘i’ for inches, ‘c’ for centimeters, ‘p’ +for points, and ‘P’ for picas. Example: ‘12c,235p’. An +argument that starts with a digit is always treated as a custom paper +format. +

    +

    Finally, the argument can be a file name (e.g., /etc/papersize); +if the file can be opened, the first line is read and a match attempted +against each of the other forms. No comment syntax is supported. +

    +

    More than one argument can be specified; +each is scanned in turn and the first valid paper specification used. +

    +
    +
    paperwidth n
    +

    The horizontal dimension of the output medium is n basic +units (deprecated: use papersize instead). +

    +
    +
    pass_filenames
    +

    Direct GNU troff to emit the name of the source file being +processed. This is achieved with the intermediate output command +‘x F’, which grohtml interprets. +

    +
    +
    postpro program
    +

    Use program as the postprocessor. +

    +
    +
    prepro program
    +

    Use program as a preprocessor. The html and xhtml +output devices use this directive. +

    +
    +
    print program
    +

    Use program as a spooler program for printing. If omitted, the +-l and -L options of groff are ignored. +

    +
    +
    res n
    +
    + +

    The device resolution is n basic units per inch. +

    +
    +
    sizes s1 sn 0
    +

    The device has fonts at s1, …, sn scaled points (see +below). The list of sizes must be terminated by 0. Each +si can also be a range of sizes mn. The list can +extend over more than one line. +

    +
    +
    sizescale n
    +

    A typographical point is subdivided into n scaled points. +The default is 1. See Using Fractional Type Sizes. +

    +
    +
    styles S1 Sm
    +

    The first m mounting positions are associated with styles +S1, …, Sm. +

    +
    +
    tcommand
    +

    The postprocessor can handle the ‘t’ and ‘u’ intermediate +output commands. +

    +
    +
    unicode
    +

    The output device supports the complete Unicode repertoire. This +directive is useful only for devices that produce character entities +instead of glyphs. +

    +

    If unicode is present, no charset section is required in +the font description files since the Unicode handling built into +groff is used. However, if there are entries in a font +description file’s charset section, they either override the +default mappings for those particular characters or add new mappings +(normally for composite characters). +

    +

    The utf8, html, and xhtml output devices use this +directive. +

    +
    +
    unitwidth n
    +

    Quantities in the font description files are in basic units for fonts +whose type size is n scaled points. +

    +
    +
    unscaled_charwidths
    +

    Make the font handling module always return unscaled character widths. +The grohtml driver uses this directive. +

    +
    +
    use_charnames_in_special
    +

    GNU troff should encode special characters inside device control +commands; see Postprocessor Access. The grohtml driver +uses this directive. +

    +
    +
    vert n
    +
    + + + + +

    The vertical motion quantum is n basic units. All vertical +quantities are rounded to multiples of n. +

    +
    +
    charset
    +

    This line and everything following it in the file are ignored. It is +recognized for compatibility with other troff implementations. +In GNU troff, character set repertoire is described on a +per-font basis. +

    +
    + + + + +

    GNU troff recognizes but ignores the directives spare1, +spare2, and biggestfont. +

    +

    The res, unitwidth, fonts, and sizes lines +are mandatory. Directives not listed above are ignored by GNU +troff but may be used by postprocessors to obtain further +information about the device. +

    + +
    +
    +
    + +

    6.2.2 Font Description File Format

    + + + + + +

    On typesetting output devices, each font is typically available at +multiple sizes. While paper measurements in the device description file +are in absolute units, measurements applicable to fonts must be +proportional to the type size. groff achieves this using the +precedent set by AT&T device-independent troff: one +font size is chosen as a norm, and all others are scaled linearly +relative to that basis. The “unit width” is the number of basic units +per point when the font is rendered at this nominal size. +

    +

    For instance, groff’s lbp device uses a unitwidth +of 800. Its Times roman font ‘TR’ has a spacewidth +of 833; this is also the width of its comma, period, centered +period, and mathematical asterisk, while its ‘M’ is 2,963 basic +units. Thus, an ‘M’ on the lbp device is 2,963 basic units +wide at a notional type size of 800 points.126 +

    +

    A font description file has two sections. The first is a sequence of +directives, and is parsed similarly to the DESC file described +above. Except for the directive names that begin the second section, +their ordering is immaterial. Later directives of the same name +override earlier ones, spaces and tabs are handled in the same way, + + + +and the same comment syntax is supported. Empty lines are ignored +throughout. +

    +
    +
    name f
    +

    The name of the font is f. ‘DESC’ is an invalid font +name. Simple integers are valid, but their use is +discouraged.127 +

    +
    +
    spacewidth n
    +

    The width of an unadjusted inter-word space is n basic units. +

    +
    + +

    The directives above must appear in the first section; those below are +optional. +

    +
    +
    slant n
    +

    The font’s glyphs have a slant of n degrees; a positive +n slants in the direction of text flow. +

    +
    +
    ligatures lig1 lign [0]
    +

    Glyphs lig1, …, lign are ligatures; possible ligatures +are ‘ff’, ‘fi’, ‘fl’, ‘ffi’ and ‘ffl’. For +compatibility with other troff implementations, the list of +ligatures may be terminated with a 0. The list of ligatures +must not extend over more than one line. +

    +
    +
    special
    +
    +

    The font is special: when a glyph is requested that is not present +in the current font, it is sought in any mounted fonts that bear this +property. +

    +
    + +

    Other directives in this section are ignored by GNU troff, but +may be used by postprocessors to obtain further information about the +font. +

    +

    The second section contains one or two subsections. These can appear in +either order; the first one encountered commences the second section. +Each starts with a directive on a line by itself. A charset +subsection is mandatory unless the associated DESC file contains +the unicode directive. Another subsection, kernpairs, +is optional. +

    + +

    The directive charset starts the character set +subsection.128 It precedes a series +of glyph descriptions, one per line. Each such glyph description +comprises a set of fields separated by spaces or tabs and organized as +follows. +

    +
    +

    name metrics type code [entity-name] +[-- comment] +

    + + + + + + + + +

    name identifies the glyph: +if name is a printable character c, it corresponds to +the troff ordinary character c. If name is a +multi-character sequence not beginning with \, it corresponds to +the GNU troff special character escape sequence +‘\[name]’. A name consisting of three minus signs, +‘---’, is special and indicates that the glyph is unnamed: such +glyphs can be accessed only by the \N escape sequence in +troff. A special character named ‘---’ can still be defined +using char and similar requests. The name\-’ +defines the minus sign glyph. Finally, name can be the +unbreakable one-sixth and one-twelfth space escape sequences, \| +and \^ (“thin” and “hair” spaces, respectively), in which +case only the width metric described below is interpreted; a font can +thus customize the widths of these spaces. +

    +

    The form of the metrics field is as follows. +

    +
    +
    width[,[height[,[depth[,[italic-correction
    +  [,[left-italic-correction[,[subscript-correction]]]]]]]]]]
    +
    + +

    There must not be any spaces, tabs, or newlines between these +subfields (which have been split here into two lines only for +better legibility). The subfields are in basic units expressed as +decimal integers. Unspecified subfields default to 0. +Since there is no associated binary format, these values are not +required to fit into the C language data type ‘char’ as they are in +AT&T device-independent troff. +

    +

    The width subfield gives the width of the glyph. The height +subfield gives the height of the glyph (upward is positive); if a glyph +does not extend above the baseline, it should be given a zero height, +rather than a negative height. The depth subfield gives the depth +of the glyph, that is, the distance below the baseline to which the +glyph extends (downward is positive); if a glyph does not extend below +the baseline, it should be given a zero depth, rather than a negative +depth. Italic corrections are relevant to glyphs in italic or oblique +styles. The italic-correction is the amount of space that should +be added after an oblique glyph to be followed immediately by an upright +glyph. The left-italic-correction is the amount of space that +should be added before an oblique glyph to be preceded immediately by an +upright glyph. The subscript-correction is the amount of space +that should be added after an oblique glyph to be followed by a +subscript; it should be less than the italic correction. +

    +

    For fonts used with typesetting devices, the type field gives a +featural description of the glyph: it is a bit mask recording whether +the glyph is an ascender, descender, both, or neither. When a \w +escape sequence is interpolated, these values are bitwise or-ed +together for each glyph and stored in the nr register. In font +descriptions for terminal devices, all glyphs might have a type of zero, +regardless of their appearance. +

    +
    +
    0
    +

    means the glyph lies entirely between the baseline and a horizontal line +at the “x-height” of the font; typical examples are ‘a’, +‘c’, and ‘x’; +

    +
    +
    1
    +

    means the glyph descends below the baseline, like ‘p’; +

    +
    +
    2
    +

    means the glyph ascends above the font’s x-height, like ‘A’ or +‘b’; and +

    +
    +
    3
    +

    means the glyph is both an ascender and a descender—this is true of +parentheses in some fonts. +

    +
    + +

    The code field gives a numeric identifier that the postprocessor +uses to render the glyph. The glyph can be specified to troff +using this code by means of the \N escape sequence. code +can be any integer.129 +

    +

    The entity-name field defines an identifier for the glyph that the +postprocessor uses to print the GNU troff glyph name. This +field is optional; it was introduced so that the grohtml output +driver could encode its character set. For example, the glyph +‘\[Po]’ is represented by ‘&pound;’ in HTML 4.0. +For efficiency, these data are now compiled directly into +grohtml. grops uses the field to build sub-encoding +arrays for PostScript fonts containing more than 256 glyphs. Anything +on the line after the entity-name field or ‘--’ is ignored. +

    +

    A line in the charset section can also have the form +

    +
    +
    name "
    +
    + +

    identifying name as another name for the glyph mentioned in the +preceding line. Such aliases can be chained. +

    + +

    The directive kernpairs starts a list of kerning adjustments to +be made to adjacent glyph pairs from this font. It contains a sequence +of lines formatted as follows. +

    +
    +
    g1 g2 n
    +
    + +

    The foregoing means that when glyph g1 is typeset immediately +before g2, the space between them should be increased +by n. Most kerning pairs should have a negative value +for n. +

    + + + + +
    +
    +
    +
    +
    + +

    Appendix A Copying This Manual

    + +
    Version 1.3, 3 November 2008 +
    + +
    +
    Copyright © 2000-2018 Free Software Foundation, Inc.
    +http://fsf.org/
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + +
      +
    1. PREAMBLE + +

      The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +

      +

      This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +

      +

      We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +

      +
    2. APPLICABILITY AND DEFINITIONS + +

      This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +

      +

      A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +

      +

      A “Secondary Section” is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document’s overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +

      +

      The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +

      +

      The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +

      +

      A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. +

      +

      Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. +

      +

      The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work’s title, +preceding the beginning of the body of the text. +

      +

      The “publisher” means any person or entity that distributes copies +of the Document to the public. +

      +

      A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. +

      +

      The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +

      +
    3. VERBATIM COPYING + +

      You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +

      +

      You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +

      +
    4. COPYING IN QUANTITY + +

      If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document’s license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +

      +

      If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +

      +

      If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +

      +

      It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +

      +
    5. MODIFICATIONS + +

      You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +

      +
        +
      1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
      2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
      3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
      4. Preserve all the copyright notices of the Document. + +
      5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
      6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
      7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document’s license notice. + +
      8. Include an unaltered copy of this License. + +
      9. Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
      10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
      11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
      12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
      13. Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. + +
      14. Do not retitle any existing section to be Entitled “Endorsements” or +to conflict in title with any Invariant Section. + +
      15. Preserve any Warranty Disclaimers. +
      + +

      If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version’s license notice. +These titles must be distinct from any other section titles. +

      +

      You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties—for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +

      +

      You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +

      +

      The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +

      +
    6. COMBINING DOCUMENTS + +

      You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +

      +

      The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +

      +

      In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all +sections Entitled “Endorsements.” +

      +
    7. COLLECTIONS OF DOCUMENTS + +

      You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. +

      +

      You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +

      +
    8. AGGREGATION WITH INDEPENDENT WORKS + +

      A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation’s users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +

      +

      If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document’s Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +

      +
    9. TRANSLATION + +

      Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +

      +

      If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +

      +
    10. TERMINATION + +

      You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +

      +

      However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +

      +

      Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +

      +

      Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +

      +
    11. FUTURE REVISIONS OF THIS LICENSE + +

      The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +

      +

      Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy’s public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +

      +
    12. RELICENSING + +

      “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the +site means any set of copyrightable works thus published on the MMC +site. +

      +

      “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +

      +

      “Incorporate” means to publish or republish a Document, in whole or +in part, as part of another Document. +

      +

      An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. +

      +

      The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +

      +
    + +

    ADDENDUM: How to use this License for your documents

    + +

    To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: +

    +
    +
      Copyright (C)  year  your name.
    +  Permission is granted to copy, distribute and/or modify this document
    +  under the terms of the GNU Free Documentation License, Version 1.3
    +  or any later version published by the Free Software Foundation;
    +  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
    +  Texts.  A copy of the license is included in the section entitled ``GNU
    +  Free Documentation License''.
    +
    + +

    If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the “with…Texts.” line with this: +

    +
    +
        with the Invariant Sections being list their titles, with
    +    the Front-Cover Texts being list, and with the Back-Cover Texts
    +    being list.
    +
    + +

    If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +

    +

    If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +

    + + + + + +
    +
    +
    + +

    Appendix B Request Index

    + +

    Request names appear without a leading control character; the defaults +are . for the regular control character and ' for the +no-break control character. +

    +
    +
    Jump to:   A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +R +   +S +   +T +   +U +   +V +   +W +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    A
    ab: Debugging
    ad: Manipulating Filling and Adjustment
    af: Assigning Register Formats
    aln: Setting Registers
    als: Strings
    am: Writing Macros
    am1: Writing Macros
    ami: Writing Macros
    ami1: Writing Macros
    as: Strings
    as1: Strings
    asciify: Diversions

    B
    backtrace: Debugging
    bd: Artificial Fonts
    blm: Blank Line Traps
    box: Diversions
    boxa: Diversions
    bp: Page Control
    br: Manipulating Filling and Adjustment
    break: while
    brp: Manipulating Filling and Adjustment

    C
    c2: Control Characters
    cc: Control Characters
    ce: Manipulating Filling and Adjustment
    cf: I/O
    cflags: Using Symbols
    ch: Page Location Traps
    char: Using Symbols
    chop: Strings
    class: Character Classes
    close: I/O
    color: Colors
    composite: Using Symbols
    continue: while
    cp: Compatibility Mode
    cs: Artificial Fonts
    cu: Artificial Fonts

    D
    da: Diversions
    de: Writing Macros
    de1: Writing Macros
    defcolor: Colors
    dei: Writing Macros
    dei1: Writing Macros
    device: Postprocessor Access
    devicem: Postprocessor Access
    di: Diversions
    do: Compatibility Mode
    ds: ms Document Control Settings
    ds: Strings
    ds1: Strings
    dt: Diversion Traps

    E
    ec: Using Escape Sequences
    ecr: Using Escape Sequences
    ecs: Using Escape Sequences
    el: if-else
    em: End-of-input Traps
    eo: Using Escape Sequences
    ev: Environments
    evc: Environments
    ex: Debugging

    F
    fam: Font Families
    fc: Fields
    fchar: Using Symbols
    fcolor: Colors
    fi: Manipulating Filling and Adjustment
    fl: Debugging
    fp: Font Positions
    fschar: Using Symbols
    fspecial: Special Fonts
    ft: Selecting Fonts
    ftr: Selecting Fonts
    fzoom: Selecting Fonts

    G
    gcolor: Colors

    H
    hc: Manipulating Hyphenation
    hcode: Manipulating Hyphenation
    hla: Manipulating Hyphenation
    hlm: Manipulating Hyphenation
    hpf: Manipulating Hyphenation
    hpfa: Manipulating Hyphenation
    hpfcode: Manipulating Hyphenation
    hw: Manipulating Hyphenation
    hy: Manipulating Hyphenation
    hym: Manipulating Hyphenation
    hys: Manipulating Hyphenation

    I
    ie: if-else
    if: if-then
    ig: Comments
    in: Line Layout
    it: Input Line Traps
    itc: Input Line Traps

    K
    kern: Ligatures and Kerning

    L
    lc: Leaders
    length: Strings
    lf: Debugging
    lg: Ligatures and Kerning
    linetabs: Tabs and Fields
    ll: Line Layout
    ls: Manipulating Spacing
    lsm: Leading Space Traps
    lt: Page Layout

    M
    mc: Miscellaneous
    mk: Page Motions
    mso: I/O
    msoquiet: I/O

    N
    na: Manipulating Filling and Adjustment
    ne: Page Control
    nf: Manipulating Filling and Adjustment
    nh: Manipulating Hyphenation
    nm: Miscellaneous
    nn: Miscellaneous
    nop: if-then
    nr: ms Document Control Settings
    nr: Setting Registers
    nr: Setting Registers
    nr: Auto-increment
    nroff: troff and nroff Modes
    ns: Manipulating Spacing
    nx: I/O

    O
    open: I/O
    opena: I/O
    os: Page Control
    output: Diversions

    P
    pc: Page Layout
    pev: Debugging
    pi: I/O
    pl: Page Layout
    pm: Debugging
    pn: Page Layout
    pnr: Debugging
    po: Line Layout
    ps: Changing the Type Size
    psbb: Miscellaneous
    pso: I/O
    ptr: Debugging
    pvs: Changing the Vertical Spacing

    R
    rchar: Using Symbols
    rd: I/O
    return: Writing Macros
    rfschar: Using Symbols
    rj: Manipulating Filling and Adjustment
    rm: Strings
    rn: Strings
    rnn: Setting Registers
    rr: Setting Registers
    rs: Manipulating Spacing
    rt: Page Motions

    S
    schar: Using Symbols
    shc: Manipulating Hyphenation
    shift: Parameters
    sizes: Changing the Type Size
    so: I/O
    soquiet: I/O
    sp: Manipulating Spacing
    special: Special Fonts
    spreadwarn: Debugging
    ss: Manipulating Filling and Adjustment
    stringdown: Strings
    stringup: Strings
    sty: Font Families
    substring: Strings
    sv: Page Control
    sy: I/O

    T
    ta: Tabs and Fields
    tag: Postprocessor Access
    taga: Postprocessor Access
    tc: Tabs and Fields
    ti: Line Layout
    tkf: Ligatures and Kerning
    tl: Page Layout
    tm: Debugging
    tm1: Debugging
    tmc: Debugging
    tr: Character Translations
    trf: I/O
    trin: Character Translations
    trnt: Character Translations
    troff: troff and nroff Modes

    U
    uf: Artificial Fonts
    ul: Artificial Fonts
    unformat: Diversions

    V
    vpt: Vertical Position Traps
    vs: Changing the Vertical Spacing

    W
    warn: Debugging
    warnscale: Debugging
    wh: Page Location Traps
    while: while
    write: I/O
    writec: I/O
    writem: I/O

    + +
    + + + + +
    +
    +
    + +

    Appendix C Escape Sequence Index

    + +

    The escape character, \ by default, is always followed by at +least one more input character, making an escape sequence. Any +input token \X with X not in the list below emits a +warning and interpolates glyph X. Note the entries for \., +which may be obscured by the leader dots, and for \RET and +\SP, which are sorted alphabetically, not by code point +order. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    \
    \: Using Escape Sequences
    \: Using Symbols
    \!: Diversions
    \": Comments
    \#: Comments
    \$: Parameters
    \$*: Parameters
    \$0: Parameters
    \$@: Parameters
    \$^: Parameters
    \%: Manipulating Hyphenation
    \&: Dummy Characters
    \': Using Symbols
    \(: Using Symbols
    \): Dummy Characters
    \*: Strings
    \,: Italic Corrections
    \-: Using Symbols
    \.: Copy Mode
    \/: Italic Corrections
    \0: Page Motions
    \:: Manipulating Hyphenation
    \?: Diversions
    \A: Identifiers
    \a: Leaders
    \B: Numeric Expressions
    \b: Drawing Geometric Objects
    \c: Line Continuation
    \C: Using Symbols
    \d: Page Motions
    \D: Drawing Geometric Objects
    \e: Using Escape Sequences
    \E: Copy Mode
    \f: Selecting Fonts
    \F: Font Families
    \g: Assigning Register Formats
    \H: Artificial Fonts
    \h: Page Motions
    \k: Page Motions
    \l: Drawing Geometric Objects
    \L: Drawing Geometric Objects
    \m: Colors
    \M: Colors
    \n: Interpolating Registers
    \n: Auto-increment
    \N: Using Symbols
    \newline: Line Continuation
    \o: Page Motions
    \O: Suppressing Output
    \p: Manipulating Filling and Adjustment
    \R: Setting Registers
    \R: Setting Registers
    \r: Page Motions
    \RET: Line Continuation
    \S: Artificial Fonts
    \s: Changing the Type Size
    \SP: Page Motions
    \space: Page Motions
    \t: Tabs and Fields
    \u: Page Motions
    \v: Page Motions
    \V: I/O
    \w: Page Motions
    \x: Manipulating Spacing
    \X: Postprocessor Access
    \Y: Postprocessor Access
    \z: Page Motions
    \Z: Page Motions
    \[: Using Symbols
    \\: Copy Mode
    \^: Page Motions
    \_: Using Symbols
    \`: Using Symbols
    \{: Conditional Blocks
    \{: Conditional Blocks
    \|: Page Motions
    \}: Conditional Blocks
    \~: Manipulating Filling and Adjustment

    +
    + + + + +
    +
    +
    + +

    Appendix D Operator Index

    + +
    +
    Jump to:   ! +   +% +   +& +   +( +   +) +   +* +   ++ +   +- +   +/ +   +: +   +; +   +< +   += +   +> +   +| +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    !
    !: Numeric Expressions

    %
    %: Numeric Expressions

    &
    &: Numeric Expressions

    (
    (: Numeric Expressions

    )
    ): Numeric Expressions

    *
    *: Numeric Expressions

    +
    +: Numeric Expressions
    +: Numeric Expressions
    + (unary): Numeric Expressions

    -
    -: Numeric Expressions
    -: Numeric Expressions
    - (unary): Numeric Expressions

    /
    /: Numeric Expressions

    :
    :: Numeric Expressions

    ;
    ;: Numeric Expressions

    <
    <: Numeric Expressions
    <=: Numeric Expressions
    <?: Numeric Expressions

    =
    =: Numeric Expressions
    ==: Numeric Expressions

    >
    >: Numeric Expressions
    >=: Numeric Expressions
    >?: Numeric Expressions

    |
    |: Numeric Expressions

    + +
    + + + + +
    +
    +
    + +

    Appendix E Register Index

    + +

    The macro package or program a specific register belongs to is appended +in brackets. +

    +

    A register name x consisting of exactly one character can be +accessed as ‘\nx’. A register name xx consisting of exactly +two characters can be accessed as ‘\n(xx’. Register names +xxx of any length can be accessed as ‘\n[xxx]’. +

    +
    +
    Jump to:   $ +   +% +   +. +   +
    +C +   +D +   +F +   +G +   +H +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +Y +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    $
    $$: Built-in Registers

    %
    %: Page Layout
    %: Page Control

    .
    .$: Parameters
    .A: Built-in Registers
    .a: Manipulating Spacing
    .b: Artificial Fonts
    .br: Control Characters
    .c: Built-in Registers
    .C: Compatibility Mode
    .cdp: Environments
    .ce: Manipulating Filling and Adjustment
    .cht: Environments
    .color: Colors
    .cp: Compatibility Mode
    .csk: Environments
    .d: Diversions
    .ev: Environments
    .F: Built-in Registers
    .f: Font Positions
    .fam: Font Families
    .fn: Selecting Fonts
    .fp: Font Positions
    .g: Built-in Registers
    .H: Motion Quanta
    .h: Diversions
    .height: Artificial Fonts
    .hla: Manipulating Hyphenation
    .hlc: Manipulating Hyphenation
    .hlm: Manipulating Hyphenation
    .hy: Manipulating Hyphenation
    .hym: Manipulating Hyphenation
    .hys: Manipulating Hyphenation
    .i: Line Layout
    .in: Line Layout
    .int: Line Continuation
    .j: Manipulating Filling and Adjustment
    .k: Page Motions
    .kern: Ligatures and Kerning
    .L: Manipulating Spacing
    .l: Line Layout
    .lg: Ligatures and Kerning
    .linetabs: Tabs and Fields
    .ll: Line Layout
    .lt: Page Layout
    .m: Colors
    .M: Colors
    .n: Environments
    .ne: Page Location Traps
    .nm: Miscellaneous
    .nn: Miscellaneous
    .ns: Manipulating Spacing
    .o: Line Layout
    .O: Suppressing Output
    .P: Built-in Registers
    .p: Page Layout
    .pe: Page Location Traps
    .pn: Page Layout
    .ps: Using Fractional Type Sizes
    .psr: Using Fractional Type Sizes
    .pvs: Changing the Vertical Spacing
    .R: Built-in Registers
    .rj: Manipulating Filling and Adjustment
    .s: Changing the Type Size
    .slant: Artificial Fonts
    .sr: Using Fractional Type Sizes
    .ss: Manipulating Filling and Adjustment
    .sss: Manipulating Filling and Adjustment
    .sty: Font Families
    .T: Built-in Registers
    .t: Page Location Traps
    .tabs: Tabs and Fields
    .trunc: Page Location Traps
    .U: Built-in Registers
    .u: Manipulating Filling and Adjustment
    .V: Motion Quanta
    .v: Changing the Vertical Spacing
    .vpt: Vertical Position Traps
    .w: Environments
    .warn: Debugging
    .x: Built-in Registers
    .y: Built-in Registers
    .Y: Built-in Registers
    .z: Diversions
    .zoom: Selecting Fonts

    C
    c.: Built-in Registers
    ct: Page Motions

    D
    DD [ms]: ms Document Control Settings
    DI [ms]: ms Document Control Settings
    dl: Diversions
    dn: Diversions
    dw: Built-in Registers
    dy: Built-in Registers

    F
    FF [ms]: ms Document Control Settings
    FI [ms]: ms Document Control Settings
    FM [ms]: ms Document Control Settings
    FPD [ms]: ms Document Control Settings
    FPS [ms]: ms Document Control Settings
    FVS [ms]: ms Document Control Settings

    G
    GROWPS [ms]: ms Document Control Settings
    GS [ms]: Differences from AT&T ms

    H
    HM [ms]: ms Document Control Settings
    HORPHANS [ms]: ms Document Control Settings
    hours: Built-in Registers
    hp: Page Motions
    HY [ms]: ms Document Control Settings

    L
    LL [ms]: ms Document Control Settings
    llx: Miscellaneous
    lly: Miscellaneous
    ln: Miscellaneous
    lsn: Leading Space Traps
    lss: Leading Space Traps
    LT [ms]: ms Document Control Settings

    M
    MINGW [ms]: ms Document Control Settings
    minutes: Built-in Registers
    mo: Built-in Registers

    N
    nl: Page Control

    O
    opmaxx: Suppressing Output
    opmaxy: Suppressing Output
    opminx: Suppressing Output
    opminy: Suppressing Output

    P
    PD [ms]: ms Document Control Settings
    PI [ms]: ms Document Control Settings
    PO [ms]: ms Document Control Settings
    PORPHANS [ms]: ms Document Control Settings
    PS [ms]: ms Document Control Settings
    PSINCR [ms]: ms Document Control Settings

    Q
    QI [ms]: ms Document Control Settings

    R
    rsb: Page Motions
    rst: Page Motions

    S
    sb: Page Motions
    seconds: Built-in Registers
    skw: Page Motions
    slimit: Debugging
    ssc: Page Motions
    st: Page Motions
    systat: I/O

    T
    TC-MARGIN [ms]: ms Document Control Settings

    U
    urx: Miscellaneous
    ury: Miscellaneous

    V
    VS [ms]: ms Document Control Settings

    Y
    year: Built-in Registers
    yr: Built-in Registers

    + +
    + + + + +
    +
    +
    + +

    Appendix F Macro Index

    + +

    The macro package a specific macro belongs to is appended in brackets. +They appear without the leading control character (normally ‘.’). +

    +
    +
    Jump to:   1 +   +2 +   +[ +   +] +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +X +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    1
    1C [ms]: ms Multiple Columns

    2
    2C [ms]: ms Multiple Columns

    [
    [ [ms]: ms Insertions

    ]
    ] [ms]: ms Insertions

    A
    AB [ms]: ms Document Description Macros
    AE [ms]: ms Document Description Macros
    AI [ms]: ms Document Description Macros
    AM [ms]: ms Legacy Features
    AU [ms]: ms Document Description Macros

    B
    B [ms]: Typeface and decoration
    B1 [ms]: ms keeps and displays
    B2 [ms]: ms keeps and displays
    BD [ms]: ms keeps and displays
    BI [ms]: Typeface and decoration
    BT [man]: Optional man extensions
    BX [ms]: Typeface and decoration

    C
    CD [ms]: ms keeps and displays
    CT [man]: Optional man extensions
    CW [man]: Optional man extensions
    CW [ms]: Typeface and decoration

    D
    DA [ms]: ms Document Description Macros
    De [man]: Optional man extensions
    DE [ms]: ms keeps and displays
    Ds [man]: Optional man extensions
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays

    E
    EE [man]: Optional man extensions
    EF [ms]: ms Headers and Footers
    EH [ms]: ms Headers and Footers
    EN [ms]: ms Insertions
    EQ [ms]: ms Insertions
    EX [man]: Optional man extensions

    F
    FE [ms]: ms Footnotes
    FS [ms]: ms Footnotes

    G
    G [man]: Optional man extensions
    GL [man]: Optional man extensions

    H
    HB [man]: Optional man extensions

    I
    I [ms]: Typeface and decoration
    ID [ms]: ms keeps and displays
    IP [ms]: Paragraphs in ms

    K
    KE [ms]: ms keeps and displays
    KF [ms]: ms keeps and displays
    KS [ms]: ms keeps and displays

    L
    LD [ms]: ms keeps and displays
    LG [ms]: Typeface and decoration
    LP [ms]: Paragraphs in ms

    M
    MC [ms]: ms Multiple Columns
    MS [man]: Optional man extensions

    N
    ND [ms]: ms Document Description Macros
    NE [man]: Optional man extensions
    NH [ms]: Headings in ms
    NL [ms]: Typeface and decoration
    NT [man]: Optional man extensions

    O
    OF [ms]: ms Headers and Footers
    OH [ms]: ms Headers and Footers

    P
    P1 [ms]: ms Headers and Footers
    PE [ms]: ms Insertions
    PF [ms]: ms Insertions
    PN [man]: Optional man extensions
    Pn [man]: Optional man extensions
    PP [ms]: Paragraphs in ms
    PS [ms]: ms Insertions
    PT [man]: Optional man extensions
    PX [ms]: ms TOC

    Q
    QE [ms]: Paragraphs in ms
    QP [ms]: Paragraphs in ms
    QS [ms]: Paragraphs in ms

    R
    R [man]: Optional man extensions
    R [ms]: Typeface and decoration
    RD [ms]: ms keeps and displays
    RE [ms]: Indented regions in ms
    RN [man]: Optional man extensions
    RP [ms]: ms Document Description Macros
    RS [ms]: Indented regions in ms

    S
    SH [ms]: Headings in ms
    SM [ms]: Typeface and decoration

    T
    TA [ms]: Tab Stops in ms
    TB [man]: Optional man extensions
    TC [ms]: ms TOC
    TE [ms]: ms Insertions
    TL [ms]: ms Document Description Macros
    TS [ms]: ms Insertions

    U
    UL [ms]: Typeface and decoration

    V
    VE [man]: Optional man extensions
    VS [man]: Optional man extensions

    X
    XA [ms]: ms TOC
    XE [ms]: ms TOC
    XH [ms]: ms TOC
    XH-REPLACEMENT [ms]: ms TOC
    XH-UPDATE-TOC [ms]: ms TOC
    XN [ms]: ms TOC
    XN-INIT [ms]: ms TOC
    XN-REPLACEMENT [ms]: ms TOC
    XP [ms]: Paragraphs in ms
    XS [ms]: ms TOC

    + +
    + + + + +
    +
    +
    + +

    Appendix G String Index

    + +

    The macro package or program a that defines or uses each string is +appended in brackets. (Only one string, .T, is defined by the +troff formatter itself.) See Strings. +

    + +
    +
    Jump to:   ! +   +' +   +* +   +, +   +- +   +. +   +/ +   +3 +   +8 +   +: +   +< +   +> +   +? +   +^ +   +_ +   +` +   +{ +   +} +   +~ +   +
    +A +   +C +   +D +   +F +   +L +   +M +   +O +   +Q +   +R +   +S +   +T +   +U +   +V +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    !
    ! [ms]: ms Legacy Features

    '
    ' [ms]: ms Legacy Features
    ' [ms]: ms Legacy Features

    *
    * [ms]: ms Footnotes

    ,
    , [ms]: ms Legacy Features
    , [ms]: ms Legacy Features

    -
    - [ms]: Typographical symbols in ms

    .
    . [ms]: ms Legacy Features
    .T: Strings
    .T: Strings

    /
    / [ms]: ms Legacy Features

    3
    3 [ms]: ms Legacy Features

    8
    8 [ms]: ms Legacy Features

    :
    : [ms]: ms Legacy Features
    : [ms]: ms Legacy Features

    <
    < [ms]: Typeface and decoration

    >
    > [ms]: Typeface and decoration

    ?
    ? [ms]: ms Legacy Features

    ^
    ^ [ms]: ms Legacy Features
    ^ [ms]: ms Legacy Features

    _
    _ [ms]: ms Legacy Features

    `
    ` [ms]: ms Legacy Features
    ` [ms]: ms Legacy Features

    {
    { [ms]: Typeface and decoration

    }
    } [ms]: Typeface and decoration

    ~
    ~ [ms]: ms Legacy Features
    ~ [ms]: ms Legacy Features

    A
    ABSTRACT [ms]: ms language and localization
    ae [ms]: ms Legacy Features
    Ae [ms]: ms Legacy Features

    C
    C [ms]: ms Legacy Features
    CF [ms]: ms Document Control Settings
    CH [ms]: ms Document Control Settings

    D
    d- [ms]: ms Legacy Features
    D- [ms]: ms Legacy Features

    F
    FAM [ms]: ms Document Control Settings
    FR [ms]: ms Document Control Settings

    L
    LF [ms]: ms Document Control Settings
    LH [ms]: ms Document Control Settings

    M
    MONTH1 [ms]: ms language and localization
    MONTH10 [ms]: ms language and localization
    MONTH11 [ms]: ms language and localization
    MONTH12 [ms]: ms language and localization
    MONTH2 [ms]: ms language and localization
    MONTH3 [ms]: ms language and localization
    MONTH4 [ms]: ms language and localization
    MONTH5 [ms]: ms language and localization
    MONTH6 [ms]: ms language and localization
    MONTH7 [ms]: ms language and localization
    MONTH8 [ms]: ms language and localization
    MONTH9 [ms]: ms language and localization

    O
    o [ms]: ms Legacy Features
    oe [ms]: ms Legacy Features
    OE [ms]: ms Legacy Features

    Q
    Q [ms]: Typographical symbols in ms
    q [ms]: ms Legacy Features

    R
    REFERENCES [ms]: ms language and localization
    RF [ms]: ms Document Control Settings
    RH [ms]: ms Document Control Settings

    S
    SN [ms]: Headings in ms
    SN-DOT [ms]: Headings in ms
    SN-NO-DOT [ms]: Headings in ms
    SN-STYLE [ms]: ms Document Control Settings
    SN-STYLE [ms]: Headings in ms

    T
    th [ms]: ms Legacy Features
    Th [ms]: ms Legacy Features
    TOC [ms]: ms language and localization

    U
    U [ms]: Typographical symbols in ms

    V
    v [ms]: ms Legacy Features

    + +
    + + + + +
    +
    +
    + +

    Appendix H File Keyword Index

    + +
    +
    Jump to:   # +   +- +   +
    +B +   +C +   +F +   +H +   +I +   +K +   +L +   +N +   +P +   +R +   +S +   +T +   +U +   +V +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    #
    #: DESC File Format
    #: Font Description File Format

    -
    ---: Font Description File Format

    B
    biggestfont: DESC File Format

    C
    charset: DESC File Format
    charset: Font Description File Format

    F
    family: Selecting Fonts
    family: DESC File Format
    fonts: Using Symbols
    fonts: Special Fonts
    fonts: DESC File Format

    H
    hor: DESC File Format

    I
    image_generator: DESC File Format

    K
    kernpairs: Font Description File Format

    L
    ligatures: Font Description File Format

    N
    name: Font Description File Format

    P
    paperlength: DESC File Format
    papersize: DESC File Format
    paperwidth: DESC File Format
    pass_filenames: DESC File Format
    postpro: DESC File Format
    prepro: DESC File Format
    print: DESC File Format

    R
    res: DESC File Format

    S
    sizes: DESC File Format
    sizescale: DESC File Format
    slant: Font Description File Format
    spacewidth: Font Description File Format
    spare1: DESC File Format
    spare2: DESC File Format
    special: Artificial Fonts
    special: Font Description File Format
    styles: Selecting Fonts
    styles: Font Families
    styles: DESC File Format

    T
    tcommand: DESC File Format

    U
    unicode: DESC File Format
    unitwidth: DESC File Format
    unscaled_charwidths: DESC File Format
    use_charnames_in_special: Postprocessor Access
    use_charnames_in_special: DESC File Format

    V
    vert: DESC File Format

    + +
    + + + + +
    +
    +
    + +

    Appendix I Program and File Index

    + +
    +
    Jump to:   A +   +C +   +D +   +E +   +F +   +G +   +I +   +J +   +L +   +M +   +N +   +P +   +R +   +S +   +T +   +V +   +Z +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    A
    an.tmac: man

    C
    changebar: Miscellaneous
    composite.tmac: Using Symbols
    cp1047.tmac: Input Encodings
    cs.tmac: Manipulating Hyphenation

    D
    de.tmac: Manipulating Hyphenation
    DESC: Selecting Fonts
    DESC: Font Families
    DESC: Using Symbols
    DESC: Using Symbols
    DESC: Special Fonts
    diffmk: Miscellaneous

    E
    ec.tmac: Input Encodings
    en.tmac: Manipulating Hyphenation
    eqn: ms Insertions

    F
    fr.tmac: Manipulating Hyphenation
    freeeuro.pfa: Input Encodings

    G
    gchem: Groff Options
    gdiffmk: Miscellaneous
    geqn: Groff Options
    ggrn: Groff Options
    gpic: Groff Options
    grap: Groff Options
    grefer: Groff Options
    groff: Groff Options
    gsoelim: Groff Options
    gtbl: Groff Options
    gtroff: Groff Options

    I
    it.tmac: Manipulating Hyphenation

    J
    ja.tmac: Manipulating Hyphenation

    L
    latin1.tmac: Input Encodings
    latin2.tmac: Input Encodings
    latin5.tmac: Input Encodings
    latin9.tmac: Input Encodings

    M
    makeindex: Indexing
    man.local: Optional man extensions
    man.tmac: man
    man.ultrix: Optional man extensions

    N
    nrchbar: Miscellaneous

    P
    papersize.tmac: Paper Format
    perl: I/O
    pic: ms Insertions
    post-grohtml: Groff Options
    pre-grohtml: Groff Options
    preconv: Groff Options

    R
    refer: ms Insertions

    S
    soelim: Debugging
    sv.tmac: Manipulating Hyphenation

    T
    tbl: ms Insertions
    trace.tmac: Writing Macros
    troffrc: Groff Options
    troffrc: Paper Format
    troffrc: Manipulating Hyphenation
    troffrc: Manipulating Hyphenation
    troffrc: troff and nroff Modes
    troffrc-end: Groff Options
    troffrc-end: Manipulating Hyphenation
    troffrc-end: troff and nroff Modes
    tty.tmac: troff and nroff Modes
    tty.tmac: Line Layout

    V
    vtroff: Operators in Conditionals

    Z
    zh.tmac: Manipulating Hyphenation

    + +
    + + + + +
    +
    +
    + +

    Appendix J Concept Index

    + +
    +
    Jump to:   " +   +% +   +& +   +' +   +( +   +) +   +* +   ++ +   +- +   +. +   +/ +   +8 +   +: +   +< +   += +   +> +   +[ +   +\ +   +] +   +| +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +J +   +K +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +W +   +Y +   +Z +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    "
    ", as delimiter: Delimiters
    ", at end of sentence: Sentences
    ", at end of sentence: Using Symbols
    ", embedding in a macro argument: Calling Macros

    %
    %, as delimiter: Delimiters

    &
    &, as delimiter: Delimiters

    '
    ', as a comment: Comments
    ', as delimiter: Delimiters
    ', at end of sentence: Sentences
    ', at end of sentence: Using Symbols

    (
    (, as delimiter: Delimiters

    )
    ), as delimiter: Delimiters
    ), at end of sentence: Sentences
    ), at end of sentence: Using Symbols

    *
    *, as delimiter: Delimiters
    *, at end of sentence: Sentences
    *, at end of sentence: Using Symbols

    +
    +, and page motion: Numeric Expressions
    +, as delimiter: Delimiters

    -
    -, and page motion: Numeric Expressions
    -, as delimiter: Delimiters

    .
    ., as delimiter: Delimiters
    .h register, difference from nl: Diversions
    .ps register, in comparison with .psr: Using Fractional Type Sizes
    .s register, in comparison with .sr: Using Fractional Type Sizes
    .S register, Plan 9 alias for .tabs: Tabs and Fields
    .t register, and diversions: Diversion Traps
    .tabs register, Plan 9 alias (.S): Tabs and Fields
    .V register, and vs: Changing the Vertical Spacing

    /
    /, as delimiter: Delimiters

    8
    8-bit input: Font Description File Format

    :
    :, as delimiter: Delimiters

    <
    <, as delimiter: Delimiters

    =
    =, as delimiter: Delimiters

    >
    >, as delimiter: Delimiters

    [
    [, macro names starting with, and refer: Identifiers

    \
    \!, and copy mode: Diversions
    \!, and output request: Diversions
    \!, and trnt: Character Translations
    \!, as delimiter: Delimiters
    \!, as delimiter: Delimiters
    \!, in top-level diversion: Diversions
    \!, incompatibilities with AT&T troff: Other Differences
    \!, incompatibilities with AT&T troff: Other Differences
    \$, when reading text for a macro: Copy Mode
    \%, and translations: Character Translations
    \%, as delimiter: Delimiters
    \%, as delimiter: Delimiters
    \%, following \X or \Y: Manipulating Hyphenation
    \%, in \X: Postprocessor Access
    \%, incompatibilities with AT&T troff: Other Differences
    \&, and glyph definitions: Using Symbols
    \&, and translations: Character Translations
    \&, as delimiter: Delimiters
    \&, at end of sentence: Sentences
    \&, in \X: Postprocessor Access
    \&, incompatibilities with AT&T troff: Other Differences
    \', and translations: Character Translations
    \', as delimiter: Delimiters
    \', as delimiter: Delimiters
    \', incompatibilities with AT&T troff: Other Differences
    \(, and translations: Character Translations
    \), as delimiter: Delimiters
    \), in \X: Postprocessor Access
    \*, and warnings: Warnings
    \*, incompatibilities with AT&T troff: Compatibility Mode
    \*, when reading text for a macro: Copy Mode
    \, disabling (eo): Using Escape Sequences
    \, embedding in a macro argument: Calling Macros
    \,, as delimiter: Delimiters
    \- glyph, and cflags: Using Symbols
    \-, and translations: Character Translations
    \-, as delimiter: Delimiters
    \-, as delimiter: Delimiters
    \-, incompatibilities with AT&T troff: Other Differences
    \/, as delimiter: Delimiters
    \/, as delimiter: Delimiters
    \0, as delimiter: Delimiters
    \:, as delimiter: Delimiters
    \:, as delimiter: Delimiters
    \:, in \X: Postprocessor Access
    \?, and copy mode: Operators in Conditionals
    \?, and copy mode: Diversions
    \?, as delimiter: Delimiters
    \?, in top-level diversion: Diversions
    \?, incompatibilities with AT&T troff: Other Differences
    \a, and copy mode: Leaders
    \a, and translations: Character Translations
    \a, as delimiter: Delimiters
    \A, delimiters allowed by: Delimiters
    \A, incompatibilities with AT&T troff: Other Differences
    \b, delimiters allowed by: Delimiters
    \b, limitations of: Drawing Geometric Objects
    \C, and translations: Character Translations
    \c, as delimiter: Delimiters
    \c, as delimiter: Delimiters
    \c, incompatibilities with AT&T troff: Other Differences
    \c, when filling disabled: Line Continuation
    \c, when filling enabled: Line Continuation
    \d, as delimiter: Delimiters
    \D, delimiters allowed by: Delimiters
    \e, and glyph definitions: Using Symbols
    \e, and translations: Character Translations
    \e, as delimiter: Delimiters
    \E, as delimiter: Delimiters
    \e, as delimiter: Delimiters
    \e, incompatibilities with AT&T troff: Other Differences
    \F, and changing fonts: Selecting Fonts
    \f, and font translations: Selecting Fonts
    \f, incompatibilities with AT&T troff: Compatibility Mode
    \h, delimiters allowed by: Delimiters
    \H, delimiters allowed by: Delimiters
    \H, incompatibilities with AT&T troff: Compatibility Mode
    \H, using + and - with: Numeric Expressions
    \H, with fractional type sizes: Using Fractional Type Sizes
    \l, and glyph definitions: Using Symbols
    \L, and glyph definitions: Using Symbols
    \l, delimiters allowed by: Delimiters
    \L, delimiters allowed by: Delimiters
    \N, and translations: Character Translations
    \n, and warnings: Warnings
    \N, delimiters allowed by: Delimiters
    \n, incompatibilities with AT&T troff: Compatibility Mode
    \n, when reading text for a macro: Copy Mode
    \o, delimiters allowed by: Delimiters
    \p, as delimiter: Delimiters
    \p, as delimiter: Delimiters
    \R, after \c: Line Continuation
    \R, and warnings: Warnings
    \r, as delimiter: Delimiters
    \R, delimiters allowed by: Delimiters
    \R, difference from nr: Auto-increment
    \R, using + and - with: Numeric Expressions
    \RET, when reading text for a macro: Copy Mode
    \s, delimiters allowed by: Delimiters
    \S, delimiters allowed by: Delimiters
    \s, incompatibilities with AT&T troff: Compatibility Mode
    \S, incompatibilities with AT&T troff: Compatibility Mode
    \s, incompatibilities with AT&T troff: Compatibility Mode
    \s, using + and - with: Numeric Expressions
    \s, with fractional type sizes: Using Fractional Type Sizes
    \SP, as delimiter: Delimiters
    \SP, difference from \~: Calling Macros
    \SP, incompatibilities with AT&T troff: Other Differences
    \t, and copy mode: Tabs and Fields
    \t, and translations: Character Translations
    \t, and warnings: Warnings
    \t, as delimiter: Delimiters
    \u, as delimiter: Delimiters
    \V, and copy mode: I/O
    \v, delimiters allowed by: Delimiters
    \v, internal representation: Gtroff Internals
    \w, delimiters allowed by: Delimiters
    \X, and special characters: Postprocessor Access
    \X, delimiters allowed by: Delimiters
    \x, delimiters allowed by: Delimiters
    \X, followed by \%: Manipulating Hyphenation
    \Y, followed by \%: Manipulating Hyphenation
    \Z, delimiters allowed by: Delimiters
    \[, and translations: Character Translations
    \\, when reading text for a macro: Copy Mode
    \^, as delimiter: Delimiters
    \^, incompatibilities with AT&T troff: Other Differences
    \_, and translations: Character Translations
    \_, as delimiter: Delimiters
    \_, as delimiter: Delimiters
    \_, incompatibilities with AT&T troff: Other Differences
    \`, and translations: Character Translations
    \`, as delimiter: Delimiters
    \`, as delimiter: Delimiters
    \`, incompatibilities with AT&T troff: Other Differences
    \{, as delimiter: Delimiters
    \{, as delimiter: Delimiters
    \{, incompatibilities with AT&T troff: Other Differences
    \|, as delimiter: Delimiters
    \|, incompatibilities with AT&T troff: Other Differences
    \}, and warnings: Warnings
    \}, as delimiter: Delimiters
    \}, as delimiter: Delimiters
    \}, incompatibilities with AT&T troff: Other Differences
    \~, and translations: Character Translations
    \~, as delimiter: Delimiters
    \~, difference from \SP: Calling Macros
    \~, incompatibilities with AT&T troff: Other Differences

    ]
    ], as part of an identifier: Identifiers
    ], at end of sentence: Sentences
    ], at end of sentence: Using Symbols
    ], macro names starting with, and refer: Identifiers

    |
    |, and page motion: Numeric Expressions

    A
    ab request, incompatibilities with AT&T troff: Other Differences
    aborting (ab): Debugging
    absolute (sic) position operator (|): Numeric Expressions
    abstract font style: Using Fonts
    abstract font style, setting up (sty): Font Families
    accent marks [ms]: ms Legacy Features
    access to postprocessor: Postprocessor Access
    accessing unnamed glyphs with \N: Font Description File Format
    activating kerning (kern): Ligatures and Kerning
    activating ligatures (lg): Ligatures and Kerning
    activating track kerning (tkf): Ligatures and Kerning
    ad request, and hyphenation margin: Manipulating Hyphenation
    ad request, and hyphenation space: Manipulating Hyphenation
    addition: Numeric Expressions
    additional inter-sentence space: Manipulating Filling and Adjustment
    adjustment and filling, manipulating: Manipulating Filling and Adjustment
    adjustment mode register (.j): Manipulating Filling and Adjustment
    adjustment to both margins, difference from AT&T troff: Other Differences
    Adobe Glyph List (AGL): Using Symbols
    alias, diversion, creating (als): Strings
    alias, diversion, removing (rm): Strings
    alias, macro, creating (als): Strings
    alias, macro, removing (rm): Strings
    alias, register, creating (aln): Setting Registers
    alias, register, removing (rr): Setting Registers
    alias, string, creating (als): Strings
    alias, string, removing (rm): Strings
    aliasing fonts with third argument to fp request: Font Positions
    als request, and \$0: Parameters
    am, am1, ami requests, and warnings: Warnings
    appending to a diversion (da, boxa): Diversions
    appending to a file (opena): I/O
    appending to a macro (am): Writing Macros
    appending to a string (as): Strings
    approximation output register (.A): Built-in Registers
    arc, drawing (‘\D'a …'’): Drawing Geometric Objects
    argument: Requests and Macros
    arguments to macros: Calling Macros
    arguments to macros, and tabs: Invoking Requests
    arguments to requests: Invoking Requests
    arguments to requests, and tabs: Invoking Requests
    arguments, and compatibility mode: Gtroff Internals
    arguments, to escape sequences, delimiting: Delimiters
    arguments, to strings: Strings
    arithmetic operators: Numeric Expressions
    artificial fonts: Artificial Fonts
    as, as1 requests, and comments: Comments
    as, as1 requests, and warnings: Warnings
    ASCII output encoding: Groff Options
    asciify request, and writem: I/O
    assertion (arithmetic operator): Numeric Expressions
    assign number format to register (af): Assigning Register Formats
    assignments, indirect: Interpolating Registers
    assignments, nested: Interpolating Registers
    AT&T ms, macro package differences: Differences from AT&T ms
    attributes, character cell: Using Fonts
    auto-incrementation of a register: Auto-increment
    automatic font mounting: Selecting Fonts
    automatic hyphenation: Manipulating Hyphenation
    automatic hyphenation parameters: Manipulating Hyphenation
    auxiliary macro package: Major Macro Packages
    available glyphs, list of (groff_char(7) man page): Using Symbols

    B
    background: Background
    background color name register (.M): Colors
    backslash glyph, formatting (\[rs]): Using Escape Sequences
    backslash, embedding in a macro argument: Calling Macros
    backslash, printing (\\, \e, \E, \[rs]): Other Differences
    backspace character, and translations: Character Translations
    backtrace of input stack (backtrace): Debugging
    baseline rule special character(\[ru]): Drawing Geometric Objects
    baseline, text: Page Geometry
    baseline, text: Manipulating Type Size and Vertical Spacing
    basic scaling unit (u): Measurements
    basic units: Page Geometry
    basic units, conversion to: Measurements
    basics of macro package usage: Basics
    bd request, and font styles: Font Families
    bd request, and font translations: Selecting Fonts
    bd request, incompatibilities with AT&T troff: Other Differences
    beginning diversion (di, box): Diversions
    beginning of conditional block (\{): Conditional Blocks
    blank line: Breaking
    blank line macro (blm): Breaking
    blank line macro (blm): Invoking Requests
    blank line macro (blm): Blank Line Traps
    blank line trap (blm): Invoking Requests
    blank line traps: Blank Line Traps
    blank lines, disabling: Manipulating Spacing
    block, conditional, beginning (\{): Conditional Blocks
    block, conditional, end (\}): Conditional Blocks
    blocks, conditional: Conditional Blocks
    body, of a while request: while
    boldface, imitating (bd): Artificial Fonts
    bottom margin: Page Location Traps
    boundary-relative motion operator (|): Numeric Expressions
    bounding box: Miscellaneous
    box (diversion operation): Diversions
    box request, and warnings: Warnings
    box rule glyph (\[br]): Drawing Geometric Objects
    box, boxa requests, and warnings: Warnings
    boxa request, and dn (dl): Diversions
    boxa request, and warnings: Warnings
    boxes [ms]: ms keeps and displays
    bp request, and top-level diversion: Page Control
    bp request, and traps (.pe): Page Location Traps
    bp request, causing implicit break: Manipulating Filling and Adjustment
    bp request, incompatibilities with AT&T troff: Other Differences
    bp request, using + and - with: Numeric Expressions
    br glyph, and cflags: Using Symbols
    brace escape sequence, closing (\}): Conditional Blocks
    brace escape sequence, opening (\}): Conditional Blocks
    brace escape sequences (\{, \}): Conditional Blocks
    break: Breaking
    break: Manipulating Filling and Adjustment
    break (introduction): Basics
    break request, in a while loop: while
    break, page: Page Geometry
    break, page: Page Control
    break, page: The Implicit Page Trap
    break, page (introduction): Basics
    break, page, final: End-of-input Traps
    break, page, prevented by vpt: Vertical Position Traps
    breaking file names (\:): Manipulating Hyphenation
    breaking URLs (\:): Manipulating Hyphenation
    breaking without hyphens (\:): Manipulating Hyphenation
    built-in register, removing: Built-in Registers
    built-in registers: Built-in Registers
    bulleted list, example markup [ms]: Lists in ms

    C
    c scaling unit: Measurements
    calling a macro: Requests and Macros
    calling macros: Calling Macros
    capabilities of groff: groff Capabilities
    case-transforming a string (stringdown, stringup): Strings
    categories, warning: Warnings
    CCSID 1047 output encoding (EBCDIC): Groff Options
    ce request, causing implicit break: Manipulating Filling and Adjustment
    ce request, difference from ‘.ad c: Manipulating Filling and Adjustment
    cell, character, attributes: Using Fonts
    centered text (filled): Manipulating Filling and Adjustment
    centered text (unfilled): Manipulating Filling and Adjustment
    centering lines (ce): Manipulating Filling and Adjustment
    centering lines (introduction): Basics
    centimeter scaling unit (c): Measurements
    cf request, and copy mode: I/O
    cf request, causing implicit break: Manipulating Filling and Adjustment
    changing control characters: Control Characters
    changing font family (fam, \F): Font Families
    changing fonts (ft, \f): Selecting Fonts
    changing format, and read-only registers: Assigning Register Formats
    changing the font height (\H): Artificial Fonts
    changing the font slant (\S): Artificial Fonts
    changing the page number character (pc): Page Layout
    changing trap location (ch): Page Location Traps
    changing type sizes (ps, \s): Changing the Type Size
    changing vertical line spacing (vs): Changing the Vertical Spacing
    char request, and soft hyphen character: Manipulating Hyphenation
    char request, and translations: Character Translations
    char request, used with \N: Using Symbols
    character: Using Symbols
    character cell attributes: Using Fonts
    character class (class): Character Classes
    character classes: Character Classes
    character properties (cflags): Using Symbols
    character translations: Character Translations
    character, backspace, and translations: Character Translations
    character, control (.): Requests and Macros
    character, control, changing (cc): Control Characters
    character, defining (char): Using Symbols
    character, defining fallback (fchar, fschar, schar): Using Symbols
    character, distinguished from glyph: Using Symbols
    character, dummy (\&): Dummy Characters
    character, dummy (\&), as control character suppressor: Requests and Macros
    character, dummy (\&), effect on kerning: Ligatures and Kerning
    character, dummy (\&), effect on \l escape sequence: Drawing Geometric Objects
    character, escape, changing (ec): Using Escape Sequences
    character, escape, while defining glyph: Using Symbols
    character, field delimiting (fc): Fields
    character, field padding (fc): Fields
    character, horizontal tab: Tabs and Leaders
    character, hyphenation (\%): Manipulating Hyphenation
    character, leader: Tabs and Leaders
    character, leader repetition (lc): Leaders
    character, leader, and translations: Character Translations
    character, leader, non-interpreted (\a): Leaders
    character, named (\C): Using Symbols
    character, newline, and translations: Character Translations
    character, no-break control ('): Requests and Macros
    character, no-break control, changing (c2): Control Characters
    character, ordinary: Identifiers
    character, soft hyphen, setting (shc): Manipulating Hyphenation
    character, special: Character Translations
    character, tab repetition (tc): Tabs and Fields
    character, tab, and translations: Character Translations
    character, tab, non-interpreted (\t): Tabs and Fields
    character, transparent: Using Symbols
    character, transparent dummy (\)): Dummy Characters
    characters, end-of-sentence: Using Symbols
    characters, end-of-sentence transparent: Sentences
    characters, hyphenation: Using Symbols
    characters, input, and output glyphs, compatibility with AT&T troff: Other Differences
    characters, invalid for trf request: I/O
    characters, invalid input: Identifiers
    characters, overlapping: Using Symbols
    characters, special: Sentences
    characters, special, list of (groff_char(7) man page): Using Symbols
    characters, unnamed, accessing with \N: Font Description File Format
    circle, filled, drawing (‘\D'C …'’): Drawing Geometric Objects
    circle, outlined, drawing (‘\D'c …'’): Drawing Geometric Objects
    circle, solid, drawing (‘\D'C …'’): Drawing Geometric Objects
    circle, stroked, drawing (‘\D'c …'’): Drawing Geometric Objects
    class of characters (class): Character Classes
    classes, character: Character Classes
    clearing input line trap (it, itc): Input Line Traps
    closing brace escape sequence (\}): Conditional Blocks
    closing file (close): I/O
    code page 1047 output encoding: Groff Options
    code page 1047, input encoding: Input Encodings
    code, hyphenation (hcode): Manipulating Hyphenation
    color name, background, register (.M): Colors
    color name, fill, register (.M): Colors
    color name, stroke, register (.m): Colors
    color, default: Colors
    color, fill: Colors
    color, stroke: Colors
    colors: Colors
    command prefix: Environment
    command-line options: Groff Options
    comments: Comments
    comments in device description files: DESC File Format
    comments in font description files: Font Description File Format
    comments, lining up with tabs: Comments
    comments, with ds: Strings
    common features: Common Features
    common name space of macros, diversions, and strings: Identifiers
    comparison of strings: Operators in Conditionals
    comparison operators: Numeric Expressions
    compatibility mode: Warnings
    compatibility mode: Compatibility Mode
    compatibility mode, and parameters: Gtroff Internals
    complementation, logical: Numeric Expressions
    composite glyph names: Using Symbols
    conditional block, beginning (\{): Conditional Blocks
    conditional block, end (\}): Conditional Blocks
    conditional blocks: Conditional Blocks
    conditional expressions: Operators in Conditionals
    conditional output for terminal (TTY): Operators in Conditionals
    conditional page break (ne): Page Control
    conditionals and loops: Conditionals and Loops
    configuring control characters: Control Characters
    configuring the page length (pl): Page Layout
    consecutive hyphenated lines (hlm): Manipulating Hyphenation
    constant glyph space mode (cs): Artificial Fonts
    contents, table of: Table of Contents
    contents, table of: Leaders
    continuation, input line (\RET): Line Continuation
    continuation, output line (\c): Line Continuation
    continue request, in a while loop: while
    continued output line register (.int): Line Continuation
    continuous underlining (cu): Artificial Fonts
    control character (.): Requests and Macros
    control character, changing (cc): Control Characters
    control character, no-break ('): Requests and Macros
    control character, no-break, changing (c2): Control Characters
    control characters: Control Characters
    control line: Requests and Macros
    control, line: Line Continuation
    control, page: Page Control
    conventions for input: Input Conventions
    conversion to basic units: Measurements
    copy mode: Copy Mode
    copy mode: Copy Mode
    copy mode, and cf request: I/O
    copy mode, and device request: Postprocessor Access
    copy mode, and length request: Strings
    copy mode, and macro parameters: Parameters
    copy mode, and output request: Diversions
    copy mode, and trf request: I/O
    copy mode, and write request: I/O
    copy mode, and writec request: I/O
    copy mode, and writem request: I/O
    copy mode, and \!: Diversions
    copy mode, and \?: Operators in Conditionals
    copy mode, and \?: Diversions
    copy mode, and \a: Leaders
    copy mode, and \t: Tabs and Fields
    copy mode, and \V: I/O
    copying environment (evc): Environments
    correction between oblique and upright glyph (\/, \,): Italic Corrections
    correction between upright and oblique glyph (\/, \,): Italic Corrections
    correction, italic (\/): Italic Corrections
    correction, left italic (\,): Italic Corrections
    cover page in [ms], example markup: ms Document Description Macros
    cp request, and glyph definitions: Using Symbols
    cq glyph, at end of sentence: Sentences
    cq glyph, at end of sentence: Using Symbols
    creating alias for register (aln): Setting Registers
    creating alias, for diversion (als): Strings
    creating alias, for macro (als): Strings
    creating alias, for string (als): Strings
    creating new characters (char): Using Symbols
    credits: Credits
    cs request, and font styles: Font Families
    cs request, and font translations: Selecting Fonts
    cs request, incompatibilities with AT&T troff: Other Differences
    cs request, with fractional type sizes: Using Fractional Type Sizes
    CSTR #54 errata: Built-in Registers
    CSTR #54 errata: Line Layout
    CSTR #54 errata: Page Control
    CSTR #54 errata: Artificial Fonts
    CSTR #54 errata: Changing the Type Size
    CSTR #54 errata: Page Motions
    CSTR #54 erratum, bp request: Page Control
    CSTR #54 erratum, po request: Line Layout
    CSTR #54 erratum, ps request: Changing the Type Size
    CSTR #54 erratum, sb register: Page Motions
    CSTR #54 erratum, st register: Page Motions
    CSTR #54 erratum, yr register: Built-in Registers
    CSTR #54 erratum, \S escape: Artificial Fonts
    CSTR #54 erratum, \s escape sequence: Changing the Type Size
    current directory: Macro Directories
    current input file name register (.F): Built-in Registers
    current page number (%): Page Control
    current time, hours (hours): Built-in Registers
    current time, minutes (minutes): Built-in Registers
    current time, seconds (seconds): Built-in Registers

    D
    da request, and dn (dl): Diversions
    da request, and warnings: Warnings
    da request, and warnings: Warnings
    date, day of the month register (dy): Built-in Registers
    date, day of the week register (dw): Built-in Registers
    date, month of the year register (mo): Built-in Registers
    date, year register (year, yr): Built-in Registers
    day of the month register (dy): Built-in Registers
    day of the week register (dw): Built-in Registers
    dd glyph, at end of sentence: Sentences
    dd glyph, at end of sentence: Using Symbols
    de request, and while: while
    de, de1, dei requests, and warnings: Warnings
    debugging: Debugging
    debugging page location traps: Page Location Traps
    decimal point, as delimiter: Delimiters
    decrementation, automatic, of a register: Auto-increment
    default color: Colors
    default tab stops: Tabs and Fields
    default units: Default Units
    deferred output: Deferring Output
    defining character (char): Using Symbols
    defining character class (class): Character Classes
    defining fallback character (fchar, fschar, schar): Using Symbols
    defining glyph (char): Using Symbols
    defining symbol (char): Using Symbols
    delimited arguments, incompatibilities with AT&T troff: Compatibility Mode
    delimiters, for escape sequence arguments: Delimiters
    delimiting character, for fields (fc): Fields
    delimiting escape sequence arguments: Delimiters
    depth, interpolation: Calling Macros
    depth, of last glyph (.cdp): Environments
    DESC file format: DESC File Format
    DESC file, and font mounting: Font Positions
    DESC file, and use_charnames_in_special keyword: Postprocessor Access
    description file, font: Using Fonts
    device description files, comments: DESC File Format
    device request, and copy mode: Postprocessor Access
    device resolution: Page Geometry
    device resolution: DESC File Format
    device resolution, obtaining in the formatter: Measurements
    devices for output: Output Device Intro
    dg glyph, at end of sentence: Sentences
    dg glyph, at end of sentence: Using Symbols
    di request, and warnings: Warnings
    di request, and warnings: Warnings
    differences in implementation: Implementation Differences
    digit-width space (\0): Page Motions
    digits, as delimiters: Delimiters
    dimensions, line: Line Layout
    directories for fonts: Font Directories
    directories for macros: Macro Directories
    directory, current: Macro Directories
    directory, for tmac files: Macro Directories
    directory, home: Macro Directories
    directory, platform-specific: Macro Directories
    directory, site-local: Macro Directories
    directory, site-local: Font Directories
    disabling hyphenation (\%): Manipulating Hyphenation
    disabling \ (eo): Using Escape Sequences
    discardable horizontal space: Manipulating Filling and Adjustment
    displays: Displays and Keeps
    displays [ms]: ms keeps and displays
    displays, and footnotes [ms]: ms Footnotes
    distance to next vertical position trap register (.t): Page Location Traps
    diversion: Deferring Output
    diversion name register (.z): Diversions
    diversion trap, setting (dt): Diversion Traps
    diversion traps: Diversion Traps
    diversion, appending to (da, boxa): Diversions
    diversion, beginning (di, box): Diversions
    diversion, creating alias for (als): Strings
    diversion, ending (di, box): Diversions
    diversion, nested: Diversions
    diversion, removing (rm): Strings
    diversion, removing alias for (rm): Strings
    diversion, renaming (rn): Strings
    diversion, stripping final newline: Punning Names
    diversion, top-level: Diversions
    diversion, top-level, and bp: Page Control
    diversion, top-level, and \!: Diversions
    diversion, top-level, and \?: Diversions
    diversion, unformatting (asciify): Diversions
    diversion, vertical position in, register (.d): Diversions
    diversions: Diversions
    diversions: Punning Names
    diversions, and traps: Page Location Traps
    diversions, shared name space with macros and strings: Identifiers
    division, truncating: Numeric Expressions
    dl register, and da (boxa): Diversions
    dn register, and da (boxa): Diversions
    document description macros, [ms]: ms Document Description Macros
    document formats: Document Formats
    documents, multi-file: Debugging
    documents, structuring the source of: Invoking Requests
    dot, as delimiter: Delimiters
    double quote, embedding in a macro argument: Calling Macros
    double quotes, trailing, in strings: Strings
    double-spacing (ls): Manipulating Spacing
    double-spacing (vs, pvs): Changing the Vertical Spacing
    down-casing a string (stringdown): Strings
    drawing a filled circle (‘\D'C …'’): Drawing Geometric Objects
    drawing a filled ellipse (‘\D'E …'’): Drawing Geometric Objects
    drawing a filled polygon (‘\D'P …'’): Drawing Geometric Objects
    drawing a line (‘\D'l …'’): Drawing Geometric Objects
    drawing a solid circle (‘\D'C …'’): Drawing Geometric Objects
    drawing a solid ellipse (‘\D'E …'’): Drawing Geometric Objects
    drawing a solid polygon (‘\D'P …'’): Drawing Geometric Objects
    drawing a spline (‘\D'~ …'’): Drawing Geometric Objects
    drawing a stroked circle (‘\D'c …'’): Drawing Geometric Objects
    drawing a stroked ellipse (‘\D'e …'’): Drawing Geometric Objects
    drawing a stroked polygon (‘\D'p …'’): Drawing Geometric Objects
    drawing an arc (‘\D'a …'’): Drawing Geometric Objects
    drawing an outlined circle (‘\D'c …'’): Drawing Geometric Objects
    drawing an outlined ellipse (‘\D'e …'’): Drawing Geometric Objects
    drawing an outlined polygon (‘\D'p …'’): Drawing Geometric Objects
    drawing horizontal lines (\l): Drawing Geometric Objects
    drawing position: Page Geometry
    drawing position, vertical (nl): Page Control
    drawing requests: Drawing Geometric Objects
    drawing vertical lines (\L): Drawing Geometric Objects
    ds request, and comments: Strings
    ds request, and double quotes: Strings
    ds request, and leading spaces: Strings
    ds, ds1 requests, and comments: Comments
    ds, ds1 requests, and warnings: Warnings
    dummy character (\&): Dummy Characters
    dummy character (\&), as control character suppressor: Requests and Macros
    dummy character (\&), effect on kerning: Ligatures and Kerning
    dummy character (\&), effect on \l escape sequence: Drawing Geometric Objects
    dummy character, transparent (\)): Dummy Characters
    dummy environment, used by \w escape sequence: Page Motions
    dumping environments (pev): Debugging
    dumping page location traps (ptr): Debugging
    dumping registers (pnr): Debugging
    dumping symbol table (pm): Debugging

    E
    EBCDIC output encoding: Groff Options
    EBCDIC, input encoding: Input Encodings
    ejection, page: Page Geometry
    ejection, page: Page Control
    ejection, page: The Implicit Page Trap
    ejection, page, of final page: End-of-input Traps
    ejection, page, prevented by vpt: Vertical Position Traps
    el request, and warnings: Warnings
    ellipse, filled, drawing (‘\D'E …'’): Drawing Geometric Objects
    ellipse, outlined, drawing (‘\D'e …'’): Drawing Geometric Objects
    ellipse, solid, drawing (‘\D'E …'’): Drawing Geometric Objects
    ellipse, stroked, drawing (‘\D'e …'’): Drawing Geometric Objects
    em glyph, and cflags: Using Symbols
    em scaling unit (m): Measurements
    embolding of special fonts: Artificial Fonts
    empty line: Breaking
    en scaling unit (n): Measurements
    enabling vertical position traps (vpt): Vertical Position Traps
    encoding, input, code page 1047: Input Encodings
    encoding, input, EBCDIC: Input Encodings
    encoding, input, Latin-1 (ISO 8859-1): Input Encodings
    encoding, input, Latin-2 (ISO 8859-2): Input Encodings
    encoding, input, Latin-5 (ISO 8859-9): Input Encodings
    encoding, input, Latin-9 (ISO 8859-15): Input Encodings
    encoding, output, ASCII: Groff Options
    encoding, output, code page 1047: Groff Options
    encoding, output, EBCDIC: Groff Options
    encoding, output, ISO 646: Groff Options
    encoding, output, Latin-1 (ISO 8859-1): Groff Options
    encoding, output, UTF-8: Groff Options
    end of conditional block (\}): Conditional Blocks
    end-of-input macro (em): End-of-input Traps
    end-of-input trap, setting (em): End-of-input Traps
    end-of-input traps: End-of-input Traps
    end-of-sentence characters: Sentences
    end-of-sentence characters: Using Symbols
    end-of-sentence transparent characters: Sentences
    ending diversion (di, box): Diversions
    endnotes: Footnotes and Endnotes
    environment: Deferring Output
    environment availability and naming, incompatibilities with: Other Differences
    environment number/name register (.ev): Environments
    environment variables: Environment
    environment, copying (evc): Environments
    environment, dimensions of last glyph (.w, .cht, .cdp, .csk): Environments
    environment, dummy, used by \w escape sequence: Page Motions
    environment, previous line length (.n): Environments
    environment, switching (ev): Environments
    environments: Environments
    environments, dumping (pev): Debugging
    equality operator: Numeric Expressions
    equation example [ms]: ms Insertions
    equations [ms]: ms Insertions
    escape character, changing (ec): Using Escape Sequences
    escape character, formatting (\e): Using Escape Sequences
    escape character, while defining glyph: Using Symbols
    escape sequence: Formatter Instructions
    escape sequence argument delimiters: Delimiters
    escape sequences: Using Escape Sequences
    escape sequences, brace (\{, \}): Conditional Blocks
    escaping newline characters, in strings: Strings
    ex request, use in debugging: Debugging
    ex request, used with nx and rd: I/O
    example markup, bulleted list [ms]: Lists in ms
    example markup, cover page in [ms]: ms Document Description Macros
    example markup, glossary-style list [ms]: Lists in ms
    example markup, numbered list [ms]: Lists in ms
    examples of invocation: Invocation Examples
    exiting (ex): Debugging
    expansion of strings (\*): Strings
    explicit hyphen (\%): Manipulating Hyphenation
    explicit hyphenation: Manipulating Hyphenation
    expression, limitation of logical not in: Numeric Expressions
    expression, order of evaluation: Numeric Expressions
    expressions, and register format: Assigning Register Formats
    expressions, and space characters: Numeric Expressions
    expressions, conditional: Operators in Conditionals
    expressions, numeric: Numeric Expressions
    extra post-vertical line space (\x): Changing the Vertical Spacing
    extra post-vertical line space register (.a): Manipulating Spacing
    extra pre-vertical line space (\x): Changing the Vertical Spacing
    extra spaces between words: Adjustment
    extreme values representable with Roman numerals: Assigning Register Formats
    extremum operators (>?, <?): Numeric Expressions

    F
    f scaling unit: Colors
    factor, zoom, of a font (fzoom): Selecting Fonts
    fallback character, defining (fchar, fschar, schar): Using Symbols
    fallback glyph, removing definition (rchar, rfschar): Using Symbols
    fam request, and changing fonts: Selecting Fonts
    families, font: Font Families
    family, font: Using Fonts
    features, common: Common Features
    fi request, causing implicit break: Manipulating Filling and Adjustment
    field delimiting character (fc): Fields
    field padding character (fc): Fields
    fields: Fields
    fields, and tabs: Tabs and Fields
    figure space (\0): Page Motions
    figures [ms]: ms Insertions
    file formats: File Formats
    file names, breaking (\:): Manipulating Hyphenation
    file, appending to (opena): I/O
    file, closing (close): I/O
    file, font description: Using Fonts
    file, inclusion (so): I/O
    file, macro, search path: Macro Directories
    file, opening (open): I/O
    file, processing next (nx): I/O
    file, writing to (write, writec): I/O
    files, font: Device and Font Description Files
    fill color: Colors
    fill color name register (.M): Colors
    fill mode (fi), enabling: Manipulating Filling and Adjustment
    fill mode, and \c: Line Continuation
    fill mode, disabling: Manipulating Filling and Adjustment
    filled circle, drawing (‘\D'C …'’): Drawing Geometric Objects
    filled ellipse, drawing (‘\D'E …'’): Drawing Geometric Objects
    filled polygon, drawing (‘\D'P …'’): Drawing Geometric Objects
    filling: Filling
    filling and adjustment, manipulating: Manipulating Filling and Adjustment
    filling of output, disabling (nf): Manipulating Filling and Adjustment
    filling of output, enabling (fi): Manipulating Filling and Adjustment
    filling, and break warnings: Warnings
    filling, and inter-sentence space: Manipulating Filling and Adjustment
    final newline, stripping in diversions: Punning Names
    fl request, causing implicit break: Manipulating Filling and Adjustment
    floating keep: Displays and Keeps
    flush output (fl): Debugging
    font: Using Fonts
    font aliasing with third argument to fp request: Font Positions
    font description file: Using Fonts
    font description file format: DESC File Format
    font description file, format: Font Description File Format
    font description files, comments: Font Description File Format
    font directories: Font Directories
    font families: Font Families
    font family: Using Fonts
    font family, changing (fam, \F): Font Families
    font file, format: Font Description File Format
    font files: Device and Font Description Files
    font for underlining (uf): Artificial Fonts
    font height, changing (\H): Artificial Fonts
    font metrics: Using Fonts
    font mounting, automatic: Selecting Fonts
    font path: Font Directories
    font position register (.f): Font Positions
    font positions: Font Positions
    font slant, changing (\S): Artificial Fonts
    font style: Using Fonts
    font style, abstract: Using Fonts
    font style, abstract, setting up (sty): Font Families
    font styles: Font Families
    font translation (ftr): Selecting Fonts
    font, magnification (fzoom): Selecting Fonts
    font, mounting (fp): Font Positions
    font, optical size: Selecting Fonts
    font, previous, selecting (\f[], \fP): Selecting Fonts
    font, previous, slecting (ft): Selecting Fonts
    font, selection: Selecting Fonts
    font, special: Using Fonts
    font, text: Using Fonts
    font, unstyled: Using Fonts
    font, zoom factor (fzoom): Selecting Fonts
    fonts, artificial: Artificial Fonts
    fonts, changing (ft, \f): Selecting Fonts
    fonts, searching: Font Directories
    fonts, special: Special Fonts
    footers: Page Layout
    footers: Page Location Traps
    footers [ms]: ms Headers and Footers
    footnote marker [ms]: ms Footnotes
    footnotes: Footnotes and Endnotes
    footnotes [ms]: ms Footnotes
    footnotes, and displays [ms]: ms Footnotes
    footnotes, and keeps [ms]: ms Footnotes
    form letters: I/O
    format of font description file: DESC File Format
    format of font description files: Font Description File Format
    format of font files: Font Description File Format
    format of register (\g): Assigning Register Formats
    format, paper: Paper Format
    formats, file: File Formats
    formatter instructions: Formatter Instructions
    formatting a backslash glyph (\[rs]): Using Escape Sequences
    formatting a title line (tl): Page Layout
    formatting the escape character (\e): Using Escape Sequences
    formatting the time: I/O
    fp request, and font translations: Selecting Fonts
    fp request, incompatibilities with AT&T troff: Other Differences
    fractional point sizes: Using Fractional Type Sizes
    fractional point sizes: Other Differences
    fractional type sizes: Using Fractional Type Sizes
    fractional type sizes: Other Differences
    fractional type sizes in ms macros: Differences from AT&T ms
    French spacing: Sentences
    fspecial request, and font styles: Font Families
    fspecial request, and font translations: Selecting Fonts
    fspecial request, and glyph search order: Using Symbols
    fspecial request, and imitating bold: Artificial Fonts
    ft request, and font translations: Selecting Fonts
    full-service macro package: Major Macro Packages

    G
    geometry, page: Page Geometry
    GGL (groff glyph list): Using Symbols
    GGL (groff glyph list): Character Classes
    glossary-style list, example markup [ms]: Lists in ms
    glyph: Using Symbols
    glyph for line drawing: Drawing Geometric Objects
    glyph names, composite: Using Symbols
    glyph pile (\b): Drawing Geometric Objects
    glyph properties (cflags): Using Symbols
    glyph, box rule (\[br]): Drawing Geometric Objects
    glyph, constant space: Artificial Fonts
    glyph, defining (char): Using Symbols
    glyph, distinguished from character: Using Symbols
    glyph, for line drawing: Drawing Geometric Objects
    glyph, for margins (mc): Miscellaneous
    glyph, last, dimensions (.w, .cht, .cdp, .csk): Environments
    glyph, leader repetition (lc): Leaders
    glyph, numbered (\N): Character Translations
    glyph, numbered (\N): Using Symbols
    glyph, removing definition (rchar, rfschar): Using Symbols
    glyph, soft hyphen (hy): Manipulating Hyphenation
    glyph, tab repetition (tc): Tabs and Fields
    glyph, underscore (\[ru]): Drawing Geometric Objects
    glyphs, available, list of (groff_char(7) man page): Using Symbols
    glyphs, output, and input characters, compatibility with AT&T troff: Other Differences
    glyphs, overstriking (\o): Page Motions
    glyphs, unnamed: Using Symbols
    glyphs, unnamed, accessing with \N: Font Description File Format
    GNU troff, identification register (.g): Built-in Registers
    GNU troff, PID register ($$): Built-in Registers
    GNU troff, process ID register ($$): Built-in Registers
    GNU-specific register (.g): Built-in Registers
    graphic renditions: Using Fonts
    greater than (or equal to) operator: Numeric Expressions
    groff capabilities: groff Capabilities
    groff glyph list (GGL): Using Symbols
    groff glyph list (GGL): Character Classes
    groff invocation: Invoking groff
    groff, and pi request: I/O
    groff—what is it?: What Is groff?
    GROFF_BIN_PATH, environment variable: Environment
    GROFF_COMMAND_PREFIX, environment variable: Environment
    GROFF_ENCODING, environment variable: Environment
    GROFF_FONT_PATH, environment variable: Environment
    GROFF_FONT_PATH, environment variable: Font Directories
    GROFF_TMAC_PATH, environment variable: Environment
    GROFF_TMAC_PATH, environment variable: Macro Directories
    GROFF_TMPDIR, environment variable: Environment
    GROFF_TYPESETTER, environment variable: Environment
    grohtml, the program: Groff Options
    gtroff, interactive use: Debugging
    gtroff, output: gtroff Output
    gtroff, reference: GNU troff Reference

    H
    hair space (\^): Page Motions
    hcode request, and glyph definitions: Using Symbols
    headers: Page Layout
    headers: Page Location Traps
    headers [ms]: ms Headers and Footers
    height, font, changing (\H): Artificial Fonts
    height, of last glyph (.cht): Environments
    high-water mark register (.h): Diversions
    home directory: Macro Directories
    horizontal discardable space: Manipulating Filling and Adjustment
    horizontal input line position register (hp): Page Motions
    horizontal input line position, saving (\k): Page Motions
    horizontal line, drawing (\l): Drawing Geometric Objects
    horizontal motion (\h): Page Motions
    horizontal motion quantum: DESC File Format
    horizontal motion quantum register (.H): Motion Quanta
    horizontal output line position register (.k): Page Motions
    horizontal resolution: DESC File Format
    horizontal resolution register (.H): Motion Quanta
    horizontal space (\h): Page Motions
    horizontal space, unformatting: Punning Names
    horizontal tab character: Tabs and Leaders
    hours, current time (hours): Built-in Registers
    hpf request, and hyphenation language: Manipulating Hyphenation
    hw request, and hy restrictions: Manipulating Hyphenation
    hw request, and hyphenation language: Manipulating Hyphenation
    hy glyph, and cflags: Using Symbols
    hyphen, explicit (\%): Manipulating Hyphenation
    hyphenated lines, consecutive (hlm): Manipulating Hyphenation
    hyphenating characters: Using Symbols
    hyphenation: Hyphenation
    hyphenation character (\%): Manipulating Hyphenation
    hyphenation code (hcode): Manipulating Hyphenation
    hyphenation consecutive line count register (.hlc): Manipulating Hyphenation
    hyphenation consecutive line limit register (.hlm): Manipulating Hyphenation
    hyphenation exceptions: Manipulating Hyphenation
    hyphenation language register (.hla): Manipulating Hyphenation
    hyphenation margin (hym): Manipulating Hyphenation
    hyphenation margin register (.hym): Manipulating Hyphenation
    hyphenation mode register (.hy): Manipulating Hyphenation
    hyphenation parameters, automatic: Manipulating Hyphenation
    hyphenation pattern files: Manipulating Hyphenation
    hyphenation patterns (hpf): Manipulating Hyphenation
    hyphenation space (hys): Manipulating Hyphenation
    hyphenation space adjustment threshold: Manipulating Hyphenation
    hyphenation space adjustment threshold register (.hys): Manipulating Hyphenation
    hyphenation, automatic: Manipulating Hyphenation
    hyphenation, disabling (\%): Manipulating Hyphenation
    hyphenation, explicit: Manipulating Hyphenation
    hyphenation, incompatibilities with AT&T troff: Other Differences
    hyphenation, manipulating: Manipulating Hyphenation
    hyphenation, manual: Manipulating Hyphenation

    I
    i scaling unit: Measurements
    i/o: I/O
    IBM code page 1047 input encoding: Input Encodings
    IBM code page 1047 output encoding: Groff Options
    identifiers: Identifiers
    identifiers, undefined: Identifiers
    ie request, and font translations: Selecting Fonts
    ie request, and warnings: Warnings
    ie request, operators to use with: Operators in Conditionals
    if request, and font translations: Selecting Fonts
    if request, and the ‘!’ operator: Numeric Expressions
    if request, operators to use with: Operators in Conditionals
    if-else: if-else
    if-then: if-then
    imitating boldface (bd): Artificial Fonts
    implementation differences: Implementation Differences
    implicit line break: Breaking
    implicit trap: The Implicit Page Trap
    in request, causing implicit break: Manipulating Filling and Adjustment
    in request, using + and - with: Numeric Expressions
    inch scaling unit (i): Measurements
    including a file (so): I/O
    incompatibilities with AT&T troff: Implementation Differences
    increment value without changing the register: Auto-increment
    incrementation, automatic, of a register: Auto-increment
    indentation (in): Line Layout
    indentation, of roff source code: Invoking Requests
    index, in macro package: Indexing
    indicator, scaling: Measurements
    indirect assignments: Interpolating Registers
    input and output requests: I/O
    input characters and output glyphs, compatibility with AT&T troff: Other Differences
    input characters, invalid: Identifiers
    input conventions: Input Conventions
    input encoding, code page 1047: Input Encodings
    input encoding, EBCDIC: Input Encodings
    input encoding, Latin-1 (ISO 8859-1): Input Encodings
    input encoding, Latin-2 (ISO 8859-2): Input Encodings
    input encoding, Latin-5 (ISO 8859-9): Input Encodings
    input encoding, Latin-9 (ISO 8859-15): Input Encodings
    input file name, current, register (.F): Built-in Registers
    input level: Calling Macros
    input level in delimited arguments: Compatibility Mode
    input line continuation (\RET): Line Continuation
    input line number register (.c, c.): Built-in Registers
    input line number, setting (lf): Debugging
    input line position, horizontal, saving (\k): Page Motions
    input line trap, clearing (it, itc): Input Line Traps
    input line trap, setting (it, itc): Input Line Traps
    input line traps: Input Line Traps
    input line traps and interrupted lines (itc): Input Line Traps
    input line, horizontal position, register (hp): Page Motions
    input line, productive: Manipulating Filling and Adjustment
    input stack, backtrace (backtrace): Debugging
    input stack, setting limit: Debugging
    input token: Gtroff Internals
    input, 8-bit: Font Description File Format
    input, standard, reading from (rd): I/O
    inserting horizontal space (\h): Page Motions
    installation: Installation
    instructing the formatter: Formatter Instructions
    inter-sentence space size register (.sss): Manipulating Filling and Adjustment
    inter-sentence space, additional: Manipulating Filling and Adjustment
    inter-word spacing, minimal: Manipulating Filling and Adjustment
    interactive use of gtroff: Debugging
    intercepting requests: Control Characters
    intermediate output: gtroff Output
    interpolating registers (\n): Interpolating Registers
    interpolation: Requests and Macros
    interpolation depth: Calling Macros
    interpolation depth in delimited arguments: Compatibility Mode
    interpolation of strings (\*): Strings
    interpretation mode: Copy Mode
    interrupted line: Line Continuation
    interrupted line register (.int): Line Continuation
    interrupted lines and input line traps (itc): Input Line Traps
    introduction: Introduction
    invalid characters for trf request: I/O
    invalid input characters: Identifiers
    invocation examples: Invocation Examples
    invoking groff: Invoking groff
    invoking requests: Invoking Requests
    ISO 646 output encoding: Groff Options
    ISO 8859-1 (Latin-1) output encoding: Groff Options
    ISO 8859-1 (Latin-1), input encoding: Input Encodings
    ISO 8859-15 (Latin-9), input encoding: Input Encodings
    ISO 8859-2 (Latin-2), input encoding: Input Encodings
    ISO 8859-9 (Latin-5), input encoding: Input Encodings
    italic correction (\/): Italic Corrections

    J
    justifying text: Manipulating Filling and Adjustment
    justifying text (rj): Manipulating Filling and Adjustment

    K
    keep, floating: Displays and Keeps
    keeps (introduction): Displays and Keeps
    keeps [ms]: ms keeps and displays
    keeps, and footnotes [ms]: ms Footnotes
    kerning and ligatures: Ligatures and Kerning
    kerning enabled register (.kern): Ligatures and Kerning
    kerning, activating (kern): Ligatures and Kerning
    kerning, track: Ligatures and Kerning

    L
    landscape page orientation: Paper Format
    language [ms]: ms language and localization
    last glyph, dimensions (.w, .cht, .cdp, .csk): Environments
    last-requested point size registers (.psr, .sr): Using Fractional Type Sizes
    last-requested type size registers (.psr, .sr): Using Fractional Type Sizes
    Latin-1 (ISO 8859-1) output encoding: Groff Options
    Latin-1 (ISO 8859-1), input encoding: Input Encodings
    Latin-2 (ISO 8859-2), input encoding: Input Encodings
    Latin-5 (ISO 8859-9), input encoding: Input Encodings
    Latin-9 (ISO 8859-15), input encoding: Input Encodings
    layout, line: Line Layout
    layout, page: Page Layout
    lc request, and glyph definitions: Using Symbols
    leader character: Tabs and Leaders
    leader character: Leaders
    leader character, and translations: Character Translations
    leader character, non-interpreted (\a): Leaders
    leader repetition character (lc): Leaders
    leaders: Leaders
    leading: Manipulating Type Size and Vertical Spacing
    leading space macro (lsm): Breaking
    leading space traps: Leading Space Traps
    leading spaces: Breaking
    leading spaces macro (lsm): Leading Space Traps
    leading spaces with ds: Strings
    left italic correction (\,): Italic Corrections
    left margin (po): Line Layout
    length of a string (length): Strings
    length of line (ll): Line Layout
    length of previous line (.n): Environments
    length of the page, configuring (pl): Page Layout
    length of title line, configuring (lt): Page Layout
    length request, and copy mode: Strings
    less than (or equal to) operator: Numeric Expressions
    letters, form: I/O
    level, input: Calling Macros
    level, suppression nesting, register: Suppressing Output
    lf request, incompatibilities with AT&T troff: Other Differences
    ligature: Using Symbols
    ligatures and kerning: Ligatures and Kerning
    ligatures enabled register (.lg): Ligatures and Kerning
    ligatures, activating (lg): Ligatures and Kerning
    limitations of \b escape sequence: Drawing Geometric Objects
    line break: Manipulating Filling and Adjustment
    line break (introduction): Basics
    line break, output: Breaking
    line control: Line Continuation
    line dimensions: Line Layout
    line drawing glyph: Drawing Geometric Objects
    line drawing glyph: Drawing Geometric Objects
    line indentation (in): Line Layout
    line layout: Line Layout
    line length (ll): Line Layout
    line length register (.l): Line Layout
    line length, previous (.n): Environments
    line number, input, register (.c, c.): Built-in Registers
    line number, output, register (ln): Miscellaneous
    line numbers, printing (nm): Miscellaneous
    line space, extra post-vertical (\x): Changing the Vertical Spacing
    line space, extra pre-vertical (\x): Changing the Vertical Spacing
    line spacing register (.L): Manipulating Spacing
    line spacing, post-vertical (pvs): Changing the Vertical Spacing
    line thickness (‘\D't …'’): Drawing Geometric Objects
    line, blank: Breaking
    line, drawing (‘\D'l …'’): Drawing Geometric Objects
    line, horizontal, drawing (\l): Drawing Geometric Objects
    line, input, continuation (\RET): Line Continuation
    line, input, horizontal position, register (hp): Page Motions
    line, input, horizontal position, saving (\k): Page Motions
    line, interrupted: Line Continuation
    line, output, continuation (\c): Line Continuation
    line, output, horizontal position, register (.k): Page Motions
    line, productive input: Manipulating Filling and Adjustment
    line, vertical, drawing (\L): Drawing Geometric Objects
    line-tabs mode: Tabs and Fields
    lines, blank, disabling: Manipulating Spacing
    lines, centering (ce): Manipulating Filling and Adjustment
    lines, centering (introduction): Basics
    lines, consecutive hyphenated (hlm): Manipulating Hyphenation
    lines, interrupted, and input line traps (itc): Input Line Traps
    lines, right-aligning (introduction): Basics
    lines, right-justifying (introduction): Basics
    list of special characters (groff_char(7) man page): Using Symbols
    listing page location traps (ptr): Debugging
    lists: Paragraphs
    ll request, using + and - with: Numeric Expressions
    localization: Manipulating Hyphenation
    localization [ms]: ms language and localization
    locating macro files: Macro Directories
    locating macro packages: Macro Directories
    location, vertical, page, marking (mk): Page Motions
    location, vertical, page, returning to marked (rt): Page Motions
    logical “and” operator: Numeric Expressions
    logical “or” operator: Numeric Expressions
    logical complementation operator: Numeric Expressions
    logical conjunction operator: Numeric Expressions
    logical disjunction operator: Numeric Expressions
    logical not, limitation in expression: Numeric Expressions
    logical operators: Numeric Expressions
    long names: Compatibility Mode
    loops and conditionals: Conditionals and Loops
    lowercasing a string (stringdown): Strings
    ls request, alternative to (pvs): Changing the Vertical Spacing
    lt request, using + and - with: Numeric Expressions

    M
    m scaling unit: Measurements
    M scaling unit: Measurements
    machine units: Page Geometry
    macro: Requests and Macros
    macro arguments: Calling Macros
    macro arguments, and compatibility mode: Gtroff Internals
    macro arguments, and tabs: Invoking Requests
    macro directories: Macro Directories
    macro file search path: Macro Directories
    macro name register (\$0): Parameters
    macro names, starting with [ or ], and refer: Identifiers
    macro package: Macro Packages
    macro package search path: Macro Directories
    macro package usage, basics of: Basics
    macro package, auxiliary: Major Macro Packages
    macro package, full-service: Major Macro Packages
    macro package, introduction: Macro Package Intro
    macro package, major: Major Macro Packages
    macro package, minor: Major Macro Packages
    macro package, structuring the source of: Invoking Requests
    macro, appending to (am): Writing Macros
    macro, creating alias for (als): Strings
    macro, end-of-input (em): End-of-input Traps
    macro, parameters (\$): Parameters
    macro, removing (rm): Strings
    macro, removing alias for (rm): Strings
    macro, renaming (rn): Strings
    macros, recursive: while
    macros, searching: Macro Directories
    macros, shared name space with strings and diversions: Identifiers
    macros, tutorial for users: Tutorial for Macro Users
    macros, writing: Writing Macros
    magnification of a font (fzoom): Selecting Fonts
    major macro package: Major Macro Packages
    major version number register (.x): Built-in Registers
    man macros, custom headers and footers: Optional man extensions
    man macros, Ultrix-specific: Optional man extensions
    man pages: man
    manipulating filling and adjustment: Manipulating Filling and Adjustment
    manipulating hyphenation: Manipulating Hyphenation
    manipulating spacing: Manipulating Spacing
    manipulating type size and vertical spacing: Manipulating Type Size and Vertical Spacing
    manual hyphenation: Manipulating Hyphenation
    manual pages: man
    margin for hyphenation (hym): Manipulating Hyphenation
    margin glyph (mc): Miscellaneous
    margin, bottom: Page Location Traps
    margin, left (po): Line Layout
    margin, right: Line Layout
    margin, top: Page Location Traps
    mark, high-water, register (.h): Diversions
    marker, footnote [ms]: ms Footnotes
    marking vertical page location (mk): Page Motions
    maximum operator: Numeric Expressions
    maximum value representable with Roman numerals: Assigning Register Formats
    mdoc macros: mdoc
    me macro package: me
    measurement units: Measurements
    measurements: Measurements
    measurements, specifying safely: Default Units
    metrics, font: Using Fonts
    minimal inter-word spacing: Manipulating Filling and Adjustment
    minimum operator: Numeric Expressions
    minimum value representable with Roman numerals: Assigning Register Formats
    minor macro package: Major Macro Packages
    minor version number register (.y): Built-in Registers
    minutes, current time (minutes): Built-in Registers
    mm macro package: mm
    mode for constant glyph space (cs): Artificial Fonts
    mode, compatibility: Compatibility Mode
    mode, compatibility, and parameters: Gtroff Internals
    mode, copy: Copy Mode
    mode, copy: Copy Mode
    mode, copy, and cf request: I/O
    mode, copy, and device request: Postprocessor Access
    mode, copy, and length request: Strings
    mode, copy, and macro parameters: Parameters
    mode, copy, and output request: Diversions
    mode, copy, and trf request: I/O
    mode, copy, and write request: I/O
    mode, copy, and writec request: I/O
    mode, copy, and writem request: I/O
    mode, copy, and \!: Diversions
    mode, copy, and \?: Operators in Conditionals
    mode, copy, and \?: Diversions
    mode, copy, and \a: Leaders
    mode, copy, and \t: Tabs and Fields
    mode, copy, and \V: I/O
    mode, fill (fi), enabling: Manipulating Filling and Adjustment
    mode, fill, and break warnings: Warnings
    mode, fill, and inter-sentence space: Manipulating Filling and Adjustment
    mode, fill, and \c: Line Continuation
    mode, fill, disabling: Manipulating Filling and Adjustment
    mode, interpretation: Copy Mode
    mode, line-tabs: Tabs and Fields
    mode, no-fill: Manipulating Filling and Adjustment
    mode, no-fill, and \c: Line Continuation
    mode, no-space (ns): Manipulating Spacing
    mode, nroff: troff and nroff Modes
    mode, safer: Groff Options
    mode, safer: Macro Directories
    mode, safer: Built-in Registers
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: Safer Mode
    mode, troff: troff and nroff Modes
    mode, unsafe: Groff Options
    mode, unsafe: Macro Directories
    mode, unsafe: Built-in Registers
    mode, unsafe: I/O
    mode, unsafe: I/O
    mode, unsafe: I/O
    mode, unsafe: I/O
    modifying requests: Control Characters
    modulus: Numeric Expressions
    mom macro package: mom
    month of the year register (mo): Built-in Registers
    motion operators: Numeric Expressions
    motion quanta: Motion Quanta
    motion quantum, horizontal: DESC File Format
    motion quantum, horizontal, register (.H): Motion Quanta
    motion quantum, vertical: DESC File Format
    motion, horizontal (\h): Page Motions
    motion, vertical (\v): Page Motions
    motions, page: Page Motions
    mounting a font (fp): Font Positions
    mounting position: Using Fonts
    mounting position: Using Fonts
    mounting, font, automatic: Selecting Fonts
    ms macros: ms
    ms macros, accent marks: ms Legacy Features
    ms macros, body text: ms Body Text
    ms macros, creating table of contents: ms TOC
    ms macros, displays: ms keeps and displays
    ms macros, document control settings: ms Document Control Settings
    ms macros, document description: ms Document Description Macros
    ms macros, equations: ms Insertions
    ms macros, figures: ms Insertions
    ms macros, footers: ms Headers and Footers
    ms macros, footnotes: ms Footnotes
    ms macros, fractional type sizes in: Differences from AT&T ms
    ms macros, general structure: ms Document Structure
    ms macros, groff differences from AT&T: Differences from AT&T ms
    ms macros, headers: ms Headers and Footers
    ms macros, headings: Headings in ms
    ms macros, keeps: ms keeps and displays
    ms macros, language: ms language and localization
    ms macros, lists: Lists in ms
    ms macros, localization: ms language and localization
    ms macros, margins: ms Margins
    ms macros, multiple columns: ms Multiple Columns
    ms macros, naming conventions: ms Naming Conventions
    ms macros, nested lists: Indented regions in ms
    ms macros, obtaining typographical symbols: Typographical symbols in ms
    ms macros, page layout: ms Page Layout
    ms macros, paragraph handling: Paragraphs in ms
    ms macros, references: ms Insertions
    ms macros, special characters: ms Legacy Features
    ms macros, strings: ms Legacy Features
    ms macros, tables: ms Insertions
    ms macros, text settings: Text settings in ms
    multi-file documents: Debugging
    multi-line strings: Strings
    multi-page table example [ms]: ms Insertions
    multiple columns [ms]: ms Multiple Columns
    multiplication: Numeric Expressions

    N
    n scaling unit: Measurements
    name space, common, of macros, diversions, and strings: Identifiers
    name, background color, register (.M): Colors
    name, fill color, register (.M): Colors
    name, stroke color, register (.m): Colors
    named character (\C): Using Symbols
    names, long: Compatibility Mode
    naming conventions, ms macros: ms Naming Conventions
    ne request, and the .trunc register: Page Location Traps
    ne request, comparison with sv: Page Control
    negating register values: Setting Registers
    negation: Numeric Expressions
    nested assignments: Interpolating Registers
    nested diversions: Diversions
    nested lists [ms]: Indented regions in ms
    nesting level, suppression, register: Suppressing Output
    new page (bp): Page Control
    newline character, and translations: Character Translations
    newline character, in strings, escaping: Strings
    newline, as delimiter: Delimiters
    newline, final, stripping in diversions: Punning Names
    next file, processing (nx): I/O
    next free font position register (.fp): Font Positions
    next page number register (.pn): Page Layout
    next page number, configuring (pn): Page Layout
    nf request, causing implicit break: Manipulating Filling and Adjustment
    nl register, and .d: Diversions
    nl register, difference from .h: Diversions
    nm request, using + and - with: Numeric Expressions
    no-break control character ('): Requests and Macros
    no-break control character, changing (c2): Control Characters
    no-fill mode: Manipulating Filling and Adjustment
    no-fill mode, and \c: Line Continuation
    no-space mode (ns): Manipulating Spacing
    node, output: Gtroff Internals
    non-printing break point (\:): Manipulating Hyphenation
    nr request, and warnings: Warnings
    nr request, using + and - with: Numeric Expressions
    nroff mode: troff and nroff Modes
    number formats, assigning to register (af): Assigning Register Formats
    number of registers register (.R): Built-in Registers
    number, input line, setting (lf): Debugging
    number, page, next, configuring (pn): Page Layout
    numbered glyph (\N): Character Translations
    numbered glyph (\N): Using Symbols
    numbered list, example markup [ms]: Lists in ms
    numbers, line, printing (nm): Miscellaneous
    numeral-width space (\0): Page Motions
    numerals, as delimiters: Delimiters
    numerals, Roman: Assigning Register Formats
    numeric expression, valid: Numeric Expressions
    numeric expressions: Numeric Expressions

    O
    object creation: Writing Macros
    offset, page: Page Geometry
    offset, page (po): Line Layout
    open request, and safer mode: Groff Options
    opena request, and safer mode: Groff Options
    opening brace escape sequence (\}): Conditional Blocks
    opening file (open): I/O
    operator, scaling: Numeric Expressions
    operators, arithmetic: Numeric Expressions
    operators, as delimiters: Delimiters
    operators, comparison: Numeric Expressions
    operators, extremum (>?, <?): Numeric Expressions
    operators, logical: Numeric Expressions
    operators, motion: Numeric Expressions
    operators, unary arithmetic: Numeric Expressions
    optical size of a font: Selecting Fonts
    options: Groff Options
    order of evaluation in expressions: Numeric Expressions
    ordinary character: Identifiers
    orientation, landscape: Paper Format
    orphan: Page Control
    orphan lines, preventing with ne: Page Control
    os request, and no-space mode: Page Control
    outlined circle, drawing (‘\D'c …'’): Drawing Geometric Objects
    outlined ellipse, drawing (‘\D'e …'’): Drawing Geometric Objects
    outlined polygon, drawing (‘\D'p …'’): Drawing Geometric Objects
    output and input requests: I/O
    output comparison operator: Operators in Conditionals
    output device name string (.T): Groff Options
    output device name string (.T): Strings
    output device name string (.T), in other implementations: Other Differences
    output device usage register (.T): Groff Options
    output device usage register (.T), incompatibility with AT&T troff: Other Differences
    output devices: Output Device Intro
    output encoding, ASCII: Groff Options
    output encoding, code page 1047: Groff Options
    output encoding, EBCDIC: Groff Options
    output encoding, ISO 646: Groff Options
    output encoding, Latin-1 (ISO 8859-1): Groff Options
    output encoding, UTF-8: Groff Options
    output glyphs, and input characters, compatibility with AT&T troff: Other Differences
    output line break: Breaking
    output line number register (ln): Miscellaneous
    output line properties: Manipulating Filling and Adjustment
    output line, continuation (\c): Line Continuation
    output line, horizontal position, register (.k): Page Motions
    output node: Gtroff Internals
    output request, and copy mode: Diversions
    output request, and \!: Diversions
    output, filling, disablement of (nf): Manipulating Filling and Adjustment
    output, filling, enablement of (fi): Manipulating Filling and Adjustment
    output, flush (fl): Debugging
    output, gtroff: gtroff Output
    output, intermediate: gtroff Output
    output, suppressing (\O): Suppressing Output
    output, transparent (cf, trf): I/O
    output, transparent (\!, \?): Diversions
    output, transparent, incompatibilities with AT&T troff: Other Differences
    output, troff: gtroff Output
    overlapping characters: Using Symbols
    overstriking glyphs (\o): Page Motions

    P
    p scaling unit: Measurements
    P scaling unit: Measurements
    package, macro: Macro Packages
    package, macro, auxiliary: Major Macro Packages
    package, macro, full-service: Major Macro Packages
    package, macro, introduction: Macro Package Intro
    package, macro, major: Major Macro Packages
    package, macro, minor: Major Macro Packages
    package, macro, search path: Macro Directories
    package, package, structuring the source of: Invoking Requests
    padding character, for fields (fc): Fields
    page: Page Geometry
    page break: Page Geometry
    page break: Page Control
    page break: The Implicit Page Trap
    page break (introduction): Basics
    page break, conditional (ne): Page Control
    page break, final: End-of-input Traps
    page break, prevented by vpt: Vertical Position Traps
    page control: Page Control
    page ejection: Page Geometry
    page ejection: Page Control
    page ejection: The Implicit Page Trap
    page ejection status register (.pe): Page Location Traps
    page ejection, of final page: End-of-input Traps
    page ejection, prevented by vpt: Vertical Position Traps
    page footers: Page Location Traps
    page headers: Page Location Traps
    page layout: Page Layout
    page layout [ms]: ms Page Layout
    page length register (.p): Page Layout
    page length, configuring (pl): Page Layout
    page location traps: Page Location Traps
    page location traps, debugging: Page Location Traps
    page location, vertical, marking (mk): Page Motions
    page location, vertical, returning to marked (rt): Page Motions
    page motions: Page Motions
    page number character (%): Page Layout
    page number character, changing (pc): Page Layout
    page number register (%): Page Control
    page number, configuring next (pn): Page Layout
    page number, next, register (.pn): Page Layout
    page offset: Page Geometry
    page offset (po): Line Layout
    page orientation, landscape: Paper Format
    page, geometry of: Page Geometry
    page, new (bp): Page Control
    paper format: Paper Format
    paper size: Paper Format
    paragraphs: Paragraphs
    parameter count register (.$): Parameters
    parameters: Parameters
    parameters, and compatibility mode: Gtroff Internals
    parameters, macro (\$): Parameters
    parentheses: Numeric Expressions
    partially collected line: Manipulating Filling and Adjustment
    path, for font files: Font Directories
    path, for tmac files: Macro Directories
    pattern files, for hyphenation: Manipulating Hyphenation
    patterns for hyphenation (hpf): Manipulating Hyphenation
    pending output line: Manipulating Filling and Adjustment
    pi request, and groff: I/O
    pi request, and safer mode: Groff Options
    pi request, disabled by default: Safer Mode
    pica scaling unit (P): Measurements
    PID of GNU troff register ($$): Built-in Registers
    pile, glyph (\b): Drawing Geometric Objects
    pl request, using + and - with: Numeric Expressions
    plain text approximation output register (.A): Groff Options
    plain text approximation output register (.A): Built-in Registers
    planting a trap: Traps
    platform-specific directory: Macro Directories
    pm request, incompatibilities with AT&T troff: Other Differences
    pn request, using + and - with: Numeric Expressions
    PNG image generation from PostScript: DESC File Format
    po request, using + and - with: Numeric Expressions
    point scaling unit (p): Measurements
    point size registers (.s, .ps): Changing the Type Size
    point size registers, last-requested (.psr, .sr): Using Fractional Type Sizes
    point sizes, changing (ps, \s): Changing the Type Size
    point sizes, fractional: Using Fractional Type Sizes
    point sizes, fractional: Other Differences
    polygon, filled, drawing (‘\D'P …'’): Drawing Geometric Objects
    polygon, outlined, drawing (‘\D'p …'’): Drawing Geometric Objects
    polygon, solid, drawing (‘\D'P …'’): Drawing Geometric Objects
    polygon, stroked, drawing (‘\D'p …'’): Drawing Geometric Objects
    position of lowest text line (.h): Diversions
    position, absolute (sic) operator (|): Numeric Expressions
    position, drawing: Page Geometry
    position, horizontal input line, saving (\k): Page Motions
    position, horizontal, in input line, register (hp): Page Motions
    position, horizontal, in output line, register (.k): Page Motions
    position, mounting: Using Fonts
    position, vertical, in diversion, register (.d): Diversions
    positions, font: Font Positions
    post-vertical line spacing: Changing the Vertical Spacing
    post-vertical line spacing register (.pvs): Changing the Vertical Spacing
    post-vertical line spacing, changing (pvs): Changing the Vertical Spacing
    postprocessor access: Postprocessor Access
    postprocessors: Output Device Intro
    PostScript, bounding box: Miscellaneous
    PostScript, PNG image generation: DESC File Format
    prefix, for commands: Environment
    preprocessors: Preprocessor Intro
    previous font, selecting (ft): Selecting Fonts
    previous font, selecting (\f[], \fP): Selecting Fonts
    previous line length (.n): Environments
    print current page register (.P): Groff Options
    printing backslash (\\, \e, \E, \[rs]): Other Differences
    printing line numbers (nm): Miscellaneous
    printing to stderr (tm, tm1, tmc): Debugging
    printing, zero-width (\z, \Z): Page Motions
    printing, zero-width (\z, \Z): Page Motions
    process ID of GNU troff register ($$): Built-in Registers
    processing next file (nx): I/O
    productive input line: Manipulating Filling and Adjustment
    properties of characters (cflags): Using Symbols
    properties of glyphs (cflags): Using Symbols
    properties of output lines: Manipulating Filling and Adjustment
    ps request, and constant glyph space mode: Artificial Fonts
    ps request, incompatibilities with AT&T troff: Other Differences
    ps request, using + and - with: Numeric Expressions
    ps request, with fractional type sizes: Using Fractional Type Sizes
    pso request, and safer mode: Groff Options
    pvs request, using + and - with: Numeric Expressions

    Q
    quanta, motion: Motion Quanta
    quantum, horizontal motion: DESC File Format
    quantum, vertical motion: DESC File Format

    R
    radicalex glyph, and cflags: Using Symbols
    ragged-left text: Manipulating Filling and Adjustment
    ragged-right text: Manipulating Filling and Adjustment
    rc request, and glyph definitions: Using Symbols
    read-only register removal, incompatibility with AT&T troff: Other Differences
    read-only register, changing format: Assigning Register Formats
    reading from standard input (rd): I/O
    recursive macros: while
    refer, and macro names starting with [ or ]: Identifiers
    reference, gtroff: GNU troff Reference
    references [ms]: ms Insertions
    register format, in expressions: Assigning Register Formats
    register, assigning number format to (af): Assigning Register Formats
    register, built-in, removing: Built-in Registers
    register, creating alias for (aln): Setting Registers
    register, format (\g): Assigning Register Formats
    register, read-only, removal, incompatibility with AT&T troff: Other Differences
    register, removing (rr): Setting Registers
    register, removing alias for (rr): Setting Registers
    register, renaming (rnn): Setting Registers
    registers: Registers
    registers, built-in: Built-in Registers
    registers, dumping (pnr): Debugging
    registers, interpolating (\n): Interpolating Registers
    registers, number of, register (.R): Built-in Registers
    registers, setting (nr, \R): Setting Registers
    removal of read-only registers, incompatibility with AT&T troff: Other Differences
    removing a built-in register: Built-in Registers
    removing a register (rr): Setting Registers
    removing alias for register (rr): Setting Registers
    removing alias, for diversion (rm): Strings
    removing alias, for macro (rm): Strings
    removing alias, for string (rm): Strings
    removing diversion (rm): Strings
    removing glyph definition (rchar, rfschar): Using Symbols
    removing macro (rm): Strings
    removing request (rm): Strings
    removing string (rm): Strings
    renaming a register (rnn): Setting Registers
    renaming diversion (rn): Strings
    renaming macro (rn): Strings
    renaming request (rn): Strings
    renaming string (rn): Strings
    renditions, graphic: Using Fonts
    request: Requests and Macros
    request: Formatter Instructions
    request arguments: Invoking Requests
    request arguments, and compatibility mode: Gtroff Internals
    request arguments, and tabs: Invoking Requests
    request, removing (rm): Strings
    request, renaming (rn): Strings
    request, undefined: Comments
    requests for drawing: Drawing Geometric Objects
    requests for input and output: I/O
    requests, intercepting: Control Characters
    requests, invoking: Invoking Requests
    requests, modifying: Control Characters
    resolution, device: Page Geometry
    resolution, device: DESC File Format
    resolution, device, obtaining in the formatter: Measurements
    resolution, horizontal: DESC File Format
    resolution, horizontal, register (.H): Motion Quanta
    resolution, vertical: DESC File Format
    returning to marked vertical page location (rt): Page Motions
    revision number register (.Y): Built-in Registers
    right margin: Line Layout
    right-aligning lines (introduction): Basics
    right-justifying (rj): Manipulating Filling and Adjustment
    right-justifying lines (introduction): Basics
    rivers: Other Differences
    rj request, causing implicit break: Manipulating Filling and Adjustment
    rn glyph, and cflags: Using Symbols
    roman glyph, correction after italic glyph (\/): Italic Corrections
    roman glyph, correction before italic glyph (\,): Italic Corrections
    Roman numerals: Assigning Register Formats
    Roman numerals, extrema (maximum and minimum): Assigning Register Formats
    rq glyph, at end of sentence: Sentences
    rq glyph, at end of sentence: Using Symbols
    rt request, using + and - with: Numeric Expressions
    ru glyph, and cflags: Using Symbols
    running system commands: I/O

    S
    s scaling unit: Using Fractional Type Sizes
    safer mode: Groff Options
    safer mode: Macro Directories
    safer mode: Built-in Registers
    safer mode: I/O
    safer mode: I/O
    safer mode: I/O
    safer mode: I/O
    safer mode: Safer Mode
    saving horizontal input line position (\k): Page Motions
    scaling indicator: Measurements
    scaling operator: Numeric Expressions
    scaling unit c: Measurements
    scaling unit f: Colors
    scaling unit i: Measurements
    scaling unit m: Measurements
    scaling unit M: Measurements
    scaling unit n: Measurements
    scaling unit p: Measurements
    scaling unit P: Measurements
    scaling unit s: Using Fractional Type Sizes
    scaling unit u: Measurements
    scaling unit v: Measurements
    scaling unit z: Using Fractional Type Sizes
    searching fonts: Font Directories
    searching macros: Macro Directories
    seconds, current time (seconds): Built-in Registers
    selecting the previous font (ft): Selecting Fonts
    sentence space: Sentences
    sentence space size register (.sss): Manipulating Filling and Adjustment
    sentences: Sentences
    sequence, escape: Formatter Instructions
    setting diversion trap (dt): Diversion Traps
    setting end-of-input trap (em): End-of-input Traps
    setting input line number (lf): Debugging
    setting input line trap (it, itc): Input Line Traps
    setting registers (nr, \R): Setting Registers
    setting the page length (pl): Page Layout
    setting up an abstract font style (sty): Font Families
    shc request, and translations: Character Translations
    site-local directory: Macro Directories
    site-local directory: Font Directories
    size of sentence space register (.sss): Manipulating Filling and Adjustment
    size of word space register (.ss): Manipulating Filling and Adjustment
    size, optical, of a font: Selecting Fonts
    size, paper: Paper Format
    size, size: Manipulating Type Size and Vertical Spacing
    sizes, fractional: Other Differences
    sizes, fractional type: Using Fractional Type Sizes
    skew, of last glyph (.csk): Environments
    slant, font, changing (\S): Artificial Fonts
    soft hyphen character, setting (shc): Manipulating Hyphenation
    soft hyphen glyph (hy): Manipulating Hyphenation
    solid circle, drawing (‘\D'C …'’): Drawing Geometric Objects
    solid ellipse, drawing (‘\D'E …'’): Drawing Geometric Objects
    solid polygon, drawing (‘\D'P …'’): Drawing Geometric Objects
    SOURCE_DATE_EPOCH, environment variable: Environment
    sp request, and no-space mode: Manipulating Spacing
    sp request, causing implicit break: Manipulating Filling and Adjustment
    space between sentences: Sentences
    space between sentences register (.sss): Manipulating Filling and Adjustment
    space between words register (.ss): Manipulating Filling and Adjustment
    space character, as delimiter: Delimiters
    space characters, in expressions: Numeric Expressions
    space, between sentences: Manipulating Filling and Adjustment
    space, between words: Manipulating Filling and Adjustment
    space, discardable, horizontal: Manipulating Filling and Adjustment
    space, hair (\^): Page Motions
    space, horizontal (\h): Page Motions
    space, horizontal, unformatting: Punning Names
    space, thin (\|): Page Motions
    space, unbreakable (\~): Manipulating Filling and Adjustment
    space, unbreakable and unadjustable (\SP): Page Motions
    space, vertical, unit (v): Measurements
    space, width of a digit (numeral) (\0): Page Motions
    spaces with ds: Strings
    spaces, in a macro argument: Calling Macros
    spaces, leading and trailing: Breaking
    spacing (introduction): Basics
    spacing, manipulating: Manipulating Spacing
    spacing, vertical: Page Geometry
    spacing, vertical: Manipulating Type Size and Vertical Spacing
    spacing, vertical (introduction): Basics
    special characters: Sentences
    special characters: Character Translations
    special characters [ms]: ms Legacy Features
    special characters, list of (groff_char(7) man page): Using Symbols
    special font: Using Fonts
    special fonts: Using Symbols
    special fonts: Special Fonts
    special fonts: Font Description File Format
    special fonts, emboldening: Artificial Fonts
    special request, and font translations: Selecting Fonts
    special request, and glyph search order: Using Symbols
    spline, drawing (‘\D'~ …'’): Drawing Geometric Objects
    springing a trap: Traps
    sqrtex glyph, and cflags: Using Symbols
    ss request, incompatibilities with AT&T troff: Other Differences
    stack: Environments
    stacking glyphs (\b): Drawing Geometric Objects
    standard input, reading from (rd): I/O
    stderr, printing to (tm, tm1, tmc): Debugging
    stops, tab: Tabs and Leaders
    string arguments: Strings
    string comparison: Operators in Conditionals
    string expansion (\*): Strings
    string interpolation (\*): Strings
    string, appending (as): Strings
    string, creating alias for (als): Strings
    string, length of (length): Strings
    string, removing (rm): Strings
    string, removing alias for (rm): Strings
    string, renaming (rn): Strings
    strings: Strings
    strings [ms]: ms Legacy Features
    strings, multi-line: Strings
    strings, shared name space with macros and diversions: Identifiers
    stripping final newline in diversions: Punning Names
    stroke color: Colors
    stroke color name register (.m): Colors
    stroked circle, drawing (‘\D'c …'’): Drawing Geometric Objects
    stroked ellipse, drawing (‘\D'e …'’): Drawing Geometric Objects
    stroked polygon, drawing (‘\D'p …'’): Drawing Geometric Objects
    structuring source code of documents or macro packages: Invoking Requests
    sty request, and changing fonts: Selecting Fonts
    sty request, and font translations: Selecting Fonts
    style, font: Using Fonts
    style, font, abstract: Using Fonts
    style, font, abstract, setting up (sty): Font Families
    styles, font: Font Families
    substring (substring): Strings
    subtraction: Numeric Expressions
    suppressing output (\O): Suppressing Output
    suppression nesting level register: Suppressing Output
    sv request, and no-space mode: Page Control
    switching environments (ev): Environments
    sy request, and safer mode: Groff Options
    sy request, disabled by default: Safer Mode
    symbol: Using Symbols
    symbol table, dumping (pm): Debugging
    symbol, defining (char): Using Symbols
    symbols, using: Using Symbols
    system commands, running: I/O
    system() return value register (systat): I/O

    T
    tab character: Tabs and Leaders
    tab character encoding: Tabs and Fields
    tab character, and translations: Character Translations
    tab character, as delimiter: Delimiters
    tab character, non-interpreted (\t): Tabs and Fields
    tab repetition character (tc): Tabs and Fields
    tab stop settings register (.tabs): Tabs and Fields
    tab stops: Tabs and Leaders
    tab stops, default: Tabs and Fields
    tab, line-tabs mode: Tabs and Fields
    table of contents: Table of Contents
    table of contents: Leaders
    table of contents, creating [ms]: ms TOC
    table, multi-page, example [ms]: ms Insertions
    tables [ms]: ms Insertions
    tabs, and fields: Tabs and Fields
    tabs, and macro arguments: Invoking Requests
    tabs, and request arguments: Invoking Requests
    tabs, before comments: Comments
    tagged paragraphs: Paragraphs
    tags, paragraph: Paragraphs
    terminal, conditional output for: Operators in Conditionals
    text baseline: Page Geometry
    text baseline: Manipulating Type Size and Vertical Spacing
    text font: Using Fonts
    text line: Requests and Macros
    text line, position of lowest (.h): Diversions
    text, GNU troff processing: Text
    text, justifying: Manipulating Filling and Adjustment
    text, justifying (rj): Manipulating Filling and Adjustment
    thickness of lines (‘\D't …'’): Drawing Geometric Objects
    thin space (\|): Page Motions
    three-part title (tl): Page Layout
    ti request, causing implicit break: Manipulating Filling and Adjustment
    ti request, using + and - with: Numeric Expressions
    time, current, hours (hours): Built-in Registers
    time, current, minutes (minutes): Built-in Registers
    time, current, seconds (seconds): Built-in Registers
    time, formatting: I/O
    title length, configuring (lt): Page Layout
    title line length register (.lt): Page Layout
    title line, formatting (tl): Page Layout
    titles: Page Layout
    tkf request, and font styles: Font Families
    tkf request, and font translations: Selecting Fonts
    tkf request, with fractional type sizes: Using Fractional Type Sizes
    tl request, and mc: Miscellaneous
    tmac, directory: Macro Directories
    tmac, path: Macro Directories
    TMPDIR, environment variable: Environment
    token, input: Gtroff Internals
    top margin: Page Location Traps
    top-level diversion: Diversions
    top-level diversion, and bp: Page Control
    top-level diversion, and \!: Diversions
    top-level diversion, and \?: Diversions
    tr request, and glyph definitions: Using Symbols
    tr request, and soft hyphen character: Manipulating Hyphenation
    tr request, incompatibilities with AT&T troff: Other Differences
    track kerning: Ligatures and Kerning
    track kerning, activating (tkf): Ligatures and Kerning
    trailing double quotes in strings: Strings
    trailing spaces in string definitions and appendments: Strings
    trailing spaces on text lines: Breaking
    translations of characters: Character Translations
    transparent characters: Using Symbols
    transparent dummy character (\)): Dummy Characters
    transparent output (cf, trf): I/O
    transparent output (\!, \?): Diversions
    transparent output, incompatibilities with AT&T troff: Other Differences
    trap: Deferring Output
    trap, changing location (ch): Page Location Traps
    trap, distance to next vertical position, register (.t): Page Location Traps
    trap, diversion, setting (dt): Diversion Traps
    trap, end-of-input, setting (em): End-of-input Traps
    trap, implicit: The Implicit Page Trap
    trap, input line, clearing (it, itc): Input Line Traps
    trap, input line, setting (it, itc): Input Line Traps
    trap, planting: Traps
    trap, springing: Traps
    traps: Traps
    traps, and diversions: Page Location Traps
    traps, blank line: Blank Line Traps
    traps, diversion: Diversion Traps
    traps, end-of-input: End-of-input Traps
    traps, input line: Input Line Traps
    traps, input line, and interrupted lines (itc): Input Line Traps
    traps, leading space: Leading Space Traps
    traps, page location: Page Location Traps
    traps, page location, dumping (ptr): Debugging
    traps, page location, listing (ptr): Debugging
    traps, sprung by bp request (.pe): Page Location Traps
    traps, vertical position: Vertical Position Traps
    trf request, and copy mode: I/O
    trf request, and invalid characters: I/O
    trf request, causing implicit break: Manipulating Filling and Adjustment
    trin request, and asciify: Diversions
    troff mode: troff and nroff Modes
    troff output: gtroff Output
    truncated vertical space register (.trunc): Page Location Traps
    truncating division: Numeric Expressions
    TTY, conditional output for: Operators in Conditionals
    tutorial for macro users: Tutorial for Macro Users
    type size: Manipulating Type Size and Vertical Spacing
    type size registers (.s, .ps): Changing the Type Size
    type size registers, last-requested (.psr, .sr): Using Fractional Type Sizes
    type sizes, changing (ps, \s): Changing the Type Size
    type sizes, fractional: Using Fractional Type Sizes
    type sizes, fractional: Other Differences
    typeface: Using Fonts
    TZ, environment variable: Environment

    U
    u scaling unit: Measurements
    uf request, and font styles: Font Families
    ul glyph, and cflags: Using Symbols
    ul request, and font translations: Selecting Fonts
    Ultrix-specific man macros: Optional man extensions
    unadjustable and unbreakable space (\SP): Page Motions
    unary arithmetic operators: Numeric Expressions
    unbreakable and unadjustable space (\SP): Page Motions
    unbreakable space (\~): Manipulating Filling and Adjustment
    undefined identifiers: Identifiers
    undefined request: Comments
    underline font (uf): Artificial Fonts
    underlining (ul): Artificial Fonts
    underlining, continuous (cu): Artificial Fonts
    unformatting diversions (asciify): Diversions
    unformatting horizontal space: Punning Names
    Unicode: Identifiers
    Unicode: Using Symbols
    unit, scaling, c: Measurements
    unit, scaling, f: Colors
    unit, scaling, i: Measurements
    unit, scaling, m: Measurements
    unit, scaling, M: Measurements
    unit, scaling, n: Measurements
    unit, scaling, p: Measurements
    unit, scaling, P: Measurements
    unit, scaling, s: Using Fractional Type Sizes
    unit, scaling, u: Measurements
    unit, scaling, v: Measurements
    unit, scaling, z: Using Fractional Type Sizes
    units of measurement: Measurements
    units, basic: Page Geometry
    units, basic, conversion to: Measurements
    units, default: Default Units
    units, machine: Page Geometry
    unnamed glyphs: Using Symbols
    unnamed glyphs, accessing with \N: Font Description File Format
    unsafe mode: Groff Options
    unsafe mode: Macro Directories
    unsafe mode: Built-in Registers
    unsafe mode: I/O
    unsafe mode: I/O
    unsafe mode: I/O
    unsafe mode: I/O
    unstyled font: Using Fonts
    up-casing a string (stringup): Strings
    uppercasing a string (stringup): Strings
    upright glyph, correction after oblique glyph (\/): Italic Corrections
    upright glyph, correction before oblique glyph (\,): Italic Corrections
    URLs, breaking (\:): Manipulating Hyphenation
    user’s macro tutorial: Tutorial for Macro Users
    user’s tutorial for macros: Tutorial for Macro Users
    using escape sequences: Using Escape Sequences
    using symbols: Using Symbols
    UTF-8 output encoding: Groff Options

    V
    v scaling unit: Measurements
    valid numeric expression: Numeric Expressions
    value, incrementing without changing the register: Auto-increment
    variables in environment: Environment
    vee: Page Geometry
    vee scaling unit (v): Measurements
    version number, major, register (.x): Built-in Registers
    version number, minor, register (.y): Built-in Registers
    vertical drawing position (nl): Page Control
    vertical line drawing (\L): Drawing Geometric Objects
    vertical line spacing register (.v): Changing the Vertical Spacing
    vertical line spacing, changing (vs): Changing the Vertical Spacing
    vertical line spacing, effective value: Changing the Vertical Spacing
    vertical motion (\v): Page Motions
    vertical motion quantum: DESC File Format
    vertical page location, marking (mk): Page Motions
    vertical page location, returning to marked (rt): Page Motions
    vertical position in diversion register (.d): Diversions
    vertical position trap enable register (.vpt): Vertical Position Traps
    vertical position traps: Vertical Position Traps
    vertical position traps, enabling (vpt): Vertical Position Traps
    vertical position, drawing (nl): Page Control
    vertical resolution: DESC File Format
    vertical space unit (v): Measurements
    vertical spacing: Page Geometry
    vertical spacing: Manipulating Type Size and Vertical Spacing
    vertical spacing (introduction): Basics

    W
    warning categories: Warnings
    warning level (warn): Debugging
    warnings: Debugging
    warnings: Warnings
    what is groff?: What Is groff?
    while: while
    while request, and font translations: Selecting Fonts
    while request, and the ‘!’ operator: Numeric Expressions
    while request, confusing with br: while
    while request, operators to use with: Operators in Conditionals
    widow: Page Control
    widow: Page Control
    width escape (\w): Page Motions
    width, of last glyph (.w): Environments
    word space size register (.ss): Manipulating Filling and Adjustment
    word, definition of: Filling
    write request, and copy mode: I/O
    writec request, and copy mode: I/O
    writem request, and copy mode: I/O
    writing macros: Writing Macros
    writing to file (write, writec): I/O

    Y
    year, current, register (year, yr): Built-in Registers

    Z
    z scaling unit: Using Fractional Type Sizes
    zero-width printing (\z, \Z): Page Motions
    zero-width printing (\z, \Z): Page Motions
    zoom factor of a font (fzoom): Selecting Fonts

    + +
    + + +
    +
    +
    +
    + +

    Footnotes

    + +
    (1)
    +

    The ‘g’ prefix is +not used on all systems; see Invoking groff.

    +
    (2)
    +

    Unix and related operating systems distinguish +standard output and standard error streams because of +troff: +https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html.

    +
    (3)
    +

    See Line Layout.

    +
    (4)
    +

    Besides groff, neatroff is an +exception.

    +
    (5)
    +

    The +mso request does not have these limitations. See I/O.

    +
    (6)
    +

    The remainder of this chapter is based on +Writing Papers with nroff using -me by Eric P. Allman, +which is distributed with groff as meintro.me.

    +
    (7)
    +

    While manual pages are older, early ones used +macros supplanted by the man package of Seventh Edition Unix +(1979). ms shipped with Sixth Edition (1975) and was documented +by Mike Lesk in a Bell Labs internal memorandum.

    +
    (8)
    +

    defined in Footnotes

    +
    (9)
    +

    Distinguish a +document title from “titles”, which are what roff systems call +headers and footers collectively.

    +
    (10)
    +

    This idiosyncrasy arose through +feature accretion; for example, the B macro in Version 6 +Unix ms (1975) accepted only one argument, the text to be set in +boldface. By Version 7 (1979) it recognized a second argument; in +1990, groff ms added a “pre” argument, placing it third +to avoid breaking support for older documents.

    +
    (11)
    +

    “Portable Document Format Publishing with GNU +Troff”, pdfmark.ms in the groff distribution, uses this +technique.

    +
    (12)
    +

    Unix Version 7 ms, its descendants, and GNU +ms prior to groff version 1.23.0

    +
    (13)
    +

    You could reset it +after each call to .1C, .2C, or .MC.

    +
    (14)
    +

    Typing Documents on the UNIX System: Using the +-ms Macros with Troff and Nroff, M. E. Lesk, Bell Laboratories, +1978

    +
    (15)
    +

    Register values are converted to and stored as +basic units. See Measurements.

    +
    (16)
    +

    If you redefine the ms PT macro +and desire special treatment of certain page numbers (like ‘1’), +you may need to handle a non-Arabic page number format, as groff +ms’s PT does; see the macro package source. groff +ms aliases the PN register to %.

    +
    (17)
    +

    The removal beforehand is necessary +because groff ms aliases these macros to a diagnostic +macro, and you want to redefine the aliased name, not its target.

    +
    (18)
    +

    See Device and Font Description Files.

    +
    (19)
    +

    Tabs and leaders also separate +words. Escape sequences can function as word characters, word +separators, or neither—the last simply have no effect on GNU +troff’s idea of whether an input character is within a word. +We’ll discuss all of these in due course.

    +
    (20)
    +

    A +well-researched jeremiad appreciated by groff contributors on +both sides of the sentence-spacing debate can be found at +https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324.

    +
    (21)
    +

    This statement oversimplifies; there are +escape sequences whose purpose is precisely to produce glyphs on the +output device, and input characters that aren’t part of escape +sequences can undergo a great deal of processing before getting to the +output.

    +
    (22)
    +

    The mnemonics for the special +characters shown here are “dagger”, “double dagger”, “right +(double) quote”, and “closing (single) quote”. See the +groff_char(7) man page.

    +
    (23)
    +

    “Text lines” are defined in Requests and Macros.

    +
    (24)
    +

    “Tab” +is short for “tabulation”, revealing the term’s origin as a spacing +mechanism for table arrangement.

    +
    (25)
    +

    The \RET escape sequence can alter how an +input line is classified; see Line Continuation.

    +
    (26)
    +

    Argument handling in +macros is more flexible but also more complex. See Calling Macros.

    +
    (27)
    +

    Some escape sequences undergo +interpolation as well.

    +
    (28)
    +

    GNU troff offers additional ones. See Writing Macros.

    +
    (29)
    +

    Macro files and packages +frequently define registers and strings as well.

    +
    (30)
    +

    The +semantics of certain punctuation code points have gotten stricter +with the successive standards, a cause of some frustration among man +page writers; see the groff_char(7) man page.

    +
    (31)
    +

    The +DVI output device defaults to using the Computer Modern (CM) fonts; +ec.tmac loads the EC fonts instead, which provide Euro +‘\[Eu]’ and per mille ‘\[%0]’ glyphs.

    +
    (32)
    +

    Emacs: fill-column: 72; Vim: textwidth=72

    +
    (33)
    +

    groff does not yet support right-to-left +scripts.

    +
    (34)
    +

    groff’s terminal output devices have page +offsets of zero.

    +
    (35)
    +

    Provision is made for interpreting and +reporting decimal fractions in certain cases.

    +
    (36)
    +

    If that’s not enough, see the groff_tmac(5) +man page for the 62bit.tmac macro package.

    +
    (37)
    +

    See Conditionals and Loops.

    +
    (38)
    +

    Control structure syntax +creates an exception to this rule, but is designed to remain useful: +recalling our example, ‘.if 1 .Underline this’ would underline only +“this”, precisely. See Conditionals and Loops.

    +
    (39)
    +

    See Diversions.

    +
    (40)
    +

    Historically, control characters like +ASCII STX, ETX, and BEL (Control+B, Control+C, and +Control+G) have been observed in roff documents, +particularly in macro packages employing them as delimiters with the +output comparison operator to try to avoid collisions with the content +of arbitrary user-supplied parameters (see Operators in Conditionals). We discourage this expedient; in GNU troff it is +unnecessary (outside of compatibility mode) because delimited arguments +are parsed at a different input level than the surrounding context. +See Implementation Differences.

    +
    (41)
    +

    Consider what happens when a C1 control +0x800x9F is necessary as a continuation byte in a UTF-8 +sequence.

    +
    (42)
    +

    Recall Identifiers.

    +
    (43)
    +

    In compatibility +mode, a space is not necessary after a request or macro name of two +characters’ length. Also, Plan 9 troff allows tabs to +separate arguments.

    +
    (44)
    +

    \~ is fairly +portable; see Other Differences.

    +
    (45)
    +

    Strictly, you can neglect to +close the last quoted macro argument, relying on the end of the control +line to do so. We consider this lethargic practice poor style.

    +
    (46)
    +

    The omission of spaces before the comment +escape sequences is necessary; see Strings.

    +
    (47)
    +

    TeX does have such a mechanism.

    +
    (48)
    +

    This claim may be more aspirational than descriptive.

    +
    (49)
    +

    See Conditional Blocks.

    +
    (50)
    +

    Exception: auto-incrementing registers defined outside +the ignored region will be modified if interpolated with +\n± inside it. See Auto-increment.

    +
    (51)
    +

    A negative auto-increment can be +considered an “auto-decrement”.

    +
    (52)
    +

    GNU troff dynamically allocates memory for +as many registers as required.

    +
    (53)
    +

    unless diverted; see Diversions

    +
    (54)
    +

    See Line Continuation.

    +
    (55)
    +

    Recall Filling and Sentences for the +definitions of word and sentence boundaries, respectively.

    +
    (56)
    +

    Whether a perfect algorithm for this application is +even possible is an unsolved problem in computer science: +https://tug.org/docs/liang/liang-thesis.pdf.

    +
    (57)
    +

    \% itself stops marking +hyphenation points but still produces no output glyph.

    +
    (58)
    +

    “Soft” because it appears in output +only where a hyphenation break is performed; a “hard” hyphen, as in +“long-term”, always appears.

    +
    (59)
    +

    The mode is a vector of Booleans encoded as an integer. +To a programmer, this fact is easily deduced from the exclusive use of +powers of two for the configuration parameters; they are computationally +easy to “mask off” and compare to zero. To almost everyone else, the +arrangement seems recondite and unfriendly.

    +
    (60)
    +

    Hyphenation is +prevented if the next page location trap is closer to the vertical +drawing position than the next text baseline would be. See Page Location Traps.

    +
    (61)
    +

    For more on localization, see the +groff_tmac(5) man page.

    +
    (62)
    +

    See Page Location Traps.

    +
    (63)
    +

    See Drawing Geometric Objects.

    +
    (64)
    +

    or geometric objects; see Drawing Geometric Objects

    +
    (65)
    +

    to the top-level diversion; +see Diversions

    +
    (66)
    +

    Plan 9 troff +uses the register .S for this purpose.

    +
    (67)
    +

    This is pronounced to rhyme with “feeder”, and +refers to how the glyphs “lead” the eye across the page to the +corresponding page number or other datum.

    +
    (68)
    +

    A +GNU nroff program is available for convenience; it calls GNU +troff to perform the formatting.

    +
    (69)
    +

    Historically, the \c +escape sequence has proven challenging to characterize. Some sources +say it “connects the next input text” (to the input line on which it +appears); others describe it as “interrupting” text, on the grounds +that a text line is interrupted without breaking, perhaps to inject a +request invocation or macro call.

    +
    (70)
    +

    See Traps.

    +
    (71)
    +

    See Diversions.

    +
    (72)
    +

    Terminals and some output devices have fonts that render +at only one or two sizes. As examples of the latter, take the +groff lj4 device’s Lineprinter, and lbp’s Courier +and Elite faces.

    +
    (73)
    +

    Font designers prepare families such that the styles +share esthetic properties.

    +
    (74)
    +

    Historically, the fonts +troffs dealt with were not Free Software or, as with the Graphic +Systems C/A/T, did not even exist in the digital domain.

    +
    (75)
    +

    See Font Description File Format.

    +
    (76)
    +

    See DESC File Format.

    +
    (77)
    +

    Not all versions of the man program +support the -T option; use the subsequent example for an +alternative.

    +
    (78)
    +

    This is “Normalization Form D” +as documented in Unicode Standard Annex #15 +(https://unicode.org/reports/tr15/).

    +
    (79)
    +

    See Compatibility Mode.

    +
    (80)
    +

    Output glyphs +don’t—to GNU troff, a glyph is simply a box with an index into +a font, a given height above and depth below the baseline, and a width.

    +
    (81)
    +

    Opinions of this escape sequence’s name abound. +“Zero-width space” is a popular misnomer: roff formatters do +not treat it like a space. Ossanna called it a “non-printing, +zero-width character”, but the character causes output even +though it does not “print”. If no output line is pending, the dummy +character starts one. Contrast an empty input document with one +containing only \&. The former produces no output; the latter, a +blank page.

    +
    (82)
    +

    In text fonts, the tallest glyphs are typically +parentheses. Unfortunately, in many cases the actual dimensions of the +glyphs in a font do not closely match its declared type size! For +example, in the standard PostScript font families, 10-point Times sets +better with 9-point Helvetica and 11-point Courier than if all three +were used at 10 points.

    +
    (83)
    +

    Rhyme with “sledding”; mechanical typography +used lead metal (Latin plumbum).

    +
    (84)
    +

    The claim appears to have been true of Ossanna +troff for the C/A/T device; Kernighan made device-independent +troff more flexible.

    +
    (85)
    +

    See Device and Font Description Files.

    +
    (86)
    +

    also +known vulgarly as “ANSI colors”

    +
    (87)
    +

    See Copy Mode.

    +
    (88)
    +

    This refers to +vtroff, a translator that would convert the C/A/T output from +early-vintage AT&T troff to a form suitable for +Versatec and Benson-Varian plotters.

    +
    (89)
    +

    Strictly, letters not otherwise recognized are treated +as output comparison delimiters. For portability, it is wise to avoid +using letters not in the list above; for example, Plan 9 +troff uses ‘h’ to test a mode it calls htmlroff, and +GNU troff may provide additional operators in the future.

    +
    (90)
    +

    Because formatting of the comparands takes place +in a dummy environment, vertical motions within them cannot spring +traps.

    +
    (91)
    +

    All +of this is to say that the lists of output nodes created by formatting +xxx and yyy must be identical. See gtroff Internals.

    +
    (92)
    +

    This bizarre behavior maintains compatibility with +AT&T troff.

    +
    (93)
    +

    See while.

    +
    (94)
    +

    See Copy Mode.

    +
    (95)
    +

    unless you redefine it

    +
    (96)
    +

    “somewhat less” because +things other than macro calls can be on the input stack

    +
    (97)
    +

    See Copy Mode.

    +
    (98)
    +

    While it is possible to define and +call a macro ‘.’, you can’t use it as an end macro: during a macro +definition, ‘..’ is never handled as calling ‘.’, even if +‘.de name .’ explicitly precedes it.

    +
    (99)
    +

    Its structure is +adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to +the problem of reflowing text multiple times to find an optimal +configuration for it. +https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html

    +
    (100)
    +

    If they were not, +parameter interpolations would be similar to command-line +parameters—fixed for the entire duration of a roff program’s +run. The advantage of interpolating \$ escape sequences even in +copy mode is that they can interpolate different contents from one call +to the next, like function parameters in a procedural language. The +additional escape character is the price of this power.

    +
    (101)
    +

    Compare this to the \def and \edef +commands in TeX.

    +
    (102)
    +

    These are lightly adapted from the groff +implementation of the ms macros.

    +
    (103)
    +

    At the +grops defaults of 10-point type on 12-point vertical spacing, the +difference between half a vee and half an em can be subtle: large +spacings like ‘.vs .5i’ make it obvious.

    +
    (104)
    +

    See Strings, for an explanation of the trailing +‘\"’.

    +
    (105)
    +

    (hc, vc) is adjusted to the point nearest +the perpendicular bisector of the arc’s chord.

    +
    (106)
    +

    See The Implicit Page Trap.

    +
    (107)
    +

    A trap planted at ‘20i’ or +‘-30i’ will not be sprung on a page of length ‘11i’.

    +
    (108)
    +

    It may help to think of each trap location as +maintaining a queue; wh operates on the head of the queue, and +ch operates on its tail. Only the trap at the head of the queue +is visible.

    +
    (109)
    +

    See Debugging.

    +
    (110)
    +

    See Diversions.

    +
    (111)
    +

    While processing an +end-of-input macro, the formatter assumes that the next page break must +be the last; it goes into “sudden death overtime”.

    +
    (112)
    +

    Another, taken by the groff man macros, is +to intercept ne requests and wrap bp ones.

    +
    (113)
    +

    Thus, the “water” +gets “higher” proceeding down the page.

    +
    (114)
    +

    The backslash is doubled. See Copy Mode.

    +
    (115)
    +

    that is, ISO 646:1991-IRV or, +popularly, “US-ASCII”

    +
    (116)
    +

    They are bypassed because these parameters are not +rendered as glyphs in the output; instead, they remain abstract +characters—in a PDF bookmark or a URL, for example.

    +
    (117)
    +

    Recall Line Layout.

    +
    (118)
    +

    Historically, +tools named nrchbar and changebar were developed for +marking changes with margin characters and could be found in archives of +the comp.sources.unix USENET group. Some proprietary +Unices also offer(ed) a diffmk program.

    +
    (119)
    +

    Except the +escape sequences \f, \F, \H, \m, \M, +\R, \s, and \S, which are processed immediately if +not in copy mode.

    +
    (120)
    +

    The +Graphic Systems C/A/T phototypesetter (the original device target for +AT&T troff) supported only a few discrete type sizes +in the range 6–36 points, so Ossanna contrived a special case in the +parser to do what the user must have meant. Kernighan warned of this in +the 1992 revision of CSTR #54 (§2.3), and more recently, McIlroy +referred to it as a “living fossil”.

    +
    (121)
    +

    DWB 3.3, Solaris, Heirloom Doctools, and +Plan 9 troff all support it.

    +
    (122)
    +

    Naturally, if you’ve changed +the escape character, you need to prefix the e with whatever it +is—and you’ll likely get something other than a backslash in the +output.

    +
    (123)
    +

    The rs special character identifier was not +defined in AT&T troff’s font description files, but is +in those of its lineal descendant, Heirloom Doctools troff, as of +the latter’s 060716 release (July 2006).

    +
    (124)
    +

    The parser +and postprocessor for intermediate output can be found in the file
    +groff-source-dir/src/libs/libdriver/input.cpp.

    +
    (125)
    +

    Plan 9 troff has also abandoned the binary +format.

    +
    (126)
    +

    800-point type +is not practical for most purposes, but using it enables the quantities +in the font description files to be expressed as integers.

    +
    (127)
    +

    groff requests and escape sequences +interpret non-negative font names as mounting positions instead. +Further, a font named ‘0’ cannot be automatically mounted by the +fonts directive of a DESC file.

    +
    (128)
    +

    For typesetter devices, this directive is misnamed +since it starts a list of glyphs, not characters.

    +
    (129)
    +

    that is, any integer parsable by the C +standard library’s strtol(3) function

    +
    + + + + diff --git a/doc/groff.html.node/Adjustment.html b/doc/groff.html.node/Adjustment.html new file mode 100644 index 0000000..60b01c4 --- /dev/null +++ b/doc/groff.html.node/Adjustment.html @@ -0,0 +1,57 @@ + + + + + + +Adjustment (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.5 Adjustment

    + + +

    After GNU troff performs an automatic break, it may then +adjust the line, widening inter-word spaces until the text reaches +the right margin. Extra spaces between words are preserved. Leading +and trailing spaces are handled as noted above. Text can be aligned to +the left or right margin only, or centered; see Manipulating Filling and Adjustment. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Argument-Units.html b/doc/groff.html.node/Argument-Units.html new file mode 100644 index 0000000..c7cbb16 --- /dev/null +++ b/doc/groff.html.node/Argument-Units.html @@ -0,0 +1,68 @@ + + + + + + +Argument Units (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.1.2 Argument Units

    + +

    Some commands take integer arguments that are assumed to represent +values in a measurement unit, but the letter for the corresponding +scaling unit is not written with the output command arguments. Most +commands assume the scaling unit ‘u’, the basic unit of the device, +some use ‘z’, the scaled point unit of the device, while others, +such as the color commands, expect plain integers. +

    +

    Single characters can have the eighth bit set, as can the names of +fonts and special characters. The names of characters and fonts can be +of arbitrary length. A character that is to be printed is always in +the current font. +

    +

    A string argument is always terminated by the next whitespace character +(space, tab, or newline); an embedded ‘#’ character is regarded as +part of the argument, not as the beginning of a comment command. An +integer argument is already terminated by the next non-digit character, +which then is regarded as the first character of the next argument or +command. +

    +
    + + + + + diff --git a/doc/groff.html.node/Artificial-Fonts.html b/doc/groff.html.node/Artificial-Fonts.html new file mode 100644 index 0000000..6f9d43d --- /dev/null +++ b/doc/groff.html.node/Artificial-Fonts.html @@ -0,0 +1,252 @@ + + + + + + +Artificial Fonts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.7 Artificial Fonts

    + + + +

    There are a number of requests and escape sequences for artificially +creating fonts. These are largely vestiges of the days when output +devices did not have a wide variety of fonts, and when nroff and +troff were separate programs. Most of them are no longer +necessary in GNU troff. Nevertheless, they are supported. +

    +
    +
    Escape sequence: \H'height'
    +
    +
    Escape sequence: \H'+height'
    +
    Escape sequence: \H'-height'
    +
    Register: \n[.height]
    +
    + + + +

    Change (increment, decrement) the height of the current font, but not +the width. If height is zero, restore the original height. +Default scaling unit is ‘z’. +

    +

    The read-only register .height contains the font height as set by +\H. +

    +

    Currently, only the -Tps and -Tpdf devices support +this feature. +

    +

    \H doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font on the fly: +

    +
    +
    .mc \H'+5z'x\H'0'
    +
    + +

    In compatibility mode, gtroff behaves differently: If an +increment or decrement is used, it is always taken relative to the +current type size and not relative to the previously selected font +height. Thus, +

    +
    +
    .cp 1
    +\H'+5'test \H'+5'test
    +
    + +

    prints the word ‘test’ twice with the same font height (five points +larger than the current font size). +

    + +
    +
    Escape sequence: \S'slant'
    +
    +
    Register: \n[.slant]
    +
    + + + +

    Slant the current font by slant degrees. Positive values slant to +the right. Only integer values are possible. +

    +

    The read-only register .slant contains the font slant as set by +\S. +

    +

    Currently, only the -Tps and -Tpdf devices support +this feature. +

    +

    \S doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font on the fly: +

    +
    +
    .mc \S'20'x\S'0'
    +
    + + + +

    This escape is incorrectly documented in the AT&T +troff manual; the slant is always set to an absolute value. +

    + +
    +
    Request: .ul [lines]
    +
    + +

    The ul request normally underlines subsequent lines if a TTY +output device is used. Otherwise, the lines are printed in italics +(only the term ‘underlined’ is used in the following). The single +argument is the quantity of input lines to be underlined; with no +argument, the next line is underlined. If lines is zero or +negative, stop the effects of ul (if it was active). Requests +and empty lines do not count for computing the number of underlined +input lines, even if they produce some output like tl. Lines +inserted by macros (e.g., invoked by a trap) do count. +

    +

    At the beginning of ul, the current font is stored and the +underline font is activated. Within the span of a ul request, it +is possible to change fonts, but after the last line affected by +ul the saved font is restored. +

    +

    This number of lines still to be underlined is associated with the +environment (see Environments). The underline font can be changed +with the uf request. +

    + + +

    The ul request does not underline spaces. +

    + +
    +
    Request: .cu [lines]
    +
    + + +

    The cu request is similar to ul but underlines spaces as +well (if a TTY output device is used). +

    + +
    +
    Request: .uf font
    +
    + + +

    Set the underline font (globally) used by ul and cu. By +default, this is the font at position 2. font can be either +a non-negative font position or the name of a font. +

    + +
    +
    Request: .bd font [offset]
    +
    +
    Request: .bd font1 font2 [offset]
    +
    Register: \n[.b]
    +
    + + +

    Embolden font by overstriking its glyphs offset by offset +units minus one. +

    +

    Two syntax forms are available. +

    +
      +
    • Imitate a bold font unconditionally. The first argument specifies the +font to embolden, and the second is the number of basic units, minus +one, by which the two glyphs are offset. If the second argument is +missing, emboldening is turned off. + +

      font can be either a non-negative font position or the name of a +font. +

      +

      offset is available in the .b read-only register if a +special font is active; in the bd request, its default unit is +‘u’. +

      +
    • + + + +Imitate a bold form conditionally. Embolden font1 by offset +only if font font2 is the current font. This request can be +issued repeatedly to set up different emboldening values for different +current fonts. If the second argument is missing, emboldening is turned +off for this particular current font. + +

      This affects special fonts only (either set up with the special +command in font files or with the fspecial request). +

    +
    + +
    +
    Request: .cs font [width [em-size]]
    +
    + + + + +

    Switch to and from constant glyph space mode. If activated, the +width of every glyph is width/36 ems. The em size is given +absolutely by em-size; if this argument is missing, the em value +is taken from the current font size (as set with the ps request) +when the font is effectively in use. Without second and third argument, +constant glyph space mode is deactivated. +

    +

    Default scaling unit for em-size is ‘z’; width is an +integer. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Assigning-Register-Formats.html b/doc/groff.html.node/Assigning-Register-Formats.html new file mode 100644 index 0000000..ff0ddfa --- /dev/null +++ b/doc/groff.html.node/Assigning-Register-Formats.html @@ -0,0 +1,188 @@ + + + + + + +Assigning Register Formats (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8.4 Assigning Register Formats

    + + + + +

    A writable register’s value can be interpolated in several number +formats. By default, conventional Arabic numerals are used. +Other formats see use in sectioning and outlining schemes and +alternative page numbering arrangements. +

    +
    +
    Request: .af reg fmt
    +
    +

    Use number format fmt when interpolating register reg. +Valid number formats are as follows. +

    +
    +
    0
    +

    Arabic numerals 0, 1, 2, and so on. +Any decimal digit is equivalent to ‘0’; the formatter merely counts +the digits specified. Multiple Arabic numerals in fmt cause +interpolations to be zero-padded on the left if necessary to at least as +many digits as specified (interpolations never truncate a register +value). A register with format ‘00’ interpolates values 1, 2, 3 as +‘01’, ‘02’, ‘03’. The default format for all writable +registers is ‘0’. +

    +
    +
    I
    +
    +

    Uppercase Roman numerals: 0, I, II, III, IV, ... +

    +
    +
    i
    +

    Lowercase Roman numerals: 0, i, ii, iii, iv, ... +

    +
    +
    A
    +

    Uppercase letters: 0, A, B, C, …, Z, AA, AB, ... +

    +
    +
    a
    +

    Lowercase letters: 0, a, b, c, …, z, aa, ab, ... +

    +
    + +

    Omitting fmt causes a warning in category ‘missing’. +See Warnings, for information about the enablement and suppression of +warnings. Specifying an unrecognized format is an error. +

    +

    Zero values are interpolated as ‘0’ in non-Arabic formats. +Negative quantities are prefixed with ‘-’ irrespective of format. +In Arabic formats, the sign supplements the field width. If reg +doesn’t exist, it is created with a zero value. +

    +
    +
    .nr a 10
    +.af a 0           \" the default format
    +\na,
    +.af a I
    +\na,
    +.af a 321
    +.nr a (-\na)
    +\na,
    +.af a a
    +\na
    +    ⇒ 10, X, -010, -j
    +
    + + + + + +

    The representable extrema in the ‘i’ and ‘I’ formats +correspond to Arabic ±39,999. GNU troff uses ‘w’ and +‘z’ to represent 5,000 and 10,000 in Roman numerals, respectively, +following the convention of AT&T troff—currently, the +correct glyphs for Roman numerals five thousand (U+2181) and ten +thousand (U+2182) are not used. +

    + + +

    Assigning the format of a read-only register is an error. Instead, copy +the read-only register’s value to, and assign the format of, a writable +register. +

    + +
    +
    Escape sequence: \gr
    +
    +
    Escape sequence: \g(rg
    +
    Escape sequence: \g[reg]
    +
    + +

    Interpolate the format of the register reg (one-character +name r, two-character name rg). Zeroes represent +Arabic formats. If reg is not defined, reg is not created +and nothing is interpolated. \g is interpreted even in copy mode +(see Copy Mode). +

    + + + +

    GNU troff interprets only Arabic numerals. The Roman numeral or +alphabetic formats cannot be used as operands to arithmetic operators in +expressions (see Numeric Expressions). For instance, it may be +desirable to test the page number independently of its format. +

    +
    +
    .af % i \" front matter
    +.de header-trap
    +.  \" To test the page number, we need it in Arabic.
    +.  ds saved-page-number-format \\g%\"
    +.  af % 0
    +.  nr page-number-in-decimal \\n%
    +.  af % \\*[saved-page-number-format]
    +.  ie \\n[page-number-in-decimal]=1 .do-first-page-stuff
    +.  el \{\
    +.    ie o .do-odd-numbered-page-stuff
    +.    el   .do-even-numbered-page-stuff
    +.  \}
    +.  rm saved-page-number-format
    +..
    +.wh 0 header-trap
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Auto_002dincrement.html b/doc/groff.html.node/Auto_002dincrement.html new file mode 100644 index 0000000..2680f67 --- /dev/null +++ b/doc/groff.html.node/Auto_002dincrement.html @@ -0,0 +1,124 @@ + + + + + + +Auto-increment (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8.3 Auto-increment

    + + + + +

    Registers can also be incremented or decremented by a configured amount +at the time they are interpolated. The value of the increment is +specified with a third argument to the nr request, and a special +interpolation syntax is used to alter and then retrieve the register’s +value. Together, these features are called +auto-increment.51 +

    +
    +
    Request: .nr ident value incr
    +
    + +

    Set register ident to value and its auto-incrementation +amount to to incr. The \R escape sequence doesn’t support +an incr argument. +

    + +

    Auto-incrementation is not completely automatic; the \n +escape sequence in its basic form never alters the value of a register. +To apply auto-incrementation to a register, interpolate it with +‘\n±’. +

    +
    +
    Escape sequence: \n+i
    +
    +
    Escape sequence: \n-i
    +
    Escape sequence: \n+(id
    +
    Escape sequence: \n-(id
    +
    Escape sequence: \n+[ident]
    +
    Escape sequence: \n-[ident]
    +

    Increment or decrement ident (one-character +name i, two-character name id) by the register’s +auto-incrementation value and then interpolate the new register value. +If ident has no auto-incrementation value, interpolate as with +\n. +

    + +
    +
    .nr a 0 1
    +.nr xx 0 5
    +.nr foo 0 -2
    +\n+a, \n+a, \n+a, \n+a, \n+a
    +.br
    +\n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx
    +.br
    +\n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo]
    +    ⇒ 1, 2, 3, 4, 5
    +    ⇒ -5, -10, -15, -20, -25
    +    ⇒ -2, -4, -6, -8, -10
    +
    + + + +

    To change the increment value without changing the value of a register, +assign the register’s value to itself by interpolating it, and specify +the desired increment normally. Apply an increment of ‘0’ to +disable auto-incrementation of the register. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Background.html b/doc/groff.html.node/Background.html new file mode 100644 index 0000000..1ce4224 --- /dev/null +++ b/doc/groff.html.node/Background.html @@ -0,0 +1,96 @@ + + + + + + +Background (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.1 Background

    + + +

    M. Douglas McIlroy, formerly of AT&T Bell Laboratories and present at +the creation of the Unix operating system, offers an authoritative +historical summary. +

    +
    +

    The prime reason for Unix was the desire of Ken [Thompson], Dennis +[Ritchie], and Joe Ossanna to have a pleasant environment for software +development. The fig leaf that got the nod from … +management was that an early use would be to develop a “stand-alone” +word-processing system for use in typing pools and secretarial offices. +Perhaps they had in mind “dedicated”, as distinct from +“stand-alone”; that’s what eventuated in various cases, most notably +in the legal/patent department and in the AT&T CEO’s office. +

    +

    Both those systems were targets of opportunity, not foreseen from the +start. When Unix was up and running on the PDP-11, Joe got wind of +the legal department having installed a commercial word processor. +He went to pitch Unix as an alternative and clinched a trial by +promising to make roff able to number lines by tomorrow in order +to fulfill a patent-office requirement that the commercial system did +not support. +

    +

    Modems were installed so legal-department secretaries could try the +Research machine. They liked it and Joe’s superb customer service. +Soon the legal department got a system of their own. Joe went on to +create nroff and troff. Document preparation became a +widespread use of Unix, but no stand-alone word-processing system was +ever undertaken. +

    + +

    A history relating groff to its predecessors roff, +nroff, and troff is available in the roff(7) +man page. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Basics.html b/doc/groff.html.node/Basics.html new file mode 100644 index 0000000..95db07b --- /dev/null +++ b/doc/groff.html.node/Basics.html @@ -0,0 +1,232 @@ + + + + + + +Basics (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.1 Basics

    + + + +

    Let us first survey some basic concepts necessary to use a macro package +fruitfully.6 +References are made throughout to more detailed information. +

    +

    GNU troff reads an input file prepared by the user and outputs a +formatted document suitable for publication or framing. The input +consists of text, or words to be printed, and embedded commands +(requests and escape sequences), which tell GNU +troff how to format the output. See Formatter Instructions. +

    +

    The word argument is used in this chapter to mean a word or +number that appears on the same line as a request, and which modifies +the meaning of that request. For example, the request +

    +
    +
    .sp
    +
    + +

    spaces one line, but +

    +
    +
    .sp 4
    +
    + +

    spaces four lines. The number 4 is an argument to the sp +request, which says to space four lines instead of one. Arguments are +separated from the request and from each other by spaces (not +tabs). See Invoking Requests. +

    +

    The primary function of GNU troff is to collect words from input +lines, fill output lines with those words, adjust the line to the +right-hand margin by widening spaces, and output the result. For +example, the input: +

    +
    +
    Now is the time
    +for all good men
    +to come to the aid
    +of their party.
    +Four score and seven
    +years ago, etc.
    +
    + +

    is read, packed onto output lines, and justified to produce: +

    +
    +
      ⇒ Now is the time for all good men to come to the aid of
    +  ⇒ their party.  Four score and seven years ago, etc.
    +
    + +

    Sometimes a new output line should be started even though the current +line is not yet full—for example, at the end of a paragraph. To do +this it is possible to force a break, starting a new output +line. Some requests cause a break automatically, as do (normally) blank +input lines and input lines beginning with a space or tab. +

    +

    Not all input lines are text lines—words to be formatted. +Some are control lines that tell a macro package (or GNU +troff directly) how to format the text. Control lines start with +a dot (‘.’) or an apostrophe (‘'’) as the first character, and +can be followed by a macro call. +

    +

    The formatter also does more complex things, such as automatically +numbering pages, skipping over page boundaries, putting footnotes in the +correct place, and so forth. +

    +

    Here are a few hints for preparing text for input to GNU troff. +

    +
      +
    • First, keep the input lines short. Short input lines are easier to +edit, and GNU troff packs words onto longer lines anyhow. + +
    • In keeping with this, it is helpful to begin a new line after every +comma or phrase, since common corrections are to add or delete sentences +or phrases. + +
    • End each sentence with two spaces—or better, start each sentence on a +new line. GNU troff recognizes characters that usually end a +sentence, and inserts inter-sentence space accordingly. + +
    • Do not hyphenate words at the end of lines—GNU troff is smart +enough to hyphenate words as needed, but is not smart enough to take +hyphens out and join a word back together. Also, words such as +“mother-in-law” should not be broken over a line, since then a space +can occur where not wanted, such as “mother- in-law”. +
    + +

    We offer further advice in Input Conventions. +

    + + +

    GNU troff permits alteration of the distance between lines of +text. This is termed vertical spacing and is expressed in the +same units as the type size—the point. The default is 10-point type +on 12-point spacing. To get double-spaced text you would set +the vertical spacing to 24 points. Some, but not all, macro packages +expose a macro or register to configure the vertical spacing. +

    +

    A number of requests allow you to change the way the output is arranged +on the page, sometimes called the layout of the output page. +Most macro packages don’t supply macros for performing these (at least +not without performing other actions besides), as they are such basic +operations. The macro packages for writing man pages, man and +mdoc, don’t encourage explicit use of these requests at all. +

    + +

    The request ‘.sp N leaves N lines of blank +space. N can be omitted (skipping a single line) or can +be of the form Ni (for N inches) or Nc (for +N centimeters). For example, the input: +

    +
    +
    .sp 1.5i
    +My thoughts on the subject
    +.sp
    +
    + +

    leaves one and a half inches of space, followed by the line “My +thoughts on the subject”, followed by a single blank line (more +measurement units are available; see Measurements). +

    +

    If you seek precision in spacing, be advised when using a macro package +that it might not honor sp requests as you expect; it can use a +formatter feature called no-space mode to prevent excess space +from accumulating. Macro packages typically offer registers to control +spacing between paragraphs, before section headings, and around displays +(discussed below); use these facilities preferentially. +See Manipulating Spacing. +

    + + +

    Text lines can be centered by using the ce request. The line +after ce is centered (horizontally) on the page. To center more +than one line, use ‘.ce N (where N is the number +of lines to center), followed by the N lines. To center many +lines without counting them, type: +

    +
    +
    .ce 1000
    +lines to center
    +.ce 0
    +
    + +

    The ‘.ce 0 request tells GNU troff to center zero more +lines, in other words, stop centering. +

    + + + + +

    GNU troff also offers the rj request for right-aligning +text. It works analogously to ce and is convenient for setting +epigraphs. +

    + + +

    The bp request starts a new page; this necessarily implies an +ordinary (line) break. +

    + + +

    All of these requests cause a break; that is, they always start a new +line. To start a new line without performing any other action, use +br. If you invoke them with the apostrophe ‘'’, the +no-break control character, the (initial) break they normally +perform is suppressed. ‘'br’ does nothing. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Blank-Line-Traps.html b/doc/groff.html.node/Blank-Line-Traps.html new file mode 100644 index 0000000..b7b0ae4 --- /dev/null +++ b/doc/groff.html.node/Blank-Line-Traps.html @@ -0,0 +1,71 @@ + + + + + + +Blank Line Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.3 Blank Line Traps

    + + + +
    +
    Request: .blm [name]
    +
    + +

    Set a blank line trap, calling the macro name when GNU +troff encounters a blank line in an input file, instead of the +usual behavior (see Breaking). A line consisting only of spaces is +also treated as blank and subject to this trap. If no argument is +supplied, the default blank line behavior is (re-)established. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Breaking.html b/doc/groff.html.node/Breaking.html new file mode 100644 index 0000000..a883e07 --- /dev/null +++ b/doc/groff.html.node/Breaking.html @@ -0,0 +1,119 @@ + + + + + + +Breaking (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.4 Breaking

    + + + + + +

    Once an output line is full, the next word (or remainder of a hyphenated +one) is placed on a different output line; this is called a break. +In this manual and in roff discussions generally, a “break” if +not further qualified always refers to the termination of an output +line. When the formatter is filling text, it introduces breaks +automatically to keep output lines from exceeding the configured line +length. After an automatic break, GNU troff adjusts the line if +applicable (see below), and then resumes collecting and filling text on +the next output line. +

    +

    Sometimes, a line cannot be broken automatically. This usually does +not happen with natural language text unless the output line length has +been manipulated to be extremely short, but it can with specialized +text like program source code. We can use perl at the shell +prompt to contrive an example of failure to break the line. We also +employ the -z option to suppress normal output. +

    +
    +
    $ perl -e 'print "#" x 80, "\n";' | nroff -z
    +    error→ warning: cannot break line
    +
    + +

    The remedy for these cases is to tell GNU troff where the line +may be broken without hyphens. This is done with the non-printing break +point escape sequence ‘\:’; see Manipulating Hyphenation. +

    + + + + +

    What if the document author wants to stop filling lines temporarily, for +instance to start a new paragraph? There are several solutions. A +blank input line not only causes a break, but by default it also outputs +a one-line vertical space (effectively a blank output line). This +behavior can be modified; see Blank Line Traps. Macro packages +may discourage or disable the blank line method of paragraphing in favor +of their own macros. +

    + + + + +

    A line that begins with one or more spaces causes a break. The spaces +are output at the beginning of the next line without being +adjusted (see below); however, this behavior can be modified +(see Leading Space Traps). Again, macro packages may provide other +methods of producing indented paragraphs. Trailing spaces on text lines +are discarded.23 +

    +

    What if the file ends before enough words have been collected to fill an +output line? Or the output line is exactly full but not yet broken, and +there is no more input? GNU troff interprets the end of input as +a break. Certain requests also cause breaks, implicitly or explicitly. +This is discussed in Manipulating Filling and Adjustment. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Built_002din-Registers.html b/doc/groff.html.node/Built_002din-Registers.html new file mode 100644 index 0000000..a1b0530 --- /dev/null +++ b/doc/groff.html.node/Built_002din-Registers.html @@ -0,0 +1,253 @@ + + + + + + +Built-in Registers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8.5 Built-in Registers

    + + + +

    Predefined registers whose identifiers start with a dot are read-only. +Many are Boolean-valued, interpolating a true or false value testable +with the if, ie, or while requests. Some read-only +registers are string-valued, meaning that they interpolate text. +

    + + + +

    Caution: Built-in registers are subject to removal like +others; once removed, they can be recreated only as normal writable +registers and will not reflect formatter state. +

    +

    A register name (without the dot) is often associated with a request of +the same name. A complete listing of all built-in registers can be +found in Register Index. +

    +

    We present here a few built-in registers that are not described +elsewhere in this manual; they have to do with invariant properties of +GNU troff, or obtain information about the formatter’s +command-line options, processing progress, or the operating environment. +

    +
    +
    \n[.A]
    +
    + +

    Approximate output is being formatted (Boolean-valued); see +groff -a option (Options). +

    +
    +
    \n[.c]
    +
    +
    +
    \n[c.]
    +
    + +

    Input line number. ‘c.’ is a writable synonym, +affecting subsequent interpolations of both ‘.c’ and ‘c.’. +

    +
    +
    \n[.F]
    +
    + +

    Name of input file (string-valued). +

    +
    +
    \n[.g]
    +
    + +

    Always true in GNU troff (Boolean-valued). Documents can use +this to ask the formatter if it claims groff compatibility. +

    +
    +
    \n[.P]
    +

    Output page selection status (Boolean-valued); see groff +-o option (Options). +

    +
    +
    \n[.R]
    +
    + +

    Count of available unused registers; always 10,000 in GNU +troff.52 +

    +
    +
    \n[.T]
    +

    Indicator of output device selection (Boolean-valued); see +groff -T option (Options). +

    +
    +
    \n[.U]
    +
    + + + +

    Unsafe mode enablement status (Boolean-valued); see groff +-U option (Options). +

    +
    +
    \n[.x]
    +
    + +

    Major version number of the running GNU troff formatter. For +example, if the version number is 1.23.0, then .x +contains ‘1’. +

    +
    +
    \n[.y]
    +
    + +

    Minor version number of the running GNU troff formatter. For +example, if the version number is 1.23.0, then .y +contains ‘23’. +

    +
    +
    \n[.Y]
    +
    +

    Revision number of the running GNU troff formatter. For example, +if the version number is 1.23.0, then .Y contains ‘0’. +

    +
    +
    \n[$$]
    +
    + + + +

    Process identifier (PID) of the GNU troff program in its +operating environment. +

    +
    + +

    Date- and time-related registers are set per the local time as +determined by localtime(3) when the formatter launches. This +initialization can be overridden by SOURCE_DATE_EPOCH and +TZ; see Environment. +

    +
    +
    \n[seconds]
    +
    + + +

    Count of seconds elapsed in the minute (0–60).

    +
    +
    \n[minutes]
    +
    + + +

    Count of minutes elapsed in the hour (0–59). +

    +
    +
    \n[hours]
    +
    + + +

    Count of hours elapsed since midnight (0–23). +

    +
    +
    \n[dw]
    +
    + +

    Day of the week (1–7; 1 is Sunday). +

    +
    +
    \n[dy]
    +
    + +

    Day of the month (1–31). +

    +
    +
    \n[mo]
    +
    + +

    Month of the year (1–12). +

    +
    +
    \n[year]
    +
    + +

    Gregorian year. +

    + + +
    +
    \n[yr]
    +

    Gregorian year minus 1900. This register is incorrectly documented +in the AT&T troff manual as storing the last two digits +of the current year. That claim stopped being true in 2000. Old +troff input that looks like: +

    +
    +
    '\" The year number is a surprise after 1999.
    +This document was formatted in 19\n(yr.
    +
    + +

    can be corrected to: +

    +
    +
    This document was formatted in \n[year].
    +
    + +

    or, for portability across many roff programs, to the following. +

    +
    +
    .nr y4 1900+\n(yr
    +This document was formatted in \n(y4.
    +
    +
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Calling-Macros.html b/doc/groff.html.node/Calling-Macros.html new file mode 100644 index 0000000..1e8d81a --- /dev/null +++ b/doc/groff.html.node/Calling-Macros.html @@ -0,0 +1,164 @@ + + + + + + +Calling Macros (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6.3 Calling Macros

    + + + + +

    If a macro of the desired name does not exist when called, it is +created, assigned an empty definition, and a warning in category +‘mac’ is emitted. Calling an undefined macro does end a +macro definition naming it as its end macro (see Writing Macros). +

    + +

    To embed spaces within a macro argument, enclose the argument in +neutral double quotes ". Horizontal motion escape sequences are +sometimes a better choice for arguments to be formatted as text. +

    +

    Consider calls to a hypothetical section heading macro ‘uh’. +

    +
    +
    .uh The Mouse Problem
    +.uh "The Mouse Problem"
    +.uh The\~Mouse\~Problem
    +.uh The\ Mouse\ Problem
    +
    + + + +

    The first line calls uh with three arguments: ‘The’, +‘Mouse’, and ‘Problem’. The remainder call the uh +macro with one argument, ‘The Mouse Problem’. The last solution, +using escaped spaces, can be found in documents prepared for +AT&T troff. It can cause surprise when text is +adjusted, because \SP inserts a fixed-width, +non-breaking space. GNU troff’s \~ escape sequence +inserts an adjustable, non-breaking space.44 +

    + + + + +

    The foregoing raises the question of how to embed neutral double quotes +or backslashes in macro arguments when those characters are +desired as literals. In GNU troff, the special character escape +sequence \[rs] produces a backslash and \[dq] a neutral +double quote. +

    +

    In GNU troff’s AT&T compatibility mode, these +characters remain available as \(rs and \(dq, +respectively. AT&T troff did not consistently define +these special characters, +but its descendants can be made to support them. See Device and Font Description Files. +

    +

    If even that is not feasible, options remain. To obtain a literal +escape character in a macro argument, you can simply type it if you +change or disable the escape character first. See Using Escape Sequences. Otherwise, you must escape the escape character repeatedly +to a context-dependent extent. See Copy Mode. +

    +

    For the (neutral) double quote, you have recourse to an obscure +syntactical feature of AT&T troff. Because a double +quote can begin a macro argument, the formatter keeps track of whether +the current argument was started thus, and doesn’t require a space after +the double quote that ends it.45 In +the argument list to a macro, a double quote that isn’t preceded +by a space doesn’t start a macro argument. If not preceded by a +double quote that began an argument, this double quote becomes part of +the argument. Furthermore, within a quoted argument, a pair of adjacent +double quotes becomes a literal double quote. +

    +
    +
    .de eq
    +.  tm arg1:\\$1 arg2:\\$2 arg3:\\$3
    +.  tm arg4:\\$4 arg5:\\$5 arg6:\\$6
    +.. \" 4 backslashes on the next line
    +.eq a" "b c" "de"f\\\\g" h""i "j""k"
    +    error→ arg1:a" arg2:b c arg3:de
    +    error→ arg4:f\g" arg5:h""i arg6:j"k
    +
    + +

    Apart from the complexity of the rules, this traditional solution has +the disadvantage that double quotes don’t survive repeated argument +expansion in AT&T troff or GNU troff’s +compatibility mode. This can frustrate efforts to pass such arguments +intact through multiple macro calls. +

    +
    +
    .cp 1
    +.de eq
    +.  tm arg1:\\$1 arg2:\\$2 arg3:\\$3
    +.  tm arg4:\\$4 arg5:\\$5 arg6:\\$6
    +..
    +.de xe
    +.  eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
    +.. \" 8 backslashes on the next line
    +.xe a" "b c" "de"f\\\\\\\\g" h""i "j""k"
    +    error→ arg1:a" arg2:b arg3:c
    +    error→ arg4:de arg5:f\g" arg6:h""i
    +
    + + + + + +

    Outside of compatibility mode, GNU troff doesn’t exhibit this +problem because it tracks the nesting depth of interpolations. +See Implementation Differences. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Changing-the-Type-Size.html b/doc/groff.html.node/Changing-the-Type-Size.html new file mode 100644 index 0000000..da02d8b --- /dev/null +++ b/doc/groff.html.node/Changing-the-Type-Size.html @@ -0,0 +1,159 @@ + + + + + + +Changing the Type Size (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.20.1 Changing the Type Size

    + +
    +
    Request: .ps [size]
    +
    +
    Request: .ps +size
    +
    Request: .ps -size
    +
    Escape sequence: \ssize
    +
    +
    Register: \n[.s]
    +
    + + + +

    Use the ps request or the \s escape sequence to change +(increase, decrease) the type size (in scaled points). Specify +size as either an absolute type size, or as a relative change from +the current size. ps with no argument restores the previous +size. The ps request’s default scaling unit is ‘z’. The +requested size is rounded to the nearest valid size (with ties rounding +down) within the limits supported by the device. If the requested size +is non-positive, it is treated as 1u. +

    + + + +

    Type size alteration is incorrectly documented in the AT&T +troff manual, which claims “if [the requested size] is invalid, +the next larger valid size will result, with a maximum of +36”.84 +

    + + +

    The read-only string-valued register .s interpolates the type +size in points as a decimal fraction; it is associated with the +environment (see Environments). To obtain the type size in scaled +points, interpolate the .ps register instead (see Using Fractional Type Sizes). +

    +

    The \s escape sequence supports a variety of syntax forms. +

    +
    +
    \sn
    +

    Set the type size to n points. n must be a single +digit. If n is 0, restore the previous size. +

    +
    +
    \s+n
    +
    \s-n
    +

    Increase or decrease the type size by n points. +n must be exactly one digit. +

    +
    +
    \s(nn
    +

    Set the type size to nn points. nn must be exactly two +digits. +

    +
    +
    \s+(nn
    +
    \s-(nn
    +
    \s(+nn
    +
    \s(-nn
    +

    Alter the type size in points by the two-digit value nn. +

    +
    + +

    See Using Fractional Type Sizes, for further syntactical forms of the +\s escape sequence that additionally accept decimal fractions. +

    +
    +
    snap, snap,
    +.ps +2
    +grin, grin,
    +.ps +2
    +wink, wink, \s+2nudge, nudge,\s+8 say no more!
    +.ps 10
    +
    +
    + +

    The \s escape sequence affects the environment immediately and +doesn’t produce an input token. Consequently, it can be used in +requests like mc, which expects a single character as an +argument, to change the type size on the fly. +

    +
    +
    .mc \s[20]x\s[0]
    +
    + +
    +
    Request: .sizes s1 s2 … sn [0]
    +
    +

    The DESC file specifies which type sizes are allowed by the +output device; see DESC File Format. Use the sizes request +to change this set of permissible sizes. Arguments are in scaled +points; see Using Fractional Type Sizes. Each can be a single +type size (such as ‘12000’), or a range of sizes (such as +‘4000-72000’). You can optionally end the list with a ‘0’. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Changing-the-Vertical-Spacing.html b/doc/groff.html.node/Changing-the-Vertical-Spacing.html new file mode 100644 index 0000000..cca1634 --- /dev/null +++ b/doc/groff.html.node/Changing-the-Vertical-Spacing.html @@ -0,0 +1,146 @@ + + + + + + +Changing the Vertical Spacing (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.20.2 Changing the Vertical Spacing

    + +
    +
    Request: .vs [space]
    +
    +
    Request: .vs +space
    +
    Request: .vs -space
    +
    Register: \n[.v]
    +
    + + + +

    Set the vertical spacing to, or alter it by, space. The default +scaling unit is ‘p’. If vs is called without an argument, +the vertical spacing is reset to the previous value before the last call +to vs. + +GNU troff emits a warning in category ‘range’ if space +is negative; the vertical spacing is then set to the smallest possible +positive value, the vertical motion quantum (as found in the .V +register). +

    +

    .vs 0 isn’t saved in a diversion since it doesn’t result in +a vertical motion. You must explicitly issue this request before +interpolating the diversion. +

    +

    The read-only register .v contains the vertical spacing; it is +associated with the environment (see Environments). +

    + + +

    When a break occurs, GNU troff performs the following procedure. +

    +
      +
    • + +Move the drawing position vertically by the extra pre-vertical line +space, the minimum of all negative \x escape sequence arguments +in the pending output line. + +
    • Move the drawing position vertically by the vertical line spacing. + +
    • Write out the pending output line. + +
    • + +Move the drawing position vertically by the extra post-vertical line +space, the maximum of all positive \x escape sequence arguments +in the line that has just been output. + +
    • + +Move the drawing position vertically by the post-vertical line +spacing (see below). +
    + + +

    Prefer vs or pvs over ls to produce double-spaced +documents. vs and pvs have finer granularity than +ls; moreover, some preprocessors assume single spacing. +See Manipulating Spacing, regarding the \x escape sequence and +the ls request. +

    +
    +
    Request: .pvs [space]
    +
    +
    Request: .pvs +space
    +
    Request: .pvs -space
    +
    Register: \n[.pvs]
    +
    + + + +

    Set the post-vertical spacing to, or alter it by, space. The +default scaling unit is ‘p’. If pvs is called without an +argument, the post-vertical spacing is reset to the previous value +before the last call to pvs. GNU troff emits a warning in +category ‘range’ if space is negative; the post-vertical +spacing is then set to zero. +

    +

    The read-only register .pvs contains the post-vertical spacing; +it is associated with the environment (see Environments). +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Character-Classes.html b/doc/groff.html.node/Character-Classes.html new file mode 100644 index 0000000..6e315dd --- /dev/null +++ b/doc/groff.html.node/Character-Classes.html @@ -0,0 +1,140 @@ + + + + + + +Character Classes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.5 Character Classes

    + + + +

    Classes are particularly useful for East Asian languages such as +Chinese, Japanese, and Korean, where the number of needed characters is +much larger than in European languages, and where large sets of +characters share the same properties. +

    +
    +
    Request: .class name c1 c2 …
    +
    + + + +

    Define a character class (or simply “class”) name comprising +the characters c1, c2, and so on. +

    +

    A class thus defined can then be referred to in lieu of listing all the +characters within it. Currently, only the cflags request can +handle references to character classes. +

    +

    In the request’s simplest form, each cn is a character (or special +character). +

    +
    +
    .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]
    +
    + +

    Since class and glyph names share the same name space, it is recommended +to start and end the class name with [ and ], +respectively, to avoid collisions with existing character names defined +by GNU troff or the user (with char and related requests). +This practice applies the presence of ] in the class name to +prevent the use of the special character escape form +\[], thus you must use the \C escape to access +a class with such a name. +

    + + +

    You can also use a character range notation consisting of a +start character followed by ‘-’ and then an end character. +Internally, GNU troff converts these two symbol names to +Unicode code points (according to the groff glyph list [GGL]), +which then give the start and end value of the range. If that fails, +the class definition is skipped. +

    +

    Furthermore, classes can be nested. +

    +
    +
    .class [prepunct] , : ; > }
    +.class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016]
    +
    + +

    The class ‘[prepunctx]’ thus contains the contents of the class +[prepunct] as defined above (the set ‘, : ; > }’), and +characters in the range between U+2013 and U+2016. +

    +

    If you want to include ‘-’ in a class, it must be the first +character value in the argument list, otherwise it gets misinterpreted +as part of the range syntax. +

    +

    It is not possible to use class names as end points of range +definitions. +

    +

    A typical use of the class request is to control line-breaking +and hyphenation rules as defined by the cflags request. For +example, to inhibit line breaks before the characters belonging to the +prepunctx class defined in the previous example, you can write +the following. +

    +
    +
    .cflags 2 \C'[prepunctx]'
    +
    + +

    See the cflags request in Using Symbols, for more details. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Character-Translations.html b/doc/groff.html.node/Character-Translations.html new file mode 100644 index 0000000..a867be8 --- /dev/null +++ b/doc/groff.html.node/Character-Translations.html @@ -0,0 +1,200 @@ + + + + + + +Character Translations (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.13 Character Translations

    + + + +

    A translation is a mapping of an input character to an output +glyph. The mapping occurs at output time, i.e., the input character +gets assigned the metric information of the mapped output character +right before input tokens are converted to nodes (see gtroff Internals, for more on this process). +

    +
    +
    Request: .tr abcd
    +
    +
    Request: .trin abcd
    +
    +

    Translate character a to glyph b, character c to +glyph d, and so on. If there is an odd number of characters +in the argument, the last one is translated to a fixed-width space (the +same one obtained by the \SP escape sequence). +

    +

    The trin request is identical to tr, but when you unformat +a diversion with asciify it ignores the translation. +See Diversions, for details about the asciify request. +

    +

    Some notes: +

    +
      +
    • + + + + + + + + + + + + +Special characters (\(xx, \[xxx], +\C'xxx', \', \`, \-, \_), +glyphs defined with the char request, and numbered glyphs +(\N'xxx') can be translated also. + +
    • +The \e escape can be translated also. + +
    • + +Characters can be mapped onto the \% and \~ escape +sequences (but \% and \~ can’t be mapped onto another +glyph). + +
    • + + + + + + + + + +The following characters can’t be translated: space (with one exception, +see below), backspace, newline, leader (and \a), tab (and +\t). + +
    • +Translations are not considered for finding the soft hyphen character +set with the shc request. + +
    • +The pair ‘c\&’ (an arbitrary character c followed +by the dummy character) maps this character to “nothing”. + +
      +
      .tr a\&
      +foo bar
      +    ⇒ foo br
      +
      + +

      Even the space character can be mapped to the dummy character. +

      +
      +
      .tr aa \&
      +foo bar
      +    ⇒ foobar
      +
      + +

      As shown in the example, the space character can’t be the first +character/glyph pair as an argument of tr. Additionally, it is +not possible to map the space character to any other glyph; requests +like ‘.tr aa x undo ‘.tr aa \& instead. +

      +

      If justification is active, lines are justified in spite of the ‘empty’ +space character (but there is no minimal distance, i.e., the space +character, between words). +

      +
    • After an output glyph has been constructed (this happens at the moment +immediately before the glyph is appended to an output glyph list, either +by direct output, in a macro, diversion, or string), it is no longer +affected by tr. + +
    • Translating character to glyphs where one of them or both are undefined +is possible also; tr does not check whether the elements of its +argument exist. + +

      See gtroff Internals. +

      +
    • Without an argument, the tr request is ignored. +
    +
    + +
    +
    Request: .trnt abcd
    +
    + +

    trnt is the same as the tr request except that the +translations do not apply to text that is transparently throughput into +a diversion with \!. See Diversions. +

    +

    For example, +

    +
    +
    .tr ab
    +.di x
    +\!.tm a
    +.di
    +.x
    +
    + +

    prints ‘b’ to the standard error stream; if trnt is used +instead of tr it prints ‘a’. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Colors.html b/doc/groff.html.node/Colors.html new file mode 100644 index 0000000..8c23dcb --- /dev/null +++ b/doc/groff.html.node/Colors.html @@ -0,0 +1,208 @@ + + + + + + +Colors (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.21 Colors

    + + + + + + +

    GNU troff supports color output with a variety of color spaces +and up to 16 bits per channel. Some devices, particularly terminals, +may be more limited. When color support is enabled, two colors are +current at any given time: the stroke color, with which glyphs, +rules (lines), and geometric objects like circles and polygons are +drawn, and the fill color, which can be used to paint the interior +of a closed geometric figure. +

    +
    +
    Request: .color [n]
    +
    +
    Register: \n[.color]
    +
    +

    If n is missing or non-zero, enable the output of color-related +device-independent output commands (this is the default); otherwise, +disable them. This request sets a global flag; it does not produce an +input token (see gtroff Internals). +

    +

    The read-only register .color is 1 if colors are enabled, +0 otherwise. +

    +

    Color can also be disabled with the -c command-line option. +

    + +
    +
    Request: .defcolor ident scheme color-component …
    +
    +

    Define a color named ident. scheme selects a color space +and determines the quantity of required color-components; it must +be one of ‘rgb’ (three components), ‘cmy’ (three), ‘cmyk’ +(four), or ‘gray’ (one). ‘grey’ is accepted as a synonym of +‘gray’. The color components can be encoded as a single +hexadecimal value starting with ‘#’ or ‘##’. The former +indicates that each component is in the range 0–255 (0–FF), the latter +the range 0–65,535 (0–FFFF). +

    +
    +
    .defcolor half gray #7f
    +.defcolor pink rgb #FFC0CB
    +.defcolor magenta rgb  ##ffff0000ffff
    +
    + + + + +

    Alternatively, each color component can be specified as a decimal +fraction in the range 0–1, interpreted using a default scaling +unit of f, which multiplies its value by 65,536 (but +clamps it at 65,535). +

    +
    +
    .defcolor gray50 rgb 0.5 0.5 0.5
    +.defcolor darkgreen rgb 0.1f 0.5f 0.2f
    +
    +
    + + + +

    Each output device has a color named ‘default’, which cannot be +redefined. A device’s default stroke and fill colors are not +necessarily the same. For the dvi, html, pdf, +ps, and xhtml output devices, GNU troff +automatically loads a macro file defining many color names at startup. +By the same mechanism, the devices supported by grotty recognize +the eight standard ISO 6429/EMCA-48 color names.86 +

    +
    +
    Request: .gcolor [color]
    +
    +
    Escape sequence: \mc
    +
    +
    Escape sequence: \m(co
    +
    Escape sequence: \m[color]
    +
    Register: \n[.m]
    +
    +

    Set the stroke color to color. +

    +
    +
    .gcolor red
    +The next words
    +.gcolor
    +\m[red]are in red\m[]
    +and these words are in the previous color.
    +
    + +

    The escape sequence \m[] restores the previous stroke color, as +does a gcolor request without an argument. +

    + + + +

    The name of the current stroke color is available in the read-only +string-valued register ‘.m’; it is associated with the environment +(see Environments). It interpolates nothing when the stroke color +is the default. +

    +

    \m doesn’t produce an input token in GNU troff +(see gtroff Internals). It therefore can be used in requests like +mc (which expects a single character as an argument) to change +the color on the fly: +

    +
    +
    .mc \m[red]x\m[]
    +
    +
    + +
    +
    Request: .fcolor [color]
    +
    +
    Escape sequence: \Mc
    +
    +
    Escape sequence: \M(co
    +
    Escape sequence: \M[color]
    +
    Register: \n[.M]
    +
    +

    Set the fill color for objects drawn with \D'…' escape +sequences. The escape sequence \M[] restores the previous fill +color, as does an fcolor request without an argument. +

    + + + + + + +

    The name of the current fill color is available in the read-only +string-valued register ‘.M’; it is associated with the environment +(see Environments). It interpolates nothing when the fill color +is the default. \M doesn’t produce an input token in GNU +troff. +

    +

    Create an ellipse with a red interior as follows. +

    +
    +
    \M[red]\h'0.5i'\D'E 2i 1i'\M[]
    +
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Columnation.html b/doc/groff.html.node/Columnation.html new file mode 100644 index 0000000..7ac057f --- /dev/null +++ b/doc/groff.html.node/Columnation.html @@ -0,0 +1,53 @@ + + + + + + +Columnation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.10 Columnation

    + +

    Macro packages apart from man and mdoc for man page +formatting offer a facility for setting multiple columns on the page. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Command-Reference.html b/doc/groff.html.node/Command-Reference.html new file mode 100644 index 0000000..bd5cd9e --- /dev/null +++ b/doc/groff.html.node/Command-Reference.html @@ -0,0 +1,60 @@ + + + + + + +Command Reference (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2 Command Reference

    + +

    This section describes all intermediate output commands, both from +AT&T troff as well as the gtroff extensions. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Comment-Command.html b/doc/groff.html.node/Comment-Command.html new file mode 100644 index 0000000..1ef8d94 --- /dev/null +++ b/doc/groff.html.node/Comment-Command.html @@ -0,0 +1,65 @@ + + + + + + +Comment Command (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2.1 Comment Command

    + +
    +
    #anythingend of line
    +

    A comment. Ignore any characters from the ‘#’ character up to the +next newline character. +

    +

    This command is the only possibility for commenting in the intermediate +output. Each comment can be preceded by arbitrary syntactical space; +every command can be terminated by a comment. +

    +
    + +
    + + + + + diff --git a/doc/groff.html.node/Comments.html b/doc/groff.html.node/Comments.html new file mode 100644 index 0000000..46b3523 --- /dev/null +++ b/doc/groff.html.node/Comments.html @@ -0,0 +1,157 @@ + + + + + + +Comments (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.7 Comments

    + + +

    One of the most common forms of escape sequence is the +comment.48 +

    +
    +
    Escape sequence: \"
    +
    +

    Start a comment. Everything up to the next newline is ignored. +

    +

    This may sound simple, but it can be tricky to keep the comments from +interfering with the appearance of the output. + + +If the escape sequence is to the right of some text or a request, that +portion of the line is ignored, but spaces preceding it are processed +normally by GNU troff. This affects only the ds and +as requests and their variants. +

    + + +

    One possibly irritating idiosyncrasy is that tabs should not be used to +vertically align comments in the source document. Tab characters are +not treated as separators between a request name and its first argument, +nor between arguments. +

    + + +

    A comment on a line by itself is treated as a blank line, because after +eliminating the comment, that is all that remains. +

    +
    +
    Test
    +\" comment
    +Test
    +    ⇒ Test
    +    ⇒
    +    ⇒ Test
    +
    + +

    To avoid this, it is common to combine the empty request with the +comment escape sequence as ‘.\"’, causing the input line to be +ignored. +

    + +

    Another commenting scheme sometimes seen is three consecutive single +quotes (''') at the beginning of a line. This works, but GNU +troff emits a warning diagnostic (if enabled) about an undefined +macro (namely ‘''’). +

    + +
    +
    Escape sequence: \#
    +
    +

    Start a comment; everything up to and including the next newline is +ignored. This groff extension was introduced to avoid the +problems described above. +

    +
    +
    Test
    +\# comment
    +Test
    +    ⇒ Test Test
    +
    +
    + +
    +
    Request: .ig [end]
    +
    +

    Ignore input until, in the current conditional block (if +any),49 the macro end is called +at the start of a control line, or the control line ‘..’ is +encountered if end is not specified. ig is parsed as if it +were a macro definition, but its contents are discarded, not +stored.50 +

    +
    +
    hand\c
    +.de TX
    +fasting
    +..
    +.ig TX
    +This is part of a large block of input that has been
    +temporarily(?) commented out.
    +We can restore it simply by removing the .ig request and
    +the call of its end macro.
    +.TX
    +
    +
    +
        ⇒ handfasting
    +
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Common-Features.html b/doc/groff.html.node/Common-Features.html new file mode 100644 index 0000000..074015e --- /dev/null +++ b/doc/groff.html.node/Common-Features.html @@ -0,0 +1,89 @@ + + + + + + +Common Features (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2 Common Features

    + + + +

    GNU troff provides low-level operations for formatting a +document. Many routine operations are undertaken in nearly all +documents that require a series of such primitive operations to be +performed. These common tasks are grouped into macros, which +are then collected into a macro package. +

    +

    Macro packages come in two varieties: “major” or “full-service” +ones that manage page layout, and “minor” or “auxiliary” ones that +do not, instead fulfilling narrow, specific tasks. Find a list in the +groff_tmac(5) man page. Type ‘man groff_tmac’ at the +command line to view it. +

    +

    We survey several capabilities of full-service macro package below. +Each package employs its own macros to exercise them. For details, +consult its man page or, for ms, see ms. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Compatibility-Mode.html b/doc/groff.html.node/Compatibility-Mode.html new file mode 100644 index 0000000..60c376b --- /dev/null +++ b/doc/groff.html.node/Compatibility-Mode.html @@ -0,0 +1,221 @@ + + + + + + +Compatibility Mode (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.38.2 Compatibility Mode

    + + + + + + + +

    Long identifier names may be GNU troff’s most obvious innovation. +AT&T troff interprets ‘.dsabcd’ as defining a +string ‘ab’ with contents ‘cd’. Normally, GNU troff +interprets this as a call of a macro named dsabcd. +AT&T troff also interprets ‘\*[’ and ‘\n[’ as +an interpolation of a string or register, respectively, named ‘[’. +In GNU troff, however, the ‘[’ is normally interpreted as +delimiting a long name. In compatibility mode, GNU troff +interprets names in the traditional way; they thus can be two characters +long at most. +

    +
    +
    Request: .cp [n]
    +
    +
    Register: \n[.C]
    +
    +

    If n is missing or non-zero, turn on compatibility mode; +otherwise, turn it off. +

    +

    The read-only register .C is 1 if compatibility mode is on, +0 otherwise. +

    +

    Compatibility mode can be also turned on with the -C +command-line option. +

    + +
    +
    Request: .do name
    +
    +
    Register: \n[.cp]
    +
    +

    The do request interprets the string, request, diversion, or +macro name (along with any further arguments) with compatibility +mode disabled. Compatibility mode is restored (only if it was active) +when the expansion of name is interpreted; that is, the +restored compatibility state applies to the contents of the macro, +string, or diversion name as well as data read from files or pipes +if name is any of the so, soquiet, mso, +msoquiet, or pso requests. +

    +

    The following example illustrates several aspects of do behavior. +

    +
    +
    .de mac1
    +FOO
    +..
    +.de1 mac2
    +groff
    +.mac1
    +..
    +.de mac3
    +compatibility
    +.mac1
    +..
    +.de ma
    +\\$1
    +..
    +.cp 1
    +.do mac1
    +.do mac2 \" mac2, defined with .de1, calls "mac1"
    +.do mac3 \" mac3 calls "ma" with argument "c1"
    +.do mac3 \[ti] \" groff syntax accepted in .do arguments
    +    ⇒ FOO groff FOO compatibility c1 ~
    +
    + +

    The read-only register .cp, meaningful only when dereferenced +from a do request, is 1 if compatibility mode was on when +the do request was encountered, and 0 if it was not. This +register is specialized and may require a statement of rationale. +

    +

    When writing macro packages or documents that use GNU troff +features and which may be mixed with other packages or documents that do +not—common scenarios include serial processing of man pages or use of +the so or mso requests—you may desire correct operation +regardless of compatibility mode enablement in the surrounding context. +It may occur to you to save the existing value of ‘\n(.C’ into a +register, say, ‘_C’, at the beginning of your file, turn +compatibility mode off with ‘.cp 0’, then restore it from that +register at the end with ‘.cp \n(_C’. At the same time, a modular +design of a document or macro package may lead you to multiple layers of +inclusion. You cannot use the same register name everywhere lest you +“clobber” the value from a preceding or enclosing context. The +two-character register name space of AT&T troff is +confining and mnemonically challenging; you may wish to use the more +capacious name space of GNU troff. However, attempting ‘.nr +_my_saved_C \n(.C’ will not work in compatibility mode; the register +name is too long. “This is exactly what do is for,” you think, +‘.do nr _my_saved_C \n(.C’. The foregoing will always save zero to +your register, because do turns compatibility mode off +while it interprets its argument list. +

    +

    To robustly save compatibility mode before switching it off, use +

    +
    +
    .do nr _my_saved_C \n[.cp]
    +.cp 0
    +
    + +

    at the beginning of your file, followed by +

    +
    +
    .cp \n[_my_saved_C]
    +.do rr _my_saved_C
    +
    + +

    at the end. As in the C language, we all have to share one big +name space, so choose a register name that is unlikely to collide with +other uses. +

    + + + + +

    Normally, GNU troff preserves the interpolation depth in +delimited arguments, but not in compatibility mode. +

    +
    +
    .ds xx '
    +\w'abc\*(xxdef'
    +    ⇒ 168 (normal mode on a terminal device)
    +    ⇒ 72def' (compatibility mode on a terminal device)
    +
    + + + + + +

    Furthermore, the escape sequences \f, \H, \m, +\M, \R, \s, and \S are transparent for the +purpose of recognizing a control character at the beginning of a line +only in compatibility mode. For example, this code produces bold output +in both cases, but the text differs. +

    +
    +
    .de xx
    +Hello!
    +..
    +\fB.xx\fP
    +    ⇒ .xx (normal mode)
    +    ⇒ Hello! (compatibility mode)
    +
    + + +

    Normally, the syntax form \sn accepts only a single +character (a digit) for n, consistently with other forms that +originated in AT&T troff, like \*, \$, +\f, \g, \k, \n, and \z. In +compatibility mode only, a non-zero n must be in the range +4–39. Legacy documents relying upon this quirk of parsing120 should be migrated to another +\s form. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Concept-Index.html b/doc/groff.html.node/Concept-Index.html new file mode 100644 index 0000000..3adcfcb --- /dev/null +++ b/doc/groff.html.node/Concept-Index.html @@ -0,0 +1,2359 @@ + + + + + + +Concept Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix J Concept Index

    + +
    +
    Jump to:   " +   +% +   +& +   +' +   +( +   +) +   +* +   ++ +   +- +   +. +   +/ +   +8 +   +: +   +< +   += +   +> +   +[ +   +\ +   +] +   +| +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +J +   +K +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +W +   +Y +   +Z +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    "
    ", as delimiter: Delimiters
    ", at end of sentence: Sentences
    ", at end of sentence: Using Symbols
    ", embedding in a macro argument: Calling Macros

    %
    %, as delimiter: Delimiters

    &
    &, as delimiter: Delimiters

    '
    ', as a comment: Comments
    ', as delimiter: Delimiters
    ', at end of sentence: Sentences
    ', at end of sentence: Using Symbols

    (
    (, as delimiter: Delimiters

    )
    ), as delimiter: Delimiters
    ), at end of sentence: Sentences
    ), at end of sentence: Using Symbols

    *
    *, as delimiter: Delimiters
    *, at end of sentence: Sentences
    *, at end of sentence: Using Symbols

    +
    +, and page motion: Numeric Expressions
    +, as delimiter: Delimiters

    -
    -, and page motion: Numeric Expressions
    -, as delimiter: Delimiters

    .
    ., as delimiter: Delimiters
    .h register, difference from nl: Diversions
    .ps register, in comparison with .psr: Using Fractional Type Sizes
    .s register, in comparison with .sr: Using Fractional Type Sizes
    .S register, Plan 9 alias for .tabs: Tabs and Fields
    .t register, and diversions: Diversion Traps
    .tabs register, Plan 9 alias (.S): Tabs and Fields
    .V register, and vs: Changing the Vertical Spacing

    /
    /, as delimiter: Delimiters

    8
    8-bit input: Font Description File Format

    :
    :, as delimiter: Delimiters

    <
    <, as delimiter: Delimiters

    =
    =, as delimiter: Delimiters

    >
    >, as delimiter: Delimiters

    [
    [, macro names starting with, and refer: Identifiers

    \
    \!, and copy mode: Diversions
    \!, and output request: Diversions
    \!, and trnt: Character Translations
    \!, as delimiter: Delimiters
    \!, as delimiter: Delimiters
    \!, in top-level diversion: Diversions
    \!, incompatibilities with AT&T troff: Other Differences
    \!, incompatibilities with AT&T troff: Other Differences
    \$, when reading text for a macro: Copy Mode
    \%, and translations: Character Translations
    \%, as delimiter: Delimiters
    \%, as delimiter: Delimiters
    \%, following \X or \Y: Manipulating Hyphenation
    \%, in \X: Postprocessor Access
    \%, incompatibilities with AT&T troff: Other Differences
    \&, and glyph definitions: Using Symbols
    \&, and translations: Character Translations
    \&, as delimiter: Delimiters
    \&, at end of sentence: Sentences
    \&, in \X: Postprocessor Access
    \&, incompatibilities with AT&T troff: Other Differences
    \', and translations: Character Translations
    \', as delimiter: Delimiters
    \', as delimiter: Delimiters
    \', incompatibilities with AT&T troff: Other Differences
    \(, and translations: Character Translations
    \), as delimiter: Delimiters
    \), in \X: Postprocessor Access
    \*, and warnings: Warnings
    \*, incompatibilities with AT&T troff: Compatibility Mode
    \*, when reading text for a macro: Copy Mode
    \, disabling (eo): Using Escape Sequences
    \, embedding in a macro argument: Calling Macros
    \,, as delimiter: Delimiters
    \- glyph, and cflags: Using Symbols
    \-, and translations: Character Translations
    \-, as delimiter: Delimiters
    \-, as delimiter: Delimiters
    \-, incompatibilities with AT&T troff: Other Differences
    \/, as delimiter: Delimiters
    \/, as delimiter: Delimiters
    \0, as delimiter: Delimiters
    \:, as delimiter: Delimiters
    \:, as delimiter: Delimiters
    \:, in \X: Postprocessor Access
    \?, and copy mode: Operators in Conditionals
    \?, and copy mode: Diversions
    \?, as delimiter: Delimiters
    \?, in top-level diversion: Diversions
    \?, incompatibilities with AT&T troff: Other Differences
    \a, and copy mode: Leaders
    \a, and translations: Character Translations
    \a, as delimiter: Delimiters
    \A, delimiters allowed by: Delimiters
    \A, incompatibilities with AT&T troff: Other Differences
    \b, delimiters allowed by: Delimiters
    \b, limitations of: Drawing Geometric Objects
    \C, and translations: Character Translations
    \c, as delimiter: Delimiters
    \c, as delimiter: Delimiters
    \c, incompatibilities with AT&T troff: Other Differences
    \c, when filling disabled: Line Continuation
    \c, when filling enabled: Line Continuation
    \d, as delimiter: Delimiters
    \D, delimiters allowed by: Delimiters
    \e, and glyph definitions: Using Symbols
    \e, and translations: Character Translations
    \e, as delimiter: Delimiters
    \E, as delimiter: Delimiters
    \e, as delimiter: Delimiters
    \e, incompatibilities with AT&T troff: Other Differences
    \F, and changing fonts: Selecting Fonts
    \f, and font translations: Selecting Fonts
    \f, incompatibilities with AT&T troff: Compatibility Mode
    \h, delimiters allowed by: Delimiters
    \H, delimiters allowed by: Delimiters
    \H, incompatibilities with AT&T troff: Compatibility Mode
    \H, using + and - with: Numeric Expressions
    \H, with fractional type sizes: Using Fractional Type Sizes
    \l, and glyph definitions: Using Symbols
    \L, and glyph definitions: Using Symbols
    \l, delimiters allowed by: Delimiters
    \L, delimiters allowed by: Delimiters
    \N, and translations: Character Translations
    \n, and warnings: Warnings
    \N, delimiters allowed by: Delimiters
    \n, incompatibilities with AT&T troff: Compatibility Mode
    \n, when reading text for a macro: Copy Mode
    \o, delimiters allowed by: Delimiters
    \p, as delimiter: Delimiters
    \p, as delimiter: Delimiters
    \R, after \c: Line Continuation
    \R, and warnings: Warnings
    \r, as delimiter: Delimiters
    \R, delimiters allowed by: Delimiters
    \R, difference from nr: Auto-increment
    \R, using + and - with: Numeric Expressions
    \RET, when reading text for a macro: Copy Mode
    \s, delimiters allowed by: Delimiters
    \S, delimiters allowed by: Delimiters
    \s, incompatibilities with AT&T troff: Compatibility Mode
    \S, incompatibilities with AT&T troff: Compatibility Mode
    \s, incompatibilities with AT&T troff: Compatibility Mode
    \s, using + and - with: Numeric Expressions
    \s, with fractional type sizes: Using Fractional Type Sizes
    \SP, as delimiter: Delimiters
    \SP, difference from \~: Calling Macros
    \SP, incompatibilities with AT&T troff: Other Differences
    \t, and copy mode: Tabs and Fields
    \t, and translations: Character Translations
    \t, and warnings: Warnings
    \t, as delimiter: Delimiters
    \u, as delimiter: Delimiters
    \V, and copy mode: I/O
    \v, delimiters allowed by: Delimiters
    \v, internal representation: Gtroff Internals
    \w, delimiters allowed by: Delimiters
    \X, and special characters: Postprocessor Access
    \X, delimiters allowed by: Delimiters
    \x, delimiters allowed by: Delimiters
    \X, followed by \%: Manipulating Hyphenation
    \Y, followed by \%: Manipulating Hyphenation
    \Z, delimiters allowed by: Delimiters
    \[, and translations: Character Translations
    \\, when reading text for a macro: Copy Mode
    \^, as delimiter: Delimiters
    \^, incompatibilities with AT&T troff: Other Differences
    \_, and translations: Character Translations
    \_, as delimiter: Delimiters
    \_, as delimiter: Delimiters
    \_, incompatibilities with AT&T troff: Other Differences
    \`, and translations: Character Translations
    \`, as delimiter: Delimiters
    \`, as delimiter: Delimiters
    \`, incompatibilities with AT&T troff: Other Differences
    \{, as delimiter: Delimiters
    \{, as delimiter: Delimiters
    \{, incompatibilities with AT&T troff: Other Differences
    \|, as delimiter: Delimiters
    \|, incompatibilities with AT&T troff: Other Differences
    \}, and warnings: Warnings
    \}, as delimiter: Delimiters
    \}, as delimiter: Delimiters
    \}, incompatibilities with AT&T troff: Other Differences
    \~, and translations: Character Translations
    \~, as delimiter: Delimiters
    \~, difference from \SP: Calling Macros
    \~, incompatibilities with AT&T troff: Other Differences

    ]
    ], as part of an identifier: Identifiers
    ], at end of sentence: Sentences
    ], at end of sentence: Using Symbols
    ], macro names starting with, and refer: Identifiers

    |
    |, and page motion: Numeric Expressions

    A
    ab request, incompatibilities with AT&T troff: Other Differences
    aborting (ab): Debugging
    absolute (sic) position operator (|): Numeric Expressions
    abstract font style: Using Fonts
    abstract font style, setting up (sty): Font Families
    accent marks [ms]: ms Legacy Features
    access to postprocessor: Postprocessor Access
    accessing unnamed glyphs with \N: Font Description File Format
    activating kerning (kern): Ligatures and Kerning
    activating ligatures (lg): Ligatures and Kerning
    activating track kerning (tkf): Ligatures and Kerning
    ad request, and hyphenation margin: Manipulating Hyphenation
    ad request, and hyphenation space: Manipulating Hyphenation
    addition: Numeric Expressions
    additional inter-sentence space: Manipulating Filling and Adjustment
    adjustment and filling, manipulating: Manipulating Filling and Adjustment
    adjustment mode register (.j): Manipulating Filling and Adjustment
    adjustment to both margins, difference from AT&T troff: Other Differences
    Adobe Glyph List (AGL): Using Symbols
    alias, diversion, creating (als): Strings
    alias, diversion, removing (rm): Strings
    alias, macro, creating (als): Strings
    alias, macro, removing (rm): Strings
    alias, register, creating (aln): Setting Registers
    alias, register, removing (rr): Setting Registers
    alias, string, creating (als): Strings
    alias, string, removing (rm): Strings
    aliasing fonts with third argument to fp request: Font Positions
    als request, and \$0: Parameters
    am, am1, ami requests, and warnings: Warnings
    appending to a diversion (da, boxa): Diversions
    appending to a file (opena): I/O
    appending to a macro (am): Writing Macros
    appending to a string (as): Strings
    approximation output register (.A): Built-in Registers
    arc, drawing (‘\D'a …'’): Drawing Geometric Objects
    argument: Requests and Macros
    arguments to macros: Calling Macros
    arguments to macros, and tabs: Invoking Requests
    arguments to requests: Invoking Requests
    arguments to requests, and tabs: Invoking Requests
    arguments, and compatibility mode: Gtroff Internals
    arguments, to escape sequences, delimiting: Delimiters
    arguments, to strings: Strings
    arithmetic operators: Numeric Expressions
    artificial fonts: Artificial Fonts
    as, as1 requests, and comments: Comments
    as, as1 requests, and warnings: Warnings
    ASCII output encoding: Groff Options
    asciify request, and writem: I/O
    assertion (arithmetic operator): Numeric Expressions
    assign number format to register (af): Assigning Register Formats
    assignments, indirect: Interpolating Registers
    assignments, nested: Interpolating Registers
    AT&T ms, macro package differences: Differences from AT&T ms
    attributes, character cell: Using Fonts
    auto-incrementation of a register: Auto-increment
    automatic font mounting: Selecting Fonts
    automatic hyphenation: Manipulating Hyphenation
    automatic hyphenation parameters: Manipulating Hyphenation
    auxiliary macro package: Major Macro Packages
    available glyphs, list of (groff_char(7) man page): Using Symbols

    B
    background: Background
    background color name register (.M): Colors
    backslash glyph, formatting (\[rs]): Using Escape Sequences
    backslash, embedding in a macro argument: Calling Macros
    backslash, printing (\\, \e, \E, \[rs]): Other Differences
    backspace character, and translations: Character Translations
    backtrace of input stack (backtrace): Debugging
    baseline rule special character(\[ru]): Drawing Geometric Objects
    baseline, text: Page Geometry
    baseline, text: Manipulating Type Size and Vertical Spacing
    basic scaling unit (u): Measurements
    basic units: Page Geometry
    basic units, conversion to: Measurements
    basics of macro package usage: Basics
    bd request, and font styles: Font Families
    bd request, and font translations: Selecting Fonts
    bd request, incompatibilities with AT&T troff: Other Differences
    beginning diversion (di, box): Diversions
    beginning of conditional block (\{): Conditional Blocks
    blank line: Breaking
    blank line macro (blm): Breaking
    blank line macro (blm): Invoking Requests
    blank line macro (blm): Blank Line Traps
    blank line trap (blm): Invoking Requests
    blank line traps: Blank Line Traps
    blank lines, disabling: Manipulating Spacing
    block, conditional, beginning (\{): Conditional Blocks
    block, conditional, end (\}): Conditional Blocks
    blocks, conditional: Conditional Blocks
    body, of a while request: while
    boldface, imitating (bd): Artificial Fonts
    bottom margin: Page Location Traps
    boundary-relative motion operator (|): Numeric Expressions
    bounding box: Miscellaneous
    box (diversion operation): Diversions
    box request, and warnings: Warnings
    box rule glyph (\[br]): Drawing Geometric Objects
    box, boxa requests, and warnings: Warnings
    boxa request, and dn (dl): Diversions
    boxa request, and warnings: Warnings
    boxes [ms]: ms keeps and displays
    bp request, and top-level diversion: Page Control
    bp request, and traps (.pe): Page Location Traps
    bp request, causing implicit break: Manipulating Filling and Adjustment
    bp request, incompatibilities with AT&T troff: Other Differences
    bp request, using + and - with: Numeric Expressions
    br glyph, and cflags: Using Symbols
    brace escape sequence, closing (\}): Conditional Blocks
    brace escape sequence, opening (\}): Conditional Blocks
    brace escape sequences (\{, \}): Conditional Blocks
    break: Breaking
    break: Manipulating Filling and Adjustment
    break (introduction): Basics
    break request, in a while loop: while
    break, page: Page Geometry
    break, page: Page Control
    break, page: The Implicit Page Trap
    break, page (introduction): Basics
    break, page, final: End-of-input Traps
    break, page, prevented by vpt: Vertical Position Traps
    breaking file names (\:): Manipulating Hyphenation
    breaking URLs (\:): Manipulating Hyphenation
    breaking without hyphens (\:): Manipulating Hyphenation
    built-in register, removing: Built-in Registers
    built-in registers: Built-in Registers
    bulleted list, example markup [ms]: Lists in ms

    C
    c scaling unit: Measurements
    calling a macro: Requests and Macros
    calling macros: Calling Macros
    capabilities of groff: groff Capabilities
    case-transforming a string (stringdown, stringup): Strings
    categories, warning: Warnings
    CCSID 1047 output encoding (EBCDIC): Groff Options
    ce request, causing implicit break: Manipulating Filling and Adjustment
    ce request, difference from ‘.ad c: Manipulating Filling and Adjustment
    cell, character, attributes: Using Fonts
    centered text (filled): Manipulating Filling and Adjustment
    centered text (unfilled): Manipulating Filling and Adjustment
    centering lines (ce): Manipulating Filling and Adjustment
    centering lines (introduction): Basics
    centimeter scaling unit (c): Measurements
    cf request, and copy mode: I/O
    cf request, causing implicit break: Manipulating Filling and Adjustment
    changing control characters: Control Characters
    changing font family (fam, \F): Font Families
    changing fonts (ft, \f): Selecting Fonts
    changing format, and read-only registers: Assigning Register Formats
    changing the font height (\H): Artificial Fonts
    changing the font slant (\S): Artificial Fonts
    changing the page number character (pc): Page Layout
    changing trap location (ch): Page Location Traps
    changing type sizes (ps, \s): Changing the Type Size
    changing vertical line spacing (vs): Changing the Vertical Spacing
    char request, and soft hyphen character: Manipulating Hyphenation
    char request, and translations: Character Translations
    char request, used with \N: Using Symbols
    character: Using Symbols
    character cell attributes: Using Fonts
    character class (class): Character Classes
    character classes: Character Classes
    character properties (cflags): Using Symbols
    character translations: Character Translations
    character, backspace, and translations: Character Translations
    character, control (.): Requests and Macros
    character, control, changing (cc): Control Characters
    character, defining (char): Using Symbols
    character, defining fallback (fchar, fschar, schar): Using Symbols
    character, distinguished from glyph: Using Symbols
    character, dummy (\&): Dummy Characters
    character, dummy (\&), as control character suppressor: Requests and Macros
    character, dummy (\&), effect on kerning: Ligatures and Kerning
    character, dummy (\&), effect on \l escape sequence: Drawing Geometric Objects
    character, escape, changing (ec): Using Escape Sequences
    character, escape, while defining glyph: Using Symbols
    character, field delimiting (fc): Fields
    character, field padding (fc): Fields
    character, horizontal tab: Tabs and Leaders
    character, hyphenation (\%): Manipulating Hyphenation
    character, leader: Tabs and Leaders
    character, leader repetition (lc): Leaders
    character, leader, and translations: Character Translations
    character, leader, non-interpreted (\a): Leaders
    character, named (\C): Using Symbols
    character, newline, and translations: Character Translations
    character, no-break control ('): Requests and Macros
    character, no-break control, changing (c2): Control Characters
    character, ordinary: Identifiers
    character, soft hyphen, setting (shc): Manipulating Hyphenation
    character, special: Character Translations
    character, tab repetition (tc): Tabs and Fields
    character, tab, and translations: Character Translations
    character, tab, non-interpreted (\t): Tabs and Fields
    character, transparent: Using Symbols
    character, transparent dummy (\)): Dummy Characters
    characters, end-of-sentence: Using Symbols
    characters, end-of-sentence transparent: Sentences
    characters, hyphenation: Using Symbols
    characters, input, and output glyphs, compatibility with AT&T troff: Other Differences
    characters, invalid for trf request: I/O
    characters, invalid input: Identifiers
    characters, overlapping: Using Symbols
    characters, special: Sentences
    characters, special, list of (groff_char(7) man page): Using Symbols
    characters, unnamed, accessing with \N: Font Description File Format
    circle, filled, drawing (‘\D'C …'’): Drawing Geometric Objects
    circle, outlined, drawing (‘\D'c …'’): Drawing Geometric Objects
    circle, solid, drawing (‘\D'C …'’): Drawing Geometric Objects
    circle, stroked, drawing (‘\D'c …'’): Drawing Geometric Objects
    class of characters (class): Character Classes
    classes, character: Character Classes
    clearing input line trap (it, itc): Input Line Traps
    closing brace escape sequence (\}): Conditional Blocks
    closing file (close): I/O
    code page 1047 output encoding: Groff Options
    code page 1047, input encoding: Input Encodings
    code, hyphenation (hcode): Manipulating Hyphenation
    color name, background, register (.M): Colors
    color name, fill, register (.M): Colors
    color name, stroke, register (.m): Colors
    color, default: Colors
    color, fill: Colors
    color, stroke: Colors
    colors: Colors
    command prefix: Environment
    command-line options: Groff Options
    comments: Comments
    comments in device description files: DESC File Format
    comments in font description files: Font Description File Format
    comments, lining up with tabs: Comments
    comments, with ds: Strings
    common features: Common Features
    common name space of macros, diversions, and strings: Identifiers
    comparison of strings: Operators in Conditionals
    comparison operators: Numeric Expressions
    compatibility mode: Warnings
    compatibility mode: Compatibility Mode
    compatibility mode, and parameters: Gtroff Internals
    complementation, logical: Numeric Expressions
    composite glyph names: Using Symbols
    conditional block, beginning (\{): Conditional Blocks
    conditional block, end (\}): Conditional Blocks
    conditional blocks: Conditional Blocks
    conditional expressions: Operators in Conditionals
    conditional output for terminal (TTY): Operators in Conditionals
    conditional page break (ne): Page Control
    conditionals and loops: Conditionals and Loops
    configuring control characters: Control Characters
    configuring the page length (pl): Page Layout
    consecutive hyphenated lines (hlm): Manipulating Hyphenation
    constant glyph space mode (cs): Artificial Fonts
    contents, table of: Table of Contents
    contents, table of: Leaders
    continuation, input line (\RET): Line Continuation
    continuation, output line (\c): Line Continuation
    continue request, in a while loop: while
    continued output line register (.int): Line Continuation
    continuous underlining (cu): Artificial Fonts
    control character (.): Requests and Macros
    control character, changing (cc): Control Characters
    control character, no-break ('): Requests and Macros
    control character, no-break, changing (c2): Control Characters
    control characters: Control Characters
    control line: Requests and Macros
    control, line: Line Continuation
    control, page: Page Control
    conventions for input: Input Conventions
    conversion to basic units: Measurements
    copy mode: Copy Mode
    copy mode: Copy Mode
    copy mode, and cf request: I/O
    copy mode, and device request: Postprocessor Access
    copy mode, and length request: Strings
    copy mode, and macro parameters: Parameters
    copy mode, and output request: Diversions
    copy mode, and trf request: I/O
    copy mode, and write request: I/O
    copy mode, and writec request: I/O
    copy mode, and writem request: I/O
    copy mode, and \!: Diversions
    copy mode, and \?: Operators in Conditionals
    copy mode, and \?: Diversions
    copy mode, and \a: Leaders
    copy mode, and \t: Tabs and Fields
    copy mode, and \V: I/O
    copying environment (evc): Environments
    correction between oblique and upright glyph (\/, \,): Italic Corrections
    correction between upright and oblique glyph (\/, \,): Italic Corrections
    correction, italic (\/): Italic Corrections
    correction, left italic (\,): Italic Corrections
    cover page in [ms], example markup: ms Document Description Macros
    cp request, and glyph definitions: Using Symbols
    cq glyph, at end of sentence: Sentences
    cq glyph, at end of sentence: Using Symbols
    creating alias for register (aln): Setting Registers
    creating alias, for diversion (als): Strings
    creating alias, for macro (als): Strings
    creating alias, for string (als): Strings
    creating new characters (char): Using Symbols
    credits: Credits
    cs request, and font styles: Font Families
    cs request, and font translations: Selecting Fonts
    cs request, incompatibilities with AT&T troff: Other Differences
    cs request, with fractional type sizes: Using Fractional Type Sizes
    CSTR #54 errata: Built-in Registers
    CSTR #54 errata: Line Layout
    CSTR #54 errata: Page Control
    CSTR #54 errata: Artificial Fonts
    CSTR #54 errata: Changing the Type Size
    CSTR #54 errata: Page Motions
    CSTR #54 erratum, bp request: Page Control
    CSTR #54 erratum, po request: Line Layout
    CSTR #54 erratum, ps request: Changing the Type Size
    CSTR #54 erratum, sb register: Page Motions
    CSTR #54 erratum, st register: Page Motions
    CSTR #54 erratum, yr register: Built-in Registers
    CSTR #54 erratum, \S escape: Artificial Fonts
    CSTR #54 erratum, \s escape sequence: Changing the Type Size
    current directory: Macro Directories
    current input file name register (.F): Built-in Registers
    current page number (%): Page Control
    current time, hours (hours): Built-in Registers
    current time, minutes (minutes): Built-in Registers
    current time, seconds (seconds): Built-in Registers

    D
    da request, and dn (dl): Diversions
    da request, and warnings: Warnings
    da request, and warnings: Warnings
    date, day of the month register (dy): Built-in Registers
    date, day of the week register (dw): Built-in Registers
    date, month of the year register (mo): Built-in Registers
    date, year register (year, yr): Built-in Registers
    day of the month register (dy): Built-in Registers
    day of the week register (dw): Built-in Registers
    dd glyph, at end of sentence: Sentences
    dd glyph, at end of sentence: Using Symbols
    de request, and while: while
    de, de1, dei requests, and warnings: Warnings
    debugging: Debugging
    debugging page location traps: Page Location Traps
    decimal point, as delimiter: Delimiters
    decrementation, automatic, of a register: Auto-increment
    default color: Colors
    default tab stops: Tabs and Fields
    default units: Default Units
    deferred output: Deferring Output
    defining character (char): Using Symbols
    defining character class (class): Character Classes
    defining fallback character (fchar, fschar, schar): Using Symbols
    defining glyph (char): Using Symbols
    defining symbol (char): Using Symbols
    delimited arguments, incompatibilities with AT&T troff: Compatibility Mode
    delimiters, for escape sequence arguments: Delimiters
    delimiting character, for fields (fc): Fields
    delimiting escape sequence arguments: Delimiters
    depth, interpolation: Calling Macros
    depth, of last glyph (.cdp): Environments
    DESC file format: DESC File Format
    DESC file, and font mounting: Font Positions
    DESC file, and use_charnames_in_special keyword: Postprocessor Access
    description file, font: Using Fonts
    device description files, comments: DESC File Format
    device request, and copy mode: Postprocessor Access
    device resolution: Page Geometry
    device resolution: DESC File Format
    device resolution, obtaining in the formatter: Measurements
    devices for output: Output Device Intro
    dg glyph, at end of sentence: Sentences
    dg glyph, at end of sentence: Using Symbols
    di request, and warnings: Warnings
    di request, and warnings: Warnings
    differences in implementation: Implementation Differences
    digit-width space (\0): Page Motions
    digits, as delimiters: Delimiters
    dimensions, line: Line Layout
    directories for fonts: Font Directories
    directories for macros: Macro Directories
    directory, current: Macro Directories
    directory, for tmac files: Macro Directories
    directory, home: Macro Directories
    directory, platform-specific: Macro Directories
    directory, site-local: Macro Directories
    directory, site-local: Font Directories
    disabling hyphenation (\%): Manipulating Hyphenation
    disabling \ (eo): Using Escape Sequences
    discardable horizontal space: Manipulating Filling and Adjustment
    displays: Displays and Keeps
    displays [ms]: ms keeps and displays
    displays, and footnotes [ms]: ms Footnotes
    distance to next vertical position trap register (.t): Page Location Traps
    diversion: Deferring Output
    diversion name register (.z): Diversions
    diversion trap, setting (dt): Diversion Traps
    diversion traps: Diversion Traps
    diversion, appending to (da, boxa): Diversions
    diversion, beginning (di, box): Diversions
    diversion, creating alias for (als): Strings
    diversion, ending (di, box): Diversions
    diversion, nested: Diversions
    diversion, removing (rm): Strings
    diversion, removing alias for (rm): Strings
    diversion, renaming (rn): Strings
    diversion, stripping final newline: Punning Names
    diversion, top-level: Diversions
    diversion, top-level, and bp: Page Control
    diversion, top-level, and \!: Diversions
    diversion, top-level, and \?: Diversions
    diversion, unformatting (asciify): Diversions
    diversion, vertical position in, register (.d): Diversions
    diversions: Diversions
    diversions: Punning Names
    diversions, and traps: Page Location Traps
    diversions, shared name space with macros and strings: Identifiers
    division, truncating: Numeric Expressions
    dl register, and da (boxa): Diversions
    dn register, and da (boxa): Diversions
    document description macros, [ms]: ms Document Description Macros
    document formats: Document Formats
    documents, multi-file: Debugging
    documents, structuring the source of: Invoking Requests
    dot, as delimiter: Delimiters
    double quote, embedding in a macro argument: Calling Macros
    double quotes, trailing, in strings: Strings
    double-spacing (ls): Manipulating Spacing
    double-spacing (vs, pvs): Changing the Vertical Spacing
    down-casing a string (stringdown): Strings
    drawing a filled circle (‘\D'C …'’): Drawing Geometric Objects
    drawing a filled ellipse (‘\D'E …'’): Drawing Geometric Objects
    drawing a filled polygon (‘\D'P …'’): Drawing Geometric Objects
    drawing a line (‘\D'l …'’): Drawing Geometric Objects
    drawing a solid circle (‘\D'C …'’): Drawing Geometric Objects
    drawing a solid ellipse (‘\D'E …'’): Drawing Geometric Objects
    drawing a solid polygon (‘\D'P …'’): Drawing Geometric Objects
    drawing a spline (‘\D'~ …'’): Drawing Geometric Objects
    drawing a stroked circle (‘\D'c …'’): Drawing Geometric Objects
    drawing a stroked ellipse (‘\D'e …'’): Drawing Geometric Objects
    drawing a stroked polygon (‘\D'p …'’): Drawing Geometric Objects
    drawing an arc (‘\D'a …'’): Drawing Geometric Objects
    drawing an outlined circle (‘\D'c …'’): Drawing Geometric Objects
    drawing an outlined ellipse (‘\D'e …'’): Drawing Geometric Objects
    drawing an outlined polygon (‘\D'p …'’): Drawing Geometric Objects
    drawing horizontal lines (\l): Drawing Geometric Objects
    drawing position: Page Geometry
    drawing position, vertical (nl): Page Control
    drawing requests: Drawing Geometric Objects
    drawing vertical lines (\L): Drawing Geometric Objects
    ds request, and comments: Strings
    ds request, and double quotes: Strings
    ds request, and leading spaces: Strings
    ds, ds1 requests, and comments: Comments
    ds, ds1 requests, and warnings: Warnings
    dummy character (\&): Dummy Characters
    dummy character (\&), as control character suppressor: Requests and Macros
    dummy character (\&), effect on kerning: Ligatures and Kerning
    dummy character (\&), effect on \l escape sequence: Drawing Geometric Objects
    dummy character, transparent (\)): Dummy Characters
    dummy environment, used by \w escape sequence: Page Motions
    dumping environments (pev): Debugging
    dumping page location traps (ptr): Debugging
    dumping registers (pnr): Debugging
    dumping symbol table (pm): Debugging

    E
    EBCDIC output encoding: Groff Options
    EBCDIC, input encoding: Input Encodings
    ejection, page: Page Geometry
    ejection, page: Page Control
    ejection, page: The Implicit Page Trap
    ejection, page, of final page: End-of-input Traps
    ejection, page, prevented by vpt: Vertical Position Traps
    el request, and warnings: Warnings
    ellipse, filled, drawing (‘\D'E …'’): Drawing Geometric Objects
    ellipse, outlined, drawing (‘\D'e …'’): Drawing Geometric Objects
    ellipse, solid, drawing (‘\D'E …'’): Drawing Geometric Objects
    ellipse, stroked, drawing (‘\D'e …'’): Drawing Geometric Objects
    em glyph, and cflags: Using Symbols
    em scaling unit (m): Measurements
    embolding of special fonts: Artificial Fonts
    empty line: Breaking
    en scaling unit (n): Measurements
    enabling vertical position traps (vpt): Vertical Position Traps
    encoding, input, code page 1047: Input Encodings
    encoding, input, EBCDIC: Input Encodings
    encoding, input, Latin-1 (ISO 8859-1): Input Encodings
    encoding, input, Latin-2 (ISO 8859-2): Input Encodings
    encoding, input, Latin-5 (ISO 8859-9): Input Encodings
    encoding, input, Latin-9 (ISO 8859-15): Input Encodings
    encoding, output, ASCII: Groff Options
    encoding, output, code page 1047: Groff Options
    encoding, output, EBCDIC: Groff Options
    encoding, output, ISO 646: Groff Options
    encoding, output, Latin-1 (ISO 8859-1): Groff Options
    encoding, output, UTF-8: Groff Options
    end of conditional block (\}): Conditional Blocks
    end-of-input macro (em): End-of-input Traps
    end-of-input trap, setting (em): End-of-input Traps
    end-of-input traps: End-of-input Traps
    end-of-sentence characters: Sentences
    end-of-sentence characters: Using Symbols
    end-of-sentence transparent characters: Sentences
    ending diversion (di, box): Diversions
    endnotes: Footnotes and Endnotes
    environment: Deferring Output
    environment availability and naming, incompatibilities with: Other Differences
    environment number/name register (.ev): Environments
    environment variables: Environment
    environment, copying (evc): Environments
    environment, dimensions of last glyph (.w, .cht, .cdp, .csk): Environments
    environment, dummy, used by \w escape sequence: Page Motions
    environment, previous line length (.n): Environments
    environment, switching (ev): Environments
    environments: Environments
    environments, dumping (pev): Debugging
    equality operator: Numeric Expressions
    equation example [ms]: ms Insertions
    equations [ms]: ms Insertions
    escape character, changing (ec): Using Escape Sequences
    escape character, formatting (\e): Using Escape Sequences
    escape character, while defining glyph: Using Symbols
    escape sequence: Formatter Instructions
    escape sequence argument delimiters: Delimiters
    escape sequences: Using Escape Sequences
    escape sequences, brace (\{, \}): Conditional Blocks
    escaping newline characters, in strings: Strings
    ex request, use in debugging: Debugging
    ex request, used with nx and rd: I/O
    example markup, bulleted list [ms]: Lists in ms
    example markup, cover page in [ms]: ms Document Description Macros
    example markup, glossary-style list [ms]: Lists in ms
    example markup, numbered list [ms]: Lists in ms
    examples of invocation: Invocation Examples
    exiting (ex): Debugging
    expansion of strings (\*): Strings
    explicit hyphen (\%): Manipulating Hyphenation
    explicit hyphenation: Manipulating Hyphenation
    expression, limitation of logical not in: Numeric Expressions
    expression, order of evaluation: Numeric Expressions
    expressions, and register format: Assigning Register Formats
    expressions, and space characters: Numeric Expressions
    expressions, conditional: Operators in Conditionals
    expressions, numeric: Numeric Expressions
    extra post-vertical line space (\x): Changing the Vertical Spacing
    extra post-vertical line space register (.a): Manipulating Spacing
    extra pre-vertical line space (\x): Changing the Vertical Spacing
    extra spaces between words: Adjustment
    extreme values representable with Roman numerals: Assigning Register Formats
    extremum operators (>?, <?): Numeric Expressions

    F
    f scaling unit: Colors
    factor, zoom, of a font (fzoom): Selecting Fonts
    fallback character, defining (fchar, fschar, schar): Using Symbols
    fallback glyph, removing definition (rchar, rfschar): Using Symbols
    fam request, and changing fonts: Selecting Fonts
    families, font: Font Families
    family, font: Using Fonts
    features, common: Common Features
    fi request, causing implicit break: Manipulating Filling and Adjustment
    field delimiting character (fc): Fields
    field padding character (fc): Fields
    fields: Fields
    fields, and tabs: Tabs and Fields
    figure space (\0): Page Motions
    figures [ms]: ms Insertions
    file formats: File Formats
    file names, breaking (\:): Manipulating Hyphenation
    file, appending to (opena): I/O
    file, closing (close): I/O
    file, font description: Using Fonts
    file, inclusion (so): I/O
    file, macro, search path: Macro Directories
    file, opening (open): I/O
    file, processing next (nx): I/O
    file, writing to (write, writec): I/O
    files, font: Device and Font Description Files
    fill color: Colors
    fill color name register (.M): Colors
    fill mode (fi), enabling: Manipulating Filling and Adjustment
    fill mode, and \c: Line Continuation
    fill mode, disabling: Manipulating Filling and Adjustment
    filled circle, drawing (‘\D'C …'’): Drawing Geometric Objects
    filled ellipse, drawing (‘\D'E …'’): Drawing Geometric Objects
    filled polygon, drawing (‘\D'P …'’): Drawing Geometric Objects
    filling: Filling
    filling and adjustment, manipulating: Manipulating Filling and Adjustment
    filling of output, disabling (nf): Manipulating Filling and Adjustment
    filling of output, enabling (fi): Manipulating Filling and Adjustment
    filling, and break warnings: Warnings
    filling, and inter-sentence space: Manipulating Filling and Adjustment
    final newline, stripping in diversions: Punning Names
    fl request, causing implicit break: Manipulating Filling and Adjustment
    floating keep: Displays and Keeps
    flush output (fl): Debugging
    font: Using Fonts
    font aliasing with third argument to fp request: Font Positions
    font description file: Using Fonts
    font description file format: DESC File Format
    font description file, format: Font Description File Format
    font description files, comments: Font Description File Format
    font directories: Font Directories
    font families: Font Families
    font family: Using Fonts
    font family, changing (fam, \F): Font Families
    font file, format: Font Description File Format
    font files: Device and Font Description Files
    font for underlining (uf): Artificial Fonts
    font height, changing (\H): Artificial Fonts
    font metrics: Using Fonts
    font mounting, automatic: Selecting Fonts
    font path: Font Directories
    font position register (.f): Font Positions
    font positions: Font Positions
    font slant, changing (\S): Artificial Fonts
    font style: Using Fonts
    font style, abstract: Using Fonts
    font style, abstract, setting up (sty): Font Families
    font styles: Font Families
    font translation (ftr): Selecting Fonts
    font, magnification (fzoom): Selecting Fonts
    font, mounting (fp): Font Positions
    font, optical size: Selecting Fonts
    font, previous, selecting (\f[], \fP): Selecting Fonts
    font, previous, slecting (ft): Selecting Fonts
    font, selection: Selecting Fonts
    font, special: Using Fonts
    font, text: Using Fonts
    font, unstyled: Using Fonts
    font, zoom factor (fzoom): Selecting Fonts
    fonts, artificial: Artificial Fonts
    fonts, changing (ft, \f): Selecting Fonts
    fonts, searching: Font Directories
    fonts, special: Special Fonts
    footers: Page Layout
    footers: Page Location Traps
    footers [ms]: ms Headers and Footers
    footnote marker [ms]: ms Footnotes
    footnotes: Footnotes and Endnotes
    footnotes [ms]: ms Footnotes
    footnotes, and displays [ms]: ms Footnotes
    footnotes, and keeps [ms]: ms Footnotes
    form letters: I/O
    format of font description file: DESC File Format
    format of font description files: Font Description File Format
    format of font files: Font Description File Format
    format of register (\g): Assigning Register Formats
    format, paper: Paper Format
    formats, file: File Formats
    formatter instructions: Formatter Instructions
    formatting a backslash glyph (\[rs]): Using Escape Sequences
    formatting a title line (tl): Page Layout
    formatting the escape character (\e): Using Escape Sequences
    formatting the time: I/O
    fp request, and font translations: Selecting Fonts
    fp request, incompatibilities with AT&T troff: Other Differences
    fractional point sizes: Using Fractional Type Sizes
    fractional point sizes: Other Differences
    fractional type sizes: Using Fractional Type Sizes
    fractional type sizes: Other Differences
    fractional type sizes in ms macros: Differences from AT&T ms
    French spacing: Sentences
    fspecial request, and font styles: Font Families
    fspecial request, and font translations: Selecting Fonts
    fspecial request, and glyph search order: Using Symbols
    fspecial request, and imitating bold: Artificial Fonts
    ft request, and font translations: Selecting Fonts
    full-service macro package: Major Macro Packages

    G
    geometry, page: Page Geometry
    GGL (groff glyph list): Using Symbols
    GGL (groff glyph list): Character Classes
    glossary-style list, example markup [ms]: Lists in ms
    glyph: Using Symbols
    glyph for line drawing: Drawing Geometric Objects
    glyph names, composite: Using Symbols
    glyph pile (\b): Drawing Geometric Objects
    glyph properties (cflags): Using Symbols
    glyph, box rule (\[br]): Drawing Geometric Objects
    glyph, constant space: Artificial Fonts
    glyph, defining (char): Using Symbols
    glyph, distinguished from character: Using Symbols
    glyph, for line drawing: Drawing Geometric Objects
    glyph, for margins (mc): Miscellaneous
    glyph, last, dimensions (.w, .cht, .cdp, .csk): Environments
    glyph, leader repetition (lc): Leaders
    glyph, numbered (\N): Character Translations
    glyph, numbered (\N): Using Symbols
    glyph, removing definition (rchar, rfschar): Using Symbols
    glyph, soft hyphen (hy): Manipulating Hyphenation
    glyph, tab repetition (tc): Tabs and Fields
    glyph, underscore (\[ru]): Drawing Geometric Objects
    glyphs, available, list of (groff_char(7) man page): Using Symbols
    glyphs, output, and input characters, compatibility with AT&T troff: Other Differences
    glyphs, overstriking (\o): Page Motions
    glyphs, unnamed: Using Symbols
    glyphs, unnamed, accessing with \N: Font Description File Format
    GNU troff, identification register (.g): Built-in Registers
    GNU troff, PID register ($$): Built-in Registers
    GNU troff, process ID register ($$): Built-in Registers
    GNU-specific register (.g): Built-in Registers
    graphic renditions: Using Fonts
    greater than (or equal to) operator: Numeric Expressions
    groff capabilities: groff Capabilities
    groff glyph list (GGL): Using Symbols
    groff glyph list (GGL): Character Classes
    groff invocation: Invoking groff
    groff, and pi request: I/O
    groff—what is it?: What Is groff?
    GROFF_BIN_PATH, environment variable: Environment
    GROFF_COMMAND_PREFIX, environment variable: Environment
    GROFF_ENCODING, environment variable: Environment
    GROFF_FONT_PATH, environment variable: Environment
    GROFF_FONT_PATH, environment variable: Font Directories
    GROFF_TMAC_PATH, environment variable: Environment
    GROFF_TMAC_PATH, environment variable: Macro Directories
    GROFF_TMPDIR, environment variable: Environment
    GROFF_TYPESETTER, environment variable: Environment
    grohtml, the program: Groff Options
    gtroff, interactive use: Debugging
    gtroff, output: gtroff Output
    gtroff, reference: GNU troff Reference

    H
    hair space (\^): Page Motions
    hcode request, and glyph definitions: Using Symbols
    headers: Page Layout
    headers: Page Location Traps
    headers [ms]: ms Headers and Footers
    height, font, changing (\H): Artificial Fonts
    height, of last glyph (.cht): Environments
    high-water mark register (.h): Diversions
    home directory: Macro Directories
    horizontal discardable space: Manipulating Filling and Adjustment
    horizontal input line position register (hp): Page Motions
    horizontal input line position, saving (\k): Page Motions
    horizontal line, drawing (\l): Drawing Geometric Objects
    horizontal motion (\h): Page Motions
    horizontal motion quantum: DESC File Format
    horizontal motion quantum register (.H): Motion Quanta
    horizontal output line position register (.k): Page Motions
    horizontal resolution: DESC File Format
    horizontal resolution register (.H): Motion Quanta
    horizontal space (\h): Page Motions
    horizontal space, unformatting: Punning Names
    horizontal tab character: Tabs and Leaders
    hours, current time (hours): Built-in Registers
    hpf request, and hyphenation language: Manipulating Hyphenation
    hw request, and hy restrictions: Manipulating Hyphenation
    hw request, and hyphenation language: Manipulating Hyphenation
    hy glyph, and cflags: Using Symbols
    hyphen, explicit (\%): Manipulating Hyphenation
    hyphenated lines, consecutive (hlm): Manipulating Hyphenation
    hyphenating characters: Using Symbols
    hyphenation: Hyphenation
    hyphenation character (\%): Manipulating Hyphenation
    hyphenation code (hcode): Manipulating Hyphenation
    hyphenation consecutive line count register (.hlc): Manipulating Hyphenation
    hyphenation consecutive line limit register (.hlm): Manipulating Hyphenation
    hyphenation exceptions: Manipulating Hyphenation
    hyphenation language register (.hla): Manipulating Hyphenation
    hyphenation margin (hym): Manipulating Hyphenation
    hyphenation margin register (.hym): Manipulating Hyphenation
    hyphenation mode register (.hy): Manipulating Hyphenation
    hyphenation parameters, automatic: Manipulating Hyphenation
    hyphenation pattern files: Manipulating Hyphenation
    hyphenation patterns (hpf): Manipulating Hyphenation
    hyphenation space (hys): Manipulating Hyphenation
    hyphenation space adjustment threshold: Manipulating Hyphenation
    hyphenation space adjustment threshold register (.hys): Manipulating Hyphenation
    hyphenation, automatic: Manipulating Hyphenation
    hyphenation, disabling (\%): Manipulating Hyphenation
    hyphenation, explicit: Manipulating Hyphenation
    hyphenation, incompatibilities with AT&T troff: Other Differences
    hyphenation, manipulating: Manipulating Hyphenation
    hyphenation, manual: Manipulating Hyphenation

    I
    i scaling unit: Measurements
    i/o: I/O
    IBM code page 1047 input encoding: Input Encodings
    IBM code page 1047 output encoding: Groff Options
    identifiers: Identifiers
    identifiers, undefined: Identifiers
    ie request, and font translations: Selecting Fonts
    ie request, and warnings: Warnings
    ie request, operators to use with: Operators in Conditionals
    if request, and font translations: Selecting Fonts
    if request, and the ‘!’ operator: Numeric Expressions
    if request, operators to use with: Operators in Conditionals
    if-else: if-else
    if-then: if-then
    imitating boldface (bd): Artificial Fonts
    implementation differences: Implementation Differences
    implicit line break: Breaking
    implicit trap: The Implicit Page Trap
    in request, causing implicit break: Manipulating Filling and Adjustment
    in request, using + and - with: Numeric Expressions
    inch scaling unit (i): Measurements
    including a file (so): I/O
    incompatibilities with AT&T troff: Implementation Differences
    increment value without changing the register: Auto-increment
    incrementation, automatic, of a register: Auto-increment
    indentation (in): Line Layout
    indentation, of roff source code: Invoking Requests
    index, in macro package: Indexing
    indicator, scaling: Measurements
    indirect assignments: Interpolating Registers
    input and output requests: I/O
    input characters and output glyphs, compatibility with AT&T troff: Other Differences
    input characters, invalid: Identifiers
    input conventions: Input Conventions
    input encoding, code page 1047: Input Encodings
    input encoding, EBCDIC: Input Encodings
    input encoding, Latin-1 (ISO 8859-1): Input Encodings
    input encoding, Latin-2 (ISO 8859-2): Input Encodings
    input encoding, Latin-5 (ISO 8859-9): Input Encodings
    input encoding, Latin-9 (ISO 8859-15): Input Encodings
    input file name, current, register (.F): Built-in Registers
    input level: Calling Macros
    input level in delimited arguments: Compatibility Mode
    input line continuation (\RET): Line Continuation
    input line number register (.c, c.): Built-in Registers
    input line number, setting (lf): Debugging
    input line position, horizontal, saving (\k): Page Motions
    input line trap, clearing (it, itc): Input Line Traps
    input line trap, setting (it, itc): Input Line Traps
    input line traps: Input Line Traps
    input line traps and interrupted lines (itc): Input Line Traps
    input line, horizontal position, register (hp): Page Motions
    input line, productive: Manipulating Filling and Adjustment
    input stack, backtrace (backtrace): Debugging
    input stack, setting limit: Debugging
    input token: Gtroff Internals
    input, 8-bit: Font Description File Format
    input, standard, reading from (rd): I/O
    inserting horizontal space (\h): Page Motions
    installation: Installation
    instructing the formatter: Formatter Instructions
    inter-sentence space size register (.sss): Manipulating Filling and Adjustment
    inter-sentence space, additional: Manipulating Filling and Adjustment
    inter-word spacing, minimal: Manipulating Filling and Adjustment
    interactive use of gtroff: Debugging
    intercepting requests: Control Characters
    intermediate output: gtroff Output
    interpolating registers (\n): Interpolating Registers
    interpolation: Requests and Macros
    interpolation depth: Calling Macros
    interpolation depth in delimited arguments: Compatibility Mode
    interpolation of strings (\*): Strings
    interpretation mode: Copy Mode
    interrupted line: Line Continuation
    interrupted line register (.int): Line Continuation
    interrupted lines and input line traps (itc): Input Line Traps
    introduction: Introduction
    invalid characters for trf request: I/O
    invalid input characters: Identifiers
    invocation examples: Invocation Examples
    invoking groff: Invoking groff
    invoking requests: Invoking Requests
    ISO 646 output encoding: Groff Options
    ISO 8859-1 (Latin-1) output encoding: Groff Options
    ISO 8859-1 (Latin-1), input encoding: Input Encodings
    ISO 8859-15 (Latin-9), input encoding: Input Encodings
    ISO 8859-2 (Latin-2), input encoding: Input Encodings
    ISO 8859-9 (Latin-5), input encoding: Input Encodings
    italic correction (\/): Italic Corrections

    J
    justifying text: Manipulating Filling and Adjustment
    justifying text (rj): Manipulating Filling and Adjustment

    K
    keep, floating: Displays and Keeps
    keeps (introduction): Displays and Keeps
    keeps [ms]: ms keeps and displays
    keeps, and footnotes [ms]: ms Footnotes
    kerning and ligatures: Ligatures and Kerning
    kerning enabled register (.kern): Ligatures and Kerning
    kerning, activating (kern): Ligatures and Kerning
    kerning, track: Ligatures and Kerning

    L
    landscape page orientation: Paper Format
    language [ms]: ms language and localization
    last glyph, dimensions (.w, .cht, .cdp, .csk): Environments
    last-requested point size registers (.psr, .sr): Using Fractional Type Sizes
    last-requested type size registers (.psr, .sr): Using Fractional Type Sizes
    Latin-1 (ISO 8859-1) output encoding: Groff Options
    Latin-1 (ISO 8859-1), input encoding: Input Encodings
    Latin-2 (ISO 8859-2), input encoding: Input Encodings
    Latin-5 (ISO 8859-9), input encoding: Input Encodings
    Latin-9 (ISO 8859-15), input encoding: Input Encodings
    layout, line: Line Layout
    layout, page: Page Layout
    lc request, and glyph definitions: Using Symbols
    leader character: Tabs and Leaders
    leader character: Leaders
    leader character, and translations: Character Translations
    leader character, non-interpreted (\a): Leaders
    leader repetition character (lc): Leaders
    leaders: Leaders
    leading: Manipulating Type Size and Vertical Spacing
    leading space macro (lsm): Breaking
    leading space traps: Leading Space Traps
    leading spaces: Breaking
    leading spaces macro (lsm): Leading Space Traps
    leading spaces with ds: Strings
    left italic correction (\,): Italic Corrections
    left margin (po): Line Layout
    length of a string (length): Strings
    length of line (ll): Line Layout
    length of previous line (.n): Environments
    length of the page, configuring (pl): Page Layout
    length of title line, configuring (lt): Page Layout
    length request, and copy mode: Strings
    less than (or equal to) operator: Numeric Expressions
    letters, form: I/O
    level, input: Calling Macros
    level, suppression nesting, register: Suppressing Output
    lf request, incompatibilities with AT&T troff: Other Differences
    ligature: Using Symbols
    ligatures and kerning: Ligatures and Kerning
    ligatures enabled register (.lg): Ligatures and Kerning
    ligatures, activating (lg): Ligatures and Kerning
    limitations of \b escape sequence: Drawing Geometric Objects
    line break: Manipulating Filling and Adjustment
    line break (introduction): Basics
    line break, output: Breaking
    line control: Line Continuation
    line dimensions: Line Layout
    line drawing glyph: Drawing Geometric Objects
    line drawing glyph: Drawing Geometric Objects
    line indentation (in): Line Layout
    line layout: Line Layout
    line length (ll): Line Layout
    line length register (.l): Line Layout
    line length, previous (.n): Environments
    line number, input, register (.c, c.): Built-in Registers
    line number, output, register (ln): Miscellaneous
    line numbers, printing (nm): Miscellaneous
    line space, extra post-vertical (\x): Changing the Vertical Spacing
    line space, extra pre-vertical (\x): Changing the Vertical Spacing
    line spacing register (.L): Manipulating Spacing
    line spacing, post-vertical (pvs): Changing the Vertical Spacing
    line thickness (‘\D't …'’): Drawing Geometric Objects
    line, blank: Breaking
    line, drawing (‘\D'l …'’): Drawing Geometric Objects
    line, horizontal, drawing (\l): Drawing Geometric Objects
    line, input, continuation (\RET): Line Continuation
    line, input, horizontal position, register (hp): Page Motions
    line, input, horizontal position, saving (\k): Page Motions
    line, interrupted: Line Continuation
    line, output, continuation (\c): Line Continuation
    line, output, horizontal position, register (.k): Page Motions
    line, productive input: Manipulating Filling and Adjustment
    line, vertical, drawing (\L): Drawing Geometric Objects
    line-tabs mode: Tabs and Fields
    lines, blank, disabling: Manipulating Spacing
    lines, centering (ce): Manipulating Filling and Adjustment
    lines, centering (introduction): Basics
    lines, consecutive hyphenated (hlm): Manipulating Hyphenation
    lines, interrupted, and input line traps (itc): Input Line Traps
    lines, right-aligning (introduction): Basics
    lines, right-justifying (introduction): Basics
    list of special characters (groff_char(7) man page): Using Symbols
    listing page location traps (ptr): Debugging
    lists: Paragraphs
    ll request, using + and - with: Numeric Expressions
    localization: Manipulating Hyphenation
    localization [ms]: ms language and localization
    locating macro files: Macro Directories
    locating macro packages: Macro Directories
    location, vertical, page, marking (mk): Page Motions
    location, vertical, page, returning to marked (rt): Page Motions
    logical “and” operator: Numeric Expressions
    logical “or” operator: Numeric Expressions
    logical complementation operator: Numeric Expressions
    logical conjunction operator: Numeric Expressions
    logical disjunction operator: Numeric Expressions
    logical not, limitation in expression: Numeric Expressions
    logical operators: Numeric Expressions
    long names: Compatibility Mode
    loops and conditionals: Conditionals and Loops
    lowercasing a string (stringdown): Strings
    ls request, alternative to (pvs): Changing the Vertical Spacing
    lt request, using + and - with: Numeric Expressions

    M
    m scaling unit: Measurements
    M scaling unit: Measurements
    machine units: Page Geometry
    macro: Requests and Macros
    macro arguments: Calling Macros
    macro arguments, and compatibility mode: Gtroff Internals
    macro arguments, and tabs: Invoking Requests
    macro directories: Macro Directories
    macro file search path: Macro Directories
    macro name register (\$0): Parameters
    macro names, starting with [ or ], and refer: Identifiers
    macro package: Macro Packages
    macro package search path: Macro Directories
    macro package usage, basics of: Basics
    macro package, auxiliary: Major Macro Packages
    macro package, full-service: Major Macro Packages
    macro package, introduction: Macro Package Intro
    macro package, major: Major Macro Packages
    macro package, minor: Major Macro Packages
    macro package, structuring the source of: Invoking Requests
    macro, appending to (am): Writing Macros
    macro, creating alias for (als): Strings
    macro, end-of-input (em): End-of-input Traps
    macro, parameters (\$): Parameters
    macro, removing (rm): Strings
    macro, removing alias for (rm): Strings
    macro, renaming (rn): Strings
    macros, recursive: while
    macros, searching: Macro Directories
    macros, shared name space with strings and diversions: Identifiers
    macros, tutorial for users: Tutorial for Macro Users
    macros, writing: Writing Macros
    magnification of a font (fzoom): Selecting Fonts
    major macro package: Major Macro Packages
    major version number register (.x): Built-in Registers
    man macros, custom headers and footers: Optional man extensions
    man macros, Ultrix-specific: Optional man extensions
    man pages: man
    manipulating filling and adjustment: Manipulating Filling and Adjustment
    manipulating hyphenation: Manipulating Hyphenation
    manipulating spacing: Manipulating Spacing
    manipulating type size and vertical spacing: Manipulating Type Size and Vertical Spacing
    manual hyphenation: Manipulating Hyphenation
    manual pages: man
    margin for hyphenation (hym): Manipulating Hyphenation
    margin glyph (mc): Miscellaneous
    margin, bottom: Page Location Traps
    margin, left (po): Line Layout
    margin, right: Line Layout
    margin, top: Page Location Traps
    mark, high-water, register (.h): Diversions
    marker, footnote [ms]: ms Footnotes
    marking vertical page location (mk): Page Motions
    maximum operator: Numeric Expressions
    maximum value representable with Roman numerals: Assigning Register Formats
    mdoc macros: mdoc
    me macro package: me
    measurement units: Measurements
    measurements: Measurements
    measurements, specifying safely: Default Units
    metrics, font: Using Fonts
    minimal inter-word spacing: Manipulating Filling and Adjustment
    minimum operator: Numeric Expressions
    minimum value representable with Roman numerals: Assigning Register Formats
    minor macro package: Major Macro Packages
    minor version number register (.y): Built-in Registers
    minutes, current time (minutes): Built-in Registers
    mm macro package: mm
    mode for constant glyph space (cs): Artificial Fonts
    mode, compatibility: Compatibility Mode
    mode, compatibility, and parameters: Gtroff Internals
    mode, copy: Copy Mode
    mode, copy: Copy Mode
    mode, copy, and cf request: I/O
    mode, copy, and device request: Postprocessor Access
    mode, copy, and length request: Strings
    mode, copy, and macro parameters: Parameters
    mode, copy, and output request: Diversions
    mode, copy, and trf request: I/O
    mode, copy, and write request: I/O
    mode, copy, and writec request: I/O
    mode, copy, and writem request: I/O
    mode, copy, and \!: Diversions
    mode, copy, and \?: Operators in Conditionals
    mode, copy, and \?: Diversions
    mode, copy, and \a: Leaders
    mode, copy, and \t: Tabs and Fields
    mode, copy, and \V: I/O
    mode, fill (fi), enabling: Manipulating Filling and Adjustment
    mode, fill, and break warnings: Warnings
    mode, fill, and inter-sentence space: Manipulating Filling and Adjustment
    mode, fill, and \c: Line Continuation
    mode, fill, disabling: Manipulating Filling and Adjustment
    mode, interpretation: Copy Mode
    mode, line-tabs: Tabs and Fields
    mode, no-fill: Manipulating Filling and Adjustment
    mode, no-fill, and \c: Line Continuation
    mode, no-space (ns): Manipulating Spacing
    mode, nroff: troff and nroff Modes
    mode, safer: Groff Options
    mode, safer: Macro Directories
    mode, safer: Built-in Registers
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: I/O
    mode, safer: Safer Mode
    mode, troff: troff and nroff Modes
    mode, unsafe: Groff Options
    mode, unsafe: Macro Directories
    mode, unsafe: Built-in Registers
    mode, unsafe: I/O
    mode, unsafe: I/O
    mode, unsafe: I/O
    mode, unsafe: I/O
    modifying requests: Control Characters
    modulus: Numeric Expressions
    mom macro package: mom
    month of the year register (mo): Built-in Registers
    motion operators: Numeric Expressions
    motion quanta: Motion Quanta
    motion quantum, horizontal: DESC File Format
    motion quantum, horizontal, register (.H): Motion Quanta
    motion quantum, vertical: DESC File Format
    motion, horizontal (\h): Page Motions
    motion, vertical (\v): Page Motions
    motions, page: Page Motions
    mounting a font (fp): Font Positions
    mounting position: Using Fonts
    mounting position: Using Fonts
    mounting, font, automatic: Selecting Fonts
    ms macros: ms
    ms macros, accent marks: ms Legacy Features
    ms macros, body text: ms Body Text
    ms macros, creating table of contents: ms TOC
    ms macros, displays: ms keeps and displays
    ms macros, document control settings: ms Document Control Settings
    ms macros, document description: ms Document Description Macros
    ms macros, equations: ms Insertions
    ms macros, figures: ms Insertions
    ms macros, footers: ms Headers and Footers
    ms macros, footnotes: ms Footnotes
    ms macros, fractional type sizes in: Differences from AT&T ms
    ms macros, general structure: ms Document Structure
    ms macros, groff differences from AT&T: Differences from AT&T ms
    ms macros, headers: ms Headers and Footers
    ms macros, headings: Headings in ms
    ms macros, keeps: ms keeps and displays
    ms macros, language: ms language and localization
    ms macros, lists: Lists in ms
    ms macros, localization: ms language and localization
    ms macros, margins: ms Margins
    ms macros, multiple columns: ms Multiple Columns
    ms macros, naming conventions: ms Naming Conventions
    ms macros, nested lists: Indented regions in ms
    ms macros, obtaining typographical symbols: Typographical symbols in ms
    ms macros, page layout: ms Page Layout
    ms macros, paragraph handling: Paragraphs in ms
    ms macros, references: ms Insertions
    ms macros, special characters: ms Legacy Features
    ms macros, strings: ms Legacy Features
    ms macros, tables: ms Insertions
    ms macros, text settings: Text settings in ms
    multi-file documents: Debugging
    multi-line strings: Strings
    multi-page table example [ms]: ms Insertions
    multiple columns [ms]: ms Multiple Columns
    multiplication: Numeric Expressions

    N
    n scaling unit: Measurements
    name space, common, of macros, diversions, and strings: Identifiers
    name, background color, register (.M): Colors
    name, fill color, register (.M): Colors
    name, stroke color, register (.m): Colors
    named character (\C): Using Symbols
    names, long: Compatibility Mode
    naming conventions, ms macros: ms Naming Conventions
    ne request, and the .trunc register: Page Location Traps
    ne request, comparison with sv: Page Control
    negating register values: Setting Registers
    negation: Numeric Expressions
    nested assignments: Interpolating Registers
    nested diversions: Diversions
    nested lists [ms]: Indented regions in ms
    nesting level, suppression, register: Suppressing Output
    new page (bp): Page Control
    newline character, and translations: Character Translations
    newline character, in strings, escaping: Strings
    newline, as delimiter: Delimiters
    newline, final, stripping in diversions: Punning Names
    next file, processing (nx): I/O
    next free font position register (.fp): Font Positions
    next page number register (.pn): Page Layout
    next page number, configuring (pn): Page Layout
    nf request, causing implicit break: Manipulating Filling and Adjustment
    nl register, and .d: Diversions
    nl register, difference from .h: Diversions
    nm request, using + and - with: Numeric Expressions
    no-break control character ('): Requests and Macros
    no-break control character, changing (c2): Control Characters
    no-fill mode: Manipulating Filling and Adjustment
    no-fill mode, and \c: Line Continuation
    no-space mode (ns): Manipulating Spacing
    node, output: Gtroff Internals
    non-printing break point (\:): Manipulating Hyphenation
    nr request, and warnings: Warnings
    nr request, using + and - with: Numeric Expressions
    nroff mode: troff and nroff Modes
    number formats, assigning to register (af): Assigning Register Formats
    number of registers register (.R): Built-in Registers
    number, input line, setting (lf): Debugging
    number, page, next, configuring (pn): Page Layout
    numbered glyph (\N): Character Translations
    numbered glyph (\N): Using Symbols
    numbered list, example markup [ms]: Lists in ms
    numbers, line, printing (nm): Miscellaneous
    numeral-width space (\0): Page Motions
    numerals, as delimiters: Delimiters
    numerals, Roman: Assigning Register Formats
    numeric expression, valid: Numeric Expressions
    numeric expressions: Numeric Expressions

    O
    object creation: Writing Macros
    offset, page: Page Geometry
    offset, page (po): Line Layout
    open request, and safer mode: Groff Options
    opena request, and safer mode: Groff Options
    opening brace escape sequence (\}): Conditional Blocks
    opening file (open): I/O
    operator, scaling: Numeric Expressions
    operators, arithmetic: Numeric Expressions
    operators, as delimiters: Delimiters
    operators, comparison: Numeric Expressions
    operators, extremum (>?, <?): Numeric Expressions
    operators, logical: Numeric Expressions
    operators, motion: Numeric Expressions
    operators, unary arithmetic: Numeric Expressions
    optical size of a font: Selecting Fonts
    options: Groff Options
    order of evaluation in expressions: Numeric Expressions
    ordinary character: Identifiers
    orientation, landscape: Paper Format
    orphan: Page Control
    orphan lines, preventing with ne: Page Control
    os request, and no-space mode: Page Control
    outlined circle, drawing (‘\D'c …'’): Drawing Geometric Objects
    outlined ellipse, drawing (‘\D'e …'’): Drawing Geometric Objects
    outlined polygon, drawing (‘\D'p …'’): Drawing Geometric Objects
    output and input requests: I/O
    output comparison operator: Operators in Conditionals
    output device name string (.T): Groff Options
    output device name string (.T): Strings
    output device name string (.T), in other implementations: Other Differences
    output device usage register (.T): Groff Options
    output device usage register (.T), incompatibility with AT&T troff: Other Differences
    output devices: Output Device Intro
    output encoding, ASCII: Groff Options
    output encoding, code page 1047: Groff Options
    output encoding, EBCDIC: Groff Options
    output encoding, ISO 646: Groff Options
    output encoding, Latin-1 (ISO 8859-1): Groff Options
    output encoding, UTF-8: Groff Options
    output glyphs, and input characters, compatibility with AT&T troff: Other Differences
    output line break: Breaking
    output line number register (ln): Miscellaneous
    output line properties: Manipulating Filling and Adjustment
    output line, continuation (\c): Line Continuation
    output line, horizontal position, register (.k): Page Motions
    output node: Gtroff Internals
    output request, and copy mode: Diversions
    output request, and \!: Diversions
    output, filling, disablement of (nf): Manipulating Filling and Adjustment
    output, filling, enablement of (fi): Manipulating Filling and Adjustment
    output, flush (fl): Debugging
    output, gtroff: gtroff Output
    output, intermediate: gtroff Output
    output, suppressing (\O): Suppressing Output
    output, transparent (cf, trf): I/O
    output, transparent (\!, \?): Diversions
    output, transparent, incompatibilities with AT&T troff: Other Differences
    output, troff: gtroff Output
    overlapping characters: Using Symbols
    overstriking glyphs (\o): Page Motions

    P
    p scaling unit: Measurements
    P scaling unit: Measurements
    package, macro: Macro Packages
    package, macro, auxiliary: Major Macro Packages
    package, macro, full-service: Major Macro Packages
    package, macro, introduction: Macro Package Intro
    package, macro, major: Major Macro Packages
    package, macro, minor: Major Macro Packages
    package, macro, search path: Macro Directories
    package, package, structuring the source of: Invoking Requests
    padding character, for fields (fc): Fields
    page: Page Geometry
    page break: Page Geometry
    page break: Page Control
    page break: The Implicit Page Trap
    page break (introduction): Basics
    page break, conditional (ne): Page Control
    page break, final: End-of-input Traps
    page break, prevented by vpt: Vertical Position Traps
    page control: Page Control
    page ejection: Page Geometry
    page ejection: Page Control
    page ejection: The Implicit Page Trap
    page ejection status register (.pe): Page Location Traps
    page ejection, of final page: End-of-input Traps
    page ejection, prevented by vpt: Vertical Position Traps
    page footers: Page Location Traps
    page headers: Page Location Traps
    page layout: Page Layout
    page layout [ms]: ms Page Layout
    page length register (.p): Page Layout
    page length, configuring (pl): Page Layout
    page location traps: Page Location Traps
    page location traps, debugging: Page Location Traps
    page location, vertical, marking (mk): Page Motions
    page location, vertical, returning to marked (rt): Page Motions
    page motions: Page Motions
    page number character (%): Page Layout
    page number character, changing (pc): Page Layout
    page number register (%): Page Control
    page number, configuring next (pn): Page Layout
    page number, next, register (.pn): Page Layout
    page offset: Page Geometry
    page offset (po): Line Layout
    page orientation, landscape: Paper Format
    page, geometry of: Page Geometry
    page, new (bp): Page Control
    paper format: Paper Format
    paper size: Paper Format
    paragraphs: Paragraphs
    parameter count register (.$): Parameters
    parameters: Parameters
    parameters, and compatibility mode: Gtroff Internals
    parameters, macro (\$): Parameters
    parentheses: Numeric Expressions
    partially collected line: Manipulating Filling and Adjustment
    path, for font files: Font Directories
    path, for tmac files: Macro Directories
    pattern files, for hyphenation: Manipulating Hyphenation
    patterns for hyphenation (hpf): Manipulating Hyphenation
    pending output line: Manipulating Filling and Adjustment
    pi request, and groff: I/O
    pi request, and safer mode: Groff Options
    pi request, disabled by default: Safer Mode
    pica scaling unit (P): Measurements
    PID of GNU troff register ($$): Built-in Registers
    pile, glyph (\b): Drawing Geometric Objects
    pl request, using + and - with: Numeric Expressions
    plain text approximation output register (.A): Groff Options
    plain text approximation output register (.A): Built-in Registers
    planting a trap: Traps
    platform-specific directory: Macro Directories
    pm request, incompatibilities with AT&T troff: Other Differences
    pn request, using + and - with: Numeric Expressions
    PNG image generation from PostScript: DESC File Format
    po request, using + and - with: Numeric Expressions
    point scaling unit (p): Measurements
    point size registers (.s, .ps): Changing the Type Size
    point size registers, last-requested (.psr, .sr): Using Fractional Type Sizes
    point sizes, changing (ps, \s): Changing the Type Size
    point sizes, fractional: Using Fractional Type Sizes
    point sizes, fractional: Other Differences
    polygon, filled, drawing (‘\D'P …'’): Drawing Geometric Objects
    polygon, outlined, drawing (‘\D'p …'’): Drawing Geometric Objects
    polygon, solid, drawing (‘\D'P …'’): Drawing Geometric Objects
    polygon, stroked, drawing (‘\D'p …'’): Drawing Geometric Objects
    position of lowest text line (.h): Diversions
    position, absolute (sic) operator (|): Numeric Expressions
    position, drawing: Page Geometry
    position, horizontal input line, saving (\k): Page Motions
    position, horizontal, in input line, register (hp): Page Motions
    position, horizontal, in output line, register (.k): Page Motions
    position, mounting: Using Fonts
    position, vertical, in diversion, register (.d): Diversions
    positions, font: Font Positions
    post-vertical line spacing: Changing the Vertical Spacing
    post-vertical line spacing register (.pvs): Changing the Vertical Spacing
    post-vertical line spacing, changing (pvs): Changing the Vertical Spacing
    postprocessor access: Postprocessor Access
    postprocessors: Output Device Intro
    PostScript, bounding box: Miscellaneous
    PostScript, PNG image generation: DESC File Format
    prefix, for commands: Environment
    preprocessors: Preprocessor Intro
    previous font, selecting (ft): Selecting Fonts
    previous font, selecting (\f[], \fP): Selecting Fonts
    previous line length (.n): Environments
    print current page register (.P): Groff Options
    printing backslash (\\, \e, \E, \[rs]): Other Differences
    printing line numbers (nm): Miscellaneous
    printing to stderr (tm, tm1, tmc): Debugging
    printing, zero-width (\z, \Z): Page Motions
    printing, zero-width (\z, \Z): Page Motions
    process ID of GNU troff register ($$): Built-in Registers
    processing next file (nx): I/O
    productive input line: Manipulating Filling and Adjustment
    properties of characters (cflags): Using Symbols
    properties of glyphs (cflags): Using Symbols
    properties of output lines: Manipulating Filling and Adjustment
    ps request, and constant glyph space mode: Artificial Fonts
    ps request, incompatibilities with AT&T troff: Other Differences
    ps request, using + and - with: Numeric Expressions
    ps request, with fractional type sizes: Using Fractional Type Sizes
    pso request, and safer mode: Groff Options
    pvs request, using + and - with: Numeric Expressions

    Q
    quanta, motion: Motion Quanta
    quantum, horizontal motion: DESC File Format
    quantum, vertical motion: DESC File Format

    R
    radicalex glyph, and cflags: Using Symbols
    ragged-left text: Manipulating Filling and Adjustment
    ragged-right text: Manipulating Filling and Adjustment
    rc request, and glyph definitions: Using Symbols
    read-only register removal, incompatibility with AT&T troff: Other Differences
    read-only register, changing format: Assigning Register Formats
    reading from standard input (rd): I/O
    recursive macros: while
    refer, and macro names starting with [ or ]: Identifiers
    reference, gtroff: GNU troff Reference
    references [ms]: ms Insertions
    register format, in expressions: Assigning Register Formats
    register, assigning number format to (af): Assigning Register Formats
    register, built-in, removing: Built-in Registers
    register, creating alias for (aln): Setting Registers
    register, format (\g): Assigning Register Formats
    register, read-only, removal, incompatibility with AT&T troff: Other Differences
    register, removing (rr): Setting Registers
    register, removing alias for (rr): Setting Registers
    register, renaming (rnn): Setting Registers
    registers: Registers
    registers, built-in: Built-in Registers
    registers, dumping (pnr): Debugging
    registers, interpolating (\n): Interpolating Registers
    registers, number of, register (.R): Built-in Registers
    registers, setting (nr, \R): Setting Registers
    removal of read-only registers, incompatibility with AT&T troff: Other Differences
    removing a built-in register: Built-in Registers
    removing a register (rr): Setting Registers
    removing alias for register (rr): Setting Registers
    removing alias, for diversion (rm): Strings
    removing alias, for macro (rm): Strings
    removing alias, for string (rm): Strings
    removing diversion (rm): Strings
    removing glyph definition (rchar, rfschar): Using Symbols
    removing macro (rm): Strings
    removing request (rm): Strings
    removing string (rm): Strings
    renaming a register (rnn): Setting Registers
    renaming diversion (rn): Strings
    renaming macro (rn): Strings
    renaming request (rn): Strings
    renaming string (rn): Strings
    renditions, graphic: Using Fonts
    request: Requests and Macros
    request: Formatter Instructions
    request arguments: Invoking Requests
    request arguments, and compatibility mode: Gtroff Internals
    request arguments, and tabs: Invoking Requests
    request, removing (rm): Strings
    request, renaming (rn): Strings
    request, undefined: Comments
    requests for drawing: Drawing Geometric Objects
    requests for input and output: I/O
    requests, intercepting: Control Characters
    requests, invoking: Invoking Requests
    requests, modifying: Control Characters
    resolution, device: Page Geometry
    resolution, device: DESC File Format
    resolution, device, obtaining in the formatter: Measurements
    resolution, horizontal: DESC File Format
    resolution, horizontal, register (.H): Motion Quanta
    resolution, vertical: DESC File Format
    returning to marked vertical page location (rt): Page Motions
    revision number register (.Y): Built-in Registers
    right margin: Line Layout
    right-aligning lines (introduction): Basics
    right-justifying (rj): Manipulating Filling and Adjustment
    right-justifying lines (introduction): Basics
    rivers: Other Differences
    rj request, causing implicit break: Manipulating Filling and Adjustment
    rn glyph, and cflags: Using Symbols
    roman glyph, correction after italic glyph (\/): Italic Corrections
    roman glyph, correction before italic glyph (\,): Italic Corrections
    Roman numerals: Assigning Register Formats
    Roman numerals, extrema (maximum and minimum): Assigning Register Formats
    rq glyph, at end of sentence: Sentences
    rq glyph, at end of sentence: Using Symbols
    rt request, using + and - with: Numeric Expressions
    ru glyph, and cflags: Using Symbols
    running system commands: I/O

    S
    s scaling unit: Using Fractional Type Sizes
    safer mode: Groff Options
    safer mode: Macro Directories
    safer mode: Built-in Registers
    safer mode: I/O
    safer mode: I/O
    safer mode: I/O
    safer mode: I/O
    safer mode: Safer Mode
    saving horizontal input line position (\k): Page Motions
    scaling indicator: Measurements
    scaling operator: Numeric Expressions
    scaling unit c: Measurements
    scaling unit f: Colors
    scaling unit i: Measurements
    scaling unit m: Measurements
    scaling unit M: Measurements
    scaling unit n: Measurements
    scaling unit p: Measurements
    scaling unit P: Measurements
    scaling unit s: Using Fractional Type Sizes
    scaling unit u: Measurements
    scaling unit v: Measurements
    scaling unit z: Using Fractional Type Sizes
    searching fonts: Font Directories
    searching macros: Macro Directories
    seconds, current time (seconds): Built-in Registers
    selecting the previous font (ft): Selecting Fonts
    sentence space: Sentences
    sentence space size register (.sss): Manipulating Filling and Adjustment
    sentences: Sentences
    sequence, escape: Formatter Instructions
    setting diversion trap (dt): Diversion Traps
    setting end-of-input trap (em): End-of-input Traps
    setting input line number (lf): Debugging
    setting input line trap (it, itc): Input Line Traps
    setting registers (nr, \R): Setting Registers
    setting the page length (pl): Page Layout
    setting up an abstract font style (sty): Font Families
    shc request, and translations: Character Translations
    site-local directory: Macro Directories
    site-local directory: Font Directories
    size of sentence space register (.sss): Manipulating Filling and Adjustment
    size of word space register (.ss): Manipulating Filling and Adjustment
    size, optical, of a font: Selecting Fonts
    size, paper: Paper Format
    size, size: Manipulating Type Size and Vertical Spacing
    sizes, fractional: Other Differences
    sizes, fractional type: Using Fractional Type Sizes
    skew, of last glyph (.csk): Environments
    slant, font, changing (\S): Artificial Fonts
    soft hyphen character, setting (shc): Manipulating Hyphenation
    soft hyphen glyph (hy): Manipulating Hyphenation
    solid circle, drawing (‘\D'C …'’): Drawing Geometric Objects
    solid ellipse, drawing (‘\D'E …'’): Drawing Geometric Objects
    solid polygon, drawing (‘\D'P …'’): Drawing Geometric Objects
    SOURCE_DATE_EPOCH, environment variable: Environment
    sp request, and no-space mode: Manipulating Spacing
    sp request, causing implicit break: Manipulating Filling and Adjustment
    space between sentences: Sentences
    space between sentences register (.sss): Manipulating Filling and Adjustment
    space between words register (.ss): Manipulating Filling and Adjustment
    space character, as delimiter: Delimiters
    space characters, in expressions: Numeric Expressions
    space, between sentences: Manipulating Filling and Adjustment
    space, between words: Manipulating Filling and Adjustment
    space, discardable, horizontal: Manipulating Filling and Adjustment
    space, hair (\^): Page Motions
    space, horizontal (\h): Page Motions
    space, horizontal, unformatting: Punning Names
    space, thin (\|): Page Motions
    space, unbreakable (\~): Manipulating Filling and Adjustment
    space, unbreakable and unadjustable (\SP): Page Motions
    space, vertical, unit (v): Measurements
    space, width of a digit (numeral) (\0): Page Motions
    spaces with ds: Strings
    spaces, in a macro argument: Calling Macros
    spaces, leading and trailing: Breaking
    spacing (introduction): Basics
    spacing, manipulating: Manipulating Spacing
    spacing, vertical: Page Geometry
    spacing, vertical: Manipulating Type Size and Vertical Spacing
    spacing, vertical (introduction): Basics
    special characters: Sentences
    special characters: Character Translations
    special characters [ms]: ms Legacy Features
    special characters, list of (groff_char(7) man page): Using Symbols
    special font: Using Fonts
    special fonts: Using Symbols
    special fonts: Special Fonts
    special fonts: Font Description File Format
    special fonts, emboldening: Artificial Fonts
    special request, and font translations: Selecting Fonts
    special request, and glyph search order: Using Symbols
    spline, drawing (‘\D'~ …'’): Drawing Geometric Objects
    springing a trap: Traps
    sqrtex glyph, and cflags: Using Symbols
    ss request, incompatibilities with AT&T troff: Other Differences
    stack: Environments
    stacking glyphs (\b): Drawing Geometric Objects
    standard input, reading from (rd): I/O
    stderr, printing to (tm, tm1, tmc): Debugging
    stops, tab: Tabs and Leaders
    string arguments: Strings
    string comparison: Operators in Conditionals
    string expansion (\*): Strings
    string interpolation (\*): Strings
    string, appending (as): Strings
    string, creating alias for (als): Strings
    string, length of (length): Strings
    string, removing (rm): Strings
    string, removing alias for (rm): Strings
    string, renaming (rn): Strings
    strings: Strings
    strings [ms]: ms Legacy Features
    strings, multi-line: Strings
    strings, shared name space with macros and diversions: Identifiers
    stripping final newline in diversions: Punning Names
    stroke color: Colors
    stroke color name register (.m): Colors
    stroked circle, drawing (‘\D'c …'’): Drawing Geometric Objects
    stroked ellipse, drawing (‘\D'e …'’): Drawing Geometric Objects
    stroked polygon, drawing (‘\D'p …'’): Drawing Geometric Objects
    structuring source code of documents or macro packages: Invoking Requests
    sty request, and changing fonts: Selecting Fonts
    sty request, and font translations: Selecting Fonts
    style, font: Using Fonts
    style, font, abstract: Using Fonts
    style, font, abstract, setting up (sty): Font Families
    styles, font: Font Families
    substring (substring): Strings
    subtraction: Numeric Expressions
    suppressing output (\O): Suppressing Output
    suppression nesting level register: Suppressing Output
    sv request, and no-space mode: Page Control
    switching environments (ev): Environments
    sy request, and safer mode: Groff Options
    sy request, disabled by default: Safer Mode
    symbol: Using Symbols
    symbol table, dumping (pm): Debugging
    symbol, defining (char): Using Symbols
    symbols, using: Using Symbols
    system commands, running: I/O
    system() return value register (systat): I/O

    T
    tab character: Tabs and Leaders
    tab character encoding: Tabs and Fields
    tab character, and translations: Character Translations
    tab character, as delimiter: Delimiters
    tab character, non-interpreted (\t): Tabs and Fields
    tab repetition character (tc): Tabs and Fields
    tab stop settings register (.tabs): Tabs and Fields
    tab stops: Tabs and Leaders
    tab stops, default: Tabs and Fields
    tab, line-tabs mode: Tabs and Fields
    table of contents: Table of Contents
    table of contents: Leaders
    table of contents, creating [ms]: ms TOC
    table, multi-page, example [ms]: ms Insertions
    tables [ms]: ms Insertions
    tabs, and fields: Tabs and Fields
    tabs, and macro arguments: Invoking Requests
    tabs, and request arguments: Invoking Requests
    tabs, before comments: Comments
    tagged paragraphs: Paragraphs
    tags, paragraph: Paragraphs
    terminal, conditional output for: Operators in Conditionals
    text baseline: Page Geometry
    text baseline: Manipulating Type Size and Vertical Spacing
    text font: Using Fonts
    text line: Requests and Macros
    text line, position of lowest (.h): Diversions
    text, GNU troff processing: Text
    text, justifying: Manipulating Filling and Adjustment
    text, justifying (rj): Manipulating Filling and Adjustment
    thickness of lines (‘\D't …'’): Drawing Geometric Objects
    thin space (\|): Page Motions
    three-part title (tl): Page Layout
    ti request, causing implicit break: Manipulating Filling and Adjustment
    ti request, using + and - with: Numeric Expressions
    time, current, hours (hours): Built-in Registers
    time, current, minutes (minutes): Built-in Registers
    time, current, seconds (seconds): Built-in Registers
    time, formatting: I/O
    title length, configuring (lt): Page Layout
    title line length register (.lt): Page Layout
    title line, formatting (tl): Page Layout
    titles: Page Layout
    tkf request, and font styles: Font Families
    tkf request, and font translations: Selecting Fonts
    tkf request, with fractional type sizes: Using Fractional Type Sizes
    tl request, and mc: Miscellaneous
    tmac, directory: Macro Directories
    tmac, path: Macro Directories
    TMPDIR, environment variable: Environment
    token, input: Gtroff Internals
    top margin: Page Location Traps
    top-level diversion: Diversions
    top-level diversion, and bp: Page Control
    top-level diversion, and \!: Diversions
    top-level diversion, and \?: Diversions
    tr request, and glyph definitions: Using Symbols
    tr request, and soft hyphen character: Manipulating Hyphenation
    tr request, incompatibilities with AT&T troff: Other Differences
    track kerning: Ligatures and Kerning
    track kerning, activating (tkf): Ligatures and Kerning
    trailing double quotes in strings: Strings
    trailing spaces in string definitions and appendments: Strings
    trailing spaces on text lines: Breaking
    translations of characters: Character Translations
    transparent characters: Using Symbols
    transparent dummy character (\)): Dummy Characters
    transparent output (cf, trf): I/O
    transparent output (\!, \?): Diversions
    transparent output, incompatibilities with AT&T troff: Other Differences
    trap: Deferring Output
    trap, changing location (ch): Page Location Traps
    trap, distance to next vertical position, register (.t): Page Location Traps
    trap, diversion, setting (dt): Diversion Traps
    trap, end-of-input, setting (em): End-of-input Traps
    trap, implicit: The Implicit Page Trap
    trap, input line, clearing (it, itc): Input Line Traps
    trap, input line, setting (it, itc): Input Line Traps
    trap, planting: Traps
    trap, springing: Traps
    traps: Traps
    traps, and diversions: Page Location Traps
    traps, blank line: Blank Line Traps
    traps, diversion: Diversion Traps
    traps, end-of-input: End-of-input Traps
    traps, input line: Input Line Traps
    traps, input line, and interrupted lines (itc): Input Line Traps
    traps, leading space: Leading Space Traps
    traps, page location: Page Location Traps
    traps, page location, dumping (ptr): Debugging
    traps, page location, listing (ptr): Debugging
    traps, sprung by bp request (.pe): Page Location Traps
    traps, vertical position: Vertical Position Traps
    trf request, and copy mode: I/O
    trf request, and invalid characters: I/O
    trf request, causing implicit break: Manipulating Filling and Adjustment
    trin request, and asciify: Diversions
    troff mode: troff and nroff Modes
    troff output: gtroff Output
    truncated vertical space register (.trunc): Page Location Traps
    truncating division: Numeric Expressions
    TTY, conditional output for: Operators in Conditionals
    tutorial for macro users: Tutorial for Macro Users
    type size: Manipulating Type Size and Vertical Spacing
    type size registers (.s, .ps): Changing the Type Size
    type size registers, last-requested (.psr, .sr): Using Fractional Type Sizes
    type sizes, changing (ps, \s): Changing the Type Size
    type sizes, fractional: Using Fractional Type Sizes
    type sizes, fractional: Other Differences
    typeface: Using Fonts
    TZ, environment variable: Environment

    U
    u scaling unit: Measurements
    uf request, and font styles: Font Families
    ul glyph, and cflags: Using Symbols
    ul request, and font translations: Selecting Fonts
    Ultrix-specific man macros: Optional man extensions
    unadjustable and unbreakable space (\SP): Page Motions
    unary arithmetic operators: Numeric Expressions
    unbreakable and unadjustable space (\SP): Page Motions
    unbreakable space (\~): Manipulating Filling and Adjustment
    undefined identifiers: Identifiers
    undefined request: Comments
    underline font (uf): Artificial Fonts
    underlining (ul): Artificial Fonts
    underlining, continuous (cu): Artificial Fonts
    unformatting diversions (asciify): Diversions
    unformatting horizontal space: Punning Names
    Unicode: Identifiers
    Unicode: Using Symbols
    unit, scaling, c: Measurements
    unit, scaling, f: Colors
    unit, scaling, i: Measurements
    unit, scaling, m: Measurements
    unit, scaling, M: Measurements
    unit, scaling, n: Measurements
    unit, scaling, p: Measurements
    unit, scaling, P: Measurements
    unit, scaling, s: Using Fractional Type Sizes
    unit, scaling, u: Measurements
    unit, scaling, v: Measurements
    unit, scaling, z: Using Fractional Type Sizes
    units of measurement: Measurements
    units, basic: Page Geometry
    units, basic, conversion to: Measurements
    units, default: Default Units
    units, machine: Page Geometry
    unnamed glyphs: Using Symbols
    unnamed glyphs, accessing with \N: Font Description File Format
    unsafe mode: Groff Options
    unsafe mode: Macro Directories
    unsafe mode: Built-in Registers
    unsafe mode: I/O
    unsafe mode: I/O
    unsafe mode: I/O
    unsafe mode: I/O
    unstyled font: Using Fonts
    up-casing a string (stringup): Strings
    uppercasing a string (stringup): Strings
    upright glyph, correction after oblique glyph (\/): Italic Corrections
    upright glyph, correction before oblique glyph (\,): Italic Corrections
    URLs, breaking (\:): Manipulating Hyphenation
    user’s macro tutorial: Tutorial for Macro Users
    user’s tutorial for macros: Tutorial for Macro Users
    using escape sequences: Using Escape Sequences
    using symbols: Using Symbols
    UTF-8 output encoding: Groff Options

    V
    v scaling unit: Measurements
    valid numeric expression: Numeric Expressions
    value, incrementing without changing the register: Auto-increment
    variables in environment: Environment
    vee: Page Geometry
    vee scaling unit (v): Measurements
    version number, major, register (.x): Built-in Registers
    version number, minor, register (.y): Built-in Registers
    vertical drawing position (nl): Page Control
    vertical line drawing (\L): Drawing Geometric Objects
    vertical line spacing register (.v): Changing the Vertical Spacing
    vertical line spacing, changing (vs): Changing the Vertical Spacing
    vertical line spacing, effective value: Changing the Vertical Spacing
    vertical motion (\v): Page Motions
    vertical motion quantum: DESC File Format
    vertical page location, marking (mk): Page Motions
    vertical page location, returning to marked (rt): Page Motions
    vertical position in diversion register (.d): Diversions
    vertical position trap enable register (.vpt): Vertical Position Traps
    vertical position traps: Vertical Position Traps
    vertical position traps, enabling (vpt): Vertical Position Traps
    vertical position, drawing (nl): Page Control
    vertical resolution: DESC File Format
    vertical space unit (v): Measurements
    vertical spacing: Page Geometry
    vertical spacing: Manipulating Type Size and Vertical Spacing
    vertical spacing (introduction): Basics

    W
    warning categories: Warnings
    warning level (warn): Debugging
    warnings: Debugging
    warnings: Warnings
    what is groff?: What Is groff?
    while: while
    while request, and font translations: Selecting Fonts
    while request, and the ‘!’ operator: Numeric Expressions
    while request, confusing with br: while
    while request, operators to use with: Operators in Conditionals
    widow: Page Control
    widow: Page Control
    width escape (\w): Page Motions
    width, of last glyph (.w): Environments
    word space size register (.ss): Manipulating Filling and Adjustment
    word, definition of: Filling
    write request, and copy mode: I/O
    writec request, and copy mode: I/O
    writem request, and copy mode: I/O
    writing macros: Writing Macros
    writing to file (write, writec): I/O

    Y
    year, current, register (year, yr): Built-in Registers

    Z
    z scaling unit: Using Fractional Type Sizes
    zero-width printing (\z, \Z): Page Motions
    zero-width printing (\z, \Z): Page Motions
    zoom factor of a font (fzoom): Selecting Fonts

    + +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Conditional-Blocks.html b/doc/groff.html.node/Conditional-Blocks.html new file mode 100644 index 0000000..b2b789b --- /dev/null +++ b/doc/groff.html.node/Conditional-Blocks.html @@ -0,0 +1,174 @@ + + + + + + +Conditional Blocks (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23.4 Conditional Blocks

    + + + +

    It is frequently desirable for a control structure to govern more than +one request, macro call, text line, or a combination of the foregoing. +The opening and closing brace escape sequences \{ and \} +define such groups. These conditional blocks can furthermore be +nested. +

    +
    +
    Escape sequence: \{
    +
    +
    Escape sequence: \}
    +
    + + + + + + + + + + + + + +

    \{ begins a conditional block; it must appear (after optional +spaces and tabs) immediately subsequent to the conditional expression of +an if, ie, or while +request,93 or as the argument to an el +request. +

    +

    \} ends a condition block and should appear on a line with other +occurrences of itself as necessary to match \{ sequences. It +can be preceded by a control character, spaces, and tabs. Input after +any quantity of \} sequences on the same line is processed only +if all of the preceding conditions to which they correspond are true. +Furthermore, a \} closing the body of a while request +must be the last such escape sequence on an input line. +

    +

    Brace escape sequences outside of control structures have no meaning and +produce no output. +

    +

    Caution: Input lines using \{ often end with +\RET, especially in macros that consist primarily of control +lines. Forgetting to use \RET on an input line after \{ +is a common source of error. +

    + +

    We might write the following in a page header macro. If we delete +\RET, the header will carry an unwanted extra empty line (except +on page 1). +

    +
    +
    .if (\\n[%] != 1) \{\
    +.  ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title]
    +.  el                    .tl \\*[odd-numbered-page-title]
    +.\}
    +
    + +

    Let us take a closer look at how conditional blocks nest. +

    +
    +
    A
    +.if 0 \{ B
    +C
    +D
    +\}E
    +F
    +    ⇒ A F
    +
    + +
    +
    N
    +.if 1 \{ O
    +.  if 0 \{ P
    +Q
    +R\} S\} T
    +U
    +    ⇒ N O U
    +
    + +

    The above behavior may challenge the intuition; it was implemented to +retain compatibility with AT&T troff. For clarity, it +is idiomatic to end input lines with \{ (followed by +\RET if appropriate), and to precede \} on an input +line with nothing more than a control character, spaces, tabs, and other +instances of itself. +

    +

    We can use ie, el, and conditional blocks to simulate the +multi-way “switch” or “case” control structures of other languages. +The following example is adapted from the groff man +package. Indentation is used to clarify the logic. +

    +
    +
    .\" Simulate switch/case in roff.
    +.      ie '\\$2'1' .ds title General Commands\"
    +.el \{.ie '\\$2'2' .ds title System Calls\"
    +.el \{.ie '\\$2'3' .ds title Library Functions\"
    +.el \{.ie '\\$2'4' .ds title Kernel Interfaces\"
    +.el \{.ie '\\$2'5' .ds title File Formats\"
    +.el \{.ie '\\$2'6' .ds title Games\"
    +.el \{.ie '\\$2'7' .ds title Miscellaneous Information\"
    +.el \{.ie '\\$2'8' .ds title System Management\"
    +.el \{.ie '\\$2'9' .ds title Kernel Development\"
    +.el                .ds title \" empty
    +.\}\}\}\}\}\}\}\}
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Conditionals-and-Loops.html b/doc/groff.html.node/Conditionals-and-Loops.html new file mode 100644 index 0000000..b05ce5d --- /dev/null +++ b/doc/groff.html.node/Conditionals-and-Loops.html @@ -0,0 +1,64 @@ + + + + + + +Conditionals and Loops (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23 Conditionals and Loops

    + + + +

    groff has if and while control structures like +other languages. However, the syntax for grouping multiple input lines +in the branches or bodies of these structures is unusual. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Configuration-and-Customization.html b/doc/groff.html.node/Configuration-and-Customization.html new file mode 100644 index 0000000..6f76a47 --- /dev/null +++ b/doc/groff.html.node/Configuration-and-Customization.html @@ -0,0 +1,56 @@ + + + + + + +Configuration and Customization (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.14 Configuration and Customization

    + +

    Packages provide means of customizing many of the details of how the +package behaves. These range from setting the default type size to +changing the appearance of section headers. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Control-Characters.html b/doc/groff.html.node/Control-Characters.html new file mode 100644 index 0000000..13ebe41 --- /dev/null +++ b/doc/groff.html.node/Control-Characters.html @@ -0,0 +1,137 @@ + + + + + + +Control Characters (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6.1 Control Characters

    + + + + +

    The mechanism of using roff’s control characters to invoke +requests and call macros was introduced in Requests and Macros. +Control characters are recognized only at the beginning of an input +line, or at the beginning of the branch of a control structure request; +see Conditionals and Loops. +

    +

    A few requests cause a break implicitly; use the no-break control +character to prevent the break. Break suppression is its sole +behavioral distinction. Employing the no-break control character to +invoke requests that don’t cause breaks is harmless but poor style. +See Manipulating Filling and Adjustment. +

    + + + + + +

    The control ‘.’ and no-break control ‘'’ characters can each +be changed to any ordinary character42 +with the cc and c2 requests, respectively. +

    +
    +
    Request: .cc [o]
    +
    +

    Recognize the ordinary character o as the control character. +If o is absent or invalid, the default control character +‘.’ is selected. The identity of the control character is +associated with the environment (see Environments). +

    + +
    +
    Request: .c2 [o]
    +
    +

    Recognize the ordinary character o as the no-break control +character. If o is absent or invalid, the default no-break +control character ‘'’ is selected. The identity of the no-break +control character is associated with the environment +(see Environments). +

    + +

    When writing a macro, you might wish to know which control character was +used to call it. +

    +
    +
    Register: \n[.br]
    +
    +

    This read-only register interpolates 1 if the currently executing +macro was called using the normal control character and 0 +otherwise. If a macro is interpolated as a string, the .br +register’s value is inherited from the context of the string +interpolation. See Strings. +

    + + + + +

    Use this register to reliably intercept requests that imply breaks. +

    +
    +
    .als bp*orig bp
    +.de bp
    +.  ie \\n[.br] .bp*orig
    +.  el          'bp*orig
    +..
    +
    + +

    Testing the .br register outside of a macro definition makes no +sense. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Conventions-Used-in-This-Manual.html b/doc/groff.html.node/Conventions-Used-in-This-Manual.html new file mode 100644 index 0000000..95e85b3 --- /dev/null +++ b/doc/groff.html.node/Conventions-Used-in-This-Manual.html @@ -0,0 +1,124 @@ + + + + + + +Conventions Used in This Manual (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.8 Conventions Used in This Manual

    + +

    We apply the term “groff” to the language documented here, the GNU +implementation of the overall system, the project that develops that +system, and the command of that name. In the first sense, groff +is an extended dialect of the roff language, for which many +similar implementations exist. +

    +

    The roff language features several major categories for which +many items are predefined. Presentations of these items feature the +form in which the item is most commonly used on the left, and, aligned +to the right margin, the name of the category in brackets. +

    +
    +
    Register: \n[example]
    +

    The register ‘example’ is one that that groff doesn’t +predefine. You can create it yourself, though; see Setting Registers. +

    + +

    To make this document useful as a reference and not merely amiable +bedtime reading, we tend to present these syntax items in exhaustive +detail when they arise. References to topics discussed later in the +text are frequent; skip material you don’t understand yet. +

    +

    We use Texinfo’s “result” (⇒) and error→ notations to +present output written to the standard output and standard error +streams, respectively. Diagnostic messages from the GNU troff +formatter and other programs are examples of the latter, but the +formatter can also be directed to write user-specified messages to the +standard error stream. The notation then serves to identify the +output stream and does not necessarily mean that an error has +occurred.2 +

    +
    +
    $ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d'
    +    ⇒ Twelve o'clock and
    +$ echo '.tm all is well.' | groff > /dev/null
    +    error→ all is well.
    +
    + +

    Sometimes we use ⇒ somewhat abstractly to represent formatted +text that you will need to use a PostScript or PDF viewer program (or a +printer) to observe. While arguably an abuse of notation, we think this +preferable to requiring the reader to understand the syntax of these +page description languages. +

    +

    We also present diagnostic messages in an abbreviated form, often +omitting the name of the program issuing them, the input file name, and +line number or other positional information when such data do not serve +to illuminate the topic under discussion. +

    +

    Most examples are of roff language input that would be placed in +a text file. Occasionally, we start an example with a ‘$’ +character to indicate a shell prompt, as seen above. +

    +

    You are encouraged to try the examples yourself, and to alter them to +better learn groff’s behavior. Our examples frequently need to +direct the formatter to set a line length (with ‘.ll’) that will +fit within the page margins of this manual. We mention this so that you +know why it is there before we discuss the ll request +formally.3 +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Copy-Mode.html b/doc/groff.html.node/Copy-Mode.html new file mode 100644 index 0000000..cc7de66 --- /dev/null +++ b/doc/groff.html.node/Copy-Mode.html @@ -0,0 +1,256 @@ + + + + + + +Copy Mode (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.24.2 Copy Mode

    + + + + + + + + + +

    When GNU troff processes certain requests, most importantly those +which define or append to a macro or string, it does so in copy +mode: it copies the characters of the definition into a dedicated +storage region, interpolating the escape sequences \n, \g, +\$, \*, \V, and \? normally; interpreting +\RET immediately; discarding comments \" and +\#; interpolating the current leader, escape, or tab character +with \a, \e, and \t, respectively; and storing all +other escape sequences in an encoded form. +

    + + +

    The complement of copy mode—a roff formatter’s behavior when +not defining or appending to a macro, string, or diversion—where all +macros are interpolated, requests invoked, and valid escape sequences +processed immediately upon recognition, can be termed +interpretation mode. +

    +
    +
    Escape sequence: \\
    +
    +

    The escape character, \ by default, can escape itself. This +enables you to control whether a given \n, \g, \$, +\*, \V, or \? escape sequence is interpreted at the +time the macro containing it is defined, or later when the macro is +called.101 +

    +
    +
    .nr x 20
    +.de y
    +.nr x 10
    +\&\nx
    +\&\\nx
    +..
    +.y
    +    ⇒ 20 10
    +
    + +

    You can think of \\ as a “delayed” backslash; it is the escape +character followed by a backslash from which the escape character has +removed its special meaning. Consequently, ‘\\’ is not an escape +sequence in the usual sense. In any escape sequence ‘\X’ +that GNU troff does not recognize, the escape character is +ignored and X is output. An unrecognized escape sequence causes +a warning in category ‘escape’, with two exceptions—‘\\’ is +the first. +

    + + +
    +
    Escape sequence: \.
    +
    +

    \. escapes the control character. It is similar to \\ in +that it isn’t a true escape sequence. It is used to permit nested macro +definitions to end without a named macro call to conclude them. Without +a syntax for escaping the control character, this would not be possible. +

    +
    +
    .de m1
    +foo
    +.
    +.  de m2
    +bar
    +\\..
    +.
    +..
    +.m1
    +.m2
    +    ⇒ foo bar
    +
    + +

    The first backslash is consumed while the macro is read, and the second +is interpreted when macro m1 is called. +

    + +

    roff documents should not use the \\ or \. +character sequences outside of copy mode; they serve only to obfuscate +the input. Use \e to represent the escape character, +\[rs] to obtain a backslash glyph, and \& before ‘.’ +and ‘'’ where GNU troff expects them as control characters +if you mean to use them literally (recall Requests and Macros). +

    +

    Macro definitions can be nested to arbitrary depth. The mechanics of +parsing the escape character have significant consequences for this +practice. +

    +
    +
    .de M1
    +\\$1
    +.  de M2
    +\\\\$1
    +.    de M3
    +\\\\\\\\$1
    +\\\\..
    +.    M3 hand.
    +\\..
    +.  M2 of
    +..
    +This understeer is getting
    +.M1 out
    +    ⇒ This understeer is getting out of hand.
    +
    + +

    Each escape character is interpreted twice—once in copy mode, when the +macro is defined, and once in interpretation mode, when the macro is +called. As seen above, this fact leads to exponential growth in the +quantity of escape characters required to delay interpolation of +\n, \g, \$, \*, \V, and \? at +each nesting level, which can be daunting. GNU troff offers a +solution. +

    +
    +
    Escape sequence: \E
    +
    +

    \E represents an escape character that is not interpreted in copy +mode. You can use it to ease the writing of nested macro definitions. +

    +
    +
    .de M1
    +.  nop \E$1
    +.  de M2
    +.    nop \E$1
    +.    de M3
    +.      nop \E$1
    +\\\\..
    +.    M3 better.
    +\\..
    +.  M2 bit
    +..
    +This vehicle handles
    +.M1 a
    +    ⇒ This vehicle handles a bit better.
    +
    + +

    Observe that because \. is not a true escape sequence, we can’t +use \E to keep ‘..’ from ending a macro definition +prematurely. If the multiplicity of backslashes complicates +maintenance, use end macros. +

    +

    \E is also convenient to define strings containing escape +sequences that need to work when used in copy mode (for example, as +macro arguments), or which will be interpolated at varying macro nesting +depths. We might define strings to begin and end superscripting +as follows.102 +

    +
    +
    .ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m'
    +.ds } \v'-.7m\s0+.9m'
    +
    + +

    When the ec request is used to redefine the escape character, +\E also makes it easier to distinguish the semantics of an escape +character from the other meaning(s) its character might have. Consider +the use of an unusual escape character, ‘-’. +

    +
    +
    .nr a 1
    +.ec -
    +.de xx
    +--na
    +..
    +.xx
    +    ⇒ -na
    +
    + +

    This result may surprise you; some people expect ‘1’ to be output +since register ‘a’ has clearly been defined with that value. What +has happened? The robotic replacement of ‘\’ with ‘-’ has led +us astray. You might recognize the sequence ‘--’ more readily with +the default escape character as ‘\-’, the special character escape +sequence for the minus sign glyph. +

    +
    +
    .nr a 1
    +.ec -
    +.de xx
    +-Ena
    +..
    +.xx
    +    ⇒ 1
    +
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Copying-This-Manual.html b/doc/groff.html.node/Copying-This-Manual.html new file mode 100644 index 0000000..47c4c3e --- /dev/null +++ b/doc/groff.html.node/Copying-This-Manual.html @@ -0,0 +1,534 @@ + + + + + + +Copying This Manual (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix A Copying This Manual

    + +
    Version 1.3, 3 November 2008 +
    + +
    +
    Copyright © 2000-2018 Free Software Foundation, Inc.
    +http://fsf.org/
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + +
      +
    1. PREAMBLE + +

      The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +

      +

      This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +

      +

      We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +

      +
    2. APPLICABILITY AND DEFINITIONS + +

      This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +

      +

      A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +

      +

      A “Secondary Section” is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document’s overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +

      +

      The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +

      +

      The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +

      +

      A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. +

      +

      Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. +

      +

      The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work’s title, +preceding the beginning of the body of the text. +

      +

      The “publisher” means any person or entity that distributes copies +of the Document to the public. +

      +

      A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. +

      +

      The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +

      +
    3. VERBATIM COPYING + +

      You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +

      +

      You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +

      +
    4. COPYING IN QUANTITY + +

      If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document’s license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +

      +

      If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +

      +

      If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +

      +

      It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +

      +
    5. MODIFICATIONS + +

      You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +

      +
        +
      1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
      2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
      3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
      4. Preserve all the copyright notices of the Document. + +
      5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
      6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
      7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document’s license notice. + +
      8. Include an unaltered copy of this License. + +
      9. Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
      10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
      11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
      12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
      13. Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. + +
      14. Do not retitle any existing section to be Entitled “Endorsements” or +to conflict in title with any Invariant Section. + +
      15. Preserve any Warranty Disclaimers. +
      + +

      If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version’s license notice. +These titles must be distinct from any other section titles. +

      +

      You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties—for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +

      +

      You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +

      +

      The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +

      +
    6. COMBINING DOCUMENTS + +

      You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +

      +

      The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +

      +

      In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all +sections Entitled “Endorsements.” +

      +
    7. COLLECTIONS OF DOCUMENTS + +

      You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. +

      +

      You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +

      +
    8. AGGREGATION WITH INDEPENDENT WORKS + +

      A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation’s users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +

      +

      If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document’s Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +

      +
    9. TRANSLATION + +

      Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +

      +

      If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +

      +
    10. TERMINATION + +

      You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +

      +

      However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +

      +

      Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +

      +

      Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +

      +
    11. FUTURE REVISIONS OF THIS LICENSE + +

      The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +

      +

      Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy’s public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +

      +
    12. RELICENSING + +

      “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the +site means any set of copyrightable works thus published on the MMC +site. +

      +

      “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +

      +

      “Incorporate” means to publish or republish a Document, in whole or +in part, as part of another Document. +

      +

      An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. +

      +

      The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +

      +
    + +

    ADDENDUM: How to use this License for your documents

    + +

    To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: +

    +
    +
      Copyright (C)  year  your name.
    +  Permission is granted to copy, distribute and/or modify this document
    +  under the terms of the GNU Free Documentation License, Version 1.3
    +  or any later version published by the Free Software Foundation;
    +  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
    +  Texts.  A copy of the license is included in the section entitled ``GNU
    +  Free Documentation License''.
    +
    + +

    If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the “with…Texts.” line with this: +

    +
    +
        with the Invariant Sections being list their titles, with
    +    the Front-Cover Texts being list, and with the Back-Cover Texts
    +    being list.
    +
    + +

    If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +

    +

    If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +

    + + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Credits.html b/doc/groff.html.node/Credits.html new file mode 100644 index 0000000..4f46327 --- /dev/null +++ b/doc/groff.html.node/Credits.html @@ -0,0 +1,58 @@ + + + + + + +Credits (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.9 Credits

    + + +

    We adapted portions of this manual from existing documents. James +Clark’s man pages were an essential resource; we have updated them in +parallel with the development of this manual. We based the tutorial for +macro users on Eric Allman’s introduction to his me macro package +(which we also provide, little altered from 4.4BSD). Larry Kollar +contributed much of the material on the ms macro package. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/DESC-File-Format.html b/doc/groff.html.node/DESC-File-Format.html new file mode 100644 index 0000000..11e1b73 --- /dev/null +++ b/doc/groff.html.node/DESC-File-Format.html @@ -0,0 +1,258 @@ + + + + + + +DESC File Format (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.2.1 DESC File Format

    + + + + +

    The DESC file contains a series of directives; each begins a +line. Their order is not important, with two exceptions: (1) the +res directive must precede any papersize directive; and +(2) the charset directive must come last (if at all). If a +directive name is repeated, later entries in the file override previous +ones (except that the paper dimensions are computed based on the +res directive last seen when papersize is encountered). +Spaces and/or tabs separate words and are ignored at line boundaries. + + + +Comments start with the ‘#’ character and extend to the end of a +line. Empty lines are ignored. +

    +
    +
    family fam
    +

    The default font family is fam. +

    +
    +
    fonts n F1 Fn
    +

    Fonts F1, …, Fn are mounted at font positions +m+1, …, m+n where m is the number of +styles (see below). This directive may extend over more than one +line. A font name of 0 causes no font to be mounted at the +corresponding position. +

    +
    +
    hor n
    +
    + + + + +

    The horizontal motion quantum is n basic units. All +horizontal quantities are rounded to multiples of n. +

    +
    +
    image_generator program
    +
    + +

    Use program to generate PNG images from PostScript input. Under +GNU/Linux, this is usually gs, but under other systems (notably +Cygwin) it might be set to another name. The grohtml driver uses +this directive. +

    +
    +
    paperlength n
    +

    The vertical dimension of the output medium is n basic units +(deprecated: use papersize instead). +

    +
    +
    papersize format-or-dimension-pair-or-file-name
    +

    The dimensions of the output medium are as according to the +argument, which is either a standard paper format, a pair of dimensions, +or the name of a plain text file containing either of the foregoing. +

    +

    Recognized paper formats are the ISO and DIN formats +A0A7, B0B7, C0C7, +D0D7; the U.S. paper types letter, +legal, tabloid, ledger, statement, and +executive; and the envelope formats com10, monarch, +and DL. Matching is performed without regard for lettercase. +

    +

    Alternatively, the argument can be a custom paper format in the format +length,width (with no spaces before or after the +comma). Both length and width must have a unit appended; +valid units are ‘i’ for inches, ‘c’ for centimeters, ‘p’ +for points, and ‘P’ for picas. Example: ‘12c,235p’. An +argument that starts with a digit is always treated as a custom paper +format. +

    +

    Finally, the argument can be a file name (e.g., /etc/papersize); +if the file can be opened, the first line is read and a match attempted +against each of the other forms. No comment syntax is supported. +

    +

    More than one argument can be specified; +each is scanned in turn and the first valid paper specification used. +

    +
    +
    paperwidth n
    +

    The horizontal dimension of the output medium is n basic +units (deprecated: use papersize instead). +

    +
    +
    pass_filenames
    +

    Direct GNU troff to emit the name of the source file being +processed. This is achieved with the intermediate output command +‘x F’, which grohtml interprets. +

    +
    +
    postpro program
    +

    Use program as the postprocessor. +

    +
    +
    prepro program
    +

    Use program as a preprocessor. The html and xhtml +output devices use this directive. +

    +
    +
    print program
    +

    Use program as a spooler program for printing. If omitted, the +-l and -L options of groff are ignored. +

    +
    +
    res n
    +
    + +

    The device resolution is n basic units per inch. +

    +
    +
    sizes s1 sn 0
    +

    The device has fonts at s1, …, sn scaled points (see +below). The list of sizes must be terminated by 0. Each +si can also be a range of sizes mn. The list can +extend over more than one line. +

    +
    +
    sizescale n
    +

    A typographical point is subdivided into n scaled points. +The default is 1. See Using Fractional Type Sizes. +

    +
    +
    styles S1 Sm
    +

    The first m mounting positions are associated with styles +S1, …, Sm. +

    +
    +
    tcommand
    +

    The postprocessor can handle the ‘t’ and ‘u’ intermediate +output commands. +

    +
    +
    unicode
    +

    The output device supports the complete Unicode repertoire. This +directive is useful only for devices that produce character entities +instead of glyphs. +

    +

    If unicode is present, no charset section is required in +the font description files since the Unicode handling built into +groff is used. However, if there are entries in a font +description file’s charset section, they either override the +default mappings for those particular characters or add new mappings +(normally for composite characters). +

    +

    The utf8, html, and xhtml output devices use this +directive. +

    +
    +
    unitwidth n
    +

    Quantities in the font description files are in basic units for fonts +whose type size is n scaled points. +

    +
    +
    unscaled_charwidths
    +

    Make the font handling module always return unscaled character widths. +The grohtml driver uses this directive. +

    +
    +
    use_charnames_in_special
    +

    GNU troff should encode special characters inside device control +commands; see Postprocessor Access. The grohtml driver +uses this directive. +

    +
    +
    vert n
    +
    + + + + +

    The vertical motion quantum is n basic units. All vertical +quantities are rounded to multiples of n. +

    +
    +
    charset
    +

    This line and everything following it in the file are ignored. It is +recognized for compatibility with other troff implementations. +In GNU troff, character set repertoire is described on a +per-font basis. +

    +
    + + + + +

    GNU troff recognizes but ignores the directives spare1, +spare2, and biggestfont. +

    +

    The res, unitwidth, fonts, and sizes lines +are mandatory. Directives not listed above are ignored by GNU +troff but may be used by postprocessors to obtain further +information about the device. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Debugging.html b/doc/groff.html.node/Debugging.html new file mode 100644 index 0000000..594201c --- /dev/null +++ b/doc/groff.html.node/Debugging.html @@ -0,0 +1,317 @@ + + + + + + +Debugging (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.37 Debugging

    + + +

    Standard troff voodoo, just put a power of two backslashes in +front of it until it works and if you still have problems add a \c. +— Ron Natalie +

    +

    GNU troff is not the easiest language to debug, in part thanks to +its design features of recursive interpolation and the use of +multi-stage pipeline processing in the surrounding system. Nevertheless +there exist several features useful for troubleshooting. +

    +

    Preprocessors use the lf request to preserve the identity of the +line numbers and names of input files. GNU troff emits a variety +of error diagnostics and supports several categories of warning; the +output of these can be selectively suppressed. A trace of the +formatter’s input processing stack can be emitted when errors or +warnings occur by means of GNU troff’s -b option, or +produced on demand with the backtrace request. The tm +and related requests can be used to emit customized diagnostic messages +or for instrumentation while troubleshooting. The ex and +ab requests cause early termination with successful and error +exit codes respectively, to halt further processing when continuing +would be fruitless. Examine the state of the formatter with requests +that write lists of defined names (macros, strings, and diversions), +environments, registers, and page location traps to the standard error +stream. +

    +
    +
    Request: .lf line [file]
    +
    + + + + + + +

    Set the input line number (and, optionally, the file name) GNU +troff shall use for error and warning messages. line is +the input line number of the next line. Without an argument, the +request is ignored. +

    +

    lf’s primary purpose is to aid the debugging of documents that +undergo preprocessing. Programs like tbl that transform input +in their own languages into roff requests use it so that any +diagnostic messages emitted by troff correspond to the source +document. +

    + +
    +
    Request: .tm message
    +
    +
    Request: .tm1 message
    +
    +
    Request: .tmc message
    +
    + + +

    Send message, which consumes the remainder of the input line and +cannot contain special characters, to the standard error stream, +followed by a newline. Leading spaces in message are ignored. +

    +

    tm1 is similar, but recognizes and strips a leading neutral +double quote from message to allow the embedding of leading +spaces. +

    +

    tmc works as tm1, but does not append a newline. +

    + +
    +
    Request: .ab [message]
    +
    + +

    Write any message to the standard error stream (like tm) +and then abort GNU troff; that is, stop processing and terminate +with a failure status. +

    + +
    +
    Request: .ex
    +
    + + +

    Exit GNU troff; that is, stop processing and terminate with a +successful status. To stop processing only the current file, use the +nx request; see I/O. +

    + +

    When doing something involved, it is useful to leave the debugging +statements in the code and have them turned on by a command-line flag. +

    +
    +
    .if \n[DB] .tm debugging output
    +
    + +

    To activate such statements, use the -r option to set the +register. +

    +
    +
    groff -rDB=1 file
    +
    + +

    If it is known in advance that there are many errors and no useful +output, GNU troff can be forced to suppress formatted output with +the -z option. +

    +
    +
    Request: .pev
    +
    + + +

    Report the state of the current environment followed by that of all +other environments to the standard error stream. +

    + +
    +
    Request: .pm
    +
    + + +

    Report, to the standard error stream, the names of all defined macros, +strings, and diversions with their sizes in bytes. +

    + +
    +
    Request: .pnr
    +
    + + +

    Report the names and contents of all currently defined registers to the +standard error stream. +

    + +
    +
    Request: .ptr
    +
    + + + + +

    Report the names and positions of all page location traps to the +standard error stream. Empty slots in the list, where a trap has been +planted but subsequently (re)moved, are printed as well. +

    + +
    +
    Request: .fl
    +
    + + + + +

    Instruct gtroff to flush its output immediately. The intent is +for interactive use, but this behaviour is currently not implemented in +gtroff. Contrary to Unix troff, TTY output is sent to a +device driver also (grotty), making it non-trivial to communicate +interactively. +

    +

    This request causes a line break. +

    + +
    +
    Request: .backtrace
    +
    + + +

    Write the state of the input stack to the standard error stream. +

    +

    Consider the following in a file test. +

    +
    +
    .de xxx
    +.  backtrace
    +..
    +.de yyy
    +.  xxx
    +..
    +.
    +.yyy
    +    error→ troff: backtrace: 'test':2: macro 'xxx'
    +    error→ troff: backtrace: 'test':5: macro 'yyy'
    +    error→ troff: backtrace: file 'test':8
    +
    + +

    The -b option of GNU troff causes a backtrace to be +generated on each error or warning. Some warnings have to be enabled; +See Warnings. +

    + +
    +
    Register: \n[slimit]
    +
    + +

    If greater than 0, sets the maximum quantity of objects on GNU +troff’s internal input stack. If less than or equal to 0, +there is no limit: recursion can continue until program memory is +exhausted. The default is 1,000. +

    + +
    +
    Request: .warnscale su
    +
    +

    Set the scaling unit used in certain warnings to su, which can take the values ‘u’, ‘i’, ‘c’, +‘p’, and ‘P’. The default is ‘i’. +

    + +
    +
    Request: .spreadwarn [limit]
    +
    +

    Emit a break warning if the additional space inserted for each +space between words in an output line adjusted to both margins with +‘.ad b is larger than or equal to limit. A negative +value is treated as zero; an absent argument toggles the warning on and +off without changing limit. The default scaling unit is ‘m’. +At startup, spreadwarn is inactive and limit is 3m. +

    +

    For example, +

    +
    +
    .spreadwarn 0.2m
    +
    + +

    causes a warning if break warnings are not suppressed and +gtroff must add 0.2m or more for each inter-word space in a +line. See Warnings. +

    + + +

    GNU troff has command-line options for reporting warnings +(-w) and backtraces (-b) when a warning or an error +occurs. +

    +
    +
    Request: .warn [n]
    +
    +
    Register: \n[.warn]
    +
    + +

    Select the categories, or “types”, of reported warnings. +n is the sum of the numeric codes associated with each +warning category that is to be enabled; all other categories are +disabled. The categories and their associated codes are listed in +Warnings. For example, ‘.warn 0’ disables all warnings, and +‘.warn 1’ disables all warnings except those about missing glyphs. +If no argument is given, all warning categories are enabled. +

    +

    The read-only register .warn contains the sum of the numeric +codes of enabled warning categories. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Default-Units.html b/doc/groff.html.node/Default-Units.html new file mode 100644 index 0000000..168c5cc --- /dev/null +++ b/doc/groff.html.node/Default-Units.html @@ -0,0 +1,87 @@ + + + + + + +Default Units (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.3.2 Default Units

    + + + +

    A general-purpose register (one created or updated with the nr +request; see see Registers) is implicitly dimensionless, or reckoned +in basic units if interpreted in a measurement context. But it is +convenient for many requests and escape sequences to infer a scaling +unit for an argument if none is specified. An explicit scaling unit +(not after a closing parenthesis) can override an undesirable default. +Effectively, the default unit is suffixed to the expression if a scaling +unit is not already present. GNU troff’s use of integer +arithmetic should also be kept in mind (see Numeric Expressions). +

    +

    The ll request interprets its argument in ems by default. +Consider several attempts to set a line length of 3.5 inches when +the type size is 10 points on a terminal device with a resolution +of 240 basic units and horizontal motion quantum of 24. Some +expressions become zero; the request clamps them to that quantum. +

    +
    +
    .ll 3.5i      \" 3.5i (= 840u)
    +.ll 7/2       \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u
    +.ll (7 / 2)u  \" 7u/2u -> as above
    +.ll 7/2i      \" 7u/2i -> 7u/480u -> 0 -> as above
    +.ll 7i/2      \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u
    +.ll 7i/2u     \" 3.5i (= 840u)
    +
    + + +

    The safest way to specify measurements is to attach a scaling unit. To +multiply or divide by a dimensionless quantity, use ‘u’ as its +scaling unit. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Deferring-Output.html b/doc/groff.html.node/Deferring-Output.html new file mode 100644 index 0000000..81ab360 --- /dev/null +++ b/doc/groff.html.node/Deferring-Output.html @@ -0,0 +1,106 @@ + + + + + + +Deferring Output (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.27 Deferring Output

    + + + + + +

    A few roff language elements are generally not used in simple +documents, but arise as page layouts become more sophisticated and +demanding. Environments collect formatting parameters like line +length and typeface. A diversion stores formatted output for +later use. A trap is a condition on the input or output, tested +automatically by the formatter, that is associated with a macro, causing +it to be called when that condition is fulfilled. +

    +

    Footnote support often exercises all three of the foregoing features. A +simple implementation might work as follows. A pair of macros is +defined: one starts a footnote and the other ends it. The author calls +the first macro where a footnote marker is desired. The macro +establishes a diversion so that the footnote text is collected at the +place in the body text where its corresponding marker appears. An +environment is created for the footnote so that it is set at a smaller +typeface. The footnote text is formatted in the diversion using that +environment, but it does not yet appear in the output. The document +author calls the footnote end macro, which returns to the previous +environment and ends the diversion. Later, after much more body text in +the document, a trap, set a small distance above the page bottom, is +sprung. The macro called by the trap draws a line across the page and +emits the stored diversion. Thus, the footnote is rendered. +

    +

    Diversions and traps make the text formatting process non-linear. Let +us imagine a set of text lines or paragraphs labelled ‘A’, +‘B’, and so on. If we set up a trap that produces text ‘T’ +(as a page footer, say), and we also use a diversion to store the +formatted text ‘D’, then a document with input text in the order +‘A B C D E F’ might render as ‘A B C E T F’. The diversion +‘D’ will never be output if we do not call for it. +

    +

    Environments of themselves are not a source of non-linearity in document +formatting: environment switches have immediate effect. One could +always write a macro to change as many formatting parameters as desired +with a single convenient call. But because diversions can be nested and +macros called by traps that are sprung by other trap-called macros, they +may be called upon in varying contexts. For example, consider a page +header that is always to be set in Helvetica. A document that uses +Times for most of its body text, but Courier for displayed code +examples, poses a challenge if a page break occurs in the middle of a +code display; if the header trap assumes that the “previous font” is +always Times, the rest of the example will be formatted in the wrong +typeface. One could carefully save all formatting parameters upon +entering the trap and restore them upon leaving it, but this is verbose, +error-prone, and not future-proof as the groff language develops. +Environments save us considerable effort. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Delimiters.html b/doc/groff.html.node/Delimiters.html new file mode 100644 index 0000000..fa117db --- /dev/null +++ b/doc/groff.html.node/Delimiters.html @@ -0,0 +1,233 @@ + + + + + + +Delimiters (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6.5 Delimiters

    + + + + + + + +

    Some escape sequences that require parameters use delimiters. The +neutral apostrophe ' is a popular choice and shown in this +document. The neutral double quote " is also commonly seen. +Letters, numerals, and leaders can be used. Punctuation characters +are likely better choices, except for those defined as infix operators +in numeric expressions; see below. +

    +
    +
    \l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    The following escape sequences don’t take arguments and thus are allowed +as delimiters: +\SP, \%, \|, \^, \{, +\}, \', \`, \-, \_, \!, +\?, \), \/, \,, \&, \:, +\~, \0, \a, \c, \d, \e, +\E, \p, \r, \t, and \u. However, +using them this way is discouraged; they can make the input confusing to +read. +

    + + + + + + + +

    A few escape sequences, +\A, +\b, +\o, +\w, +\X, +and \Z, accept a newline as a delimiter. Newlines that serve +as delimiters continue to be recognized as input line terminators. +

    +
    +
    A caf\o
    +e\(aa
    +in Paris
    +    ⇒ A café in Paris
    +
    + +

    Use of newlines as delimiters in escape sequences is also discouraged. +

    + + + + + + + + + + + +

    Finally, the escape sequences \D, \h, \H, +\l, \L, \N, \R, \s, \S, +\v, and \x prohibit many delimiters. +

    +
      +
    • + + + + +the numerals 0-9 and the decimal point . + +
    • + + + + + + + + + + + + +the (single-character) operators ‘+-/*%<>=&:()’ + +
    • + +the space and tab characters + +
    • + + + + + + + + + + + + +any escape sequences other than \%, \:, \{, +\}, \', \`, \-, \_, \!, +\/, \c, \e, and \p +
    + +

    Delimiter syntax is complex and flexible primarily for historical +reasons; the foregoing restrictions need be kept in mind mainly when +using groff in AT&T compatibility mode. GNU +troff keeps track of the nesting depth of escape sequence +interpolations, so the only characters you need to avoid using as +delimiters are those that appear in the arguments you input, not any +that result from interpolation. Typically, ' works fine. +See Implementation Differences. +

    +
    +
    $ groff -Tps
    +.de Mw
    +.  nr wd \w'\\$1'
    +.  tm "\\$1" is \\n(wd units wide.
    +..
    +.Mw Wet'suwet'en
    +.Mw Wet+200i
    +.cp 1 \" turn on compatibility mode
    +.Mw Wet'suwet'en
    +.Mw Wet'
    +.Mw Wet+200i
    +    error→ "Wet'suwet'en" is 54740 units wide.
    +    error→ "Wet'+200i" is 42610 units wide.
    +    error→ "Wet'suwet'en" is 15860 units wide.
    +    error→ "Wet'" is 15860 units wide.
    +    error→ "Wet'+200i" is 14415860 units wide.
    +
    + +

    We see here that in compatibility mode, the part of the argument after +the ' delimiter escapes from its context and, if nefariously +crafted, influences the computation of the wd register’s value in +a surprising way. +

    +
    +
    + + + + + + diff --git a/doc/groff.html.node/Device-Control-Commands.html b/doc/groff.html.node/Device-Control-Commands.html new file mode 100644 index 0000000..9d56288 --- /dev/null +++ b/doc/groff.html.node/Device-Control-Commands.html @@ -0,0 +1,185 @@ + + + + + + +Device Control Commands (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2.4 Device Control Commands

    + +

    Each device control command starts with the letter ‘x’, followed by +a space character (optional or arbitrary space or tab in gtroff) +and a subcommand letter or word; each argument (if any) must be preceded +by a syntactical space. All ‘x’ commands are terminated by a +syntactical line break; no device control command can be followed by +another command on the same line (except a comment). +

    +

    The subcommand is basically a single letter, but to increase +readability, it can be written as a word, i.e., an arbitrary sequence of +characters terminated by the next tab, space, or newline character. All +characters of the subcommand word but the first are simply ignored. For +example, gtroff outputs the initialization command ‘x i +as ‘x init and the resolution command ‘x r as +‘x res. +

    +

    In the following, the syntax element ‹line break› means a +syntactical line break (see Separation). +

    +
    +
    xF nameline break
    +

    The ‘F’ stands for Filename. +

    +

    Use name as the intended name for the current file in error +reports. This is useful for remembering the original file name when +gtroff uses an internal piping mechanism. The input file is not +changed by this command. This command is a gtroff extension. +

    +
    +
    xf n sline break
    +

    The ‘f’ stands for font. +

    +

    Mount font position n (a non-negative integer) with font +named s (a text word). See Font Positions. +

    +
    +
    xH nline break
    +

    The ‘H’ stands for Height. +

    +

    Set glyph height to n (a positive integer in scaled points +‘z’). AT&T troff uses the unit points (‘p’) +instead. See Output Language Compatibility. +

    +
    +
    xi‹line break
    +

    The ‘i’ stands for init. +

    +

    Initialize device. This is the third command of the prologue. +

    +
    +
    xp‹line break
    +

    The ‘p’ stands for pause. +

    +

    Parsed but ignored. The AT&T troff manual documents +this command as +

    +
    +
    pause device, can be restarted
    +
    + +

    but GNU troff output drivers do nothing with this command. +

    +
    +
    xr n h vline break
    +

    The ‘r’ stands for resolution. +

    +

    Resolution is n, while h is the minimal horizontal +motion, and v the minimal vertical motion possible with this +device; all arguments are positive integers in basic units ‘u’ per +inch. This is the second command of the prologue. +

    +
    +
    xS nline break
    +

    The ‘S’ stands for Slant. +

    +

    Set slant to n (an integer in basic units ‘u’). +

    +
    +
    xs‹line break
    +

    The ‘s’ stands for stop. +

    +

    Terminates the processing of the current file; issued as the last +command of any intermediate troff output. +

    +
    +
    xt‹line break
    +

    The ‘t’ stands for trailer. +

    +

    Generate trailer information, if any. In GNU troff, this is +ignored. +

    +
    +
    xT xxxline break
    +

    The ‘T’ stands for Typesetter. +

    +

    Set the name of the output driver to xxx, a sequence of +non-whitespace characters terminated by whitespace. The possible names +correspond to those of groff’s -T option. This is the +first command of the prologue. +

    +
    +
    xu nline break
    +

    The ‘u’ stands for underline. +

    +

    Configure underlining of spaces. If n is 1, start +underlining of spaces; if n is 0, stop underlining of spaces. +This is needed for the cu request in nroff mode and is +ignored otherwise. This command is a gtroff extension. +

    +
    +
    xX anythingline break
    +

    The ‘x’ stands for X-escape. +

    +

    Send string anything uninterpreted to the device. If the line +following this command starts with a ‘+’ character this line is +interpreted as a continuation line in the following sense. The ‘+’ +is ignored, but a newline character is sent instead to the device, the +rest of the line is sent uninterpreted. The same applies to all +following lines until the first character of a line is not a ‘+’ +character. This command is generated by the gtroff escape +sequence \X. The line-continuing feature is a gtroff +extension. +

    +
    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Device-and-Font-Description-Files.html b/doc/groff.html.node/Device-and-Font-Description-Files.html new file mode 100644 index 0000000..b935830 --- /dev/null +++ b/doc/groff.html.node/Device-and-Font-Description-Files.html @@ -0,0 +1,77 @@ + + + + + + +Device and Font Description Files (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.2 Device and Font Description Files

    + + + +

    The groff font and output device description formats are slight +extensions of those used by AT&T device-independent +troff. In distinction to the AT&T implementation, +groff lacks a binary format; all files are text +files.125 The device and font description files for a device name +are stored in a devname directory. The device description +file is called DESC, and, for each font supported by the device, +a font description file is called f, where +f is usually an abbreviation of a font’s name and/or style. +For example, the ps (PostScript) device has groff font +description files for Times roman (TR) and Zapf Chancery Medium +italic (ZCMI), among many others, while the utf8 device +(for terminal emulators) has only font descriptions for the roman, +italic, bold, and bold-italic styles (R, I, B, and +BI, respectively). +

    +

    Device and font description files are read both by the formatter, GNU +troff, and by output drivers. The programs delegate these files’ +processing to an internal library, libgroff, ensuring their +consistent interpretation. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Differences-from-AT_0026T-ms.html b/doc/groff.html.node/Differences-from-AT_0026T-ms.html new file mode 100644 index 0000000..6d45741 --- /dev/null +++ b/doc/groff.html.node/Differences-from-AT_0026T-ms.html @@ -0,0 +1,171 @@ + + + + + + +Differences from AT&T ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.7 Differences from AT&T ms

    + + + +

    The groff ms macros are an independent reimplementation, +using no AT&T code. Since they take advantage of the extended +features of groff, they cannot be used with AT&T +troff. groff ms supports features described above +as Berkeley and Tenth Edition Research Unix extensions, and adds several +of its own. +

    +
      +
    • The internals of groff ms differ from the internals of +AT&T ms. Documents that depend upon implementation +details of AT&T ms may not format properly with +groff ms. Such details include macros whose function was +not documented in the AT&T ms +manual.14 + +
    • The error-handling policy of groff ms is to detect and +report errors, rather than to ignore them silently. + +
    • Tenth Edition Research Unix supported P1/P2 macros to bracket code +examples; groff ms does not. + +
    • groff ms does not work in GNU troff’s +AT&T compatibility mode. If loaded when that mode is enabled, +it aborts processing with a diagnostic message. + +
    • Multiple line spacing is not supported. Use a larger vertical spacing +instead. + +
    • groff ms uses the same header and footer defaults in both +nroff and troff modes as AT&T ms does in +troff mode; AT&T’s default in nroff mode is to +put the date, in U.S. traditional format (e.g., “January 1, 2021”), +in the center footer (the CF string). + +
    • Many groff ms macros, including those for paragraphs, +headings, and displays, cause a reset of paragraph rendering parameters, +and may change the indentation; they do so not by incrementing or +decrementing it, but by setting it absolutely. This can cause problems +for documents that define additional macros of their own that try to +manipulate indentation. Use the ms RS and RE +macros instead of the in request. + +
    • + +AT&T ms interpreted the values of the registers +PS and VS in points, and did not support the use of +scaling units with them. groff ms interprets values of +the registers PS, VS, FPS, and FVS equal to +or larger than 1,000 (one thousand) as decimal fractions multiplied +by 1,000.15 This threshold makes use of a +scaling unit with these parameters practical for high-resolution +devices while preserving backward compatibility. It also permits +expression of non-integral type sizes. For example, ‘groff +-rPS=10.5p’ at the shell prompt is equivalent to placing ‘.nr PS +10.5p’ at the beginning of the document. + +
    • AT&T ms’s AU macro supported arguments used with +some document types; groff ms does not. + +
    • Right-aligned displays are available. The AT&T ms +manual observes that “it is tempting to assume that ‘.DS R’ will +right adjust lines, but it doesn’t work”. In groff ms, +it does. + +
    • To make groff ms use the default page offset (which also +specifies the left margin), the PO register must stay undefined +until the first ms macro is called. + +

      This implies that ‘\n[PO]’ should not be used early in the +document, unless it is changed also: accessing an undefined register +automatically defines it. +

      +
    • groff ms supports the PN register, but it is not +necessary; you can access the page number via the usual % +register and invoke the af request to assign a different format +to it if desired.16 + +
    • The AT&T ms manual documents registers CW and +GW as setting the default column width and “intercolumn gap”, +respectively, and which applied when MC was called with fewer +than two arguments. groff ms instead treats MC +without arguments as synonymous with 2C; there is thus no +occasion for a default column width register. Further, the MINGW +register and the second argument to MC specify a minimum +space between columns, not the fixed gutter width of AT&T +ms. + +
    • The AT&T ms manual did not document the QI +register; Berkeley and groff ms do. +
    + +
    +
    Register: \n[GS]
    +
    +

    The register GS is set to 1 by the groff ms +macros, but is not used by the AT&T ms package. +Documents that need to determine whether they are being formatted with +groff ms or another implementation should test this +register. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Displays-and-Keeps.html b/doc/groff.html.node/Displays-and-Keeps.html new file mode 100644 index 0000000..9d8f2b0 --- /dev/null +++ b/doc/groff.html.node/Displays-and-Keeps.html @@ -0,0 +1,74 @@ + + + + + + +Displays and Keeps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.5 Displays and Keeps

    + + +

    Displays are sections of text set off from the surrounding +material (typically paragraphs), often differing in indentation, and/or +spacing. Tables, block quotations, and figures are displayed. +Equations and code examples, when not much shorter than an output line, +often are. Lists may or may not be. Packages for setting man pages +support example displays but not keeps. +

    + +

    A keep is a group of output lines, often a display, that is +formatted on a single page if possible; it causes a page break to happen +early so as to not interrupt the kept material. +

    + + +

    Floating keeps can move, or “float”, relative to the text +around them in the input. They are useful for displays that are +captioned and referred to by name, as with “See figure 3”. +Depending on the package, a floating keep appears at the bottom of the +current page if it fits, and at the top of the next otherwise. +Alternatively, floating keeps might be deferred to the end of a section. +Using a floating keep can avoid the large vertical spaces that may +precede a tall keep of the ordinary sort when it won’t fit on the page. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Diversion-Traps.html b/doc/groff.html.node/Diversion-Traps.html new file mode 100644 index 0000000..4c924e7 --- /dev/null +++ b/doc/groff.html.node/Diversion-Traps.html @@ -0,0 +1,79 @@ + + + + + + +Diversion Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.1.3 Diversion Traps

    + + + +

    A diversion is not formatted in the context of a page, so it lacks page +location traps; instead it can have a diversion trap. There can +exist at most one such vertical position trap per diversion. +

    +
    +
    Request: .dt [dist name]
    +
    + + + + +

    Set a trap within a diversion at location dist, which is +interpreted relative to diversion rather than page boundaries. If invoked with +fewer than two arguments, any diversion trap in the current diversion is +removed. The register .t works within diversions. It is an +error to invoke dt in the top-level diversion. +See Diversions. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Diversions.html b/doc/groff.html.node/Diversions.html new file mode 100644 index 0000000..c0dc8e9 --- /dev/null +++ b/doc/groff.html.node/Diversions.html @@ -0,0 +1,394 @@ + + + + + + +Diversions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.29 Diversions

    + + +

    In roff systems it is possible to format text as if for output, +but instead of writing it immediately, one can divert the +formatted text into a named storage area. It is retrieved later by +specifying its name after a control character. The same name space is +used for such diversions as for strings and macros; see +Identifiers. Such text is sometimes said to be “stored in a +macro”, but this coinage obscures the important distinction between +macros and strings on one hand and diversions on the other; the former +store unformatted input text, and the latter capture +formatted output. Diversions also do not interpret arguments. +Applications of diversions include “keeps” (preventing a page break +from occurring at an inconvenient place by forcing a set of output lines +to be set as a group), footnotes, tables of contents, and indices. + + +For orthogonality it is said that GNU troff is in the +top-level diversion if no diversion is active (that is, formatted +output is being “diverted” immediately to the output device). +

    +

    Dereferencing an undefined diversion will create an empty one of that +name and cause a warning in category ‘mac’ to be emitted. +See Warnings, for information about the enablement and suppression of +warnings. A diversion does not exist for the purpose of testing with +the d conditional operator until its initial definition ends +(see Operators in Conditionals). The following requests are used to +create and alter diversions. +

    +
    +
    Request: .di [name]
    +
    +
    Request: .da [name]
    +
    + + + + + + +

    Start collecting formatted output in a diversion called name. The +da request appends to a diversion called name, creating it +if necessary. If name already exists as an alias, the target of +the alias is replaced or appended to; recall Strings. The pending +output line is diverted as well. Switching to another environment (with +the ev request) before invoking di or da avoids +including any pending output line in the diversion; see +Environments. +

    +

    Invoking di or da without an argument stops diverting +output to the diversion named by the most recent corresponding request. +If di or da is called without an argument when there is no +current diversion, a warning in category ‘di’ is produced. +See Warnings, for information about the enablement and suppression +of warnings. +

    +
    +
    Before the diversion.
    +.di yyy
    +In the diversion.
    +.br
    +.di
    +After the diversion.
    +.br
    +    ⇒ After the diversion.
    +.yyy
    +    ⇒ Before the diversion.  In the diversion.
    +
    +
    + + +

    GNU troff supports box requests to exclude a partially +collected line from a diversion, as this is often desirable. +

    +
    +
    Request: .box [name]
    +
    +
    Request: .boxa [name]
    +
    +

    Divert (or append) output to name, similarly to the di and +da requests, respectively. Any pending output line is not +included in the diversion. Without an argument, stop diverting output; +any pending output line inside the diversion is discarded. +

    +
    +
    Before the box.
    +.box xxx
    +In the box.
    +.br
    +Hidden treasure.
    +.box
    +After the box.
    +.br
    +    ⇒ Before the box.  After the box.
    +.xxx
    +    ⇒ In the box.
    +
    +
    + +

    Apart from pending output line inclusion and the request names that +populate them, boxes are handled exactly as diversions are. All of the +following groff language elements can be used with them +interchangeably. +

    +
    +
    Register: \n[.z]
    +
    +
    Register: \n[.d]
    +
    + + + + + + + +

    Diversions may be nested. The read-only string-valued register +.z contains the name of the current diversion. The read-only +register .d contains the current vertical place in the diversion. +If the input text is not being diverted, .d reports the same +location as the register nl. +

    + +
    +
    Register: \n[.h]
    +
    + + + + +

    The read-only register .h stores the high-water mark on the +current page or in the current diversion. It corresponds to the text +baseline of the lowest line on the page.113 +

    +
    +
    .tm .h==\n[.h], nl==\n[nl]
    +    ⇒ .h==0, nl==-1
    +This is a test.
    +.br
    +.sp 2
    +.tm .h==\n[.h], nl==\n[nl]
    +    ⇒ .h==40, nl==120
    +
    + + + +

    As implied by the example, vertical motion does not produce text +baselines and thus does not increase the value interpolated by +‘\n[.h]’. +

    + +
    +
    Register: \n[dn]
    +
    +
    Register: \n[dl]
    +
    + + + + +

    After completing a diversion, the writable registers dn and +dl contain its vertical and horizontal sizes. Only the lines +just processed are counted: for the computation of dn and +dl, the requests da and boxa are handled as if +di and box had been used, respectively—lines that have +been already stored in the diversion (box) are not taken into account. +

    +
    +
    .\" Center text both horizontally and vertically.
    +.\" Macro .(c starts centering mode; .)c terminates it.
    +.
    +.\" Disable the escape character with .eo so that we
    +.\" don't have to double backslashes on the "\n"s.
    +.eo
    +.de (c
    +.  br
    +.  ev (c
    +.  evc 0
    +.  in 0
    +.  nf
    +.  di @c
    +..
    +
    +
    +
    .de )c
    +.  br
    +.  ev
    +.  di
    +.  nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v)
    +.  sp \n[@s]u
    +.  ce 1000
    +.  @c
    +.  ce 0
    +.  sp \n[@s]u
    +.  br
    +.  fi
    +.  rr @s
    +.  rm @c
    +..
    +.ec
    +
    +
    + +
    +
    Escape sequence: \!anything
    +
    +
    Escape sequence: \?anything\?
    +
    + + +

    Transparently embed anything into the current diversion, +preventing requests, macro calls, and escape sequences from being +interpreted when read into a diversion. This is useful for preventing +them from taking effect until the diverted text is actually output. The +\! escape sequence transparently embeds input up to and including +the end of the line. The \? escape sequence transparently embeds +input until its own next occurrence. +

    + + + + + + +

    anything may not contain newlines; use \! by itself to +embed newlines in a diversion. The escape sequence \? is also +recognized in copy mode and turned into a single internal code; it is +this code that terminates anything. Thus the following example +prints 4. +

    +
    +
    .nr x 1
    +.nf
    +.di d
    +\?\\?\\\\?\\\\\\\\nx\\\\?\\?\?
    +.di
    +.nr x 2
    +.di e
    +.d
    +.di
    +.nr x 3
    +.di f
    +.e
    +.di
    +.nr x 4
    +.f
    +
    + +

    Both escape sequences read the data in copy mode. +

    + + + +

    If \! is used in the top-level diversion, its argument is +directly embedded into GNU troff’s intermediate output. This can +be used, for example, to control a postprocessor that processes the data +before it is sent to an output driver. +

    + + + +

    The \? escape used in the top-level diversion produces no output +at all; its argument is simply ignored. +

    + + + + + + +
    +
    Request: .output contents
    +
    +

    Emit contents directly to GNU troff’s intermediate output +(subject to copy mode interpretation); this is similar to \! used +at the top level. An initial neutral double quote in contents is +stripped to allow embedding of leading spaces. +

    +

    This request can’t be used before the first page has started—if you +get an error, simply insert .br before the output request. +

    +

    Use with caution! It is normally only needed for mark-up used by a +postprocessor that does something with the output before sending it to +the output device, filtering out contents again. +

    + +
    +
    Request: .asciify div
    +
    + + + +

    Unformat the diversion div in a way such that Unicode basic +Latin (ASCII) characters, characters translated with the +trin request, space characters, and some escape sequences, that +were formatted and diverted into div are treated like ordinary +input characters when div is reread. Doing so can be useful in +conjunction with the writem request. asciify can be also +used for gross hacks; for example, the following sets +register n to 1. +

    +
    +
    .tr @.
    +.di x
    +@nr n 1
    +.br
    +.di
    +.tr @@
    +.asciify x
    +.x
    +
    + +

    asciify cannot return all items in a diversion to their source +equivalent: nodes such as those produced by the \N escape +sequence will remain nodes, so the result cannot be guaranteed to be a +pure string. See Copy Mode. Glyph parameters such as the type face +and size are not preserved; use unformat to achieve that. +

    + +
    +
    Request: .unformat div
    +
    +

    Like asciify, unformat the diversion div. However, +unformat handles only tabs and spaces between words, the latter +usually arising from spaces or newlines in the input. Tabs are treated +as input tokens, and spaces become adjustable again. The vertical sizes +of lines are not preserved, but glyph information (font, type size, +space width, and so on) is retained. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Document-Formats.html b/doc/groff.html.node/Document-Formats.html new file mode 100644 index 0000000..9079d67 --- /dev/null +++ b/doc/groff.html.node/Document-Formats.html @@ -0,0 +1,57 @@ + + + + + + +Document Formats (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.9 Document Formats

    + + +

    Some macro packages supply stock configurations of certain documents, +like business letters and memoranda. These often also have provision +for a cover sheet, which may be rigid in its format. With +these features, it is even more important to use the package’s macros in +preference to the formatter requests presented earlier, where possible. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Document-Parts.html b/doc/groff.html.node/Document-Parts.html new file mode 100644 index 0000000..7b83511 --- /dev/null +++ b/doc/groff.html.node/Document-Parts.html @@ -0,0 +1,84 @@ + + + + + + +Document Parts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.1.3 Document Parts

    + +

    A correct intermediate output document consists of two parts, the +prologue and the body. +

    +

    The task of the prologue is to set the general device parameters using +three exactly specified commands. gtroff’s prologue is +guaranteed to consist of the following three lines (in that order): +

    +
    +
    x T device
    +x res n h v
    +x init
    +
    + +

    with the arguments set as outlined in Device Control Commands. +The parser for the intermediate output format is able to interpret +additional whitespace and comments as well even in the prologue. +

    +

    The body is the main section for processing the document data. +Syntactically, it is a sequence of any commands different from the ones +used in the prologue. Processing is terminated as soon as the first +‘x stop command is encountered; the last line of any +gtroff intermediate output always contains such a command. +

    +

    Semantically, the body is page oriented. A new page is started by a +‘p’ command. Positioning, writing, and drawing commands are always +done within the current page, so they cannot occur before the first +‘p’ command. Absolute positioning (by the ‘H’ and ‘V’ +commands) is done relative to the current page; all other positioning is +done relative to the current location within this page. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Drawing-Geometric-Objects.html b/doc/groff.html.node/Drawing-Geometric-Objects.html new file mode 100644 index 0000000..fa0732f --- /dev/null +++ b/doc/groff.html.node/Drawing-Geometric-Objects.html @@ -0,0 +1,361 @@ + + + + + + +Drawing Geometric Objects (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.26 Drawing Geometric Objects

    + + + +

    A few of the formatter’s escape sequences draw lines and other geometric +objects. Combined with each other and with page motion commands +(see Page Motions), a wide variety of figures is possible. For +complex drawings, these operations can be cumbersome; the preprocessors +gpic or ggrn are typically used instead. +

    +

    The \l and \L escape sequences draw horizontal and +vertical sequences of glyphs, respectively. Even the simplest of +output devices supports them. +

    +
    +
    Escape sequence: \l'l'
    +
    +
    Escape sequence: \l'lc'
    +
    + + +

    Draw a horizontal line of length l from the drawing position. +Rightward motion is positive. Afterward, the drawing position is at the +right end of the line. The default scaling unit is ‘m’. +

    + + + + +

    The optional second parameter c is a character with which to +draw the line. The default is the baseline rule special character, +\[ru]. +

    + + +

    If c is a valid scaling unit, put \& after l to +disambiguate the input. +

    +
    +
    .de textbox
    +\[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]'
    +..
    +
    + +

    The foregoing outputs a box rule (a vertical line), the text +argument(s), and another box rule. We employ the boundary-relative +motion operator ‘|’. Finally, the line-drawing escape sequences +draw a radical extender (a form of overline) and an underline from the +drawing position to the position coresponding to beginning of the +input line. The drawing position returns to just after the +right-hand box rule because the lengths of the drawn lines are negative, +as noted above. +

    + +
    +
    Escape sequence: \L'l'
    +
    +
    Escape sequence: \L'lc'
    +
    + + + + + + +

    Draw a vertical line of length l from the drawing position. +Downward motion is positive. The default scaling unit is ‘v’. The +default character is the box rule, \[br]. As with vertical +motion escape sequences, text processing continues where the line ends. +\L is otherwise similar to \l. +

    +
    +
    $ nroff <<EOF
    +This is a \L'3v'test.
    +EOF
    +    ⇒ This is a
    +    ⇒           |
    +    ⇒           |
    +    ⇒           |test.
    +
    + +

    When writing text, the drawing position is at the text baseline; recall +Page Geometry. +

    + +

    The \D escape sequence provides drawing commands that +direct the output device to render geometrical objects rather than +glyphs. Specific devices may support only a subset, or may feature +additional ones; consult the man page for the output driver in use. +Terminal devices in particular implement almost none. See Graphics Commands. +

    +

    Rendering starts at the drawing position; when finished, the drawing +position is left at the rightmost point of the object, even for closed +figures, except where noted. GNU troff draws stroked (outlined) +objects with the stroke color, and shades filled ones with the fill +color. See Colors. Coordinates h and v are horizontal +and vertical motions relative to the drawing position or previous point +in the command. The default scaling unit for horizontal measurements +(and diameters of circles) is ‘m’; for vertical ones, ‘v’. +

    +

    Circles, ellipses, and polygons can be drawn filled or stroked. These +are independent properties; if you want a filled, stroked figure, you +must draw the same figure twice using each drawing command. A filled +figure is always smaller than an outlined one because the former is +drawn only within its defined area, whereas strokes have a line +thickness (set with ‘\D't'’). +

    +
    +
    \h'1i'\v'1i'\
    +\# increase line thickness
    +\Z'\D't 5p''\
    +\# draw stroked (unfilled) polygon
    +\Z'\D'p 3 3 -6 0''\
    +\# draw filled (solid) polygon
    +\Z'\D'P 3 3 -6 0''
    +
    + +
    +
    Escape sequence: \D'command argument …'
    +
    +

    Drawing command escape sequence parameters begin with an ordinary +character, command, selecting the type of object to be drawn, +followed by arguments whose meaning is determined by +command. +

    +
    +
    \D'~ h1 v1hn vn'
    +
    +

    Draw a B-spline to each point in sequence, leaving the drawing position +at (hn, vn). +

    +
    +
    \D'a hc vc h v'
    +
    +

    Draw a circular arc centered at (hc, vc) counterclockwise +from the drawing position to a point (h, v) relative to the +center. 105 +

    +
    +
    \D'c d'
    +
    + + + + +

    Draw a circle of diameter d with its leftmost point at the drawing +position. +

    +
    +
    \D'C d'
    +
    + + + + +

    As ‘\D'C '’, but the circle is filled. +

    +
    +
    \D'e h v'
    +
    + + + + +

    Draw an ellipse of width h and height v with its leftmost +point at the drawing position. +

    +
    +
    \D'E x y'
    +
    + + + + +

    As ‘\D'e '’, but the ellipse is filled. +

    +
    +
    \D'l dx dy'
    +
    +

    Draw line from the drawing position to (h, v). +

    +

    The following is a macro for drawing a box around a text argument; for +simplicity, the box margin is a fixed at 0.2m. +

    +
    +
    .de TEXTBOX
    +.  nr @wd \w'\\$1'
    +\h'.2m'\
    +\h'-.2m'\v'(.2m - \\n[rsb]u)'\
    +\D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\
    +\D'l (\\n[@wd]u + .4m) 0'\
    +\D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\
    +\D'l -(\\n[@wd]u + .4m) 0'\
    +\h'.2m'\v'-(.2m - \\n[rsb]u)'\
    +\\$1\
    +\h'.2m'
    +..
    +
    + +

    The argument is measured with the \w escape sequence. Its width +is stored in register @wd. \w also sets the registers +rst and rsb; these contain its maximum vertical extents of +the argument. Then, four lines are drawn to form a box, offset by the +box margin. +

    +
    +
    \D'p h1 v1hn vn'
    +
    + + + + +

    Draw polygon with vertices at drawing position and each point in +sequence. GNU troff closes the polygon by drawing a line from +(hn, vn) back to the initial drawing position. +Afterward, the drawing position is left at (hn, vn). +

    +
    +
    \D'P dx1 dy1 dx2 dy2 …'
    +
    + + + + +

    As ‘\D'P '’, but the polygon is filled. +

    +

    The following macro is like the ‘\D'l'’ example, but shades the +box. We draw the box before writing the text because colors in GNU +troff have no transparency; in othe opposite order, the filled +polygon would occlude the text. +

    +
    +
    .de TEXTBOX
    +.  nr @wd \w'\\$1'
    +\h'.2m'\
    +\h'-.2m'\v'(.2m - \\n[rsb]u)'\
    +\M[lightcyan]\
    +\D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \
    +     (\\n[@wd]u + .4m) 0 \
    +     0 (\\n[rst]u - \\n[rsb]u + .4m) \
    +     -(\\n[@wd]u + .4m) 0'\
    +\h'.2m'\v'-(.2m - \\n[rsb]u)'\
    +\M[]\
    +\\$1\
    +\h'.2m'
    +..
    +
    + +
    +
    \D't n'
    +
    +

    Set the stroke thickness of geometric objects to n basic units. A +zero n selects the minimal supported thickness. A negative +n selects a thickness proportional to the type size; this is the +default. +

    +
    +
    + +

    In a hazy penumbra between text rendering and drawing commands we locate +the bracket-building escape sequence, \b. It can assemble +apparently large glyphs by vertically stacking ordinary ones. +

    +
    +
    Escape sequence: \b'contents'
    +
    + + + +

    Pile and center a sequence of glyphs vertically on the output line. +Piling stacks glyphs corresponding to each character in +contents, read from left to right, and placed from top to bottom. +GNU troff separates the glyphs vertically by 1m, and the +pile itself is centered 0.5m above the text baseline. The +horizontal drawing position is then advanced by the width of the widest +glyph in the pile. +

    + + +

    This rather inflexible positioning algorithm doesn’t work with the +dvi output device since its bracket pieces vary in height. +Instead, use the geqn preprocessor. +

    +

    Manipulating Spacing describes how to adjust the vertical spacing +of the output line with the \x escape sequence. +

    +

    The application of \b that lends its name is construction of +brackets, braces, and parentheses when typesetting mathematics. We +might construct a large opening (left) brace as follows. +

    +
    +
    \b'\[lt]\[bv]\[lk]\[bv]\[lb]'
    +
    + +

    See groff_char(7) for a list of special character +identifiers. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Dummy-Characters.html b/doc/groff.html.node/Dummy-Characters.html new file mode 100644 index 0000000..769574d --- /dev/null +++ b/doc/groff.html.node/Dummy-Characters.html @@ -0,0 +1,166 @@ + + + + + + +Dummy Characters (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.10 Dummy Characters

    + +

    As discussed in Requests and Macros, the first character on an +input line is treated specially. Further, formatting a glyph has many +consequences on formatter state (see Environments). Occasionally, +we want to escape this context or embrace some of those consequences +without actually rendering a glyph to the output. +

    +
    +
    Escape sequence: \&
    +
    + + +

    Interpolate a dummy character, which is constitutive of output but +invisible.81 Its presence alters the interpretation context of a +subsequent input character, and enjoys several applications. +

    +
      +
    • Prevent insertion of extra space after an end-of-sentence character. + +
      +
      Test.
      +Test.
      +    ⇒ Test.  Test.
      +Test.\&
      +Test.
      +    ⇒ Test. Test.
      +
      + +
    • Prevent recognition of a control character. + +
      +
      .Test
      +    error→ warning: macro 'Test' not defined
      +\&.Test
      +    ⇒ .Test
      +
      + +
    • Prevent kerning between two glyphs. + + +
    • Translate a character to “nothing”. + +
      +
      .tr JIjiK\&k\&UVuv
      +Post universitum, alea jacta est, OK?
      +    ⇒ Post vniversitvm, alea iacta est, O?
      +
      +
    + +

    The dummy character escape sequence sees use in macro definitions as a +means of ensuring that arguments are treated as text even if they begin +with spaces or control characters. +

    +
    +
    .de HD \" typeset a simple bold heading
    +.  sp
    +.  ft B
    +\&\\$1 \" exercise: remove the \&
    +.  ft
    +.  sp
    +..
    +.HD .\|.\|.\|surprised?
    +
    +
    + +

    One way to think about the dummy character is to imagine placing the +symbol ‘&’ in the input at a certain location; if doing so has all +the side effects on formatting that you desire except for sticking an +ugly ampersand in the midst of your text, the dummy character is what +you want in its place. +

    +
    +
    Escape sequence: \)
    +
    + + + +

    Interpolate a transparent dummy character—one that is +transparent to end-of-sentence detection. It behaves as \&, +except that \& is treated as letters and numerals normally are +after ‘.’, ‘?’ and ‘!’; \& cancels end-of-sentence +detection, and \) does not. +

    +
    +
    .de Suffix-&
    +.  nop \&\\$1
    +..
    +.
    +.de Suffix-)
    +.  nop \)\\$1
    +..
    +.
    +Here's a sentence.\c
    +.Suffix-& '
    +Another one.\c
    +.Suffix-) '
    +And a third.
    +    ⇒ Here's a sentence.' Another one.'  And a third.
    +
    +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/End_002dof_002dinput-Traps.html b/doc/groff.html.node/End_002dof_002dinput-Traps.html new file mode 100644 index 0000000..4dad1f2 --- /dev/null +++ b/doc/groff.html.node/End_002dof_002dinput-Traps.html @@ -0,0 +1,187 @@ + + + + + + +End-of-input Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.5 End-of-input Traps

    + + + +
    +
    Request: .em [name]
    +
    + + + + + +

    Set a trap at the end of input, calling macro name after the last +line of the last input file has been processed. If no argument is +given, any existing end-of-input trap is removed. +

    +

    For example, if the document had to have a section at the bottom of the +last page for someone to approve it, the em request could be +used. +

    +
    +
    .de approval
    +\c
    +.  ne 3v
    +.  sp (\\n[.t]u - 3v)
    +.  in +4i
    +.  lc _
    +.  br
    +Approved:\t\a
    +.  sp
    +Date:\t\t\a
    +..
    +.
    +.em approval
    +
    + +

    The \c in the above example needs explanation. For historical +reasons (compatibility with AT&T troff), the +end-of-input macro exits as soon as it causes a page break if no +partially collected line remains.111 +

    + + + + +

    Let us assume that there is no \c in the above approval +macro, that the page is full, and last output line has been broken with, +say, a br request. Because there is no more room, a ne +request at this point causes a page ejection, which in turn makes +troff exit immediately as just described. In most situations, +this is not desired; people generally want to format the input after +ne. +

    +

    To force processing of the whole end-of-input macro independently of +this behavior, it is thus advisable to (invisibly) ensure the existence +of a partially collected line (\c) whenever there is a chance +that a page break can happen. In the above example, invoking the +ne request ensures that there is room for the subsequent +formatted output on the same page, so we need insert \c only +once. +

    +

    The next example shows how to append three lines, then start a new page +unconditionally. Since ‘.ne 1 doesn’t give the desired +effect—there is always one line available or we are already at the +beginning of the next page—we temporarily increase the page length by +one line so that we can use ‘.ne 2. +

    +
    +
    .de EM
    +.pl +1v
    +\c
    +.ne 2
    +line one
    +.br
    +\c
    +.ne 2
    +line two
    +.br
    +\c
    +.ne 2
    +line three
    +.br
    +.pl -1v
    +\c
    +'bp
    +..
    +.em EM
    +
    + +

    This specific feature affects only the first potential page break caused +by the end-of-input macro; further page breaks emitted by the macro are +handled normally. +

    +

    Another possible use of the em request is to make GNU +troff emit a single large page instead of multiple pages. For +example, one may want to produce a long plain text file for reading +in a terminal or emulator without page footers and headers interrupting +the body of the document. One approach is to set the page length at the +beginning of the document to a very large value to hold all the +text,112 and +automatically adjust it to the exact height of the document after the +text has been output. +

    +
    +
    .de adjust-page-length
    +.  br
    +.  pl \\n[nl]u \" \n[nl]: current vertical position
    +..
    +.
    +.de single-page-mode
    +.  pl 99999
    +.  em adjust-page-length
    +..
    +.
    +.\" Activate the above code if configured.
    +.if \n[do-continuous-rendering] \
    +.  single-page-mode
    +
    + +

    Since only one end-of-input trap exists and another macro package may +already use it, care must be taken not to break the mechanism. A simple +solution would be to append the above macro to the macro package’s +end-of-input macro using the am request. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Environment.html b/doc/groff.html.node/Environment.html new file mode 100644 index 0000000..cd92fd5 --- /dev/null +++ b/doc/groff.html.node/Environment.html @@ -0,0 +1,151 @@ + + + + + + +Environment (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.2 Environment

    + + + +

    There are also several environment variables (of the operating system, +not within gtroff) that can modify the behavior of groff. +

    +
    +
    GROFF_BIN_PATH
    +

    This search path, followed by PATH, is used for commands executed +by groff. +

    +
    +
    GROFF_COMMAND_PREFIX
    +
    + +

    If this is set to X, then groff runs +Xtroff instead of gtroff. This also applies +to tbl, pic, eqn, grn, +chem, refer, and soelim. It does not +apply to grops, grodvi, grotty, +pre-grohtml, post-grohtml, preconv, +grolj4, gropdf, and gxditview. +

    +

    The default command prefix is determined during the installation +process. If a non-GNU troff system is found, prefix ‘g’ is +used, none otherwise. +

    +
    +
    GROFF_ENCODING
    +

    The value of this variable is passed to the preconv +preprocessor’s -e option to select the character encoding of +input files. This variable’s existence implies the groff option +-k. If set but empty, groff calls preconv +without an -e option. groff’s -K option +overrides GROFF_ENCODING. See the preconv(7) man page; +type ‘man preconv’ at the command line to view it. +

    +
    +
    GROFF_FONT_PATH
    +

    A list of directories in which to seek the selected output device’s +directory of device and font description files. GNU troff +will search directories given as arguments to any specified -F +options before these, and a built-in list of directories after them. +See Font Directories and the troff(1) or +gtroff(1) man pages. +

    +
    +
    GROFF_TMAC_PATH
    +

    A list of directories in which to seek macro files. GNU troff +will search directories given as arguments to any specified -M +options before these, and a built-in list of directories after them. +See Macro Directories and the troff(1) or +gtroff(1) man pages. +

    +
    +
    GROFF_TMPDIR
    +
    +

    The directory in which groff creates temporary files. If this is +not set and TMPDIR is set, temporary files are created in that +directory. Otherwise temporary files are created in a system-dependent +default directory (on Unix and GNU/Linux systems, this is usually +/tmp). grops, grefer, pre-grohtml, and +post-grohtml can create temporary files in this directory. +

    +
    +
    GROFF_TYPESETTER
    +

    Sets the default output device. If empty or not set, a build-time +default (often ps) is used. The -Tdev option +overrides GROFF_TYPESETTER. +

    +
    +
    SOURCE_DATE_EPOCH
    +

    A timestamp (expressed as seconds since the Unix epoch) to use as the +output creation timestamp in place of the current time. The time is +converted to human-readable form using localtime(3) when the +formatter starts up and stored in registers usable by documents and +macro packages (see Built-in Registers). +

    +
    +
    TZ
    +

    The time zone to use when converting the current time (or value of +SOURCE_DATE_EPOCH) to human-readable form; see +tzset(3). +

    +
    + +

    MS-DOS and MS-Windows ports of groff use semicolons, rather than +colons, to separate the directories in the lists described above. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Environments.html b/doc/groff.html.node/Environments.html new file mode 100644 index 0000000..489ee62 --- /dev/null +++ b/doc/groff.html.node/Environments.html @@ -0,0 +1,250 @@ + + + + + + +Environments (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.31 Environments

    + + +

    As discussed in Deferring Output, environments store most of the +parameters that determine the appearance of text. A default environment +named ‘0’ exists when GNU troff starts up; it is modified by +formatting-related requests and escape sequences. +

    + +

    You can create new environments and switch among them. Only one is +current at any given time. Active environments are managed using a +stack, a data structure supporting “push” and “pop” +operations. The current environment is at the top of the stack. +The same environment name can be pushed onto the stack multiple times, +possibly interleaved with others. Popping the environment stack does +not destroy the current environment; it remains accessible by name and +can be made current again by pushing it at any time. Environments +cannot be renamed or deleted, and can only be modified when current. To +inspect the environment stack, use the pev request; see +Debugging. +

    +

    Environments store the following information. +

    +
      +
    • a partially collected line, if any + +
    • data about the most recently output glyph and line (registers +.cdp, .cht, .csk, .n, .w) + +
    • typeface parameters (size, family, style, height and slant, inter-word +and inter-sentence space sizes) + +
    • page parameters (line length, title length, vertical spacing, line +spacing, indentation, line numbering, centering, right-alignment, +underlining, hyphenation parameters) + +
    • filling enablement; adjustment enablement and mode + +
    • tab stops; tab, leader, escape, control, no-break control, hyphenation, +and margin characters + +
    • input line traps + +
    • stroke and fill colors +
    + +
    +
    Request: .ev [ident]
    +
    +
    Register: \n[.ev]
    +
    + + + +

    Enter the environment ident, which is created if it does not +already exist, using the same parameters as for the default environment +used at startup. With no argument, GNU troff switches to the +previous environment. +

    +

    Invoking ev with an argument puts environment ident onto +the top of the environment stack. (If it isn’t already present in the +stack, this is a proper push.) Without an argument, ev pops the +environment stack, making the previous environment current. It is an +error to pop the environment stack with no previous environment +available. The read-only string-valued register .ev contains the +name of the current environment—the one at the top of the stack. +

    +
    +
    .ev footnote-env
    +.fam N
    +.ps 6
    +.vs 8
    +.ll -.5i
    +.ev
    +
    +
    +
    +.ev footnote-env
    +\[dg] Observe the smaller text and vertical spacing.
    +.ev
    +
    + +

    We can familiarize ourselves with stack behavior by wrapping the +ev request with a macro that reports the contents of the +.ev register to the standard error stream. +

    +
    +
    .de EV
    +.  ev \\$1
    +.  tm environment is now \\n[.ev]
    +..
    +.
    +.EV foo
    +.EV bar
    +.EV
    +.EV baz
    +.EV
    +.EV
    +.EV
    +
    + +
    +
        error→ environment is now foo
    +    error→ environment is now bar
    +    error→ environment is now foo
    +    error→ environment is now baz
    +    error→ environment is now foo
    +    error→ environment is now 0
    +    error→ error: environment stack underflow
    +    error→ environment is now 0
    +
    + +
    + +
    +
    Request: .evc environment
    +
    + + +

    Copy the contents of environment to the current environment. +

    +

    The following environment data are not copied. +

    +
      +
    • a partially collected line, if present; + +
    • the interruption status of the previous input line (due to use of the +\c escape sequence); + +
    • the count of remaining lines to center, to right-justify, or to +underline (with or without underlined spaces)—these are set to zero; + +
    • the activation status of temporary indentation; + +
    • input line traps and their associated data; + +
    • the activation status of line numbering (which can be reactivated with +‘.nm +0); and + +
    • the count of consecutive hyphenated lines (set to zero). +
    +
    + +
    +
    Register: \n[.w]
    +
    +
    Register: \n[.cht]
    +
    +
    Register: \n[.cdp]
    +
    +
    Register: \n[.csk]
    +
    + + + + + + + +

    The \n[.w] register contains the width of the last glyph +formatted in the environment. +

    +

    The \n[.cht] register contains the height of the last glyph +formatted in the environment. +

    +

    The \n[.cdp] register contains the depth of the last glyph +formatted in the environment. It is positive for glyphs extending below +the baseline. +

    +

    The \n[.csk] register contains the skew (how far to the +right of the glyph’s center that GNU troff should place an +accent) of the last glyph formatted in the environment. +

    + +
    +
    Register: \n[.n]
    +
    + + + + +

    The \n[.n] register contains the length of the previous output +line emitted in the environment. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Escape-Sequence-Index.html b/doc/groff.html.node/Escape-Sequence-Index.html new file mode 100644 index 0000000..19e5a61 --- /dev/null +++ b/doc/groff.html.node/Escape-Sequence-Index.html @@ -0,0 +1,162 @@ + + + + + + +Escape Sequence Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix C Escape Sequence Index

    + +

    The escape character, \ by default, is always followed by at +least one more input character, making an escape sequence. Any +input token \X with X not in the list below emits a +warning and interpolates glyph X. Note the entries for \., +which may be obscured by the leader dots, and for \RET and +\SP, which are sorted alphabetically, not by code point +order. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    \
    \: Using Escape Sequences
    \: Using Symbols
    \!: Diversions
    \": Comments
    \#: Comments
    \$: Parameters
    \$*: Parameters
    \$0: Parameters
    \$@: Parameters
    \$^: Parameters
    \%: Manipulating Hyphenation
    \&: Dummy Characters
    \': Using Symbols
    \(: Using Symbols
    \): Dummy Characters
    \*: Strings
    \,: Italic Corrections
    \-: Using Symbols
    \.: Copy Mode
    \/: Italic Corrections
    \0: Page Motions
    \:: Manipulating Hyphenation
    \?: Diversions
    \A: Identifiers
    \a: Leaders
    \B: Numeric Expressions
    \b: Drawing Geometric Objects
    \c: Line Continuation
    \C: Using Symbols
    \d: Page Motions
    \D: Drawing Geometric Objects
    \e: Using Escape Sequences
    \E: Copy Mode
    \f: Selecting Fonts
    \F: Font Families
    \g: Assigning Register Formats
    \H: Artificial Fonts
    \h: Page Motions
    \k: Page Motions
    \l: Drawing Geometric Objects
    \L: Drawing Geometric Objects
    \m: Colors
    \M: Colors
    \n: Interpolating Registers
    \n: Auto-increment
    \N: Using Symbols
    \newline: Line Continuation
    \o: Page Motions
    \O: Suppressing Output
    \p: Manipulating Filling and Adjustment
    \R: Setting Registers
    \R: Setting Registers
    \r: Page Motions
    \RET: Line Continuation
    \S: Artificial Fonts
    \s: Changing the Type Size
    \SP: Page Motions
    \space: Page Motions
    \t: Tabs and Fields
    \u: Page Motions
    \v: Page Motions
    \V: I/O
    \w: Page Motions
    \x: Manipulating Spacing
    \X: Postprocessor Access
    \Y: Postprocessor Access
    \z: Page Motions
    \Z: Page Motions
    \[: Using Symbols
    \\: Copy Mode
    \^: Page Motions
    \_: Using Symbols
    \`: Using Symbols
    \{: Conditional Blocks
    \{: Conditional Blocks
    \|: Page Motions
    \}: Conditional Blocks
    \~: Manipulating Filling and Adjustment

    +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Fields.html b/doc/groff.html.node/Fields.html new file mode 100644 index 0000000..6e1754a --- /dev/null +++ b/doc/groff.html.node/Fields.html @@ -0,0 +1,98 @@ + + + + + + +Fields (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.12.2 Fields

    + + + + + + + + +

    Fields are a more general way of laying out tabular data. A field +is defined as the data between a pair of delimiting characters. +It contains substrings that are separated by padding characters. +The width of a field is the distance on the input line from the +position where the field starts to the next tab stop. A padding +character inserts an adjustable space similar to TeX’s \hss +command (thus it can even be negative) to make the sum of all substring +lengths plus the adjustable space equal to the field width. If more +than one padding character is inserted, the available space is evenly +distributed among them. +

    +
    +
    Request: .fc [delim-char [padding-char]]
    +
    +

    Define a delimiting and a padding character for fields. If the latter +is missing, the padding character defaults to a space character. If +there is no argument at all, the field mechanism is disabled (which is +the default). In contrast to, e.g., the tab repetition character, +delimiting and padding characters are not associated with the +environment (see Environments). +

    +
    +
    .fc # ^
    +.ta T 3i
    +#foo^bar^smurf#
    +.br
    +#foo^^bar^smurf#
    +    ⇒ foo         bar          smurf
    +    ⇒ foo            bar       smurf
    +
    +
    + + + +
    + + + + + diff --git a/doc/groff.html.node/File-Formats.html b/doc/groff.html.node/File-Formats.html new file mode 100644 index 0000000..c5d4d54 --- /dev/null +++ b/doc/groff.html.node/File-Formats.html @@ -0,0 +1,62 @@ + + + + + + +File Formats (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6 File Formats

    + + + +

    All files read and written by gtroff are text files. The +following two sections describe their format. +

    + + + + + +
    + + + + + diff --git a/doc/groff.html.node/File-Keyword-Index.html b/doc/groff.html.node/File-Keyword-Index.html new file mode 100644 index 0000000..348d292 --- /dev/null +++ b/doc/groff.html.node/File-Keyword-Index.html @@ -0,0 +1,215 @@ + + + + + + +File Keyword Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix H File Keyword Index

    + +
    +
    Jump to:   # +   +- +   +
    +B +   +C +   +F +   +H +   +I +   +K +   +L +   +N +   +P +   +R +   +S +   +T +   +U +   +V +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    #
    #: DESC File Format
    #: Font Description File Format

    -
    ---: Font Description File Format

    B
    biggestfont: DESC File Format

    C
    charset: DESC File Format
    charset: Font Description File Format

    F
    family: Selecting Fonts
    family: DESC File Format
    fonts: Using Symbols
    fonts: Special Fonts
    fonts: DESC File Format

    H
    hor: DESC File Format

    I
    image_generator: DESC File Format

    K
    kernpairs: Font Description File Format

    L
    ligatures: Font Description File Format

    N
    name: Font Description File Format

    P
    paperlength: DESC File Format
    papersize: DESC File Format
    paperwidth: DESC File Format
    pass_filenames: DESC File Format
    postpro: DESC File Format
    prepro: DESC File Format
    print: DESC File Format

    R
    res: DESC File Format

    S
    sizes: DESC File Format
    sizescale: DESC File Format
    slant: Font Description File Format
    spacewidth: Font Description File Format
    spare1: DESC File Format
    spare2: DESC File Format
    special: Artificial Fonts
    special: Font Description File Format
    styles: Selecting Fonts
    styles: Font Families
    styles: DESC File Format

    T
    tcommand: DESC File Format

    U
    unicode: DESC File Format
    unitwidth: DESC File Format
    unscaled_charwidths: DESC File Format
    use_charnames_in_special: Postprocessor Access
    use_charnames_in_special: DESC File Format

    V
    vert: DESC File Format

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Filling.html b/doc/groff.html.node/Filling.html new file mode 100644 index 0000000..f6db6f3 --- /dev/null +++ b/doc/groff.html.node/Filling.html @@ -0,0 +1,79 @@ + + + + + + +Filling (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.1 Filling

    + +

    When GNU troff starts up, it obtains information about the device +for which it is preparing output.18 An essential property is the length of the output +line, such as “6.5 inches”. +

    + + +

    GNU troff interprets plain text files employing the Unix +line-ending convention. It reads input a character at a time, +collecting words as it goes, and fits as many words together on an +output line as it can—this is known as filling. To GNU +troff, a word is any sequence of one or more characters +that aren’t spaces or newlines. The exceptions separate +words.19 To disable filling, see +Manipulating Filling and Adjustment. +

    +
    +
    It is a truth universally acknowledged
    +that a single man in possession of a
    +good fortune must be in want of a wife.
    +    ⇒ It is a truth universally acknowledged that a
    +    ⇒ single man in possession of a good fortune must
    +    ⇒ be in want of a wife.
    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Font-Description-File-Format.html b/doc/groff.html.node/Font-Description-File-Format.html new file mode 100644 index 0000000..a44cf20 --- /dev/null +++ b/doc/groff.html.node/Font-Description-File-Format.html @@ -0,0 +1,280 @@ + + + + + + +Font Description File Format (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.2.2 Font Description File Format

    + + + + + +

    On typesetting output devices, each font is typically available at +multiple sizes. While paper measurements in the device description file +are in absolute units, measurements applicable to fonts must be +proportional to the type size. groff achieves this using the +precedent set by AT&T device-independent troff: one +font size is chosen as a norm, and all others are scaled linearly +relative to that basis. The “unit width” is the number of basic units +per point when the font is rendered at this nominal size. +

    +

    For instance, groff’s lbp device uses a unitwidth +of 800. Its Times roman font ‘TR’ has a spacewidth +of 833; this is also the width of its comma, period, centered +period, and mathematical asterisk, while its ‘M’ is 2,963 basic +units. Thus, an ‘M’ on the lbp device is 2,963 basic units +wide at a notional type size of 800 points.126 +

    +

    A font description file has two sections. The first is a sequence of +directives, and is parsed similarly to the DESC file described +above. Except for the directive names that begin the second section, +their ordering is immaterial. Later directives of the same name +override earlier ones, spaces and tabs are handled in the same way, + + + +and the same comment syntax is supported. Empty lines are ignored +throughout. +

    +
    +
    name f
    +

    The name of the font is f. ‘DESC’ is an invalid font +name. Simple integers are valid, but their use is +discouraged.127 +

    +
    +
    spacewidth n
    +

    The width of an unadjusted inter-word space is n basic units. +

    +
    + +

    The directives above must appear in the first section; those below are +optional. +

    +
    +
    slant n
    +

    The font’s glyphs have a slant of n degrees; a positive +n slants in the direction of text flow. +

    +
    +
    ligatures lig1 lign [0]
    +

    Glyphs lig1, …, lign are ligatures; possible ligatures +are ‘ff’, ‘fi’, ‘fl’, ‘ffi’ and ‘ffl’. For +compatibility with other troff implementations, the list of +ligatures may be terminated with a 0. The list of ligatures +must not extend over more than one line. +

    +
    +
    special
    +
    +

    The font is special: when a glyph is requested that is not present +in the current font, it is sought in any mounted fonts that bear this +property. +

    +
    + +

    Other directives in this section are ignored by GNU troff, but +may be used by postprocessors to obtain further information about the +font. +

    +

    The second section contains one or two subsections. These can appear in +either order; the first one encountered commences the second section. +Each starts with a directive on a line by itself. A charset +subsection is mandatory unless the associated DESC file contains +the unicode directive. Another subsection, kernpairs, +is optional. +

    + +

    The directive charset starts the character set +subsection.128 It precedes a series +of glyph descriptions, one per line. Each such glyph description +comprises a set of fields separated by spaces or tabs and organized as +follows. +

    +
    +

    name metrics type code [entity-name] +[-- comment] +

    + + + + + + + + +

    name identifies the glyph: +if name is a printable character c, it corresponds to +the troff ordinary character c. If name is a +multi-character sequence not beginning with \, it corresponds to +the GNU troff special character escape sequence +‘\[name]’. A name consisting of three minus signs, +‘---’, is special and indicates that the glyph is unnamed: such +glyphs can be accessed only by the \N escape sequence in +troff. A special character named ‘---’ can still be defined +using char and similar requests. The name\-’ +defines the minus sign glyph. Finally, name can be the +unbreakable one-sixth and one-twelfth space escape sequences, \| +and \^ (“thin” and “hair” spaces, respectively), in which +case only the width metric described below is interpreted; a font can +thus customize the widths of these spaces. +

    +

    The form of the metrics field is as follows. +

    +
    +
    width[,[height[,[depth[,[italic-correction
    +  [,[left-italic-correction[,[subscript-correction]]]]]]]]]]
    +
    + +

    There must not be any spaces, tabs, or newlines between these +subfields (which have been split here into two lines only for +better legibility). The subfields are in basic units expressed as +decimal integers. Unspecified subfields default to 0. +Since there is no associated binary format, these values are not +required to fit into the C language data type ‘char’ as they are in +AT&T device-independent troff. +

    +

    The width subfield gives the width of the glyph. The height +subfield gives the height of the glyph (upward is positive); if a glyph +does not extend above the baseline, it should be given a zero height, +rather than a negative height. The depth subfield gives the depth +of the glyph, that is, the distance below the baseline to which the +glyph extends (downward is positive); if a glyph does not extend below +the baseline, it should be given a zero depth, rather than a negative +depth. Italic corrections are relevant to glyphs in italic or oblique +styles. The italic-correction is the amount of space that should +be added after an oblique glyph to be followed immediately by an upright +glyph. The left-italic-correction is the amount of space that +should be added before an oblique glyph to be preceded immediately by an +upright glyph. The subscript-correction is the amount of space +that should be added after an oblique glyph to be followed by a +subscript; it should be less than the italic correction. +

    +

    For fonts used with typesetting devices, the type field gives a +featural description of the glyph: it is a bit mask recording whether +the glyph is an ascender, descender, both, or neither. When a \w +escape sequence is interpolated, these values are bitwise or-ed +together for each glyph and stored in the nr register. In font +descriptions for terminal devices, all glyphs might have a type of zero, +regardless of their appearance. +

    +
    +
    0
    +

    means the glyph lies entirely between the baseline and a horizontal line +at the “x-height” of the font; typical examples are ‘a’, +‘c’, and ‘x’; +

    +
    +
    1
    +

    means the glyph descends below the baseline, like ‘p’; +

    +
    +
    2
    +

    means the glyph ascends above the font’s x-height, like ‘A’ or +‘b’; and +

    +
    +
    3
    +

    means the glyph is both an ascender and a descender—this is true of +parentheses in some fonts. +

    +
    + +

    The code field gives a numeric identifier that the postprocessor +uses to render the glyph. The glyph can be specified to troff +using this code by means of the \N escape sequence. code +can be any integer.129 +

    +

    The entity-name field defines an identifier for the glyph that the +postprocessor uses to print the GNU troff glyph name. This +field is optional; it was introduced so that the grohtml output +driver could encode its character set. For example, the glyph +‘\[Po]’ is represented by ‘&pound;’ in HTML 4.0. +For efficiency, these data are now compiled directly into +grohtml. grops uses the field to build sub-encoding +arrays for PostScript fonts containing more than 256 glyphs. Anything +on the line after the entity-name field or ‘--’ is ignored. +

    +

    A line in the charset section can also have the form +

    +
    +
    name "
    +
    + +

    identifying name as another name for the glyph mentioned in the +preceding line. Such aliases can be chained. +

    + +

    The directive kernpairs starts a list of kerning adjustments to +be made to adjacent glyph pairs from this font. It contains a sequence +of lines formatted as follows. +

    +
    +
    g1 g2 n
    +
    + +

    The foregoing means that when glyph g1 is typeset immediately +before g2, the space between them should be increased +by n. Most kerning pairs should have a negative value +for n. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Font-Directories.html b/doc/groff.html.node/Font-Directories.html new file mode 100644 index 0000000..89cb39d --- /dev/null +++ b/doc/groff.html.node/Font-Directories.html @@ -0,0 +1,113 @@ + + + + + + +Font Directories (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.4 Font Directories

    + + + + + +

    groff enforces few restrictions on how font description files are +named. For its family/style mechanism to work (see Font Families), +the names of fonts within a family should start with the family name, +followed by the style. For example, the Times family uses ‘T’ for +the family name and ‘R’, ‘B’, ‘I’, and ‘BI’ to +indicate the styles ‘roman’, ‘bold’, ‘italic’, and ‘bold italic’, +respectively. Thus the final font names are ‘TR’, ‘TB’, +‘TI’, and ‘TBI’. +

    + + +

    Font description files are kept in font directories, which +together constitute the font path. The search procedure +always appends the directory devname, where name is +the name of the output device. Assuming TeX DVI output, and +/foo/bar as a font directory, the font description files for +grodvi must be in /foo/bar/devdvi. +Each directory in the font path is searched in the following order until +the desired font description file is found or the list is exhausted. +

    +
      +
    • Directories specified with GNU troff’s or groff’s +-f command-line option. All output drivers (and some +preprocessors) support this option as well, because they require +information about the glyphs to be rendered in the document. + +
    • +Directories listed in the GROFF_FONT_PATH environment variable. + +
    • + +A site-local directory and the main font description directory. +The locations corresponding to your installation are listed in section +“Environment” of gtroff(1). If not otherwise configured, +they are as follows. + +
      +
      /usr/local/share/groff/site-font
      +/usr/local/share/groff/1.23.0/font
      +
      + +

      The foregoing assumes that the version of groff is 1.23.0, and +that the installation prefix was /usr/local. It is possible to +fine-tune these locations during the source configuration process. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Font-Families.html b/doc/groff.html.node/Font-Families.html new file mode 100644 index 0000000..f631c1a --- /dev/null +++ b/doc/groff.html.node/Font-Families.html @@ -0,0 +1,182 @@ + + + + + + +Font Families (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.2 Font Families

    + + + + + +

    To accommodate the wide variety of fonts available, GNU troff +distinguishes font families and font styles. A resolved +font name is the catenation of a font family and a style. Selecting an +abstract style causes GNU troff to combine it with the default +font family. +

    +

    You can thus compose a document using abstract styles exclusively for +its body or running text, selecting a specific family only for titles or +examples, for instance, and change the default family on the command +line (recall Options). +

    +

    Fonts for the devices ps, pdf, dvi, lj4, +lbp, and the X11 devices support this mechanism. By default, +GNU troff uses the Times family with the four styles ‘R’, +‘I’, ‘B’, and ‘BI’. +

    +
    +
    Request: .fam [family]
    +
    +
    Register: \n[.fam]
    +
    +
    Escape sequence: \Ff
    +
    +
    Escape sequence: \F(fm
    +
    Escape sequence: \F[family]
    +
    + +

    Set the default font family, used in combination with abstract styles to +construct a resolved font name, to family (one-character +name f, two-character name fm). If no argument is +given, GNU troff selects the previous font family; if there none, +is it falls back to the device’s default76 or its own (‘T’). +

    +

    The \F escape sequence works similarly. In disanalogy to +\f, ‘\FP’ makes ‘P’ the default family. Use +‘\F[]’ to select the previous default family. The default font +family is available in the read-only string-valued register .fam; +it is associated with the environment (see Environments). +

    +
    +
    spam,     \" startup defaults are T (Times) R (roman)
    +.fam H    \" make Helvetica the default family
    +spam,     \" family H + style R = HR
    +.ft B     \" family H + style B = HB
    +spam,
    +.ft CR    \" Courier roman (default family not changed)
    +spam,
    +.ft       \" back to Helvetica bold
    +spam,
    +.fam T    \" make Times the default family
    +spam,     \" family T + style B = TB
    +.ft AR    \" font AR (not a style)
    +baked beans,
    +.ft R     \" family T + style R = TR
    +and spam.
    +
    + +

    \F doesn’t produce an input token in GNU troff. As a +consequence, it can be used in requests like mc (which expects +a single character as an argument) to change the font family on the fly. +

    +
    +
    .mc \F[P]x\F[]
    +
    +
    + +
    +
    Request: .sty n style
    +
    +
    Register: \n[.sty]
    +
    + + + + + + + + + +

    Associate an abstract style style with mounting +position n, which must be a non-negative integer. If the +requests cs, bd, tkf, uf, or fspecial +are applied to an abstract style, they are instead applied to the member +of the current family corresponding to that style. +

    + + +

    The default family can be set with the -f option (see Options). The styles command in the DESC file controls +which font positions (if any) are initially associated with abstract +styles rather than fonts. +

    +

    Caution: The style argument is not validated. +Errors may occur later, when the formatter attempts to construct a +resolved font name, or format a character for output. +

    +
    +
    .nr BarPos \n[.fp]
    +.sty \n[.fp] Bar
    +.fam Foo
    +.ft \n[BarPos]
    +.tm .f=\n[.f]
    +A
    +    error→ error: no font family named 'Foo' exists
    +    error→ .f=41
    +    error→ error: cannot format glyph: no current font
    +
    + +

    When an abstract style has been selected, the read-only string-valued +register ‘.sty’ interpolates its name; this datum is associated +with the environment (see Environments). Otherwise, ‘.sty’ +interpolates nothing. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Font-Positions.html b/doc/groff.html.node/Font-Positions.html new file mode 100644 index 0000000..387b4bb --- /dev/null +++ b/doc/groff.html.node/Font-Positions.html @@ -0,0 +1,138 @@ + + + + + + +Font Positions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.3 Font Positions

    + + + +

    To support typeface indirection through abstract styles, and for +compatibility with AT&T troff, the formatter maintains +a list of font positions at which fonts required by a document are +mounted. An output device’s description file DESC +typically configures a set of pre-mounted fonts; see Device and Font Description Files. A font need not be explicitly mounted before +it is selected; GNU troff will search GROFF_FONT_PATH for +it by name and mount it at the first free mounting position on demand. +

    +
    +
    Request: .fp pos id [font-description-file-name]
    +
    +
    Register: \n[.f]
    +
    +
    Register: \n[.fp]
    +
    + + +

    Mount a font under the name id at mounting position pos, a +non-negative integer. When the formatter starts up, it reads the output +device’s description to mount an initial set of faces, and selects font +position 1. Position 0 is unused by default. Unless the +font-description-file-name argument is given, id should be +the name of a font description file stored in a directory corresponding +to the selected output device. GNU troff does not traverse +directories to locate the font description file. +

    + + +

    The optional third argument enables font names to be aliased, which can +be necessary in compatibility mode since AT&T troff syntax +affords no means of identifying fonts with names longer than two +characters, like ‘TBI’ or ‘ZCMI’, in a font selection escape +sequence. See Compatibility Mode. You can also alias fonts on +mounting for convenience or abstraction. (See below regarding the +.fp register.) +

    +
    +
    .fp \n[.fp] SC ZCMI
    +Send a \f(SChand-written\fP thank-you note.
    +.fp \n[.fp] Emph TI
    +.fp \n[.fp] Strong TB
    +Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]?
    +
    + +

    DESC’, ‘P’, and non-negative integers are not usable as font +identifiers. +

    + +

    The position of the currently selected font (or abstract style) is +available in the read-only register ‘.f’. It is associated with +the environment (see Environments). +

    +

    You can copy the value of .f to another register to save it for +later use. +

    +
    +
    .nr saved-font \n[.f]
    +text involving many font changes
    +.ft \n[saved-font]
    +
    + + +

    The index of the next (non-zero) free font position is available in the +read-only register ‘.fp’. + +Fonts not listed in the DESC file are automatically mounted at +position ‘\n[.fp]’ when selected with the ft request or +\f escape sequence. When mounting a font at a position +explicitly with the fp request, this same practice should be +followed, although GNU troff does not enforce this strictly. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Font-and-Size-Changes.html b/doc/groff.html.node/Font-and-Size-Changes.html new file mode 100644 index 0000000..d8319bf --- /dev/null +++ b/doc/groff.html.node/Font-and-Size-Changes.html @@ -0,0 +1,56 @@ + + + + + + +Font and Size Changes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.11 Font and Size Changes

    + +

    The formatter’s requests and escape sequences for setting the typeface +and size are not always intuitive, so all macro packages provide macros +to make these operations simpler. They also make it more convenient to +change typefaces in the middle of a word and can handle italic +corrections automatically. See Italic Corrections. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Footnotes-and-Endnotes.html b/doc/groff.html.node/Footnotes-and-Endnotes.html new file mode 100644 index 0000000..82d14e7 --- /dev/null +++ b/doc/groff.html.node/Footnotes-and-Endnotes.html @@ -0,0 +1,60 @@ + + + + + + +Footnotes and Endnotes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.6 Footnotes and Endnotes

    + + + +

    Footnotes and endnotes are forms of delayed +formatting. They are recorded at their points of relevance in +the input, but not formatted there. Instead, a mark cues the +reader to check the “foot”, or bottom, of the current page, or in the +case of endnotes, an annotation list later in the document. Macro +packages that support these features also supply a means of +automatically numbering either type of annotation. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Formatter-Instructions.html b/doc/groff.html.node/Formatter-Instructions.html new file mode 100644 index 0000000..b6527ad --- /dev/null +++ b/doc/groff.html.node/Formatter-Instructions.html @@ -0,0 +1,83 @@ + + + + + + +Formatter Instructions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6 Formatter Instructions

    + + + +

    To support documents that require more than filling, automatic line +breaking and hyphenation, adjustment, and supplemental inter-sentence +space, the roff language offers two means of embedding +instructions to the formatter. +

    + +

    One is a request, which begins with a control character and takes +up the remainder of the input line. Requests often perform relatively +large-scale operations such as setting the page length, breaking the +line, or starting a new page. They also conduct internal operations +like defining macros. +

    + + +

    The other is an escape sequence, which begins with the escape +character and can be embedded anywhere in the input, even in arguments +to requests and other escape sequences. Escape sequences interpolate +special characters, strings, or registers, and handle comparatively +minor formatting tasks like sub- and superscripting. +

    +

    Some operations, such as font selection and type size alteration, are +available via both requests and escape sequences. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/GNU-troff-Reference.html b/doc/groff.html.node/GNU-troff-Reference.html new file mode 100644 index 0000000..396d40a --- /dev/null +++ b/doc/groff.html.node/GNU-troff-Reference.html @@ -0,0 +1,99 @@ + + + + + + +GNU troff Reference (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/groff.html.node/Graphics-Commands.html b/doc/groff.html.node/Graphics-Commands.html new file mode 100644 index 0000000..87a856c --- /dev/null +++ b/doc/groff.html.node/Graphics-Commands.html @@ -0,0 +1,247 @@ + + + + + + +Graphics Commands (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2.3 Graphics Commands

    + +

    Each graphics or drawing command in the intermediate output starts with +the letter ‘D’, followed by one or two characters that specify a +subcommand; this is followed by a fixed or variable number of integer +arguments that are separated by a single space character. A ‘D’ +command may not be followed by another command on the same line (apart +from a comment), so each ‘D’ command is terminated by a syntactical +line break. +

    +

    gtroff output follows the classical spacing rules (no space +between command and subcommand, all arguments are preceded by a single +space character), but the parser allows optional space between the +command letters and makes the space before the first argument optional. +As usual, each space can be any sequence of tab and space characters. +

    +

    Some graphics commands can take a variable number of arguments. In this +case, they are integers representing a size measured in basic units +‘u’. The arguments called h1, h2, …, hn +stand for horizontal distances where positive means right, negative +left. The arguments called v1, v2, …, vn stand +for vertical distances where positive means down, negative up. All +these distances are offsets relative to the current location. +

    +

    Each graphics command directly corresponds to a similar gtroff +\D escape sequence. See Drawing Geometric Objects. +

    +

    Unknown ‘D’ commands are assumed to be device-specific. Its +arguments are parsed as strings; the whole information is then sent to +the postprocessor. +

    +

    In the following command reference, the syntax element ‹line +break› means a syntactical line break as defined above. +

    +
    +
    D~ h1 v1 h2 v2hn vnline break
    +

    Draw B-spline from current position to offset (h1,v1), then +to offset (h2,v2), if given, etc., up to +(hn,vn). This command takes a variable number of argument +pairs; the current position is moved to the terminal point of the drawn +curve. +

    +
    +
    Da h1 v1 h2 v2line break
    +

    Draw arc from current position to +(h1,v1)+(h2,v2) with center at +(h1,v1); then move the current position to the final point +of the arc. +

    +
    +
    DC dline break
    +
    DC d dummy-argline break
    +

    Draw a solid circle using the current fill color with +diameter d (integer in basic units ‘u’) with leftmost +point at the current position; then move the current position to the +rightmost point of the circle. An optional second integer argument is +ignored (this allows the formatter to generate an even number of +arguments). This command is a gtroff extension. +

    +
    +
    Dc dline break
    +

    Draw circle line with diameter d (integer in basic units +‘u’) with leftmost point at the current position; then move the +current position to the rightmost point of the circle. +

    +
    +
    DE h vline break
    +

    Draw a solid ellipse in the current fill color with a horizontal +diameter of h and a vertical diameter of v (both +integers in basic units ‘u’) with the leftmost point at the current +position; then move to the rightmost point of the ellipse. This command +is a gtroff extension. +

    +
    +
    De h vline break
    +

    Draw an outlined ellipse with a horizontal diameter of h and +a vertical diameter of v (both integers in basic units +‘u’) with the leftmost point at current position; then move to the +rightmost point of the ellipse. +

    +
    +
    DF color-scheme [component]line break
    +

    Set fill color for solid drawing objects using different color schemes; +the analogous command for setting the color of text, line graphics, and +the outline of graphic objects is ‘m’. The color components are +specified as integer arguments between 0 and 65535. The number of color +components and their meaning vary for the different color schemes. +These commands are generated by gtroff’s escape sequences +‘\D'F …'’ and \M (with no other corresponding +graphics commands). No position changing. This command is a +gtroff extension. +

    +
    +
    DFc cyan magenta yellowline break
    +

    Set fill color for solid drawing objects using the CMY color scheme, +having the 3 color components cyan, magenta, and +yellow. +

    +
    +
    DFd‹line break
    +

    Set fill color for solid drawing objects to the default fill color value +(black in most cases). No component arguments. +

    +
    +
    DFg grayline break
    +

    Set fill color for solid drawing objects to the shade of gray given by +the argument, an integer between 0 (black) and 65535 (white). +

    +
    +
    DFk cyan magenta yellow blackline break
    +

    Set fill color for solid drawing objects using the CMYK color scheme, +having the 4 color components cyan, magenta, +yellow, and black. +

    +
    +
    DFr red green blueline break
    +

    Set fill color for solid drawing objects using the RGB color scheme, +having the 3 color components red, green, and +blue. +

    +
    + +
    +
    Df nline break
    +

    The argument n must be an integer in the range -32767 +to 32767. +

    +
    +
    0 ≤ n ≤ 1000
    +

    Set the color for filling solid drawing objects to a shade of gray, +where 0 corresponds to solid white, 1000 (the default) to solid black, +and values in between to intermediate shades of gray; this is obsoleted +by command ‘DFg’. +

    +
    +
    n < 0 or n > 1000
    +

    Set the filling color to the color that is currently being used for the +text and the outline, see command ‘m’. For example, the command +sequence +

    +
    +
    mg 0 0 65535
    +Df -1
    +
    + +

    sets all colors to blue. +

    +
    + +

    No position changing. This command is a gtroff extension. +

    +
    +
    Dl h vline break
    +

    Draw line from current position to offset (h,v) (integers in +basic units ‘u’); then set current position to the end of the drawn +line. +

    +
    +
    Dp h1 v1 h2 v2hn vnline break
    +

    Draw a polygon line from current position to offset (h1,v1), +from there to offset (h2,v2), etc., up to offset +(hn,vn), and from there back to the starting position. For +historical reasons, the position is changed by adding the sum of all +arguments with odd index to the actual horizontal position and the even +ones to the vertical position. Although this doesn’t make sense it is +kept for compatibility. +This command is a gtroff extension. +

    +
    +
    DP h1 v1 h2 v2hn vnline break
    +

    Draw a solid polygon in the current fill color rather than an outlined +polygon, using the same arguments and positioning as the corresponding +‘Dp’ command. +This command is a gtroff extension. +

    +
    +
    Dt nline break
    +

    Set the current line thickness to n (an integer in basic +units ‘u’) if n>0; if n=0 select the +smallest available line thickness; if n<0 set the line +thickness proportional to the type size (this is the default before the +first ‘Dt’ command was specified). For historical reasons, the +horizontal position is changed by adding the argument to the actual +horizontal position, while the vertical position is not changed. +Although this doesn’t make sense it is kept for compatibility. +This command is a gtroff extension. +

    +
    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Groff-Options.html b/doc/groff.html.node/Groff-Options.html new file mode 100644 index 0000000..48ea5e5 --- /dev/null +++ b/doc/groff.html.node/Groff-Options.html @@ -0,0 +1,536 @@ + + + + + + +Groff Options (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.1 Options

    + + + + + + + + + + + + + +

    groff normally runs the gtroff program and a +postprocessor appropriate for the selected device. The default device +is ‘ps’ (but it can be changed when groff is configured and +built). It can optionally preprocess with any of gpic, +geqn, gtbl, ggrn, grap, gchem, +grefer, gsoelim, or preconv. +

    +

    This section documents only options to the groff front end. Many +of the arguments to groff are passed on to gtroff; +therefore, those are also included. Arguments to preprocessors and +output drivers can be found in the man pages gpic(1), +geqn(1), gtbl(1), ggrn(1), +grefer(1), gchem(1), gsoelim(1), +preconv(1), grotty(1), grops(1), +gropdf(1), grohtml(1), grodvi(1), +grolj4(1), grolbp(1), and gxditview(1). +

    +

    The command-line format for groff is: +

    +
    +
    groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -dcs ] [ -Darg ]
    +      [ -ffam ] [ -Fdir ] [ -Idir ] [ -Karg ]
    +      [ -Larg ] [ -mname ] [ -Mdir ] [ -nnum ]
    +      [ -olist ] [ -Parg ] [ -rcn ] [ -Tdev ]
    +      [ -wname ] [ -Wname ] [ files… ]
    +
    + +

    The command-line format for gtroff is as follows. +

    +
    +
    gtroff [ -abcivzCERU ] [ -dcs ] [ -ffam ] [ -Fdir ]
    +       [ -mname ] [ -Mdir ] [ -nnum ] [ -olist ]
    +       [ -rcn ] [ -Tname ] [ -wname ] [ -Wname ]
    +       [ files… ]
    +
    + +

    Obviously, many of the options to groff are actually passed on to +gtroff. +

    +

    Options without an argument can be grouped behind a +single -. A filename of - denotes the +standard input. Whitespace is permitted between an option and its +argument. +

    +

    The grog command can be used to guess the correct groff +command to format a file. See its man page grog(1); type +‘man grog’ at the command line to view it. +

    +

    groff’s command-line options are as follows. +

    + +
    +
    -a
    +

    Generate a plain text approximation of the typeset output. The +read-only register .A is set to 1. See Built-in Registers. This option produces a sort of abstract preview of the +formatted output. +

    +
      +
    • Page breaks are marked by a phrase in angle brackets; for example, +‘<beginning of page>’. + +
    • Lines are broken where they would be in the formatted output. + +
    • A horizontal motion of any size is represented as one space. Adjacent +horizontal motions are not combined. Inter-sentence space nodes (those +arising from the second argument to the ss request) are not +represented. + +
    • Vertical motions are not represented. + +
    • Special characters are rendered in angle brackets; for example, the +default soft hyphen character appears as ‘<hy>’. +
    + +

    The above description should not be considered a specification; the +details of -a output are subject to change. +

    +
    +
    -b
    +

    Write a backtrace reporting the state of gtroff’s input parser +to the standard error stream with each diagnostic message. The line +numbers given in the backtrace might not always be correct, because +gtroff’s idea of line numbers can be confused by requests that +append to +macros. +

    +
    +
    -c
    +

    Start with color output disabled. +

    +
    +
    -C
    +

    Enable AT&T troff compatibility mode; implies -c. +See Implementation Differences, for the list of incompatibilities +between groff and AT&T troff. +

    +
    +
    -dctext
    +
    -dstring=text
    +

    Define roff string c or string as t or +text. c must be one character; string can be +of arbitrary length. Such string assignments happen before any macro +file is loaded, including the startup file. Due to getopt_long +limitations, c cannot be, and string cannot contain, an +equals sign, even though that is a valid character in a roff +identifier. +

    +
    +
    -Denc
    +

    Set fallback input encoding used by preconv to enc; +implies -k. +

    +
    +
    -e
    +

    Run geqn preprocessor. +

    +
    +
    -E
    +

    Inhibit gtroff error messages. This option does not +suppress messages sent to the standard error stream by documents or +macro packages using tm or related requests. +

    +
    +
    -ffam
    +

    Use fam as the default font family. See Font Families. +

    +
    +
    -Fdir
    +

    Search in directory dir for the selected output device’s +directory of device and font description files. See the description of +GROFF_FONT_PATH in Environment below for the default search +locations and ordering. +

    +
    +
    -g
    +

    Run ggrn preprocessor. +

    +
    +
    -G
    +

    Run grap preprocessor; implies -p. +

    +
    +
    -h
    +

    Display a usage message and exit. +

    +
    +
    -i
    +

    Read the standard input after all the named input files have been +processed. +

    +
    +
    -Idir
    +

    Search the directory dir for files named in several contexts; +implies -g and -s. +

    +
      +
    • gsoelim replaces so requests with the contents of their +file name arguments. + +
    • gtroff searches for files named as operands in its command +line and as arguments to psbb, so, and soquiet +requests. + +
    • Output drivers may search for files; for instance, grops looks +for files named in ‘\X'ps: import '’, ‘\X'ps: file +'’, and ‘\X'pdf: pdfpic '’ device control +escape sequences. +
    + +

    This option may be specified more than once; the directories are +searched in the order specified. If you want to search the current +directory before others, add ‘-I .’ at the desired place. The +current working directory is otherwise searched last. -I works +similarly to, and is named for, the “include” option of Unix C +compilers. +

    +

    -I options are passed to gsoelim, gtroff, +and output drivers; with the flag letter changed to -M, they +are also passed to ggrn. +

    +
    +
    -j
    +

    Run gchem preprocessor. Implies -p. +

    +
    +
    -k
    +

    Run preconv preprocessor. Refer to its man page for its +behavior if neither of groff’s -K or -D +options is also specified. +

    +
    +
    -Kenc
    +

    Set input encoding used by preconv to enc; implies +-k. +

    +
    +
    -l
    +

    Send the output to a spooler for printing. The print directive +in the device description file specifies the default command to be used; +see Device and Font Description Files. +See options -L and -X. +

    +
    +
    -Larg
    +

    Pass arg to the print spooler program. If multiple args are +required, pass each with a separate -L option. groff +does not prefix an option dash to arg before passing it to the +spooler program. +

    +
    +
    -mname
    +

    Process the file name.tmac prior to any input files. +If not found, tmac.name is attempted. name +(in both arrangements) is presumed to be a macro file; see the +description of GROFF_TMAC_PATH in Environment below for the +default search locations and ordering. This option and its argument are +also passed to geqn, grap, and ggrn. +

    +
    +
    -Mdir
    +

    Search directory dir for macro files; see the description +of GROFF_TMAC_PATH in Environment below for the default +search locations and ordering. This option and its argument are also +passed to geqn, grap, and ggrn. +

    +
    +
    -nnum
    +

    Number the first page num. +

    +
    +
    -N
    +

    Prohibit newlines between eqn delimiters: pass -N to +geqn. +

    +
    +
    -olist
    +

    Output only pages in list, which is a comma-separated list of page +ranges; ‘n’ means page n, ‘m-n’ +means every page between m and n, ‘-n’ means +every page up to n, ‘n-’ means every page from +n on. gtroff stops processing and exits after +formatting the last page enumerated in list. +

    +
    +
    -p
    +

    Run gpic preprocessor. +

    +
    +
    -Parg
    +

    Pass arg to the postprocessor. If multiple args are +required, pass each with a separate -P option. groff +does not prefix an option dash to arg before passing it to the +postprocessor. +

    +
    +
    -rcnumeric-expression
    +
    -rregister=expr
    +

    Set roff register c or register to the value +numeric-expression (see Numeric Expressions). +c must be one character; register can be of arbitrary +length. Such register assignments happen before any macro file is +loaded, including the startup file. Due to getopt_long +limitations, c cannot be, and register cannot contain, +an equals sign, even though that is a valid character in a roff +identifier. +

    +
    +
    -R
    +

    Run grefer preprocessor. No mechanism is provided for passing +arguments to grefer because most grefer options have +equivalent language elements that can be specified within the document. +

    + + +

    gtroff also accepts a -R option, which is not +accessible via groff. This option prevents the loading of the +troffrc and troffrc-end files. +

    +
    +
    -s
    +

    Run gsoelim preprocessor. +

    +
    +
    -S
    +
    + + + + + +

    Operate in “safer” mode; see -U below for its opposite. For +security reasons, safer mode is enabled by default. +

    +
    +
    -t
    +

    Run gtbl preprocessor. +

    +
    +
    -Tdev
    +

    Direct gtroff to format the input for the output device +dev. groff then calls an output driver to convert +gtroff’s output to a form appropriate for dev. The +following output devices are available. +

    +
    +
    ps
    +

    For PostScript printers and previewers. +

    +
    +
    pdf
    +

    For PDF viewers or printers. +

    +
    +
    dvi
    +

    For TeX DVI format. +

    +
    +
    X75
    +

    For a 75dpi X11 previewer. +

    +
    +
    X75-12
    +

    For a 75dpi X11 previewer with a 12-point base font in the +document. +

    +
    +
    X100
    +

    For a 100dpi X11 previewer. +

    +
    +
    X100-12
    +

    For a 100dpi X11 previewer with a 12-point base font in the +document. +

    +
    +
    ascii
    +
    + + + + +

    For typewriter-like devices using the (7-bit) ASCII +(ISO 646) character set. +

    +
    +
    latin1
    +
    + + +

    For typewriter-like devices that support the Latin-1 +(ISO 8859-1) character set. +

    +
    +
    utf8
    +
    + +

    For typewriter-like devices that use the Unicode (ISO 10646) +character set with UTF-8 encoding. +

    +
    +
    cp1047
    +
    + + + + + + +

    For typewriter-like devices that use the EBCDIC encoding IBM +code page 1047. +

    +
    +
    lj4
    +

    For HP LaserJet4-compatible (or other PCL5-compatible) printers. +

    +
    +
    lbp
    +

    For Canon CaPSL printers (LBP-4 and LBP-8 series laser +printers). +

    + + + +
    +
    html
    +
    xhtml
    +

    To produce HTML and XHTML output, respectively. +This driver consists of two parts, a preprocessor +(pre-grohtml) and a postprocessor (post-grohtml). +

    +
    + + + +

    The predefined GNU troff string .T contains the name of +the output device; the read-only register .T is set to 1 if +this option is used (which is always true if groff is used to +call GNU troff). See Built-in Registers. +

    +

    The postprocessor to be used for a device is specified by the +postpro command in the device description file. (See Device and Font Description Files.) This can be overridden with the +-X option. +

    +
    +
    -U
    +
    +

    Operate in unsafe mode, which enables the open, +opena, pi, pso, and sy requests. These +requests are disabled by default because they allow an untrusted input +document to write to arbitrary file names and run arbitrary commands. +This option also adds the current directory to the macro package search +path; see the -m option above. -U is passed to +gpic and gtroff. +

    +
    +
    -v
    +

    Write version information for groff and all programs run by it +to the standard output stream; that is, the given command line is +processed in the usual way, passing -v to the formatter and any +pre- or postprocessors invoked. +

    +
    +
    -V
    +

    Output the pipeline that would be run by groff +(as a wrapper program) to the standard output stream, but do not execute +it. If given more than once, the pipeline is both written to the +standard error stream and run. +

    +
    +
    -wcategory
    +

    Enable warnings in category. Categories are listed in +Warnings. +

    +
    +
    -Wcategory
    +

    Inhibit warnings in category. Categories are listed in +Warnings. +

    +
    +
    -X
    +

    Use gxditview instead of the usual postprocessor to (pre)view +a document on an X11 display. Combining this option with +-Tps uses the font metrics of the PostScript device, whereas +the -TX75 and -TX100 options use the metrics of X11 +fonts. +

    +
    +
    -z
    +

    Suppress formatted output from gtroff. +

    +
    +
    -Z
    +

    Disable postprocessing. gtroff output will appear on the +standard output stream (unless suppressed with -z; see +gtroff Output for a description of this format. +

    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Gtroff-Internals.html b/doc/groff.html.node/Gtroff-Internals.html new file mode 100644 index 0000000..2e38fe7 --- /dev/null +++ b/doc/groff.html.node/Gtroff-Internals.html @@ -0,0 +1,187 @@ + + + + + + +Gtroff Internals (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.36 gtroff Internals

    + + + + + +

    gtroff processes input in three steps. One or more input +characters are converted to an input token.119 Then, one or more input tokens are converted to +an output node. Finally, output nodes are converted to the +intermediate output language understood by all output devices. +

    +

    Actually, before step one happens, gtroff converts certain escape +sequences into reserved input characters (not accessible by the user); +such reserved characters are used for other internal processing also – +this is the very reason why not all characters are valid input. +See Identifiers, for more on this topic. +

    +

    For example, the input string ‘fi\[:u]’ is converted into a +character token ‘f’, a character token ‘i’, and a special +token ‘:u’ (representing u umlaut). Later on, the character +tokens ‘f’ and ‘i’ are merged to a single output node +representing the ligature glyph ‘fi’ (provided the current font has +a glyph for this ligature); the same happens with ‘:u’. All output +glyph nodes are ‘processed’, which means that they are invariably +associated with a given font, font size, advance width, etc. During the +formatting process, gtroff itself adds various nodes to control +the data flow. +

    +

    Macros, diversions, and strings collect elements in two chained lists: a +list of input tokens that have been passed unprocessed, and a list of +output nodes. Consider the following diversion. +

    +
    +
    .di xxx
    +a
    +\!b
    +c
    +.br
    +.di
    +
    + +

    It contains these elements. +

    + + + + + + + + + + + + +
    node listtoken listelement number
    line start node1
    glyph node a2
    word space node3
    b4
    \n5
    glyph node c6
    vertical size node7
    vertical size node8
    \n9
    + + +

    Elements 1, 7, and 8 are inserted by gtroff; the latter two +(which are always present) specify the vertical extent of the last line, +possibly modified by \x. The br request finishes the +pending output line, inserting a newline input token, which is +subsequently converted to a space when the diversion is reread. Note +that the word space node has a fixed width that isn’t adjustable +anymore. To convert horizontal space nodes back to input tokens, use +the unformat request. +

    +

    Macros only contain elements in the token list (and the node list is +empty); diversions and strings can contain elements in both lists. +

    +

    The chop request simply reduces the number of elements in a +macro, string, or diversion by one. Exceptions are compatibility +save and compatibility ignore input tokens, which are ignored. +The substring request also ignores those input tokens. +

    +

    Some requests like tr or cflags work on glyph identifiers +only; this means that the associated glyph can be changed without +destroying this association. This can be very helpful for substituting +glyphs. In the following example, we assume that glyph ‘foo’ isn’t +available by default, so we provide a substitution using the +fchar request and map it to input character ‘x’. +

    +
    +
    .fchar \[foo] foo
    +.tr x \[foo]
    +
    + +

    Now let us assume that we install an additional special font ‘bar’ +that has glyph ‘foo’. +

    +
    +
    .special bar
    +.rchar \[foo]
    +
    + +

    Since glyphs defined with fchar are searched before glyphs in +special fonts, we must call rchar to remove the definition of the +fallback glyph. Anyway, the translation is still active; ‘x’ now +maps to the real glyph ‘foo’. +

    + + + + + + +

    Macro and request arguments preserve compatibility mode enablement. +

    +
    +
    .cp 1     \" switch to compatibility mode
    +.de xx
    +\\$1
    +..
    +.cp 0     \" switch compatibility mode off
    +.xx caf\['e]
    +    ⇒ café
    +
    + +

    Since compatibility mode is enabled while de is invoked, the +macro xx enables compatibility mode when it is called. Argument +$1 can still be handled properly because it inherits the +compatibility mode enablement status that was active at the point where +xx was called. +

    +

    After interpolation of the parameters, the compatibility save and +restore tokens are removed. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Headers-and-Footers.html b/doc/groff.html.node/Headers-and-Footers.html new file mode 100644 index 0000000..5d1c50a --- /dev/null +++ b/doc/groff.html.node/Headers-and-Footers.html @@ -0,0 +1,61 @@ + + + + + + +Headers and Footers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.3 Headers and Footers

    + +

    Headers and footers occupy the top and bottom of +each page, respectively, and contain data like the page number and the +article or chapter title. Their appearance is not affected by the +running text. Some packages allow for different titles on even- and +odd-numbered pages (for printed, bound material). +

    +

    Headers and footers are together called titles, and comprise +three parts: left-aligned, centered, and right-aligned. A ‘%’ +character appearing anywhere in a title is automatically replaced by the +page number. See Page Layout. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Headings-in-ms.html b/doc/groff.html.node/Headings-in-ms.html new file mode 100644 index 0000000..a5d0cc7 --- /dev/null +++ b/doc/groff.html.node/Headings-in-ms.html @@ -0,0 +1,214 @@ + + + + + + +Headings in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.4 Headings

    + + +

    Use headings to create a sequential or hierarchical structure for your +document. The ms macros print headings in bold using +the same font family and, by default, type size as the body text. +Headings are available with and without automatic numbering. Text on +input lines following the macro call becomes the heading’s title. Call +a paragraphing macro to end the heading text and start the section’s +content. +

    +
    +
    Macro: .NH [depth]
    +
    +
    Macro: .NH S heading-depth-index
    +

    Set an automatically numbered heading. +

    +

    ms produces a numbered heading the form a.b.c…, to +any depth desired, with the numbering of each depth increasing +automatically and being reset to zero when a more significant level is +increased. “1” is the most significant or coarsest division of +the document. Only non-zero values are output. If depth is +omitted, it is taken to be ‘1’. +

    +

    If you specify depth such that an ascending gap occurs relative to +the previous NH call—that is, you “skip a depth”, as by +‘.NH 1’ and then ‘.NH 3’—groff ms emits a +warning on the standard error stream. +

    +

    Alternatively, you can give NH a first argument of S, +followed by integers to number the heading depths explicitly. Further +automatic numbering, if used, resumes using the specified indices as +their predecessors. +This feature is a Berkeley extension. +

    + +

    An example may be illustrative. +

    +
    +
    +
    .NH 1
    +Animalia
    +.NH 2
    +Arthropoda
    +.NH 3
    +Crustacea
    +.NH 2
    +Chordata
    +.NH S 6 6 6
    +Daimonia
    +.NH 1
    +Plantae
    +
    +
    + +

    The above results in numbering as follows; the vertical space that +normally precedes each heading is omitted. +

    +
    +
    1.  Animalia
    +1.1.  Arthropoda
    +1.1.1.  Crustacea
    +1.2.  Chordata
    +6.6.6.  Daimonia
    +7.  Plantae
    +
    + +
    +
    String: \*[SN-STYLE]
    +
    +
    String: \*[SN-DOT]
    +
    +
    String: \*[SN-NO-DOT]
    +
    +
    String: \*[SN]
    +
    +

    After NH is called, the assigned number is made available in the +strings SN-DOT (as it appears in a printed heading with default +formatting, followed by a terminating period) and SN-NO-DOT (with +the terminating period omitted). These are GNU extensions. +

    +

    You can control the style used to print numbered headings by defining an +appropriate alias for the string SN-STYLE. By default, +SN-STYLE is aliased to SN-DOT. If you prefer to omit the +terminating period from numbers appearing in numbered headings, you may +define the alias as follows. +

    +
    +
    .als SN-STYLE SN-NO-DOT
    +
    + +

    Any such change in numbering style becomes effective from the next use +of NH following redefinition of the alias for SN-STYLE. +The formatted number of the current heading is available in the +SN string (a feature first documented by Berkeley), which +facilitates its inclusion in, for example, table captions, equation +labels, and XS/XA/XE table of contents entries. +

    + +
    +
    Macro: .SH [depth]
    +
    +

    Set an unnumbered heading. +

    +

    The optional depth argument is a GNU extension indicating the +heading depth corresponding to the depth argument of NH. +It matches the type size at which the heading is set to that of a +numbered heading at the same depth when the GROWPS and +PSINCR heading size adjustment mechanism is in effect. +

    + +

    If the GROWPS register is set to a value greater than the +level argument to NH or SH, the type size of a +heading produced by these macros increases by PSINCR units over +the size specified by PS multiplied by the difference of +GROWPS and level. The value stored in PSINCR is +interpreted in groff basic units; the p scaling unit +should be employed when assigning a value specified in points. For +example, the sequence +

    +
    +
    +
    .nr PS 10
    +.nr GROWPS 3
    +.nr PSINCR 1.5p
    +.NH 1
    +Carnivora
    +.NH 2
    +Felinae
    +.NH 3
    +Felis catus
    +.SH 2
    +Machairodontinae
    +
    +
    + +

    will cause “1. Carnivora” to be printed in 13-point text, followed by +“1.1. Felinae” in 11.5-point text, while “1.1.1. Felis catus” and +all more deeply nested heading levels will remain in the 10-point text +specified by the PS register. “Machairodontinae” is printed at +11.5 points, since it corresponds to heading level 2. +

    +

    The HORPHANS register operates in conjunction with the NH +and SH macros to inhibit the printing of isolated headings at the +bottom of a page; it specifies the minimum number of lines of an +immediately subsequent paragraph that must be kept on the same page as +the heading. If insufficient space remains on the current page to +accommodate the heading and this number of lines of paragraph text, a +page break is forced before the heading is printed. Any display macro +call or tbl, pic, or eqn region between the heading +and the subsequent paragraph suppresses this grouping. See Keeps, boxed keeps, and displays and Tables, figures, equations, and references. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Hyphenation.html b/doc/groff.html.node/Hyphenation.html new file mode 100644 index 0000000..ec22419 --- /dev/null +++ b/doc/groff.html.node/Hyphenation.html @@ -0,0 +1,66 @@ + + + + + + +Hyphenation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.3 Hyphenation

    + + +

    When an output line is nearly full, it is uncommon for the next word +collected from the input to exactly fill it—typically, there is room +left over only for part of the next word. The process of splitting a +word so that it appears partially on one line (with a hyphen to indicate +to the reader that the word has been broken) with its remainder on the +next is hyphenation. Hyphenation points can be manually +specified; GNU troff also uses a hyphenation algorithm and +language-specific pattern files (based on those used in TeX) to +decide which words can be hyphenated and where. +

    +

    Hyphenation does not always occur even when the hyphenation rules for a +word allow it; it can be disabled, and when not disabled there are +several parameters that can prevent it in certain circumstances. +See Manipulating Hyphenation. +

    + +
    + + + + + diff --git a/doc/groff.html.node/I_002fO.html b/doc/groff.html.node/I_002fO.html new file mode 100644 index 0000000..92a7fc0 --- /dev/null +++ b/doc/groff.html.node/I_002fO.html @@ -0,0 +1,457 @@ + + + + + + +I/O (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.33 I/O

    + + + + + +

    gtroff has several requests for including files: +

    +
    +
    Request: .so file
    +
    +
    Request: .soquiet file
    +
    + + +

    Replace the so request’s control line with the contents of the +file named by the argument, “sourcing” it. file is sought in +the directories specified by -I command-line option. If +file does not exist, a warning in category ‘file’ is produced +and the request has no further effect. See Warnings, for +information about the enablement and suppression of warnings. +

    +

    so can be useful for large documents; e.g., allowing each chapter +of a book to be kept in a separate file. However, files interpolated +with so are not preprocessed; to overcome this limitation, see +the gsoelim(1) man page. +

    +

    Since GNU troff replaces the entire control line with the +contents of a file, it matters whether file is terminated with a +newline or not. Assume that file xxx contains only the word +‘foo’ without a trailing newline. +

    +
    +
    $ printf 'foo' > xxx
    +
    +The situation is
    +.so xxx
    +bar.
    +    ⇒ The situation is foobar.
    +
    + +

    soquiet works the same way, except that no warning diagnostic is +issued if file does not exist. +

    + +
    +
    Request: .pso command
    +
    +

    Read the standard output from the specified command and include +it in place of the pso request. +

    + + + + +

    It is an error to use this request in safer mode, which is the +default. Invoke GNU troff or a front end with the -U +option to enable unsafe mode. +

    +

    The comment regarding a final newline for the so request is valid +for pso also. +

    + +
    +
    Request: .mso file
    +
    +
    Request: .msoquiet file
    +
    +

    Identical to the so and soquiet requests, respectively, +except that gtroff searches for the specified file in the +same directories as macro files for the -m command-line option. +If the file name to be included has the form name.tmac and +it isn’t found, these requests try to include tmac.name and +vice versa. +

    + +
    +
    Request: .trf file
    +
    +
    Request: .cf file
    +
    + + + + + + + + +

    Transparently output the contents of file. Each line is output as +if it were preceded by \!; however, the lines are not +subject to copy mode interpretation. If the file does not end with a +newline, trf adds one. Both requests cause a break. +

    +

    When used in a diversion, these requests embed a node (see gtroff Internals) in it that, when reread, causes the contents of file +to be transparently copied to the output. In AT&T +troff, the contents of file are immediately copied to the +output regardless of whether there is a current diversion; this +behaviour is so anomalous that it must be considered a bug. +

    + + + +

    While cf copies the contents of file completely +unprocessed, trf disallows characters such as NUL that are not +valid gtroff input characters (see Identifiers). +

    +

    For cf, within a diversion, “completely unprocessed” means that +each line of a file to be inserted is handled as if it were preceded by +\!\\!. +

    +

    To define a macro x containing the contents of +file f, use +

    +
    +
    .ev 1
    +.di x
    +.trf f
    +.di
    +.ev
    +
    + +

    The calls to ev prevent the partially collected output line +from becoming part of the diversion (see Diversions). +

    + +
    +
    Request: .nx [file]
    +
    + + + +

    Force gtroff to continue processing of the file specified as an +argument. If no argument is given, immediately jump to the end of file. +

    + +
    +
    Request: .rd [prompt [arg1 arg2 …]]
    +
    + + + +

    Read from standard input, and include what is read as though it were +part of the input file. Text is read until a blank line is encountered. +

    +

    If standard input is a TTY input device (keyboard), write prompt +to standard error, followed by a colon (or send BEL for a beep if no +argument is given). +

    +

    Arguments after prompt are available for the input. For example, +the line +

    +
    +
    .rd data foo bar
    +
    + +

    with the input ‘This is \$2. prints +

    +
    +
    This is bar.
    +
    +
    + + + +

    Using the nx and rd requests, it is easy to set up form +letters. The form letter template is constructed like this, putting the +following lines into a file called repeat.let: +

    +
    +
    .ce
    +\*(td
    +.sp 2
    +.nf
    +.rd
    +.sp
    +.rd
    +.fi
    +Body of letter.
    +.bp
    +.nx repeat.let
    +
    + + +

    When this is run, a file containing the following lines should be +redirected in. Requests included in this file are executed as though +they were part of the form letter. The last block of input is the +ex request, which tells GNU troff to stop processing. If +this were not there, troff would not know when to stop. +

    +
    +
    Trent A. Fisher
    +708 NW 19th Av., #202
    +Portland, OR  97209
    +
    +Dear Trent,
    +
    +Len Adollar
    +4315 Sierra Vista
    +San Diego, CA  92103
    +
    +Dear Mr. Adollar,
    +
    +.ex
    +
    + +
    +
    Request: .pi pipe
    +
    +

    Pipe the output of gtroff to the shell command(s) specified by +pipe. This request must occur before gtroff has a chance +to print anything. +

    + + + + +

    It is an error to use this request in safer mode, which is the +default. Invoke GNU troff or a front end with the -U +option to enable unsafe mode. +

    +

    Multiple calls to pi are allowed, acting as a chain. For +example, +

    +
    +
    .pi foo
    +.pi bar
    +...
    +
    + +

    is the same as ‘.pi foo | bar. +

    + + +

    The intermediate output format of GNU troff is piped to the +specified commands. Consequently, calling groff without the +-Z option normally causes a fatal error. +

    + + + +
    +
    Request: .sy cmds
    +
    +
    Register: \n[systat]
    +
    +

    Execute the shell command(s) specified by cmds. The output is not +saved anywhere, so it is up to the user to do so. +

    + + + + +

    It is an error to use this request in safer mode; this is the default. +Give GNU troff or a front end program the -U option to +enable unsafe mode. +

    +

    The following code fragment introduces the current time into a document. +

    + +
    +
    .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\
    +             (localtime(time))[2,1,0]' > /tmp/x\n[$$]
    +.so /tmp/x\n[$$]
    +.sy rm /tmp/x\n[$$]
    +\nH:\nM:\nS
    +
    + +

    This works by having the Perl script (run by sy) write +nr requests that set the registers H, M, and +S to a temporary file. The roff document then reads the +temporary file using the so request. +

    + + +

    The registers seconds, minutes, and hours, +initialized at startup of GNU troff, should satisfy most +requirements. Use the af request to format their values for +output. +

    +
    +
    .af hours 00
    +.af minutes 00
    +.af seconds 00
    +\n[hours]:\n[minutes]:\n[seconds]
    +    ⇒ 02:17:54
    +
    + + +

    The writable register systat contains the return value of the +system() function executed by the last sy request. +

    + +
    +
    Request: .open stream file
    +
    +
    Request: .opena stream file
    +
    + + + + +

    Open the specified file for writing and associates the specified +stream with it. +

    +

    The opena request is like open, but if the file exists, +append to it instead of truncating it. +

    + + + + +

    It is an error to use these requests in safer mode; this is the default. +Give GNU troff or a front end program the -U option to +enable unsafe mode. +

    + +
    +
    Request: .write stream data
    +
    +
    Request: .writec stream data
    +
    + + + + + + + + +

    Write to the file associated with the specified stream. The +stream must previously have been the subject of an open request. The +remainder of the line is interpreted as the ds request reads its +second argument: an initial neutral double quote in contents is +stripped to allow embedding of leading spaces, and it is read in copy +mode. +

    +

    The writec request is like write, but only write +appends a newline to the data. +

    + +
    +
    Request: .writem stream xx
    +
    + +

    Write the contents of the macro or string xx to the file +associated with the specified stream. +

    + + + +

    xx is read in copy mode, i.e., already formatted elements are +ignored. Consequently, diversions must be unformatted with the +asciify request before calling writem. Usually, this +means a loss of information. +

    + +
    +
    Request: .close stream
    +
    + + +

    Close the specified stream; the stream is no longer an acceptable +argument to the write request. +

    +

    Here a simple macro to write an index entry. +

    +
    +
    .open idx test.idx
    +.
    +.de IX
    +.  write idx \\n[%] \\$*
    +..
    +.
    +.IX test entry
    +.
    +.close idx
    +
    +
    + +
    +
    Escape sequence: \Ve
    +
    +
    Escape sequence: \V(ev
    +
    Escape sequence: \V[env]
    +
    + + +

    Interpolate the contents of the specified environment variable env +(one-character name e, two-character name ev) as +returned by the function getenv(3). \V is interpreted +even in copy mode (see Copy Mode). +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Identifiers.html b/doc/groff.html.node/Identifiers.html new file mode 100644 index 0000000..5734bb5 --- /dev/null +++ b/doc/groff.html.node/Identifiers.html @@ -0,0 +1,210 @@ + + + + + + +Identifiers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.5 Identifiers

    + + +

    An identifier labels a GNU troff datum such as a register, +name (macro, string, or diversion), typeface, color, special character, +character class, environment, or stream. Valid identifiers consist of +one or more ordinary characters. + + +An ordinary character is an input character that is not the +escape character, a leader, tab, newline, or invalid as GNU troff +input. +

    + + + + +

    Invalid input characters are a subset of control characters (from the +sets “C0 Controls” and “C1 Controls” as Unicode describes them). +When GNU troff encounters one in an identifier, it produces a +warning in category ‘input’ (see Warnings). They are removed +during interpretation: an identifier ‘foo’, followed by an invalid +character and then ‘bar’, is processed as ‘foobar’. +

    +

    On a machine using the ISO 646, 8859, or 10646 character encodings, +invalid input characters are 0x00, 0x08, 0x0B, +0x0D0x1F, and 0x800x9F. On an +EBCDIC host, they are 0x000x01, 0x08, +0x09, 0x0B, 0x0D0x14, +0x170x1F, and +0x300x3F.40 Some of these code points are used +by GNU troff internally, making it non-trivial to extend the +program to accept UTF-8 or other encodings that use characters from +these ranges.41 +

    +

    Thus, the identifiers ‘br’, ‘PP’, ‘end-list’, +‘ref*normal-print’, ‘|’, ‘@_’, and ‘!"#$%'()*+,-./’ +are all valid. Discretion should be exercised to prevent confusion. +Identifiers starting with ‘(’ or ‘[’ require care. +

    +
    +
    .nr x 9
    +.nr y 1
    +.nr (x 2
    +.nr [y 3
    +.nr sum1 (\n(x + \n[y])
    +    error→ a space character is not allowed in an escape
    +    error→   sequence parameter
    +A:2+3=\n[sum1]
    +.nr sum2 (\n((x + \n[[y])
    +B:2+3=\n[sum2]
    +.nr sum3 (\n[(x] + \n([y)
    +C:2+3=\n[sum3]
    +    ⇒ A:2+3=1 B:2+3=5 C:2+3=5
    +
    + + +

    An identifier with a closing bracket (‘]’) in its name can’t be +accessed with bracket-form escape sequences that expect an identifier as +a parameter. For example, ‘\[foo]]’ accesses the glyph ‘foo’, +followed by ‘]’ in whatever the surrounding context is, whereas +‘\C'foo]'’ formats a glyph named ‘foo]’. Similarly, the +identifier ‘(’ can’t be interpolated except with bracket +forms. +

    + + + + +

    If you begin a macro, string, or diversion name with either of the +characters ‘[’ or ‘]’, you foreclose use of the grefer +preprocessor, which recognizes ‘.[’ and ‘.]’ as bibliographic +reference delimiters. +

    +
    +
    Escape sequence: \A'anything'
    +
    +

    Interpolate 1 if anything is a valid identifier, and 0 +otherwise. The delimiter need not be a neutral apostrophe; see +Delimiters. Because invalid input characters are removed (see +above), invalid identifiers are empty or contain spaces, tabs, or +newlines. +

    +

    You can employ \A to validate a macro argument before using it to +construct another escape sequence or identifier. +

    +
    +
    .\" usage: .init-coordinate-pair name val1 val2
    +.\" Create a coordinate pair where name!x=val1 and
    +.\" name!y=val2.
    +.de init-coordinate-pair
    +.  if \A'\\$1' \{\
    +.    if \B'\\$2' .nr \\$1!x \\$2
    +.    if \B'\\$3' .nr \\$1!y \\$3
    +.  \}
    +..
    +.init-coordinate-pair center 5 10
    +The center is at (\n[center!x], \n[center!y]).
    +.init-coordinate-pair "poi→nt" trash garbage \" ignored
    +.init-coordinate-pair point trash garbage \" ignored
    +    ⇒ The center is at (5, 10).
    +
    + +

    In this example, we also validated the numeric arguments; the registers +‘point!x’ and ‘point!y’ remain undefined. See Numeric Expressions for the \B escape sequence. +

    + + + +

    How GNU troff handles the interpretation of an undefined +identifier depends on the context. There is no way to invoke an +undefined request; such syntax is interpreted as a macro call instead. +If the identifier is interpreted as a string, macro, or diversion, GNU +troff emits a warning in category ‘mac’, defines it as +empty, and interpolates nothing. If the identifier is interpreted as a +register, GNU troff emits a warning in category ‘reg’, +initializes it to zero, and interpolates that value. See Warnings, +Interpolating Registers, and Strings. Attempting to use an +undefined typeface, special character, color, character class, +environment, or stream generally provokes an error diagnostic. +

    + + + + + +

    Identifiers for requests, macros, strings, and diversions share one name +space; special characters and character classes another. No other +object types do. +

    +
    +
    .de xxx
    +.  nop foo
    +..
    +.di xxx
    +bar
    +.br
    +.di
    +.
    +.xxx
    +    ⇒ bar
    +
    + +

    The foregoing example shows that GNU troff reuses the identifier +‘xxx’, changing it from a macro to a diversion. No warning is +emitted, and the previous contents of ‘xxx’ are lost. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Implementation-Differences.html b/doc/groff.html.node/Implementation-Differences.html new file mode 100644 index 0000000..4645778 --- /dev/null +++ b/doc/groff.html.node/Implementation-Differences.html @@ -0,0 +1,64 @@ + + + + + + +Implementation Differences (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.38 Implementation Differences

    + + + + +

    GNU troff has a number of features that cause incompatibilities +with documents written for other versions of troff. Some GNU +extensions to troff have become supported by other +implementations. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Indented-regions-in-ms.html b/doc/groff.html.node/Indented-regions-in-ms.html new file mode 100644 index 0000000..44c648f --- /dev/null +++ b/doc/groff.html.node/Indented-regions-in-ms.html @@ -0,0 +1,112 @@ + + + + + + +Indented regions in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.7 Indented regions

    + +

    You may need to indent a region of text while otherwise formatting it +normally. Indented regions can be nested; you can change \n[PI] +before each call to vary the amount of inset. +

    +
    +
    Macro: .RS
    +
    +

    Begin a region where headings, paragraphs, and displays are indented +(further) by the amount stored in the PI register. +

    + +
    +
    Macro: .RE
    +
    +

    End the (next) most recent indented region. +

    + +

    This feature enables you to easily line up text under hanging and +indented paragraphs. + + +For example, you may wish to structure lists hierarchically. +

    +
    +
    +
    .IP \[bu] 2
    +Lawyers:
    +.RS
    +.IP \[bu]
    +Dewey,
    +.IP \[bu]
    +Cheatham,
    +and
    +.IP \[bu]
    +and Howe.
    +.RE
    +.IP \[bu]
    +Guns
    +
    +
    + +
    +
    • Lawyers:
    +
    +  •  Dewey,
    +
    +  •  Cheatham, and
    +
    +  •  Howe.
    +
    +• Guns
    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Indexing.html b/doc/groff.html.node/Indexing.html new file mode 100644 index 0000000..26895ca --- /dev/null +++ b/doc/groff.html.node/Indexing.html @@ -0,0 +1,58 @@ + + + + + + +Indexing (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.8 Indexing

    + + + +

    An index is similar to a table of contents, in that entry labels and +locations must be collected, but poses a greater challenge because it +needs to be sorted before it is output. Here, processing the document +in multiple passes is inescapable, and tools like the makeindex +program are necessary. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Input-Conventions.html b/doc/groff.html.node/Input-Conventions.html new file mode 100644 index 0000000..35005bd --- /dev/null +++ b/doc/groff.html.node/Input-Conventions.html @@ -0,0 +1,171 @@ + + + + + + +Input Conventions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.10 Input Conventions

    + + + +

    Since GNU troff fills text automatically, it is common practice +in the roff language to avoid visual composition of text in input +files: the esthetic appeal of the formatted output is what matters. +Therefore, roff input should be arranged such that it is easy for +authors and maintainers to compose and develop the document, understand +the syntax of roff requests, macro calls, and preprocessor +languages used, and predict the behavior of the formatter. Several +traditions have accrued in service of these goals. +

    +
      +
    • Follow sentence endings in the input with newlines to ease their +recognition (see Sentences). It is frequently convenient to end +text lines after colons and semicolons as well, as these typically +precede independent clauses. Consider doing so after commas; they often +occur in lists that become easy to scan when itemized by line, or +constitute supplements to the sentence that are added, deleted, or +updated to clarify it. Parenthetical and quoted phrases are also good +candidates for placement on text lines by themselves. + +
    • Set your text editor’s line length to 72 characters or +fewer.32 +This limit, combined with the previous item of advice, makes it less +common that an input line will wrap in your text editor, and thus will +help you perceive excessively long constructions in your text. Recall +that natural languages originate in speech, not writing, and that +punctuation is correlated with pauses for breathing and changes in +prosody. + +
    • Use \& after ‘!’, ‘?’, and ‘.’ if they are +followed by space, tab, or newline characters and don’t end a sentence. + +
    • In filled text lines, use \& before ‘.’ and ‘'’ if they +are preceded by space, so that reflowing the input doesn’t turn them +into control lines. + +
    • Do not use spaces to perform indentation or align columns of a table. +Leading spaces are reliable when text is not being filled. + +
    • Comment your document. It is never too soon to apply comments to +record information of use to future document maintainers (including your +future self). We thus introduce another escape sequence, \", +which causes GNU troff to ignore the remainder of the input line. + +
    • Use the empty request—a control character followed immediately by a +newline—to visually manage separation of material in input files. +Many of the groff project’s own documents use an empty request +between sentences, after macro definitions, and where a break is +expected, and two empty requests between paragraphs or other requests or +macro calls that will introduce vertical space into the document. + +

      You can combine the empty request with the comment escape sequence to +include whole-line comments in your document, and even “comment out” +sections of it. +

    + +

    We conclude this section with an example sufficiently long to illustrate +most of the above suggestions in practice. For the purpose of fitting +the example between the margins of this manual with the font used for +its typeset version, we have shortened the input line length to 56 +columns. As before, an arrow → indicates a tab character. +

    +
    +
    +
    .\"   nroff this_file.roff | less
    +.\"   groff -T ps this_file.roff > this_file.ps
    +→The theory of relativity is intimately connected with
    +the theory of space and time.
    +.
    +I shall therefore begin with a brief investigation of
    +the origin of our ideas of space and time,
    +although in doing so I know that I introduce a
    +controversial subject.  \" remainder of paragraph elided
    +.
    +.
    +
    +→The experiences of an individual appear to us arranged
    +in a series of events;
    +in this series the single events which we remember
    +appear to be ordered according to the criterion of
    +\[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped
    +which cannot be analysed further.
    +.
    +There exists,
    +therefore,
    +for the individual,
    +an I-time,
    +or subjective time.
    +.
    +This itself is not measurable.
    +.
    +I can,
    +indeed,
    +associate numbers with the events,
    +in such a way that the greater number is associated with
    +the later event than with an earlier one;
    +but the nature of this association may be quite
    +arbitrary.
    +.
    +This association I can define by means of a clock by
    +comparing the order of events furnished by the clock
    +with the order of a given series of events.
    +.
    +We understand by a clock something which provides a
    +series of events which can be counted,
    +and which has other properties of which we shall speak
    +later.
    +.\" Albert Einstein, _The Meaning of Relativity_, 1922
    +
    +
    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Input-Encodings.html b/doc/groff.html.node/Input-Encodings.html new file mode 100644 index 0000000..f9ef79d --- /dev/null +++ b/doc/groff.html.node/Input-Encodings.html @@ -0,0 +1,154 @@ + + + + + + +Input Encodings (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.9 Input Encodings

    + +

    The groff command’s -k option calls the +preconv preprocessor to perform input character encoding +conversions. Input to the GNU troff formatter itself, on the +other hand, must be in one of two encodings it can recognize. +

    +
    +
    cp1047
    +
    + + + + + + +

    The code page 1047 input encoding works only on EBCDIC +platforms (and conversely, the other input encodings don’t work with +EBCDIC); the file cp1047.tmac is loaded at startup. +

    +
    +
    latin1
    +
    + + + +

    ISO Latin-1, an encoding for Western European languages, is the +default input encoding on non-EBCDIC platforms; the file +latin1.tmac is loaded at startup. +

    +
    + +

    Any document that is encoded in ISO 646:1991 (a descendant of USAS +X3.4-1968 or “US-ASCII”), or, equivalently, uses only code points +from the “C0 Controls” and “Basic Latin” parts of the Unicode +character set is also a valid ISO Latin-1 document; the standards +are interchangeable in their first 128 code points.30 +

    +

    Other encodings are supported by means of macro packages. +

    +
    +
    latin2
    +
    + + + +

    To use ISO Latin-2, an encoding for Central and Eastern European +languages, invoke ‘.mso latin2.tmac at the beginning of your +document or supply ‘-mlatin2’ as a command-line argument to +groff. +

    +
    +
    latin5
    +
    + + + +

    To use ISO Latin-5, an encoding for the Turkish language, invoke +‘.mso latin5.tmac at the beginning of your document or +supply ‘-mlatin5’ as a command-line argument to groff. +

    +
    +
    latin9
    +
    + + + +

    ISO Latin-9 succeeds Latin-1; it includes a Euro sign and better +glyph coverage for French. To use this encoding, invoke ‘.mso latin9.tmac at the beginning of your document or supply +‘-mlatin9’ as a command-line argument to groff. +

    +
    + +

    Some characters from an input encoding may not be available with a +particular output driver, or their glyphs may not have representation in +the font used. For terminal devices, fallbacks are defined, like +‘EUR’ for the Euro sign and ‘(C)’ for the copyright sign. For +typesetter devices, you may need to “mount” fonts that support glyphs +required by the document. See Font Positions. +

    + + +

    Because a Euro glyph was not historically defined in PostScript fonts, +groff comes with a font called freeeuro.pfa that provides +the Euro in several styles. Standard PostScript fonts contain the +glyphs from Latin-5 and Latin-9 that Latin-1 lacks, so these +encodings are supported for the ps and pdf output +devices as groff ships, while Latin-2 is not. +

    +

    Unicode supports characters from all other input encodings; the +utf8 output driver for terminals therefore does as well. The +DVI output driver supports the Latin-2 and Latin-9 encodings if +the command-line option -mec is used as well. 31 +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Input-Line-Traps.html b/doc/groff.html.node/Input-Line-Traps.html new file mode 100644 index 0000000..f0d7fef --- /dev/null +++ b/doc/groff.html.node/Input-Line-Traps.html @@ -0,0 +1,185 @@ + + + + + + +Input Line Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.2 Input Line Traps

    + + + +
    +
    Request: .it [n name]
    +
    +
    Request: .itc [n name]
    +
    + + + + + + +

    Set an input line trap, calling macro name after processing the +next n productive input lines (recall Manipulating Filling and Adjustment). Any existing input line trap in the +environment is replaced. Without arguments, it and itc +clear any input line trap that has not yet sprung. +

    +

    Consider a macro ‘.ST s n’ which sets the next +n input lines in the font style s. +

    +
    +
    .de ST \" Use style $1 for next $2 text lines.
    +.  it \\$2 ES
    +.  ft \\$1
    +..
    +.de ES \" end ST
    +.  ft R
    +..
    +.ST I 1
    +oblique
    +face
    +.ST I 1
    +oblique\c
    +face
    +    ⇒ oblique face obliqueface  (second “face” upright)
    +
    + + + + + +

    Unlike the ce and rj requests, it counts lines +interrupted with the \c escape sequence separately (see Line Continuation); itc does not. To see the difference, let’s +change the previous example to use itc instead. +

    +
    +
    
    +.  itc \\$2 ES
    +
    +    ⇒ oblique face obliqueface  (second “face” oblique)
    +
    + +

    You can think of the ce and rj requests as implicitly +creating an input line trap with itc that schedules a break when +the trap is sprung. +

    +
    +
    .de BR
    +.  br
    +.  internal: disable centering-without-filling
    +..
    +.
    +.de ce
    +.  if \\n[.br] .br
    +.  itc \\$1 BR
    +.  internal: enable centering-without-filling
    +..
    +
    + +

    Let us consider in more detail the sorts of input lines that are or are +not “productive”. +

    +
    +
    .de Trap
    +TRAP SPRUNG
    +..
    +.de Mac
    +.if r a \l'5n'
    +..
    +.it 2 Trap
    +.
    +foo
    +.Mac
    +bar
    +baz
    +.it 1 Trap
    +.sp \" moves, but does not write or draw
    +qux
    +.itc 1 Trap
    +\h'5n'\c \" moves, but does not write or draw
    +jat
    +
    + +

    When ‘Trap’ gets called depends on whether the ‘a’ register is +defined; the control line with the if request may or may not +produce written output. We also see that the spacing request sp, +while certainly affecting the output, does not spring the input line +trap. Similarly, the horizontal motion escape sequence \h also +affected the output, but was not “written”. Observe that we had to +follow it with \c and use itc to prevent the newline at +the end of the text line from causing a word break, which, like an +ordinary space character, counts as written output. +

    +
    +
    $ groff -Tascii input-trap-example.groff
    +    ⇒ foo bar TRAP SPRUNG baz
    +    ⇒
    +    ⇒ qux TRAP SPRUNG      jat TRAP SPRUNG
    +$ groff -Tascii -ra1 input-trap-example.groff
    +    ⇒ foo _____ TRAP SPRUNG bar baz
    +    ⇒
    +    ⇒ qux TRAP SPRUNG      jat TRAP SPRUNG
    +
    +
    + +

    Input line traps are associated with the environment +(see Environments); switching to another environment suspends the +current input line trap, and going back resumes it, restoring the count +of qualifying lines enumerated in that environment. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Installation.html b/doc/groff.html.node/Installation.html new file mode 100644 index 0000000..659fdce --- /dev/null +++ b/doc/groff.html.node/Installation.html @@ -0,0 +1,57 @@ + + + + + + +Installation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.7 Installation

    + + +

    Locate installation instructions in the files INSTALL, +INSTALL.extra, and INSTALL.REPO in the groff source +distribution. Being a GNU project, groff supports the familiar +‘./configure && make’ command sequence. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Intermediate-Output-Examples.html b/doc/groff.html.node/Intermediate-Output-Examples.html new file mode 100644 index 0000000..0947e86 --- /dev/null +++ b/doc/groff.html.node/Intermediate-Output-Examples.html @@ -0,0 +1,171 @@ + + + + + + +Intermediate Output Examples (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.3 Intermediate Output Examples

    + +

    This section presents the intermediate output generated from the same +input for three different devices. The input is the sentence ‘hell +world’ fed into gtroff on the command line. +

    +
    +
    High-resolution device ps
    +
    +

    This is the standard output of gtroff if no -T option is +given. +

    +
    +
    shell> echo "hell world" | groff -Z -T ps
    +
    +x T ps
    +x res 72000 1 1
    +x init
    +
    p1
    +x font 5 TR
    +f5
    +s10000
    +V12000
    +H72000
    +thell
    +wh2500
    +tw
    +H96620
    +torld
    +n12000 0
    +
    x trailer
    +V792000
    +x stop
    +
    + +

    This output can be fed into grops to get its representation as a +PostScript file. +

    +
    +
    Low-resolution device latin1
    +
    +

    This is similar to the high-resolution device except that the +positioning is done at a minor scale. Some comments (lines starting +with ‘#’) were added for clarification; they were not generated by +the formatter. +

    +
    +
    shell> echo "hell world" | groff -Z -T latin1
    +
    +# prologue
    +x T latin1
    +x res 240 24 40
    +x init
    +
    # begin a new page
    +p1
    +# font setup
    +x font 1 R
    +f1
    +s10
    +# initial positioning on the page
    +V40
    +H0
    +# write text 'hell'
    +thell
    +# inform about space, and issue a horizontal jump
    +wh24
    +# write text 'world'
    +tworld
    +# announce line break, but do nothing because...
    +n40 0
    +
    # ...the end of the document has been reached
    +x trailer
    +V2640
    +x stop
    +
    + +

    This output can be fed into grotty to get a formatted text +document. +

    +
    +
    AT&T troff output
    +

    Since a computer monitor has a much lower resolution than modern +printers, the intermediate output for X11 devices can use the +jump-and-write command with its 2-digit displacements. +

    +
    +
    shell> echo "hell world" | groff -Z -T X100
    +
    +x T X100
    +x res 100 1 1
    +x init
    +
    p1
    +x font 5 TR
    +f5
    +s10
    +V16
    +H100
    +# write text with jump-and-write commands
    +ch07e07l03lw06w11o07r05l03dh7
    +n16 0
    +
    x trailer
    +V1100
    +x stop
    +
    + +

    This output can be fed into xditview or gxditview for +displaying in X. +

    +

    Due to the obsolete jump-and-write command, the text clusters in the +AT&T troff output are almost unreadable. +

    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Interpolating-Registers.html b/doc/groff.html.node/Interpolating-Registers.html new file mode 100644 index 0000000..21d01f8 --- /dev/null +++ b/doc/groff.html.node/Interpolating-Registers.html @@ -0,0 +1,99 @@ + + + + + + +Interpolating Registers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8.2 Interpolating Registers

    + + + +

    Register contents are interpolated with the \n escape sequence. +

    +
    +
    Escape sequence: \ni
    +
    +
    Escape sequence: \n(id
    +
    Escape sequence: \n[ident]
    +
    + + + +

    Interpolate register with name ident (one-character +name i, two-character name id). \n is +interpreted even in copy mode (see Copy Mode). If the register is +undefined, it is created and assigned a value of ‘0’, that +value is interpolated, and a warning in category ‘reg’ is emitted. +See Warnings, for information about the enablement and suppression of +warnings. +

    +
    +
    .nr a 5
    +.nr as \na+\na
    +\n(as
    +    ⇒ 10
    +
    + +
    +
    .nr a1 5
    +.nr ab 6
    +.ds str b
    +.ds num 1
    +\n[a\n[num]]
    +    ⇒ 5
    +\n[a\*[str]]
    +    ⇒ 6
    +
    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Introduction.html b/doc/groff.html.node/Introduction.html new file mode 100644 index 0000000..65499fc --- /dev/null +++ b/doc/groff.html.node/Introduction.html @@ -0,0 +1,68 @@ + + + + + + +Introduction (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1 Introduction

    + + +

    GNU roff (or groff) is a programming system for +typesetting documents. It is highly flexible and has been used +extensively for over thirty years. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Invocation-Examples.html b/doc/groff.html.node/Invocation-Examples.html new file mode 100644 index 0000000..c72781d --- /dev/null +++ b/doc/groff.html.node/Invocation-Examples.html @@ -0,0 +1,120 @@ + + + + + + +Invocation Examples (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.6 Invocation Examples

    + + + +

    roff systems are best known for formatting man pages. Once a +man librarian program has located a man page, it may execute +a groff command much like the following. +

    +
    +
    groff -t -man -Tutf8 /usr/share/man/man1/groff.1
    +
    + +

    The librarian will also pipe the output through a pager, which might not +interpret the SGR terminal escape sequences groff emits for +boldface, underlining, or italics; see the grotty(1) man page +for a discussion. +

    +

    To process a roff input file using the preprocessors +gtbl and gpic and the me macro package in the +way to which AT&T troff users were accustomed, one would type (or +script) a pipeline. +

    +
    +
    gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty
    +
    + +

    Using groff, this pipe can be shortened to an equivalent +command. +

    +
    +
    groff -p -t -me -T utf8 foo.me
    +
    + +

    An even easier way to do this is to use grog to guess the +preprocessor and macro options and execute the result by using the +command substitution feature of the shell. +

    +
    +
    $(grog -Tutf8 foo.me)
    +
    + +

    Each command-line option to a postprocessor must be specified with any +required leading dashes ‘-’ +because groff passes the arguments as-is to the postprocessor; +this permits arbitrary arguments to be transmitted. For example, to +pass a title to the gxditview postprocessor, +the shell commands +

    +
    +
    groff -X -P -title -P 'trial run' mydoc.t
    +
    + +

    and +

    +
    +
    groff -X -Z mydoc.t | gxditview -title 'trial run' -
    +
    + +

    are equivalent. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Invoking-Requests.html b/doc/groff.html.node/Invoking-Requests.html new file mode 100644 index 0000000..1864553 --- /dev/null +++ b/doc/groff.html.node/Invoking-Requests.html @@ -0,0 +1,143 @@ + + + + + + +Invoking Requests (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6.2 Invoking Requests

    + + + +

    A control character is optionally followed by tabs and/or spaces and +then an identifier naming a request or macro. The invocation of an +unrecognized request is interpreted as a macro call. Defining a macro +with the same name as a request replaces the request. Deleting a +request name with the rm request makes it unavailable. The +als request can alias requests, permitting them to be wrapped or +non-destructively replaced. See Strings. +

    + + + + + + + + +

    There is no inherent limit on argument length or quantity. Most +requests take one or more arguments, and ignore any they do not expect. +A request may be separated from its arguments by tabs or spaces, but +only spaces can separate an argument from its successor. Only one +between arguments is necessary; any excess is ignored. GNU troff +does not allow tabs for argument separation.43 +

    +

    Generally, a space within a request argument is not relevant, not +meaningful, or is supported by bespoke provisions, as with the tl +request’s delimiters (see Page Layout). Some requests, like +ds, interpret the remainder of the control line as a single +argument. See Strings. +

    + + + + + +

    Spaces and tabs immediately after a control character are ignored. +Commonly, authors structure the source of documents or macro files with +them. +

    +
    +
    .de center
    +.  if \\n[.br] \
    +.    br
    +.  ce \\$1
    +..
    +.
    +.
    +.de right-align
    +.→if \\n[.br] \
    +.→→br
    +.→rj \\$1
    +..
    +
    + + + +

    If you assign an empty blank line trap, you can separate macro +definitions (or any input lines) with blank lines. +

    +
    +
    .de do-nothing
    +..
    +.blm do-nothing  \" activate blank line trap
    +
    +.de center
    +.  if \\n[.br] \
    +.    br
    +.  ce \\$1
    +..
    +
    +
    +.de right-align
    +.→if \\n[.br] \
    +.→→br
    +.→rj \\$1
    +..
    +
    +.blm             \" deactivate blank line trap
    +
    + +

    See Blank Line Traps. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Invoking-groff.html b/doc/groff.html.node/Invoking-groff.html new file mode 100644 index 0000000..a302025 --- /dev/null +++ b/doc/groff.html.node/Invoking-groff.html @@ -0,0 +1,82 @@ + + + + + + +Invoking groff (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2 Invoking groff

    + + + +

    This chapter focuses on how to invoke the groff front end. This +front end takes care of the details of constructing the pipeline among +the preprocessors, gtroff and the postprocessor. +

    +

    It has become a tradition that GNU programs get the prefix ‘g’ to +distinguish them from their original counterparts provided by the host +(see Environment). Thus, for example, geqn is GNU +eqn. On operating systems like GNU/Linux or the Hurd, which +don’t contain proprietary versions of troff, and on +MS-DOS/MS-Windows, where troff and associated programs are not +available at all, this prefix is omitted since GNU troff is the +only incarnation of troff used. Exception: ‘groff’ is never +replaced by ‘roff’. +

    +

    In this document, we consequently say ‘gtroff’ when talking about +the GNU troff program. All other implementations of troff are called AT&T +troff, which is the common origin of almost all troff +implementations4 (with more or less compatible changes). Similarly, we say +‘gpic’, ‘geqn’, and so on. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Italic-Corrections.html b/doc/groff.html.node/Italic-Corrections.html new file mode 100644 index 0000000..42620d8 --- /dev/null +++ b/doc/groff.html.node/Italic-Corrections.html @@ -0,0 +1,96 @@ + + + + + + +Italic Corrections (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.9 Italic Corrections

    + +

    When typesetting adjacent glyphs from typefaces of different slants, the +space between them may require adjustment. +

    +
    +
    Escape sequence: \/
    +
    + + + + + +

    Apply an italic correction: modify the spacing of the preceding +glyph so that the distance between it and the following glyph is correct +if the latter is of upright shape. For example, if an +italic ‘f’ is followed immediately by a roman right +parenthesis, then in many fonts the top right portion of +the ‘f’ overlaps the top left of the right parenthesis, which +is ugly. Use this escape sequence whenever an oblique glyph is +immediately followed by an upright glyph without any intervening space. +

    + +
    +
    Escape sequence: \,
    +
    + + + + + +

    Apply a left italic correction: modify the spacing of the +following glyph so that the distance between it and the preceding +glyph is correct if the latter is of upright shape. For example, +if a roman left parenthesis is immediately followed by an +italic ‘f’, then in many fonts the bottom left portion of +the ‘f’ overlaps the bottom of the left parenthesis, which is +ugly. Use this escape sequence whenever an upright glyph is followed +immediately by an oblique glyph without any intervening space. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Language-Concepts.html b/doc/groff.html.node/Language-Concepts.html new file mode 100644 index 0000000..16badc5 --- /dev/null +++ b/doc/groff.html.node/Language-Concepts.html @@ -0,0 +1,70 @@ + + + + + + +Language Concepts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.1 Language Concepts

    + +

    The fundamental operation of the GNU troff formatter is the +translation of the groff input language into a device-independent +form primarily concerned with what has to be written or drawn at +specific positions on the output device. This language is simple and +imperative. In the following discussion, the term command always +refers to this intermediate output language, and never to the +groff language intended for direct use by document authors. +Intermediate output commands comprise several categories: glyph output; +font, color, and text size selection; motion of the printing position; +page advancement; drawing of geometric objects; and device control +commands, a catch-all for operations not easily classified as any of the +foregoing, such as directives to start and stop output, identify the +intended output device, or place URL hyperlinks in supported output +formats. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Leaders.html b/doc/groff.html.node/Leaders.html new file mode 100644 index 0000000..1a590e8 --- /dev/null +++ b/doc/groff.html.node/Leaders.html @@ -0,0 +1,126 @@ + + + + + + +Leaders (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.12.1 Leaders

    + + +

    Sometimes it is desirable to fill a tab stop with a given glyph, +but also use tab stops normally on the same output line. An example is +a table of contents entry that uses dots to bridge the entry name with +its page number, which is itself aligned between tab stops. The +roff language provides leaders for this +purpose.67 +

    + +

    A leader character (ISO and EBCDIC code +point 1, also known as SOH or “start of heading”), +behaves similarly to a tab character: it moves to the next tab stop. +The difference is that for this movement, the default fill character is +a period ‘.’. +

    +
    +
    Escape sequence: \a
    +
    + + + + + +

    Interpolate a leader in copy mode; see Copy Mode. +

    + +
    +
    Request: .lc [c]
    +
    + + + +

    Set the leader repetition character to the ordinary or special character +c. Recall Tabs and Leaders: when encountering a leader +character in the input, the formatter writes as many dots ‘.’ as +are necessary until +reaching the next tab stop; this is the leader definition +character. Omitting c unsets the leader +character. With no argument, GNU troff treats leaders the same +as tabs. The leader repetition character is associated with the +environment (see Environments). Only a single c is +recognized; any excess is ignored. +

    + + + +

    A table of contents, for example, may define tab stops after a section +number, a title, and a gap to be filled with leader dots. The page +number follows the leader, after a right-aligned final tab stop wide +enough to house the largest page number occurring in the document. +

    +
    +
    .ds entry1 19.\tThe Prophet\a\t98
    +.ds entry2 20.\tAll Astir\a\t101
    +.ta .5i 4.5i +.5iR
    +.nf
    +\*[entry1]
    +\*[entry2]
    +    ⇒ 19.  The Prophet.............................   98
    +    ⇒ 20.  All Astir...............................  101
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Leading-Space-Traps.html b/doc/groff.html.node/Leading-Space-Traps.html new file mode 100644 index 0000000..b107793 --- /dev/null +++ b/doc/groff.html.node/Leading-Space-Traps.html @@ -0,0 +1,82 @@ + + + + + + +Leading Space Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.4 Leading Space Traps

    + + + +
    +
    Request: .lsm [name]
    +
    +
    Register: \n[lsn]
    +
    +
    Register: \n[lss]
    +
    + +

    Set a leading space trap, calling the macro name when GNU +troff encounters leading spaces in an input line; the implicit +line break that normally happens in this case is suppressed. If no +argument is supplied, the default leading space behavior is +(re-)established (see Breaking). +

    +

    The count of leading spaces on an input line is stored in register +lsn, and the amount of corresponding horizontal motion in +register lss, irrespective of whether a leading space trap is +set. When it is, the leading spaces are removed from the input line, +and no motion is produced before calling name. +

    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Ligatures-and-Kerning.html b/doc/groff.html.node/Ligatures-and-Kerning.html new file mode 100644 index 0000000..b00ed74 --- /dev/null +++ b/doc/groff.html.node/Ligatures-and-Kerning.html @@ -0,0 +1,157 @@ + + + + + + +Ligatures and Kerning (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.8 Ligatures and Kerning

    + + + +

    Ligatures are groups of characters that are run together, i.e, producing +a single glyph. For example, the letters ‘f’ and ‘i’ can form a +ligature ‘fi’ as in the word ‘file’. This produces a cleaner look +(albeit subtle) to the printed output. Usually, ligatures are not +available in fonts for TTY output devices. +

    +

    Most PostScript fonts support the fi and fl ligatures. The C/A/T +typesetter that was the target of AT&T troff also +supported ‘ff’, ‘ffi’, and ‘ffl’ ligatures. Advanced typesetters or +‘expert’ fonts may include ligatures for ‘ft’ and ‘ct’, although GNU +troff does not support these (yet). +

    +

    Only the current font is checked for ligatures and kerns; neither +special fonts nor special charcters defined with the char request +(and its siblings) are taken into account. +

    +
    +
    Request: .lg [flag]
    +
    +
    Register: \n[.lg]
    +
    + + + +

    Switch the ligature mechanism on or off; if the parameter is non-zero or +missing, ligatures are enabled, otherwise disabled. Default is on. The +current ligature mode can be found in the read-only register .lg +(set to 1 or 2 if ligatures are enabled, 0 otherwise). +

    +

    Setting the ligature mode to 2 enables the two-character ligatures +(fi, fl, and ff) and disables the three-character ligatures (ffi and +ffl). +

    + +

    Pairwise kerning is another subtle typesetting mechanism that +modifies the distance between a glyph pair to improve readability. In +most cases (but not always) the distance is decreased. +Typewriter-like fonts and fonts for terminals where all glyphs have the +same width don’t use kerning. +

    +
    +
    Request: .kern [flag]
    +
    +
    Register: \n[.kern]
    +
    + + + +

    Switch kerning on or off. If the parameter is non-zero or missing, +enable pairwise kerning, otherwise disable it. The read-only register +.kern is set to 1 if pairwise kerning is enabled, +0 otherwise. +

    + + +

    If the font description file contains pairwise kerning information, +glyphs from that font are kerned. Kerning between two glyphs can be +inhibited by placing \& between them: ‘V\&A’. +

    +

    See Font Description File Format. +

    + + + +

    Track kerning expands or reduces the space between glyphs. This +can be handy, for example, if you need to squeeze a long word onto a +single line or spread some text to fill a narrow column. It must be +used with great care since it is usually considered bad typography if +the reader notices the effect. +

    +
    +
    Request: .tkf f s1 n1 s2 n2
    +
    + + +

    Enable track kerning for font f. If the current font +is f the width of every glyph is increased by an amount +between n1 and n2 (n1, n2 can be negative); if +the current type size is less than or equal to s1 the width is +increased by n1; if it is greater than or equal to s2 the +width is increased by n2; if the type size is greater than or +equal to s1 and less than or equal to s2 the increase in +width is a linear function of the type size. +

    +

    The default scaling unit is ‘z’ for s1 and s2, ‘p’ +for n1 and n2. +

    +

    The track kerning amount is added even to the rightmost glyph in a line; +for large values it is thus recommended to increase the line length by +the same amount to compensate. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Line-Continuation.html b/doc/groff.html.node/Line-Continuation.html new file mode 100644 index 0000000..f818cd9 --- /dev/null +++ b/doc/groff.html.node/Line-Continuation.html @@ -0,0 +1,166 @@ + + + + + + +Line Continuation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.16 Line Continuation

    + + + +

    When filling is enabled, input and output line breaks generally do not +correspond. The roff language therefore distinguishes input and +output line continuation. +

    +
    +
    Escape sequence: \RET
    +
    + + + + +

    \RET (a backslash immediately followed by a newline) +suppresses the effects of that newline in the input. The next input +line thus retains the classification of its predecessor as a control or +text line. \RET is useful for managing line lengths in the +input during document maintenance; you can break an input line in the +middle of a request invocation, macro call, or escape sequence. Input +line continuation is invisible to the formatter, with two exceptions: +the | operator recognizes the new input line +(see Numeric Expressions), and the input line counter register +.c is incremented. +

    +
    +
    .ll 50n
    +.de I
    +.  ft I
    +.  nop \\$*
    +.  ft
    +..
    +Our film class watched
    +.I The Effect of Gamma Rays on Man-in-the-Moon
    +Marigolds. \" whoops, the input line wrapped
    +.br
    +.I My own opus begins on line \n[.c] \
    +and ends on line \n[.c].
    +
    +
    +
        ⇒ Our film class watched The Effect of Gamma Rays on
    +    ⇒ Man-in-the-Moon Marigolds.
    +    ⇒ My own opus begins on line 11 and ends on line 12.
    +
    +
    + +
    +
    Escape sequence: \c
    +
    +
    Register: \n[.int]
    +
    + + + + + + +

    \c continues an output line. Nothing after it on the input line +is formatted. In contrast to \RET, a line after \c +remains a new input line, so a control character is recognized at its +beginning. The visual results depend on whether filling is enabled; see +Manipulating Filling and Adjustment. +

    +
      +
    • + + +If filling is enabled, a word interrupted with \c is continued +with the text on the next input text line, without an intervening space. + +
      +
      This is a te\c
      +st.
      +    ⇒ This is a test.
      +
      + +
    • + + +If filling is disabled, the next input text line after \c is +handled as a continuation of the same input text line. + +
      +
      .nf
      +This is a \c
      +test.
      +    ⇒ This is a test.
      +
      +
    + +

    An intervening control line that causes a break overrides \c, +flushing out the pending output line in the usual way. +

    + + +

    The .int register contains a positive value if the last output +line was continued with \c; this datum is associated with the +environment (see Environments).69 +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Line-Layout.html b/doc/groff.html.node/Line-Layout.html new file mode 100644 index 0000000..4cfed5f --- /dev/null +++ b/doc/groff.html.node/Line-Layout.html @@ -0,0 +1,267 @@ + + + + + + +Line Layout (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.15 Line Layout

    + + + + + +

    The following drawing shows the dimensions that gtroff uses for +placing a line of output onto the page. They are labeled with the +request that manipulates each dimension. +

    +
    +
         -->| in |<--
    +        |<-----------ll------------>|
    +   +----+----+----------------------+----+
    +   |    :    :                      :    |
    +   +----+----+----------------------+----+
    +-->| po |<--
    +   |<--------paper width---------------->|
    +
    + +

    These dimensions are: +

    +
    +
    po
    +
    + + + +

    Page offset—this is the leftmost position of text on the final +output, defining the left margin. +

    +
    +
    in
    +
    + +

    Indentation—this is the distance from the left margin where +text is printed. +

    +
    +
    ll
    +
    + +

    Line length—this is the distance from the left margin to right +margin. +

    +
    + + + +

    The right margin is not explicitly configured; the combination of page +offset and line length provides the information necessary to derive it. +

    +

    A simple demonstration: +

    +
    +
    .ll 3i
    +This is text without indentation.
    +The line length has been set to 3\~inches.
    +.in +.5i
    +.ll -.5i
    +Now the left and right margins are both increased.
    +.in
    +.ll
    +Calling .in and .ll without parameters restores
    +the previous values.
    +
    + +
    +
        ⇒ This  is text without indenta-
    +    ⇒ tion.   The  line  length  has
    +    ⇒ been set to 3 inches.
    +    ⇒      Now   the  left  and
    +    ⇒      right  margins   are
    +    ⇒      both increased.
    +    ⇒ Calling  .in  and  .ll without
    +    ⇒ parameters restores the previ-
    +    ⇒ ous values.
    +
    + +
    +
    Request: .po [offset]
    +
    +
    Request: .po +offset
    +
    Request: .po -offset
    +
    Register: \n[.o]
    +
    + +

    Set page offset to offset (or increment or decrement its current +value by offset). If invoked without an argument, the page offset +is restored to the value before the previous po request. +This request does not cause a break; the page offset in effect when an +output line is broken prevails (see Manipulating Filling and Adjustment). The initial value is 1i and the default scaling +unit is ‘m’. On terminal devices, the page offset is set to zero +by a driver-specific macro file, tty.tmac. The current page +offset can be found in the read-only register ‘.o’. + + +This request is incorrectly documented in the AT&T +troff manual as using a default scaling unit of ‘v’. +

    +
    +
    .po 3i
    +\n[.o]
    +    ⇒ 720
    +.po -1i
    +\n[.o]
    +    ⇒ 480
    +.po
    +\n[.o]
    +    ⇒ 720
    +
    +
    + +
    +
    Request: .in [indent]
    +
    +
    Request: .in +indent
    +
    Request: .in -indent
    +
    Register: \n[.i]
    +
    +

    Set indentation to indent (or increment or decrement the current +value by indent). This request causes a break. Initially, there +is no indentation. +

    +

    If in is called without an argument, the indentation is reset to +the previous value before the last call to in. The default +scaling unit is ‘m’. +

    +

    If a negative indentation value is specified (which is not allowed), +gtroff emits a warning in category ‘range’ and sets the +indentation to zero. +

    +

    The effect of in is delayed until a partially collected line (if +it exists) is output. A temporary indentation value is reset to zero +also. +

    +

    The current indentation (as set by in) can be found in the +read-only register ‘.i’. The indentation is associated with the +environment (see Environments). +

    + +
    +
    Request: .ti offset
    +
    +
    Request: .ti +offset
    +
    Request: .ti -offset
    +
    Register: \n[.in]
    +
    +

    Temporarily indent the next output line by offset. If an +increment or decrement value is specified, adjust the temporary +indentation relative to the value set by the in request. +

    +

    This request causes a break; its value is associated with the +environment (see Environments). The default scaling unit is +‘m’. A call of ti without an argument is ignored. +

    +

    If the total indentation value is negative (which is not allowed), +gtroff emits a warning in category ‘range’ and sets the +temporary indentation to zero. ‘Total indentation’ is either +offset if specified as an absolute value, or the temporary plus +normal indentation, if offset is given as a relative value. +

    +

    The effect of ti is delayed until a partially collected line (if +it exists) is output. +

    +

    The read-only register .in is the indentation that applies to the +current output line. +

    +

    The difference between .i and .in is that the latter takes +into account whether a partially collected line still uses the old +indentation value or a temporary indentation value is active. +

    + +
    +
    Request: .ll [length]
    +
    +
    Request: .ll +length
    +
    Request: .ll -length
    +
    Register: \n[.l]
    +
    +
    Register: \n[.ll]
    +
    +

    Set the line length to length (or increment or decrement the +current value by length). Initially, the line length is set to +6.5i. The effect of ll is delayed until a partially +collected line (if it exists) is output. The default scaling unit is +‘m’. +

    +

    If ll is called without an argument, the line length is reset to +the previous value before the last call to ll. If a negative +line length is specified (which is not allowed), gtroff emits a +warning in category ‘range’ and sets the line length to zero. The +line length is associated with the environment (see Environments). +

    + +

    The current line length (as set by ll) can be found in the +read-only register ‘.l’. The read-only register .ll is the +line length that applies to the current output line. +

    +

    Similar to .i and .in, the difference between .l +and .ll is that the latter takes into account whether a partially +collected line still uses the old line length value. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Lists-in-ms.html b/doc/groff.html.node/Lists-in-ms.html new file mode 100644 index 0000000..bde2b7c --- /dev/null +++ b/doc/groff.html.node/Lists-in-ms.html @@ -0,0 +1,216 @@ + + + + + + +Lists in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.6 Lists

    + + +

    The marker argument to the IP macro can be employed to +present a variety of lists; for instance, you can use a bullet glyph +(\[bu]) for unordered lists, a number (or auto-incrementing +register) for numbered lists, or a word or phrase for glossary-style or +definition lists. If you set the paragraph indentation register +PI before calling IP, you can later reorder the items in +the list without having to ensure that a width argument remains +affixed to the first call. +

    +

    The following is an example of a bulleted list. + + +

    +
    +
    +
    .nr PI 2n
    +A bulleted list:
    +.IP \[bu]
    +lawyers
    +.IP \[bu]
    +guns
    +.IP \[bu]
    +money
    +
    +
    + +
    +
    A bulleted list:
    +
    +• lawyers
    +
    +• guns
    +
    +• money
    +
    + +

    The following is an example of a numbered list. + + +

    +
    +
    +
    .nr step 0 1
    +.nr PI 3n
    +A numbered list:
    +.IP \n+[step]
    +lawyers
    +.IP \n+[step]
    +guns
    +.IP \n+[step]
    +money
    +
    +
    + +
    +
    A numbered list:
    +
    +1. lawyers
    +
    +2. guns
    +
    +3. money
    +
    + +

    Here we have employed the nr request to create a register of our +own, ‘step’. We initialized it to zero and assigned it an +auto-increment of 1. Each time we use the escape sequence +‘\n+[PI]’ (note the plus sign), the formatter applies the increment +just before interpolating the register’s value. Preparing the PI +register as well enables us to rearrange the list without the tedium of +updating macro calls. +

    +

    The next example illustrates a glossary-style list. + + +

    +
    +
    +
    A glossary-style list:
    +.IP lawyers 0.4i
    +Two or more attorneys.
    +.IP guns
    +Firearms,
    +preferably large-caliber.
    +.IP money
    +Gotta pay for those
    +lawyers and guns!
    +
    +
    + +
    +
    A glossary-style list:
    +
    +lawyers
    +      Two or more attorneys.
    +
    +guns  Firearms, preferably large-caliber.
    +
    +money
    +      Gotta pay for those lawyers and guns!
    +
    + +

    In the previous example, observe how the IP macro places the +definition on the same line as the term if it has enough space. If this +is not what you want, there are a few workarounds we will illustrate by +modifying the example. First, you can use a br request to force +a break after printing the term or label. +

    +
    +
    +
    .IP guns
    +.br
    +Firearms,
    +
    +
    + +

    Second, you could apply the \p escape sequence to force a break. +The space following the escape sequence is important; if you omit it, +groff prints the first word of the paragraph text on the same +line as the term or label (if it fits) then breaks the line. +

    +
    +
    +
    .IP guns
    +\p Firearms,
    +
    +
    + +

    Finally, you may append a horizontal motion to the marker with the +\h escape sequence; using the same amount as the indentation will +ensure that the marker is too wide for groff to treat it as +“fitting” on the same line as the paragraph text. +

    +
    +
    +
    .IP guns\h'0.4i'
    +Firearms,
    +
    +
    + +

    In each case, the result is the same. +

    +
    +
    A glossary-style list:
    +
    +lawyers
    +      Two or more attorneys.
    +
    +guns
    +      Firearms, preferably large-caliber.
    +
    +money
    +      Gotta pay for those lawyers and guns!
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Macro-Directories.html b/doc/groff.html.node/Macro-Directories.html new file mode 100644 index 0000000..c1557bd --- /dev/null +++ b/doc/groff.html.node/Macro-Directories.html @@ -0,0 +1,125 @@ + + + + + + +Macro Directories (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.3 Macro Directories

    + + + + + +

    A macro file must have a name in the form name.tmac or +tmac.name and be placed in a tmac directory to be +found by the -mname command-line option.5 + + + + + + + + + + +Together, these directories constitute the tmac path. Each +directory is searched in the following order until the desired macro +file is found or the list is exhausted. +

    +
      +
    • Directories specified with GNU troff’s or groff’s +-M command-line option. + +
    • +Directories listed in the GROFF_TMAC_PATH environment variable. + +
    • + + + + + +The current working directory (only if in unsafe mode using the +-U command-line option). + +
    • + +The user’s home directory, HOME. + +
    • + + + +A platform-dependent directory, a site-local (platform-independent) +directory, and the main tmac directory. The locations +corresponding to your installation are listed in section “Environment” +of gtroff(1). If not otherwise configured, they are as +follows. + +
      +
      /usr/local/lib/groff/site-tmac
      +/usr/local/share/groff/site-tmac
      +/usr/local/share/groff/1.23.0/tmac
      +
      + +

      The foregoing assumes that the version of groff is 1.23.0, and +that the installation prefix was /usr/local. It is possible to +fine-tune these locations during the source configuration process. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Macro-Index.html b/doc/groff.html.node/Macro-Index.html new file mode 100644 index 0000000..c727a85 --- /dev/null +++ b/doc/groff.html.node/Macro-Index.html @@ -0,0 +1,335 @@ + + + + + + +Macro Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix F Macro Index

    + +

    The macro package a specific macro belongs to is appended in brackets. +They appear without the leading control character (normally ‘.’). +

    +
    +
    Jump to:   1 +   +2 +   +[ +   +] +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +X +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    1
    1C [ms]: ms Multiple Columns

    2
    2C [ms]: ms Multiple Columns

    [
    [ [ms]: ms Insertions

    ]
    ] [ms]: ms Insertions

    A
    AB [ms]: ms Document Description Macros
    AE [ms]: ms Document Description Macros
    AI [ms]: ms Document Description Macros
    AM [ms]: ms Legacy Features
    AU [ms]: ms Document Description Macros

    B
    B [ms]: Typeface and decoration
    B1 [ms]: ms keeps and displays
    B2 [ms]: ms keeps and displays
    BD [ms]: ms keeps and displays
    BI [ms]: Typeface and decoration
    BT [man]: Optional man extensions
    BX [ms]: Typeface and decoration

    C
    CD [ms]: ms keeps and displays
    CT [man]: Optional man extensions
    CW [man]: Optional man extensions
    CW [ms]: Typeface and decoration

    D
    DA [ms]: ms Document Description Macros
    De [man]: Optional man extensions
    DE [ms]: ms keeps and displays
    Ds [man]: Optional man extensions
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays
    DS [ms]: ms keeps and displays

    E
    EE [man]: Optional man extensions
    EF [ms]: ms Headers and Footers
    EH [ms]: ms Headers and Footers
    EN [ms]: ms Insertions
    EQ [ms]: ms Insertions
    EX [man]: Optional man extensions

    F
    FE [ms]: ms Footnotes
    FS [ms]: ms Footnotes

    G
    G [man]: Optional man extensions
    GL [man]: Optional man extensions

    H
    HB [man]: Optional man extensions

    I
    I [ms]: Typeface and decoration
    ID [ms]: ms keeps and displays
    IP [ms]: Paragraphs in ms

    K
    KE [ms]: ms keeps and displays
    KF [ms]: ms keeps and displays
    KS [ms]: ms keeps and displays

    L
    LD [ms]: ms keeps and displays
    LG [ms]: Typeface and decoration
    LP [ms]: Paragraphs in ms

    M
    MC [ms]: ms Multiple Columns
    MS [man]: Optional man extensions

    N
    ND [ms]: ms Document Description Macros
    NE [man]: Optional man extensions
    NH [ms]: Headings in ms
    NL [ms]: Typeface and decoration
    NT [man]: Optional man extensions

    O
    OF [ms]: ms Headers and Footers
    OH [ms]: ms Headers and Footers

    P
    P1 [ms]: ms Headers and Footers
    PE [ms]: ms Insertions
    PF [ms]: ms Insertions
    PN [man]: Optional man extensions
    Pn [man]: Optional man extensions
    PP [ms]: Paragraphs in ms
    PS [ms]: ms Insertions
    PT [man]: Optional man extensions
    PX [ms]: ms TOC

    Q
    QE [ms]: Paragraphs in ms
    QP [ms]: Paragraphs in ms
    QS [ms]: Paragraphs in ms

    R
    R [man]: Optional man extensions
    R [ms]: Typeface and decoration
    RD [ms]: ms keeps and displays
    RE [ms]: Indented regions in ms
    RN [man]: Optional man extensions
    RP [ms]: ms Document Description Macros
    RS [ms]: Indented regions in ms

    S
    SH [ms]: Headings in ms
    SM [ms]: Typeface and decoration

    T
    TA [ms]: Tab Stops in ms
    TB [man]: Optional man extensions
    TC [ms]: ms TOC
    TE [ms]: ms Insertions
    TL [ms]: ms Document Description Macros
    TS [ms]: ms Insertions

    U
    UL [ms]: Typeface and decoration

    V
    VE [man]: Optional man extensions
    VS [man]: Optional man extensions

    X
    XA [ms]: ms TOC
    XE [ms]: ms TOC
    XH [ms]: ms TOC
    XH-REPLACEMENT [ms]: ms TOC
    XH-UPDATE-TOC [ms]: ms TOC
    XN [ms]: ms TOC
    XN-INIT [ms]: ms TOC
    XN-REPLACEMENT [ms]: ms TOC
    XP [ms]: Paragraphs in ms
    XS [ms]: ms TOC

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Macro-Package-Intro.html b/doc/groff.html.node/Macro-Package-Intro.html new file mode 100644 index 0000000..77f2036 --- /dev/null +++ b/doc/groff.html.node/Macro-Package-Intro.html @@ -0,0 +1,63 @@ + + + + + + +Macro Package Intro (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.4 Macro Packages

    + + + +

    Elemental typesetting functions can be be challenging to use directly +with complex documents. A macro facility specifies how certain +routine operations, such as starting paragraphs, or printing headers and +footers, should be performed in terms of those low-level instructions. +Macros can be specific to one document or collected together into a +macro package for use by many. Several macro packages available; +the most widely used are provided with groff. They are +man, mdoc, me, mm, mom, and +ms. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Macro-Packages.html b/doc/groff.html.node/Macro-Packages.html new file mode 100644 index 0000000..762ea31 --- /dev/null +++ b/doc/groff.html.node/Macro-Packages.html @@ -0,0 +1,64 @@ + + + + + + +Macro Packages (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.8 Macro Packages

    + + + +

    Macro definitions can be collected into macro files, roff +input files designed to produce no output themselves but instead ease +the preparation of other roff documents. There is no syntactical +difference between a macro file and any other roff document; only +its purpose distinguishes it. When a macro file is installed at a +standard location and suitable for use by a general audience, it is +often termed a macro package.29 Macro packages can be +loaded by supplying the -m option to GNU troff or a +groff front end. Alternatively, a document requiring a macro +package can load it with the mso (“macro source”) request. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Major-Macro-Packages.html b/doc/groff.html.node/Major-Macro-Packages.html new file mode 100644 index 0000000..414994f --- /dev/null +++ b/doc/groff.html.node/Major-Macro-Packages.html @@ -0,0 +1,103 @@ + + + + + + +Major Macro Packages (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4 Macro Packages

    + + + + +

    This chapter surveys the “major” macro packages that come with +groff. One, ms, is presented in detail. +

    + + + +

    Major macro packages are also sometimes described as full-service +due to the breadth of features they provide and because more than one +cannot be used by the same document; for example +

    +
    +
    groff -m man foo.man -m ms bar.doc
    +
    + +

    doesn’t work. Option arguments are processed before non-option +arguments; the above (failing) sample is thus reordered to +

    +
    +
    groff -m man -m ms foo.man bar.doc
    +
    + + + + + + + +

    Many auxiliary, or “minor”, macro packages are also available. They +may in general be used with any full-service macro package and handle a +variety of tasks from character encoding selection, to language +localization, to inlining of raster images. See the +groff_tmac(5) man page for a list. Type ‘man +groff_tmac’ at the command line to view it. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html b/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html new file mode 100644 index 0000000..632aade --- /dev/null +++ b/doc/groff.html.node/Manipulating-Filling-and-Adjustment.html @@ -0,0 +1,501 @@ + + + + + + +Manipulating Filling and Adjustment (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.9 Manipulating Filling and Adjustment

    + + + + + + + + + + + + + + + + + + + +

    When an output line is pending (see below), a break moves the drawing +position to the beginning of the next text baseline, interrupting +filling. Various ways of causing breaks were shown in Breaking. +The br request likewise causes a break. Several other requests +imply breaks: bp, ce, cf, fi, fl, +in, nf, rj, sp, ti, and trf. +If the no-break control character is used with any of these requests, +GNU troff suppresses the break; instead the requested operation +takes effect at the next break. ‘'br’ does nothing. +

    +
    +
    .ll 55n
    +This line is normally filled and adjusted.
    +.br
    +A line's alignment is decided
    +'ce \" Center the next input line (no break).
    +when it is output.
    +This line returns to normal filling and adjustment.
    +    ⇒ This line is normally filled and adjusted.
    +    ⇒    A line's alignment is decided when it is output.
    +    ⇒ This line returns to normal filling and adjustment.
    +
    + + + + + +

    Output line properties like page offset, indentation, adjustment, and +even the location of its text baseline, are not determined until the +line has been broken. An output line is said to be pending if +some input has been collected but an output line corresponding to it has +not yet been written; such an output line is also termed partially +collected. If no output line is pending, it is as if a break has +already happened; additional breaks, whether explicit or implicit, have +no effect. If the vertical drawing position is negative—as it is when +the formatter starts up—a break starts a new page (even if no output +line is pending) unless an end-of-input macro is being interpreted. +See End-of-input Traps. +

    +
    +
    Request: .br
    +
    +

    Break the line: emit any pending output line without adjustment. +

    +
    +
    foo bar
    +.br
    +baz
    +'br
    +qux
    +    ⇒ foo bar
    +    ⇒ baz qux
    +
    +
    + +

    Sometimes you want to prevent a break within a phrase or between a +quantity and its units. +

    +
    +
    Escape sequence: \~
    +
    + + +

    Insert an unbreakable space that is adjustable like an ordinary space. +It is discarded from the end of an output line if a break is forced. +

    +
    +
    Set the output speed to\~1.
    +There are 1,024\~bytes in 1\~KiB.
    +J.\~F.\~Ossanna wrote the original CSTR\~#54.
    +
    +
    + +

    By default, GNU troff fills text and adjusts it to reach the +output line length. The nf request disables filling; the +fi request reënables it. +

    +
    +
    Request: .fi
    +
    +
    Register: \n[.u]
    +
    + + + + +

    Enable filling of output lines; a pending output line is broken. The +read-only register .u is set to 1. The filling enablement +status, sometimes called fill mode, is associated with the +environment (see Environments). See Line Continuation, for +interaction with the \c escape sequence. +

    + +
    +
    Request: .nf
    +
    + + + + + + +

    Disable filling of output lines: the output line length (see Line Layout) is ignored and output lines are broken where the input lines +are. A pending output line is broken and adjustment is suppressed. The +read-only register .u is set to 0. The filling enablement +status is associated with the environment (see Environments). See +Line Continuation, for interaction with the \c escape +sequence. +

    + +
    +
    Request: .ad [mode]
    +
    +
    Register: \n[.j]
    +
    +

    Enable output line adjustment in mode, taking effect when the +pending (or next) output line is broken. Adjustment is suppressed when +filling is. mode can have one of the following values. +

    +
    +
    b
    +
    n
    +

    Adjust “normally”: if the output line does not consume the distance +between the indentation and the configured output line length, GNU +troff stretches adjustable spaces within the line until that +length is reached. When the indentation is zero, this mode spreads the +line to both the left and right margins. This is the GNU troff +default. +

    +
    +
    c
    +

    Center filled text. Contrast with the ce request, which centers +text without filling it. +

    +
    +
    l
    +

    Align text to the left without adjusting it. +

    +
    +
    r
    +

    Align text to the right without adjusting it. +

    +
    + +

    mode can also be a value previously stored in the .j +register. Using ad without an argument is the same as ‘.ad +\n[.j]’; unless filling is disabled, GNU troff resumes adjusting +lines in the same way it did before adjustment was disabled by +invocation of the na request. +

    + +

    The adjustment mode and enablement status are encoded in the read-only +register .j. These parameters are associated with the +environment (see Environments). +

    +

    The value of .j for any adjustment mode is an implementation +detail and should not be relied upon as a programmer’s interface. Do +not write logic to interpret or perform arithmetic on it. +

    +
    +
    .ll 48n
    +.de AD
    +.  br
    +.  ad \\$1
    +..
    +.de NA
    +.  br
    +.  na
    +..
    +left
    +.AD r
    +.nr ad \n(.j
    +right
    +.AD c
    +center
    +.NA
    +left
    +.AD
    +center
    +.AD \n(ad
    +right
    +
    +
    +
        ⇒ left
    +    ⇒                                            right
    +    ⇒                      center
    +    ⇒ left
    +    ⇒                      center
    +    ⇒                                            right
    +
    +
    + +
    +
    Request: .na
    +
    +

    Disable output line adjustment. This produces the same output as +left-alignment, but the value of the adjustment mode register .j +is altered differently. The adjustment mode and enablement status are +associated with the environment (see Environments). +

    + +
    +
    Request: .brp
    +
    +
    Escape sequence: \p
    +
    +

    Break, adjusting the line per the current adjustment mode. \p +schedules a break with adjustment at the next word boundary. The escape +sequence is itself neither a break nor a space of any kind; it can thus +be placed in the middle of a word to cause a break at the end of that +word. +

    +

    Breaking with immediate adjustment can produce ugly results since GNU +troff doesn’t have a sophisticated paragraph-building algorithm, +as TeX has, for example. Instead, GNU troff fills and adjusts +a paragraph line by line. +

    +
    +
    .ll 4.5i
    +This is an uninteresting sentence.
    +This is an uninteresting sentence.\p
    +This is an uninteresting sentence.
    +
    + +

    is formatted as follows. +

    +
    +
    This  is  an uninteresting sentence.  This is
    +an          uninteresting           sentence.
    +This is an uninteresting sentence.
    +
    +
    + + + + +

    To clearly present the next couple of requests, we must introduce the +concept of “productive” input lines. A productive input line is +one that directly produces formatted output. Text lines produce +output,53 as do control +lines containing requests like tl or escape sequences like +\D. Macro calls are not directly productive, and thus not +counted, but their interpolated contents can be. Empty requests, and +requests and escape sequences that define registers or strings or alter +the formatting environment (as with changes to the size, face, height, +slant, or color of the type) are not productive. We will also preview +the output line continuation escape sequence, \c, which +“connects” two input lines that would otherwise be counted separately. +54 +

    +
    +
    .de hello
    +Hello, world!
    +..
    +.ce \" center output of next productive input line
    +.
    +.nr junk-reg 1
    +.ft I
    +Chorus: \c
    +.ft
    +.hello
    +Went the day well?
    +  ⇒                  Chorus: Hello, world!
    +  ⇒ Went the day well?
    +
    + +
    +
    Request: .ce [n]
    +
    +
    Register: \n[.ce]
    +
    + + + +

    Break (unless the no-break control character is used), center the output +of the next n productive input lines with respect to the line +length and indentation without filling, then break again regardless of +the invoking control character. +If the argument is not positive, centering is disabled. Omitting the +argument implies an n of ‘1’. The count of lines remaining +to be centered is stored in the read-only register .ce and is +associated with the environment (see Environments). +

    + +

    While the ‘.ad c request also centers text, it fills the text +as well. +

    +
    +
    .de FR
    +This is a small text fragment that shows the differences
    +between the `.ce' and the `.ad c' requests.
    +..
    +.ll 4i
    +.ce 1000
    +.FR
    +.ce 0
    +
    +.ad c
    +.FR
    +    ⇒ This is a small text fragment that shows
    +    ⇒              the differences
    +    ⇒ between the ‘.ce’ and the ‘.ad c’ requests.
    +    ⇒
    +    ⇒ This is a small text fragment that shows
    +    ⇒  the differences between the ‘.ce’ and
    +    ⇒         the ‘.ad c’ requests.
    +
    + +

    The previous example illustrates a common idiom of turning centering on +for a quantity of lines far in excess of what is required, and off again +after the text to be centered. This technique relieves humans of +counting lines for requests that take a count of input lines as an +argument. +

    + +
    +
    Request: .rj [n]
    +
    +
    Register: \n[.rj]
    +
    + + + +

    Break (unless the no-break control character is used), align the output +of the next n productive input lines to the right margin without +filling, then break again regardless of the control character. +If the argument is not positive, right-alignment is disabled. Omitting +the argument implies an n of ‘1’. The count of lines +remaining to be right-aligned is stored in the read-only register +.rj and is associated with the environment +(see Environments). +

    +
    +
    .ll 49n
    +.rj 3
    +At first I hoped that such a technically unsound
    +project would collapse but I soon realized it was
    +doomed to success. \[em] C. A. R. Hoare
    +    ⇒  At first I hoped that such a technically unsound
    +    ⇒ project would collapse but I soon realized it was
    +    ⇒              doomed to success. -- C. A. R. Hoare
    +
    +
    + +
    +
    Request: .ss word-space-size [additional-sentence-space-size]
    +
    +
    Register: \n[.ss]
    +
    +
    Register: \n[.sss]
    +
    + + + + + + + +

    Set the sizes of spaces between words and +sentences55 in twelfths +of font’s space width (typically one-fourth to one-third em for Western +scripts). The default for both parameters is 12. Negative values +are erroneous. + + + +The first argument is a minimum; if an output line undergoes adjustment, +such spaces may increase in width. + + + +The optional second argument sets the amount of additional space +separating sentences on the same output line. If omitted, this amount +is set to word-space-size. The request is ignored if there are no +parameters. +

    + + +

    Additional inter-sentence space is used only if the output line is not +full when the end of a sentence occurs in the input. If a sentence ends +at the end of an input line, then both an inter-word space and an +inter-sentence space are added to the output; if two spaces follow the +end of a sentence in the middle of an input line, then the second space +becomes an inter-sentence space in the output. Additional +inter-sentence space is not adjusted, but the inter-word space that +always precedes it may be. Further input spaces after the second, if +present, are adjusted as normal. +

    +

    The read-only registers .ss and .sss hold the minimal +inter-word space and additional inter-sentence space amounts, +respectively. These parameters are part of the environment +(see Environments), and rounded down to the nearest multiple +of 12 on terminals. +

    + + + +

    The ss request can insert discardable horizontal space; that is, +space that is discarded at a break. For example, some footnote styles +collect the notes into a single paragraph with large gaps between +each note. +

    +
    +
    .ll 48n
    +1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14.
    +.ss 12 48 \" applies to next sentence ending
    +Reprints no longer available through FCS.
    +.ss 12 \" go back to normal
    +2.\~Better known for other work.
    +    ⇒ 1.  J.  Fict. Ch. Soc. 6 (2020), 3-14.  Reprints
    +    ⇒ no longer available through FCS.      2.  Better
    +    ⇒ known for other work.
    +
    + +

    If undiscardable space is required, use the \h escape +sequence. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Manipulating-Hyphenation.html b/doc/groff.html.node/Manipulating-Hyphenation.html new file mode 100644 index 0000000..6d88ea8 --- /dev/null +++ b/doc/groff.html.node/Manipulating-Hyphenation.html @@ -0,0 +1,580 @@ + + + + + + +Manipulating Hyphenation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.10 Manipulating Hyphenation

    + + + + + +

    When filling, GNU troff hyphenates words as needed at +user-specified and automatically determined hyphenation points. The +machine-driven determination of hyphenation points in words requires +algorithms and data, and is susceptible to conventions and preferences. +Before tackling such automatic hyphenation, let us consider how +hyphenation points can be set explicitly. +

    + + + + +

    Explicitly hyphenated words such as “mother-in-law” are eligible for +breaking after each of their hyphens. Relatively few words in a +language offer such obvious break points, however, and automatic +detection of syllabic (or phonetic) boundaries for hyphenation is not +perfect,56 particularly for +unusual words found in technical literature. We can instruct GNU +troff how to hyphenate specific words if the need arises. +

    + +
    +
    Request: .hw word …
    +
    +

    Define each hyphenation exception word with each hyphen ‘-’ +in the word indicating a hyphenation point. For example, the request +

    +
    +
    .hw in-sa-lub-rious alpha
    +
    + +

    marks potential hyphenation points in “insalubrious”, and prevents +“alpha” from being hyphenated at all. +

    +

    Besides the space character, any character whose hyphenation code is +zero can be used to separate the arguments of hw (see the +hcode request below). In addition, this request can be used more +than once. +

    + +

    Hyphenation points specified with hw are not subject to the +within-word placement restrictions imposed by the hy request (see +below). +

    +

    Hyphenation exceptions specified with the hw request are +associated with the hyphenation language (see the hla request +below) and environment (see Environments); invoking the hw +request in the absence of a hyphenation language is an error. +

    +

    The request is ignored if there are no parameters. +

    + +

    These are known as hyphenation exceptions in the expectation +that most users will avail themselves of automatic hyphenation; these +exceptions override any rules that would normally apply to a word +matching a hyphenation exception defined with hw. +

    +

    Situations also arise when only a specific occurrence of a word needs +its hyphenation altered or suppressed, or when a URL or similar string +needs to be breakable in sensible places without hyphenation. +

    +
    +
    Escape sequence: \%
    +
    +
    Escape sequence: \:
    +
    + + + + +

    To tell GNU troff how to hyphenate words as they occur in input, +use the \% escape sequence; it is the default hyphenation +character. Each instance within a word indicates to GNU troff +that the word may be hyphenated at that point, while prefixing a word +with this escape sequence prevents it from being otherwise hyphenated. +This mechanism affects only that occurrence of the word; to change the +hyphenation of a word for the remainder of input processing, use the +hw request. +

    + + + +

    GNU troff regards the escape sequences \X and \Y as +starting a word; that is, the \% escape sequence in, say, +‘\X'...'\%foobar or ‘\Y'...'\%foobar no longer +prevents hyphenation of ‘foobar’ but inserts a hyphenation point +just prior to it; most likely this isn’t what you want. +See Postprocessor Access. +

    + + + + + + +

    \: inserts a non-printing break point; that is, a word can break +there, but the soft hyphen glyph (see below) is not written to the +output if it does. This escape sequence is an input word boundary, so +the remainder of the word is subject to hyphenation as normal. +

    +

    You can combine \: and \% to control breaking of a file +name or URL, or to permit hyphenation only after certain explicit +hyphens within a word. +

    +
    +
    The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce
    +was, in retrospect, inevitable once the contents of
    +\%/var/log/\:\%httpd/\:\%access_log on the family web
    +server came to light, revealing visitors from Hogwarts.
    +
    +
    + +
    +
    Request: .hc [char]
    +
    +

    Change the hyphenation character to char. This character then +works as the \% escape sequence normally does, and thus no longer +appears in the output.57 Without an +argument, hc resets the hyphenation character to \% (the +default). The hyphenation character is associated with the environment +(see Environments). +

    + +
    +
    Request: .shc [c]
    +
    + + + + + + +

    Set the soft hyphen character, inserted when a word is hyphenated +automatically or at a hyphenation character, to the ordinary or special +character c.58 If the argument is omitted, the soft +hyphen character is set to the default, \[hy]. If no glyph for +c exists in the font in use at a potential hyphenation point, then +the line is not broken there. Neither character definitions (specified +with the char and similar requests) nor translations (specified +with the tr request) are applied to c. +

    + + + +

    Several requests influence automatic hyphenation. Because conventions +vary, a variety of hyphenation modes is available to the hy +request; these determine whether hyphenation will apply to a +word prior to breaking a line at the end of a page (more or less; see +below for details), and at which positions within that word +automatically determined hyphenation points are permissible. The places +within a word that are eligible for hyphenation are determined by +language-specific data and lettercase relationships. Furthermore, +hyphenation of a word might be suppressed due to a limit on +consecutive hyphenated lines (hlm), a minimum line length +threshold (hym), or because the line can instead be adjusted with +additional inter-word space (hys). +

    + +
    +
    Request: .hy [mode]
    +
    +
    Register: \n[.hy]
    +
    +

    Set automatic hyphenation mode to mode, an integer encoding +conditions for hyphenation; if omitted, ‘1’ is implied. The +hyphenation mode is available in the read-only register ‘.hy’; it +is associated with the environment (see Environments). The default +hyphenation mode depends on the localization file loaded when GNU +troff starts up; see the hpf request below. +

    +

    Typesetting practice generally does not avail itself of every +opportunity for hyphenation, but the details differ by language and site +mandates. The hyphenation modes of AT&T troff were +implemented with English-language publishing practices of the 1970s in +mind, not a scrupulous enumeration of conceivable parameters. GNU +troff extends those modes such that finer-grained control is +possible, favoring compatibility with older implementations over a more +intuitive arrangement. The means of hyphenation mode control is a set +of numbers that can be added up to encode the behavior +sought.59 The entries in the +following table are termed values; the sum of the desired +values is the mode. +

    +
    +
    0
    +

    disables hyphenation. +

    +
    +
    1
    +

    enables hyphenation except after the first and before the last character +of a word. +

    +
    + +

    The remaining values “imply” 1; that is, they enable hyphenation +under the same conditions as ‘.hy 1’, and then apply or lift +restrictions relative to that basis. +

    +
    +
    2
    +

    disables hyphenation of the last word on a page,60 even for explicitly hyphenated words. +

    +
    +
    4
    +

    disables hyphenation before the last two characters of a word. +

    +
    +
    8
    +

    disables hyphenation after the first two characters of a word. +

    +
    +
    16
    +

    enables hyphenation before the last character of a word. +

    +
    +
    32
    +

    enables hyphenation after the first character of a word. +

    +
    + +

    Apart from value 2, restrictions imposed by the hyphenation mode +are not respected for words whose hyphenations have been +specified with the hyphenation character (‘\%’ by default) or the +hw request. +

    +

    Nonzero values in the previous table are additive. For example, +mode 12 causes GNU troff to hyphenate neither the last two +nor the first two characters of a word. Some values cannot be used +together because they contradict; for instance, values 4 and 16, +and values 8 and 32. As noted, it is superfluous to add 1 to any +non-zero even mode. +

    + + +

    The automatic placement of hyphens in words is determined by +pattern files, which are derived from TeX and available for +several languages. The number of characters at the beginning of a word +after which the first hyphenation point should be inserted is determined +by the patterns themselves; it can’t be reduced further without +introducing additional, invalid hyphenation points (unfortunately, this +information is not part of a pattern file—you have to know it in +advance). The same is true for the number of characters at the end of +a word before the last hyphenation point should be inserted. For +example, you can supply the following input to ‘echo $(nroff)’. +

    +
    +
    .ll 1
    +.hy 48
    +splitting
    +
    + +

    You will get +

    +
    +
    s- plit- t- in- g
    +
    + +

    instead of the correct ‘split- ting’. English patterns as distributed +with GNU troff need two characters at the beginning and three +characters at the end; this means that value 4 of hy is +mandatory. Value 8 is possible as an additional restriction, but +values 16 and 32 should be avoided, as should mode 1. +Modes 4 and 6 are typical. +

    +

    A table of left and right minimum character counts for hyphenation as +needed by the patterns distributed with GNU troff follows; see +the groff_tmac(5) man page for more information on GNU +troff’s language macro files. +

    + + + + + + + + + + +
    languagepattern nameleft minright min
    Czechcs22
    Englishen23
    Frenchfr23
    German traditionaldet22
    German reformedden22
    Italianit22
    Swedishsv12
    + +

    Hyphenation exceptions within pattern files (i.e., the words within a +TeX \hyphenation group) obey the hyphenation restrictions +given by hy. +

    + +
    +
    Request: .nh
    +
    +

    Disable automatic hyphenation; i.e., set the hyphenation mode to 0 +(see above). The hyphenation mode of the last call to hy is not +remembered. +

    + +
    +
    Request: .hpf pattern-file
    +
    +
    Request: .hpfa pattern-file
    +
    +
    Request: .hpfcode a b [c d] …
    +
    + + +

    Read hyphenation patterns from pattern-file, which is sought +in the same way that macro files are with the mso request or the +-mname command-line option to groff. The +pattern-file should have the same format as (simple) TeX +pattern files. More specifically, the following scanning rules are +implemented. +

    +
      +
    • A percent sign starts a comment (up to the end of the line) even if +preceded by a backslash. + +
    • “Digraphs” like \$ are not supported. + +
    • ^^xx (where each x is 0–9 or a–f) and +^^c (character c in the code point range 0–127 +decimal) are recognized; other uses of ^ cause an error. + +
    • No macro expansion is performed. + +
    • hpf checks for the expression \patterns{…} +(possibly with whitespace before or after the braces). Everything +between the braces is taken as hyphenation patterns. Consequently, +{ and } are not allowed in patterns. + +
    • Similarly, \hyphenation{…} gives a list of hyphenation +exceptions. + +
    • \endinput is recognized also. + +
    • For backward compatibility, if \patterns is missing, the whole +file is treated as a list of hyphenation patterns (except that the +% character is recognized as the start of a comment). +
    + +

    The hpfa request appends a file of patterns to the current list. +

    +

    The hpfcode request defines mapping values for character codes in +pattern files. It is an older mechanism no longer used by GNU +troff’s own macro files; for its successor, see hcode +below. hpf or hpfa apply the mapping after reading the +patterns but before replacing or appending to the active list of +patterns. Its arguments are pairs of character codes—integers from 0 +to 255. The request maps character code a to +code b, code c to code d, and so on. +Character codes that would otherwise be invalid in GNU troff can +be used. By default, every code maps to itself except those for letters +‘A’ to ‘Z’, which map to those for ‘a’ to ‘z’. +

    + + + + + + + + + + +

    The set of hyphenation patterns is associated with the language set by +the hla request (see below). The hpf request is usually +invoked by a localization file loaded by the troffrc +file.61 +

    +

    A second call to hpf (for the same language) replaces the +hyphenation patterns with the new ones. Invoking hpf or +hpfa causes an error if there is no hyphenation language. If no +hpf request is specified (either in the document, in a file +loaded at startup, or in a macro package), GNU troff won’t +automatically hyphenate at all. +

    + +
    +
    Request: .hcode c1 code1 [c2 code2] …
    +
    + + +

    Set the hyphenation code of character c1 to code1, that of +c2 to code2, and so on. A hyphenation code must be an +ordinary character (not a special character escape sequence) other than +a digit or a space. The request is ignored if given no arguments. +

    +

    For hyphenation to work, hyphenation codes must be set up. At +startup, GNU troff assigns hyphenation codes to the letters +‘a’–‘z’ (mapped to themselves), to the letters +‘A’–‘Z’ (mapped to ‘a’–‘z’), and zero to all other +characters. Normally, hyphenation patterns contain only lowercase +letters which should be applied regardless of case. In other words, +they assume that the words ‘FOO’ and ‘Foo’ should be hyphenated exactly +as ‘foo’ is. The hcode request extends this principle to letters +outside the Unicode basic Latin alphabet; without it, words containing +such letters won’t be hyphenated properly even if the corresponding +hyphenation patterns contain them. +

    +

    For example, the following hcode requests are necessary to assign +hyphenation codes to the letters ‘ÄäÖöÜüß’, needed for German. +

    +
    +
    .hcode ä ä  Ä ä
    +.hcode ö ö  Ö ö
    +.hcode ü ü  Ü ü
    +.hcode ß ß
    +
    + +

    Without these assignments, GNU troff treats the German word +‘Kindergärten’ (the plural form of ‘kindergarten’) as two words +‘kinderg’ and ‘rten’ because the hyphenation code of the +umlaut a is zero by default, just like a space. There is a German +hyphenation pattern that covers ‘kinder’, so GNU troff finds +the hyphenation ‘kin-der’. The other two hyphenation points +(‘kin-der-gär-ten’) are missed. +

    + +
    +
    Request: .hla lang
    +
    +
    Register: \n[.hla]
    +
    + + + + +

    Set the hyphenation language to lang. Hyphenation exceptions +specified with the hw request and hyphenation patterns and +exceptions specified with the hpf and hpfa requests are +associated with the hyphenation language. The hla request is +usually invoked by a localization file, which is turn loaded by the +troffrc or troffrc-end file; see the hpf request +above. +

    + +

    The hyphenation language is available in the read-only string-valued +register ‘.hla’; it is associated with the environment +(see Environments). +

    + +
    +
    Request: .hlm [n]
    +
    +
    Register: \n[.hlm]
    +
    +
    Register: \n[.hlc]
    +
    + + + + + +

    Set the maximum quantity of consecutive hyphenated lines to n. If +n is negative, there is no maximum. If omitted, n +is −1. This value is associated with the environment +(see Environments). Only lines output from a given environment +count toward the maximum associated with that environment. Hyphens +resulting from \% are counted; explicit hyphens are not. +

    + + +

    The .hlm read-only register stores this maximum. The count of +immediately preceding consecutive hyphenated lines is available in the +read-only register .hlc. +

    + +
    +
    Request: .hym [length]
    +
    +
    Register: \n[.hym]
    +
    + + + +

    Set the (right) hyphenation margin to length. If the adjustment +mode is not ‘b’ or ‘n’, the line is not hyphenated if it is +shorter than length. Without an argument, the hyphenation margin +is reset to its default value, 0. The default scaling unit is ‘m’. +The hyphenation margin is associated with the environment +(see Environments). +

    +

    A negative argument resets the hyphenation margin to zero, emitting a +warning in category ‘range’. +

    + +

    The hyphenation margin is available in the .hym read-only +register. +

    + +
    +
    Request: .hys [hyphenation-space]
    +
    +
    Register: \n[.hys]
    +
    + + + +

    Suppress hyphenation of the line in adjustment modes ‘b’ or +‘n’ if it can be justified by adding no more than +hyphenation-space extra space to each inter-word space. Without +an argument, the hyphenation space adjustment threshold is set to its +default value, 0. The default scaling unit is ‘m’. The +hyphenation space adjustment threshold is associated with the +environment (see Environments). +

    +

    A negative argument resets the hyphenation space adjustment threshold to +zero, emitting a warning in category ‘range’. +

    + +

    The hyphenation space adjustment threshold is available in the +.hys read-only register. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Manipulating-Spacing.html b/doc/groff.html.node/Manipulating-Spacing.html new file mode 100644 index 0000000..6b45b8a --- /dev/null +++ b/doc/groff.html.node/Manipulating-Spacing.html @@ -0,0 +1,220 @@ + + + + + + +Manipulating Spacing (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.11 Manipulating Spacing

    + + + +

    A break causes the formatter to update the vertical drawing position at +which the new text baseline is aligned. You can alter this location. +

    +
    +
    Request: .sp [distance]
    +
    +

    Break and move the next text baseline down by distance, or until +springing a page location trap.62 +If invoked with the no-break control character, sp moves the +pending output line’s text baseline by distance. A negative +distance will not reduce the position of the text baseline below +zero. Inside a diversion, any distance argument is ignored. The +default scaling unit is ‘v’. If distance is not specified, +‘1v’ is assumed. +

    +
    +
    .pl 5v \" Set page length to 5 vees.
    +.de xx
    +\-\-\-
    +.  br
    +..
    +.wh 0 xx \" Set a trap at the top of the page.
    +foo on page \n%
    +.sp 2v
    +bar on page \n%
    +.sp 50v \" This will cause a page break.
    +baz on page \n%
    +.pl \n(nlu \" Truncate page to current position.
    +    ⇒ ---
    +    ⇒ foo on page 1
    +    ⇒
    +    ⇒
    +    ⇒ bar on page 1
    +    ⇒ ---
    +    ⇒ baz on page 2
    +
    + +

    You might use the following macros to set the baseline of the next +output text at a given distance from the top or the bottom of the page. +We subtract one line height (\n[.v]) because the | +operator moves to one vee below the page top (recall Numeric Expressions). +

    +
    +
    .de y-from-top-down
    +.  sp |\\$1-\\n[.v]u
    +..
    +.
    +.de y-from-bot-up
    +.  sp |\\n[.p]u-\\$1-\\n[.v]u
    +..
    +
    + +

    A call to ‘.y-from-bot-up 10c’ means that the next text baseline +will be 10 cm from the bottom edge of the paper. +

    + +
    +
    Request: .ls [count]
    +
    +
    Register: \n[.L]
    +
    + +

    Set the line spacing; add count−1 blank lines after each +line of text. With no argument, GNU troff uses the previous +value before the last ls call. The default is 1. +

    + + +

    The read-only register .L contains the current line spacing; it +is associated with the environment (see Environments). +

    + +

    The ls request is a coarse mechanism. See Changing the Type Size, for the requests vs and pvs as alternatives to +ls. +

    +
    +
    Escape sequence: \x'spacing'
    +
    +
    Register: \n[.a]
    +
    +

    Sometimes, an output line requires additional vertical spacing, for +instance to allow room for a tall construct like an inline equation with +exponents or subscripts (particularly if they are iterated). The +\x escape sequence takes a delimited measurement (like +‘\x'3p'’) to increase the vertical spacing of the pending output +line. The default scaling unit is ‘v’. If the measurement is +positive, extra vertical space is inserted below the current line; a +negative measurement adds space above. If \x is applied to the +pending output line multiple times, the maxima of the positive and +negative adjustments are separately applied. The delimiter need not be +a neutral apostrophe; see Delimiters. +

    + +

    The .a read-only register contains the extra vertical spacing +after the text baseline of the most recently emitted output line. +(In other words, it is the largest positive argument to \x +encountered on that line.) This quantity is exposed via a register +because if an output line requires this “extra post-vertical line +spacing”, and the subsequent output line requires “extra pre-vertical +line spacing” (a negative argument to \x), then applying both +can lead to excessive spacing between the output lines. Text that is +piling high on line n might not require (as much) extra +pre-vertical line spacing if line n−1 carries extra +post-vertical line spacing. +

    +

    Use of \x can be necessary in combination with the +bracket-building escape sequence \b,63 as the following example shows. +

    +
    +
    .nf
    +This is a test of \[rs]b (1).
    +This is a test of \[rs]b (2).
    +This is a test of \b'xyz'\x'-1m'\x'1m' (3).
    +This is a test of \[rs]b (4).
    +This is a test of \[rs]b (5).
    +    ⇒ This is a test of \b (1).
    +    ⇒ This is a test of \b (2).
    +    ⇒                   x
    +    ⇒ This is a test of y (3).
    +    ⇒                   z
    +    ⇒ This is a test of \b (4).
    +    ⇒ This is a test of \b (5).
    +
    +
    + +

    Without \x, the backslashes on the lines marked ‘(2)’ and +‘(4)’ would be overprinted. +

    +
    +
    Request: .ns
    +
    +
    Request: .rs
    +
    +
    Register: \n[.ns]
    +
    + + + + + +

    Enable no-space mode. Vertical spacing, whether by sp +requests or blank input lines, is disabled. The bp request to +advance to the next page is also disabled, unless it is accompanied by a +page number (see Page Control). No-space mode ends automatically +when text64 is formatted for output 65 or the rs request is invoked, which ends +no-space mode. The read-only register .ns interpolates a Boolean +value indicating the enablement of no-space mode. +

    +

    A paragraphing macro might ordinarily insert vertical space to separate +paragraphs. A section heading macro could invoke ns to suppress +this spacing for the first paragraph in a section. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html b/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html new file mode 100644 index 0000000..e566ad7 --- /dev/null +++ b/doc/groff.html.node/Manipulating-Type-Size-and-Vertical-Spacing.html @@ -0,0 +1,74 @@ + + + + + + +Manipulating Type Size and Vertical Spacing (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.20 Manipulating Type Size and Vertical Spacing

    + + + + + + + + +

    These concepts were introduced in Page Geometry. The height of a +font’s tallest glyph is one em, which is equal to the type size in +points.82 A vertical spacing of less than 120% of +the type size can make a document hard to read. Larger proportions can +be useful to spread the text for annotations or proofreader’s marks. By +default, GNU troff uses 10 point type on 12 point +spacing. + +Typographers call the difference between type size and vertical spacing +leading.83 +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Measurements.html b/doc/groff.html.node/Measurements.html new file mode 100644 index 0000000..a4f1c82 --- /dev/null +++ b/doc/groff.html.node/Measurements.html @@ -0,0 +1,177 @@ + + + + + + +Measurements (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.3 Measurements

    + + + + + + +

    The formatter sometimes requires the input of numeric parameters to +specify measurements. These are specified as integers or decimal +fractions with an optional scaling unit suffixed. A scaling unit +is a letter that immediately follows the last digit of a number. Digits +after the decimal point are optional. Measurement expressions include +‘10.5p’, ‘11i’, and ‘3.c’. +

    + + + +

    Measurements are scaled by the scaling unit and stored internally (with +any fractional part discarded) in basic units. + + +The device resolution can therefore be obtained by storing a value of +‘1i’ to a register. The only constraint on the basic unit is that +it is at least as small as any other unit. +

    +
    +
    + + + +
    +
    u
    +

    Basic unit. +

    +
    +
    i
    +
    + + +

    Inch; defined as 2.54 centimeters. +

    +
    +
    c
    +
    + + +

    Centimeter; a centimeter is about 0.3937 inches. +

    +
    +
    p
    +
    + + +

    Point; a typesetter’s unit used for measuring type size. +There are 72 points to an inch. +

    +
    +
    P
    +
    + + +

    Pica; another typesetter’s unit. There are 6 picas to an inch and +12 points to a pica. +

    +
    +
    s
    +
    z
    +

    See Using Fractional Type Sizes, for a discussion of these units. +

    +
    +
    f
    +

    GNU troff defines this unit to scale decimal fractions in the +interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity +by 65,536. See Colors, for usage. +

    +
    + +

    The magnitudes of other scaling units depend on the text formatting +parameters in effect. These are useful when specifying measurements +that need to scale with the typeface or vertical spacing. +

    +
    +
    m
    +
    + + +

    Em; an em is equal to the current type size in points. It is named thus +because it is approximately the width of the letter ‘M’. +

    +
    +
    n
    +
    + + +

    En; an en is one-half em. +

    +
    +
    v
    +
    + + + + +

    Vee; recall Page Geometry. +

    +
    +
    M
    +
    + +

    Hundredth of an em. +

    +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Miscellaneous.html b/doc/groff.html.node/Miscellaneous.html new file mode 100644 index 0000000..db1eef3 --- /dev/null +++ b/doc/groff.html.node/Miscellaneous.html @@ -0,0 +1,275 @@ + + + + + + +Miscellaneous (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.35 Miscellaneous

    + +

    We document here GNU troff features that fit poorly elsewhere. +

    +
    +
    Request: .nm [start [increment [space [indentation]]]]
    +
    +
    Register: \n[ln]
    +
    +
    Register: \n[.nm]
    +
    + + + +

    Begin (or, with no arguments, cease) numbering output lines. +start assigns the number of the next output line. Only +line numbers divisible by increment are marked (default: +‘1’). space configures the horizontal spacing between the +number and the text (default: ‘1’). Any given indentation is +applied to the numbers (default: ‘0’). The third and fourth +arguments are reckoned in numeral widths (\0). start must +be non-negative and increment positive. +

    +

    The formatter aligns the number to the right in a width of three numeral +spaces plus indentation, then catenates space and the output +line. The line length is not reduced. Depending on the value of +the page offset,117 numbers wider than +the allocated space protrude into the left margin, or shift the output +line to the right. +

    +

    Line numbering parameters corresponding to missing arguments are not +altered. After numbering is disabled, ‘.nm +0’ resumes it using +the previously active parameters. +

    +

    The parameters of nm are associated with the environment +(see Environments). +

    + + +

    While numbering is enabled, the output line number register ln is +updated as each line is output, even if no line number is formatted with +it because it is being skipped (it is not a multiple of increment) +or because numbering is suppressed (see the nn request below). +

    +

    The .nm register tracks the enablement status of numbering. +Temporary suspension of numbering with the nn request does +not alter its value. +

    +
    +
    .po 5n
    +.ll 44n
    +Programming,
    +when stripped of all its circumstantial irrelevancies,
    +.nm 999 1 1 -4
    +boils down to no more and no less than
    +.nm +0 3
    +very effective thinking so as to avoid unmastered
    +.nn 2
    +complexity,
    +to very vigorous separation of your many
    +different concerns.
    +.br
    +\(em Edsger Dijkstra
    +.sp
    +.nm 1 1 1
    +This guy's arrogance takes your breath away.
    +.br
    +\(em John Backus
    +    ⇒      Programming,  when  stripped of all its cir-
    +    ⇒  999 cumstantial irrelevancies, boils down to  no
    +    ⇒      more  and no less than very effective think-
    +    ⇒      ing so as to avoid unmastered complexity, to
    +    ⇒      very vigorous separation of your  many  dif-
    +    ⇒      ferent concerns.
    +    ⇒ 1002 -- Edsger Dijkstra
    +    ⇒
    +    ⇒    1 This guy’s arrogance takes your breath away.
    +    ⇒    2 -- John Backus
    +
    +
    + +
    +
    Request: .nn [skip]
    +
    +
    Register: \n[.nn]
    +
    +

    Suppress numbering of the next skip output lines that would +otherwise be numbered. The default is 1. nn can be invoked +when line numbering is not active; suppression of numbering will take +effect for skip lines once nm enables it. +

    +

    The .nn register stores the count of output lines still to have +their numbering suppressed. +

    +

    This count is associated with the environment (see Environments). +

    + +

    To test whether the current output line will be numbered, you must check +both the .nm and .nn registers. +

    +
    +
      .de is-numbered
    +  .  nop This line
    +  .  ie (\\n[.nm] & (1-\\n[.nn])) IS
    +  .  el                           ISN'T
    +  .  nop numbered.
    +  .  br
    +  ..
    +  Test line numbering.
    +  .is-numbered
    +  .nm 1
    +  .nn 1
    +  .is-numbered
    +  .is-numbered
    +  .nm
    +  .is-numbered
    +    ⇒ Test line numbering.  This line ISN’T numbered.
    +    ⇒ This line ISN’T numbered.
    +    ⇒   1 This line IS numbered.
    +    ⇒ This line ISN’T numbered.
    +
    + +
    +
    Request: .mc [margin-character [distance]
    +
    + + +

    Begin (or, with no arguments, cease) writing a margin-character to +the right of each output line. The distance argument separates +margin-character from the right margin. If absent, the most +recent value is used; the default is 10 points. If an output line +exceeds the line length, the margin character is appended to it. + +No margin character is written on lines produced by the tl +request. +

    +

    The margin character is a property of the output line; the margin +character last configured when the line is output controls. If the +margin character is disabled before an output line breaks, none is +output (but see below). +

    +

    The margin character is associated with the environment +(see Environments). +

    +
    +
    .ll 5i
    +.nf
    +.mc \[br]
    +This paragraph is marked with a margin character.
    +.sp
    +As seen above, vertical space isn't thus marked.
    +\&
    +An output line that is present, but empty, is.
    +    ⇒ This paragraph is marked with a margin character.  |
    +    ⇒
    +    ⇒ As seen above, vertical space isn’t thus marked.   |
    +    ⇒                                                    |
    +    ⇒ An output line that is present, but empty, is.     |
    +
    +
    + +

    For compatibility with AT&T troff, a call to mc +to set the margin character can’t be undone immediately; at least one +line gets a margin character. +

    +
    +
    .ll 10n
    +.nf
    +.mc |
    +.mc *
    +.mc
    +foo
    +bar
    +    ⇒ foo        *
    +    ⇒ bar
    +
    + + + + + +

    The margin character mechanism is commonly used to annotate changes in +documents. The groff distribution ships a program, +gdiffmk, to assist with this task.118 +

    +
    +
    Request: .psbb file
    +
    +
    Register: \n[llx]
    +
    +
    Register: \n[lly]
    +
    +
    Register: \n[urx]
    +
    +
    Register: \n[ury]
    +
    + + +

    Retrieve the bounding box of the PostScript image found in file, +which must conform to Adobe’s Document Structuring Conventions +(DSC), locate a %%BoundingBox comment, and store the (upper-, +lower-, -left, -right) values into the registers llx, +lly, urx, and ury. If an error occurs (for +example, if no %%BoundingBox comment is present), the formatter +sets these registers to 0. +

    +

    The search path for file can be controlled with the -I +command-line option. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html b/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html new file mode 100644 index 0000000..99f7b62 --- /dev/null +++ b/doc/groff.html.node/Missing-Unix-Version-7-ms-Macros.html @@ -0,0 +1,78 @@ + + + + + + +Missing Unix Version 7 ms Macros (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.7.1 Unix Version 7 ms macros not implemented by groff ms

    + +

    Several macros described in the Unix Version 7 ms +documentation are unimplemented by groff ms because they +are specific to the requirements of documents produced internally by +Bell Laboratories, some of which also require a glyph for the Bell +System logo that groff does not support. These macros +implemented several document type formats +(EG, IM, MF, MR, TM, TR), were meaningful only in conjunction with the use of certain document +types +(AT, CS, CT, OK, SG), stored the postal addresses of Bell Labs sites +(HO, IH, MH, PY, WH), or lacked a stable definition over time +(UX). To compatibly render historical ms documents using these macros, +we advise your documents to invoke the rm request to remove any +such macros it uses and then define replacements with an authentically +typeset original at hand.17 For +informal purposes, a simple definition of UX should maintain the +readability of the document’s substance. +

    +
    +
    +
    .rm UX
    +.ds UX Unix\"
    +
    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Motion-Quanta.html b/doc/groff.html.node/Motion-Quanta.html new file mode 100644 index 0000000..5df1c72 --- /dev/null +++ b/doc/groff.html.node/Motion-Quanta.html @@ -0,0 +1,93 @@ + + + + + + +Motion Quanta (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.3.1 Motion Quanta

    + + + +

    An output device’s basic unit u is not necessarily its smallest +addressable length; u can be smaller to avoid problems with +integer roundoff. The minimum distances that a device can work with in +the horizontal and vertical directions are termed its motion +quanta. Measurements are rounded to applicable motion quanta. +Half-quantum fractions round toward zero. +

    + + + + +
    +
    Register: \n[.H]
    +
    +
    Register: \n[.V]
    +
    +

    These read-only registers interpolate the horizontal and vertical motion +quanta, respectively, of the output device in basic units. +

    + +

    For example, we might draw short baseline rules on a terminal device as +follows. See Drawing Geometric Objects. +

    +
    +
    .tm \n[.H]
    +    error→ 24
    +.nf
    +\l'36u' 36u
    +\l'37u' 37u
    +    ⇒ _ 36u
    +    ⇒ __ 37u
    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/Numeric-Expressions.html b/doc/groff.html.node/Numeric-Expressions.html new file mode 100644 index 0000000..7da6bd3 --- /dev/null +++ b/doc/groff.html.node/Numeric-Expressions.html @@ -0,0 +1,395 @@ + + + + + + +Numeric Expressions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.4 Numeric Expressions

    + + + +

    A numeric expression evaluates to an integer: it can be as +simple as a literal ‘0’ or it can be a complex sequence of register +and string interpolations interleaved with measurements and operators. +

    +

    GNU troff provides a set of mathematical and logical operators +familiar to programmers—as well as some unusual ones—but supports +only integer arithmetic.35 The internal data type +used for computing results is usually a 32-bit signed integer, which +suffices to represent magnitudes within a range of ±2 +billion.36 +

    + + + + + + + + + + + + + +

    Arithmetic infix operators perform a function on the numeric expressions +to their left and right; they are + (addition), - +(subtraction), * (multiplication), / (truncating +division), and % (modulus). Truncating division rounds to +the integer nearer to zero, no matter how large the fractional portion. +Overflow and division (or modulus) by zero are errors and abort +evaluation of a numeric expression. + + + + + + + + +

    +

    Arithmetic unary operators operate on the numeric expression to their +right; they are - (negation) and + (assertion—for +completeness; it does nothing). The unary minus must often be used +with parentheses to avoid confusion with the decrementation operator, +discussed below. +

    +

    Observe the rounding behavior and effect of negative operands on the +modulus and truncating division operators. +

    +
    +
    .nr T 199/100
    +.nr U 5/2
    +.nr V (-5)/2
    +.nr W 5/-2
    +.nr X 5%2
    +.nr Y (-5)%2
    +.nr Z 5%-2
    +T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z]
    +    ⇒ T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1
    +
    + +

    The sign of the modulus of operands of mixed signs is determined by the +sign of the first. Division and modulus operators satisfy the following +property: given a dividend a and a divisor b, a +quotient q formed by ‘(a / b)’ and a +remainder r by ‘(a % b)’, then qb + r = a. +

    + + + +

    GNU troff’s scaling operator, used with parentheses as +(c;e), evaluates a numeric expression e +using c as the default scaling unit. If c is omitted, +scaling units are ignored in the evaluation of e. This +operator can save typing by avoiding the attachment of scaling units to +every operand out of caution. Your macros can select a sensible default +unit in case the user neglects to supply one. +

    +
    +
    .\" Indent by amount given in first argument; assume ens.
    +.de Indent
    +.  in (n;\\$1)
    +..
    +
    + +

    Without the scaling operator, the foregoing macro would, if called with +a unitless argument, cause indentation by the in request’s +default scaling unit (ems). The result would be twice as much +indentation as expected. +

    + + + + + + +

    GNU troff also provides a pair of operators to compute the +extrema of two operands: >? (maximum) and <? (minimum). +

    +
    +
    .nr slots 5
    +.nr candidates 3
    +.nr salaries (\n[slots] <? \n[candidates])
    +Looks like we'll end up paying \n[salaries] salaries.
    +    ⇒ Looks like we'll end up paying 3 salaries.
    +
    + + + + + + + + + + + + +

    Comparison operators comprise < (less than), > (greater +than), <= (less than or equal), >= (greater than or +equal), and = (equal). == is a synonym for =. +When evaluated, a comparison is replaced with ‘0’ if it is false +and ‘1’ if true. In the roff language, positive values are +true, others false. +

    + + + + + + + + +

    We can operate on truth values with the logical operators & +(logical conjunction or “and”) and : (logical disjunction or +“or”). They evaluate as comparison operators do. +

    + + + + + +

    A logical complementation (“not”) operator, !, works only +within if, ie, and while requests. +Furthermore, ! is recognized only at the beginning of a numeric +expression not contained by another numeric expression. In other words, +it must be the “outermost” operator. Including it elsewhere in the +expression produces a warning in the ‘number’ category +(see Warnings), and its expression evaluates false. This +unfortunate limitation maintains compatibility with AT&T +troff. Test a numeric expression for falsity by +comparing it to a false value.37 +

    +
    +
    .nr X 1
    +.nr Y 0
    +.\" This does not work as expected.
    +.if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false
    +.
    +.\" Use this construct instead.
    +.if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false
    +    error→ warning: expected numeric expression, got '!'
    +    ⇒ B: X is true, Y is false
    +
    + + + + + + +

    The roff language has no operator precedence: expressions are +evaluated strictly from left to right, in contrast to schoolhouse +arithmetic. Use parentheses ( ) to impose a desired +precedence upon subexpressions. +

    +
    +
    .nr X 3+5*4
    +.nr Y (3+5)*4
    +.nr Z 3+(5*4)
    +X=\n[X] Y=\n[Y] Z=\n[Z]
    +    ⇒ X=32 Y=32 Z=23
    +
    + + + + + + + +

    For many requests and escape sequences that cause motion on the page, +the unary operators + and - work differently when leading +a numeric expression. They then indicate a motion relative to the +drawing position: positive is down in vertical contexts, right in +horizontal ones. +

    + + + + + + + + + + + + + + + + +

    + and - are also treated differently by the following +requests and escape sequences: bp, in, ll, +lt, nm, nr, pl, pn, po, +ps, pvs, rt, ti, \H, \R, and +\s. Here, leading plus and minus signs serve as incrementation +and decrementation operators, respectively. To negate an expression, +subtract it from zero or include the unary minus in parentheses with its +argument. See Setting Registers, for examples. +

    + + + + + +

    A leading | operator indicates a motion relative not to the +drawing position but to a boundary. For horizontal motions, the +measurement specifies a distance relative to a drawing position +corresponding to the beginning of the input line. By default, +tab stops reckon movements in this way. Most escape sequences do not; +| tells them to do so. +

    +
    +
    Mind the \h'1.2i'gap.
    +.br
    +Mind the \h'|1.2i'gap.
    +.br
    +Mind the
    +\h'|1.2i'gap.
    +    ⇒ Mind the             gap.
    +    ⇒ Mind the    gap.
    +    ⇒ Mind the             gap.
    +
    + +

    One use of this feature is to define macros whose scope is limited to +the output they format. +

    +
    +
    .\" underline word $1 with trailing punctuation $2
    +.de Underline
    +.  nop \\$1\l'|0\[ul]'\\$2
    +..
    +Typographical emphasis is best used
    +.Underline sparingly .
    +
    + +

    In the above example, ‘|0’ specifies a negative motion from the +current position (at the end of the argument just emitted, \$1) +to the beginning of the input line. Thus, the \l escape sequence +in this case draws a line from right to left. A macro call occurs at +the beginning of an input line;38 if the | +operator were omitted, then the underline would be drawn at zero +distance from the current position, producing device-dependent, and +likely undesirable, results. On the ‘ps’ output device, it +underlines the period. +

    +

    For vertical motions, the | operator specifies a distance from +the first text baseline on the page or in the current +diversion,39 using the current vertical +spacing. +

    +
    +
    A
    +.br
    +B \Z'C'\v'|0'D
    +    ⇒ A D
    +    ⇒ B C
    +
    + +

    In the foregoing example, we’ve used the \Z escape sequence +(see Page Motions) to restore the drawing position after formatting +‘C’, then moved vertically to the first text baseline on the page. +

    +
    +
    Escape sequence: \B'anything'
    +
    + + +

    Interpolate 1 if anything is a valid numeric expression, +and 0 otherwise. The delimiter need not be a neutral apostrophe; +see Delimiters. +

    + +

    You might use \B along with the if request to filter out +invalid macro or string arguments. See Conditionals and Loops. +

    +
    +
    .\" Indent by amount given in first argument; assume ens.
    +.de Indent
    +.  if \B'\\$1' .in (n;\\$1)
    +..
    +
    + +

    A register interpolated as an operand in a numeric expression must have +an Arabic format; luckily, this is the default. See Assigning Register Formats. +

    + + +

    Because spaces separate arguments to requests, spaces are not allowed in +numeric expressions unless the (sub)expression containing them is +surrounded by parentheses. See Invoking Requests, and +Conditionals and Loops. +

    +
    +
    .nf
    +.nr a 1+2 + 2+1
    +\na
    +    error→ expected numeric expression, got a space
    +    ⇒ 3
    +.nr a 1+(2 + 2)+1
    +\na
    +    ⇒ 6
    +
    + +

    The nr request (see Setting Registers) expects its second and +optional third arguments to be numeric expressions; a bare + does +not qualify, so our first attempt got a warning. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Obsolete-Command.html b/doc/groff.html.node/Obsolete-Command.html new file mode 100644 index 0000000..b656c38 --- /dev/null +++ b/doc/groff.html.node/Obsolete-Command.html @@ -0,0 +1,74 @@ + + + + + + +Obsolete Command (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2.5 Obsolete Command

    +

    In AT&T troff output, the writing of a single glyph is +mostly done by a very strange command that combines a horizontal move +and a single character giving the glyph name. It doesn’t have a command +code, but is represented by a 3-character argument consisting of exactly +2 digits and a character. +

    +
    +
    ddg
    +

    Move right dd (exactly two decimal digits) basic units ‘u’, +then print glyph g (represented as a single character). +

    +

    In GNU troff, arbitrary syntactical space around and within this +command is allowed. Only when a preceding command on the same line ends +with an argument of variable length is a separating space obligatory. +In AT&T troff, large clusters of these and other +commands are used, mostly without spaces; this made such output almost +unreadable. +

    +
    + +

    For modern high-resolution devices, this command does not make sense +because the width of the glyphs can become much larger than two decimal +digits. In gtroff, this is only used for the devices X75, +X75-12, X100, and X100-12. For other devices, the +commands ‘t’ and ‘u’ provide a better functionality. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Operator-Index.html b/doc/groff.html.node/Operator-Index.html new file mode 100644 index 0000000..b70458f --- /dev/null +++ b/doc/groff.html.node/Operator-Index.html @@ -0,0 +1,188 @@ + + + + + + +Operator Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix D Operator Index

    + +
    +
    Jump to:   ! +   +% +   +& +   +( +   +) +   +* +   ++ +   +- +   +/ +   +: +   +; +   +< +   += +   +> +   +| +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    !
    !: Numeric Expressions

    %
    %: Numeric Expressions

    &
    &: Numeric Expressions

    (
    (: Numeric Expressions

    )
    ): Numeric Expressions

    *
    *: Numeric Expressions

    +
    +: Numeric Expressions
    +: Numeric Expressions
    + (unary): Numeric Expressions

    -
    -: Numeric Expressions
    -: Numeric Expressions
    - (unary): Numeric Expressions

    /
    /: Numeric Expressions

    :
    :: Numeric Expressions

    ;
    ;: Numeric Expressions

    <
    <: Numeric Expressions
    <=: Numeric Expressions
    <?: Numeric Expressions

    =
    =: Numeric Expressions
    ==: Numeric Expressions

    >
    >: Numeric Expressions
    >=: Numeric Expressions
    >?: Numeric Expressions

    |
    |: Numeric Expressions

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Operators-in-Conditionals.html b/doc/groff.html.node/Operators-in-Conditionals.html new file mode 100644 index 0000000..a04b761 --- /dev/null +++ b/doc/groff.html.node/Operators-in-Conditionals.html @@ -0,0 +1,222 @@ + + + + + + +Operators in Conditionals (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23.1 Operators in Conditionals

    + + + + + + +

    In if, ie, and while requests, in addition to the +numeric expressions described in Numeric Expressions, several +Boolean operators are available; the members of this expanded class are +termed conditional expressions. +

    +
    +
    c glyph
    +

    True if glyph is available, where glyph is an ordinary +character, a special character ‘\(xx’ or ‘\[xxx]’, +‘\N'xxx'’, or has been defined by any of the char, +fchar, fschar, or schar requests. +

    +
    +
    d name
    +

    True if a string, macro, diversion, or request called name exists. +

    +
    +
    e
    +

    True if the current page is even-numbered. +

    +
    +
    F font
    +

    True if font exists. font is handled as if it were opened +with the ft request (that is, font translation and styles are +applied), without actually mounting it. +

    +
    +
    m color
    +

    True if color is defined. +

    +
    +
    n
    +
    + +

    True if the document is being processed in nroff mode. +See troff and nroff Modes. +

    +
    +
    o
    +

    True if the current page is odd-numbered. +

    +
    +
    r register
    +

    True if register exists. +

    +
    +
    S style
    +

    True if style is available for the current font family. Font +translation is applied. +

    +
    +
    t
    +

    True if the document is being processed in troff mode. +See troff and nroff Modes. +

    + +
    +
    v
    +

    Always false. This condition is recognized only for compatibility with +certain other troff implementations.88 +

    +
    + +

    If the first argument to an if, ie, or while +request begins with a non-alphanumeric character apart from ! +(see below); it performs an output comparison test. +89 +

    + +
    +
    'xxx'yyy'
    +

    True if formatting the comparands xxx and yyy produces the +same output commands. The delimiter need not be a neutral apostrophe: +the output comparison operator accepts the same delimiters as most +escape sequences; see Delimiters. This output comparison +operator formats xxx and yyy in separate environments; +after the comparison, the resulting data are discarded. +

    +
    +
    .ie "|"\fR|\fP" true
    +.el false
    +    ⇒ true
    +
    + +

    The resulting glyph properties, including font family, style, size, and +slant, must match, but not necessarily the requests and/or escape +sequences used to obtain them. In the previous example, ‘|’ and +‘\fR|\fP’ result in ‘|’ glyphs in the same typefaces at the +same positions, so the comparands are equal. If ‘.ft I’ had +been added before the ‘.ie’, they would differ: the first ‘|’ +would produce an italic ‘|’, not a roman one. Motions must match +in orientation and magnitude to within the applicable horizontal and +vertical motion quanta of the device, after rounding. ‘.if +"\u\d"\v'0'"’ is false even though both comparands result in zero net +motion, because motions are not interpreted or optimized but sent as-is +to the output.90 On the other hand, ‘.if "\d"\v'0.5m'"’ is true, because +\d is defined as a downward motion of one-half em.91 +

    + + +

    Surround the comparands with \? to avoid formatting them; this +causes them to be compared character by character, as with string +comparisons in other programming languages. +

    +
    +
    .ie "\?|\?"\?\fR|\fP\?" true
    +.el false
    +    ⇒ false
    +
    + + + + +

    Since comparands protected with \? are read in copy mode +(see Copy Mode), they need not even be valid groff syntax. +The escape character is still lexically recognized, however, and +consumes the next character. +

    +
    +
    .ds a \[
    +.ds b \[
    +.if '\?\*a\?'\?\*b\?' a and b equivalent
    +.if '\?\\?'\?\\?' backslashes equivalent
    +    ⇒ a and b equivalent
    +
    +
    +
    + +

    The above operators can’t be combined with most others, but a leading +‘!’, not followed immediately by spaces or tabs, complements an +expression. +

    +
    +
    .nr x 1
    +.ie !r x register x is not defined
    +.el      register x is defined
    +    ⇒ register x is defined
    +
    + +

    Spaces and tabs are optional immediately after the ‘c’, ‘d’, +‘F’, ‘m’, ‘r’, and ‘S’ operators, but right after +‘!’, they end the predicate and the conditional evaluates +true.92 +

    +
    +
    .nr x 1
    +.ie ! r x register x is not defined
    +.el       register x is defined
    +    ⇒ r x register x is not defined
    +
    + +

    The unexpected ‘r x’ in the output is a clue that our conditional +was not interpreted as we planned, but matters may not always be so +obvious. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Optional-man-extensions.html b/doc/groff.html.node/Optional-man-extensions.html new file mode 100644 index 0000000..035f410 --- /dev/null +++ b/doc/groff.html.node/Optional-man-extensions.html @@ -0,0 +1,264 @@ + + + + + + +Optional man extensions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.1.1 Optional man extensions

    + + +

    Use the file man.local for local extensions to the man +macros or for style changes. +

    + +
    +

    Custom headers and footers

    + + +

    In groff versions 1.18.2 and later, you can specify custom +headers and footers by redefining the following macros in +man.local. +

    +
    +
    Macro: .PT
    +
    +

    Control the content of the headers. Normally, the header prints the +command name and section number on either side, and the optional fifth +argument to TH in the center. +

    + +
    +
    Macro: .BT
    +
    +

    Control the content of the footers. Normally, the footer prints the +page number and the third and fourth arguments to TH. +

    +

    Use the FT register to specify the footer position. The default +is −0.5i. +

    + +
    +
    +

    Ultrix-specific man macros

    + + + + +

    The groff source distribution includes a file named +man.ultrix, containing macros compatible with the Ultrix variant +of man. Copy this file into man.local (or use the +mso request to load it) to enable the following macros. +

    +
    +
    Macro: .CT key
    +
    +

    Print ‘<CTRL/key>’. +

    + +
    +
    Macro: .CW
    +
    +

    Print subsequent text using a “constant-width” (monospaced) typeface +(Courier roman). +

    + +
    +
    Macro: .Ds
    +
    +

    Begin a non-filled display. +

    + +
    +
    Macro: .De
    +
    +

    End a non-filled display started with Ds. +

    + +
    +
    Macro: .EX [indent]
    +
    +

    Begin a non-filled display using a monospaced typeface (Courier roman). +Use the optional indent argument to indent the display. +

    + +
    +
    Macro: .EE
    +
    +

    End a non-filled display started with EX. +

    + +
    +
    Macro: .G [text]
    +
    +

    Set text in Helvetica. If no text is present on the line where +the macro is called, then the text of the next line appears in +Helvetica. +

    + +
    +
    Macro: .GL [text]
    +
    +

    Set text in Helvetica oblique. If no text is present on the line +where the macro is called, then the text of the next line appears in +Helvetica Oblique. +

    + +
    +
    Macro: .HB [text]
    +
    +

    Set text in Helvetica bold. If no text is present on the line +where the macro is called, then all text up to the next HB +appears in Helvetica bold. +

    + +
    +
    Macro: .TB [text]
    +
    +

    Identical to HB. +

    + +
    +
    Macro: .MS title sect [punct]
    +
    +

    Set a man page reference in Ultrix format. The title is in +Courier instead of italic. Optional punctuation follows the section +number without an intervening space. +

    + +
    +
    Macro: .NT [C] [title]
    +
    +

    Begin a note. Print the optional title, or the word “Note”, +centered on the page. Text following the macro makes up the body of the +note, and is indented on both sides. If the first argument is C, +the body of the note is printed centered (the second argument replaces +the word “Note” if specified). +

    + +
    +
    Macro: .NE
    +
    +

    End a note begun with NT. +

    + +
    +
    Macro: .PN path [punct]
    +
    +

    Set the path name in a monospaced typeface (Courier roman), followed by +optional punctuation. +

    + +
    +
    Macro: .Pn [punct] path [punct]
    +
    +

    If called with two arguments, identical to PN. If called with +three arguments, set the second argument in a monospaced typeface +(Courier roman), bracketed by the first and third arguments in the +current font. +

    + +
    +
    Macro: .R
    +
    +

    Switch to roman font and turn off any underlining in effect. +

    + +
    +
    Macro: .RN
    +
    +

    Print the string ‘<RETURN>’. +

    + +
    +
    Macro: .VS [4]
    +
    +

    Start printing a change bar in the margin if the number 4 is +specified. Otherwise, this macro does nothing. +

    + +
    +
    Macro: .VE
    +
    +

    End printing the change bar begun by VS. +

    + +
    +
    +

    Simple example

    + +

    The following example man.local file alters the SH macro +to add some extra vertical space before printing the heading. Headings +are printed in Helvetica bold. +

    +
    +
    .\" Make the heading fonts Helvetica
    +.ds HF HB
    +.
    +.\" Put more space in front of headings.
    +.rn SH SH-orig
    +.de SH
    +.  if t .sp (u;\\n[PD]*2)
    +.  SH-orig \\$*
    +..
    +
    + + + +
    +
    +
    + + + + + + diff --git a/doc/groff.html.node/Other-Differences.html b/doc/groff.html.node/Other-Differences.html new file mode 100644 index 0000000..6a92cad --- /dev/null +++ b/doc/groff.html.node/Other-Differences.html @@ -0,0 +1,248 @@ + + + + + + +Other Differences (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.38.3 Other Differences

    + +

    groff request names unrecognized by other troff +implementations will likely be ignored by them; escape sequences that +are groff extensions are liable to be interpreted as if the +escape character were not present. + +For example, the adjustable, non-breaking escape sequence \~ +is also supported by Heirloom Doctools troff 050915 (September +2005), mandoc 1.9.5 (2009-09-21), neatroff (commit +1c6ab0f6e, 2016-09-13), and Plan 9 from User Space troff +(commit 93f8143600, 2022-08-12), but not by Solaris or Documenter’s +Workbench troffs. +See Manipulating Filling and Adjustment. +

    + + + + + + + + + + + + + + +

    GNU troff does not allow the use of the escape sequences +\|, \^, \&, \{, \}, +\SP, \', \`, \-, \_, \!, +\%, and \c in identifiers; AT&T troff +does. The \A escape sequence (see Identifiers) may be +helpful in avoiding use of these escape sequences in names. +

    + + +

    When adjusting to both margins, AT&T troff at first +adjusts spaces starting from the right; GNU troff begins from +the left. Both implementations adjust spaces from opposite ends on +alternating output lines in this adjustment mode to prevent “rivers” +in the text. +

    + +

    GNU troff does not always hyphenate words as AT&T +troff does. The AT&T implementation uses a set of +hard-coded rules specific to English, while GNU troff uses +language-specific hyphenation pattern files derived from TeX. +Furthermore, in old versions of troff there was a limited amount +of space to store hyphenation exceptions (arguments to the hw +request); GNU troff has no such restriction. +

    + +

    GNU troff predefines a string .T containing the argument +given to the -T command-line option, namely the current output +device (for example, ‘pdf’ or ‘utf8’). The existence of this +string is a common feature of post-CSTR #54 +troffs121 but valid values are specific +to each implementation. +

    + + + +

    AT&T troff ignored attempts to remove read-only +registers; GNU troff honors such requests. See Built-in Registers. +

    + +

    The (read-only) register .T interpolates 1 if GNU +troff is called with the -T command-line option, and +0 otherwise. This behavior differs from AT&T troff, which +interpolated 1 only if nroff was the formatter and was +called with -T. +

    + +

    AT&T troff and other implementations handle the +lf request differently. For them, its line argument +changes the line number of the current line. +

    + +

    AT&T troff had only environments named ‘0’, +‘1’, and ‘2’. In GNU troff, any number of environments +may exist, using any valid identifiers for their names +(see Identifiers.) +

    + + + + + + +

    Fractional type sizes cause one noteworthy incompatibility. In +AT&T troff the ps request ignores scaling units +and thus ‘.ps 10u’ sets the type size to 10 points, whereas in +GNU troff it sets the type size to 10 scaled points. +See Using Fractional Type Sizes. +

    + +

    The ab request differs from AT&T troff: +GNU troff writes no message to the standard error stream if no +arguments are given, and it exits with a failure status instead of a +successful one. +

    + +

    The bp request differs from AT&T troff: +GNU troff does not accept a scaling unit on the argument, a page +number; the former (somewhat uselessly) does. +

    + +

    The pm request differs from AT&T troff: +GNU troff reports the sizes of macros, strings, and diversions in +bytes and ignores an argument to report only the sum of the sizes. +

    + +

    Unlike AT&T troff, GNU troff does not ignore the +ss request if the output is a terminal device; instead, the +values of minimal inter-word and additional inter-sentence space are +each rounded down to the nearest multiple of 12. +

    + + + + + + + + +

    In GNU troff there is a fundamental difference between +(unformatted) characters and (formatted) glyphs. Everything that +affects how a glyph is output is stored with the glyph node; once a +glyph node has been constructed, it is unaffected by any subsequent +requests that are executed, including bd, cs, tkf, +tr, or fp requests. Normally, glyphs are constructed from +characters immediately before the glyph is added to an output line. +Macros, diversions, and strings are all, in fact, the same type of +object; they contain a sequence of intermixed character and glyph nodes. +Special characters transform from one to the other: before being added +to the output, they behave as characters; afterward, they are glyphs. A +glyph node does not behave like a character node when it is processed by +a macro: it does not inherit any of the special properties that the +character from which it was constructed might have had. For example, +the input +

    +
    +
    .di x
    +\\\\
    +.br
    +.di
    +.x
    +
    + +

    produces ‘\\’ in GNU troff. Each pair of backslashes +becomes one backslash glyph; the resulting backslashes are thus +not interpreted as escape characters when they are reread as the +diversion is output. AT&T troff would interpret +them as escape characters when rereading them and end up printing one +‘\’. +

    + + + + + + + +

    One correct way to obtain a printable backslash in most documents is to +use the \e escape sequence; this always prints a single instance +of the current escape character,122 regardless of whether or not it is used in a diversion; it +also works in both GNU troff and AT&T troff. +

    +

    The other correct way, appropriate in contexts independent of the +backslash’s common use as a troff escape character—perhaps in +discussion of character sets or other programming languages—is +the character escape \(rs or \[rs], for “reverse +solidus”, from its name in the ECMA-6 (ISO/IEC 646) +standard.123 +

    +

    To store an escape sequence in a diversion that is interpreted when the +diversion is reread, either use the traditional \! transparent +output facility, or, if this is unsuitable, the new \? escape +sequence. See Diversions and gtroff Internals. +

    +

    In the somewhat pathological case where a diversion exists containing a +partially collected line and a partially collected line at the top-level +diversion has never existed, AT&T troff will output the +partially collected line at the end of input; GNU troff will not. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Output-Device-Intro.html b/doc/groff.html.node/Output-Device-Intro.html new file mode 100644 index 0000000..815a509 --- /dev/null +++ b/doc/groff.html.node/Output-Device-Intro.html @@ -0,0 +1,63 @@ + + + + + + +Output Device Intro (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.6 Output Devices

    + + + + +

    GNU troff’s output is in a device-independent page description +language, which is then read by an output driver that translates +this language into a file format or byte stream that a piece of +(possibly emulated) hardware understands. groff features output +drivers for PostScript devices, terminal emulators (and other simple +typewriter-like machines), X11 (for previewing), TeX DVI, HP +LaserJet 4/PCL5 and Canon LBP printers (which use CaPSL), +HTML, XHTML, and PDF. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Output-Language-Compatibility.html b/doc/groff.html.node/Output-Language-Compatibility.html new file mode 100644 index 0000000..4ad971f --- /dev/null +++ b/doc/groff.html.node/Output-Language-Compatibility.html @@ -0,0 +1,103 @@ + + + + + + +Output Language Compatibility (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.4 Output Language Compatibility

    + +

    The intermediate output language of AT&T troff was +first documented in A Typesetter-independent TROFF, by Brian +Kernighan, and by 1992 the AT&T troff manual was +updated to incorprate a description of it. +

    +

    The GNU troff intermediate output format is compatible with this +specification except for the following features. +

    +
      +
    • The classical quasi-device independence is not yet implemented. + +
    • The old hardware was very different from what we use today. So the +groff devices are also fundamentally different from the ones +in AT&T troff. For example, the AT&T +PostScript device is called post and has a resolution of only 720 +units per inch, suitable for printers 20 years ago, while groff’s +ps device has a resolution of 72000 units per inch. Maybe, by +implementing some rescaling mechanism similar to the classical +quasi-device independence, groff could emulate AT&T’s +post device. + +
    • The B-spline command ‘D~’ is correctly handled by the intermediate +output parser, but the drawing routines aren’t implemented in some of +the postprocessor programs. + +
    • The argument of the commands ‘s’ and ‘x H has the +implicit unit scaled point ‘z’ in gtroff, while +AT&T troff has point (‘p’). This isn’t an +incompatibility but a compatible extension, for both units coincide for +all devices without a sizescale parameter in the DESC +file, including all postprocessors from AT&T and +groff’s text devices. The few groff devices with a +sizescale parameter either do not exist for AT&T +troff, have a different name, or seem to have a different +resolution. So conflicts are very unlikely. + +
    • The position changing after the commands ‘Dp’, ‘DP’, and +‘Dt’ is illogical, but as old versions of gtroff used this +feature it is kept for compatibility reasons. + + +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Page-Control.html b/doc/groff.html.node/Page-Control.html new file mode 100644 index 0000000..da2edc3 --- /dev/null +++ b/doc/groff.html.node/Page-Control.html @@ -0,0 +1,218 @@ + + + + + + +Page Control (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.18 Page Control

    + + + + + + + +

    Discretionary page breaks can prevent the unwanted separation of +content. A new page number takes effect during page ejection; see +The Implicit Page Trap. +

    +
    +
    Request: .bp [page-number]
    +
    +
    Request: .bp +page-number
    +
    Request: .bp -page-number
    +
    Register: \n[%]
    +
    + + +

    Break the page and change (increase or decrease) the next page number +per the numeric expression page-number. If page-number is +invalid, GNU troff emits a warning in category ‘number’ and +ignores the argument. This request causes a break. A page break +advances the vertical drawing position to the bottom of the page, +springing traps. See Page Location Traps. + + + +bp has effect only if invoked within the top-level +diversion.71 + + +This request is incorrectly documented in the AT&T +troff manual as having a default scaling unit of ‘v’. +

    + + +

    The register % interpolates the current page number. +

    +
    +
    .de BP
    +'  bp \" schedule page break once current line is output
    +..
    +
    +
    + +
    +
    Request: .ne [space]
    +
    + + + +

    Force a page break if insufficient vertical space is available (assert +“needed” space). ne tests the distance to the next page +location trap; see Page Location Traps, and breaks the page if +that amount is less than space. The default scaling unit is +‘v’. If space is invalid, GNU troff emits a warning +in category ‘number’ and ignores the argument. If space is +not specified, ‘1v’ is assumed. +

    + +

    We can require space for at least the first two output lines of a +paragraph, preventing its first line from being widowed at the +page bottom. +

    +
    +
    .ne 2v
    +Considering how common illness is,
    +how tremendous the spiritual change that it brings,
    +how astonishing,
    +when the lights of health go down,
    +the undiscovered countries that are then disclosed,
    +what wastes and deserts of the soul a slight attack
    +of influenza brings to view,
    +
    + +

    This method is reliable only if no output line is pending when ne +is invoked. When macro packages are used, this is often not the case: +their paragraphing macros perform the break. You may need to experiment +with placing the ne after the paragraphing macro, or br +and ne before it. +

    + + +

    ne is also useful to force grouping of section headings with +their subsequent paragraphs, or tables with their captions and/or +explanations. Macro packages often use ne with diversions to +implement keeps and displays; see Diversions. They may also offer +parameters for widow and orphan management. +

    + +
    +
    Request: .sv [space]
    +
    +
    Request: .os
    +
    + +

    Require vertical space as ne does, but also save it for +later output by the os request. If space is available +before the next page location trap, it is output immediately. Both +requests ignore a partially collected line, taking effect at the next +break. + + +sv and os ignore no-space mode (recall Manipulating Spacing). While the sv request allows negative values for +space, os ignores them. The default scaling unit is +‘v’. If space is not specified, ‘1v’ is assumed. +

    + +
    +
    Register: \n[nl]
    +
    + + + +

    nl interpolates or sets the vertical drawing position. When the +formatter starts, the first page transition hasn’t happened yet, and +nl is negative. If a header trap has been planted on the page +(typically at vertical position 0), you can assign a negative +value to nl to spring it if that page has already started +(see Page Location Traps). +

    +
    +
    .de HD
    +.  sp
    +.  tl ''Goldbach Solution''
    +.  sp
    +..
    +.
    +First page.
    +.bp
    +.wh 0 HD \" plant header trap at top of page
    +.nr nl (-1)
    +Second page.
    +    ⇒ First page.
    +    ⇒
    +    ⇒ (blank lines elided)
    +    ⇒
    +    ⇒                         Goldbach Solution
    +    ⇒
    +    ⇒ (blank lines elided)
    +    ⇒
    +    ⇒ Second page.
    +
    + +

    Without resetting nl to a negative value, the trap just planted +would be active beginning with the next page, not the current +one. +

    +

    See Diversions, for a comparison of nl with the .h and +.d registers. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Page-Geometry.html b/doc/groff.html.node/Page-Geometry.html new file mode 100644 index 0000000..1486533 --- /dev/null +++ b/doc/groff.html.node/Page-Geometry.html @@ -0,0 +1,140 @@ + + + + + + +Page Geometry (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.2 Page Geometry

    + + + +

    roff systems format text under certain assumptions about the size +of the output medium, or page. For the formatter to correctly break a +line it is filling, it must know the line length, which it derives from +the page width (see Line Layout). For it to decide whether to write +an output line to the current page or wait until the next one, it must +know the page length (see Page Layout). +

    + + + + + + +

    A device’s resolution converts practical units like inches or +centimeters to basic units, a convenient length measure for the +output device or file format. The formatter and output driver use basic +units to reckon page measurements. The device description file defines +its resolution and page dimensions (see DESC File Format). +

    + +

    A page is a two-dimensional structure upon which a roff +system imposes a rectangular coordinate system with its upper left +corner as the origin. Coordinate values are in basic units and increase +down and to the right. Useful ones are therefore always positive and +within numeric ranges corresponding to the page boundaries. +

    + + +

    While the formatter (and, later, output driver) is processing a page, it +keeps track of its drawing position, which is the location at +which the next glyph will be written, from which the next motion will be +measured, or where a geometric object will commence rendering. + + +Notionally, glyphs are drawn from the text baseline upward and to the +right.33 The text baseline is a (usually invisible) line upon +which the glyphs of a typeface are aligned. A glyph therefore +“starts” at its bottom-left corner. If drawn at the origin, a typical +letter glyph would lie partially or wholly off the page, depending on +whether, like “g”, it features a descender below the baseline. +

    + + +

    Such a situation is nearly always undesirable. It is furthermore +conventional not to write or draw at the extreme edges of the page. +Therefore the initial drawing position of a roff formatter is not +at the origin, but below and to the right of it. This rightward shift +from the left edge is known as the page +offset.34 The downward shift leaves room for a text output +line. +

    +

    Text is arranged on a one-dimensional lattice of text baselines from the +top to the bottom of the page. + + + +Vertical spacing is the distance between adjacent text baselines. +Typographic tradition sets this quantity to 120% of the type size. The +initial drawing position is one unit of vertical spacing below the page +top. Typographers term this unit a vee. +

    + + + + +

    Vertical spacing has an impact on page-breaking decisions. Generally, +when a break occurs, the formatter moves the drawing position to the +next text baseline automatically. If the formatter were already writing +to the last line that would fit on the page, advancing by one vee would +place the next text baseline off the page. Rather than let that happen, +roff formatters instruct the output driver to eject the page, +start a new one, and again set the drawing position to one vee below the +page top; this is a page break. +

    +

    When the last line of input text corresponds to the last output line +that fits on the page, the break caused by the end of input will also +break the page, producing a useless blank one. Macro packages keep +users from having to confront this difficulty by setting “traps” +(see Traps); moreover, all but the simplest page layouts tend to +have headers and footers, or at least bear vertical margins larger than +one vee. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Page-Layout-Adjustment.html b/doc/groff.html.node/Page-Layout-Adjustment.html new file mode 100644 index 0000000..7570214 --- /dev/null +++ b/doc/groff.html.node/Page-Layout-Adjustment.html @@ -0,0 +1,57 @@ + + + + + + +Page Layout Adjustment (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.4 Page Layout

    + +

    Most macro packages let the user specify the size of the page margins. +The top and bottom margins are typically handled differently than the +left and right margins; the latter two are derived from the +page offset, indentation, and line length. +See Line Layout. Commonly, packages support registers to tune these +values. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Page-Layout.html b/doc/groff.html.node/Page-Layout.html new file mode 100644 index 0000000..8a6a4ad --- /dev/null +++ b/doc/groff.html.node/Page-Layout.html @@ -0,0 +1,188 @@ + + + + + + +Page Layout (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.17 Page Layout

    + + + +

    The formatter permits configuration of the page length and page number. +

    +
    +
    Request: .pl [length]
    +
    +
    Request: .pl +length
    +
    Request: .pl -length
    +
    Register: \n[.p]
    +
    + + + + +

    Change (increase or decrease) the page length per the numeric expression +length. The default scaling unit is ‘v’. A negative +length is valid, but an uncommon application: it prevents page +location traps from being sprung,70 and each +output line is placed on a new page. If length is invalid, GNU +troff emits a warning in category ‘number’. If length +is absent or invalid, ‘11i’ is assumed. +

    + +

    The read-only register ‘.p’ interpolates the current page length. +

    + +
    +
    Request: .pn num
    +
    +
    Request: .pn +num
    +
    Request: .pn -num
    +
    Register: \n[.pn]
    +
    + + + +

    Change (increase or decrease) the page number of the next page +per the numeric expression num. If num is invalid, GNU +troff emits a warning in category ‘number’ and ignores the +request. Without an argument, pn is ignored. +

    + + +

    The read-only register .pn interpolates num if set by +pn on the current page, or the current page number plus 1. +

    + + + + +

    The formatter offers special support for typesetting headers and +footers, collectively termed titles. Titles have an independent +line length, and their placement on the page is not restricted. +

    +
    +
    Request: .tl 'left'center'right'
    +
    + + + + +

    Format an output line as a title consisting of left, center, +and right, each aligned accordingly. The delimiter need not be a +neutral apostrophe: tl accepts the same delimiters as most escape +sequences; see Delimiters. If not used as the delimiter, any +page number character character is replaced with the current page +number; the default is ‘%’; see the the pc request below. +Without an argument, tl is ignored. tl writes the title +line immediately, ignoring any partially collected line. +

    +

    It is not an error to omit delimiters after the first. For example, +‘.tl /Thesis is interpreted as ‘.tl /Thesis///: it +sets a title line comprising only the left-aligned word ‘Thesis’. +

    + +
    +
    Request: .lt [length]
    +
    +
    Request: .lt +length
    +
    Request: .lt -length
    +
    Register: \n[.lt]
    +
    + + +

    Change (increase or decrease) the line length used by titles per the +numeric expression length. The default scaling unit is ‘m’. +If length is negative, GNU emits a warning in category +‘range’ and treats length as ‘0’. If length is +invalid, GNU troff emits a warning in category ‘number’ and +ignores the request. The formatter’s default title length is +‘6.5i’. With no argument, the title length is restored to the +previous value. The title length is is associated with the environment +(see Environments). +

    + +

    The read-only register ‘.lt’ interpolates the title line length. +

    + +
    +
    Request: .pc [char]
    +
    + + + +

    Set the page number character to char. With no argument, the page +number character is disabled. pc does not affect the +register %. +

    + +

    The following example exercises title features. +

    +
    +
    .lt 50n
    +This is my partially collected
    +.tl 'Isomers 2023'%'Dextrose Edition'
    +line.
    +    ⇒ Isomers 2023             1        Dextrose Edition
    +    ⇒ This is my partially collected line.
    +
    + +

    We most often see titles used in page header and footer traps. +See Traps. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Page-Location-Traps.html b/doc/groff.html.node/Page-Location-Traps.html new file mode 100644 index 0000000..3d388bf --- /dev/null +++ b/doc/groff.html.node/Page-Location-Traps.html @@ -0,0 +1,326 @@ + + + + + + +Page Location Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.1.1 Page Location Traps

    + + + +

    A page location trap is a vertical position trap that applies to +the page; that is, to undiverted output. Many can be present; manage +them with the wh and ch requests. +

    +
    +
    Request: .wh dist [name]
    +
    +

    Plant macro name as page location trap at dist. The default +scaling unit is ‘v’. Non-negative values for dist set the +trap relative to the top of the page; negative values set the trap +relative to the bottom of the page. It is not possible to plant a trap +less than one basic unit from the page bottom: a dist of -0 +is interpreted as 0, the top of the page.106 An existing visible trap (see below) at +dist is removed; this is wh’s sole function if name +is missing. +

    +

    A trap is sprung only if it is visible, meaning that its location +is reachable on the page107 and it +is not hidden by another trap at the same location already planted +there. +

    + + + + + + + + +

    A macro package might set headers and footers as follows; this example +configures vertical margins of one inch to the body text, and one +half-inch to the titles. Observe the use of the no-break control +character with sp request to position our text baselines, +and the page number character ‘%’ used with the tl request. +

    +
    +
    .\" hdfo.roff
    +.de hd                  \" page header
    +'  sp .5i
    +'  tl '\\*(Ti''\\*(Da'  \" title and date strings
    +'  sp .5i
    +..
    +.de fo                  \" page footer
    +'  sp .5i
    +.  tl ''%''
    +.  bp
    +..
    +.wh 0   hd             \" trap at top of the page
    +.wh -1i fo             \" trap 1 inch from bottom
    +
    + +

    To use these traps, copy the above (or load it from a file with the +so or mso requests), then set up the strings it uses. +

    +
    +
    .so hdfo.roff
    +.ds Ti Final Report\"
    +.ds Da 21 May 2023\"
    +.ti
    +On 5 August of last year,
    +this committee tasked me with the investigation of the
    +CFIT (controlled flight into terrain) incident of
    +.\" ...and so on...
    +
    + +

    A trap above the top or at or below the bottom of the page can be made +visible by either moving it into the page area or increasing the page +length so that the trap is on the page. Negative trap values always use +the current page length; they are not converted to an absolute +vertical position. + + +We can use the ptr request to dump our page location traps to the +standard error stream (see Debugging). Their positions are reported +in basic units; an nroff device example follows. +

    +
    +
    .pl 5i
    +.wh -1i xx
    +.ptr
    +    error→ xx      -240
    +.pl 100i
    +.ptr
    +    error→ xx      -240
    +
    + +

    It is possible to have more than one trap at the same location (although +only one at a time can be visible); to achieve this, the traps must be +defined at different locations, then moved to the same place with the +ch request. In the following example, the many empty lines +caused by the bp request are not shown in the output. +

    +
    +
    .de a
    +.  nop a
    +..
    +.de b
    +.  nop b
    +..
    +.de c
    +.  nop c
    +..
    +.
    +.wh 1i a
    +.wh 2i b
    +.wh 3i c
    +.bp
    +    ⇒ a b c
    +
    +
    +
    .ch b 1i
    +.ch c 1i
    +.bp
    +    ⇒ a
    +
    +
    +
    .ch a 0.5i
    +.bp
    +    ⇒ a b
    +
    +
    + +
    +
    Register: \n[.t]
    +
    + + +

    The read-only register .t holds the distance to the next vertical +position trap. If there are no traps between the current position and +the bottom of the page, it contains the distance to the page bottom. +Within a diversion, in the absence of a diversion trap, this distance is +the largest representable integer in basic units—effectively infinite. +

    + +
    +
    Request: .ch name [dist]
    +
    + + +

    Change the location of a trap by moving macro name to new location +dist, or by unplanting it altogether if dist is absent. The +default scaling unit is ‘v’. Parameters to ch are specified +in the opposite order from wh. If name is the earliest +planted macro of multiple traps at the same location, (re)moving it from +that location exposes the macro next least recently planted at the same +place.108 +

    +

    Changing a trap’s location is useful for building up footnotes in a +diversion to allow more space at the bottom of the page for them. +

    + +
    + +

    The same macro can be installed simultaneously at multiple locations; +however, only the earliest-planted instance—that has not yet been +deleted with wh—will be moved by ch. The following +example (using an nroff device) illustrates this behavior. Blank +lines have been elided from the output. +

    +
    +
    .de T
    +Trap sprung at \\n(nlu.
    +.br
    +..
    +.wh 1i T
    +.wh 2i T
    +foo
    +.sp 11i
    +.bp
    +.ch T 4i
    +bar
    +.sp 11i
    +.bp
    +.ch T 5i
    +baz
    +.sp 11i
    +.bp
    +.wh 5i
    +.ch T 6i
    +qux
    +.sp 11i
    +
    +
    +
        ⇒ foo
    +    ⇒ Trap sprung at 240u.
    +    ⇒ Trap sprung at 480u.
    +    ⇒ bar
    +    ⇒ Trap sprung at 480u.
    +    ⇒ Trap sprung at 960u.
    +    ⇒ baz
    +    ⇒ Trap sprung at 480u.
    +    ⇒ Trap sprung at 1200u.
    +    ⇒ qux
    +    ⇒ Trap sprung at 1440u.
    +
    + +
    +
    Register: \n[.ne]
    +
    +

    The read-only register .ne contains the amount of space that was +needed in the last ne request that caused a trap to be sprung; +it is useful in conjunction with the .trunc register. See Page Control. Since the .ne register is set only by traps, it +doesn’t make sense to interpolate it outside of macros called by traps. +

    + +
    +
    Register: \n[.trunc]
    +
    + + +

    A read-only register containing the amount of vertical space truncated +from an sp request by the most recently sprung vertical +position trap, or, if the trap was sprung by an ne request, +minus the amount of vertical motion produced by the ne +request. In other words, at the point a trap is sprung, it +represents the difference of what the vertical position would have +been but for the trap, and what the vertical position actually is. +Since the .trunc register is set only by traps, it doesn’t make +sense to interpolate it outside of macros called by traps. +

    + +
    +
    Register: \n[.pe]
    +
    + + + +

    This Boolean-valued, read-only register interpolates 1 while a page +is being ejected, and 0 otherwise. +

    +

    In the following example, we plant the same trap at the top and the +bottom of the page. We also make the trap report its name and the +vertical drawing position. +

    +
    +
    .de T
    +.tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe]
    +..
    +.ll 46n
    +.wh 0 T
    +.wh -1v T
    +Those who can make you believe absurdities can make you
    +commit atrocities. \[em] Voltaire
    +    error→ T: page 1, nl=0 .pe=0
    +    error→ T: page 1, nl=2600 .pe=1
    +    ⇒ Those who can make you believe absurdities can
    +    ⇒ make you commit atrocities. -- Voltaire
    +
    +
    + + + +

    When designing macros, keep in mind that diversions and traps do +normally interact. For example, if a trap calls a header macro (while +outputting a diversion) that tries to change the font on the current +page, the effect is not visible before the diversion has completely been +printed (except for input protected with \! or \?) since +the data in the diversion is already formatted. In most cases, this is +not the expected behaviour. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Page-Motions.html b/doc/groff.html.node/Page-Motions.html new file mode 100644 index 0000000..bb94bdb --- /dev/null +++ b/doc/groff.html.node/Page-Motions.html @@ -0,0 +1,454 @@ + + + + + + +Page Motions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.25 Page Motions

    + + + +

    See Manipulating Spacing, for a discussion of the most commonly used +request for vertical motion, sp, which spaces downward by one +vee. +

    +
    +
    Request: .mk [reg]
    +
    +
    Request: .rt [dist]
    +
    + + + + + + + + +

    You can mark a location on a page for subsequent return. +mk takes an argument, a register name in which to store the +current page location. If given no argument, it stores the location in +an internal register. This location can be used later by the rt +or the sp requests (or the \v escape). +

    +

    The rt request returns upward to the location marked with +the last mk request. If used with an argument, it returns to a +vertical position dist from the top of the page (no previous +call to mk is necessary in this case). The default scaling +unit is ‘v’. +

    +

    If a page break occurs between a mk request and its matching +rt request, the rt request is silently ignored. +

    +

    A simple implementation of a macro to set text in two columns follows. +

    +
    +
    .nr column-length 1.5i
    +.nr column-gap 4m
    +.nr bottom-margin 1m
    +.
    +.de 2c
    +.  br
    +.  mk
    +.  ll \\n[column-length]u
    +.  wh -\\n[bottom-margin]u 2c-trap
    +.  nr right-side 0
    +..
    +.
    +.de 2c-trap
    +.  ie \\n[right-side] \{\
    +.    nr right-side 0
    +.    po -(\\n[column-length]u + \\n[column-gap]u)
    +.    \" remove trap
    +.    wh -\\n[bottom-margin]u
    +.  \}
    +.  el \{\
    +.    \" switch to right side
    +.    nr right-side 1
    +.    po +(\\n[column-length]u + \\n[column-gap]u)
    +.    rt
    +.  \}
    +..
    +
    + +

    Now let us apply our two-column macro. +

    +
    +
    .pl 1.5i
    +.ll 4i
    +This is a small test that shows how the
    +rt request works in combination with mk.
    +
    +.2c
    +Starting here, text is typeset in two columns.
    +Note that this implementation isn't robust
    +and thus not suited for a real two-column
    +macro.
    +    ⇒ This is a small test that shows how the
    +    ⇒ rt request works in combination with mk.
    +    ⇒
    +    ⇒ Starting  here,    isn't    robust
    +    ⇒ text is typeset    and   thus  not
    +    ⇒ in two columns.    suited  for   a
    +    ⇒ Note that  this    real two-column
    +    ⇒ implementation     macro.
    +
    +
    + +

    Several escape sequences enable fine control of movement about the page. +

    +
    +
    Escape sequence: \v'expr'
    +
    + + +

    Vertically move the drawing position. expr indicates the +magnitude of motion: positive is downward and and negative upward. The +default scaling unit is ‘v’. The motion is relative to the current +drawing position unless expr begins with the boundary-relative +motion operator ‘|’. See Numeric Expressions. +

    +

    Text processing continues at the new drawing position; usually, vertical +motions should be in balanced pairs to avoid a confusing page layout. +

    +

    \v will not spring a vertical position trap. This can be useful; +for example, consider a page bottom trap macro that prints a marker in +the margin to indicate continuation of a footnote. See Traps. +

    + +

    A few escape sequences that produce vertical motion are unusual. They +are thought to originate early in AT&T nroff history to achieve +super- and subscripting by half-line motions on line printers and +teletypewriters before the phototypesetter made more precise positioning +available. They are reckoned in ems—not vees—to maintain continuity +with their original purpose of moving relative to the size of the type +rather than the distance between text baselines (vees).103 +

    +
    +
    Escape sequence: \r
    +
    +
    Escape sequence: \u
    +
    +
    Escape sequence: \d
    +
    +

    Move upward 1m, upward .5m, and +downward .5m, respectively. +

    + +

    Let us see these escape sequences in use. +

    +
    +
    Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU.
    +
    + +

    In the foregoing we have paired \u and \d to typeset a +superscript, and later a full em negative (“reverse”) motion to place +a superscript above a subscript. A numeral-width horizontal motion +escape sequence aligns the proton and nucleon numbers, while \k +marks a horizontal position to which \h returns so that we could +stack them. (We shall discuss these horizontal motion escape sequences +presently.) In serious applications, we often want to alter the type +size of the -scripts and to fine-tune the vertical motions, as the +groff ms package does with its super- and subscripting +string definitions. +

    +
    +
    Escape sequence: \h'expr'
    +
    + + + + + +

    Horizontally move the drawing position. expr indicates the +magnitude of motion: positive is rightward and negative leftward. The +default scaling unit is ‘m’. The motion is relative to the current +drawing position unless expr begins with the boundary-relative +motion operator ‘|’. See Numeric Expressions. +

    + +

    The following string definition sets the TeX +logo.104 +

    +
    +
    .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\"
    +
    + +

    There are a number of special-case escape sequences for horizontal +motion. +

    +
    +
    Escape sequence: \SP
    +
    + + + + +

    Move right one word space. (The input is a backslash followed by a +space.) This escape sequence can be thought of as a non-adjustable, +unbreakable space. Usually you want \~ instead; see +Manipulating Filling and Adjustment. +

    + + + +
    +
    Escape sequence: \|
    +
    +

    Move one-sixth em to the right on typesetting output devices. If +a glyph named ‘\|’ is defined in the current font, its width is +used instead, even on terminal output devices. +

    + + + +
    +
    Escape sequence: \^
    +
    +

    Move one-twelfth em to the right on typesetting output devices. +If a glyph named ‘\^’ is defined in the current font, its width is +used instead, even on terminal output devices. +

    + +
    +
    Escape sequence: \0
    +
    + + + + +

    Move right by the width of a numeral in the current font. +

    + +

    Horizontal motions are not discarded at the end of an output line as +word spaces are. See Breaking. +

    +
    +
    Escape sequence: \w'anything'
    +
    +
    Register: \n[st]
    +
    +
    Register: \n[sb]
    +
    +
    Register: \n[rst]
    +
    +
    Register: \n[rsb]
    +
    +
    Register: \n[ct]
    +
    +
    Register: \n[ssc]
    +
    +
    Register: \n[skw]
    +
    + +

    Interpolate the width of anything in basic units. This escape +sequence allows several properties of formatted output to be measured +without writing it out. +

    +
    +
    The length of the string 'abc' is \w'abc'u.
    +    ⇒ The length of the string 'abc' is 72u.
    +
    + + + +

    anything is processed in a dummy environment: this means that +font and type size changes, for example, may occur within it without +affecting subsequent output. +

    +

    After each use, \w sets several registers. +

    + + + +
    +
    st
    +
    sb
    +

    The maximum vertical displacements of the text baseline above and below, +respectively. The sign convention is opposite that of relative vertical +motions; that is, depth below the (original) baseline is negative. +These registers are incorrectly documented in the AT&T +troff manual as “the highest and lowest extent of [the argument +to \w] relative to the baseline”. +

    +
    +
    rst
    +
    rsb
    +

    Like st and sb, but taking account of the heights and +depths of glyphs. In other words, these registers store the highest and +lowest vertical positions attained by anything, doing what +AT&T troff documented st and sb as doing. +

    +
    +
    ct
    +

    Characterizes the geometry of glyphs occurring in anything. +

    +
    +
    0
    +

    only short glyphs, no descenders or tall glyphs +

    +
    +
    1
    +

    at least one descender +

    +
    +
    2
    +

    at least one tall glyph +

    +
    +
    3
    +

    at least one each of a descender and a tall glyph +

    +
    + +
    +
    ssc
    +

    The amount of horizontal space (possibly negative) that should be added +to the last glyph before a subscript. +

    +
    +
    skw
    +

    How far to right of the center of the last glyph in the \w +argument, the center of an accent from a roman font should be placed +over that glyph. +

    +
    +
    + +
    +
    Escape sequence: \kp
    +
    +
    Escape sequence: \k(ps
    +
    Escape sequence: \k[position]
    +
    + + + + +

    Store the current horizontal position in the input line in a +register with the name position (one-character name p, +two-character name ps). Use this, for example, to return to the +beginning of a string for highlighting or other decoration. +

    + +
    +
    Register: \n[hp]
    +
    + + + + +

    The current horizontal position at the input line. +

    + +
    +
    Register: \n[.k]
    +
    + + + + +

    A read-only register containing the current horizontal output position +(relative to the current indentation). +

    + +
    +
    Escape sequence: \o'abc…'
    +
    + + +

    Overstrike the glyphs of characters a, b, c, …; +the glyphs are centered, written, and the drawing position advanced by +the widest of the glyphs. +

    + +
    +
    Escape sequence: \zc
    +
    + + +

    Format the character c with zero width; that is, without advancing +the drawing position. Use \z to overstrike glyphs aligned to +their left edges, in contrast to \o’s centering. +

    + +
    +
    Escape sequence: \Z'anything'
    +
    + + +

    Save the drawing position, format anything, then restore it. Tabs +and leaders in the argument are ignored with an error diagnostic. +

    +

    We might implement a strike-through macro thus. +

    +
    +
    .de ST
    +.nr width \w'\\$1'
    +\Z@\v'-.25m'\l'\\n[width]u'@\\$1
    +..
    +.
    +This is
    +.ST "a test"
    +an actual emergency!
    +
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Paper-Format.html b/doc/groff.html.node/Paper-Format.html new file mode 100644 index 0000000..f6f9e72 --- /dev/null +++ b/doc/groff.html.node/Paper-Format.html @@ -0,0 +1,101 @@ + + + + + + +Paper Format (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    2.5 Paper Format

    + + + + + + + + +

    In groff, the page dimensions for the formatter GNU troff +and for output devices are handled separately. See Page Layout, for +vertical manipulation of the page size, and See Line Layout, for +horizontal changes. + + +The papersize macro package, normally loaded by troffrc at +startup, provides an interface for configuring page dimensions by +convenient names, like ‘letter’ or ‘a4’; see +groff_tmac(5). The default used by the formatter depends on +its build configuration, but is usually one of the foregoing, as +geographically appropriate. +

    +

    It is up to each macro package to respect the page dimensions configured +in this way. +

    +

    For each output device, the size of the output medium can be set in its +DESC file. Most output drivers also recognize a command-line +option -p to override the default dimensions and an option +-l to use landscape orientation. See DESC File Format, for +a description of the papersize keyword, which takes an argument +of the same form as -p. The output driver’s man page, such as +grops(1), may also be helpful. +

    +

    groff uses the command-line option -P to pass options to +postprocessors; for example, use the following for PostScript output on +A4 paper in landscape orientation. +

    +
    +
    groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps
    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Paragraphs-in-ms.html b/doc/groff.html.node/Paragraphs-in-ms.html new file mode 100644 index 0000000..e6c3a28 --- /dev/null +++ b/doc/groff.html.node/Paragraphs-in-ms.html @@ -0,0 +1,160 @@ + + + + + + +Paragraphs in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.3 Paragraphs

    + + +

    Paragraphing macros break, or terminate, any pending output line +so that a new paragraph can begin. Several paragraph types are +available, differing in how indentation applies to them: to left, right, +or both margins; to the first output line of the paragraph, all output +lines, or all but the first. All paragraphing macro calls cause the +insertion of vertical space in the amount stored in the PD +register, except at page or column breaks. Alternatively, a blank input +line breaks the output line and vertically spaces by one vee. +

    +
    +
    Macro: .LP
    +
    +

    Set a paragraph without any (additional) indentation. +

    + +
    +
    Macro: .PP
    +
    +

    Set a paragraph with a first-line left indentation in the amount stored +in the PI register. +

    + +
    +
    Macro: .IP [marker [width]]
    +
    +

    Set a paragraph with a left indentation. The optional marker is +not indented and is empty by default. It has several applications; +see Lists. width overrides the indentation amount +stored in the PI register; its default unit is ‘n’. Once +specified, width applies to further IP calls until +specified again or a heading or different paragraphing macro is called. +

    + +
    +
    Macro: .QP
    +
    +

    Set a paragraph indented from both left and right margins by the amount +stored in the QI register. +

    + +
    +
    Macro: .QS
    +
    +
    Macro: .QE
    +
    +

    Begin (QS) and end (QE) a region where each paragraph is +indented from both margins by the amount stored in the QI +register. The text between QS and QE can be structured +further by use of other paragraphing macros. +

    + +
    +
    Macro: .XP
    +
    +

    Set an “exdented” paragraph—one with a left indentation in the +amount stored in the PI register on every line except the +first (also known as a hanging indent). This is a Berkeley extension. +

    + +

    The following example illustrates the use of paragraphing macros. +

    +
    +
    +
    .NH 2
    +Cases used in the 2001 study
    +.LP
    +Two software releases were considered for this report.
    +.PP
    +The first is commercial software;
    +the second is free.
    +.IP \[bu]
    +Microsoft Word for Windows,
    +starting with version 1.0 through the current version
    +(Word 2000).
    +.IP \[bu]
    +GNU Emacs,
    +from its first appearance as a standalone editor through
    +the current version (v20).
    +See [Bloggs 2002] for details.
    +.QP
    +Franklin's Law applied to software:
    +software expands to outgrow both RAM and disk space over
    +time.
    +.SH
    +Bibliography
    +.XP
    +Bloggs, Joseph R.,
    +.I "Everyone's a Critic" ,
    +Underground Press, March 2002.
    +A definitive work that answers all questions and
    +criticisms about the quality and usability of free
    +software.
    +
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Paragraphs.html b/doc/groff.html.node/Paragraphs.html new file mode 100644 index 0000000..a230bcd --- /dev/null +++ b/doc/groff.html.node/Paragraphs.html @@ -0,0 +1,109 @@ + + + + + + +Paragraphs (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.1 Paragraphs

    + + +

    Paragraphs can be separated and indented in various ways. Some start +with a blank line and have a first-line indentation, like most of the +ones in this manual. Block paragraphs omit the indentation. +

    +
    +
      ⇒ Some  men  look  at constitutions with sanctimonious
    +  ⇒ reverence,  and  deem  them  like  the  ark  of  the
    +  ⇒ covenant, too sacred to be touched.
    +
    + + + + +

    We also frequently encounter tagged paragraphs, which begin +with a tag or label at the left margin and indent the remaining text. +

    +
    +
      ⇒ one  This  is the first paragraph.  Notice how the
    +  ⇒      first line of the resulting  paragraph  lines
    +  ⇒      up with the other lines in the paragraph.
    +
    + +

    If the tag is too wide for the indentation, the line is broken. +

    +
    +
      ⇒ longlabel
    +  ⇒      The  label does not align with the subsequent
    +  ⇒      lines, but they align with each other.
    +
    + +

    A variation of the tagged paragraph is the itemized or enumerated +paragraph, which might use punctuation or a digit for a tag, +respectively. These are frequently used to construct lists. +

    +
    +
      ⇒ o    This  list  item  starts with a bullet.  When
    +  ⇒      producing output for a device using the ASCII
    +  ⇒      character set, an 'o' is formatted instead.
    +
    + +

    Often, use of the same macro without a tag continues such a discussion. +

    +
    +
      ⇒ -xyz  This option is recognized but ignored.
    +  ⇒
    +  ⇒       It had a security hole that we don't discuss.
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Parameters.html b/doc/groff.html.node/Parameters.html new file mode 100644 index 0000000..ddf31cf --- /dev/null +++ b/doc/groff.html.node/Parameters.html @@ -0,0 +1,195 @@ + + + + + + +Parameters (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.24.1 Parameters

    + + +

    Macro calls and string interpolations optionally accept a list of +arguments; recall Calling Macros. At the time such an +interpolation takes place, these parameters can be examined using +a register and a variety of escape sequences starting with ‘\$’. +All such escape sequences are interpreted even in copy mode, a fact we +shall motivate and explain below (see Copy Mode). +

    +
    +
    Register: \n[.$]
    +
    + +

    The count of parameters available to a macro or string is kept in this +read-only register. The shift request can change its value. +

    + +

    Any individual parameter can be accessed by its position in the list of +arguments to the macro call, numbered from left to right starting at 1, +with one of the following escape sequences. +

    +
    +
    Escape sequence: \$n
    +
    +
    Escape sequence: \$(nn
    +
    Escape sequence: \$[nnn]
    +

    Interpolate the nth, nnth, or nnnth parameter. The +first form expects only a single digit (1≤n≤9)), the +second two digits (01≤nn≤99)), and the third any +positive integer nnn. Macros and strings accept an unlimited +number of parameters. +

    + +
    +
    Request: .shift [n]
    +
    +

    Shift the parameters n places (1 by default). This is a +“left shift”: what was parameter i becomes parameter +i-n. The parameters formerly in positions 1 +to n are no longer available. Shifting by a non-positive +amount performs no operation. The register .$ is adjusted +accordingly. +

    + + + + + +

    In practice, parameter interpolations are usually seen prefixed with an +extra escape character. This is because the \$ family of escape +sequences is interpreted even in copy mode.100 +

    +
    +
    Escape sequence: \$*
    +
    +
    Escape sequence: \$@
    +
    +
    Escape sequence: \$^
    +
    +

    In some cases it is convenient to interpolate all of the parameters at +once (to pass them to a request, for instance). The \$* escape +concatenates the parameters, separating them with spaces. \$@ +is similar, concatenating the parameters, surrounding each with double +quotes and separating them with spaces. If not in compatibility mode, +the interpolation depth of double quotes is preserved (see Calling Macros). \$^ interpolates all parameters as if they were +arguments to the ds request. +

    +
    +
    .de foo
    +. tm $1='\\$1'
    +. tm $2='\\$2'
    +. tm $*='\\$*'
    +. tm $@='\\$@'
    +. tm $^='\\$^'
    +..
    +.foo " This is a "test"
    +    error→ $1=' This is a '
    +    error→ $2='test"'
    +    error→ $*=' This is a  test"'
    +    error→ $@='" This is a " "test""'
    +    error→ $^='" This is a "test"'
    +
    + +

    \$* is useful when writing a macro that doesn’t need to +distinguish its arguments, or even to not interpret them; examples +include macros that produce diagnostic messages by wrapping the +tm or ab requests. Use \$@ when writing a macro +that may need to shift its parameters and/or wrap a macro or request +that finds the count significant. If in doubt, prefer \$@ to +\$*. An application of \$^ is seen in trace.tmac, +which redefines some requests and macros for debugging purposes. +

    + +
    +
    Escape sequence: \$0
    +
    + + +

    Interpolate the name by which the macro being interpreted was called. +The als request can cause a macro to have more than one name. +Applying string interpolation to a macro does not change this name. +

    +
    +
    .de foo
    +.  tm \\$0
    +..
    +.als bar foo
    +.
    +.de aaa
    +.  foo
    +..
    +.de bbb
    +.  bar
    +..
    +.de ccc
    +\\*[foo]\\
    +..
    +.de ddd
    +\\*[bar]\\
    +..
    +.
    +.aaa
    +    error→ foo
    +.bbb
    +    error→ bar
    +.ccc
    +    error→ ccc
    +.ddd
    +    error→ ddd
    +
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Postprocessor-Access.html b/doc/groff.html.node/Postprocessor-Access.html new file mode 100644 index 0000000..3b06a80 --- /dev/null +++ b/doc/groff.html.node/Postprocessor-Access.html @@ -0,0 +1,144 @@ + + + + + + +Postprocessor Access (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.34 Postprocessor Access

    + + + +

    Two escape sequences and two requests enable documents to pass +information directly to a postprocessor. These are useful for +exercising device-specific capabilities that the groff language +does not abstract or generalize; examples include the embedding of +hyperlinks and image files. Device-specific functions are documented in +each output driver’s man page, such as gropdf(1), +grops(1), or grotty(1). +

    +
    +
    Request: .device xxx
    +
    +
    Escape sequence: \X'xxx '
    +
    +

    Embed all xxx arguments into GNU troff output as parameters +to a device control command ‘x X. The meaning and +interpretation of such parameters is determined by the output driver or +other postprocessor. +

    + + + +

    The device request processes its arguments in copy mode +(see Copy Mode). An initial neutral double quote in contents +is stripped to allow embedding of leading spaces. + + + + +By contrast, within \X arguments, the escape sequences \&, +\), \%, and \: are ignored; \SP and +\~ are converted to single space characters; and \\ has +its escape character stripped. So that the basic Latin subset of the +Unicode character set115 can be reliably encoded in device control +commands, seven special character escape sequences (‘\-’, +‘\[aq]’, ‘\[dq]’, ‘\[ga]’, ‘\[ha]’, ‘\[rs]’, +and ‘\[ti]’,) are mapped to basic Latin characters; see the +groff_char(7) man page. For this transformation, character +translations and special character definitions are +ignored.116 The use of any +other escape sequence in \X parameters is normally an error. +

    + + + +

    If the use_charnames_in_special directive appears in the output +device’s DESC file, the use of special character escape sequences +is not an error; they are simply output verbatim (with the +exception of the seven mapped to Unicode basic Latin characters, +discussed above). use_charnames_in_special is currently employed +only by grohtml. +

    + +
    +
    Request: .devicem name
    +
    +
    Escape sequence: \Yn
    +
    +
    Escape sequence: \Y(nm
    +
    Escape sequence: \Y[name]
    +

    This is approximately equivalent to ‘\X'\*[name]'’ +(one-character name n, two-character name nm). +However, the contents of the string or macro name are not +interpreted; also it is permitted for name to have been defined as +a macro and thus contain newlines (it is not permitted for the argument +to \X to contain newlines). The inclusion of newlines requires +an extension to the AT&T troff output format, and +confuses drivers that do not know about this extension (see Device Control Commands). +

    + +
    +
    Request: .tag name
    +
    +
    Request: .taga name
    +
    +

    Reserved for internal use. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Predefined-Text.html b/doc/groff.html.node/Predefined-Text.html new file mode 100644 index 0000000..8b03b1f --- /dev/null +++ b/doc/groff.html.node/Predefined-Text.html @@ -0,0 +1,53 @@ + + + + + + +Predefined Text (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.12 Predefined Text

    + +

    Most macro packages supply predefined strings to set prepared text like +the date, or to perform operations like super- and subscripting. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Preprocessor-Intro.html b/doc/groff.html.node/Preprocessor-Intro.html new file mode 100644 index 0000000..7bb43a7 --- /dev/null +++ b/doc/groff.html.node/Preprocessor-Intro.html @@ -0,0 +1,78 @@ + + + + + + +Preprocessor Intro (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.5 Preprocessors

    + + +

    An alternative approach to complexity management, particularly when +constructing tables, setting mathematics, or drawing diagrams, lies in +preprocessing. A preprocessor employs a domian-specific language +to ease the generation of tables, equations, and so forth in terms that +are convenient for human entry. Each preprocessor reads a document and +translates the parts of it that apply to it into GNU troff input. +Command-line options to groff tell it which preprocessors to +use. +

    +

    groff provides preprocessors for laying out tables +(gtbl), typesetting equations (geqn), drawing +diagrams (gpic and ggrn), inserting bibliographic +references (grefer), and drawing chemical structures +(gchem). An associated program that is useful when dealing +with preprocessors is gsoelim.1 +

    +

    groff also supports grap, a preprocessor for drawing +graphs. A free implementation of it can be obtained separately. +

    +

    Unique to groff is the preconv preprocessor that enables +groff to handle documents in a variety of input encodings. +

    +

    Other preprocessors exist, but no free implementations +are known. An example is ideal, which draws diagrams using a +mathematical constraint language. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Preprocessor-Support.html b/doc/groff.html.node/Preprocessor-Support.html new file mode 100644 index 0000000..43e961c --- /dev/null +++ b/doc/groff.html.node/Preprocessor-Support.html @@ -0,0 +1,56 @@ + + + + + + +Preprocessor Support (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.13 Preprocessor Support

    + +

    All macro packages provide support for various preprocessors and may +extend their functionality by defining macros to set their contents in +displays. Examples include TS and TE for gtbl, +EQ and EN for geqn, and PS and PE +for gpic. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Program-and-File-Index.html b/doc/groff.html.node/Program-and-File-Index.html new file mode 100644 index 0000000..ecc30ec --- /dev/null +++ b/doc/groff.html.node/Program-and-File-Index.html @@ -0,0 +1,239 @@ + + + + + + +Program and File Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix I Program and File Index

    + +
    +
    Jump to:   A +   +C +   +D +   +E +   +F +   +G +   +I +   +J +   +L +   +M +   +N +   +P +   +R +   +S +   +T +   +V +   +Z +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    A
    an.tmac: man

    C
    changebar: Miscellaneous
    composite.tmac: Using Symbols
    cp1047.tmac: Input Encodings
    cs.tmac: Manipulating Hyphenation

    D
    de.tmac: Manipulating Hyphenation
    DESC: Selecting Fonts
    DESC: Font Families
    DESC: Using Symbols
    DESC: Using Symbols
    DESC: Special Fonts
    diffmk: Miscellaneous

    E
    ec.tmac: Input Encodings
    en.tmac: Manipulating Hyphenation
    eqn: ms Insertions

    F
    fr.tmac: Manipulating Hyphenation
    freeeuro.pfa: Input Encodings

    G
    gchem: Groff Options
    gdiffmk: Miscellaneous
    geqn: Groff Options
    ggrn: Groff Options
    gpic: Groff Options
    grap: Groff Options
    grefer: Groff Options
    groff: Groff Options
    gsoelim: Groff Options
    gtbl: Groff Options
    gtroff: Groff Options

    I
    it.tmac: Manipulating Hyphenation

    J
    ja.tmac: Manipulating Hyphenation

    L
    latin1.tmac: Input Encodings
    latin2.tmac: Input Encodings
    latin5.tmac: Input Encodings
    latin9.tmac: Input Encodings

    M
    makeindex: Indexing
    man.local: Optional man extensions
    man.tmac: man
    man.ultrix: Optional man extensions

    N
    nrchbar: Miscellaneous

    P
    papersize.tmac: Paper Format
    perl: I/O
    pic: ms Insertions
    post-grohtml: Groff Options
    pre-grohtml: Groff Options
    preconv: Groff Options

    R
    refer: ms Insertions

    S
    soelim: Debugging
    sv.tmac: Manipulating Hyphenation

    T
    tbl: ms Insertions
    trace.tmac: Writing Macros
    troffrc: Groff Options
    troffrc: Paper Format
    troffrc: Manipulating Hyphenation
    troffrc: Manipulating Hyphenation
    troffrc: troff and nroff Modes
    troffrc-end: Groff Options
    troffrc-end: Manipulating Hyphenation
    troffrc-end: troff and nroff Modes
    tty.tmac: troff and nroff Modes
    tty.tmac: Line Layout

    V
    vtroff: Operators in Conditionals

    Z
    zh.tmac: Manipulating Hyphenation

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Punning-Names.html b/doc/groff.html.node/Punning-Names.html new file mode 100644 index 0000000..dde1a20 --- /dev/null +++ b/doc/groff.html.node/Punning-Names.html @@ -0,0 +1,190 @@ + + + + + + +Punning Names (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.30 Punning Names

    + + +

    Macros, strings, and diversions share a name space; recall +Identifiers. Internally, the same mechanism is used to store +them. You can thus call a macro with string interpolation syntax and +vice versa. +

    +
    +
    .de subject
    +Typesetting
    +..
    +.de predicate
    +rewards attention to detail
    +..
    +\*[subject] \*[predicate].
    +Truly.
    +    ⇒ Typesetting
    +    ⇒  rewards attention to detail Truly.
    +
    + +

    What went wrong? Strings don’t contain newlines, but macros do. String +interpolation placed a newline at the end of ‘\*[subject]’, and the +next thing on the input was a space. Then when ‘\*[predicate]’ was +interpolated, it was followed by the empty request ‘.’ on a line by +itself. If we want to use macros as strings, we must take interpolation +behavior into account. +

    +
    +
    .de subject
    +Typesetting\\
    +..
    +.de predicate
    +rewards attention to detail\\
    +..
    +\*[subject] \*[predicate].
    +Truly.
    +    ⇒ Typesetting rewards attention to detail.  Truly.
    +
    + +

    By ending each text line of the macros with an escaped +\RET, we get the desired effect (see Line Continuation).114 +What would have happened if we had used only one backslash at a time +instead? +

    +

    Interpolating a string does not hide existing macro arguments. We can +also place the escaped newline outside the string interpolation instead +of within the string definition. Thus, in a macro, a more efficient way +of doing +

    +
    +
    .xx \\$@
    +
    + +

    is +

    +
    +
    \\*[xx]\\
    +
    + +

    The latter calling syntax doesn’t change the value of \$0, which +is then inherited from the calling macro (see Parameters). +

    +

    Diversions can be also called with string syntax. It is sometimes +convenient to copy one-line diversions to a string. +

    +
    +
    .di xx
    +the
    +.ft I
    +interpolation system
    +.ft
    +.br
    +.di
    +.ds yy This is a test of \*(xx\c
    +\*(yy.
    +    ⇒ This is a test of the interpolation system.
    +
    + +

    As the previous example shows, it is possible to store formatted output +in strings. The \c escape sequence prevents the subsequent +newline from being interpreted as a break (again, +see Line Continuation). +

    +

    Copying multi-output line diversions produces unexpected results. +

    +
    +
    .di xxx
    +a funny
    +.br
    +test
    +.br
    +.di
    +.ds yyy This is \*[xxx]\c
    +\*[yyy].
    +    ⇒ test This is a funny.
    +
    + +

    Usually, it is not predictable whether a diversion contains one or more +output lines, so this mechanism should be avoided. With AT&T +troff, this was the only solution to strip off a final newline +from a diversion. Another disadvantage is that the spaces in the copied +string are already formatted, preventing their adjustment. This can +cause ugly results. +

    + + + + + + + +

    A clean solution to this problem is available in GNU troff, using +the requests chop to remove the final newline of a diversion, and +unformat to make the horizontal spaces adjustable again. +

    +
    +
    .box xxx
    +a funny
    +.br
    +test
    +.br
    +.box
    +.chop xxx
    +.unformat xxx
    +This is \*[xxx].
    +    ⇒ This is a funny test.
    +
    + +

    See gtroff Internals. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Register-Index.html b/doc/groff.html.node/Register-Index.html new file mode 100644 index 0000000..979a346 --- /dev/null +++ b/doc/groff.html.node/Register-Index.html @@ -0,0 +1,349 @@ + + + + + + +Register Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix E Register Index

    + +

    The macro package or program a specific register belongs to is appended +in brackets. +

    +

    A register name x consisting of exactly one character can be +accessed as ‘\nx’. A register name xx consisting of exactly +two characters can be accessed as ‘\n(xx’. Register names +xxx of any length can be accessed as ‘\n[xxx]’. +

    +
    +
    Jump to:   $ +   +% +   +. +   +
    +C +   +D +   +F +   +G +   +H +   +L +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +Y +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    $
    $$: Built-in Registers

    %
    %: Page Layout
    %: Page Control

    .
    .$: Parameters
    .A: Built-in Registers
    .a: Manipulating Spacing
    .b: Artificial Fonts
    .br: Control Characters
    .c: Built-in Registers
    .C: Compatibility Mode
    .cdp: Environments
    .ce: Manipulating Filling and Adjustment
    .cht: Environments
    .color: Colors
    .cp: Compatibility Mode
    .csk: Environments
    .d: Diversions
    .ev: Environments
    .F: Built-in Registers
    .f: Font Positions
    .fam: Font Families
    .fn: Selecting Fonts
    .fp: Font Positions
    .g: Built-in Registers
    .H: Motion Quanta
    .h: Diversions
    .height: Artificial Fonts
    .hla: Manipulating Hyphenation
    .hlc: Manipulating Hyphenation
    .hlm: Manipulating Hyphenation
    .hy: Manipulating Hyphenation
    .hym: Manipulating Hyphenation
    .hys: Manipulating Hyphenation
    .i: Line Layout
    .in: Line Layout
    .int: Line Continuation
    .j: Manipulating Filling and Adjustment
    .k: Page Motions
    .kern: Ligatures and Kerning
    .L: Manipulating Spacing
    .l: Line Layout
    .lg: Ligatures and Kerning
    .linetabs: Tabs and Fields
    .ll: Line Layout
    .lt: Page Layout
    .m: Colors
    .M: Colors
    .n: Environments
    .ne: Page Location Traps
    .nm: Miscellaneous
    .nn: Miscellaneous
    .ns: Manipulating Spacing
    .o: Line Layout
    .O: Suppressing Output
    .P: Built-in Registers
    .p: Page Layout
    .pe: Page Location Traps
    .pn: Page Layout
    .ps: Using Fractional Type Sizes
    .psr: Using Fractional Type Sizes
    .pvs: Changing the Vertical Spacing
    .R: Built-in Registers
    .rj: Manipulating Filling and Adjustment
    .s: Changing the Type Size
    .slant: Artificial Fonts
    .sr: Using Fractional Type Sizes
    .ss: Manipulating Filling and Adjustment
    .sss: Manipulating Filling and Adjustment
    .sty: Font Families
    .T: Built-in Registers
    .t: Page Location Traps
    .tabs: Tabs and Fields
    .trunc: Page Location Traps
    .U: Built-in Registers
    .u: Manipulating Filling and Adjustment
    .V: Motion Quanta
    .v: Changing the Vertical Spacing
    .vpt: Vertical Position Traps
    .w: Environments
    .warn: Debugging
    .x: Built-in Registers
    .y: Built-in Registers
    .Y: Built-in Registers
    .z: Diversions
    .zoom: Selecting Fonts

    C
    c.: Built-in Registers
    ct: Page Motions

    D
    DD [ms]: ms Document Control Settings
    DI [ms]: ms Document Control Settings
    dl: Diversions
    dn: Diversions
    dw: Built-in Registers
    dy: Built-in Registers

    F
    FF [ms]: ms Document Control Settings
    FI [ms]: ms Document Control Settings
    FM [ms]: ms Document Control Settings
    FPD [ms]: ms Document Control Settings
    FPS [ms]: ms Document Control Settings
    FVS [ms]: ms Document Control Settings

    G
    GROWPS [ms]: ms Document Control Settings
    GS [ms]: Differences from AT&T ms

    H
    HM [ms]: ms Document Control Settings
    HORPHANS [ms]: ms Document Control Settings
    hours: Built-in Registers
    hp: Page Motions
    HY [ms]: ms Document Control Settings

    L
    LL [ms]: ms Document Control Settings
    llx: Miscellaneous
    lly: Miscellaneous
    ln: Miscellaneous
    lsn: Leading Space Traps
    lss: Leading Space Traps
    LT [ms]: ms Document Control Settings

    M
    MINGW [ms]: ms Document Control Settings
    minutes: Built-in Registers
    mo: Built-in Registers

    N
    nl: Page Control

    O
    opmaxx: Suppressing Output
    opmaxy: Suppressing Output
    opminx: Suppressing Output
    opminy: Suppressing Output

    P
    PD [ms]: ms Document Control Settings
    PI [ms]: ms Document Control Settings
    PO [ms]: ms Document Control Settings
    PORPHANS [ms]: ms Document Control Settings
    PS [ms]: ms Document Control Settings
    PSINCR [ms]: ms Document Control Settings

    Q
    QI [ms]: ms Document Control Settings

    R
    rsb: Page Motions
    rst: Page Motions

    S
    sb: Page Motions
    seconds: Built-in Registers
    skw: Page Motions
    slimit: Debugging
    ssc: Page Motions
    st: Page Motions
    systat: I/O

    T
    TC-MARGIN [ms]: ms Document Control Settings

    U
    urx: Miscellaneous
    ury: Miscellaneous

    V
    VS [ms]: ms Document Control Settings

    Y
    year: Built-in Registers
    yr: Built-in Registers

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Registers.html b/doc/groff.html.node/Registers.html new file mode 100644 index 0000000..6f33d51 --- /dev/null +++ b/doc/groff.html.node/Registers.html @@ -0,0 +1,65 @@ + + + + + + +Registers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8 Registers

    + + +

    In the roff language, numbers can be stored in registers. +Many built-in registers exist, supplying anything from the date to +details of formatting parameters. You can also define your own. +See Identifiers, for information on constructing a valid name for a +register. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Request-Index.html b/doc/groff.html.node/Request-Index.html new file mode 100644 index 0000000..dc328f2 --- /dev/null +++ b/doc/groff.html.node/Request-Index.html @@ -0,0 +1,394 @@ + + + + + + +Request Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix B Request Index

    + +

    Request names appear without a leading control character; the defaults +are . for the regular control character and ' for the +no-break control character. +

    +
    +
    Jump to:   A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +R +   +S +   +T +   +U +   +V +   +W +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    A
    ab: Debugging
    ad: Manipulating Filling and Adjustment
    af: Assigning Register Formats
    aln: Setting Registers
    als: Strings
    am: Writing Macros
    am1: Writing Macros
    ami: Writing Macros
    ami1: Writing Macros
    as: Strings
    as1: Strings
    asciify: Diversions

    B
    backtrace: Debugging
    bd: Artificial Fonts
    blm: Blank Line Traps
    box: Diversions
    boxa: Diversions
    bp: Page Control
    br: Manipulating Filling and Adjustment
    break: while
    brp: Manipulating Filling and Adjustment

    C
    c2: Control Characters
    cc: Control Characters
    ce: Manipulating Filling and Adjustment
    cf: I/O
    cflags: Using Symbols
    ch: Page Location Traps
    char: Using Symbols
    chop: Strings
    class: Character Classes
    close: I/O
    color: Colors
    composite: Using Symbols
    continue: while
    cp: Compatibility Mode
    cs: Artificial Fonts
    cu: Artificial Fonts

    D
    da: Diversions
    de: Writing Macros
    de1: Writing Macros
    defcolor: Colors
    dei: Writing Macros
    dei1: Writing Macros
    device: Postprocessor Access
    devicem: Postprocessor Access
    di: Diversions
    do: Compatibility Mode
    ds: ms Document Control Settings
    ds: Strings
    ds1: Strings
    dt: Diversion Traps

    E
    ec: Using Escape Sequences
    ecr: Using Escape Sequences
    ecs: Using Escape Sequences
    el: if-else
    em: End-of-input Traps
    eo: Using Escape Sequences
    ev: Environments
    evc: Environments
    ex: Debugging

    F
    fam: Font Families
    fc: Fields
    fchar: Using Symbols
    fcolor: Colors
    fi: Manipulating Filling and Adjustment
    fl: Debugging
    fp: Font Positions
    fschar: Using Symbols
    fspecial: Special Fonts
    ft: Selecting Fonts
    ftr: Selecting Fonts
    fzoom: Selecting Fonts

    G
    gcolor: Colors

    H
    hc: Manipulating Hyphenation
    hcode: Manipulating Hyphenation
    hla: Manipulating Hyphenation
    hlm: Manipulating Hyphenation
    hpf: Manipulating Hyphenation
    hpfa: Manipulating Hyphenation
    hpfcode: Manipulating Hyphenation
    hw: Manipulating Hyphenation
    hy: Manipulating Hyphenation
    hym: Manipulating Hyphenation
    hys: Manipulating Hyphenation

    I
    ie: if-else
    if: if-then
    ig: Comments
    in: Line Layout
    it: Input Line Traps
    itc: Input Line Traps

    K
    kern: Ligatures and Kerning

    L
    lc: Leaders
    length: Strings
    lf: Debugging
    lg: Ligatures and Kerning
    linetabs: Tabs and Fields
    ll: Line Layout
    ls: Manipulating Spacing
    lsm: Leading Space Traps
    lt: Page Layout

    M
    mc: Miscellaneous
    mk: Page Motions
    mso: I/O
    msoquiet: I/O

    N
    na: Manipulating Filling and Adjustment
    ne: Page Control
    nf: Manipulating Filling and Adjustment
    nh: Manipulating Hyphenation
    nm: Miscellaneous
    nn: Miscellaneous
    nop: if-then
    nr: ms Document Control Settings
    nr: Setting Registers
    nr: Setting Registers
    nr: Auto-increment
    nroff: troff and nroff Modes
    ns: Manipulating Spacing
    nx: I/O

    O
    open: I/O
    opena: I/O
    os: Page Control
    output: Diversions

    P
    pc: Page Layout
    pev: Debugging
    pi: I/O
    pl: Page Layout
    pm: Debugging
    pn: Page Layout
    pnr: Debugging
    po: Line Layout
    ps: Changing the Type Size
    psbb: Miscellaneous
    pso: I/O
    ptr: Debugging
    pvs: Changing the Vertical Spacing

    R
    rchar: Using Symbols
    rd: I/O
    return: Writing Macros
    rfschar: Using Symbols
    rj: Manipulating Filling and Adjustment
    rm: Strings
    rn: Strings
    rnn: Setting Registers
    rr: Setting Registers
    rs: Manipulating Spacing
    rt: Page Motions

    S
    schar: Using Symbols
    shc: Manipulating Hyphenation
    shift: Parameters
    sizes: Changing the Type Size
    so: I/O
    soquiet: I/O
    sp: Manipulating Spacing
    special: Special Fonts
    spreadwarn: Debugging
    ss: Manipulating Filling and Adjustment
    stringdown: Strings
    stringup: Strings
    sty: Font Families
    substring: Strings
    sv: Page Control
    sy: I/O

    T
    ta: Tabs and Fields
    tag: Postprocessor Access
    taga: Postprocessor Access
    tc: Tabs and Fields
    ti: Line Layout
    tkf: Ligatures and Kerning
    tl: Page Layout
    tm: Debugging
    tm1: Debugging
    tmc: Debugging
    tr: Character Translations
    trf: I/O
    trin: Character Translations
    trnt: Character Translations
    troff: troff and nroff Modes

    U
    uf: Artificial Fonts
    ul: Artificial Fonts
    unformat: Diversions

    V
    vpt: Vertical Position Traps
    vs: Changing the Vertical Spacing

    W
    warn: Debugging
    warnscale: Debugging
    wh: Page Location Traps
    while: while
    write: I/O
    writec: I/O
    writem: I/O

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Requests-and-Macros.html b/doc/groff.html.node/Requests-and-Macros.html new file mode 100644 index 0000000..8a009b3 --- /dev/null +++ b/doc/groff.html.node/Requests-and-Macros.html @@ -0,0 +1,221 @@ + + + + + + +Requests and Macros (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.7 Requests and Macros

    + +

    We have now encountered almost all of the syntax there is in the +roff language, with an exception already noted in passing. + + + + + + +A request is an instruction to the formatter that occurs after a +control character, which is recognized at the beginning of an +input line. The regular control character is a dot (.). Its +counterpart, the no-break control character, a neutral apostrophe +('), suppresses the break that is implied by some requests. +These characters were chosen because it is uncommon for lines of text in +natural languages to begin with them. + + +If you require a formatted period or apostrophe (closing single +quotation mark) where GNU troff is expecting a control character, +prefix the dot or neutral apostrophe with the dummy character escape +sequence, ‘\&’. +

    + +

    An input line beginning with a control character is called a +control line. + +Every line of input that is not a control line is a text +line.25 +

    + +

    Requests often take arguments, words (separated from the request +name and each other by spaces) that specify details of the action GNU +troff is expected to perform. If a request is meaningless +without arguments, it is typically ignored. +

    +

    GNU troff’s requests and escape sequences comprise the control +language of the formatter. Of key importance are the requests that +define macros. Macros are invoked like requests, enabling the request +repertoire to be extended or overridden.26 +

    + + + +

    A macro can be thought of as an abbreviation you can define for a +collection of control and text lines. When the macro is called by +giving its name after a control character, it is replaced with what it +stands for. The process of textual replacement is known as +interpolation.27 Interpolations are handled as soon as they are +recognized, and once performed, a roff formatter scans the +replacement for further requests, macro calls, and escape sequences. +

    +

    In roff systems, the de request defines a +macro.28 +

    +
    +
    .de DATE
    +2020-11-14
    +..
    +
    + +

    The foregoing input produces no output by itself; all we have done is +store some information. Observe the pair of dots that ends the macro +definition. This is a default; you can specify your own terminator for +the macro definition as the second argument to the de request. +

    +
    +
    .de NAME ENDNAME
    +Heywood Jabuzzoff
    +.ENDNAME
    +
    + +

    In fact, the ending marker is itself the name of a macro to be +called, or a request to be invoked, if it is defined at the time its +control line is read. +

    +
    +
    .de END
    +Big Rip
    +..
    +.de START END
    +Big Bang
    +.END
    +.START
    +    ⇒ Big Rip Big Bang
    +
    + +

    In the foregoing example, “Big Rip” printed before “Big Bang” +because its macro was called first. Consider what would happen +if we dropped END from the ‘.de START’ line and added +.. after .END. Would the order change? +

    +

    Let us consider a more elaborate example. +

    +
    +
    .de DATE
    +2020-10-05
    +..
    +.
    +.de BOSS
    +D.\& Kruger,
    +J.\& Peterman
    +..
    +.
    +.de NOTICE
    +Approved:
    +.DATE
    +by
    +.BOSS
    +..
    +.
    +Insert tedious regulatory compliance paragraph here.
    +
    +.NOTICE
    +
    +Insert tedious liability disclaimer paragraph here.
    +
    +.NOTICE
    +    ⇒ Insert tedious regulatory compliance paragraph here.
    +    ⇒
    +    ⇒ Approved: 2020-10-05 by D. Kruger, J. Peterman
    +    ⇒
    +    ⇒ Insert tedious liability disclaimer paragraph here.
    +    ⇒
    +    ⇒ Approved: 2020-10-05 by D. Kruger, J. Peterman
    +
    + +

    The above document started with a series of control lines. Three macros +were defined, with a de request declaring each macro’s name, and +the “body” of the macro starting on the next line and continuing until +a line with two dots ‘..’ marked its end. The text proper +began only after the macros were defined; this is a common pattern. +Only the NOTICE macro was called “directly” by the document; +DATE and BOSS were called only by NOTICE itself. +Escape sequences were used in BOSS, two levels of macro +interpolation deep. +

    +

    The advantage in typing and maintenance economy may not be obvious from +such a short example, but imagine a much longer document with dozens of +such paragraphs, each requiring a notice of managerial approval. +Consider what must happen if you are in charge of generating a new +version of such a document with a different date, for a different boss. +With well-chosen macros, you only have to change each datum in one +place. +

    +

    In practice, we would probably use strings (see Strings) instead of +macros for such simple interpolations; what is important here is to +glimpse the potential of macros and the power of recursive +interpolation. +

    +

    We could have defined DATE and BOSS in the opposite order; +perhaps less obviously, we could also have defined them after +NOTICE. “Forward references” like this are acceptable because +the body of a macro definition is not (completely) interpreted, but +stored instead (see Copy Mode). While a macro is being defined (or +appended to), requests are not interpreted and macros not interpolated, +whereas some commonly used escape sequences are interpreted. +roff systems also support recursive macro calls, as long as you +have a way to break the recursion (see Conditionals and Loops). +Maintainable roff documents tend to arrange macro definitions to +minimize forward references. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Safer-Mode.html b/doc/groff.html.node/Safer-Mode.html new file mode 100644 index 0000000..eca3efd --- /dev/null +++ b/doc/groff.html.node/Safer-Mode.html @@ -0,0 +1,61 @@ + + + + + + +Safer Mode (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.38.1 Safer Mode

    + + + + + +

    The formatter operates in “safer” mode by default; to mitigate risks +from untrusted input documents, the pi and sy requests are +disabled. GNU troff’s -U option enables “unsafe +mode”, restoring their function and enabling additional groff +extension requests, open, opena, and pso. +See I/O. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Sections-and-Chapters.html b/doc/groff.html.node/Sections-and-Chapters.html new file mode 100644 index 0000000..b94de73 --- /dev/null +++ b/doc/groff.html.node/Sections-and-Chapters.html @@ -0,0 +1,56 @@ + + + + + + +Sections and Chapters (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.2 Sections and Chapters

    + +

    The simplest kind of section heading is unnumbered, set in a bold or +italic style, and occupies a line by itself. Others possess +automatically numbered multi-level headings and/or different typeface +styles or sizes at different levels. More sophisticated macro packages +supply macros for designating chapters and appendices. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Selecting-Fonts.html b/doc/groff.html.node/Selecting-Fonts.html new file mode 100644 index 0000000..d6a59e7 --- /dev/null +++ b/doc/groff.html.node/Selecting-Fonts.html @@ -0,0 +1,227 @@ + + + + + + +Selecting Fonts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.1 Selecting Fonts

    + + +

    We use font to refer to any of several means of identifying a +font: by mounting position (‘3’), by abstract style (‘B’), or +by its identifier (‘TB’). +

    +
    +
    Request: .ft [font]
    +
    +
    Escape sequence: \ff
    +
    +
    Escape sequence: \f(fn
    +
    Escape sequence: \f[font]
    +
    Register: \n[.fn]
    +
    + + + + + + + + + + + +

    The ft request selects the typeface font. If the argument +is absent or ‘P’, it selects the previously chosen font. If +font is a non-negative integer, it is interpreted as mounting +position; the font mounted there is selected. If that position refers +to an abstract style, it is combined with the default family (see +fam and \F below) to make a resolved font name. If the +mounting position is not a style and no font is mounted there, GNU +troff emits a warning in category ‘font’ and ignores the +request. +

    +

    If font matches a style name, it is combined with the current +family to make a resolved font name. Otherwise, font is assumed +to already be a resolved font name. +

    + + + +

    The resolved font name is subject to translation (see request ftr +below). Next, the (possibly translated) font name’s mounting position +is looked up; if not mounted, font is sought on the file system as +a font description file and, if located, automatically mounted at the +next available position (see register .fp below). If the font +was mounted using an identifier different from its font description file +name (see request fp below), that file name is then looked up. +If a font description file for the resolved font name is not found, GNU +troff emits a warning in category ‘font’ and ignores the +request. +

    +

    The \f escape sequence is similar, using one-character name (or +mounting position) f, two-character name fn, or a name +font of arbitrary length. + + +‘\f[]’ selects the previous font. The syntax form ‘\fP’ is +supported for backward compatibility, and ‘\f[P]’ for consistency. +

    +
    +
    eggs, bacon,
    +.ft I
    +spam,
    +.ft
    +and sausage.
    +.br
    +eggs, bacon, \fIspam,\fP and sausage.
    +    ⇒ eggs, bacon, spam, and sausage
    +    ⇒ eggs, bacon, spam, and sausage
    +
    + +

    The current and previously selected fonts are properties of the +environment (see Environments). +

    +

    The read-only string-valued register .fn contains the resolved +font name of the selected font. +

    +

    \f doesn’t produce an input token in GNU troff; it thus +can be used in requests that expect a single-character argument. We can +assign a font to a margin character as follows (see Miscellaneous). +

    +
    +
    .mc \f[I]x\f[]
    +
    +
    + +
    +
    Request: .ftr f [g]
    +
    + + + + + + + + + + + + + + +

    Translate font f to font g. Whenever a font +named f is referred to in a \f escape sequence, in the +F and S conditional operators, or in the ft, +ul, bd, cs, tkf, special, +fspecial, fp, or sty requests, font g is +used. If g is missing or equal to f the translation is +undone. +

    +

    Font translations cannot be chained. +

    +
    +
    .ftr XXX TR
    +.ftr XXX YYY
    +.ft XXX
    +    error→ warning: can't find font 'XXX'
    +
    +
    + +
    +
    Request: .fzoom f [zoom]
    +
    +
    Register: \n[.zoom]
    +
    + + + + + + + + +

    Set magnification of font f to factor zoom, which must +be a non-negative integer multiple of 1/1000th. This request is useful +to adjust the optical size of a font in relation to the others. In the +example below, font CR is magnified by 10% (the zoom factor is +thus 1.1). +

    +
    +
    .fam P
    +.fzoom CR 1100
    +.ps 12
    +Palatino and \f[CR]Courier\f[]
    +
    + +

    A missing or zero value of zoom is the same as a value of 1000, +which means no magnification. f must be a resolved font +name, not an abstract style. +

    +

    The magnification of a font is completely transparent to GNU +troff; a change of the zoom factor doesn’t cause any effect +except that the dimensions of glyphs, (word) spaces, kerns, etc., of the +affected font are adjusted accordingly. +

    +

    The zoom factor of the current font is available in the read-only +register ‘.zoom’, in multiples of 1/1000th. It returns zero if +there is no magnification. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Sentences.html b/doc/groff.html.node/Sentences.html new file mode 100644 index 0000000..47d7462 --- /dev/null +++ b/doc/groff.html.node/Sentences.html @@ -0,0 +1,174 @@ + + + + + + +Sentences (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.2 Sentences

    + + +

    A passionate debate has raged for decades among writers of the English +language over whether more space should appear between adjacent +sentences than between words within a sentence, and if so, how much, and +what other circumstances should influence this spacing.20 +GNU troff follows the example of AT&T troff; +it attempts to detect the boundaries between sentences, and supplies +additional inter-sentence space between them. +

    +
    +
    Hello, world!
    +Welcome to groff.
    +    ⇒ Hello, world!  Welcome to groff.
    +
    + + + + + +

    GNU troff flags certain characters (normally ‘!’, ‘?’, +and ‘.’) as potentially ending a sentence. When GNU troff +encounters one of these end-of-sentence characters at the end of +an input line, or one of them is followed by two (unescaped) spaces on +the same input line, it appends an inter-word space followed by an +inter-sentence space in the output. +

    +
    +
    R. Harper subscribes to a maxim of P. T. Barnum.
    +    ⇒ R. Harper subscribes to a maxim of P. T. Barnum.
    +
    + +

    In the above example, inter-sentence space is not added after ‘P.’ +or ‘T.’ because the periods do not occur at the end of an input +line, nor are they followed by two or more spaces. Let’s imagine that +we’ve heard something about defamation from Mr. Harper’s attorney, +recast the sentence, and reflowed it in our text editor. +

    +
    +
    I submit that R. Harper subscribes to a maxim of P. T.
    +Barnum.
    +    ⇒ I submit that R. Harper subscribes to a maxim of
    +    ⇒ P. T.  Barnum.
    +
    + +

    “Barnum” doesn’t begin a sentence! What to do? Let us meet our first +escape sequence, a series of input characters that give +instructions to GNU troff instead of being used to construct +output device glyphs.21 An escape sequence begins with the backslash character \ +by default, an uncommon character in natural language text, and is +always followed by at least one other character, hence the term +“sequence”. +

    + +

    The dummy character escape sequence \& can be used after an +end-of-sentence character to defeat end-of-sentence detection on a +per-instance basis. We can therefore rewrite our input more +defensively. +

    +
    +
    I submit that R.\& Harper subscribes to a maxim of P.\&
    +T.\& Barnum.
    +    ⇒ I submit that R. Harper subscribes to a maxim of
    +    ⇒ P. T. Barnum.
    +
    + +

    Adding text caused our input to wrap; now, we don’t need \& after +‘T.’ but we do after ‘P.’. Consistent use of the escape +sequence ensures that potential sentence boundaries are robust to +editing activities. Further advice along these lines will follow in +Input Conventions. +

    + + + + + + + + + + + + + +

    Normally, the occurrence of a visible non-end-of-sentence character (as +opposed to a space or tab) immediately after an end-of-sentence +character cancels detection of the end of a sentence. For example, it +would be incorrect for GNU troff to infer the end of a sentence +after the dot in ‘3.14159’. However, several characters are +treated transparently after the occurrence of an end-of-sentence +character. That is, GNU troff does not cancel end-of-sentence +detection when it processes them. This is because such characters are +often used as footnote markers or to close quotations and +parentheticals. The default set is ‘"’, ‘'’, ‘)’, +‘]’, ‘*’, \[dg], \[dd], \[rq], and +\[cq]. The last four are examples of special characters, +escape sequences whose purpose is to obtain glyphs that are not easily +typed at the keyboard, or which have special meaning to GNU troff +(like \ itself).22 +

    +
    +
    \[lq]The idea that the poor should have leisure has always
    +been shocking to the rich.\[rq]
    +(Bertrand Russell, 1935)
    +    ⇒ "The idea that the poor should have
    +    ⇒ leisure has always been shocking to
    +    ⇒ the rich."  (Bertrand Russell, 1935)
    +
    + +

    The sets of characters that potentially end sentences or are transparent +to sentence endings are configurable. See the cflags request in +Using Symbols. To change the additional inter-sentence space +amount—even to remove it entirely—see Manipulating Filling and Adjustment. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Separation.html b/doc/groff.html.node/Separation.html new file mode 100644 index 0000000..d7dfe3e --- /dev/null +++ b/doc/groff.html.node/Separation.html @@ -0,0 +1,94 @@ + + + + + + +Separation (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.1.1 Separation

    + +

    AT&T troff output has strange requirements regarding +whitespace. The gtroff output parser, however, is more tolerant, +making whitespace maximally optional. Such characters, i.e., the tab, +space, and newline, always have a syntactical meaning. They are never +printable because spacing within the output is always done by +positioning commands. +

    +

    Any sequence of space or tab characters is treated as a single +syntactical space. It separates commands and arguments, but is +only required when there would occur a clashing between the command code +and the arguments without the space. Most often, this happens when +variable-length command names, arguments, argument lists, or command +clusters meet. Commands and arguments with a known, fixed length need +not be separated by syntactical space. +

    +

    A line break is a syntactical element, too. Every command argument can +be followed by whitespace, a comment, or a newline character. Thus a +syntactical line break is defined to consist of optional +syntactical space that is optionally followed by a comment, and a +newline character. +

    +

    The normal commands, those for positioning and text, consist of a single +letter taking a fixed number of arguments. For historical reasons, the +parser allows stacking of such commands on the same line, but +fortunately, in gtroff’s intermediate output, every command with +at least one argument is followed by a line break, thus providing +excellent readability. +

    +

    The other commands—those for drawing and device controlling—have a +more complicated structure; some recognize long command names, and some +take a variable number of arguments. So all ‘D’ and ‘x’ +commands were designed to request a syntactical line break after their +last argument. Only one command, ‘x X, has an argument that +can span several input lines; all other commands must have all of +their arguments on the same line as the command, i.e., the arguments may +not be split by a line break. +

    +

    Empty lines (these are lines containing only space and/or a comment), +can occur everywhere. They are just ignored. +

    +
    +
    + + + + + + diff --git a/doc/groff.html.node/Setting-Registers.html b/doc/groff.html.node/Setting-Registers.html new file mode 100644 index 0000000..6fdf746 --- /dev/null +++ b/doc/groff.html.node/Setting-Registers.html @@ -0,0 +1,215 @@ + + + + + + +Setting Registers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.8.1 Setting Registers

    + + + +

    Define registers and update their values with the nr request or +the \R escape sequence. +

    +
    +
    Request: .nr ident value
    +
    +
    Escape sequence: \R'ident value'
    +
    +

    Set register ident to value. If ident doesn’t exist, +GNU troff creates it. In the \R escape sequence, the +delimiter need not be a neutral apostrophe; see Delimiters. It +also does not produce an input token in GNU troff. See gtroff Internals. +

    +
    +
    .nr a (((17 + (3 * 4))) % 4)
    +\n[a]
    +.\R'a (((17 + (3 * 4))) % 4)'
    +\n[a]
    +    ⇒ 1 1
    +
    + +

    (Later, we will discuss additional forms of nr and \R that +can change a register’s value after it is dereferenced but before it is +interpolated. See Auto-increment.) +

    +

    The complete transparency of \R can cause surprising effects if +you use registers like .k, which get evaluated at the time they +are accessed. +

    +
    +
    .ll 1.6i
    +.
    +aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]'
    +.tm :k == \n[:k]
    +    ⇒ :k == 126950
    +.
    +.br
    +.
    +aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]'
    +.tm :k == \n[:k]
    +    ⇒ :k == 15000
    +
    + +

    If you process this with the PostScript device (-Tps), there will +be a line break eventually after ggg in both input lines. +However, after processing the space after ggg, the partially +collected line is not overfull yet, so GNU troff continues to +collect input until it sees the space (or in this case, the newline) +after hhh. At this point, the line is longer than the line +length, and the line gets broken. +

    +

    In the first input line, since the \R escape sequence leaves no +traces, the check for the overfull line hasn’t been done yet at the +point where \R gets handled, and you get a value for the +.k register that is even greater than the current line length. +

    +

    In the second input line, the insertion of \h'0' to cause a +zero-width motion forces GNU troff to check the line length, +which in turn causes the start of a new output line. Now .k +returns the expected value. +

    + +

    nr and \R each have two additional special forms to +increment or decrement a register. +

    +
    +
    Request: .nr ident +value
    +
    +
    Request: .nr ident -value
    +
    Escape sequence: \R'ident +value'
    +
    +
    Escape sequence: \R'ident -value'
    +

    Increment (decrement) register ident by value. In the +\R escape sequence, the delimiter need not be a neutral +apostrophe; see Delimiters. +

    +
    +
    .nr a 1
    +.nr a +1
    +\na
    +    ⇒ 2
    +
    + + +

    A leading minus sign in value is always interpreted as a +decrementation operator, not an algebraic sign. To assign a register a +negative value or the negated value of another register, you can +force GNU troff to interpret ‘-’ as a negation or minus, +rather than decrementation, operator: enclose it with its operand in +parentheses or subtract it from zero. +

    +
    +
    .nr a 7
    +.nr b 3
    +.nr a -\nb
    +\na
    +    ⇒ 4
    +.nr a (-\nb)
    +\na
    +    ⇒ -3
    +.nr a 0-\nb
    +\na
    +    ⇒ -3
    +
    + +

    If a register’s prior value does not exist (the register was undefined), +an increment or decrement is applied as if to 0. +

    + +
    +
    Request: .rr ident
    +
    + + +

    Remove register ident. If ident doesn’t exist, the request +is ignored. Technically, only the name is removed; the register’s +contents are still accessible under aliases created with aln, if +any. +

    + +
    +
    Request: .rnn ident1 ident2
    +
    + + +

    Rename register ident1 to ident2. If ident1 doesn’t +exist, the request is ignored. Renaming a built-in register does not +otherwise alter its properties. +

    + +
    +
    Request: .aln new old
    +
    + + + +

    Create an alias new for an existing register old, causing +the names to refer to the same stored object. If old is +undefined, a warning in category ‘reg’ is produced and the request +is ignored. See Warnings, for information about the enablement and +suppression of warnings. +

    + + + +

    To remove a register alias, invoke rr on its name. A register’s +contents do not become inaccessible until it has no more names. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Simple-Commands.html b/doc/groff.html.node/Simple-Commands.html new file mode 100644 index 0000000..b76b0a6 --- /dev/null +++ b/doc/groff.html.node/Simple-Commands.html @@ -0,0 +1,207 @@ + + + + + + +Simple Commands (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1.2.2 Simple Commands

    + +

    The commands in this subsection have a command code consisting of a +single character, taking a fixed number of arguments. Most of them are +commands for positioning and text writing. These commands are tolerant +of whitespace. Optionally, syntactical space can be inserted before, +after, and between the command letter and its arguments. All of these +commands are stackable; i.e., they can be preceded by other simple +commands or followed by arbitrary other commands on the same line. A +separating syntactical space is necessary only when two integer +arguments would clash or if the preceding argument ends with a string +argument. +

    +
    +
    C idwhitespace
    +

    Typeset the glyph of the special character id. Trailing +syntactical space is necessary to allow special character names of +arbitrary length. The drawing position is not advanced. +

    +
    +
    c g
    +

    Typeset the glyph of the ordinary character c. The drawing +position is not advanced. +

    +
    +
    f n
    +

    Select the font mounted at position n. n cannot +be negative. +

    +
    +
    H n
    +

    Horizontally move the drawing position to n basic units from +the left edge of the page. n cannot be negative. +

    +
    +
    h n
    +

    Move the drawing position right n basic units. AT&T +troff allowed negative n; GNU troff does not produce +such values, but groff’s output driver library handles them. +

    +
    +
    m color-scheme [component]
    +

    Select the stroke color using the components in the color space +scheme. Each component is an integer between 0 and 65535. +The quantity of components and their meanings vary with each +scheme. This command is a groff extension. +

    +
    +
    mc cyan magenta yellow
    +

    Use the CMY color scheme with components cyan, magenta, and yellow. +

    +
    +
    md
    +

    Use the default color (no components; black in most cases). +

    +
    +
    mg gray
    +

    Use a grayscale color scheme with a component ranging between 0 (black) +and 65535 (white). +

    +
    +
    mk cyan magenta yellow black
    +

    Use the CMYK color scheme with components cyan, magenta, yellow, and +black. +

    +
    +
    mr red green blue
    +

    Use the RGB color scheme with components red, green, and blue. +

    +
    + +
    +
    N n
    +

    Typeset the glyph with index n in the current font. +n is normally a non-negative integer. The drawing position +is not advanced. The html and xhtml devices use this +command with negative n to produce unbreakable space; the +absolute value of n is taken and interpreted in basic units. +

    +
    +
    n b a
    +

    Indicate a break. No action is performed; the command is present to +make the output more easily parsed. The integers b +and a describe the vertical space amounts before and after +the break, respectively. GNU troff issues this command but +groff’s output driver library ignores it. See v and +V below. +

    +
    +
    p n
    +

    Begin a new page, setting its number to n. Each page is +independent, even from those using the same number. The vertical +drawing position is set to 0. All positioning, writing, and +drawing commands are interpreted in the context of a page, so a +p command must precede them. +

    +
    +
    s n
    +

    Set type size to n scaled points (unit z in GNU +troff. +AT&T troff used unscaled points p instead; +see Output Language Compatibility. +

    +
    +
    t xyzwhitespace
    +
    t xyz dummy-argwhitespace
    +

    Typeset a word xyz; that is, set a sequence of ordinary glyphs +named x, y, z, …, terminated by a space +character or a line break; an optional second integer argument is +ignored (this allows the formatter to generate an even number of +arguments). Each glyph is set at the current drawing position, and the position is +then advanced horizontally by the glyph’s width. A glyph’s width is +read from its metrics in the font description file, scaled to the +current type size, and rounded to a multiple of the horizontal motion +quantum. Use the C command to emplace glyphs of special +characters. The t command is a groff extension and +is output only for devices whose DESC file contains the +tcommand directive; see DESC File Format. +

    +
    +
    u n xyzwhitespace
    +

    Typeset word xyz with track kerning. As t, but after +placing each glyph, the drawing position is further advanced +horizontally by n basic units (u). The +u command is a groff extension and is output only for +devices whose DESC file contains the tcommand directive; +see DESC File Format. +

    +
    +
    V n
    +

    Vertically move the drawing position to n basic units from +the top edge of the page. n cannot be negative. +

    +
    +
    v n
    +

    Move the drawing position down n basic units. AT&T +troff allowed negative n; GNU troff does not produce +such values, but groff’s output driver library handles them. +

    +
    +
    w
    +

    Indicate an inter-word space. No action is performed; the command is +present to make the output more easily parsed. Only adjustable, +breakable inter-word spaces are thus described; those resulting from +\~ or horizontal motion escape sequences are not. GNU +troff issues this command but groff’s output driver +library ignores it. See h and H above. +

    +
    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Special-Fonts.html b/doc/groff.html.node/Special-Fonts.html new file mode 100644 index 0000000..214c74e --- /dev/null +++ b/doc/groff.html.node/Special-Fonts.html @@ -0,0 +1,93 @@ + + + + + + +Special Fonts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.6 Special Fonts

    + + + +

    Special fonts are those that gtroff searches when it cannot find +the requested glyph in the current font. The Symbol font is usually a +special font. +

    +

    gtroff provides the following two requests to add more special +fonts. See Using Symbols, for a detailed description of the glyph +searching mechanism in gtroff. +

    +

    Usually, only non-TTY devices have special fonts. +

    +
    +
    Request: .special [s1 s2 …]
    +
    +
    Request: .fspecial f [s1 s2 …]
    +
    + + +

    Use the special request to define special fonts. Initially, this +list is empty. +

    +

    Use the fspecial request to designate special fonts only when +font f is active. Initially, this list is empty. +

    +

    Previous calls to special or fspecial are overwritten; +without arguments, the particular list of special fonts is set to empty. +Special fonts are searched in the order they appear as arguments. +

    +

    All fonts that appear in a call to special or fspecial +are loaded. +

    +

    See Using Symbols, for the exact search order of glyphs. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/String-Index.html b/doc/groff.html.node/String-Index.html new file mode 100644 index 0000000..335d2b8 --- /dev/null +++ b/doc/groff.html.node/String-Index.html @@ -0,0 +1,344 @@ + + + + + + +String Index (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    Appendix G String Index

    + +

    The macro package or program a that defines or uses each string is +appended in brackets. (Only one string, .T, is defined by the +troff formatter itself.) See Strings. +

    + +
    +
    Jump to:   ! +   +' +   +* +   +, +   +- +   +. +   +/ +   +3 +   +8 +   +: +   +< +   +> +   +? +   +^ +   +_ +   +` +   +{ +   +} +   +~ +   +
    +A +   +C +   +D +   +F +   +L +   +M +   +O +   +Q +   +R +   +S +   +T +   +U +   +V +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    !
    ! [ms]: ms Legacy Features

    '
    ' [ms]: ms Legacy Features
    ' [ms]: ms Legacy Features

    *
    * [ms]: ms Footnotes

    ,
    , [ms]: ms Legacy Features
    , [ms]: ms Legacy Features

    -
    - [ms]: Typographical symbols in ms

    .
    . [ms]: ms Legacy Features
    .T: Strings
    .T: Strings

    /
    / [ms]: ms Legacy Features

    3
    3 [ms]: ms Legacy Features

    8
    8 [ms]: ms Legacy Features

    :
    : [ms]: ms Legacy Features
    : [ms]: ms Legacy Features

    <
    < [ms]: Typeface and decoration

    >
    > [ms]: Typeface and decoration

    ?
    ? [ms]: ms Legacy Features

    ^
    ^ [ms]: ms Legacy Features
    ^ [ms]: ms Legacy Features

    _
    _ [ms]: ms Legacy Features

    `
    ` [ms]: ms Legacy Features
    ` [ms]: ms Legacy Features

    {
    { [ms]: Typeface and decoration

    }
    } [ms]: Typeface and decoration

    ~
    ~ [ms]: ms Legacy Features
    ~ [ms]: ms Legacy Features

    A
    ABSTRACT [ms]: ms language and localization
    ae [ms]: ms Legacy Features
    Ae [ms]: ms Legacy Features

    C
    C [ms]: ms Legacy Features
    CF [ms]: ms Document Control Settings
    CH [ms]: ms Document Control Settings

    D
    d- [ms]: ms Legacy Features
    D- [ms]: ms Legacy Features

    F
    FAM [ms]: ms Document Control Settings
    FR [ms]: ms Document Control Settings

    L
    LF [ms]: ms Document Control Settings
    LH [ms]: ms Document Control Settings

    M
    MONTH1 [ms]: ms language and localization
    MONTH10 [ms]: ms language and localization
    MONTH11 [ms]: ms language and localization
    MONTH12 [ms]: ms language and localization
    MONTH2 [ms]: ms language and localization
    MONTH3 [ms]: ms language and localization
    MONTH4 [ms]: ms language and localization
    MONTH5 [ms]: ms language and localization
    MONTH6 [ms]: ms language and localization
    MONTH7 [ms]: ms language and localization
    MONTH8 [ms]: ms language and localization
    MONTH9 [ms]: ms language and localization

    O
    o [ms]: ms Legacy Features
    oe [ms]: ms Legacy Features
    OE [ms]: ms Legacy Features

    Q
    Q [ms]: Typographical symbols in ms
    q [ms]: ms Legacy Features

    R
    REFERENCES [ms]: ms language and localization
    RF [ms]: ms Document Control Settings
    RH [ms]: ms Document Control Settings

    S
    SN [ms]: Headings in ms
    SN-DOT [ms]: Headings in ms
    SN-NO-DOT [ms]: Headings in ms
    SN-STYLE [ms]: ms Document Control Settings
    SN-STYLE [ms]: Headings in ms

    T
    th [ms]: ms Legacy Features
    Th [ms]: ms Legacy Features
    TOC [ms]: ms language and localization

    U
    U [ms]: Typographical symbols in ms

    V
    v [ms]: ms Legacy Features

    + +
    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Strings.html b/doc/groff.html.node/Strings.html new file mode 100644 index 0000000..726e0b0 --- /dev/null +++ b/doc/groff.html.node/Strings.html @@ -0,0 +1,429 @@ + + + + + + +Strings (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.22 Strings

    + + +

    GNU troff supports strings primarily for user convenience. +Conventionally, if one would define a macro only to interpolate a small +amount of text, without invoking requests or calling any other macros, +one defines a string instead. Only one string is predefined by the +language. +

    +
    +
    String: \*[.T]
    +
    + + +

    Contains the name of the output device (for example, ‘utf8’ or +‘pdf’). +

    + +

    The ds request creates a string with a specified name and +contents and the \* escape sequence dereferences its name, +interpolating its contents. If the string named by the \* escape +sequence does not exist, it is defined as empty, nothing is +interpolated, and a warning in category ‘mac’ is emitted. +See Warnings, for information about the enablement and suppression of +warnings. +

    +
    +
    Request: .ds name [contents]
    +
    +
    Request: .ds1 name [contents]
    +
    +
    Escape sequence: \*n
    +
    +
    Escape sequence: \*(nm
    +
    Escape sequence: \*[name [arg1 arg2 …]]
    +
    + + + + + +

    Define a string called name with contents contents. If +name already exists as an alias, the target of the alias is +redefined; see als and rm below. If ds is called +with only one argument, name is defined as an empty string. +Otherwise, GNU troff stores contents in copy +mode.87 +

    +

    The \* escape sequence interpolates a previously defined string +variable name (one-character name n, two-character name +nm). The bracketed interpolation form accepts arguments that are +handled as macro arguments are; recall Calling Macros. In +contrast to macro calls, however, if a closing bracket ‘]’ occurs +in a string argument, that argument must be enclosed in double quotes. +\* is interpreted even in copy mode. When defining strings, +argument interpolations must be escaped if they are to reference +parameters from the calling context; See Parameters. +

    +
    +
    .ds cite (\\$1, \\$2)
    +Gray codes are explored in \*[cite Morgan 1998].
    +    ⇒ Gray codes are explored in (Morgan, 1998).
    +
    + + + + + +

    Caution: Unlike other requests, the second argument to the +ds request consumes the remainder of the input line, including +trailing spaces. This means that comments on a line with such a request +can introduce unwanted space into a string when they are set off from +the material they annotate, as is conventional. +

    +
    +
    .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water
    +
    + +

    Instead, place the comment on another line or put the comment escape +sequence immediately adjacent to the last character of the string. +

    +
    +
    .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water
    +
    + +

    Ending string definitions (and appendments) with a comment, even an +empty one, prevents unwanted space from creeping into them during source +document maintenance. +

    +
    +
    .ds author Alice Pleasance Liddell\"
    +.ds empty \" might be appended to later with .as
    +
    + + + + + + + +

    An initial neutral double quote " in contents is stripped +to allow embedding of leading spaces. Any other " is interpreted +literally, but it is wise to use the special character escape sequence +\[dq] instead if the string might be interpolated as part of a +macro argument; see Calling Macros. +

    +
    +
    .ds salutation "         Yours in a white wine sauce,\"
    +.ds c-var-defn "  char mydate[]=\[dq]2020-07-29\[dq];\"
    +
    + + + + + +

    Strings are not limited to a single input line of text. +\RET works just as it does elsewhere. The resulting string +is stored without the newlines. Care is therefore required when +interpolating strings while filling is disabled. +

    +
    +
    .ds foo This string contains \
    +text on multiple lines \
    +of input.
    +
    + +

    It is not possible to embed a newline in a string that will be +interpreted as such when the string is interpolated. To achieve that +effect, use \* to interpolate a macro instead; see Punning Names. +

    +

    Because strings are similar to macros, they too can be defined so as to +suppress AT&T troff compatibility mode when used; see +Writing Macros and Compatibility Mode. The ds1 +request defines a string such that compatibility mode is off when the +string is later interpolated. To be more precise, a compatibility +save input token is inserted at the beginning of the string, and a +compatibility restore input token at the end. +

    +
    +
    .nr xxx 12345
    +.ds aa The value of xxx is \\n[xxx].
    +.ds1 bb The value of xxx is \\n[xxx].
    +.
    +.cp 1
    +.
    +\*(aa
    +    error→ warning: register '[' not defined
    +    ⇒ The value of xxx is 0xxx].
    +\*(bb
    +    ⇒ The value of xxx is 12345.
    +
    +
    + +
    +
    Request: .as name [contents]
    +
    +
    Request: .as1 name [contents]
    +
    + + +

    The as request is similar to ds but appends contents +to the string stored as name instead of redefining it. If +name doesn’t exist yet, it is created. If as is called +with only one argument, no operation is performed (beyond dereferencing +the string). +

    +
    +
    .as salutation " with shallots, onions and garlic,\"
    +
    + +

    The as1 request is similar to as, but compatibility mode +is switched off when the appended portion of the string is later +interpolated. To be more precise, a compatibility save input +token is inserted at the beginning of the appended string, and a +compatibility restore input token at the end. +

    + +

    Several requests exist to perform rudimentary string operations. +Strings can be queried (length) and modified (chop, +substring, stringup, stringdown), and their names +can be manipulated through renaming, removal, and aliasing (rn, +rm, als). +

    +
    +
    Request: .length reg anything
    +
    + + + + + +

    Compute the number of characters of anything and store the count +in the register reg. If reg doesn’t exist, it is created. +anything is read in copy mode. +

    +
    +
    .ds xxx abcd\h'3i'efgh
    +.length yyy \*[xxx]
    +\n[yyy]
    +    ⇒ 14
    +
    +
    + +
    +
    Request: .chop object
    +
    +

    Remove the last character from the macro, string, or diversion named +object. This is useful for removing the newline from the end of a +diversion that is to be interpolated as a string. This request can be +used repeatedly on the same object; see gtroff Internals, +for details on nodes inserted additionally by GNU troff. +

    + +
    +
    Request: .substring str start [end]
    +
    + +

    Replace the string named str with its substring bounded by the +indices start and end, inclusively. The first character in +the string has index 0. If end is omitted, it is implicitly +set to the largest valid value (the string length minus one). Negative +indices count backward from the end of the string: the last character +has index −1, the character before the last has +index −2, and so on. +

    +
    +
    .ds xxx abcdefgh
    +.substring xxx 1 -4
    +\*[xxx]
    +    ⇒ bcde
    +.substring xxx 2
    +\*[xxx]
    +    ⇒ de
    +
    +
    + +
    +
    Request: .stringdown str
    +
    +
    Request: .stringup str
    +
    + + + + + +

    Alter the string named str by replacing each of its bytes with its +lowercase (stringdown) or uppercase (stringup) version (if +one exists). Special characters in the string will often transform in +the expected way due to the regular naming convention for accented +characters. When they do not, use substrings and/or catenation. +

    +
    +
    .ds resume R\['e]sum\['e]
    +\*[resume]
    +.stringdown resume
    +\*[resume]
    +.stringup resume
    +\*[resume]
    +    ⇒ Résumé résumé RÉSUMÉ
    +
    +
    + +

    (In practice, we would end the ds request with a comment escape +\" to prevent space from creeping into the definition during +source document maintenance.) +

    +
    +
    Request: .rn old new
    +
    + + + + + + + + +

    Rename the request, macro, diversion, or string old to new. +

    + +
    +
    Request: .rm name
    +
    + + + + + + + + +

    Remove the request, macro, diversion, or string name. GNU +troff treats subsequent invocations as if the name had never +been defined. +

    + +
    +
    Request: .als new old
    +
    + + + + + + + + + +

    Create an alias new for the existing request, string, macro, or +diversion object named old, causing the names to refer to the same +stored object. If old is undefined, a warning in category +‘mac’ is produced, and the request is ignored. See Warnings, +for information about the enablement and suppression of warnings. +

    +

    To understand how the als request works, consider two different +storage pools: one for objects (macros, strings, etc.), and another +for names. As soon as an object is defined, GNU troff adds it to +the object pool, adds its name to the name pool, and creates a link +between them. When als creates an alias, it adds a new name to +the name pool that gets linked to the same object as the old name. +

    +

    Now consider this example. +

    +
    +
    .de foo
    +..
    +.
    +.als bar foo
    +.
    +.de bar
    +.  foo
    +..
    +.
    +.bar
    +    error→ input stack limit exceeded (probable infinite
    +    error→ loop)
    +
    + +

    In the above, bar remains an alias—another name +for—the object referred to by foo, which the second de +request replaces. Alternatively, imagine that the de request +dereferences its argument before replacing it. Either way, the +result of calling bar is a recursive loop that finally leads to +an error. See Writing Macros. +

    + + + + + + + + + +

    To remove an alias, call rm on its name. The object itself is +not destroyed until it has no more names. +

    +

    When a request, macro, string, or diversion is aliased, redefinitions +and appendments “write through” alias names. To replace an alias with +a separately defined object, you must use the rm request on its +name first. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Suppressing-Output.html b/doc/groff.html.node/Suppressing-Output.html new file mode 100644 index 0000000..bd32161 --- /dev/null +++ b/doc/groff.html.node/Suppressing-Output.html @@ -0,0 +1,147 @@ + + + + + + +Suppressing Output (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.32 Suppressing Output

    + +
    +
    Escape sequence: \O[num]
    +
    + + +

    Suppress GNU troff output of glyphs and geometric objects. The +sequences \O2, \O3, \O4, and \O5 are +intended for internal use by grohtml. +

    +
    +
    \O0
    +

    Disable the emission of glyphs and geometric objects to the output +driver, provided that this sequence occurs at the outermost suppression +level (see \O3 and \04 below). Horizontal motions +corresponding to non-overstruck glyph widths still occur. +

    +
    +
    \O1
    +

    Enable the emission of glyphs and geometric objects to the output +driver, provided that this sequence occurs at the outermost suppression +level. +

    +
    + + + + + +

    \O0 and \O1 also reset the four registers opminx, +opminy, opmaxx, and opmaxy to −1. These +four registers mark the top left and bottom right hand corners of a box +encompassing all written or drawn output. +

    +
    +
    \O2
    +

    At the outermost suppression level, enable emission of glyphs and +geometric objects, and write to the standard error stream the page +number and values of the four aforementioned registers encompassing +glyphs written since the last interpolation of a \O sequence, as +well as the page offset, line length, image file name (if any), +horizontal and vertical device motion quanta, and input file name. +Numeric values are in basic units. +

    +
    +
    \O3
    +

    Begin a nested suppression level. grohtml uses this mechanism +to create images of output preprocessed with gpic, +geqn, and gtbl. At startup, GNU troff is at +the outermost suppression level. pre-grohtml generates these +sequences when processing the document, using GNU troff with +the ps output device, Ghostscript, and the PNM tools to produce +images in PNG format. They start a new page if the device is not +html or xhtml, to reduce the number of images crossing a +page boundary. +

    +
    +
    \O4
    +

    End a nested suppression level. +

    +
    + +
    +
    \O[5Pfile]
    +

    At the outermost suppression level, write the name file to the +standard error stream at position P, which must be one of +l, r, c, or i, corresponding to left, +right, centered, and inline alignments within the document, +respectively. file is a name associated with the production of +the next image. +

    +
    +
    + +
    +
    Register: \n[.O]
    +
    + + + +

    Output suppression nesting level applied by \O3 and \O4 +escape sequences. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Tab-Stops-in-ms.html b/doc/groff.html.node/Tab-Stops-in-ms.html new file mode 100644 index 0000000..3302ce5 --- /dev/null +++ b/doc/groff.html.node/Tab-Stops-in-ms.html @@ -0,0 +1,67 @@ + + + + + + +Tab Stops in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6.2 Tab stops

    + +

    Use the ta request to define tab stops as needed. See Tabs and Fields. +

    +
    +
    Macro: .TA
    +
    +

    Reset the tab stops to the ms default (every 5 ens). +Redefine this macro to create a different set of default tab stops. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Table-of-Contents.html b/doc/groff.html.node/Table-of-Contents.html new file mode 100644 index 0000000..4d169cd --- /dev/null +++ b/doc/groff.html.node/Table-of-Contents.html @@ -0,0 +1,71 @@ + + + + + + +Table of Contents (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3.2.7 Table of Contents

    + + + +

    A package may handle a table of contents by directing section +heading macros to save section heading text and the page number where it +occurs for use in a later entry for a table of contents. It +writes the collected entries at the end of the document, once all are +known, upon request. A row of dots (a leader) bridges the +text on the left with its location on the right. Other collections +might work in this manner, providing lists of figures or tables. +

    +

    A table of contents is often found at the end of a GNU troff +document because the formatter processes the document in a single pass. +The gropdf output driver supports a PDF feature that relocates +pages at the time the document is rendered; see the gropdf(1) +man page. Type ‘man gropdf’ at the command line to view it. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Tabs-and-Fields.html b/doc/groff.html.node/Tabs-and-Fields.html new file mode 100644 index 0000000..83c156e --- /dev/null +++ b/doc/groff.html.node/Tabs-and-Fields.html @@ -0,0 +1,276 @@ + + + + + + +Tabs and Fields (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.12 Tabs and Fields

    + + + + +

    A tab character (ISO code point 9, EBCDIC +code point 5) causes a horizontal movement to the next tab stop, if +any. +

    +
    +
    Escape sequence: \t
    +
    + + + + + +

    Interpolate a tab in copy mode; see Copy Mode. +

    + +
    +
    Request: .ta [[n1 n2nn ]T r1 r2rn]
    +
    +
    Register: \n[.tabs]
    +
    +

    Change tab stop positions. This request takes a series of tab +specifiers as arguments (optionally divided into two groups with the +letter ‘T’) that indicate where each tab stop is to be, overriding +any previous settings. The default scaling unit is ‘m’. Invoking +ta without an argument removes all tab stops. + + +GNU troff’s startup value is ‘T 0.5i. +

    +

    Tab stops can be specified absolutely—as distances from the left +margin. The following example sets six tab stops, one every inch. +

    +
    +
    .ta 1i 2i 3i 4i 5i 6i
    +
    + +

    Tab stops can also be specified using a leading ‘+’, which means +that the specified tab stop is set relative to the previous tab stop. +For example, the following is equivalent to the previous example. +

    +
    +
    .ta 1i +1i +1i +1i +1i +1i
    +
    + +

    GNU troff supports an extended syntax to specify repeating tab +stops. These stops appear after a ‘T’ argument. Their values are +always taken as distances relative to the previous tab stop. This is +the idiomatic way to specify tab stops at equal intervals in +groff. The following is, yet again, the same as the previous +examples. It does more, in fact, since it defines an infinite number of +tab stops at one-inch intervals. +

    +
    +
    .ta T 1i
    +
    + +

    Now we are ready to interpret the full syntax given above. The +ta request sets tabs at positions n1, n2, …, +nn, then at nn+r1, nn+r2, …, +nn+rn, then at nn+rn+r1, +nn+rn+r2, …, nn+rn+rn, and so +on. +

    +

    For example, ‘4c +6c T 3c 5c 2c’ is equivalent to ‘4c 10c 13c +18c 20c 23c 28c 30c …’. +

    +

    Text written to a tab column (i.e., between two tab stops, or between a +tab stop and an output line boundary) may be aligned to the right or +left, or centered in the column. This alignment is determined by +appending ‘R’, ‘L’, or ‘C’ to the tab specifier. The +default is ‘L’. +

    +
    +
    .ta 1i 2iC 3iR
    +
    + +

    The beginning of an output line is not a tab stop; the text that begins +an output line is placed according to the configured alignment and +indentation; see Manipulating Filling and Adjustment and Line Layout. +

    +

    A tab stop is converted into a non-breakable horizontal movement that +cannot be adjusted. +

    +
    +
    .ll 2i
    +.ds foo a\tb\tc
    +.ta T 1i
    +\*[foo]
    +    error→ warning: cannot break line
    +    ⇒ a         b         c
    +
    + +

    The above creates a single output line that is a bit longer than two +inches (we use a string to show exactly where the tab stops are). +Now consider the following. +

    +
    +
    .ll 2i
    +.ds bar a\tb c\td
    +.ta T 1i
    +\*[bar]
    +    error→ warning: cannot adjust line
    +    ⇒ a         b
    +    ⇒ c       d
    +
    + +

    GNU troff first converts the line’s tab stops into unbreakable +horizontal movements, then breaks after ‘b’. This usually isn’t +what you want. +

    +

    Superfluous tab characters—those that do not correspond to a tab +stop—are ignored except for the first, which delimits the characters +belonging to the last tab stop for right-alignment or centering. +

    +
    +
    .ds Z   foo\tbar\tbaz
    +.ds ZZ  foo\tbar\tbazqux
    +.ds ZZZ foo\tbar\tbaz\tqux
    +.ta 2i 4iR
    +\*[Z]
    +.br
    +\*[ZZ]
    +.br
    +\*[ZZZ]
    +.br
    +    ⇒ foo                 bar              baz
    +    ⇒ foo                 bar           bazqux
    +    ⇒ foo                 bar              bazqux
    +
    + +

    The first line right-aligns “baz” within the second tab stop. The +second line right-aligns “bazqux” within it. The third line +right-aligns only “baz” because of the additional tab character, which +marks the end of the text occupying the last tab stop defined. +

    +

    Tab stops are associated with the environment (see Environments). +

    + + + +

    The read-only register .tabs contains a string +representation of the current tab settings suitable for use as an +argument to the ta request.66 +

    +
    +
    .ds tab-string \n[.tabs]
    +\*[tab-string]
    +    ⇒ T120u
    +
    +
    + +
    +
    Request: .tc [c]
    +
    + + + +

    Set the tab repetition character to the ordinary or special character +c; normally, no glyph is written when moving to a tab stop (and +some output devices may output space characters to achieve this motion). +A tab repetition character causes the formatter to write as many +instances of c as are necessary to occupy the interval from the +horizontal drawing position to the next tab stop. With no argument, GNU +troff reverts to the default behavior. The tab repetition +character is associated with the environment (see Environments). +Only a single character of c is recognized; any excess is ignored. +

    + +
    +
    Request: .linetabs n
    +
    +
    Register: \n[.linetabs]
    +
    + + + +

    If n is missing or non-zero, activate line-tabs; deactivate +it otherwise (the default). Active line-tabs cause GNU troff +to compute tab distances relative to the start of the output line +instead of the input line. +

    +
    +
    .de Tabs
    +.  ds x a\t\c
    +.  ds y b\t\c
    +.  ds z c
    +.  ta 1i 3i
    +\\*x
    +\\*y
    +\\*z
    +..
    +.Tabs
    +.br
    +.linetabs
    +.Tabs
    +    ⇒ a         b         c
    +    ⇒ a         b                   c
    +
    + +

    Line-tabs activation is associated with the environment +(see Environments). The read-only register .linetabs +interpolates 1 if line-tabs are active, and 0 otherwise. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Tabs-and-Leaders.html b/doc/groff.html.node/Tabs-and-Leaders.html new file mode 100644 index 0000000..c8298a1 --- /dev/null +++ b/doc/groff.html.node/Tabs-and-Leaders.html @@ -0,0 +1,87 @@ + + + + + + +Tabs and Leaders (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1.6 Tabs and Leaders

    + + + + + + + + +

    GNU troff translates input horizontal tab characters (“tabs”) +and Control+A characters (“leaders”) into movements to the next +tab stop. Tabs simply move to the next tab stop; leaders place enough +periods to fill the space. Tab stops are by default located every half +inch measured from the drawing position corresponding to the beginning +of the input line; see Page Geometry. Tabs and leaders do not +cause breaks and therefore do not interrupt filling. Below, we use +arrows → and bullets • to indicate input tabs and +leaders, respectively. +

    +
    +
    1
    +→ 2 → 3 • 4
    +→ • 5
    +⇒ 1         2       3.......4         ........5
    +
    + +

    Tabs and leaders lend themselves to table construction.24 The tab and leader glyphs can be +configured, and further facilities for sophisticated table composition +are available; see Tabs and Fields. There are many details to +track when using such low-level features, so most users turn to the +tbl(1) preprocessor to lay out tables. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Text-settings-in-ms.html b/doc/groff.html.node/Text-settings-in-ms.html new file mode 100644 index 0000000..f13be1e --- /dev/null +++ b/doc/groff.html.node/Text-settings-in-ms.html @@ -0,0 +1,76 @@ + + + + + + +Text settings in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.1 Text settings

    + + +

    The FAM string, a GNU extension, sets the font family for body +text; the default is ‘T’. The PS and VS registers +set the type size and vertical spacing (distance between text +baselines), respectively. The font family and type size are ignored on +terminal devices. Setting these parameters before the first call of a +heading, paragraphing, or (non-date) document description macro also +applies them to headers, footers, and (for FAM) footnotes. +

    +

    Which font families are available depends on the output device; as a +convention, T selects a serif family (“Times”), H a +sans-serif family (“Helvetica”), and C a monospaced family +(“Courier”). The man page for the output driver documents its font +repertoire. Consult the groff(1) man page for lists of +available output devices and their drivers. +

    +

    The hyphenation mode (as used by the hy request) is set from the +HY register. Setting HY to ‘0’ is equivalent to +using the nh request. This is a Tenth Edition Research Unix +extension. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Text.html b/doc/groff.html.node/Text.html new file mode 100644 index 0000000..16a1d83 --- /dev/null +++ b/doc/groff.html.node/Text.html @@ -0,0 +1,81 @@ + + + + + + +Text (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.1 Text

    + + +

    AT&T troff was designed to take input as it would be +composed on a typewriter, including the teletypewriters used as early +computer terminals, and relieve the user drafting a document of concern +with details like line length, hyphenation breaking, and the achievement +of straight margins. Early in its development, the program gained the +ability to prepare output for a phototypesetter; a document could then +be prepared for output to either a teletypewriter, a phototypesetter, or +both. GNU troff continues this tradition of permitting an author +to compose a single master version of a document which can then be +rendered for a variety of output formats or devices. +

    +

    roff input files contain text interspersed with instructions to +control the formatter. Even in the absence of such instructions, GNU +troff still processes its input in several ways, by filling, +hyphenating, breaking, and adjusting it, and supplementing it with +inter-sentence space. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/The-Implicit-Page-Trap.html b/doc/groff.html.node/The-Implicit-Page-Trap.html new file mode 100644 index 0000000..82d1a6b --- /dev/null +++ b/doc/groff.html.node/The-Implicit-Page-Trap.html @@ -0,0 +1,74 @@ + + + + + + +The Implicit Page Trap (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.1.2 The Implicit Page Trap

    + + + + + + + +

    If, after starting GNU troff without loading a macro package, you +use the ptr request to dump a list of the active traps to the +standard error stream,109 nothing is reported. +Yet the .t register will report a steadily decreasing value with +every output line your document produces, and once the value of +.t gets to within .V of zero, you will notice that +something trap-like happens—the page is ejected, a new one begins, and +the value of .t becomes large once more. +

    +

    This implicit page trap always exists in the top-level +diversion;110 it works like a trap in some +ways but not others. Its purpose is to eject the current page and start +the next one. It has no name, so it cannot be moved or deleted with +wh or ch requests. You cannot hide it by placing another +trap at its location, and can move it only by redefining the page length +with pl. Its operation is suppressed when vertical page traps +are disabled with GNU troff’s vpt request. +

    + +
    + + + + + diff --git a/doc/groff.html.node/Traps.html b/doc/groff.html.node/Traps.html new file mode 100644 index 0000000..3386bdb --- /dev/null +++ b/doc/groff.html.node/Traps.html @@ -0,0 +1,73 @@ + + + + + + +Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28 Traps

    + + +

    Traps are locations in the output or conditions on the input that, +when reached or fulfilled, call a specified macro. These traps can +occur at a given location on the page, at a given location in the +current diversion (together, these are known as vertical +position traps), at a blank line, at a line with leading space +characters, after a quantity of input lines, or at the end of input. +Macros called by traps are passed no arguments. + + +Setting a trap is also called planting one. + + +It is said that a trap is sprung if its condition is fulfilled. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/Tutorial-for-Macro-Users.html b/doc/groff.html.node/Tutorial-for-Macro-Users.html new file mode 100644 index 0000000..3fc9bce --- /dev/null +++ b/doc/groff.html.node/Tutorial-for-Macro-Users.html @@ -0,0 +1,68 @@ + + + + + + +Tutorial for Macro Users (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    3 Tutorial for Macro Users

    + + + + + +

    Most users of the roff language employ a macro package to format +their documents. Successful macro packages ease the composition +process; their users need not have mastered the full formatting +language, nor understand features like diversions, traps, and +environments. This chapter aims to familiarize you with basic concepts +and mechanisms common to many macro packages (like “displays”). If +you prefer a meticulous and comprehensive presentation, try GNU troff Reference instead. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Typeface-and-decoration.html b/doc/groff.html.node/Typeface-and-decoration.html new file mode 100644 index 0000000..759a761 --- /dev/null +++ b/doc/groff.html.node/Typeface-and-decoration.html @@ -0,0 +1,212 @@ + + + + + + +Typeface and decoration (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.5 Typeface and decoration

    + +

    The ms macros provide a variety of ways to style text. +Attend closely to the ordering of arguments labeled pre and +post, which is not intuitive. Support for pre +arguments is a GNU extension.10 +

    +
    +
    Macro: .B [text [post [pre]]]
    +
    +

    Style text in bold, followed by post in the previous +font style without intervening space, and preceded by pre +similarly. Without arguments, ms styles subsequent text in bold +until the next paragraphing, heading, or no-argument typeface macro +call. +

    + +
    +
    Macro: .R [text [post [pre]]]
    +
    +

    As B, but use the roman style (upright text of normal weight) +instead of bold. Argument recognition is a GNU extension. +

    + +
    +
    Macro: .I [text [post [pre]]]
    +
    +

    As B, but use an italic or oblique style instead of bold. +

    + +
    +
    Macro: .BI [text [post [pre]]]
    +
    +

    As B, but use a bold italic or bold oblique style instead of +upright bold. This is a Tenth Edition Research Unix extension. +

    + +
    +
    Macro: .CW [text [post [pre]]]
    +
    +

    As B, but use a constant-width (monospaced) roman typeface +instead of bold. This is a Tenth Edition Research Unix extension. +

    + +
    +
    Macro: .BX [text]
    +
    +

    Typeset text and draw a box around it. On terminal devices, +reverse video is used instead. If you want text to contain space, +use unbreakable space or horizontal motion escape sequences (\~, +\SP, \^, \|, \0 or \h). +

    + +
    +
    Macro: .UL [text [post]]
    +
    +

    Typeset text with an underline. post, if present, is set +after text with no intervening space. +

    + +
    +
    Macro: .LG
    +
    +

    Set subsequent text in larger type (two points larger than the +current size) until the next type size, paragraphing, or heading macro +call. You can specify this macro multiple times to enlarge the type +size as needed. +

    + +
    +
    Macro: .SM
    +
    +

    Set subsequent text in smaller type (two points smaller than the current +size) until the next type size, paragraphing, or heading macro call. +You can specify this macro multiple times to reduce the type size as +needed. +

    + +
    +
    Macro: .NL
    +
    +

    Set subsequent text at the normal type size (the amount in the PS +register). +

    + +

    pre and post arguments are typically used to simplify the +attachment of punctuation to styled words. When pre is used, +a hyphenation control escape sequence \% that would ordinarily +start text must start pre instead to have the desired +effect. +

    +
    +
    +
    The CS course's students found one C language keyword
    +.CW static ) \%(
    +most troublesome.
    +
    +
    + +

    The foregoing example produces output as follows. +

    +
    +
    +
    The CS course’s students found one C language keyword (static)
    +most troublesome.
    +
    +
    + +

    You can use the output line continuation escape sequence \c to +achieve the same result (see Line Continuation). It is also +portable to older ms implementations. +

    +
    +
    +
    The CS course's students found one C language keyword
    +\%(\c
    +.CW \%static )
    +most troublesome.
    +
    +
    + +

    groff ms also offers strings to begin and end super- and +subscripting. These are GNU extensions. +

    +
    +
    String: \*[{]
    +
    +
    String: \*[}]
    +
    +

    Begin and end superscripting, respectively. +

    + +
    +
    String: \*[<]
    +
    +
    String: \*[>]
    +
    +

    Begin and end subscripting, respectively. +

    + +

    Rather than calling the CW macro, in groff ms you +might prefer to change the font family to Courier by setting the +FAM string to ‘C’. You can then use all four style macros +above, returning to the default family (Times) with ‘.ds FAM T’. +Because changes to FAM take effect only at the next paragraph, +CW remains useful to “inline” a change to the font family, +similarly to the practice of this document in noting syntactical +elements of ms and groff. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Typographical-symbols-in-ms.html b/doc/groff.html.node/Typographical-symbols-in-ms.html new file mode 100644 index 0000000..3323bcd --- /dev/null +++ b/doc/groff.html.node/Typographical-symbols-in-ms.html @@ -0,0 +1,80 @@ + + + + + + +Typographical symbols in ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.2 Typographical symbols

    + + +

    ms provides a few strings to obtain typographical symbols not +easily entered with the keyboard. These and many others are available +as special character escape sequences—see the groff_char(7) +man page. +

    +
    +
    String: \*[-]
    +
    +

    Interpolate an em dash. +

    + +
    +
    String: \*[Q]
    +
    +
    String: \*[U]
    +
    +

    Interpolate typographer’s quotation marks where available, and neutral +double quotes otherwise. \*Q is the left quote and \*U +the right. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Using-Escape-Sequences.html b/doc/groff.html.node/Using-Escape-Sequences.html new file mode 100644 index 0000000..9eabad1 --- /dev/null +++ b/doc/groff.html.node/Using-Escape-Sequences.html @@ -0,0 +1,206 @@ + + + + + + +Using Escape Sequences (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.6.4 Using Escape Sequences

    + + + +

    Whereas requests must occur on control lines, escape sequences can occur +intermixed with text and may appear in arguments to requests, macros, +and other escape sequences. + +An escape sequence is introduced by the escape character, a backslash +\ (but see the ec request below). The next character +selects the escape’s function. +

    +

    Escape sequences vary in length. Some take an argument, and of those, +some have different syntactical forms for a one-character, +two-character, or arbitrary-length argument. Others accept only +an arbitrary-length argument. In the former scheme, a one-character +argument follows the function character immediately, an opening +parenthesis ‘(’ introduces a two-character argument (no closing +parenthesis is used), and an argument of arbitrary length is enclosed in +brackets ‘[]’. In the latter scheme, the user selects a delimiter +character. A few escape sequences are idiosyncratic, and support both +of the foregoing conventions (\s), designate their own +termination sequence (\?), consume input until the next newline +(\!, \", \#), or support an additional modifier +character (\s again, and \n). As with requests, use of +some escape sequences in source documents may interact poorly with a +macro package you use; consult its documentation to learn of “safe” +sequences or alternative facilities it provides to achieve the desired +result. +

    +

    If an escape character is followed by a character that does not +identify a defined operation, the escape character is ignored (producing +a diagnostic of the ‘escape’ warning category, which is not enabled +by default) and the following character is processed normally. +

    +
    +
    $ groff -Tps -ww
    +.nr N 12
    +.ds co white
    +.ds animal elephant
    +I have \fI\nN \*(co \*[animal]s,\f[]
    +said \P.\&\~Pseudo Pachyderm.
    +    error→ warning: escape character ignored before 'P'
    +    ⇒ I have 12 white elephants, said P. Pseudo Pachyderm.
    +
    + +

    Escape sequence interpolation is of higher precedence than escape +sequence argument interpretation. This rule affords flexibility in +using escape sequences to construct parameters to other escape +sequences. +

    +
    +
    .ds family C\" Courier
    +.ds style I\" oblique
    +Choice a typeface \f(\*[family]\*[style]wisely.
    +    ⇒ Choose a typeface wisely.
    +
    + +

    In the above, the syntax form ‘\f(’ accepts only two characters for +an argument; the example works because the subsequent escape sequences +are interpolated before the selection escape sequence argument is +processed, and strings family and style interpolate one +character each.46 +

    +

    The escape character is nearly always interpreted when encountered; it +is therefore desirable to have a way to interpolate it, disable it, or +change it. +

    + + +
    +
    Escape sequence: \e
    +
    +

    Interpolate the escape character. +

    + + + +

    The \[rs] special character escape sequence formats a backslash +glyph. In macro and string definitions, the input sequences \\ +and \E defer interpretation of escape sequences. See Copy Mode. +

    +
    +
    Request: .eo
    +
    + + +

    Disable the escape mechanism except in copy mode. Once this request is +invoked, no input character is recognized as starting an escape +sequence in interpretation mode. +

    + +
    +
    Request: .ec [o]
    +
    + + +

    Recognize the ordinary character o as the escape character. +If o is absent or invalid, the default escape character +‘\’ is selected. +

    + +

    Switching escape sequence interpretation off to define a macro and back +on afterward can obviate the need to double the escape character within +the definition. See Writing Macros. This technique is not available +if your macro needs to interpolate values at the time it is +defined—but many do not. +

    +
    +
    .\" simplified `BR` macro from the man(7) macro package
    +.eo
    +.de BR
    +.  ds result \&
    +.  while (\n[.$] >= 2) \{\
    +.    as result \fB\$1\fR\$2\"
    +.    shift 2
    +.  \}
    +.  if \n[.$] .as result \fB\$1\"
    +\*[result]
    +.  rm result
    +.  ft R
    +..
    +.ec
    +
    + +
    +
    Request: .ecs
    +
    +
    Request: .ecr
    +
    +

    The ecs request stores the escape character for recall with +ecr. ecr sets the escape character to ‘\’ if none +has been saved. +

    +

    Use these requests together to temporarily change the escape character. +

    + +

    Using a different escape character, or disabling it, when calling macros +not under your control will likely cause errors, since GNU troff +has no mechanism to “intern” macros—that is, to convert a macro +definition into a form independent of its +representation.47 When a +macro is called, its contents are interpreted literally. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Using-Fonts.html b/doc/groff.html.node/Using-Fonts.html new file mode 100644 index 0000000..81f48e6 --- /dev/null +++ b/doc/groff.html.node/Using-Fonts.html @@ -0,0 +1,148 @@ + + + + + + +Using Fonts (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19 Using Fonts

    + + + + + + + + + + + + + +

    In digital typography, a font is a collection of characters in a +specific typeface that a device can render as glyphs at a desired +size.72 A roff formatter can change typefaces at any +point in the text. The basic faces are a set of styles combining +upright and slanted shapes with normal and heavy stroke weights: +‘R’, ‘I’, ‘B’, and ‘BI’—these stand for +roman, italic, bold, and +bold-italic. For linguistic text, GNU troff groups +typefaces into families containing each of these +styles.73 A text font is thus often a family +combined with a style, but it need not be: consider the ps and +pdf devices’ ZCMI (Zapf Chancery Medium italic)—often, +no other style of Zapf Chancery Medium is provided. On typesetting +devices, at least one special font is available, comprising +unstyled glyphs for mathematical operators and other purposes. +

    + + + + + + + + +

    Like AT&T troff, GNU troff does not itself load +or manipulate a digital font file;74 instead it +works with a font description file that characterizes it, +including its glyph repertoire and the metrics (dimensions) of +each glyph.75 This +information permits the formatter to accurately place glyphs with +respect to each other. Before using a font description, the formatter +associates it with a mounting position, a place in an ordered list +of available typefaces. + + + +So that a document need not be strongly coupled to a specific font +family, in GNU troff an output device can associate a style in +the abstract sense with a mounting position. Thus the default family +can be combined with a style dynamically, producing a resolved font +name. +

    +

    Fonts often have trademarked names, and even Free Software fonts can +require renaming upon modification. groff maintains a +convention that a device’s serif font family is given the name ‘T’ +(“Times”), its sans-serif family ‘H’ (“Helvetica”), and its +monospaced family ‘C’ (“Courier”). Historical inertia has driven +groff’s font identifiers to short uppercase abbreviations of font +names, as with ‘TR’, ‘TI’, ‘TB’, ‘TBI’, and a +special font ‘S’. +

    +

    The default family used with abstract styles can be changed at any time; +initially, it is ‘T’. Typically, abstract styles are arranged in +the first four mounting positions in the order shown above. The default +mounting position, and therefore style, is always ‘1’ (‘R’). +By issuing appropriate formatter instructions, you can override these +defaults before your document writes its first glyph. +

    + + + + + +

    Terminal output devices cannot change font families and lack special +fonts. They support style changes by overstriking, or by altering +ISO 6429/ECMA-48 graphic renditions (character cell +attributes). +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Using-Fractional-Type-Sizes.html b/doc/groff.html.node/Using-Fractional-Type-Sizes.html new file mode 100644 index 0000000..7445fc5 --- /dev/null +++ b/doc/groff.html.node/Using-Fractional-Type-Sizes.html @@ -0,0 +1,172 @@ + + + + + + +Using Fractional Type Sizes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.20.3 Using Fractional Type Sizes

    + + + + + + +

    AT&T troff interpreted all type size measurements in points. +Combined with integer arithmetic, this design choice made it impossible +to support, for instance, ten and a half-point type. In GNU +troff, an output device can select a scaling factor that +subdivides a point into “scaled points”. A type size expressed in +scaled points can thus represent a non-integral type size. +

    + + + + + + + + + + + +

    A scaled point is equal to 1/sizescale points, where +sizescale is specified in the device description file DESC, +and defaults to 1.85 Requests and escape sequences in GNU troff interpret +arguments that represent a type size in scaled points, which the +formatter multiplies by sizescale and converts to an integer. +Arguments treated in this way comprise those to the escape sequences +\H and \s, to the request ps, the third argument to +the cs request, and the second and fourth arguments to the +tkf request. Scaled points may be specified explicitly with the +z scaling unit. +

    +

    For example, if sizescale is 1000, then a scaled point is one +thousandth of a point. The request ‘.ps 10.5’ is synonymous with +‘.ps 10.5z’ and sets the type size to 10,500 scaled points, or +10.5 points. Consequently, in GNU troff, the register +.s can interpolate a non-integral type size. +

    +
    +
    Register: \n[.ps]
    +
    +

    This read-only register interpolates the type size in scaled points; it +is associated with the environment (see Environments). +

    + +

    It makes no sense to use the ‘z’ scaling unit in a numeric +expression whose default scaling unit is neither ‘u’ nor ‘z’, +so GNU troff disallows this. Similarly, it is nonsensical to use +a scaling unit other than ‘z’ or ‘u’ in a numeric expression +whose default scaling unit is ‘z’, and so GNU troff +disallows this as well. +

    +

    Another GNU troff scaling unit, ‘s’, multiplies by the +number of basic units in a scaled point. Thus, ‘\n[.ps]s’ is equal +to ‘1m’ by definition. Do not confuse the ‘s’ and ‘z’ +scaling units. +

    +
    +
    Register: \n[.psr]
    +
    +
    Register: \n[.sr]
    +
    + + + + + + +

    Output devices may be limited in the type sizes they can employ. The +.s and .ps registers represent the type size selected by +the output driver as it understands a device’s capability. The last +requested type size is interpolated in scaled points by the +read-only register .psr and in points as a decimal fraction by +the read-only string-valued register .sr. Both are associated +with the environment (see Environments). +

    +

    For example, if a type size of 10.95 points is requested, and the +nearest size permitted by a sizes request (or by the sizes +or sizescale directives in the device’s DESC file) is 11 +points, the output driver uses the latter value. +

    + +

    The \s escape sequence offers the following syntax forms that +work with fractional type sizes and accept scaling units. You may of +course give them integral arguments. The delimited forms need not use +the neutral apostrophe; see Delimiters. +

    +
    +
    \s[n]
    +
    \s'n'
    +

    Set the type size to n scaled points; n is a +numeric expression with a default scaling unit of ‘z’. +

    +
    +
    \s[+n]
    +
    \s[-n]
    +
    \s+[n]
    +
    \s-[n]
    +
    \s'+n'
    +
    \s'-n'
    +
    \s+'n'
    +
    \s-'n'
    +

    Increase or decrease the type size by n scaled points; +n is a numeric expression (which may start with a minus sign) +with a default scaling unit of ‘z’. +

    +
    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Using-Symbols.html b/doc/groff.html.node/Using-Symbols.html new file mode 100644 index 0000000..af4a7cf --- /dev/null +++ b/doc/groff.html.node/Using-Symbols.html @@ -0,0 +1,632 @@ + + + + + + +Using Symbols (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.19.4 Using Symbols

    + + + + + + + + +

    A glyph is a graphical representation of a character. While +a character is an abstraction of semantic information, a glyph is +something that can be seen on screen or paper. A character has many +possible representation forms (for example, the character ‘A’ can be +written in an upright or slanted typeface, producing distinct +glyphs). Sometimes, a sequence of characters map to a single glyph: +this is a ligature—the most common is ‘fi’. +

    +

    Space characters never become glyphs in GNU troff. If not +discarded (as when trailing on text lines), they are represented by +horizontal motions in the output. +

    + + + + + + +

    A symbol is simply a named glyph. Within gtroff, all glyph +names of a particular font are defined in its font file. If the user +requests a glyph not available in this font, gtroff looks up an +ordered list of special fonts. By default, the PostScript output +device supports the two special fonts ‘SS’ (slanted symbols) and +‘S’ (symbols) (the former is looked up before the latter). Other +output devices use different names for special fonts. Fonts mounted +with the fonts keyword in the DESC file are globally +available. To install additional special fonts locally (i.e., for a +particular font), use the fspecial request. +

    +

    Here are the exact rules how gtroff searches a given symbol: +

    +
      +
    • If the symbol has been defined with the char request, use it. +This hides a symbol with the same name in the current font. + +
    • Check the current font. + +
    • If the symbol has been defined with the fchar request, use it. + +
    • Check whether the current font has a font-specific list of special +fonts; test all fonts in the order of appearance in the last +fspecial call if appropriate. + +
    • If the symbol has been defined with the fschar request for the +current font, use it. + +
    • Check all fonts in the order of appearance in the last special +call. + +
    • If the symbol has been defined with the schar request, use it. + +
    • As a last resort, consult all fonts loaded up to now for special fonts +and check them, starting with the lowest font number. This can +sometimes lead to surprising results since the fonts line in +the DESC file often contains empty positions, which are filled +later on. For example, consider the following: + +
      +
      fonts 3 0 0 FOO
      +
      + +

      This mounts font foo at font position 3. We assume that +FOO is a special font, containing glyph foo, and that no +font has been loaded yet. The line +

      +
      +
      .fspecial BAR BAZ
      +
      + +

      makes font BAZ special only if font BAR is active. We +further assume that BAZ is really a special font, i.e., the font +description file contains the special keyword, and that it also +contains glyph foo with a special shape fitting to font +BAR. After executing fspecial, font BAR is loaded +at font position 1, and BAZ at position 2. +

      +

      We now switch to a new font XXX, trying to access glyph +foo that is assumed to be missing. There are neither +font-specific special fonts for XXX nor any other fonts made +special with the special request, so gtroff starts the +search for special fonts in the list of already mounted fonts, with +increasing font positions. Consequently, it finds BAZ before +FOO even for XXX, which is not the intended behaviour. +

    + +

    See Device and Font Description Files, and Special Fonts, for +more details. +

    + + + + + +

    The groff_char(7) man page houses a complete list of +predefined special character names, but the availability of any as a +glyph is device- and font-dependent. For example, say +

    +
    +
    man -Tdvi groff_char > groff_char.dvi
    +
    + +

    to obtain those available with the DVI device and default font +configuration.77 If you want to use an additional macro package to change +the fonts used, groff (or gtroff) must be run directly. +

    +
    +
    groff -Tdvi -mec -man groff_char.7 > groff_char.dvi
    +
    + + + + + + +

    Special character names not listed in groff_char(7) are +derived algorithmically, using a simplified version of the Adobe Glyph +List (AGL) algorithm, which is described in +https://github.com/adobe-type-tools/agl-aglfn. The (frozen) +set of names that can’t be derived algorithmically is called the +groff glyph list (GGL). +

    +
      +
    • A glyph for Unicode character U+XXXX[X[X]], which is +not a composite character is named +uXXXX[X[X]]. X must be an +uppercase hexadecimal digit. Examples: u1234, u008E, +u12DB8. The largest Unicode value is 0x10FFFF. There must be at +least four X digits; if necessary, add leading zeroes (after the +‘u’). No zero padding is allowed for character codes greater than +0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF +represented with character codes from the surrogate area U+D800-U+DFFF) +are not allowed either. + +
    • A glyph representing more than a single input character is named + +
      +
      ucomponent1_component2_component3 …
      +
      + +

      Example: u0045_0302_0301. +

      +

      For simplicity, all Unicode characters that are composites must be +maximally decomposed to NFD;78 for example, +u00CA_0301 is not a valid glyph name since U+00CA (LATIN +CAPITAL LETTER E WITH CIRCUMFLEX) can be further decomposed into U+0045 +(LATIN CAPITAL LETTER E) and U+0302 (COMBINING CIRCUMFLEX +ACCENT). u0045_0302_0301 is thus the glyph name for U+1EBE, +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE. +

      +
    • groff maintains a table to decompose all algorithmically derived glyph +names that are composites itself. For example, u0100 (LATIN +LETTER A WITH MACRON) is automatically decomposed into +u0041_0304. Additionally, a glyph name of the GGL is preferred +to an algorithmically derived glyph name; groff also +automatically does the mapping. Example: The glyph u0045_0302 is +mapped to ^E. + +
    • glyph names of the GGL can’t be used in composite glyph names; for +example, ^E_u0301 is invalid. +
    + +
    +
    Escape sequence: \(nm
    +
    +
    Escape sequence: \[name]
    +
    Escape sequence: \[base-glyph combining-component …]
    +
    + +

    Typeset a special character name (two-character name nm) or +a composite glyph consisting of base-glyph overlaid with one or +more combining-components. For example, ‘\[A ho]’ is a +capital letter “A” with a “hook accent” (ogonek). +

    +

    There is no special syntax for one-character names—the analogous form +‘\n’ would collide with other escape sequences. However, the +four escape sequences \', \-, \_, and \`, +are translated on input to the special character escape sequences +\[aa], \[-], \[ul], and \[ga], respectively. +

    +

    A special character name of length one is not the same thing as an +ordinary character: that is, the character a is not the same as +\[a]. +

    +

    If name is undefined, a warning in category ‘char’ is +produced and the escape is ignored. See Warnings, for information +about the enablement and suppression of warnings. +

    +

    GNU troff resolves \[] with more than a single +component as follows: +

    +
      +
    • Any component that is found in the GGL is converted to the +uXXXX form. + +
    • Any component uXXXX that is found in the list of +decomposable glyphs is decomposed. + +
    • The resulting elements are then concatenated with ‘_’ in between, +dropping the leading ‘u’ in all elements but the first. +
    + +

    No check for the existence of any component (similar to tr +request) is done. +

    +

    Examples: +

    +
    +
    \[A ho]
    +

    A’ maps to u0041, ‘ho’ maps to u02DB, thus the +final glyph name would be u0041_02DB. This is not the expected +result: the ogonek glyph ‘ho’ is a spacing ogonek, but for a +proper composite a non-spacing ogonek (U+0328) is necessary. Looking +into the file composite.tmac, one can find ‘.composite ho u0328, which changes the mapping of ‘ho’ while a composite glyph +name is constructed, causing the final glyph name to be +u0041_0328. +

    +
    +
    \[^E u0301]
    +
    \[^E aa]
    +
    \[E a^ aa]
    +
    \[E ^ ']
    +

    ^E’ maps to u0045_0302, thus the final glyph name is +u0045_0302_0301 in all forms (assuming proper calls of the +composite request). +

    +
    + +

    It is not possible to define glyphs with names like ‘A ho +within a groff font file. This is not really a limitation; +instead, you have to define u0041_0328. +

    + +
    +
    Escape sequence: \C'xxx'
    +
    + + +

    Typeset the glyph of the special character xxx. Normally, it is +more convenient to use \[xxx], but \C has some +advantages: it is compatible with AT&T device-independent +troff (and therefore available in compatibility +mode79) and can interpolate special +characters with ‘]’ in their names. The delimiter need not be +a neutral apostrophe; see Delimiters. +

    + +
    +
    Request: .composite id1 id2
    +
    + +

    Map special character name id1 to id2 if id1 is used +in \[...] with more than one component. See above for examples. +This is a strict rewriting of the special character name; no check is +performed for the existence of a glyph for either. A set of default +mappings for many accents can be found in the file +composite.tmac, loaded by the default troffrc at startup. +

    + +
    +
    Escape sequence: \N'n'
    +
    + + + + +

    Typeset the glyph with code n in the current font +(n is not the input character code). The number +n can be any non-negative decimal integer. Most devices only +have glyphs with codes between 0 and 255; the Unicode output device +uses codes in the range 0–65535. If the current font does not contain +a glyph with that code, special fonts are not searched. The +\N escape sequence can be conveniently used in conjunction with +the char request: +

    +
    +
    .char \[phone] \f[ZD]\N'37'
    +
    + + + + +

    The code of each glyph is given in the fourth column in the font +description file after the charset command. It is possible to +include unnamed glyphs in the font description file by using a name of +‘---’; the \N escape sequence is the only way to use these. +

    +

    No kerning is applied to glyphs accessed with \N. The delimiter +need not be a neutral apostrophe; see Delimiters. +

    + +

    A few escape sequences are also special characters. +

    +
    +
    Escape sequence: \'
    +
    +

    An escaped neutral apostrophe is a synonym for \[aa] (acute +accent). +

    + +
    +
    Escape sequence: \`
    +
    +

    An escaped grave accent is a synonym for \[ga] (grave accent). +

    + +
    +
    Escape sequence: \-
    +
    +

    An escaped hyphen-minus is a synonym for \[-] (minus sign). +

    + +
    +
    Escape sequence: \_
    +
    +

    An escaped underscore (“low line”) is a synonym for \[ul] +(underrule). On typesetting devices, the underrule is font-invariant +and drawn lower than the underscore ‘_’. +

    + +
    +
    Request: .cflags n c1 c2 …
    +
    + + + + +

    Assign properties encoded by the number n to characters c1, +c2, and so on. +

    +

    Input characters, including special characters introduced by an escape, +have certain properties associated with them.80 +These properties can be modified with this request. The first argument +is the sum of the desired flags and the remaining arguments are the +characters to be assigned those properties. Spaces between the cn +arguments are optional. Any argument cn can be a character class +defined with the class request rather than an individual +character. See Character Classes. +

    +

    The non-negative integer n is the sum of any of the following. +Some combinations are nonsensical, such as ‘33’ (1 + 32). +

    +
    +
    1
    +
    +

    Recognize the character as ending a sentence if followed by a newline +or two spaces. Initially, characters ‘.?!’ have this property. +

    +
    +
    2
    +
    +

    Enable breaks before the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, no characters have this property. +

    +
    +
    4
    +
    + +

    Enable breaks after the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, characters ‘\-\[hy]\[em]’ have this property. +

    +
    +
    8
    +
    + + + + + +

    Mark the glyph associated with this character as overlapping other +instances of itself horizontally. Initially, characters +‘\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]’ have this property. +

    +
    +
    16
    +

    Mark the glyph associated with this character as overlapping other +instances of itself vertically. Initially, the character ‘\[br]’ +has this property. +

    +
    +
    32
    +
    + + + + + + + + + +

    Mark the character as transparent for the purpose of end-of-sentence +recognition. In other words, an end-of-sentence character followed by +any number of characters with this property is treated as the end of a +sentence if followed by a newline or two spaces. This is the same as +having a zero space factor in TeX. Initially, characters +‘"')]*\[dg]\[dd]\[rq]\[cq]’ have this property. +

    +
    +
    64
    +

    Ignore hyphenation codes of the surrounding characters. Use this in +combination with values 2 and 4 (initially, no characters have this +property). +

    +

    For example, if you need an automatic break point after the en-dash in +numeric ranges like “3000–5000”, insert +

    +
    +
    .cflags 68 \[en]
    +
    + +

    into your document. However, this practice can lead to bad layout if +done thoughtlessly; in most situations, a better solution instead of +changing the cflags value is to insert \: right after the +hyphen at the places that really need a break point. +

    +
    + +

    The remaining values were implemented for East Asian language support; +those who use alphabetic scripts exclusively can disregard them. +

    +
    +
    128
    +

    Prohibit a line break before the character, but allow a line break after +the character. This works only in combination with flags 256 and 512 +and has no effect otherwise. Initially, no characters have this +property. +

    +
    +
    256
    +

    Prohibit a line break after the character, but allow a line break before +the character. This works only in combination with flags 128 and 512 +and has no effect otherwise. Initially, no characters have this +property. +

    +
    +
    512
    +

    Allow line break before or after the character. This works only in +combination with flags 128 and 256 and has no effect otherwise. +Initially, no characters have this property. +

    +
    + +

    In contrast to values 2 and 4, the values 128, 256, and 512 work +pairwise. If, for example, the left character has value 512, and the +right character 128, no break will be automatically inserted between +them. If we use value 6 instead for the left character, a break +after the character can’t be suppressed since the neighboring character +on the right doesn’t get examined. +

    + +
    +
    Request: .char c [contents]
    +
    +
    Request: .fchar c [contents]
    +
    +
    Request: .fschar f c [contents]
    +
    +
    Request: .schar c [contents]
    +
    + + + + + + + + + + + + + + + + + + + + + +

    Define a new character or glyph c to be contents, which +can be empty. More precisely, char defines a groff object +(or redefines an existing one) that is accessed with the +name c on input, and produces contents on output. +Every time glyph c needs to be printed, contents is +processed in a temporary environment and the result is wrapped up into a +single object. Compatibility mode is turned off and the escape +character is set to \ while contents is processed. +Any emboldening, constant spacing, or track kerning is applied to this +object rather than to individual glyphs in contents. +

    +

    An object defined by these requests can be used just like a normal glyph +provided by the output device. In particular, other characters can be +translated to it with the tr or trin requests; it can be +made the leader character with the lc request; repeated patterns +can be drawn with it using the \l and \L escape sequences; +and words containing c can be hyphenated correctly if the +hcode request is used to give the object a hyphenation code. +

    +

    There is a special anti-recursion feature: use of the object within its +own definition is handled like a normal character (not +defined with char). +

    +

    The tr and trin requests take precedence if char +accesses the same symbol. +

    +
    +
    .tr XY
    +X
    +    ⇒ Y
    +.char X Z
    +X
    +    ⇒ Y
    +.tr XX
    +X
    +    ⇒ Z
    +
    + +

    The fchar request defines a fallback glyph: gtroff only +checks for glyphs defined with fchar if it cannot find the glyph +in the current font. gtroff carries out this test before +checking special fonts. +

    +

    fschar defines a fallback glyph for font f: +gtroff checks for glyphs defined with fschar after the +list of fonts declared as font-specific special fonts with the +fspecial request, but before the list of fonts declared as global +special fonts with the special request. +

    +

    Finally, the schar request defines a global fallback glyph: +gtroff checks for glyphs defined with schar after the list +of fonts declared as global special fonts with the special +request, but before the already mounted special fonts. +

    +

    See Character Classes. +

    + +
    +
    Request: .rchar c …
    +
    +
    Request: .rfschar f c …
    +
    + + + +

    Remove definition of each ordinary or special character c, +undoing the effect of a char, fchar, or schar +request. Those supplied by font description files cannot be removed. +Spaces and tabs may separate c arguments. +

    +

    The request rfschar removes glyph definitions defined with +fschar for font f. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/Vertical-Position-Traps.html b/doc/groff.html.node/Vertical-Position-Traps.html new file mode 100644 index 0000000..d12f564 --- /dev/null +++ b/doc/groff.html.node/Vertical-Position-Traps.html @@ -0,0 +1,94 @@ + + + + + + +Vertical Position Traps (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.28.1 Vertical Position Traps

    + + + +

    A vertical position trap calls a macro when the formatter’s +vertical drawing position reaches or passes, in the downward direction, +a certain location on the output page or in a diversion. Its +applications include setting page headers and footers, body text in +multiple columns, and footnotes. +

    +
    +
    Request: .vpt [flag]
    +
    +
    Register: \n[.vpt]
    +
    + + + +

    Enable vertical position traps if flag is non-zero or absent; +disable them otherwise. Vertical position traps are those set by the +wh request or by dt within a diversion. The parameter +that controls whether vertical position traps are enabled is global. +Initially, vertical position traps are enabled. The current value is +stored in the .vpt read-only register. +

    + + + + +

    A page can’t be ejected if vpt is set to zero; see The Implicit Page Trap. +

    + + + + +
    + + + + + diff --git a/doc/groff.html.node/Warnings.html b/doc/groff.html.node/Warnings.html new file mode 100644 index 0000000..b61ec3a --- /dev/null +++ b/doc/groff.html.node/Warnings.html @@ -0,0 +1,246 @@ + + + + + + +Warnings (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.37.1 Warnings

    + + +

    Warning diagnostics emitted by GNU troff are divided into named, +numbered categories. The name associated with each warning category is +used by the -w and -W options. Each category is also +assigned a power of two; the sum of enabled category values is used by +the warn request and the .warn register. +

    +

    Warnings of each category are produced under the following +circumstances. +

    + + +
    +
    char
    +
    1
    +

    No mounted font defines a glyph for the requested character. This +category is enabled by default. +

    +
    +
    number
    +
    2
    +

    An invalid numeric expression was encountered. This category is enabled +by default. +See Numeric Expressions. +

    +
    +
    break
    +
    4
    +
    +

    A filled output line could not be broken such that its length was less +than the output line length ‘\n[.l]’. This category is enabled by +default. +

    +
    +
    delim
    +
    8
    +

    The closing delimiter in an escape sequence was missing or mismatched. +

    +
    +
    el
    +
    16
    +
    +

    The el request was encountered with no prior corresponding +ie request. See if-else. +

    +
    +
    scale
    +
    32
    +

    A scaling unit inappropriate to its context was used in a numeric +expression. +

    +
    +
    range
    +
    64
    +

    A numeric expression was out of range for its context. +

    +
    +
    syntax
    +
    128
    +

    A self-contradictory hyphenation mode was requested; an empty or +incomplete numeric expression was encountered; an operand to a numeric +operator was missing; an attempt was made to define a recursive, empty, +or nonsensical character class; or a groff extension conditional +expression operator was used while in compatibility mode. +

    +
    +
    di
    +
    256
    +
    + + +

    A di, da, box, or boxa request was invoked +without an argument when there was no current diversion. +

    +
    +
    mac
    +
    512
    +
    + + + + + + +

    An undefined string, macro, or diversion was used. When such an object +is dereferenced, an empty one of that name is automatically created. +So, unless it is later deleted, at most one warning is given for each. +

    +

    This warning is also emitted upon an attempt to move an unplanted trap +macro (see Page Location Traps). In such cases, the unplanted macro +is not dereferenced, so it is not created if it does not exist. +

    +
    +
    reg
    +
    1024
    +
    + +

    An undefined register was used. When an undefined register is +dereferenced, it is automatically defined with a value of 0. So, +unless it is later deleted, at most one warning is given for each. +

    +
    +
    tab
    +
    2048
    +

    A tab character was encountered where a number was expected, or appeared +in an unquoted macro argument. +

    +
    +
    right-brace
    +
    4096
    +

    A right brace escape sequence \} was encountered where a number +was expected. +

    +
    +
    missing
    +
    8192
    +

    A request was invoked with a mandatory argument absent. +

    +
    +
    input
    +
    16384
    +

    An invalid character occurred on the input stream. +

    +
    +
    escape
    +
    32768
    +

    An unsupported escape sequence was encountered. +

    +
    +
    space
    +
    65536
    +

    A space was missing between a request or macro and its argument. This +warning is produced when an undefined name longer than two characters is +encountered and the first two characters of the name constitute a +defined name. No request is invoked, no macro called, and an empty +macro is not defined. This category is enabled by default. It never +occurs in compatibility mode. +

    +
    +
    font
    +
    131072
    +

    A non-existent font was selected, or the selection was ignored because a +font selection escape sequence was used after the output line +continuation escape sequence on an input line. This category is enabled +by default. +

    +
    +
    ig
    +
    262144
    +

    An invalid escape sequence occurred in input ignored using the ig +request. This warning category diagnoses a condition that is an error +when it occurs in non-ignored input. +

    +
    +
    color
    +
    524288
    +

    An undefined color was selected, an attempt was made to define a color +using an unrecognized color space, an invalid component in a color +definition was encountered, or an attempt was made to redefine a default +color. +

    +
    +
    file
    +
    1048576
    +

    An attempt was made to load a file that does not exist. This category +is enabled by default. +

    +
    + +

    Two warning names group other warning categories for convenience. +

    +
    +
    all
    +

    All warning categories except ‘di’, ‘mac’ and ‘reg’. +This shorthand is intended to produce all warnings that are useful with +macro packages written for AT&T troff and its +descendants, which have less fastidious diagnostics than GNU +troff. +

    +
    +
    w
    +

    All warning categories. Authors of documents and macro packages +targeting groff are encouraged to use this setting. +

    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/What-Is-groff_003f.html b/doc/groff.html.node/What-Is-groff_003f.html new file mode 100644 index 0000000..99939ea --- /dev/null +++ b/doc/groff.html.node/What-Is-groff_003f.html @@ -0,0 +1,68 @@ + + + + + + +What Is groff? (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.2 What Is groff?

    + + + +

    groff (GNU roff) is a typesetting system that reads plain +text input files that include formatting commands to produce output in +PostScript, PDF, HTML, DVI, or other formats, or for display to a +terminal. Formatting commands can be low-level typesetting primitives, +macros from a supplied package, or user-defined macros. All three +approaches can be combined. +

    +

    A reimplementation and extension of the typesetter from AT&T +Unix, groff is present on most POSIX systems owing to +its long association with Unix manuals (including man pages). It and +its predecessor are notable for their production of several best-selling +software engineering texts. groff is capable of producing +typographically sophisticated documents while consuming minimal system +resources. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/Writing-Macros.html b/doc/groff.html.node/Writing-Macros.html new file mode 100644 index 0000000..e08b9fa --- /dev/null +++ b/doc/groff.html.node/Writing-Macros.html @@ -0,0 +1,267 @@ + + + + + + +Writing Macros (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.24 Writing Macros

    + + + +

    A macro is a stored collection of text and control lines that can +be interpolated multiple times. Use macros to define common operations. +Macros are called in the same way that requests are invoked. While +requests exist for the purpose of creating macros, simply calling an +undefined macro, or interpolating it as a string, will cause it to be +defined as empty. See Identifiers. +

    +
    +
    Request: .de name [end]
    +
    +

    Define a macro name, replacing the definition of any existing +request, macro, string, or diversion called name. If +name already exists as an alias, the target of the alias is +redefined; recall Strings. GNU troff enters copy +mode,97 storing subsequent input lines as the +macro definition. If the optional second argument is not specified, the +definition ends with the control line ‘..’ (two dots). +Alternatively, end identifies a macro whose call syntax at the +start of a control line ends the definition of name; end is +then called normally. A macro definition must end in the same +conditional block (if any) in which it began (see Conditional Blocks). Spaces or tabs are permitted after the control character in +the line containing this ending token (either ‘.’ or +‘end’), but a tab immediately after the token prevents its +recognition as the end of a macro definition. The macro end can +be called with arguments.98 +

    +

    Here is a small example macro called ‘P’ that causes a break and +inserts some vertical space. It could be used to separate paragraphs. +

    +
    +
    .de P
    +.  br
    +.  sp .8v
    +..
    +
    + +

    We can define one macro within another. Attempting to nest ‘..’ +naïvely will end the outer definition because the inner definition +isn’t interpreted as such until the outer macro is later interpolated. +We can use an end macro instead. Each level of nesting should use a +unique end macro. +

    +

    An end macro need not be defined until it is called. This fact enables +a nested macro definition to begin inside one macro and end inside +another. Consider the following example.99 +

    +
    +
    .de m1
    +.  de m2 m3
    +you
    +..
    +.de m3
    +Hello,
    +Joe.
    +..
    +.de m4
    +do
    +..
    +.m1
    +know?
    +.  m3
    +What
    +.m4
    +.m2
    +    ⇒ Hello, Joe.  What do you know?
    +
    + +

    A nested macro definition can be terminated with ‘..’ and +nested macros can reuse end macros, but these control lines must +be escaped multiple times for each level of nesting. The necessity of +this escaping and the utility of nested macro definitions will become +clearer when we employ macro parameters and consider the behavior of +copy mode in detail. +

    + +

    de defines a macro that inherits the compatibility mode +enablement status of its context (see Implementation Differences). +Often it is desirable to make a macro that uses groff features +callable from contexts where compatibility mode is on; for instance, +when writing extensions to a historical macro package. To achieve this, +compatibility mode needs to be switched off while such a macro is +interpreted—without disturbing that state when it is finished. +

    +
    +
    Request: .de1 name [end]
    +
    +

    The de1 request defines a macro to be interpreted with +compatibility mode disabled. When name is called, compatibility +mode enablement status is saved; it is restored when the call completes. +Observe the extra backlash before the interpolation of register +‘xxx’; we’ll explore this subject in Copy Mode. +

    +
    +
    .nr xxx 12345
    +.de aa
    +The value of xxx is \\n[xxx].
    +.  br
    +..
    +.de1 bb
    +The value of xxx is \\n[xxx].
    +..
    +.cp 1
    +.aa
    +    error→ warning: register '[' not defined
    +    ⇒ The value of xxx is 0xxx].
    +.bb
    +    ⇒ The value of xxx is 12345.
    +
    +
    + +
    +
    Request: .dei name [end]
    +
    +
    Request: .dei1 name [end]
    +
    +

    The dei request defines a macro with its name and end +macro indirected through strings. That is, it interpolates strings +named name and end before performing the definition. +

    +

    The following examples are equivalent. +

    +
    +
    .ds xx aa
    +.ds yy bb
    +.dei xx yy
    +
    + +
    +
    .de aa bb
    +
    + +

    The dei1 request bears the same relationship to dei as +de1 does to de; it temporarily turns compatibility mode +off when name is called. +

    + +
    +
    Request: .am name [end]
    +
    +
    Request: .am1 name [end]
    +
    +
    Request: .ami name [end]
    +
    +
    Request: .ami1 name [end]
    +
    + + +

    am appends subsequent input lines to macro name, extending +its definition, and otherwise working as de does. +

    +

    To make the previously defined ‘P’ macro set indented instead of +block paragraphs, add the necessary code to the existing macro. +

    +
    +
    .am P
    +.ti +5n
    +..
    +
    + +

    The other requests are analogous to their ‘de’ counterparts. The +am1 request turns off compatibility mode during interpretation of +the appendment. The ami request appends indirectly, meaning that +strings name and end are interpolated with the resulting +names used before appending. The ami1 request is similar to +ami, disabling compatibility mode during interpretation of the +appended lines. +

    + + +

    Using trace.tmac, you can trace calls to de, +de1, am, and am1. You can also use the +backtrace request at any point desired to troubleshoot tricky +spots (see Debugging). +

    +

    See Strings, for the als, rm, and rn requests to +create an alias of, remove, and rename a macro, respectively. +

    + +

    Macro identifiers share their name space with requests, strings, and +diversions; see Identifiers. The am, as, da, +de, di, and ds requests (together with their +variants) create a new object only if the name of the macro, diversion, +or string is currently undefined or if it is defined as a request; +normally, they modify the value of an existing object. See the +description of the als request, for pitfalls when redefining a +macro that is aliased. +

    +
    +
    Request: .return [anything]
    +
    +

    Exit a macro, immediately returning to the caller. If called with an +argument anything, exit twice—the current macro and the macro +one level higher. This is used to define a wrapper macro for +return in trace.tmac. +

    + + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/als.html b/doc/groff.html.node/als.html new file mode 100644 index 0000000..711bc84 --- /dev/null +++ b/doc/groff.html.node/als.html @@ -0,0 +1,33 @@ + + + + + + + +als (The GNU Troff Manual) + + + + + + + + + + + + + + +

    The node you are looking for is at als.

    + diff --git a/doc/groff.html.node/groff-Capabilities.html b/doc/groff.html.node/groff-Capabilities.html new file mode 100644 index 0000000..424779a --- /dev/null +++ b/doc/groff.html.node/groff-Capabilities.html @@ -0,0 +1,91 @@ + + + + + + +groff Capabilities (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    1.3 groff Capabilities

    + + + +

    GNU troff is a typesetting document formatter; it provides a wide +range of low-level text and page operations within the framework of a +programming language. These operations compose to generate footnotes, +tables of contents, mathematical equations, diagrams, multi-column text, +and other elements of typeset works. Here is a survey of formatter +features; all are under precise user control. +

    +
      +
    • text filling, breaking, alignment to the left or right margin; centering + +
    • adjustment of inter-word space size to justify text, and of +inter-sentence space size to suit local style conventions + +
    • automatic and manual determination of hyphenation break points + +
    • pagination + +
    • selection of any font available to the output device + +
    • adjustment of type size and vertical spacing (or “leading”) + +
    • configuration of line length and indentation amounts; columnation + +
    • drawing of geometric primitives (lines, arcs, polygons, circles, +…) + +
    • setup of stroke and fill colors (where supported by the output +device) + +
    • embedding of hyperlinks, images, document metadata, and other inclusions +(where supported by the output device) +
    + + + +
    + + + + + diff --git a/doc/groff.html.node/groff.html_fot.html b/doc/groff.html.node/groff.html_fot.html new file mode 100644 index 0000000..1230044 --- /dev/null +++ b/doc/groff.html.node/groff.html_fot.html @@ -0,0 +1,525 @@ + + + + + + +Footnotes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + +
    + +
    +

    Footnotes

    + +
    (1)
    +

    The ‘g’ prefix is +not used on all systems; see Invoking groff.

    +
    (2)
    +

    Unix and related operating systems distinguish +standard output and standard error streams because of +troff: +https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html.

    +
    (3)
    +

    See Line Layout.

    +
    (4)
    +

    Besides groff, neatroff is an +exception.

    +
    (5)
    +

    The +mso request does not have these limitations. See I/O.

    +
    (6)
    +

    The remainder of this chapter is based on +Writing Papers with nroff using -me by Eric P. Allman, +which is distributed with groff as meintro.me.

    +
    (7)
    +

    While manual pages are older, early ones used +macros supplanted by the man package of Seventh Edition Unix +(1979). ms shipped with Sixth Edition (1975) and was documented +by Mike Lesk in a Bell Labs internal memorandum.

    +
    (8)
    +

    defined in Footnotes

    +
    (9)
    +

    Distinguish a +document title from “titles”, which are what roff systems call +headers and footers collectively.

    +
    (10)
    +

    This idiosyncrasy arose through +feature accretion; for example, the B macro in Version 6 +Unix ms (1975) accepted only one argument, the text to be set in +boldface. By Version 7 (1979) it recognized a second argument; in +1990, groff ms added a “pre” argument, placing it third +to avoid breaking support for older documents.

    +
    (11)
    +

    “Portable Document Format Publishing with GNU +Troff”, pdfmark.ms in the groff distribution, uses this +technique.

    +
    (12)
    +

    Unix Version 7 ms, its descendants, and GNU +ms prior to groff version 1.23.0

    +
    (13)
    +

    You could reset it +after each call to .1C, .2C, or .MC.

    +
    (14)
    +

    Typing Documents on the UNIX System: Using the +-ms Macros with Troff and Nroff, M. E. Lesk, Bell Laboratories, +1978

    +
    (15)
    +

    Register values are converted to and stored as +basic units. See Measurements.

    +
    (16)
    +

    If you redefine the ms PT macro +and desire special treatment of certain page numbers (like ‘1’), +you may need to handle a non-Arabic page number format, as groff +ms’s PT does; see the macro package source. groff +ms aliases the PN register to %.

    +
    (17)
    +

    The removal beforehand is necessary +because groff ms aliases these macros to a diagnostic +macro, and you want to redefine the aliased name, not its target.

    +
    (18)
    +

    See Device and Font Description Files.

    +
    (19)
    +

    Tabs and leaders also separate +words. Escape sequences can function as word characters, word +separators, or neither—the last simply have no effect on GNU +troff’s idea of whether an input character is within a word. +We’ll discuss all of these in due course.

    +
    (20)
    +

    A +well-researched jeremiad appreciated by groff contributors on +both sides of the sentence-spacing debate can be found at +https://web.archive.org/web/20171217060354/http://www.heracliteanriver.com/?p=324.

    +
    (21)
    +

    This statement oversimplifies; there are +escape sequences whose purpose is precisely to produce glyphs on the +output device, and input characters that aren’t part of escape +sequences can undergo a great deal of processing before getting to the +output.

    +
    (22)
    +

    The mnemonics for the special +characters shown here are “dagger”, “double dagger”, “right +(double) quote”, and “closing (single) quote”. See the +groff_char(7) man page.

    +
    (23)
    +

    “Text lines” are defined in Requests and Macros.

    +
    (24)
    +

    “Tab” +is short for “tabulation”, revealing the term’s origin as a spacing +mechanism for table arrangement.

    +
    (25)
    +

    The \RET escape sequence can alter how an +input line is classified; see Line Continuation.

    +
    (26)
    +

    Argument handling in +macros is more flexible but also more complex. See Calling Macros.

    +
    (27)
    +

    Some escape sequences undergo +interpolation as well.

    +
    (28)
    +

    GNU troff offers additional ones. See Writing Macros.

    +
    (29)
    +

    Macro files and packages +frequently define registers and strings as well.

    +
    (30)
    +

    The +semantics of certain punctuation code points have gotten stricter +with the successive standards, a cause of some frustration among man +page writers; see the groff_char(7) man page.

    +
    (31)
    +

    The +DVI output device defaults to using the Computer Modern (CM) fonts; +ec.tmac loads the EC fonts instead, which provide Euro +‘\[Eu]’ and per mille ‘\[%0]’ glyphs.

    +
    (32)
    +

    Emacs: fill-column: 72; Vim: textwidth=72

    +
    (33)
    +

    groff does not yet support right-to-left +scripts.

    +
    (34)
    +

    groff’s terminal output devices have page +offsets of zero.

    +
    (35)
    +

    Provision is made for interpreting and +reporting decimal fractions in certain cases.

    +
    (36)
    +

    If that’s not enough, see the groff_tmac(5) +man page for the 62bit.tmac macro package.

    +
    (37)
    +

    See Conditionals and Loops.

    +
    (38)
    +

    Control structure syntax +creates an exception to this rule, but is designed to remain useful: +recalling our example, ‘.if 1 .Underline this’ would underline only +“this”, precisely. See Conditionals and Loops.

    +
    (39)
    +

    See Diversions.

    +
    (40)
    +

    Historically, control characters like +ASCII STX, ETX, and BEL (Control+B, Control+C, and +Control+G) have been observed in roff documents, +particularly in macro packages employing them as delimiters with the +output comparison operator to try to avoid collisions with the content +of arbitrary user-supplied parameters (see Operators in Conditionals). We discourage this expedient; in GNU troff it is +unnecessary (outside of compatibility mode) because delimited arguments +are parsed at a different input level than the surrounding context. +See Implementation Differences.

    +
    (41)
    +

    Consider what happens when a C1 control +0x800x9F is necessary as a continuation byte in a UTF-8 +sequence.

    +
    (42)
    +

    Recall Identifiers.

    +
    (43)
    +

    In compatibility +mode, a space is not necessary after a request or macro name of two +characters’ length. Also, Plan 9 troff allows tabs to +separate arguments.

    +
    (44)
    +

    \~ is fairly +portable; see Other Differences.

    +
    (45)
    +

    Strictly, you can neglect to +close the last quoted macro argument, relying on the end of the control +line to do so. We consider this lethargic practice poor style.

    +
    (46)
    +

    The omission of spaces before the comment +escape sequences is necessary; see Strings.

    +
    (47)
    +

    TeX does have such a mechanism.

    +
    (48)
    +

    This claim may be more aspirational than descriptive.

    +
    (49)
    +

    See Conditional Blocks.

    +
    (50)
    +

    Exception: auto-incrementing registers defined outside +the ignored region will be modified if interpolated with +\n± inside it. See Auto-increment.

    +
    (51)
    +

    A negative auto-increment can be +considered an “auto-decrement”.

    +
    (52)
    +

    GNU troff dynamically allocates memory for +as many registers as required.

    +
    (53)
    +

    unless diverted; see Diversions

    +
    (54)
    +

    See Line Continuation.

    +
    (55)
    +

    Recall Filling and Sentences for the +definitions of word and sentence boundaries, respectively.

    +
    (56)
    +

    Whether a perfect algorithm for this application is +even possible is an unsolved problem in computer science: +https://tug.org/docs/liang/liang-thesis.pdf.

    +
    (57)
    +

    \% itself stops marking +hyphenation points but still produces no output glyph.

    +
    (58)
    +

    “Soft” because it appears in output +only where a hyphenation break is performed; a “hard” hyphen, as in +“long-term”, always appears.

    +
    (59)
    +

    The mode is a vector of Booleans encoded as an integer. +To a programmer, this fact is easily deduced from the exclusive use of +powers of two for the configuration parameters; they are computationally +easy to “mask off” and compare to zero. To almost everyone else, the +arrangement seems recondite and unfriendly.

    +
    (60)
    +

    Hyphenation is +prevented if the next page location trap is closer to the vertical +drawing position than the next text baseline would be. See Page Location Traps.

    +
    (61)
    +

    For more on localization, see the +groff_tmac(5) man page.

    +
    (62)
    +

    See Page Location Traps.

    +
    (63)
    +

    See Drawing Geometric Objects.

    +
    (64)
    +

    or geometric objects; see Drawing Geometric Objects

    +
    (65)
    +

    to the top-level diversion; +see Diversions

    +
    (66)
    +

    Plan 9 troff +uses the register .S for this purpose.

    +
    (67)
    +

    This is pronounced to rhyme with “feeder”, and +refers to how the glyphs “lead” the eye across the page to the +corresponding page number or other datum.

    +
    (68)
    +

    A +GNU nroff program is available for convenience; it calls GNU +troff to perform the formatting.

    +
    (69)
    +

    Historically, the \c +escape sequence has proven challenging to characterize. Some sources +say it “connects the next input text” (to the input line on which it +appears); others describe it as “interrupting” text, on the grounds +that a text line is interrupted without breaking, perhaps to inject a +request invocation or macro call.

    +
    (70)
    +

    See Traps.

    +
    (71)
    +

    See Diversions.

    +
    (72)
    +

    Terminals and some output devices have fonts that render +at only one or two sizes. As examples of the latter, take the +groff lj4 device’s Lineprinter, and lbp’s Courier +and Elite faces.

    +
    (73)
    +

    Font designers prepare families such that the styles +share esthetic properties.

    +
    (74)
    +

    Historically, the fonts +troffs dealt with were not Free Software or, as with the Graphic +Systems C/A/T, did not even exist in the digital domain.

    +
    (75)
    +

    See Font Description File Format.

    +
    (76)
    +

    See DESC File Format.

    +
    (77)
    +

    Not all versions of the man program +support the -T option; use the subsequent example for an +alternative.

    +
    (78)
    +

    This is “Normalization Form D” +as documented in Unicode Standard Annex #15 +(https://unicode.org/reports/tr15/).

    +
    (79)
    +

    See Compatibility Mode.

    +
    (80)
    +

    Output glyphs +don’t—to GNU troff, a glyph is simply a box with an index into +a font, a given height above and depth below the baseline, and a width.

    +
    (81)
    +

    Opinions of this escape sequence’s name abound. +“Zero-width space” is a popular misnomer: roff formatters do +not treat it like a space. Ossanna called it a “non-printing, +zero-width character”, but the character causes output even +though it does not “print”. If no output line is pending, the dummy +character starts one. Contrast an empty input document with one +containing only \&. The former produces no output; the latter, a +blank page.

    +
    (82)
    +

    In text fonts, the tallest glyphs are typically +parentheses. Unfortunately, in many cases the actual dimensions of the +glyphs in a font do not closely match its declared type size! For +example, in the standard PostScript font families, 10-point Times sets +better with 9-point Helvetica and 11-point Courier than if all three +were used at 10 points.

    +
    (83)
    +

    Rhyme with “sledding”; mechanical typography +used lead metal (Latin plumbum).

    +
    (84)
    +

    The claim appears to have been true of Ossanna +troff for the C/A/T device; Kernighan made device-independent +troff more flexible.

    +
    (85)
    +

    See Device and Font Description Files.

    +
    (86)
    +

    also +known vulgarly as “ANSI colors”

    +
    (87)
    +

    See Copy Mode.

    +
    (88)
    +

    This refers to +vtroff, a translator that would convert the C/A/T output from +early-vintage AT&T troff to a form suitable for +Versatec and Benson-Varian plotters.

    +
    (89)
    +

    Strictly, letters not otherwise recognized are treated +as output comparison delimiters. For portability, it is wise to avoid +using letters not in the list above; for example, Plan 9 +troff uses ‘h’ to test a mode it calls htmlroff, and +GNU troff may provide additional operators in the future.

    +
    (90)
    +

    Because formatting of the comparands takes place +in a dummy environment, vertical motions within them cannot spring +traps.

    +
    (91)
    +

    All +of this is to say that the lists of output nodes created by formatting +xxx and yyy must be identical. See gtroff Internals.

    +
    (92)
    +

    This bizarre behavior maintains compatibility with +AT&T troff.

    +
    (93)
    +

    See while.

    +
    (94)
    +

    See Copy Mode.

    +
    (95)
    +

    unless you redefine it

    +
    (96)
    +

    “somewhat less” because +things other than macro calls can be on the input stack

    +
    (97)
    +

    See Copy Mode.

    +
    (98)
    +

    While it is possible to define and +call a macro ‘.’, you can’t use it as an end macro: during a macro +definition, ‘..’ is never handled as calling ‘.’, even if +‘.de name .’ explicitly precedes it.

    +
    (99)
    +

    Its structure is +adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to +the problem of reflowing text multiple times to find an optimal +configuration for it. +https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html

    +
    (100)
    +

    If they were not, +parameter interpolations would be similar to command-line +parameters—fixed for the entire duration of a roff program’s +run. The advantage of interpolating \$ escape sequences even in +copy mode is that they can interpolate different contents from one call +to the next, like function parameters in a procedural language. The +additional escape character is the price of this power.

    +
    (101)
    +

    Compare this to the \def and \edef +commands in TeX.

    +
    (102)
    +

    These are lightly adapted from the groff +implementation of the ms macros.

    +
    (103)
    +

    At the +grops defaults of 10-point type on 12-point vertical spacing, the +difference between half a vee and half an em can be subtle: large +spacings like ‘.vs .5i’ make it obvious.

    +
    (104)
    +

    See Strings, for an explanation of the trailing +‘\"’.

    +
    (105)
    +

    (hc, vc) is adjusted to the point nearest +the perpendicular bisector of the arc’s chord.

    +
    (106)
    +

    See The Implicit Page Trap.

    +
    (107)
    +

    A trap planted at ‘20i’ or +‘-30i’ will not be sprung on a page of length ‘11i’.

    +
    (108)
    +

    It may help to think of each trap location as +maintaining a queue; wh operates on the head of the queue, and +ch operates on its tail. Only the trap at the head of the queue +is visible.

    +
    (109)
    +

    See Debugging.

    +
    (110)
    +

    See Diversions.

    +
    (111)
    +

    While processing an +end-of-input macro, the formatter assumes that the next page break must +be the last; it goes into “sudden death overtime”.

    +
    (112)
    +

    Another, taken by the groff man macros, is +to intercept ne requests and wrap bp ones.

    +
    (113)
    +

    Thus, the “water” +gets “higher” proceeding down the page.

    +
    (114)
    +

    The backslash is doubled. See Copy Mode.

    +
    (115)
    +

    that is, ISO 646:1991-IRV or, +popularly, “US-ASCII”

    +
    (116)
    +

    They are bypassed because these parameters are not +rendered as glyphs in the output; instead, they remain abstract +characters—in a PDF bookmark or a URL, for example.

    +
    (117)
    +

    Recall Line Layout.

    +
    (118)
    +

    Historically, +tools named nrchbar and changebar were developed for +marking changes with margin characters and could be found in archives of +the comp.sources.unix USENET group. Some proprietary +Unices also offer(ed) a diffmk program.

    +
    (119)
    +

    Except the +escape sequences \f, \F, \H, \m, \M, +\R, \s, and \S, which are processed immediately if +not in copy mode.

    +
    (120)
    +

    The +Graphic Systems C/A/T phototypesetter (the original device target for +AT&T troff) supported only a few discrete type sizes +in the range 6–36 points, so Ossanna contrived a special case in the +parser to do what the user must have meant. Kernighan warned of this in +the 1992 revision of CSTR #54 (§2.3), and more recently, McIlroy +referred to it as a “living fossil”.

    +
    (121)
    +

    DWB 3.3, Solaris, Heirloom Doctools, and +Plan 9 troff all support it.

    +
    (122)
    +

    Naturally, if you’ve changed +the escape character, you need to prefix the e with whatever it +is—and you’ll likely get something other than a backslash in the +output.

    +
    (123)
    +

    The rs special character identifier was not +defined in AT&T troff’s font description files, but is +in those of its lineal descendant, Heirloom Doctools troff, as of +the latter’s 060716 release (July 2006).

    +
    (124)
    +

    The parser +and postprocessor for intermediate output can be found in the file
    +groff-source-dir/src/libs/libdriver/input.cpp.

    +
    (125)
    +

    Plan 9 troff has also abandoned the binary +format.

    +
    (126)
    +

    800-point type +is not practical for most purposes, but using it enables the quantities +in the font description files to be expressed as integers.

    +
    (127)
    +

    groff requests and escape sequences +interpret non-negative font names as mounting positions instead. +Further, a font named ‘0’ cannot be automatically mounted by the +fonts directive of a DESC file.

    +
    (128)
    +

    For typesetter devices, this directive is misnamed +since it starts a list of glyphs, not characters.

    +
    (129)
    +

    that is, any integer parsable by the C +standard library’s strtol(3) function

    +

    + + + + + + diff --git a/doc/groff.html.node/gtroff-Output.html b/doc/groff.html.node/gtroff-Output.html new file mode 100644 index 0000000..cab0daf --- /dev/null +++ b/doc/groff.html.node/gtroff-Output.html @@ -0,0 +1,100 @@ + + + + + + +gtroff Output (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    6.1 gtroff Output

    + + + +

    This section describes the groff intermediate output format +produced by GNU troff. +

    +

    As groff is a wrapper program around GNU troff and +automatically calls an output driver (or “postprocessor”), this output +does not show up normally. This is why it is called +intermediate. groff provides the option -Z to +inhibit postprocessing such that the produced intermediate output is +sent to standard output just as it is when calling GNU troff +directly. +

    + + + + +

    Here, the term troff output describes what is output by +GNU troff, while intermediate output refers to the language +that is accepted by the parser that prepares this output for the output +drivers. This parser handles whitespace more flexibly than +AT&T’s implementation and implements obsolete elements for +compatibility; otherwise, both formats are the same.124 +

    +

    The main purpose of the intermediate output concept is to facilitate the +development of postprocessors by providing a common programming +interface for all devices. It has a language of its own that is +completely different from the gtroff language. While the +gtroff language is a high-level programming language for text +processing, the intermediate output language is a kind of low-level +assembler language by specifying all positions on the page for writing +and drawing. +

    +

    The intermediate output produced by gtroff is fairly readable, +while output from AT&T troff is rather hard to +understand because of strange habits that are still supported, but not +used any longer by gtroff. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/if_002delse.html b/doc/groff.html.node/if_002delse.html new file mode 100644 index 0000000..3c67fa9 --- /dev/null +++ b/doc/groff.html.node/if_002delse.html @@ -0,0 +1,97 @@ + + + + + + +if-else (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23.3 if-else

    + + +
    +
    Request: .ie cond-expr anything
    +
    +
    Request: .el anything
    +
    +

    Use the ie and el requests to write an if-then-else. The +first request is the “if” part and the latter is the “else” part. +Unusually among programming languages, any number of non-conditional +requests may be interposed between the ie branch and the +el branch. +

    +
    +
    .nr a 0
    +.ie \na a is non-zero.
    +.nr a +1
    +.el a was not positive but is now \na.
    +    ⇒ a was not positive but is now 1.
    +
    + +

    Another way in which el is an ordinary request is that it does +not lexically “bind” more tightly to its ie counterpart than it +does to any other request. This fact can surprise C programmers. +

    +
    +
    .nr a 1
    +.nr z 0
    +.ie \nz \
    +.  ie \na a is true
    +.  el     a is false
    +.el z is false
    +    error→ warning: unbalanced 'el' request
    +    ⇒ a is false
    +
    + +

    To conveniently nest conditionals, keep reading. +

    +
    + + +
    + + + + + diff --git a/doc/groff.html.node/if_002dthen.html b/doc/groff.html.node/if_002dthen.html new file mode 100644 index 0000000..e2fba2b --- /dev/null +++ b/doc/groff.html.node/if_002dthen.html @@ -0,0 +1,111 @@ + + + + + + +if-then (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23.2 if-then

    + + +
    +
    Request: .if cond-expr anything
    +
    +

    Evaluate the conditional expression cond-expr, and if it evaluates +true (or to a positive value), interpret the remainder of the line +anything as if it were an input line. Recall from Invoking Requests that any quantity of spaces between arguments to requests +serves only to separate them; leading spaces in anything are thus +not seen. anything effectively cannot be omitted; if +cond-expr is true and anything is empty, the newline at the +end of the control line is interpreted as a blank input line (and +therefore a blank text line). +

    +
    +
    super\c
    +tanker
    +.nr force-word-break 1
    +super\c
    +.if ((\n[force-word-break] = 1) & \n[.int])
    +tanker
    +    ⇒ supertanker super tanker
    +
    +
    + +
    +
    Request: .nop anything
    +
    +

    Interpret anything as if it were an input line. This is similar +to ‘.if 1’. nop is not really “no operation”; its +argument is processed—unconditionally. It can be used to cause +text lines to share indentation with surrounding control lines. +

    +
    +
    .als real-MAC MAC
    +.de wrapped-MAC
    +.  tm MAC: called with arguments \\$@
    +.  nop \\*[real-MAC]\\
    +..
    +.als MAC wrapped-MAC
    +\# Later...
    +.als MAC real-MAC
    +
    + +

    In the above, we’ve used aliasing, nop, and the interpolation of +a macro as a string to interpose a wrapper around the macro ‘MAC’ +(perhaps to debug it). +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/index.html b/doc/groff.html.node/index.html new file mode 100644 index 0000000..d1b9973 --- /dev/null +++ b/doc/groff.html.node/index.html @@ -0,0 +1,453 @@ + + + + + + +Top (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    GNU troff

    + + +

    This manual documents GNU troff version 1.23.0. +

    +

    Copyright © 1994–2023 Free Software Foundation, Inc. +

    +
    +

    Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A +copy of the license is included in the section entitled “GNU Free +Documentation License”. +

    + + + + + +
    +

    Table of Contents

    + +
    + + +
    +
    +
    +
    + + + + + + diff --git a/doc/groff.html.node/man.html b/doc/groff.html.node/man.html new file mode 100644 index 0000000..93ec854 --- /dev/null +++ b/doc/groff.html.node/man.html @@ -0,0 +1,71 @@ + + + + + + +man (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.1 man

    + + + + + +

    The man macro package is the most widely used and probably the +most important ever developed for troff. It is easy to use, and +a vast majority of manual pages (“man pages”) are written in it. +

    +

    groff’s implementation is documented in the +groff_man(7) man page. Type ‘man groff_man’ at the +command line to view it. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/mdoc.html b/doc/groff.html.node/mdoc.html new file mode 100644 index 0000000..d752098 --- /dev/null +++ b/doc/groff.html.node/mdoc.html @@ -0,0 +1,61 @@ + + + + + + +mdoc (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.2 mdoc

    + + +

    groff’s implementation of the BSD doc package for man +pages is documented in the groff_mdoc(7) man page. Type +‘man groff_mdoc’ at the command line to view it. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/me.html b/doc/groff.html.node/me.html new file mode 100644 index 0000000..35da9f2 --- /dev/null +++ b/doc/groff.html.node/me.html @@ -0,0 +1,67 @@ + + + + + + +me (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.3 me

    + + +

    groff’s implementation of the BSD me macro package is +documented using itself. A tutorial, meintro.me, and reference, +meref.me, are available in groff’s documentation +directory. A groff_me(7) man page is also available and +identifies the installation path for these documents. Type ‘man +groff_me’ at the command line to view it. +

    +

    A French translation of the tutorial is available as +meintro_fr.me and installed parallel to the English version. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/mm.html b/doc/groff.html.node/mm.html new file mode 100644 index 0000000..38dc3b9 --- /dev/null +++ b/doc/groff.html.node/mm.html @@ -0,0 +1,64 @@ + + + + + + +mm (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.4 mm

    + + +

    groff’s implementation of the AT&T memorandum macro +package is documented in the groff_mm(7) man page. Type +‘man groff_mm’ at the command line) to view it. +

    +

    A Swedish localization of mm is also available; see +groff_mmse(7). +

    + + +
    + + + + + diff --git a/doc/groff.html.node/mom.html b/doc/groff.html.node/mom.html new file mode 100644 index 0000000..6d0840d --- /dev/null +++ b/doc/groff.html.node/mom.html @@ -0,0 +1,85 @@ + + + + + + +mom (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.5 mom

    + + +

    The main documentation files for the mom macros are in +HTML format. Additional, useful documentation is in +PDF format. See the groff(1) man page, section +“Installation Directories”, for their location. +

    +
      +
    • toc.html +Entry point to the full mom manual. + +
    • macrolist.html +Hyperlinked index of macros with brief descriptions, arranged by +category. + +
    • mom-pdf.pdf +PDF features and usage. +
    + +

    The mom macros are in active development between groff releases. +The most recent version, along with up-to-date documentation, is +available at http://www.schaffter.ca/mom/mom-05.html. +

    +

    The groff_mom(7) man page (type ‘man groff_mom’ at +the command line) contains a partial list of available macros, however +their usage is best understood by consulting the HTML +documentation. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/ms-Body-Text.html b/doc/groff.html.node/ms-Body-Text.html new file mode 100644 index 0000000..f2d370b --- /dev/null +++ b/doc/groff.html.node/ms-Body-Text.html @@ -0,0 +1,70 @@ + + + + + + +ms Body Text (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5 Body Text

    + + +

    A variety of macros, registers, and strings can be used to structure and +style the body of your document. They organize your text into +paragraphs, headings, footnotes, and inclusions of material such as +tables and figures. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/ms-Document-Control-Settings.html b/doc/groff.html.node/ms-Document-Control-Settings.html new file mode 100644 index 0000000..ef8f2a4 --- /dev/null +++ b/doc/groff.html.node/ms-Document-Control-Settings.html @@ -0,0 +1,524 @@ + + + + + + +ms Document Control Settings (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.3 Document Control Settings

    + + +

    ms exposes many aspects of document layout to user control via +groff requests. To use them, you must understand how to define +registers and strings. +

    +
    +
    Request: .nr reg value
    +
    +

    Set register reg to value. If reg doesn’t exist, GNU +troff creates it. +

    + +
    +
    Request: .ds name contents
    +
    +

    Set string name to contents. +

    + +

    A list of document control registers and strings follows. For any +parameter whose default is unsatisfactory, define its register or string +before calling any ms macro other than RP. +

    + +
    +

    Margin settings

    + +
    +
    Register: \n[PO]
    +
    +

    Defines the page offset (i.e., the left margin). +

    +

    Effective: next page. +

    +

    Default: Varies by output device and paper format; 1i is used for +typesetters using U.S. letter paper, and zero for terminals. +See Paper Format. +

    + +
    +
    Register: \n[LL]
    +
    +

    Defines the line length (i.e., the width of the body text). +

    +

    Effective: next paragraph. +

    +

    Default: Varies by output device and paper format; 6.5i is used +for typesetters using U.S. letter paper (see Paper Format) and +65n on terminals. +

    + +
    +
    Register: \n[LT]
    +
    +

    Defines the title line length (i.e., the header and footer width). This +is usually the same as LL, but need not be. +

    +

    Effective: next paragraph. +

    +

    Default: Varies by output device and paper format; 6.5i is used +for typesetters using U.S. letter paper (see Paper Format) and +65n on terminals. +

    + +
    +
    Register: \n[HM]
    +
    +

    Defines the header margin height at the top of the page. +

    +

    Effective: next page. +

    +

    Default: 1i. +

    + +
    +
    Register: \n[FM]
    +
    +

    Defines the footer margin height at the bottom of the page. +

    +

    Effective: next page. +

    +

    Default: 1i. +

    + +
    +
    +

    Titles (headers, footers)

    + +
    +
    String: \*[LH]
    +
    +

    Defines the text displayed in the left header position. +

    +

    Effective: next header. +

    +

    Default: empty. +

    + +
    +
    String: \*[CH]
    +
    +

    Defines the text displayed in the center header position. +

    +

    Effective: next header. +

    +

    Default: ‘-\n[%]-’. +

    + +
    +
    String: \*[RH]
    +
    +

    Defines the text displayed in the right header position. +

    +

    Effective: next header. +

    +

    Default: empty. +

    + +
    +
    String: \*[LF]
    +
    +

    Defines the text displayed in the left footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    String: \*[CF]
    +
    +

    Defines the text displayed in the center footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    String: \*[RF]
    +
    +

    Defines the text displayed in the right footer position. +

    +

    Effective: next footer. +

    +

    Default: empty. +

    + +
    +
    +

    Text settings

    + +
    +
    Register: \n[PS]
    +
    +

    Defines the type size of the body text. +

    +

    Effective: next paragraph. +

    +

    Default: 10p. +

    + +
    +
    Register: \n[VS]
    +
    +

    Defines the vertical spacing (type size plus leading). +

    +

    Effective: next paragraph. +

    +

    Default: 12p. +

    + +
    +
    Register: \n[HY]
    +
    +

    Defines the automatic hyphenation mode used with the hy request. +Setting HY to 0 is equivalent to using the nh +request. This is a Tenth Edition Research Unix extension. +

    +

    Effective: next paragraph. +

    +

    Default: 6. +

    + +
    +
    String: \*[FAM]
    +
    +

    Defines the font family used to typeset the document. This is a GNU +extension. +

    +

    Effective: next paragraph. +

    +

    Default: defined by the output device; often ‘T’ (see Body Text) +

    + +
    +
    +

    Paragraph settings

    + +
    +
    Register: \n[PI]
    +
    +

    Defines the indentation amount used by the PP, IP (unless +overridden by an optional argument), XP, and RS macros. +

    +

    Effective: next paragraph. +

    +

    Default: 5n. +

    + +
    +
    Register: \n[PD]
    +
    +

    Defines the space between paragraphs. +

    +

    Effective: next paragraph. +

    +

    Default: 0.3v (1v on low-resolution devices). +

    + +
    +
    Register: \n[QI]
    +
    +

    Defines the indentation amount used on both sides of a paragraph set +with the QP or between the QS and QE macros. +

    +

    Effective: next paragraph. +

    +

    Default: 5n. +

    + +
    +
    Register: \n[PORPHANS]
    +
    +

    Defines the minimum number of initial lines of any paragraph that must +be kept together to avoid isolated lines at the bottom of a page. If a +new paragraph is started close to the bottom of a page, and there is +insufficient space to accommodate PORPHANS lines before an +automatic page break, then a page break is forced before the start of +the paragraph. This is a GNU extension. +

    +

    Effective: next paragraph. +

    +

    Default: 1. +

    + +
    +
    +

    Heading settings

    + +
    +
    Register: \n[PSINCR]
    +
    +

    Defines an increment in type size to be applied to a heading at a +lesser depth than that specified in GROWPS. The value of +PSINCR should be specified in points with the p scaling +unit and may include a fractional component; for example, ‘.nr PSINCR 1.5p sets a type size increment of 1.5p. This is a GNU +extension. +

    +

    Effective: next heading. +

    +

    Default: 1p. +

    + +
    +
    Register: \n[GROWPS]
    +
    +

    Defines the heading depth above which the type size increment set by +PSINCR becomes effective. For each heading depth less than the +value of GROWPS, the type size is increased by PSINCR. +Setting GROWPS to any value less than 2 disables the +incremental heading size feature. This is a GNU extension. +

    +

    Effective: next heading. +

    +

    Default: 0. +

    + +
    +
    Register: \n[HORPHANS]
    +
    +

    Defines the minimum number of lines of an immediately succeeding +paragraph that should be kept together with any heading introduced by +the NH or SH macros. If a heading is placed close to the +bottom of a page, and there is insufficient space to accommodate both +the heading and at least HORPHANS lines of the following +paragraph, before an automatic page break, then the page break is forced +before the heading. This is a GNU extension. +

    +

    Effective: next paragraph. +

    +

    Default: 1. +

    + +
    +
    String: \*[SN-STYLE]
    +
    +

    Defines the style used to print numbered headings. See Headings. This is a GNU extension. +

    +

    Effective: next heading. +

    +

    Default: alias of SN-DOT +

    + +
    +
    +

    Footnote settings

    + +
    +
    Register: \n[FI]
    +
    +

    Defines the footnote indentation. This is a Berkeley extension. +

    +

    Effective: next footnote. +

    +

    Default: 2n. +

    + +
    +
    Register: \n[FF]
    +
    +

    Defines the format of automatically numbered footnotes, +and those for which the FS request is given a marker argument, at +the bottom of a column or page. This is a Berkeley extension. +

    +
    0
    +

    Set an automatic number8 as a +superscript (on typesetter devices) or surrounded by square brackets (on +terminals). The footnote paragraph is indented as with PP if +there is an FS argument or an automatic number, and as with +LP otherwise. This is the default. +

    +
    +
    1
    +

    As 0, but set the marker as regular text and follow an +automatic number with a period. +

    +
    +
    2
    +

    As 1, but without indentation (like LP). +

    +
    +
    3
    +

    As 1, but set the footnote paragraph with the marker hanging +(like IP). +

    +
    + +

    Effective: next footnote. +

    +

    Default: 0. +

    + +
    +
    Register: \n[FPS]
    +
    +

    Defines the footnote type size. +

    +

    Effective: next footnote. +

    +

    Default: \n[PS] - 2p. +

    + +
    +
    Register: \n[FVS]
    +
    +

    Defines the footnote vertical spacing. +

    +

    Effective: next footnote. +

    +

    Default: \n[FPS] + 2p. +

    + +
    +
    Register: \n[FPD]
    +
    +

    Defines the footnote paragraph spacing. This is a GNU extension. +

    +

    Effective: next footnote. +

    +

    Default: \n[PD] / 2. +

    + +
    +
    String: \*[FR]
    +
    +

    Defines the ratio of the footnote line length to the current line +length. This is a GNU extension. +

    +

    Effective: next footnote in single-column arrangements, next page +otherwise. +

    +

    Default: 11/12. +

    + +
    +
    +

    Display settings

    + +
    +
    Register: \n[DD]
    +
    +

    Sets the display distance—the vertical spacing before and after a +display, a tbl table, an eqn equation, or a pic +image. This is a Berkeley extension. +

    +

    Effective: next display boundary. +

    +

    Default: 0.5v (1v on low-resolution devices). +

    + +
    +
    Register: \n[DI]
    +
    +

    Sets the default amount by which to indent a display started with +DS and ID without arguments, to ‘.DS I’ without +an indentation argument, and to equations set with ‘.EQ I’. +This is a GNU extension. +

    +

    Effective: next indented display. +

    +

    Default: 0.5i. +

    + +
    +
    +

    Other settings

    + +
    +
    Register: \n[MINGW]
    +
    +

    Defines the default minimum width between columns in a multi-column +document. This is a GNU extension. +

    +

    Effective: next page. +

    +

    Default: 2n. +

    + +
    +
    Register: \n[TC-MARGIN]
    +
    +

    Defines the width of the field in which page numbers are set in a table +of contents entry; the right margin thus moves inboard by this amount. +This is a GNU extension. +

    +

    Effective: next PX call. +

    +

    Default: \w'000' +

    + + + +
    +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Document-Description-Macros.html b/doc/groff.html.node/ms-Document-Description-Macros.html new file mode 100644 index 0000000..4801e47 --- /dev/null +++ b/doc/groff.html.node/ms-Document-Description-Macros.html @@ -0,0 +1,189 @@ + + + + + + +ms Document Description Macros (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.4 Document Description Macros

    + + + +

    Only the simplest document lacks a title.9 As its level of sophistication (or +complexity) increases, it tends to acquire a date of revision, +explicitly identified authors, sponsoring institutions for authors, and, +at the rarefied heights, an abstract of its content. Define these +data by calling the macros below in the order shown; DA or +ND can be called to set the document date (or other identifier) +at any time before (a) the abstract, if present, or (b) its information +is required in a header or footer. Use of these macros is optional, +except that TL is mandatory if any of RP, AU, +AI, or AB is called, and AE is mandatory if +AB is called. +

    +
    +
    Macro: .RP [no-repeat-info] [no-renumber]
    +
    +

    Use the “report” (AT&T: “released paper”) format for your +document, creating a separate cover page. The default arrangement is to +place most of the document description (title, author names and +institutions, and abstract, but not the date) at the top of the first +page. If the optional no-repeat-info argument is given, +ms produces a cover page but does not repeat any of its +information subsequently (but see the DA macro below regarding +the date). Normally, RP sets the page number following the cover +page to 1. Specifying the optional no-renumber argument +suppresses this alteration. Optional arguments can occur in any order. +no is recognized as a synonym of no-repeat-info for +AT&T compatibility. +

    + +
    +
    Macro: .TL
    +
    +

    Specify the document title. ms collects text on input lines +following this call into the title until reaching AU, AB, +or a heading or paragraphing macro call. +

    + +
    +
    Macro: .AU
    +
    +

    Specify an author’s name. ms collects text on input lines +following this call into the author’s name until reaching AI, +AB, another AU, or a heading or paragraphing macro call. +Call it repeatedly to specify multiple authors. +

    + +
    +
    Macro: .AI
    +
    +

    Specify the preceding author’s institution. An AU call is +usefully followed by at most one AI call; if there are more, the +last AI call controls. ms collects text on input lines +following this call into the author’s institution until reaching +AU, AB, or a heading or paragraphing macro call. +

    + +
    +
    Macro: .DA [x …]
    +
    +

    Typeset the current date, or any arguments x, in the center +footer, and, if RP is also called, left-aligned at the end of the +description information on the cover page. +

    + +
    +
    Macro: .ND [x …]
    +
    +

    Typeset the current date, or any arguments x, if RP is also +called, left-aligned at the end of the document description on the cover +page. This is groff ms’s default. +

    + +
    +
    Macro: .AB [no]
    +
    +

    Begin the abstract. ms collects text on input lines following +this call into the abstract until reaching an AE call. By +default, ms places the word “ABSTRACT” centered and in italics +above the text of the abstract. The optional argument no +suppresses this heading. +

    + +
    +
    Macro: .AE
    +
    +

    End the abstract. +

    + +

    An example document description, using a cover page, follows. + + +

    +
    +
    +
    .RP
    +.TL
    +The Inevitability of Code Bloat
    +in Commercial and Free Software
    +.AU
    +J.\& Random Luser
    +.AI
    +University of West Bumblefuzz
    +.AB
    +This report examines the long-term growth of the code
    +bases in two large,
    +popular software packages;
    +the free Emacs and the commercial Microsoft Word.
    +While differences appear in the type or order of
    +features added,
    +due to the different methodologies used,
    +the results are the same in the end.
    +.PP
    +The free software approach is shown to be superior in
    +that while free software can become as bloated as
    +commercial offerings,
    +free software tends to have fewer serious bugs and the
    +added features are more in line with user demand.
    +.AE
    +
    +…the rest of the paper…
    +
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Document-Structure.html b/doc/groff.html.node/ms-Document-Structure.html new file mode 100644 index 0000000..de4be0e --- /dev/null +++ b/doc/groff.html.node/ms-Document-Structure.html @@ -0,0 +1,106 @@ + + + + + + +ms Document Structure (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.2 Document Structure

    + + +

    The ms macro package expects a certain amount of structure: +a well-formed document contains at least one paragraphing or heading +macro call. Longer documents have a structure as follows. +

    +
    +
    Document type
    +

    Calling the RP macro at the beginning of your document puts the +document description (see below) on a cover page. Otherwise, ms +places the information (if any) on the first page, followed immediately +by the body text. Some document types found in other ms +implementations are specific to AT&T or Berkeley, and are not +supported by groff ms. +

    +
    +
    Format and layout
    +

    By setting registers and strings, you can configure your document’s +typeface, margins, spacing, headers and footers, and footnote +arrangement. See Document Control Settings. +

    +
    +
    Document description
    +

    A document description consists of any of: a title, one or more authors’ +names and affiliated institutions, an abstract, and a date or other +identifier. See Document Description Macros. +

    +
    +
    Body text
    +

    The main matter of your document follows its description (if any). +ms supports highly structured text consisting of paragraphs +interspersed with multi-level headings (chapters, sections, subsections, +and so forth) and augmented by lists, footnotes, tables, diagrams, and +similar material. See Body Text. +

    +
    +
    Tables of contents
    +

    Macros enable the collection of entries for a table of contents (or +index) as the material they discuss appears in the document. You then +call a macro to emit the table of contents at the end of your document. +The table of contents must necessarily follow the rest of the text since +GNU troff is a single-pass formatter; it thus cannot determine +the page number of a division of the text until it has been set and +output. Since ms was designed for the production of hard copy, +the traditional procedure was to manually relocate the pages containing +the table of contents between the cover page and the body text. Today, +page resequencing is more often done in the digital domain. An index +works similarly, but because it typically needs to be sorted after +collection, its preparation requires separate processing. +

    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Footnotes.html b/doc/groff.html.node/ms-Footnotes.html new file mode 100644 index 0000000..8c5f1f5 --- /dev/null +++ b/doc/groff.html.node/ms-Footnotes.html @@ -0,0 +1,155 @@ + + + + + + +ms Footnotes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.10 Footnotes

    + + + + + +

    A footnote is typically anchored to a place in the text with a +marker, which is a small integer, a symbol such as a dagger, or +arbitrary user-specified text. +

    +
    +
    String: \*[*]
    +
    +

    Place an automatic number, an automatically generated numeric +footnote marker, in the text. Each time this string is interpolated, +the number it produces increments by one. Automatic numbers start at 1. +This is a Berkeley extension. +

    + +

    Enclose the footnote text in FS and FE macro calls to set +it at the nearest available “foot”, or bottom, of a text column or +page. +

    +
    +
    Macro: .FS [marker]
    +
    +
    Macro: .FE
    +
    +

    Begin (FS) and end (FE) a footnote. FS calls +FS-MARK with any supplied marker argument, which is then +also placed at the beginning of the footnote text. If marker is +omitted, the next pending automatic footnote number enqueued by +interpolation of the * string is used, and if none exists, +nothing is prefixed. +

    + +

    You may not desire automatically numbered footnotes in spite of their +convenience. You can indicate a footnote with a symbol or other text by +specifying its marker at the appropriate place (for example, by using +\[dg] for the dagger glyph) and as an argument to the +FS macro. Such manual marks should be repeated as arguments to +FS or as part of the footnote text to disambiguate their +correspondence. You may wish to use \*{ and \*} to +superscript the marker at the anchor point, in the footnote text, or +both. +

    +

    groff ms provides a hook macro, FS-MARK, for +user-determined operations to be performed when the FS macro is +called. It is passed the same arguments as FS itself. An +application of FS-MARK is anchor placement for a hyperlink +reference, so that a footnote can link back to its referential +context.11 By default, this macro has an empty definition. +FS-MARK is a GNU extension. +

    + + + + +

    Footnotes can be safely used within keeps and displays, but you should +avoid using automatically numbered footnotes within floating keeps. You +can place a second \** interpolation between a \** and its +corresponding FS call as long as each FS call occurs +after the corresponding \** and occurrences of FS +are in the same order as corresponding occurrences of \**. +

    +

    Footnote text is formatted as paragraphs are, using analogous +parameters. The registers FI, FPD, FPS, and +FVS correspond to PI, PD, PS, and CS, +respectively; FPD, FPS, and FVS are GNU extensions. +

    +

    The FF register controls the formatting of automatically numbered +footnote paragraphs and those for which FS is given a marker +argument. See Document Control Settings. +

    +

    The default footnote line length is 11/12ths of the normal line length +for compatibility with the expectations of historical ms +documents; you may wish to set the FR string to ‘1’ to align +with contemporary typesetting practices. In the +past,12 an FL register +was used for the line length in footnotes; however, setting this +register at document initialization time had no effect on the footnote +line length in multi-column arrangements.13 +

    +

    FR should be used in preference to the old FL register in +contemporary documents. The footnote line length is effectively +computed as ‘column-width * \*[FR]’. If an absolute +footnote line length is required, recall that arithmetic expressions in +roff input are evaluated strictly from left to right, with no +operator precedence (parentheses are honored). +

    +
    +
    .ds FR 0+3i \" Set footnote line length to 3 inches.
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Headers-and-Footers.html b/doc/groff.html.node/ms-Headers-and-Footers.html new file mode 100644 index 0000000..472f19c --- /dev/null +++ b/doc/groff.html.node/ms-Headers-and-Footers.html @@ -0,0 +1,122 @@ + + + + + + +ms Headers and Footers (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6.1 Headers and footers

    + + + + + +

    There are multiple ways to produce headers and footers. One is to +define the strings LH, CH, and RH to set the left, +center, and right headers, respectively; and LF, CF, and +RF to set the left, center, and right footers. This approach +suffices for documents that do not distinguish odd- and even-numbered +pages. +

    +

    Another method is to call macros that set headers or footers for odd- or +even-numbered pages. Each such macro takes a delimited argument +separating the left, center, and right header or footer texts from each +other. You can replace the neutral apostrophes (') shown below +with any character not appearing in the header or footer text. These +macros are Berkeley extensions. +

    +
    +
    Macro: .OH 'left'center'right'
    +
    +
    Macro: .EH 'left'center'right'
    +
    +
    Macro: .OF 'left'center'right'
    +
    +
    Macro: .EF 'left'center'right'
    +
    +

    The OH and EH macros define headers for odd- (recto) +and even-numbered (verso) pages, respectively; the OF and +EF macros define footers for them. +

    + +

    With either method, a percent sign % in header or footer text is +replaced by the current page number. By default, ms places no +header on a page numbered “1” (regardless of its number format). +

    +
    +
    Macro: .P1
    +
    +

    Typeset the header even on page 1. To be effective, this macro +must be called before the header trap is sprung on any page numbered +“1”; in practice, unless your page numbering is unusual, this means +that you should call it early, before TL or any heading or +paragraphing macro. This is a Berkeley extension. +

    + +

    For even greater flexibility, ms is designed to permit the +redefinition of the macros that are called when the groff traps +that ordinarily cause the headers and footers to be output are sprung. +PT (“page trap”) is called by ms when the header is to +be written, and BT (“bottom trap”) when the footer is to be. +The groff page location trap that ms sets up to format the +header also calls the (normally undefined) HD macro after +PT; you can define HD if you need additional processing +after setting the header (for example, to draw a line below it). +The HD hook is a Berkeley extension. Any such macros you +(re)define must implement any desired specialization for odd-, even-, or +first numbered pages. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Insertions.html b/doc/groff.html.node/ms-Insertions.html new file mode 100644 index 0000000..bb58a90 --- /dev/null +++ b/doc/groff.html.node/ms-Insertions.html @@ -0,0 +1,181 @@ + + + + + + +ms Insertions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.9 Tables, figures, equations, and references

    + + + + + + + + + +

    The ms package is often used with the tbl, pic, +eqn, and refer preprocessors. + + + + +Mark text meant for preprocessors by enclosing it in pairs of tokens +as follows, with nothing between the dot and the macro name. The +preprocessors match these tokens only at the start of an input line. +

    +
    +
    Macro: .TS [H]
    +
    +
    Macro: .TE
    +
    +

    Demarcate a table to be processed by the tbl preprocessor. The +optional argument H to TS instructs ms to +repeat table rows (often column headings) at the top of each new page +the table spans, if applicable; calling the TH macro marks the +end of such rows. The GNU tbl(1) man page provides a +comprehensive reference to the preprocessor and offers examples of its +use. +

    + +
    +
    Macro: .PS
    +
    +
    Macro: .PE
    +
    +
    Macro: .PF
    +
    +

    PS begins a picture to be processed by the gpic +preprocessor; either of PE or PF ends it, the latter with +“flyback” to the vertical position at its top. You can create +pic input manually or with a program such as xfig. +

    + +
    +
    Macro: .EQ [align [label]]
    +
    +
    Macro: .EN
    +
    +

    Demarcate an equation to be processed by the eqn preprocessor. +The equation is centered by default; align can be ‘C’, +‘L’, or ‘I’ to (explicitly) center, left-align, or indent it +by the amount stored in the DI register, respectively. If +specified, label is set right-aligned. +

    + +
    +
    Macro: .[
    +
    +
    Macro: .]
    +
    +

    Demarcate a bibliographic citation to be processed by the refer +preprocessor. The GNU refer(1) man page provides a +comprehensive reference to the preprocessor and the format of its +bibliographic database. Type ‘man refer’ at the command line to +view it. +

    + +

    When refer emits collected references (as might be done on a +“Works Cited” page), it interpolates the REFERENCES string as +an unnumbered heading (SH). +

    + + +

    The following is an example of how to set up a table that may print +across two or more pages. +

    +
    +
    +
    .TS H
    +allbox;
    +Cb | Cb .
    +Part→Description
    +_
    +.TH
    +.T&
    +GH-1978→Fribulating gonkulator
    +…the rest of the table follows…
    +.TE
    +
    +
    + +

    Attempting to place a multi-page table inside a keep can lead to +unpleasant results, particularly if the tbl allbox option +is used. +

    + +

    Mathematics can be typeset using the language of the eqn +preprocessor. +

    +
    +
    +
    .EQ C (\*[SN-NO-DOT]a)
    +p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) }
    +.EN
    +
    +
    + +

    This input formats a labelled equation. We used the SN-NO-DOT +string to base the equation label on the current heading number, giving +us more flexibility to reorganize the document. +

    +

    Use groff options to run preprocessors on the input: +-e for geqn, -p for gpic, +-R for grefer, and -t for gtbl. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Introduction.html b/doc/groff.html.node/ms-Introduction.html new file mode 100644 index 0000000..4069ac7 --- /dev/null +++ b/doc/groff.html.node/ms-Introduction.html @@ -0,0 +1,60 @@ + + + + + + +ms Introduction (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.1 Introduction

    + +

    The ms macros are the oldest surviving package for roff +systems.7 While the man +package was designed for brief reference documents, the ms macros +are also suitable for longer works intended for printing and possible +publication. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/ms-Legacy-Features.html b/doc/groff.html.node/ms-Legacy-Features.html new file mode 100644 index 0000000..2f24f41 --- /dev/null +++ b/doc/groff.html.node/ms-Legacy-Features.html @@ -0,0 +1,285 @@ + + + + + + +ms Legacy Features (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.8 Legacy Features

    + + + + + + + +

    groff ms retains some legacy features solely to support +formatting of historical documents; contemporary ones should not use +them because they can render poorly. See the groff_char(7) +man page. +

    + +
    +

    AT&T accent mark strings

    + +

    AT&T ms defined accent mark strings as follows. +

    +
    +
    String: \*[']
    +
    +

    Apply acute accent to subsequent glyph. +

    + +
    +
    String: \*[`]
    +
    +

    Apply grave accent to subsequent glyph. +

    + +
    +
    String: \*[:]
    +
    +

    Apply dieresis (umlaut) to subsequent glyph. +

    + +
    +
    String: \*[^]
    +
    +

    Apply circumflex accent to subsequent glyph. +

    + +
    +
    String: \*[~]
    +
    +

    Apply tilde accent to subsequent glyph. +

    + +
    +
    String: \*[C]
    +
    +

    Apply caron to subsequent glyph. +

    + +
    +
    String: \*[,]
    +
    +

    Apply cedilla to subsequent glyph. +

    + +
    +
    +

    Berkeley accent mark and glyph strings

    + +

    Berkeley ms offered an AM macro; calling it redefined the +AT&T accent mark strings (except for ‘\*C’), applied them to the +preceding glyph, and defined additional strings, some for spacing +glyphs. +

    +
    +
    Macro: .AM
    +
    +

    Enable alternative accent mark and glyph-producing strings. +

    + +
    +
    String: \*[']
    +
    +

    Apply acute accent to preceding glyph. +

    + +
    +
    String: \*[`]
    +
    +

    Apply grave accent to preceding glyph. +

    + +
    +
    String: \*[:]
    +
    +

    Apply dieresis (umlaut) to preceding glyph. +

    + +
    +
    String: \*[^]
    +
    +

    Apply circumflex accent to preceding glyph. +

    + +
    +
    String: \*[~]
    +
    +

    Apply tilde accent to preceding glyph. +

    + +
    +
    String: \*[,]
    +
    +

    Apply cedilla to preceding glyph. +

    + +
    +
    String: \*[/]
    +
    +

    Apply stroke (slash) to preceding glyph. +

    + +
    +
    String: \*[v]
    +
    +

    Apply caron to preceding glyph. +

    + +
    +
    String: \*[_]
    +
    +

    Apply macron to preceding glyph. +

    + +
    +
    String: \*[.]
    +
    +

    Apply underdot to preceding glyph. +

    + +
    +
    String: \*[o]
    +
    +

    Apply ring accent to preceding glyph. +

    + +
    +
    String: \*[?]
    +
    +

    Interpolate inverted question mark. +

    + +
    +
    String: \*[!]
    +
    +

    Interpolate inverted exclamation mark. +

    + +
    +
    String: \*[8]
    +
    +

    Interpolate small letter sharp s. +

    + +
    +
    String: \*[q]
    +
    +

    Interpolate small letter o with hook accent (ogonek). +

    + +
    +
    String: \*[3]
    +
    +

    Interpolate small letter yogh. +

    + +
    +
    String: \*[d-]
    +
    +

    Interpolate small letter eth. +

    + +
    +
    String: \*[D-]
    +
    +

    Interpolate capital letter eth. +

    + +
    +
    String: \*[th]
    +
    +

    Interpolate small letter thorn. +

    + +
    +
    String: \*[Th]
    +
    +

    Interpolate capital letter thorn. +

    + +
    +
    String: \*[ae]
    +
    +

    Interpolate small æ ligature. +

    + +
    +
    String: \*[Ae]
    +
    +

    Interpolate capital Æ ligature. +

    + +
    +
    String: \*[oe]
    +
    +

    Interpolate small oe ligature. +

    + +
    +
    String: \*[OE]
    +
    +

    Interpolate capital OE ligature. +

    + + +
    +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-Margins.html b/doc/groff.html.node/ms-Margins.html new file mode 100644 index 0000000..f47f698 --- /dev/null +++ b/doc/groff.html.node/ms-Margins.html @@ -0,0 +1,56 @@ + + + + + + +ms Margins (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6.3 Margins

    + + +

    Control margins using the registers summarized in “Margin settings” in +Document Control Settings above. There is no setting for the +right margin; the combination of page offset \n[PO] and line +length \n[LL] determines it. +

    + +
    + + + + + diff --git a/doc/groff.html.node/ms-Multiple-Columns.html b/doc/groff.html.node/ms-Multiple-Columns.html new file mode 100644 index 0000000..c95792f --- /dev/null +++ b/doc/groff.html.node/ms-Multiple-Columns.html @@ -0,0 +1,88 @@ + + + + + + +ms Multiple Columns (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6.4 Multiple columns

    + + + +

    ms can set text in as many columns as reasonably fit on the page. +The following macros force a page break if a multi-column layout is +active when they are called. The MINGW register stores the +default minimum gutter width; it is a GNU extension. When multiple +columns are in use, keeps and the HORPHANS and PORPHANS +registers work with respect to column breaks instead of page breaks. +

    +
    +
    Macro: .1C
    +
    +

    Arrange page text in a single column (the default). +

    + +
    +
    Macro: .2C
    +
    +

    Arrange page text in two columns. +

    + +
    +
    Macro: .MC [column-width [gutter-width]]
    +
    +

    Arrange page text in multiple columns. If you specify no arguments, it +is equivalent to the 2C macro. Otherwise, column-width is +the width of each column and gutter-width is the minimum distance +between columns. +

    + + +
    + + + + + diff --git a/doc/groff.html.node/ms-Naming-Conventions.html b/doc/groff.html.node/ms-Naming-Conventions.html new file mode 100644 index 0000000..db31955 --- /dev/null +++ b/doc/groff.html.node/ms-Naming-Conventions.html @@ -0,0 +1,89 @@ + + + + + + +ms Naming Conventions (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.9 Naming Conventions

    + + + +

    The following conventions are used for names of macros, strings, and +registers. External names available to documents that use the +groff ms macros contain only uppercase letters and digits. +

    +

    Internally, the macros are divided into modules. Conventions for +identifier names are as follows. +

    +
      +
    • Names used only within one module are of the form +module*name. + +
    • Names used outside the module in which they are defined are of the form +module@name. + +
    • Names associated with a particular environment are of the form +environment:name; these are used only within the +par module. + +
    • name does not have a module prefix. + +
    • Constructed names used to implement arrays are of the form +array!index. +
    + +

    Thus the groff ms macros reserve the following names. +

    +
      +
    • Names containing the characters *, @, and :. + +
    • Names containing only uppercase letters and digits. +
    + + + +
    + + + + + diff --git a/doc/groff.html.node/ms-Page-Layout.html b/doc/groff.html.node/ms-Page-Layout.html new file mode 100644 index 0000000..7bea36d --- /dev/null +++ b/doc/groff.html.node/ms-Page-Layout.html @@ -0,0 +1,64 @@ + + + + + + +ms Page Layout (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6 Page layout

    + + + +

    ms’s default page layout arranges text in a single column with +the page number between hyphens centered in a header on each page except +the first, and produces no footers. You can customize this arrangement. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/ms-TOC.html b/doc/groff.html.node/ms-TOC.html new file mode 100644 index 0000000..96a2f76 --- /dev/null +++ b/doc/groff.html.node/ms-TOC.html @@ -0,0 +1,242 @@ + + + + + + +ms TOC (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.6.5 Creating a table of contents

    + + + +

    Because roff formatters process their input in a single pass, +material on page 50, for example, cannot influence what appears on +page 1—this poses a challenge for a table of contents at its +traditional location in front matter, if you wish to avoid manually +maintaining it. ms enables the collection of material to be +presented in the table of contents as it appears, saving its page number +along with it, and then emitting the collected contents on demand toward +the end of the document. The table of contents can then be resequenced +to its desired location by physically rearranging the pages of a printed +document, or as part of post-processing—with a sed(1) +script to reorder the pages in troff’s output, with +pdfjam(1), or with gropdf(1)’s +‘.pdfswitchtopage’ feature, for example. +

    +

    Define an entry to appear in the table of contents by bracketing its +text between calls to the XS and XE macros. A typical +application is to call them immediately after NH or SH and +repeat the heading text within them. The XA macro, used within +‘.XS’/‘.XE’ pairs, supplements an entry—for instance, when +it requires multiple output lines, whether because a heading is too long +to fit or because style dictates that page numbers not be repeated. You +may wish to indent the text thus wrapped to correspond to its heading +depth; this can be done in the entry text by prefixing it with tabs or +horizontal motion escape sequences, or by providing a second argument to +the XA macro. XS and XA automatically associate +the page number where they are called with the text following them, but +they accept arguments to override this behavior. At the end of the +document, call TC or PX to emit the table of contents; +TC resets the page number to ‘i’ (Roman numeral one), and +then calls PX. All of these macros are Berkeley extensions. +

    +
    +
    Macro: .XS [page-number]
    +
    +
    Macro: .XA [page-number [indentation]]
    +
    +
    Macro: .XE
    +
    +

    Begin, supplement, and end a table of contents entry. Each entry is +associated with page-number (otherwise the current page number); a +page-number of ‘no’ prevents a leader and page number from +being emitted for that entry. Use of XA within +XS/XE is optional; it can be repeated. If +indentation is present, a supplemental entry is indented by that +amount; ens are assumed if no unit is indicated. Text on input lines +between XS and XE is stored for later recall by PX. +

    + +
    +
    Macro: .PX [no]
    +
    +

    Switch to single-column layout. Unless no is specified, center +and interpolate the TOC string in bold and two points larger than +the body text. Emit the table of contents entries. +

    + +
    +
    Macro: .TC [no]
    +
    +

    Set the page number to 1, the page number format to lowercase Roman +numerals, and call PX (with a no argument, if present). +

    + +

    Here’s an example of typical ms table of contents preparation. +We employ horizontal escape sequences \h to indent the entries by +sectioning depth. +

    +
    +
    +
    .NH 1
    +Introduction
    +.XS
    +Introduction
    +.XE
    +
    +.NH 2
    +Methodology
    +.XS
    +\h'2n'Methodology
    +.XA
    +\h'4n'Fassbinder's Approach
    +\h'4n'Kahiu's Approach
    +.XE
    +
    +.NH 1
    +Findings
    +.XS
    +Findings
    +.XE
    +
    +.TC
    +
    +
    + +

    The remaining features in this subsubsection are GNU extensions. +groff ms obviates the need to repeat heading text after +XS calls. Call XN and XH after NH and +SH, respectively. +

    +
    +
    Macro: .XN heading-text
    +
    +
    Macro: .XH depth heading-text
    +
    +

    Format heading-text and create a corresponding table of contents +entry. XN computes the indentation from the depth of the +preceding NH call; XH requires a depth argument to +do so. +

    + +

    groff ms encourages customization of table of contents +entry production. +

    +
    +
    Macro: .XN-REPLACEMENT heading-text
    +
    +
    Macro: .XH-REPLACEMENT depth heading-text
    +
    +

    These hook macros implement XN and XH, respectively. +They call XN-INIT and pass their heading-text arguments to +XH-UPDATE-TOC. +

    + +
    +
    Macro: .XN-INIT
    +
    +
    Macro: .XH-UPDATE-TOC depth heading-text
    +
    +

    The XN-INIT hook macro does nothing by default. +XH-UPDATE-TOC brackets heading-text with XS and +XE calls, indenting it by 2 ens per level of depth beyond +the first. +

    + +

    We could therefore produce a table of contents similar to that in the +previous example with fewer macro calls. (The difference is that this +input follows the “Approach” entries with leaders and page numbers.) +

    +
    +
    +
    .NH 1
    +.XN Introduction
    +
    +.NH 2
    +.XN Methodology
    +.XH 3 "Fassbinder's Approach"
    +.XH 3 "Kahiu's Approach"
    +
    +.NH 1
    +.XN Findings
    +
    +
    +
    + +

    To get the section number of the numbered headings into the table of +contents entries, we might define XN-REPLACEMENT as follows. +(We obtain the heading depth from groff ms’s internal +register nh*hl.) +

    +
    +
    +
    .de XN-REPLACEMENT
    +.XN-INIT
    +.XH-UPDATE-TOC \\n[nh*hl] \\$@
    +\&\\*[SN] \\$*
    +..
    +
    +
    + +

    You can change the style of the leader that bridges each table of +contents entry with its page number; define the TC-LEADER special +character by using the char request. A typical leader combines +the dot glyph ‘.’ with a horizontal motion escape sequence to +spread the dots. The width of the page number field is stored in the +TC-MARGIN register. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-basic-information.html b/doc/groff.html.node/ms-basic-information.html new file mode 100644 index 0000000..cc87b0b --- /dev/null +++ b/doc/groff.html.node/ms-basic-information.html @@ -0,0 +1,211 @@ + + + + + + +ms basic information (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.1.1 Basic information

    + +

    ms documents are plain text files; prepare them with your +preferred text editor. If you’re in a hurry to start, know that +ms needs one of its macros called at the beginning of a document +so that it can initialize. A macro is a formatting instruction to +ms. Put a macro call on a line by itself. Use ‘.PP’ if you +want your paragraph’s first line to be indented, or ‘.LP’ if you +don’t. +

    +

    After that, start typing normally. It is a good practice to start each +sentence on a new line, or to put two spaces after sentence-ending +punctuation, so that the formatter knows where the sentence boundaries +are. You can separate paragraphs with further paragraphing macros, or +with blank lines, and you can indent with tabs. When you need one of +the features mentioned earlier (see ms), return to this part of the +manual. +

    +

    Format the document with the groff command. nroff +can be useful for previewing. +

    +
    +
    +
    $ editor radical.ms
    +$ nroff -ww -z -ms radical.ms # check for errors
    +$ nroff -ms radical.ms | less -R
    +$ groff -T ps -ms radical.ms > radical.ps
    +$ see radical.ps
    +
    +
    + +

    Our radical.ms document might look like this. +

    +
    +
    +
    .LP
    +Radical novelties are so disturbing that they tend to be
    +suppressed or ignored, to the extent that even the
    +possibility of their existence in general is more often
    +denied than admitted.
    +
    +→That's what Dijkstra said, anyway.
    +
    +
    + +

    ms exposes many aspects of document layout to user control via +groff’s registers and strings, which store numbers +and text, respectively. Measurements in groff are expressed with +a suffix called a scaling unit. +

    +
    +
    i
    +

    inches +

    +
    +
    c
    +

    centimeters +

    +
    +
    p
    +

    points (1/72 inch) +

    +
    +
    P
    +

    picas (1/6 inch) +

    +
    +
    v
    +

    vees; current vertical spacing +

    +
    +
    m
    +

    ems; width of an “M” in the current font +

    +
    +
    n
    +

    ens; one-half em +

    +
    + +

    Set registers with the nr request and strings with the ds +request. Requests are like macro calls; they go on lines by +themselves and start with the control character, a dot (.). +The difference is that they directly instruct the formatter program, +rather than the macro package. We’ll discuss a few as applicable. It +is wise to specify a scaling unit when setting any register that +represents a length, size, or distance. +

    +
    +
    +
    .nr PS 10.5p \" Use 10.5-point type.
    +.ds FAM P    \" Use Palatino font family.
    +
    +
    + +

    In the foregoing, we see that \" begins a comment. This is an +example of an escape sequence, the other kind of formatting +instruction. Escape sequences can appear anywhere. They begin with the +escape character (\) and are followed by at least one more +character. ms documents +tend to use only a few of groff’s many requests and escape +sequences; see Request Index and Escape Sequence Index or +the groff(7) man page for complete lists. +

    +
    +
    \"
    +

    Begin comment; ignore remainder of line. +

    +
    +
    \n[reg]
    +

    Interpolate value of register reg. +

    +
    +
    \*[str]
    +

    Interpolate contents of string str. +

    +
    +
    \*s
    +

    abbreviation of \*[s]; the name s must be only one +character +

    +
    +
    \[char]
    +

    Interpolate glyph of special character named char. +

    +
    +
    \&
    +

    dummy character +

    +
    +
    \~
    +

    Insert an unbreakable space that is adjustable like a normal space. +

    +
    +
    \|
    +

    Move horizontally by one-sixth em (“thin space”). +

    +
    + +

    Prefix any words that start with a dot ‘.’ or neutral apostrophe +‘'’ with \& if they are at the beginning of an input line +(or might become that way in editing) to prevent them from being +interpreted as macro calls or requests. Suffix ‘.’, ‘?’, and +‘!’ with \& when needed to cancel end-of-sentence detection. +

    +
    +
    +
    My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\&
    +Wallace after the criticality incident.
    +
    +
    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-keeps-and-displays.html b/doc/groff.html.node/ms-keeps-and-displays.html new file mode 100644 index 0000000..47088aa --- /dev/null +++ b/doc/groff.html.node/ms-keeps-and-displays.html @@ -0,0 +1,207 @@ + + + + + + +ms keeps and displays (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.8 Keeps, boxed keeps, and displays

    + + + + +

    On occasion, you may want to keep several lines of text, or a +region of a document, together on a single page, preventing an automatic +page break within certain boundaries. This can cause a page break to +occur earlier than it normally would. For example, you may want to keep +two paragraphs together, or a paragraph that refers to a table, list, or +figure adjacent to the item it discusses. ms provides the +KS and KE macros for this purpose. +

    +

    You can alternatively specify a floating keep: if a keep cannot +fit on the current page, ms holds its contents and +allows material following the keep (in the source document) to fill the +remainder of the current page. When the page breaks, whether by +reaching the end or bp request, ms puts the floating keep +at the beginning of the next page. This is useful for placing large +graphics or tables that do not need to appear exactly where they occur +in the source document. +

    +
    +
    Macro: .KS
    +
    +
    Macro: .KF
    +
    +
    Macro: .KE
    +
    +

    KS begins a keep, KF a floating keep, and KE ends a +keep of either kind. +

    + +

    As an alternative to the keep mechanism, the ne request forces a +page break if there is not at least the amount of vertical space +specified in its argument remaining on the page (see Page Control). +One application of ne is to reserve space on the page for a +figure or illustration to be included later. +

    + +

    A boxed keep has a frame drawn around it. +

    +
    +
    Macro: .B1
    +
    +
    Macro: .B2
    +
    +

    B1 begins a keep with a box drawn around it. B2 ends a +boxed keep. +

    + +

    Boxed keep macros cause breaks; if you need to box a word or phrase +within a line, see the BX macro in Typeface and decoration. +Box lines are drawn as close as possible to the text they enclose so +that they are usable within paragraphs. If you wish to box one or more +paragraphs, you may improve the appearance by calling B1 after +the first paragraphing macro, and by adding a small amount of vertical +space before calling B2. +

    +
    +
    +
    .LP
    +.B1
    +.I Warning:
    +Happy Fun Ball may suddenly accelerate to dangerous
    +speeds.
    +.sp \n[PD]/2 \" space by half the inter-paragraph distance
    +.B2
    +
    +
    + +

    If you want a boxed keep to float, you will need to enclose the +B1 and B2 calls within a pair of KF and KE +calls. +

    + +

    Displays turn off filling; lines of verse or program code are +shown with their lines broken as in the source document without +requiring br requests between lines. Displays can be kept on a +single page or allowed to break across pages. The DS macro +begins a kept display of the layout specified in its first argument; +non-kept displays are begun with dedicated macros corresponding to their +layout. +

    +
    +
    Macro: .DS L
    +
    +
    Macro: .LD
    +
    +

    Begin (DS: kept) left-aligned display. +

    + +
    +
    Macro: .DS [I [indent]]
    +
    +
    Macro: .ID [indent]
    +
    +

    Begin (DS: kept) display indented by indent if specified, +and by the amount of the DI register otherwise. +

    + +
    +
    Macro: .DS B
    +
    +
    Macro: .BD
    +
    +

    Begin a (DS: kept) a block display: the entire display is +left-aligned, but indented such that the longest line in the display +is centered on the page. +

    + +
    +
    Macro: .DS C
    +
    +
    Macro: .CD
    +
    +

    Begin a (DS: kept) centered display: each line in the display +is centered. +

    + +
    +
    Macro: .DS R
    +
    +
    Macro: .RD
    +
    +

    Begin a (DS: kept) right-aligned display. This is a GNU +extension. +

    + +
    +
    Macro: .DE
    +
    +

    End any display. +

    + +

    The distance stored in the DD register is inserted before and +after each pair of display macros; this is a Berkeley extension. In +groff ms, this distance replaces any adjacent +inter-paragraph distance or subsequent spacing prior to a section +heading. The DI register is a GNU extension; its value is an +indentation applied to displays created with ‘.DS’ and ‘.ID’ +without arguments, to ‘.DS I’ without an indentation argument, and +to indented equations set with ‘.EQ’. Changes to either register +take effect at the next display boundary. +

    + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms-language-and-localization.html b/doc/groff.html.node/ms-language-and-localization.html new file mode 100644 index 0000000..032b4a0 --- /dev/null +++ b/doc/groff.html.node/ms-language-and-localization.html @@ -0,0 +1,135 @@ + + + + + + +ms language and localization (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6.5.11 Language and localization

    + + + + + +

    groff ms provides several strings that you can customize +for your own purposes, or redefine to adapt the macro package to +languages other than English. It is already localized for +Czech, German, French, Italian, and Swedish. Load the desired +localization macro package after ms; see the +groff_tmac(5) man page. +

    +
    +
    +
    $ groff -ms -mfr bienvenue.ms
    +
    +
    + +

    The following strings are available. +

    +
    +
    String: \*[REFERENCES]
    +
    +

    Contains the string printed at the beginning of a references +(bibliography) page produced with GNU refer(1). The default +is ‘References’. +

    + +
    +
    String: \*[ABSTRACT]
    +
    +

    Contains the string printed at the beginning of the abstract. The +default is ‘\f[I]ABSTRACT\f[]’; it includes font selection escape +sequences to set the word in italics. +

    + +
    +
    String: \*[TOC]
    +
    +

    Contains the string printed at the beginning of the table of contents. +The default is ‘Table of Contents’. +

    + +
    +
    String: \*[MONTH1]
    +
    +
    String: \*[MONTH2]
    +
    +
    String: \*[MONTH3]
    +
    +
    String: \*[MONTH4]
    +
    +
    String: \*[MONTH5]
    +
    +
    String: \*[MONTH6]
    +
    +
    String: \*[MONTH7]
    +
    +
    String: \*[MONTH8]
    +
    +
    String: \*[MONTH9]
    +
    +
    String: \*[MONTH10]
    +
    +
    String: \*[MONTH11]
    +
    +
    String: \*[MONTH12]
    +
    +

    Contain the full names of the calendar months. The defaults are in +English: ‘January’, ‘February’, and so on. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/ms.html b/doc/groff.html.node/ms.html new file mode 100644 index 0000000..aaf7bf1 --- /dev/null +++ b/doc/groff.html.node/ms.html @@ -0,0 +1,75 @@ + + + + + + +ms (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + +
    + +
    +

    4.6 ms

    + + +

    The ms (“manuscript”) package is suitable for the preparation +of letters, memoranda, reports, and books. These groff +macros feature cover page and table of contents generation, +automatically numbered headings, several paragraph styles, a variety of +text styling options, footnotes, and multi-column page layouts. +ms supports the tbl, eqn, pic, and +refer preprocessors for inclusion of tables, mathematical +equations, diagrams, and standardized bibliographic citations. This +implementation is mostly compatible with the documented interface and +behavior of AT&T Unix Version 7 ms. Many extensions from +4.2BSD (Berkeley) +and Tenth Edition Research Unix have been recreated. +

    + + + +
    + + + + + diff --git a/doc/groff.html.node/troff-and-nroff-Modes.html b/doc/groff.html.node/troff-and-nroff-Modes.html new file mode 100644 index 0000000..257d36e --- /dev/null +++ b/doc/groff.html.node/troff-and-nroff-Modes.html @@ -0,0 +1,114 @@ + + + + + + +troff and nroff Modes (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.14 troff and nroff Modes

    + + + + + +

    Historically, nroff and troff were two separate programs; +the former for terminal output, the latter for typesetters. GNU +troff merges both functions into one executable68 that sends its output to a +device driver (grotty for terminal devices, grops for +PostScript, and so on) which interprets this intermediate output format. +When discussing AT&T troff, it makes sense to talk +about nroff mode and troff mode since the +differences are hard-coded. GNU troff takes information from +device and font description files without handling requests specially if +a terminal output device is used, so such a strong distinction is +unnecessary. +

    +

    Usually, a macro package can be used with all output devices. +Nevertheless, it is sometimes necessary to make a distinction between +terminal and non-terminal devices: GNU troff provides two +built-in conditions ‘n’ and ‘t’ for the if, ie, +and while requests to decide whether GNU troff shall +behave like nroff or like troff. +

    +
    +
    Request: .troff
    +
    + + +

    Make the ‘t’ built-in condition true (and the ‘n’ built-in +condition false) for if, ie, and while conditional +requests. This is the default if GNU troff (not +groff) is started with the -R switch to avoid loading of +the startup files troffrc and troffrc-end. Without +-R, GNU troff stays in troff mode if the output +device is not a terminal (e.g., ‘ps’). +

    + +
    +
    Request: .nroff
    +
    + +

    Make the ‘n’ built-in condition true (and the ‘t’ built-in +condition false) for if, ie, and while conditional +requests. This is the default if GNU troff uses a terminal +output device; the code for switching to nroff mode is in the +file tty.tmac, which is loaded by the startup file +troffrc. +

    + +

    See Conditionals and Loops, for more details on built-in conditions. +

    + + +
    +
    + + + + + + diff --git a/doc/groff.html.node/while.html b/doc/groff.html.node/while.html new file mode 100644 index 0000000..f9a0bae --- /dev/null +++ b/doc/groff.html.node/while.html @@ -0,0 +1,161 @@ + + + + + + +while (The GNU Troff Manual) + + + + + + + + + + + + + + + + + + + +
    + +
    +

    5.23.5 while

    + + +

    groff provides a looping construct: the while request. +Its syntax matches the if request. +

    + +
    +
    Request: .while cond-expr anything
    +
    +

    Evaluate the conditional expression cond-expr, and repeatedly +execute anything unless and until cond-expr evaluates false. +anything, which is often a conditional block, is referred to as +the while request’s body. +

    +
    +
    .nr a 0 1
    +.while (\na < 9) \{\
    +\n+a,
    +.\}
    +\n+a
    +    ⇒ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    +
    + + +

    GNU troff treats the body of a while request similarly to +that of a de request (albeit one not read in copy +mode94), but stores it under an internal name +and deletes it when the loop finishes. The operation of a macro +containing a while request can slow significantly if the +while body is large. Each time the macro is executed, the +while body is parsed and stored again. +

    +
    +
    .de xxx
    +.  nr num 10
    +.  while (\\n[num] > 0) \{\
    +.    \" many lines of code
    +.    nr num -1
    +.  \}
    +..
    +
    + + + +

    An often better solution—and one that is more portable, since +AT&T troff lacked the while request—is to +instead write a recursive macro. It will be parsed only +once.95 +

    +
    +
    .de yyy
    +.  if (\\n[num] > 0) \{\
    +.    \" many lines of code
    +.    nr num -1
    +.    yyy
    +.  \}
    +..
    +.
    +.de xxx
    +.  nr num 10
    +.  yyy
    +..
    +
    + +

    To prevent infinite loops, the default number of available recursion +levels is 1,000 or somewhat less.96 You can +disable this protective measure, or raise the limit, by setting the +slimit register. See Debugging. +

    +

    As noted above, if a while body begins with a conditional block, +its closing brace must end an input line. +

    +
    +
    .if 1 \{\
    +.  nr a 0 1
    +.  while (\n[a] < 10) \{\
    +.    nop \n+[a]
    +.\}\}
    +    error→ unbalanced brace escape sequences
    +
    +
    + +
    +
    Request: .break
    +
    + + + +

    Exit a while loop. Do not confuse this request with a +typographical break or the br request. +

    + +
    +
    Request: .continue
    +
    +

    Skip the remainder of a while loop’s body, immediately starting +the next iteration. +

    + + + +
    +
    + + + + + + diff --git a/doc/groff.info b/doc/groff.info new file mode 100644 index 0000000..0b36c23 --- /dev/null +++ b/doc/groff.info @@ -0,0 +1,423 @@ +This is groff.info, produced by makeinfo version 7.0.3 from groff.texi. + +This manual documents GNU 'troff' version 1.23.0. + + Copyright © 1994-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". +INFO-DIR-SECTION Typesetting +START-INFO-DIR-ENTRY +* Groff: (groff). The GNU roff document formatting system. +END-INFO-DIR-ENTRY + + +Indirect: +groff.info-1: 723 +groff.info-2: 303755 +groff.info-3: 616581 + +Tag Table: +(Indirect) +Node: Top723 +Node: Introduction1683 +Node: Background2155 +Node: What Is groff?3968 +Node: groff Capabilities4894 +Node: Macro Package Intro6241 +Node: Preprocessor Intro6920 +Node: Preprocessor Intro-Footnotes8331 +Ref: Preprocessor Intro-Footnote-18413 +Node: Output Device Intro8492 +Node: Installation9120 +Node: Conventions Used in This Manual9504 +Node: Conventions Used in This Manual-Footnotes12548 +Ref: Conventions Used in This Manual-Footnote-112656 +Ref: Conventions Used in This Manual-Footnote-212844 +Node: Credits12873 +Node: Invoking groff13398 +Node: Invoking groff-Footnotes14739 +Ref: Invoking groff-Footnote-114813 +Node: Groff Options14866 +Node: Environment27526 +Node: Macro Directories30791 +Node: Macro Directories-Footnotes32254 +Ref: Macro Directories-Footnote-132334 +Node: Font Directories32407 +Node: Paper Format34380 +Node: Invocation Examples35840 +Node: Tutorial for Macro Users37422 +Node: Basics38129 +Node: Basics-Footnotes44199 +Ref: Basics-Footnote-144257 +Node: Common Features44415 +Node: Paragraphs45648 +Node: Sections and Chapters47257 +Node: Headers and Footers47761 +Node: Page Layout Adjustment48487 +Node: Displays and Keeps48979 +Node: Footnotes and Endnotes50257 +Node: Table of Contents50860 +Node: Indexing51812 +Node: Document Formats52253 +Node: Columnation52749 +Node: Font and Size Changes53032 +Node: Predefined Text53542 +Node: Preprocessor Support53852 +Node: Configuration and Customization54295 +Node: Major Macro Packages54667 +Node: man55737 +Node: Optional man extensions56224 +Node: mdoc60222 +Node: me60495 +Node: mm61061 +Node: mom61398 +Node: ms62297 +Node: ms Introduction63317 +Node: ms Introduction-Footnotes63762 +Ref: ms Introduction-Footnote-163838 +Node: ms basic information64073 +Node: ms Document Structure67998 +Node: ms Document Control Settings70473 +Node: ms Document Control Settings-Footnotes79653 +Ref: ms Document Control Settings-Footnote-179755 +Node: ms Document Description Macros79795 +Node: ms Document Description Macros-Footnotes84030 +Ref: ms Document Description Macros-Footnote-184136 +Node: ms Body Text84257 +Node: Text settings in ms84898 +Node: Typographical symbols in ms86081 +Node: Paragraphs in ms86721 +Node: Headings in ms89617 +Node: Typeface and decoration94721 +Node: Typeface and decoration-Footnotes98631 +Ref: Typeface and decoration-Footnote-198723 +Node: Lists in ms99063 +Node: Indented regions in ms102246 +Node: ms keeps and displays103228 +Node: ms Insertions107422 +Node: ms Footnotes110390 +Node: ms Footnotes-Footnotes114176 +Ref: ms Footnotes-Footnote-1114246 +Ref: ms Footnotes-Footnote-2114371 +Ref: ms Footnotes-Footnote-3114462 +Node: ms language and localization114532 +Node: ms Page Layout116058 +Node: ms Headers and Footers116520 +Node: Tab Stops in ms119000 +Node: ms Margins119381 +Node: ms Multiple Columns119765 +Node: ms TOC120726 +Node: Differences from AT&T ms126332 +Node: Differences from AT&T ms-Footnotes131038 +Ref: Differences from AT&T ms-Footnote-1131132 +Ref: Differences from AT&T ms-Footnote-2131258 +Ref: Differences from AT&T ms-Footnote-3131348 +Node: Missing Unix Version 7 ms Macros131620 +Node: Missing Unix Version 7 ms Macros-Footnotes132934 +Ref: Missing Unix Version 7 ms Macros-Footnote-1133044 +Node: ms Legacy Features133212 +Node: ms Naming Conventions135940 +Node: GNU troff Reference136988 +Node: Text138082 +Node: Filling139361 +Node: Filling-Footnotes140444 +Ref: Filling-Footnote-1140504 +Ref: Filling-Footnote-2140555 +Node: Sentences140825 +Node: Sentences-Footnotes145108 +Ref: Sentences-Footnote-1145172 +Ref: Sentences-Footnote-2145389 +Ref: Sentences-Footnote-3145651 +Node: Hyphenation145830 +Node: Breaking146782 +Node: Breaking-Footnotes149367 +Ref: Breaking-Footnote-1149429 +Node: Adjustment149494 +Node: Tabs and Leaders149985 +Node: Tabs and Leaders-Footnotes151169 +Ref: Tabs and Leaders-Footnote-1151247 +Node: Requests and Macros151362 +Node: Requests and Macros-Footnotes157082 +Ref: Requests and Macros-Footnote-1157166 +Ref: Requests and Macros-Footnote-2157277 +Ref: Requests and Macros-Footnote-3157378 +Ref: Requests and Macros-Footnote-4157439 +Node: Macro Packages157508 +Node: Macro Packages-Footnotes158336 +Ref: Macro Packages-Footnote-1158410 +Node: Input Encodings158492 +Node: Input Encodings-Footnotes161415 +Ref: Input Encodings-Footnote-1161491 +Ref: Input Encodings-Footnote-2161688 +Node: Input Conventions161863 +Node: Input Conventions-Footnotes166824 +Ref: Input Conventions-Footnote-1166904 +Node: Page Geometry166958 +Node: Page Geometry-Footnotes170630 +Ref: Page Geometry-Footnote-1170702 +Ref: Page Geometry-Footnote-2170762 +Node: Measurements170831 +Node: Motion Quanta172770 +Node: Default Units173707 +Node: Numeric Expressions175213 +Node: Numeric Expressions-Footnotes183975 +Ref: Numeric Expressions-Footnote-1184059 +Ref: Numeric Expressions-Footnote-2184152 +Ref: Numeric Expressions-Footnote-3184251 +Ref: Numeric Expressions-Footnote-4184291 +Ref: Numeric Expressions-Footnote-5184513 +Node: Identifiers184541 +Node: Identifiers-Footnotes189589 +Ref: Identifiers-Footnote-1189657 +Ref: Identifiers-Footnote-2190254 +Node: Formatter Instructions190373 +Node: Control Characters191643 +Node: Control Characters-Footnotes193934 +Ref: Control Characters-Footnote-1194016 +Node: Invoking Requests194052 +Node: Invoking Requests-Footnotes196161 +Ref: Invoking Requests-Footnote-1196241 +Node: Calling Macros196411 +Node: Calling Macros-Footnotes200319 +Ref: Calling Macros-Footnote-1200393 +Ref: Calling Macros-Footnote-2200457 +Node: Using Escape Sequences200630 +Node: Using Escape Sequences-Footnotes205504 +Ref: Using Escape Sequences-Footnote-1205594 +Ref: Using Escape Sequences-Footnote-2205696 +Node: Delimiters205736 +Node: Comments208561 +Node: Comments-Footnotes211181 +Ref: Comments-Footnote-1211243 +Ref: Comments-Footnote-2211305 +Ref: Comments-Footnote-3211341 +Node: Registers211504 +Node: Setting Registers212084 +Node: Interpolating Registers216559 +Node: Auto-increment217536 +Node: Auto-increment-Footnotes219451 +Ref: Auto-increment-Footnote-1219525 +Node: Assigning Register Formats219598 +Node: Built-in Registers223328 +Node: Built-in Registers-Footnotes227032 +Ref: Built-in Registers-Footnote-1227114 +Node: Manipulating Filling and Adjustment227198 +Node: Manipulating Filling and Adjustment-Footnotes240315 +Ref: Manipulating Filling and Adjustment-Footnote-1240431 +Ref: Manipulating Filling and Adjustment-Footnote-2240479 +Ref: Manipulating Filling and Adjustment-Footnote-3240514 +Node: Manipulating Hyphenation240634 +Node: Manipulating Hyphenation-Footnotes258827 +Ref: Manipulating Hyphenation-Footnote-1258921 +Ref: Manipulating Hyphenation-Footnote-2259086 +Ref: Manipulating Hyphenation-Footnote-3259175 +Ref: Manipulating Hyphenation-Footnote-4259316 +Ref: Manipulating Hyphenation-Footnote-5259639 +Ref: Manipulating Hyphenation-Footnote-6259813 +Node: Manipulating Spacing259881 +Node: Manipulating Spacing-Footnotes265594 +Ref: Manipulating Spacing-Footnote-1265680 +Ref: Manipulating Spacing-Footnote-2265717 +Ref: Manipulating Spacing-Footnote-3265760 +Ref: Manipulating Spacing-Footnote-4265828 +Node: Tabs and Fields265887 +Node: Tabs and Fields-Footnotes272139 +Ref: Tabs and Fields-Footnote-1272215 +Node: Leaders272279 +Node: Leaders-Footnotes274266 +Ref: Leaders-Footnote-1274326 +Node: Fields274486 +Node: Character Translations275876 +Node: troff and nroff Modes279395 +Node: troff and nroff Modes-Footnotes281486 +Ref: troff and nroff Modes-Footnote-1281574 +Node: Line Layout281682 +Node: Line Continuation287718 +Node: Line Continuation-Footnotes290503 +Ref: Line Continuation-Footnote-1290583 +Node: Page Layout290925 +Node: Page Layout-Footnotes294492 +Ref: Page Layout-Footnote-1294560 +Node: Page Control294583 +Node: Page Control-Footnotes299166 +Ref: Page Control-Footnote-1299236 +Node: Using Fonts299264 +Node: Using Fonts-Footnotes302473 +Ref: Using Fonts-Footnote-1302541 +Ref: Using Fonts-Footnote-2302742 +Ref: Using Fonts-Footnote-3302830 +Ref: Using Fonts-Footnote-4302986 +Node: Selecting Fonts303755 +Node: Font Families308177 +Node: Font Families-Footnotes312061 +Ref: Font Families-Footnote-1312133 +Node: Font Positions312167 +Node: Using Symbols315056 +Node: Using Symbols-Footnotes333721 +Ref: Using Symbols-Footnote-1333793 +Ref: Using Symbols-Footnote-2333911 +Ref: Using Symbols-Footnote-3334033 +Ref: Using Symbols-Footnote-4334069 +Node: Character Classes334229 +Node: Special Fonts337008 +Node: Artificial Fonts338195 +Node: Ligatures and Kerning343712 +Node: Italic Corrections347081 +Node: Dummy Characters348505 +Node: Dummy Characters-Footnotes351282 +Ref: Dummy Characters-Footnote-1351360 +Node: Manipulating Type Size and Vertical Spacing351819 +Node: Manipulating Type Size and Vertical Spacing-Footnotes352771 +Ref: Manipulating Type Size and Vertical Spacing-Footnote-1352903 +Ref: Manipulating Type Size and Vertical Spacing-Footnote-2353261 +Node: Changing the Type Size353349 +Node: Changing the Type Size-Footnotes356390 +Ref: Changing the Type Size-Footnote-1356480 +Node: Changing the Vertical Spacing356622 +Node: Using Fractional Type Sizes359239 +Node: Using Fractional Type Sizes-Footnotes362878 +Ref: Using Fractional Type Sizes-Footnote-1362978 +Node: Colors363029 +Node: Colors-Footnotes367195 +Ref: Colors-Footnote-1367253 +Node: Strings367298 +Ref: als375644 +Node: Strings-Footnotes377468 +Ref: Strings-Footnote-1377528 +Node: Conditionals and Loops377555 +Node: Operators in Conditionals378008 +Node: Operators in Conditionals-Footnotes382841 +Ref: Operators in Conditionals-Footnote-1382937 +Ref: Operators in Conditionals-Footnote-2383111 +Ref: Operators in Conditionals-Footnote-3383421 +Ref: Operators in Conditionals-Footnote-4383552 +Ref: Operators in Conditionals-Footnote-5383693 +Node: if-then383766 +Node: if-else385440 +Node: Conditional Blocks386605 +Node: Conditional Blocks-Footnotes389892 +Ref: Conditional Blocks-Footnote-1389974 +Node: while389997 +Node: while-Footnotes392531 +Ref: while-Footnote-1392587 +Ref: while-Footnote-2392614 +Ref: while-Footnote-3392645 +Node: Writing Macros392733 +Node: Writing Macros-Footnotes399609 +Ref: Writing Macros-Footnote-1399683 +Ref: Writing Macros-Footnote-2399710 +Ref: Writing Macros-Footnote-3399915 +Node: Parameters400164 +Node: Parameters-Footnotes404230 +Ref: Parameters-Footnote-1404296 +Node: Copy Mode404707 +Node: Copy Mode-Footnotes410433 +Ref: Copy Mode-Footnote-1410497 +Ref: Copy Mode-Footnote-2410561 +Node: Page Motions410647 +Node: Page Motions-Footnotes420569 +Ref: Page Motions-Footnote-1420639 +Ref: Page Motions-Footnote-2420829 +Node: Drawing Geometric Objects420895 +Node: Drawing Geometric Objects-Footnotes429469 +Ref: Drawing Geometric Objects-Footnote-1429565 +Node: Deferring Output429662 +Node: Traps432701 +Node: Vertical Position Traps433531 +Node: Page Location Traps434625 +Node: Page Location Traps-Footnotes442638 +Ref: Page Location Traps-Footnote-1442722 +Ref: Page Location Traps-Footnote-2442762 +Ref: Page Location Traps-Footnote-3442850 +Node: The Implicit Page Trap443048 +Node: The Implicit Page Trap-Footnotes444309 +Ref: The Implicit Page Trap-Footnote-1444399 +Ref: The Implicit Page Trap-Footnote-2444426 +Node: Diversion Traps444454 +Node: Input Line Traps445241 +Node: Blank Line Traps448690 +Node: Leading Space Traps449222 +Node: End-of-input Traps450106 +Node: End-of-input Traps-Footnotes454067 +Ref: End-of-input Traps-Footnote-1454149 +Ref: End-of-input Traps-Footnote-2454300 +Node: Diversions454402 +Node: Diversions-Footnotes463874 +Ref: Diversions-Footnote-1463940 +Node: Punning Names464008 +Node: Punning Names-Footnotes467295 +Ref: Punning Names-Footnote-1467367 +Node: Environments467421 +Node: Suppressing Output472573 +Node: I/O475340 +Node: Postprocessor Access484470 +Node: Postprocessor Access-Footnotes487454 +Ref: Postprocessor Access-Footnote-1487540 +Ref: Postprocessor Access-Footnote-2487600 +Node: Miscellaneous487776 +Node: Miscellaneous-Footnotes494416 +Ref: Miscellaneous-Footnote-1494488 +Ref: Miscellaneous-Footnote-2494524 +Node: Gtroff Internals494774 +Node: Gtroff Internals-Footnotes499136 +Ref: Gtroff Internals-Footnote-1499214 +Node: Debugging499355 +Node: Warnings506281 +Node: Implementation Differences511010 +Node: Safer Mode511464 +Node: Compatibility Mode511946 +Node: Compatibility Mode-Footnotes517233 +Ref: Compatibility Mode-Footnote-1517315 +Node: Other Differences517696 +Node: Other Differences-Footnotes524092 +Ref: Other Differences-Footnote-1524172 +Ref: Other Differences-Footnote-2524252 +Ref: Other Differences-Footnote-3524429 +Node: File Formats524649 +Node: gtroff Output524960 +Node: gtroff Output-Footnotes526820 +Ref: gtroff Output-Footnote-1526892 +Node: Language Concepts527027 +Node: Separation528140 +Node: Argument Units530374 +Node: Document Parts531511 +Node: Command Reference532909 +Node: Comment Command533325 +Node: Simple Commands533823 +Node: Graphics Commands539265 +Node: Device Control Commands546605 +Node: Obsolete Command550738 +Node: Intermediate Output Examples552015 +Node: Output Language Compatibility554799 +Node: Device and Font Description Files556878 +Node: Device and Font Description Files-Footnotes558261 +Ref: Device and Font Description Files-Footnote-1558373 +Node: DESC File Format558434 +Node: Font Description File Format564511 +Node: Font Description File Format-Footnotes572537 +Ref: Font Description File Format-Footnote-1572639 +Ref: Font Description File Format-Footnote-2572793 +Ref: Font Description File Format-Footnote-3573006 +Ref: Font Description File Format-Footnote-4573115 +Node: Copying This Manual573202 +Node: Request Index598317 +Node: Escape Sequence Index616581 +Node: Operator Index623925 +Node: Register Index625858 +Node: Macro Index640236 +Node: String Index651800 +Node: File Keyword Index659362 +Node: Program and File Index663322 +Node: Concept Index669178 + +End Tag Table + + +Local Variables: +coding: iso-8859-1 +End: diff --git a/doc/groff.info-1 b/doc/groff.info-1 new file mode 100644 index 0000000..e2db4ec --- /dev/null +++ b/doc/groff.info-1 @@ -0,0 +1,7824 @@ +This is groff.info, produced by makeinfo version 7.0.3 from groff.texi. + +This manual documents GNU 'troff' version 1.23.0. + + Copyright © 1994-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". +INFO-DIR-SECTION Typesetting +START-INFO-DIR-ENTRY +* Groff: (groff). The GNU roff document formatting system. +END-INFO-DIR-ENTRY + + +File: groff.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +GNU 'troff' +*********** + +* Menu: + +* Introduction:: +* Invoking groff:: +* Tutorial for Macro Users:: +* Major Macro Packages:: +* GNU troff Reference:: +* File Formats:: +* Copying This Manual:: +* Request Index:: +* Escape Sequence Index:: +* Operator Index:: +* Register Index:: +* Macro Index:: +* String Index:: +* File Keyword Index:: +* Program and File Index:: +* Concept Index:: + +This manual documents GNU 'troff' version 1.23.0. + + Copyright © 1994-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + + +File: groff.info, Node: Introduction, Next: Invoking groff, Prev: Top, Up: Top + +1 Introduction +************** + +GNU 'roff' (or 'groff') is a programming system for typesetting +documents. It is highly flexible and has been used extensively for over +thirty years. + +* Menu: + +* Background:: +* What Is groff?:: +* groff Capabilities:: +* Macro Package Intro:: +* Preprocessor Intro:: +* Output Device Intro:: +* Conventions Used in This Manual:: +* Installation:: +* Credits:: + + +File: groff.info, Node: Background, Next: What Is groff?, Prev: Introduction, Up: Introduction + +1.1 Background +============== + +M. Douglas McIlroy, formerly of AT&T Bell Laboratories and present at +the creation of the Unix operating system, offers an authoritative +historical summary. + + The prime reason for Unix was the desire of Ken [Thompson], Dennis + [Ritchie], and Joe Ossanna to have a pleasant environment for + software development. The fig leaf that got the nod from ... + management was that an early use would be to develop a + "stand-alone" word-processing system for use in typing pools and + secretarial offices. Perhaps they had in mind "dedicated", as + distinct from "stand-alone"; that's what eventuated in various + cases, most notably in the legal/patent department and in the AT&T + CEO's office. + + Both those systems were targets of opportunity, not foreseen from + the start. When Unix was up and running on the PDP-11, Joe got + wind of the legal department having installed a commercial word + processor. He went to pitch Unix as an alternative and clinched a + trial by promising to make 'roff' able to number lines by tomorrow + in order to fulfill a patent-office requirement that the commercial + system did not support. + + Modems were installed so legal-department secretaries could try the + Research machine. They liked it and Joe's superb customer service. + Soon the legal department got a system of their own. Joe went on + to create 'nroff' and 'troff'. Document preparation became a + widespread use of Unix, but no stand-alone word-processing system + was ever undertaken. + + A history relating 'groff' to its predecessors 'roff', 'nroff', and +'troff' is available in the 'roff(7)' man page. + + +File: groff.info, Node: What Is groff?, Next: groff Capabilities, Prev: Introduction, Up: Introduction + +1.2 What Is 'groff'? +==================== + +'groff' (GNU 'roff') is a typesetting system that reads plain text input +files that include formatting commands to produce output in PostScript, +PDF, HTML, DVI, or other formats, or for display to a terminal. +Formatting commands can be low-level typesetting primitives, macros from +a supplied package, or user-defined macros. All three approaches can be +combined. + + A reimplementation and extension of the typesetter from AT&T Unix, +'groff' is present on most POSIX systems owing to its long association +with Unix manuals (including man pages). It and its predecessor are +notable for their production of several best-selling software +engineering texts. 'groff' is capable of producing typographically +sophisticated documents while consuming minimal system resources. + + +File: groff.info, Node: groff Capabilities, Next: Macro Package Intro, Prev: What Is groff?, Up: Introduction + +1.3 'groff' Capabilities +======================== + +GNU 'troff' is a typesetting document formatter; it provides a wide +range of low-level text and page operations within the framework of a +programming language. These operations compose to generate footnotes, +tables of contents, mathematical equations, diagrams, multi-column text, +and other elements of typeset works. Here is a survey of formatter +features; all are under precise user control. + + * text filling, breaking, alignment to the left or right margin; + centering + + * adjustment of inter-word space size to justify text, and of + inter-sentence space size to suit local style conventions + + * automatic and manual determination of hyphenation break points + + * pagination + + * selection of any font available to the output device + + * adjustment of type size and vertical spacing (or "leading") + + * configuration of line length and indentation amounts; columnation + + * drawing of geometric primitives (lines, arcs, polygons, circles, + ...) + + * setup of stroke and fill colors (where supported by the output + device) + + * embedding of hyperlinks, images, document metadata, and other + inclusions (where supported by the output device) + + +File: groff.info, Node: Macro Package Intro, Next: Preprocessor Intro, Prev: groff Capabilities, Up: Introduction + +1.4 Macro Packages +================== + +Elemental typesetting functions can be be challenging to use directly +with complex documents. A "macro" facility specifies how certain +routine operations, such as starting paragraphs, or printing headers and +footers, should be performed in terms of those low-level instructions. +Macros can be specific to one document or collected together into a +"macro package" for use by many. Several macro packages available; the +most widely used are provided with 'groff'. They are 'man', 'mdoc', +'me', 'mm', 'mom', and 'ms'. + + +File: groff.info, Node: Preprocessor Intro, Next: Output Device Intro, Prev: Macro Package Intro, Up: Introduction + +1.5 Preprocessors +================= + +An alternative approach to complexity management, particularly when +constructing tables, setting mathematics, or drawing diagrams, lies in +preprocessing. A "preprocessor" employs a domian-specific language to +ease the generation of tables, equations, and so forth in terms that are +convenient for human entry. Each preprocessor reads a document and +translates the parts of it that apply to it into GNU 'troff' input. +Command-line options to 'groff' tell it which preprocessors to use. + + 'groff' provides preprocessors for laying out tables ('gtbl'), +typesetting equations ('geqn'), drawing diagrams ('gpic' and 'ggrn'), +inserting bibliographic references ('grefer'), and drawing chemical +structures ('gchem'). An associated program that is useful when dealing +with preprocessors is 'gsoelim'.(1) (*note Preprocessor +Intro-Footnote-1::) + + 'groff' also supports 'grap', a preprocessor for drawing graphs. A +free implementation of it can be obtained separately. + + Unique to 'groff' is the 'preconv' preprocessor that enables 'groff' +to handle documents in a variety of input encodings. + + Other preprocessors exist, but no free implementations are known. An +example is 'ideal', which draws diagrams using a mathematical constraint +language. + + +File: groff.info, Node: Preprocessor Intro-Footnotes, Up: Preprocessor Intro + + (1) The 'g' prefix is not used on all systems; see *note Invoking +groff::. + + +File: groff.info, Node: Output Device Intro, Next: Installation, Prev: Preprocessor Intro, Up: Introduction + +1.6 Output Devices +================== + +GNU 'troff''s output is in a device-independent page description +language, which is then read by an "output driver" that translates this +language into a file format or byte stream that a piece of (possibly +emulated) hardware understands. 'groff' features output drivers for +PostScript devices, terminal emulators (and other simple typewriter-like +machines), X11 (for previewing), TeX DVI, HP LaserJet 4/PCL5 and Canon +LBP printers (which use CaPSL), HTML, XHTML, and PDF. + + +File: groff.info, Node: Installation, Next: Conventions Used in This Manual, Prev: Output Device Intro, Up: Introduction + +1.7 Installation +================ + +Locate installation instructions in the files 'INSTALL', +'INSTALL.extra', and 'INSTALL.REPO' in the 'groff' source distribution. +Being a GNU project, 'groff' supports the familiar './configure && make' +command sequence. + + +File: groff.info, Node: Conventions Used in This Manual, Next: Credits, Prev: Installation, Up: Introduction + +1.8 Conventions Used in This Manual +=================================== + +We apply the term "groff" to the language documented here, the GNU +implementation of the overall system, the project that develops that +system, and the command of that name. In the first sense, 'groff' is an +extended dialect of the 'roff' language, for which many similar +implementations exist. + + The 'roff' language features several major categories for which many +items are predefined. Presentations of these items feature the form in +which the item is most commonly used on the left, and, aligned to the +right margin, the name of the category in brackets. + + -- Register: \n[example] + The register 'example' is one that that 'groff' _doesn't_ + predefine. You can create it yourself, though; see *note Setting + Registers::. + + To make this document useful as a reference and not merely amiable +bedtime reading, we tend to present these syntax items in exhaustive +detail when they arise. References to topics discussed later in the +text are frequent; skip material you don't understand yet. + + We use Texinfo's "result" (=>) and error-> notations to present +output written to the standard output and standard error streams, +respectively. Diagnostic messages from the GNU 'troff' formatter and +other programs are examples of the latter, but the formatter can also be +directed to write user-specified messages to the standard error stream. +The notation then serves to identify the output stream and does not +necessarily mean that an error has occurred.(1) (*note Conventions Used +in This Manual-Footnote-1::) + + $ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d' + => Twelve o'clock and + $ echo '.tm all is well.' | groff > /dev/null + error-> all is well. + + Sometimes we use => somewhat abstractly to represent formatted text +that you will need to use a PostScript or PDF viewer program (or a +printer) to observe. While arguably an abuse of notation, we think this +preferable to requiring the reader to understand the syntax of these +page description languages. + + We also present diagnostic messages in an abbreviated form, often +omitting the name of the program issuing them, the input file name, and +line number or other positional information when such data do not serve +to illuminate the topic under discussion. + + Most examples are of 'roff' language input that would be placed in a +text file. Occasionally, we start an example with a '$' character to +indicate a shell prompt, as seen above. + + You are encouraged to try the examples yourself, and to alter them to +better learn 'groff''s behavior. Our examples frequently need to direct +the formatter to set a line length (with '.ll') that will fit within the +page margins of this manual. We mention this so that you know why it is +there before we discuss the 'll' request formally.(2) (*note +Conventions Used in This Manual-Footnote-2::) + + +File: groff.info, Node: Conventions Used in This Manual-Footnotes, Up: Conventions Used in This Manual + + (1) Unix and related operating systems distinguish standard output +and standard error streams _because_ of 'troff': +. + + (2) *Note Line Layout::. + + +File: groff.info, Node: Credits, Prev: Conventions Used in This Manual, Up: Introduction + +1.9 Credits +=========== + +We adapted portions of this manual from existing documents. James +Clark's man pages were an essential resource; we have updated them in +parallel with the development of this manual. We based the tutorial for +macro users on Eric Allman's introduction to his 'me' macro package +(which we also provide, little altered from 4.4BSD). Larry Kollar +contributed much of the material on the 'ms' macro package. + + +File: groff.info, Node: Invoking groff, Next: Tutorial for Macro Users, Prev: Introduction, Up: Top + +2 Invoking 'groff' +****************** + +This chapter focuses on how to invoke the 'groff' front end. This front +end takes care of the details of constructing the pipeline among the +preprocessors, 'gtroff' and the postprocessor. + + It has become a tradition that GNU programs get the prefix 'g' to +distinguish them from their original counterparts provided by the host +(*note Environment::). Thus, for example, 'geqn' is GNU 'eqn'. On +operating systems like GNU/Linux or the Hurd, which don't contain +proprietary versions of 'troff', and on MS-DOS/MS-Windows, where 'troff' +and associated programs are not available at all, this prefix is omitted +since GNU 'troff' is the only incarnation of 'troff' used. Exception: +'groff' is never replaced by 'roff'. + + In this document, we consequently say 'gtroff' when talking about the +GNU 'troff' program. All other implementations of 'troff' are called +AT&T 'troff', which is the common origin of almost all 'troff' +implementations(1) (*note Invoking groff-Footnote-1::) (with more or +less compatible changes). Similarly, we say 'gpic', 'geqn', and so on. + +* Menu: + +* Groff Options:: +* Environment:: +* Macro Directories:: +* Font Directories:: +* Paper Format:: +* Invocation Examples:: + + +File: groff.info, Node: Invoking groff-Footnotes, Up: Invoking groff + + (1) Besides 'groff', 'neatroff' is an exception. + + +File: groff.info, Node: Groff Options, Next: Environment, Prev: Invoking groff, Up: Invoking groff + +2.1 Options +=========== + +'groff' normally runs the 'gtroff' program and a postprocessor +appropriate for the selected device. The default device is 'ps' (but it +can be changed when 'groff' is configured and built). It can optionally +preprocess with any of 'gpic', 'geqn', 'gtbl', 'ggrn', 'grap', 'gchem', +'grefer', 'gsoelim', or 'preconv'. + + This section documents only options to the 'groff' front end. Many +of the arguments to 'groff' are passed on to 'gtroff'; therefore, those +are also included. Arguments to preprocessors and output drivers can be +found in the man pages 'gpic(1)', 'geqn(1)', 'gtbl(1)', 'ggrn(1)', +'grefer(1)', 'gchem(1)', 'gsoelim(1)', 'preconv(1)', 'grotty(1)', +'grops(1)', 'gropdf(1)', 'grohtml(1)', 'grodvi(1)', 'grolj4(1)', +'grolbp(1)', and 'gxditview(1)'. + + The command-line format for 'groff' is: + + groff [ -abceghijklpstvzCEGNRSUVXZ ] [ -dCS ] [ -DARG ] + [ -fFAM ] [ -FDIR ] [ -IDIR ] [ -KARG ] + [ -LARG ] [ -mNAME ] [ -MDIR ] [ -nNUM ] + [ -oLIST ] [ -PARG ] [ -rCN ] [ -TDEV ] + [ -wNAME ] [ -WNAME ] [ FILES... ] + + The command-line format for 'gtroff' is as follows. + + gtroff [ -abcivzCERU ] [ -dCS ] [ -fFAM ] [ -FDIR ] + [ -mNAME ] [ -MDIR ] [ -nNUM ] [ -oLIST ] + [ -rCN ] [ -TNAME ] [ -wNAME ] [ -WNAME ] + [ FILES... ] + +Obviously, many of the options to 'groff' are actually passed on to +'gtroff'. + + Options without an argument can be grouped behind a single '-'. A +filename of '-' denotes the standard input. Whitespace is permitted +between an option and its argument. + + The 'grog' command can be used to guess the correct 'groff' command +to format a file. See its man page 'grog(1)'; type 'man grog' at the +command line to view it. + + 'groff''s command-line options are as follows. + +'-a' + Generate a plain text approximation of the typeset output. The + read-only register '.A' is set to 1. *Note Built-in Registers::. + This option produces a sort of abstract preview of the formatted + output. + + * Page breaks are marked by a phrase in angle brackets; for + example, ''. + + * Lines are broken where they would be in the formatted output. + + * A horizontal motion of any size is represented as one space. + Adjacent horizontal motions are not combined. Inter-sentence + space nodes (those arising from the second argument to the + 'ss' request) are not represented. + + * Vertical motions are not represented. + + * Special characters are rendered in angle brackets; for + example, the default soft hyphen character appears as ''. + + The above description should not be considered a specification; the + details of '-a' output are subject to change. + +'-b' + Write a backtrace reporting the state of 'gtroff''s input parser to + the standard error stream with each diagnostic message. The line + numbers given in the backtrace might not always be correct, because + 'gtroff''s idea of line numbers can be confused by requests that + append to macros. + +'-c' + Start with color output disabled. + +'-C' + Enable AT&T 'troff' compatibility mode; implies '-c'. *Note + Implementation Differences::, for the list of incompatibilities + between 'groff' and AT&T 'troff'. + +'-dCTEXT' +'-dSTRING=TEXT' + Define 'roff' string C or STRING as T or TEXT. C must be one + character; STRING can be of arbitrary length. Such string + assignments happen before any macro file is loaded, including the + startup file. Due to 'getopt_long' limitations, C cannot be, and + STRING cannot contain, an equals sign, even though that is a valid + character in a 'roff' identifier. + +'-DENC' + Set fallback input encoding used by 'preconv' to ENC; implies '-k'. + +'-e' + Run 'geqn' preprocessor. + +'-E' + Inhibit 'gtroff' error messages. This option does _not_ suppress + messages sent to the standard error stream by documents or macro + packages using 'tm' or related requests. + +'-fFAM' + Use FAM as the default font family. *Note Font Families::. + +'-FDIR' + Search in directory 'DIR' for the selected output device's + directory of device and font description files. See the + description of 'GROFF_FONT_PATH' in *note Environment:: below for + the default search locations and ordering. + +'-g' + Run 'ggrn' preprocessor. + +'-G' + Run 'grap' preprocessor; implies '-p'. + +'-h' + Display a usage message and exit. + +'-i' + Read the standard input after all the named input files have been + processed. + +'-IDIR' + Search the directory DIR for files named in several contexts; + implies '-g' and '-s'. + + * 'gsoelim' replaces 'so' requests with the contents of their + file name arguments. + + * 'gtroff' searches for files named as operands in its command + line and as arguments to 'psbb', 'so', and 'soquiet' requests. + + * Output drivers may search for files; for instance, 'grops' + looks for files named in '\X'ps: import ...'', '\X'ps: file + ...'', and '\X'pdf: pdfpic ...'' device control escape + sequences. + + This option may be specified more than once; the directories are + searched in the order specified. If you want to search the current + directory before others, add '-I .' at the desired place. The + current working directory is otherwise searched last. '-I' works + similarly to, and is named for, the "include" option of Unix C + compilers. + + '-I' options are passed to 'gsoelim', 'gtroff', and output drivers; + with the flag letter changed to '-M', they are also passed to + 'ggrn'. + +'-j' + Run 'gchem' preprocessor. Implies '-p'. + +'-k' + Run 'preconv' preprocessor. Refer to its man page for its behavior + if neither of 'groff''s '-K' or '-D' options is also specified. + +'-KENC' + Set input encoding used by 'preconv' to ENC; implies '-k'. + +'-l' + Send the output to a spooler for printing. The 'print' directive + in the device description file specifies the default command to be + used; see *note Device and Font Description Files::. See options + '-L' and '-X'. + +'-LARG' + Pass ARG to the print spooler program. If multiple ARGs are + required, pass each with a separate '-L' option. 'groff' does not + prefix an option dash to ARG before passing it to the spooler + program. + +'-mNAME' + Process the file 'NAME.tmac' prior to any input files. If not + found, 'tmac.NAME' is attempted. NAME (in both arrangements) is + presumed to be a macro file; see the description of + 'GROFF_TMAC_PATH' in *note Environment:: below for the default + search locations and ordering. This option and its argument are + also passed to 'geqn', 'grap', and 'ggrn'. + +'-MDIR' + Search directory 'DIR' for macro files; see the description of + 'GROFF_TMAC_PATH' in *note Environment:: below for the default + search locations and ordering. This option and its argument are + also passed to 'geqn', 'grap', and 'ggrn'. + +'-nNUM' + Number the first page NUM. + +'-N' + Prohibit newlines between 'eqn' delimiters: pass '-N' to 'geqn'. + +'-oLIST' + Output only pages in LIST, which is a comma-separated list of page + ranges; 'N' means page N, 'M-N' means every page between M and N, + '-N' means every page up to N, 'N-' means every page from N on. + 'gtroff' stops processing and exits after formatting the last page + enumerated in LIST. + +'-p' + Run 'gpic' preprocessor. + +'-PARG' + Pass ARG to the postprocessor. If multiple ARGs are required, pass + each with a separate '-P' option. 'groff' does not prefix an + option dash to ARG before passing it to the postprocessor. + +'-rCNUMERIC-EXPRESSION' +'-rREGISTER=EXPR' + Set 'roff' register C or REGISTER to the value NUMERIC-EXPRESSION + (*note Numeric Expressions::). C must be one character; REGISTER + can be of arbitrary length. Such register assignments happen + before any macro file is loaded, including the startup file. Due + to 'getopt_long' limitations, C cannot be, and REGISTER cannot + contain, an equals sign, even though that is a valid character in a + 'roff' identifier. + +'-R' + Run 'grefer' preprocessor. No mechanism is provided for passing + arguments to 'grefer' because most 'grefer' options have equivalent + language elements that can be specified within the document. + + 'gtroff' also accepts a '-R' option, which is not accessible via + 'groff'. This option prevents the loading of the 'troffrc' and + 'troffrc-end' files. + +'-s' + Run 'gsoelim' preprocessor. + +'-S' + Operate in "safer" mode; see '-U' below for its opposite. For + security reasons, safer mode is enabled by default. + +'-t' + Run 'gtbl' preprocessor. + +'-TDEV' + Direct 'gtroff' to format the input for the output device DEV. + 'groff' then calls an output driver to convert 'gtroff''s output to + a form appropriate for DEV. The following output devices are + available. + + 'ps' + For PostScript printers and previewers. + + 'pdf' + For PDF viewers or printers. + + 'dvi' + For TeX DVI format. + + 'X75' + For a 75dpi X11 previewer. + + 'X75-12' + For a 75dpi X11 previewer with a 12-point base font in the + document. + + 'X100' + For a 100dpi X11 previewer. + + 'X100-12' + For a 100dpi X11 previewer with a 12-point base font in the + document. + + 'ascii' + For typewriter-like devices using the (7-bit) ASCII (ISO 646) + character set. + + 'latin1' + For typewriter-like devices that support the Latin-1 + (ISO 8859-1) character set. + + 'utf8' + For typewriter-like devices that use the Unicode (ISO 10646) + character set with UTF-8 encoding. + + 'cp1047' + For typewriter-like devices that use the EBCDIC encoding IBM + code page 1047. + + 'lj4' + For HP LaserJet4-compatible (or other PCL5-compatible) + printers. + + 'lbp' + For Canon CaPSL printers (LBP-4 and LBP-8 series laser + printers). + + 'html' + 'xhtml' + To produce HTML and XHTML output, respectively. This driver + consists of two parts, a preprocessor ('pre-grohtml') and a + postprocessor ('post-grohtml'). + + The predefined GNU 'troff' string '.T' contains the name of the + output device; the read-only register '.T' is set to 1 if this + option is used (which is always true if 'groff' is used to call GNU + 'troff'). *Note Built-in Registers::. + + The postprocessor to be used for a device is specified by the + 'postpro' command in the device description file. (*Note Device + and Font Description Files::.) This can be overridden with the + '-X' option. + +'-U' + Operate in "unsafe mode", which enables the 'open', 'opena', 'pi', + 'pso', and 'sy' requests. These requests are disabled by default + because they allow an untrusted input document to write to + arbitrary file names and run arbitrary commands. This option also + adds the current directory to the macro package search path; see + the '-m' option above. '-U' is passed to 'gpic' and 'gtroff'. + +'-v' + Write version information for 'groff' and all programs run by it to + the standard output stream; that is, the given command line is + processed in the usual way, passing '-v' to the formatter and any + pre- or postprocessors invoked. + +'-V' + Output the pipeline that would be run by 'groff' (as a wrapper + program) to the standard output stream, but do not execute it. If + given more than once, the pipeline is both written to the standard + error stream and run. + +'-wCATEGORY' + Enable warnings in CATEGORY. Categories are listed in *note + Warnings::. + +'-WCATEGORY' + Inhibit warnings in CATEGORY. Categories are listed in *note + Warnings::. + +'-X' + Use 'gxditview' instead of the usual postprocessor to (pre)view a + document on an X11 display. Combining this option with '-Tps' uses + the font metrics of the PostScript device, whereas the '-TX75' and + '-TX100' options use the metrics of X11 fonts. + +'-z' + Suppress formatted output from 'gtroff'. + +'-Z' + Disable postprocessing. 'gtroff' output will appear on the + standard output stream (unless suppressed with '-z'; see *note + gtroff Output:: for a description of this format. + + +File: groff.info, Node: Environment, Next: Macro Directories, Prev: Groff Options, Up: Invoking groff + +2.2 Environment +=============== + +There are also several environment variables (of the operating system, +not within 'gtroff') that can modify the behavior of 'groff'. + +'GROFF_BIN_PATH' + This search path, followed by 'PATH', is used for commands executed + by 'groff'. + +'GROFF_COMMAND_PREFIX' + If this is set to X, then 'groff' runs 'Xtroff' instead of + 'gtroff'. This also applies to 'tbl', 'pic', 'eqn', 'grn', 'chem', + 'refer', and 'soelim'. It does not apply to 'grops', 'grodvi', + 'grotty', 'pre-grohtml', 'post-grohtml', 'preconv', 'grolj4', + 'gropdf', and 'gxditview'. + + The default command prefix is determined during the installation + process. If a non-GNU 'troff' system is found, prefix 'g' is used, + none otherwise. + +'GROFF_ENCODING' + The value of this variable is passed to the 'preconv' + preprocessor's '-e' option to select the character encoding of + input files. This variable's existence implies the 'groff' option + '-k'. If set but empty, 'groff' calls 'preconv' without an '-e' + option. 'groff''s '-K' option overrides 'GROFF_ENCODING'. See the + 'preconv(7)' man page; type 'man preconv' at the command line to + view it. + +'GROFF_FONT_PATH' + A list of directories in which to seek the selected output device's + directory of device and font description files. GNU 'troff' will + search directories given as arguments to any specified '-F' options + before these, and a built-in list of directories after them. *Note + Font Directories:: and the 'troff(1)' or 'gtroff(1)' man pages. + +'GROFF_TMAC_PATH' + A list of directories in which to seek macro files. GNU 'troff' + will search directories given as arguments to any specified '-M' + options before these, and a built-in list of directories after + them. *Note Macro Directories:: and the 'troff(1)' or 'gtroff(1)' + man pages. + +'GROFF_TMPDIR' + The directory in which 'groff' creates temporary files. If this is + not set and 'TMPDIR' is set, temporary files are created in that + directory. Otherwise temporary files are created in a + system-dependent default directory (on Unix and GNU/Linux systems, + this is usually '/tmp'). 'grops', 'grefer', 'pre-grohtml', and + 'post-grohtml' can create temporary files in this directory. + +'GROFF_TYPESETTER' + Sets the default output device. If empty or not set, a build-time + default (often 'ps') is used. The '-TDEV' option overrides + 'GROFF_TYPESETTER'. + +'SOURCE_DATE_EPOCH' + A timestamp (expressed as seconds since the Unix epoch) to use as + the output creation timestamp in place of the current time. The + time is converted to human-readable form using 'localtime(3)' when + the formatter starts up and stored in registers usable by documents + and macro packages (*note Built-in Registers::). + +'TZ' + The time zone to use when converting the current time (or value of + 'SOURCE_DATE_EPOCH') to human-readable form; see 'tzset(3)'. + + MS-DOS and MS-Windows ports of 'groff' use semicolons, rather than +colons, to separate the directories in the lists described above. + + +File: groff.info, Node: Macro Directories, Next: Font Directories, Prev: Environment, Up: Invoking groff + +2.3 Macro Directories +===================== + +A macro file must have a name in the form 'NAME.tmac' or 'tmac.NAME' and +be placed in a "tmac directory" to be found by the '-mNAME' command-line +option.(1) (*note Macro Directories-Footnote-1::) Together, these +directories constitute the "tmac path". Each directory is searched in +the following order until the desired macro file is found or the list is +exhausted. + + * Directories specified with GNU 'troff''s or 'groff''s '-M' + command-line option. + + * Directories listed in the 'GROFF_TMAC_PATH' environment variable. + + * The current working directory (only if in unsafe mode using the + '-U' command-line option). + + * The user's home directory, 'HOME'. + + * A platform-dependent directory, a site-local (platform-independent) + directory, and the main tmac directory. The locations + corresponding to your installation are listed in section + "Environment" of 'gtroff(1)'. If not otherwise configured, they + are as follows. + + /usr/local/lib/groff/site-tmac + /usr/local/share/groff/site-tmac + /usr/local/share/groff/1.23.0/tmac + + The foregoing assumes that the version of 'groff' is 1.23.0, and + that the installation prefix was '/usr/local'. It is possible to + fine-tune these locations during the source configuration process. + + +File: groff.info, Node: Macro Directories-Footnotes, Up: Macro Directories + + (1) The 'mso' request does not have these limitations. *Note I/O::. + + +File: groff.info, Node: Font Directories, Next: Paper Format, Prev: Macro Directories, Up: Invoking groff + +2.4 Font Directories +==================== + +'groff' enforces few restrictions on how font description files are +named. For its family/style mechanism to work (*note Font Families::), +the names of fonts within a family should start with the family name, +followed by the style. For example, the Times family uses 'T' for the +family name and 'R', 'B', 'I', and 'BI' to indicate the styles 'roman', +'bold', 'italic', and 'bold italic', respectively. Thus the final font +names are 'TR', 'TB', 'TI', and 'TBI'. + + Font description files are kept in "font directories", which together +constitute the "font path". The search procedure always appends the +directory 'dev'NAME, where NAME is the name of the output device. +Assuming TeX DVI output, and '/foo/bar' as a font directory, the font +description files for 'grodvi' must be in '/foo/bar/devdvi'. Each +directory in the font path is searched in the following order until the +desired font description file is found or the list is exhausted. + + * Directories specified with GNU 'troff''s or 'groff''s '-f' + command-line option. All output drivers (and some preprocessors) + support this option as well, because they require information about + the glyphs to be rendered in the document. + + * Directories listed in the 'GROFF_FONT_PATH' environment variable. + + * A site-local directory and the main font description directory. + The locations corresponding to your installation are listed in + section "Environment" of 'gtroff(1)'. If not otherwise configured, + they are as follows. + + /usr/local/share/groff/site-font + /usr/local/share/groff/1.23.0/font + + The foregoing assumes that the version of 'groff' is 1.23.0, and + that the installation prefix was '/usr/local'. It is possible to + fine-tune these locations during the source configuration process. + + +File: groff.info, Node: Paper Format, Next: Invocation Examples, Prev: Font Directories, Up: Invoking groff + +2.5 Paper Format +================ + +In 'groff', the page dimensions for the formatter GNU 'troff' and for +output devices are handled separately. *Note Page Layout::, for +vertical manipulation of the page size, and *Note Line Layout::, for +horizontal changes. The 'papersize' macro package, normally loaded by +'troffrc' at startup, provides an interface for configuring page +dimensions by convenient names, like 'letter' or 'a4'; see +'groff_tmac(5)'. The default used by the formatter depends on its build +configuration, but is usually one of the foregoing, as geographically +appropriate. + + It is up to each macro package to respect the page dimensions +configured in this way. + + For each output device, the size of the output medium can be set in +its 'DESC' file. Most output drivers also recognize a command-line +option '-p' to override the default dimensions and an option '-l' to use +landscape orientation. *Note DESC File Format::, for a description of +the 'papersize' keyword, which takes an argument of the same form as +'-p'. The output driver's man page, such as 'grops(1)', may also be +helpful. + + 'groff' uses the command-line option '-P' to pass options to +postprocessors; for example, use the following for PostScript output on +A4 paper in landscape orientation. + + groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps + + +File: groff.info, Node: Invocation Examples, Prev: Paper Format, Up: Invoking groff + +2.6 Invocation Examples +======================= + +'roff' systems are best known for formatting man pages. Once a 'man' +librarian program has located a man page, it may execute a 'groff' +command much like the following. + + groff -t -man -Tutf8 /usr/share/man/man1/groff.1 + + The librarian will also pipe the output through a pager, which might +not interpret the SGR terminal escape sequences 'groff' emits for +boldface, underlining, or italics; see the 'grotty(1)' man page for a +discussion. + + To process a 'roff' input file using the preprocessors 'gtbl' and +'gpic' and the 'me' macro package in the way to which AT&T 'troff' users +were accustomed, one would type (or script) a pipeline. + + gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty + + Using 'groff', this pipe can be shortened to an equivalent command. + + groff -p -t -me -T utf8 foo.me + + An even easier way to do this is to use 'grog' to guess the +preprocessor and macro options and execute the result by using the +command substitution feature of the shell. + + $(grog -Tutf8 foo.me) + + Each command-line option to a postprocessor must be specified with +any required leading dashes '-' because 'groff' passes the arguments +as-is to the postprocessor; this permits arbitrary arguments to be +transmitted. For example, to pass a title to the 'gxditview' +postprocessor, the shell commands + + groff -X -P -title -P 'trial run' mydoc.t + +and + + groff -X -Z mydoc.t | gxditview -title 'trial run' - + +are equivalent. + + +File: groff.info, Node: Tutorial for Macro Users, Next: Major Macro Packages, Prev: Invoking groff, Up: Top + +3 Tutorial for Macro Users +************************** + +Most users of the 'roff' language employ a macro package to format their +documents. Successful macro packages ease the composition process; +their users need not have mastered the full formatting language, nor +understand features like diversions, traps, and environments. This +chapter aims to familiarize you with basic concepts and mechanisms +common to many macro packages (like "displays"). If you prefer a +meticulous and comprehensive presentation, try *note GNU troff +Reference:: instead. + +* Menu: + +* Basics:: +* Common Features:: + + +File: groff.info, Node: Basics, Next: Common Features, Prev: Tutorial for Macro Users, Up: Tutorial for Macro Users + +3.1 Basics +========== + +Let us first survey some basic concepts necessary to use a macro package +fruitfully.(1) (*note Basics-Footnote-1::) References are made +throughout to more detailed information. + + GNU 'troff' reads an input file prepared by the user and outputs a +formatted document suitable for publication or framing. The input +consists of text, or words to be printed, and embedded commands +(requests and escape sequences), which tell GNU 'troff' how to format +the output. *Note Formatter Instructions::. + + The word argument is used in this chapter to mean a word or number +that appears on the same line as a request, and which modifies the +meaning of that request. For example, the request + + .sp + +spaces one line, but + + .sp 4 + +spaces four lines. The number 4 is an argument to the 'sp' request, +which says to space four lines instead of one. Arguments are separated +from the request and from each other by spaces (_not_ tabs). *Note +Invoking Requests::. + + The primary function of GNU 'troff' is to collect words from input +lines, fill output lines with those words, adjust the line to the +right-hand margin by widening spaces, and output the result. For +example, the input: + + Now is the time + for all good men + to come to the aid + of their party. + Four score and seven + years ago, etc. + +is read, packed onto output lines, and justified to produce: + + => Now is the time for all good men to come to the aid of + => their party. Four score and seven years ago, etc. + + Sometimes a new output line should be started even though the current +line is not yet full--for example, at the end of a paragraph. To do +this it is possible to force a break, starting a new output line. Some +requests cause a break automatically, as do (normally) blank input lines +and input lines beginning with a space or tab. + + Not all input lines are text lines--words to be formatted. Some are +control lines that tell a macro package (or GNU 'troff' directly) how to +format the text. Control lines start with a dot ('.') or an apostrophe +(''') as the first character, and can be followed by a macro call. + + The formatter also does more complex things, such as automatically +numbering pages, skipping over page boundaries, putting footnotes in the +correct place, and so forth. + + Here are a few hints for preparing text for input to GNU 'troff'. + + * First, keep the input lines short. Short input lines are easier to + edit, and GNU 'troff' packs words onto longer lines anyhow. + + * In keeping with this, it is helpful to begin a new line after every + comma or phrase, since common corrections are to add or delete + sentences or phrases. + + * End each sentence with two spaces--or better, start each sentence + on a new line. GNU 'troff' recognizes characters that usually end + a sentence, and inserts inter-sentence space accordingly. + + * Do not hyphenate words at the end of lines--GNU 'troff' is smart + enough to hyphenate words as needed, but is not smart enough to + take hyphens out and join a word back together. Also, words such + as "mother-in-law" should not be broken over a line, since then a + space can occur where not wanted, such as "mother- in-law". + + We offer further advice in *note Input Conventions::. + + GNU 'troff' permits alteration of the distance between lines of text. +This is termed vertical spacing and is expressed in the same units as +the type size--the point. The default is 10-point type on 12-point +spacing. To get double-spaced text you would set the vertical spacing +to 24 points. Some, but not all, macro packages expose a macro or +register to configure the vertical spacing. + + A number of requests allow you to change the way the output is +arranged on the page, sometimes called the layout of the output page. +Most macro packages don't supply macros for performing these (at least +not without performing other actions besides), as they are such basic +operations. The macro packages for writing man pages, 'man' and 'mdoc', +don't encourage explicit use of these requests at all. + + The request '.sp N' leaves N lines of blank space. N can be omitted +(skipping a single line) or can be of the form Ni (for N inches) or Nc +(for N centimeters). For example, the input: + + .sp 1.5i + My thoughts on the subject + .sp + +leaves one and a half inches of space, followed by the line "My thoughts +on the subject", followed by a single blank line (more measurement units +are available; see *note Measurements::). + + If you seek precision in spacing, be advised when using a macro +package that it might not honor 'sp' requests as you expect; it can use +a formatter feature called no-space mode to prevent excess space from +accumulating. Macro packages typically offer registers to control +spacing between paragraphs, before section headings, and around displays +(discussed below); use these facilities preferentially. *Note +Manipulating Spacing::. + + Text lines can be centered by using the 'ce' request. The line after +'ce' is centered (horizontally) on the page. To center more than one +line, use '.ce N' (where N is the number of lines to center), followed +by the N lines. To center many lines without counting them, type: + + .ce 1000 + lines to center + .ce 0 + +The '.ce 0' request tells GNU 'troff' to center zero more lines, in +other words, stop centering. + + GNU 'troff' also offers the 'rj' request for right-aligning text. It +works analogously to 'ce' and is convenient for setting epigraphs. + + The 'bp' request starts a new page; this necessarily implies an +ordinary (line) break. + + All of these requests cause a break; that is, they always start a new +line. To start a new line without performing any other action, use +'br'. If you invoke them with the apostrophe ''', the no-break control +character, the (initial) break they normally perform is suppressed. +''br' does nothing. + + +File: groff.info, Node: Basics-Footnotes, Up: Basics + + (1) The remainder of this chapter is based on 'Writing Papers with +nroff using -me' by Eric P. Allman, which is distributed with 'groff' as +'meintro.me'. + + +File: groff.info, Node: Common Features, Prev: Basics, Up: Tutorial for Macro Users + +3.2 Common Features +=================== + +GNU 'troff' provides low-level operations for formatting a document. +Many routine operations are undertaken in nearly all documents that +require a series of such primitive operations to be performed. These +common tasks are grouped into macros, which are then collected into a +macro package. + + Macro packages come in two varieties: "major" or "full-service" ones +that manage page layout, and "minor" or "auxiliary" ones that do not, +instead fulfilling narrow, specific tasks. Find a list in the +'groff_tmac(5)' man page. Type 'man groff_tmac' at the command line to +view it. + + We survey several capabilities of full-service macro package below. +Each package employs its own macros to exercise them. For details, +consult its man page or, for 'ms', see *note ms::. + +* Menu: + +* Paragraphs:: +* Sections and Chapters:: +* Headers and Footers:: +* Page Layout Adjustment:: +* Displays and Keeps:: +* Footnotes and Endnotes:: +* Table of Contents:: +* Indexing:: +* Document Formats:: +* Columnation:: +* Font and Size Changes:: +* Predefined Text:: +* Preprocessor Support:: +* Configuration and Customization:: + + +File: groff.info, Node: Paragraphs, Next: Sections and Chapters, Prev: Common Features, Up: Common Features + +3.2.1 Paragraphs +---------------- + +Paragraphs can be separated and indented in various ways. Some start +with a blank line and have a first-line indentation, like most of the +ones in this manual. Block paragraphs omit the indentation. + + => Some men look at constitutions with sanctimonious + => reverence, and deem them like the ark of the + => covenant, too sacred to be touched. + +We also frequently encounter tagged paragraphs, which begin with a tag +or label at the left margin and indent the remaining text. + + => one This is the first paragraph. Notice how the + => first line of the resulting paragraph lines + => up with the other lines in the paragraph. + +If the tag is too wide for the indentation, the line is broken. + + => longlabel + => The label does not align with the subsequent + => lines, but they align with each other. + +A variation of the tagged paragraph is the itemized or enumerated +paragraph, which might use punctuation or a digit for a tag, +respectively. These are frequently used to construct lists. + + => o This list item starts with a bullet. When + => producing output for a device using the ASCII + => character set, an 'o' is formatted instead. + +Often, use of the same macro without a tag continues such a discussion. + + => -xyz This option is recognized but ignored. + => + => It had a security hole that we don't discuss. + + +File: groff.info, Node: Sections and Chapters, Next: Headers and Footers, Prev: Paragraphs, Up: Common Features + +3.2.2 Sections and Chapters +--------------------------- + +The simplest kind of section heading is unnumbered, set in a bold or +italic style, and occupies a line by itself. Others possess +automatically numbered multi-level headings and/or different typeface +styles or sizes at different levels. More sophisticated macro packages +supply macros for designating chapters and appendices. + + +File: groff.info, Node: Headers and Footers, Next: Page Layout Adjustment, Prev: Sections and Chapters, Up: Common Features + +3.2.3 Headers and Footers +------------------------- + +Headers and footers occupy the top and bottom of each page, +respectively, and contain data like the page number and the article or +chapter title. Their appearance is not affected by the running text. +Some packages allow for different titles on even- and odd-numbered pages +(for printed, bound material). + + Headers and footers are together called titles, and comprise three +parts: left-aligned, centered, and right-aligned. A '%' character +appearing anywhere in a title is automatically replaced by the page +number. *Note Page Layout::. + + +File: groff.info, Node: Page Layout Adjustment, Next: Displays and Keeps, Prev: Headers and Footers, Up: Common Features + +3.2.4 Page Layout +----------------- + +Most macro packages let the user specify the size of the page margins. +The top and bottom margins are typically handled differently than the +left and right margins; the latter two are derived from the page offset, +indentation, and line length. *Note Line Layout::. Commonly, packages +support registers to tune these values. + + +File: groff.info, Node: Displays and Keeps, Next: Footnotes and Endnotes, Prev: Page Layout Adjustment, Up: Common Features + +3.2.5 Displays and Keeps +------------------------ + +Displays are sections of text set off from the surrounding material +(typically paragraphs), often differing in indentation, and/or spacing. +Tables, block quotations, and figures are displayed. Equations and code +examples, when not much shorter than an output line, often are. Lists +may or may not be. Packages for setting man pages support example +displays but not keeps. + + A keep is a group of output lines, often a display, that is formatted +on a single page if possible; it causes a page break to happen early so +as to not interrupt the kept material. + + Floating keeps can move, or "float", relative to the text around them +in the input. They are useful for displays that are captioned and +referred to by name, as with "See figure 3". Depending on the package, +a floating keep appears at the bottom of the current page if it fits, +and at the top of the next otherwise. Alternatively, floating keeps +might be deferred to the end of a section. Using a floating keep can +avoid the large vertical spaces that may precede a tall keep of the +ordinary sort when it won't fit on the page. + + +File: groff.info, Node: Footnotes and Endnotes, Next: Table of Contents, Prev: Displays and Keeps, Up: Common Features + +3.2.6 Footnotes and Endnotes +---------------------------- + +Footnotes and endnotes are forms of delayed formatting. They are +recorded at their points of relevance in the input, but not formatted +there. Instead, a mark cues the reader to check the "foot", or bottom, +of the current page, or in the case of endnotes, an annotation list +later in the document. Macro packages that support these features also +supply a means of automatically numbering either type of annotation. + + +File: groff.info, Node: Table of Contents, Next: Indexing, Prev: Footnotes and Endnotes, Up: Common Features + +3.2.7 Table of Contents +----------------------- + +A package may handle a table of contents by directing section heading +macros to save section heading text and the page number where it occurs +for use in a later entry for a table of contents. It writes the +collected entries at the end of the document, once all are known, upon +request. A row of dots (a leader) bridges the text on the left with its +location on the right. Other collections might work in this manner, +providing lists of figures or tables. + + A table of contents is often found at the end of a GNU 'troff' +document because the formatter processes the document in a single pass. +The 'gropdf' output driver supports a PDF feature that relocates pages +at the time the document is rendered; see the 'gropdf(1)' man page. +Type 'man gropdf' at the command line to view it. + + +File: groff.info, Node: Indexing, Next: Document Formats, Prev: Table of Contents, Up: Common Features + +3.2.8 Indexing +-------------- + +An index is similar to a table of contents, in that entry labels and +locations must be collected, but poses a greater challenge because it +needs to be sorted before it is output. Here, processing the document +in multiple passes is inescapable, and tools like the 'makeindex' +program are necessary. + + +File: groff.info, Node: Document Formats, Next: Columnation, Prev: Indexing, Up: Common Features + +3.2.9 Document Formats +---------------------- + +Some macro packages supply stock configurations of certain documents, +like business letters and memoranda. These often also have provision +for a cover sheet, which may be rigid in its format. With these +features, it is even more important to use the package's macros in +preference to the formatter requests presented earlier, where possible. + + +File: groff.info, Node: Columnation, Next: Font and Size Changes, Prev: Document Formats, Up: Common Features + +3.2.10 Columnation +------------------ + +Macro packages apart from 'man' and 'mdoc' for man page formatting offer +a facility for setting multiple columns on the page. + + +File: groff.info, Node: Font and Size Changes, Next: Predefined Text, Prev: Columnation, Up: Common Features + +3.2.11 Font and Size Changes +---------------------------- + +The formatter's requests and escape sequences for setting the typeface +and size are not always intuitive, so all macro packages provide macros +to make these operations simpler. They also make it more convenient to +change typefaces in the middle of a word and can handle italic +corrections automatically. *Note Italic Corrections::. + + +File: groff.info, Node: Predefined Text, Next: Preprocessor Support, Prev: Font and Size Changes, Up: Common Features + +3.2.12 Predefined Text +---------------------- + +Most macro packages supply predefined strings to set prepared text like +the date, or to perform operations like super- and subscripting. + + +File: groff.info, Node: Preprocessor Support, Next: Configuration and Customization, Prev: Predefined Text, Up: Common Features + +3.2.13 Preprocessor Support +--------------------------- + +All macro packages provide support for various preprocessors and may +extend their functionality by defining macros to set their contents in +displays. Examples include 'TS' and 'TE' for 'gtbl', 'EQ' and 'EN' for +'geqn', and 'PS' and 'PE' for 'gpic'. + + +File: groff.info, Node: Configuration and Customization, Prev: Preprocessor Support, Up: Common Features + +3.2.14 Configuration and Customization +-------------------------------------- + +Packages provide means of customizing many of the details of how the +package behaves. These range from setting the default type size to +changing the appearance of section headers. + + +File: groff.info, Node: Major Macro Packages, Next: GNU troff Reference, Prev: Tutorial for Macro Users, Up: Top + +4 Macro Packages +**************** + +This chapter surveys the "major" macro packages that come with 'groff'. +One, 'ms', is presented in detail. + + Major macro packages are also sometimes described as "full-service" +due to the breadth of features they provide and because more than one +cannot be used by the same document; for example + + groff -m man foo.man -m ms bar.doc + +doesn't work. Option arguments are processed before non-option +arguments; the above (failing) sample is thus reordered to + + groff -m man -m ms foo.man bar.doc + + Many auxiliary, or "minor", macro packages are also available. They +may in general be used with any full-service macro package and handle a +variety of tasks from character encoding selection, to language +localization, to inlining of raster images. See the 'groff_tmac(5)' man +page for a list. Type 'man groff_tmac' at the command line to view it. + +* Menu: + +* man:: +* mdoc:: +* me:: +* mm:: +* mom:: +* ms:: + + +File: groff.info, Node: man, Next: mdoc, Prev: Major Macro Packages, Up: Major Macro Packages + +4.1 'man' +========= + +The 'man' macro package is the most widely used and probably the most +important ever developed for 'troff'. It is easy to use, and a vast +majority of manual pages ("man pages") are written in it. + + 'groff''s implementation is documented in the 'groff_man(7)' man +page. Type 'man groff_man' at the command line to view it. + +* Menu: + +* Optional man extensions:: + + +File: groff.info, Node: Optional man extensions, Up: man + +4.1.1 Optional 'man' extensions +------------------------------- + +Use the file 'man.local' for local extensions to the 'man' macros or for +style changes. + +Custom headers and footers +.......................... + +In 'groff' versions 1.18.2 and later, you can specify custom headers and +footers by redefining the following macros in 'man.local'. + + -- Macro: .PT + Control the content of the headers. Normally, the header prints + the command name and section number on either side, and the + optional fifth argument to 'TH' in the center. + + -- Macro: .BT + Control the content of the footers. Normally, the footer prints + the page number and the third and fourth arguments to 'TH'. + + Use the 'FT' register to specify the footer position. The default + is -0.5i. + +Ultrix-specific man macros +.......................... + +The 'groff' source distribution includes a file named 'man.ultrix', +containing macros compatible with the Ultrix variant of 'man'. Copy +this file into 'man.local' (or use the 'mso' request to load it) to +enable the following macros. + + -- Macro: .CT key + Print ''. + + -- Macro: .CW + Print subsequent text using a "constant-width" (monospaced) + typeface (Courier roman). + + -- Macro: .Ds + Begin a non-filled display. + + -- Macro: .De + End a non-filled display started with 'Ds'. + + -- Macro: .EX [indent] + Begin a non-filled display using a monospaced typeface (Courier + roman). Use the optional INDENT argument to indent the display. + + -- Macro: .EE + End a non-filled display started with 'EX'. + + -- Macro: .G [text] + Set TEXT in Helvetica. If no text is present on the line where the + macro is called, then the text of the next line appears in + Helvetica. + + -- Macro: .GL [text] + Set TEXT in Helvetica oblique. If no text is present on the line + where the macro is called, then the text of the next line appears + in Helvetica Oblique. + + -- Macro: .HB [text] + Set TEXT in Helvetica bold. If no text is present on the line + where the macro is called, then all text up to the next 'HB' + appears in Helvetica bold. + + -- Macro: .TB [text] + Identical to 'HB'. + + -- Macro: .MS title sect [punct] + Set a man page reference in Ultrix format. The TITLE is in Courier + instead of italic. Optional punctuation follows the section number + without an intervening space. + + -- Macro: .NT [C] [title] + Begin a note. Print the optional title, or the word "Note", + centered on the page. Text following the macro makes up the body + of the note, and is indented on both sides. If the first argument + is 'C', the body of the note is printed centered (the second + argument replaces the word "Note" if specified). + + -- Macro: .NE + End a note begun with 'NT'. + + -- Macro: .PN path [punct] + Set the path name in a monospaced typeface (Courier roman), + followed by optional punctuation. + + -- Macro: .Pn [punct] path [punct] + If called with two arguments, identical to 'PN'. If called with + three arguments, set the second argument in a monospaced typeface + (Courier roman), bracketed by the first and third arguments in the + current font. + + -- Macro: .R + Switch to roman font and turn off any underlining in effect. + + -- Macro: .RN + Print the string ''. + + -- Macro: .VS [4] + Start printing a change bar in the margin if the number '4' is + specified. Otherwise, this macro does nothing. + + -- Macro: .VE + End printing the change bar begun by 'VS'. + +Simple example +.............. + +The following example 'man.local' file alters the 'SH' macro to add some +extra vertical space before printing the heading. Headings are printed +in Helvetica bold. + + .\" Make the heading fonts Helvetica + .ds HF HB + . + .\" Put more space in front of headings. + .rn SH SH-orig + .de SH + . if t .sp (u;\\n[PD]*2) + . SH-orig \\$* + .. + + +File: groff.info, Node: mdoc, Next: me, Prev: man, Up: Major Macro Packages + +4.2 'mdoc' +========== + +'groff''s implementation of the BSD 'doc' package for man pages is +documented in the 'groff_mdoc(7)' man page. Type 'man groff_mdoc' at +the command line to view it. + + +File: groff.info, Node: me, Next: mm, Prev: mdoc, Up: Major Macro Packages + +4.3 'me' +======== + +'groff''s implementation of the BSD 'me' macro package is documented +using itself. A tutorial, 'meintro.me', and reference, 'meref.me', are +available in 'groff''s documentation directory. A 'groff_me(7)' man +page is also available and identifies the installation path for these +documents. Type 'man groff_me' at the command line to view it. + + A French translation of the tutorial is available as 'meintro_fr.me' +and installed parallel to the English version. + + +File: groff.info, Node: mm, Next: mom, Prev: me, Up: Major Macro Packages + +4.4 'mm' +======== + +'groff''s implementation of the AT&T memorandum macro package is +documented in the 'groff_mm(7)' man page. Type 'man groff_mm' at the +command line) to view it. + + A Swedish localization of 'mm' is also available; see +'groff_mmse(7)'. + + +File: groff.info, Node: mom, Next: ms, Prev: mm, Up: Major Macro Packages + +4.5 'mom' +========= + +The main documentation files for the 'mom' macros are in HTML format. +Additional, useful documentation is in PDF format. See the 'groff(1)' +man page, section "Installation Directories", for their location. + + * 'toc.html' Entry point to the full mom manual. + + * 'macrolist.html' Hyperlinked index of macros with brief + descriptions, arranged by category. + + * 'mom-pdf.pdf' PDF features and usage. + + The mom macros are in active development between 'groff' releases. +The most recent version, along with up-to-date documentation, is +available at . + + The 'groff_mom(7)' man page (type 'man groff_mom' at the command +line) contains a partial list of available macros, however their usage +is best understood by consulting the HTML documentation. + + +File: groff.info, Node: ms, Prev: mom, Up: Major Macro Packages + +4.6 'ms' +======== + +The 'ms' ("manuscript") package is suitable for the preparation of +letters, memoranda, reports, and books. These 'groff' macros feature +cover page and table of contents generation, automatically numbered +headings, several paragraph styles, a variety of text styling options, +footnotes, and multi-column page layouts. 'ms' supports the 'tbl', +'eqn', 'pic', and 'refer' preprocessors for inclusion of tables, +mathematical equations, diagrams, and standardized bibliographic +citations. This implementation is mostly compatible with the documented +interface and behavior of AT&T Unix Version 7 'ms'. Many extensions +from 4.2BSD (Berkeley) and Tenth Edition Research Unix have been +recreated. + +* Menu: + +* ms Introduction:: +* ms Document Structure:: +* ms Document Control Settings:: +* ms Document Description Macros:: +* ms Body Text:: +* ms Page Layout:: +* Differences from AT&T ms:: +* ms Legacy Features:: +* ms Naming Conventions:: + + +File: groff.info, Node: ms Introduction, Next: ms Document Structure, Prev: ms, Up: ms + +4.6.1 Introduction +------------------ + +The 'ms' macros are the oldest surviving package for 'roff' systems.(1) +(*note ms Introduction-Footnote-1::) While the 'man' package was +designed for brief reference documents, the 'ms' macros are also +suitable for longer works intended for printing and possible +publication. + +* Menu: + +* ms basic information:: + + +File: groff.info, Node: ms Introduction-Footnotes, Up: ms Introduction + + (1) While manual _pages_ are older, early ones used macros supplanted +by the 'man' package of Seventh Edition Unix (1979). 'ms' shipped with +Sixth Edition (1975) and was documented by Mike Lesk in a Bell Labs +internal memorandum. + + +File: groff.info, Node: ms basic information, Next: ms Document Structure, Prev: ms Introduction, Up: ms Introduction + +4.6.1.1 Basic information +......................... + +'ms' documents are plain text files; prepare them with your preferred +text editor. If you're in a hurry to start, know that 'ms' needs one of +its macros called at the beginning of a document so that it can +initialize. A "macro" is a formatting instruction to 'ms'. Put a macro +call on a line by itself. Use '.PP' if you want your paragraph's first +line to be indented, or '.LP' if you don't. + + After that, start typing normally. It is a good practice to start +each sentence on a new line, or to put two spaces after sentence-ending +punctuation, so that the formatter knows where the sentence boundaries +are. You can separate paragraphs with further paragraphing macros, or +with blank lines, and you can indent with tabs. When you need one of +the features mentioned earlier (*note ms::), return to this part of the +manual. + + Format the document with the 'groff' command. 'nroff' can be useful +for previewing. + + $ editor radical.ms + $ nroff -ww -z -ms radical.ms # check for errors + $ nroff -ms radical.ms | less -R + $ groff -T ps -ms radical.ms > radical.ps + $ see radical.ps + + Our 'radical.ms' document might look like this. + + .LP + Radical novelties are so disturbing that they tend to be + suppressed or ignored, to the extent that even the + possibility of their existence in general is more often + denied than admitted. + + ->That's what Dijkstra said, anyway. + + 'ms' exposes many aspects of document layout to user control via +'groff''s "registers" and "strings", which store numbers and text, +respectively. Measurements in 'groff' are expressed with a suffix +called a "scaling unit". + +'i' + inches + +'c' + centimeters + +'p' + points (1/72 inch) + +'P' + picas (1/6 inch) + +'v' + vees; current vertical spacing + +'m' + ems; width of an "M" in the current font + +'n' + ens; one-half em + + Set registers with the 'nr' request and strings with the 'ds' +request. "Requests" are like macro calls; they go on lines by +themselves and start with the "control character", a dot ('.'). The +difference is that they directly instruct the formatter program, rather +than the macro package. We'll discuss a few as applicable. It is wise +to specify a scaling unit when setting any register that represents a +length, size, or distance. + + .nr PS 10.5p \" Use 10.5-point type. + .ds FAM P \" Use Palatino font family. + +In the foregoing, we see that '\"' begins a comment. This is an example +of an "escape sequence", the other kind of formatting instruction. +Escape sequences can appear anywhere. They begin with the escape +character ('\') and are followed by at least one more character. 'ms' +documents tend to use only a few of 'groff''s many requests and escape +sequences; see *note Request Index:: and *note Escape Sequence Index:: +or the 'groff(7)' man page for complete lists. + +'\"' + Begin comment; ignore remainder of line. + +'\n[REG]' + Interpolate value of register REG. + +'\*[STR]' + Interpolate contents of string STR. + +'\*S' + abbreviation of '\*[S]'; the name S must be only one character + +'\[CHAR]' + Interpolate glyph of special character named CHAR. + +'\&' + dummy character + +'\~' + Insert an unbreakable space that is adjustable like a normal space. + +'\|' + Move horizontally by one-sixth em ("thin space"). + + Prefix any words that start with a dot '.' or neutral apostrophe ''' +with '\&' if they are at the beginning of an input line (or might become +that way in editing) to prevent them from being interpreted as macro +calls or requests. Suffix '.', '?', and '!' with '\&' when needed to +cancel end-of-sentence detection. + + My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\& + Wallace after the criticality incident. + + +File: groff.info, Node: ms Document Structure, Next: ms Document Control Settings, Prev: ms Introduction, Up: ms + +4.6.2 Document Structure +------------------------ + +The 'ms' macro package expects a certain amount of structure: a +well-formed document contains at least one paragraphing or heading macro +call. Longer documents have a structure as follows. + +*Document type* + Calling the 'RP' macro at the beginning of your document puts the + document description (see below) on a cover page. Otherwise, 'ms' + places the information (if any) on the first page, followed + immediately by the body text. Some document types found in other + 'ms' implementations are specific to AT&T or Berkeley, and are not + supported by 'groff' 'ms'. + +*Format and layout* + By setting registers and strings, you can configure your document's + typeface, margins, spacing, headers and footers, and footnote + arrangement. *Note ms Document Control Settings::. + +*Document description* + A document description consists of any of: a title, one or more + authors' names and affiliated institutions, an abstract, and a date + or other identifier. *Note ms Document Description Macros::. + +*Body text* + The main matter of your document follows its description (if any). + 'ms' supports highly structured text consisting of paragraphs + interspersed with multi-level headings (chapters, sections, + subsections, and so forth) and augmented by lists, footnotes, + tables, diagrams, and similar material. *Note ms Body Text::. + +*Tables of contents* + Macros enable the collection of entries for a table of contents (or + index) as the material they discuss appears in the document. You + then call a macro to emit the table of contents at the end of your + document. The table of contents must necessarily follow the rest + of the text since GNU 'troff' is a single-pass formatter; it thus + cannot determine the page number of a division of the text until it + has been set and output. Since 'ms' was designed for the + production of hard copy, the traditional procedure was to manually + relocate the pages containing the table of contents between the + cover page and the body text. Today, page resequencing is more + often done in the digital domain. An index works similarly, but + because it typically needs to be sorted after collection, its + preparation requires separate processing. + + +File: groff.info, Node: ms Document Control Settings, Next: ms Document Description Macros, Prev: ms Document Structure, Up: ms + +4.6.3 Document Control Settings +------------------------------- + +'ms' exposes many aspects of document layout to user control via 'groff' +requests. To use them, you must understand how to define registers and +strings. + + -- Request: .nr reg value + Set register REG to VALUE. If REG doesn't exist, GNU 'troff' + creates it. + + -- Request: .ds name contents + Set string NAME to CONTENTS. + + A list of document control registers and strings follows. For any +parameter whose default is unsatisfactory, define its register or string +before calling any 'ms' macro other than 'RP'. + +Margin settings +............... + + -- Register: \n[PO] + Defines the page offset (i.e., the left margin). + + Effective: next page. + + Default: Varies by output device and paper format; 1i is used for + typesetters using U.S. letter paper, and zero for terminals. *Note + Paper Format::. + + -- Register: \n[LL] + Defines the line length (i.e., the width of the body text). + + Effective: next paragraph. + + Default: Varies by output device and paper format; 6.5i is used for + typesetters using U.S. letter paper (*note Paper Format::) and 65n + on terminals. + + -- Register: \n[LT] + Defines the title line length (i.e., the header and footer width). + This is usually the same as 'LL', but need not be. + + Effective: next paragraph. + + Default: Varies by output device and paper format; 6.5i is used for + typesetters using U.S. letter paper (*note Paper Format::) and 65n + on terminals. + + -- Register: \n[HM] + Defines the header margin height at the top of the page. + + Effective: next page. + + Default: 1i. + + -- Register: \n[FM] + Defines the footer margin height at the bottom of the page. + + Effective: next page. + + Default: 1i. + +Titles (headers, footers) +......................... + + -- String: \*[LH] + Defines the text displayed in the left header position. + + Effective: next header. + + Default: empty. + + -- String: \*[CH] + Defines the text displayed in the center header position. + + Effective: next header. + + Default: '-\n[%]-'. + + -- String: \*[RH] + Defines the text displayed in the right header position. + + Effective: next header. + + Default: empty. + + -- String: \*[LF] + Defines the text displayed in the left footer position. + + Effective: next footer. + + Default: empty. + + -- String: \*[CF] + Defines the text displayed in the center footer position. + + Effective: next footer. + + Default: empty. + + -- String: \*[RF] + Defines the text displayed in the right footer position. + + Effective: next footer. + + Default: empty. + +Text settings +............. + + -- Register: \n[PS] + Defines the type size of the body text. + + Effective: next paragraph. + + Default: 10p. + + -- Register: \n[VS] + Defines the vertical spacing (type size plus leading). + + Effective: next paragraph. + + Default: 12p. + + -- Register: \n[HY] + Defines the automatic hyphenation mode used with the 'hy' request. + Setting 'HY' to 0 is equivalent to using the 'nh' request. This is + a Tenth Edition Research Unix extension. + + Effective: next paragraph. + + Default: 6. + + -- String: \*[FAM] + Defines the font family used to typeset the document. This is a + GNU extension. + + Effective: next paragraph. + + Default: defined by the output device; often 'T' (*note ms Body + Text::) + +Paragraph settings +.................. + + -- Register: \n[PI] + Defines the indentation amount used by the 'PP', 'IP' (unless + overridden by an optional argument), 'XP', and 'RS' macros. + + Effective: next paragraph. + + Default: 5n. + + -- Register: \n[PD] + Defines the space between paragraphs. + + Effective: next paragraph. + + Default: 0.3v (1v on low-resolution devices). + + -- Register: \n[QI] + Defines the indentation amount used on both sides of a paragraph + set with the 'QP' or between the 'QS' and 'QE' macros. + + Effective: next paragraph. + + Default: 5n. + + -- Register: \n[PORPHANS] + Defines the minimum number of initial lines of any paragraph that + must be kept together to avoid isolated lines at the bottom of a + page. If a new paragraph is started close to the bottom of a page, + and there is insufficient space to accommodate 'PORPHANS' lines + before an automatic page break, then a page break is forced before + the start of the paragraph. This is a GNU extension. + + Effective: next paragraph. + + Default: 1. + +Heading settings +................ + + -- Register: \n[PSINCR] + Defines an increment in type size to be applied to a heading at a + lesser depth than that specified in 'GROWPS'. The value of + 'PSINCR' should be specified in points with the p scaling unit and + may include a fractional component; for example, '.nr PSINCR 1.5p' + sets a type size increment of 1.5p. This is a GNU extension. + + Effective: next heading. + + Default: 1p. + + -- Register: \n[GROWPS] + Defines the heading depth above which the type size increment set + by 'PSINCR' becomes effective. For each heading depth less than + the value of 'GROWPS', the type size is increased by 'PSINCR'. + Setting 'GROWPS' to any value less than 2 disables the incremental + heading size feature. This is a GNU extension. + + Effective: next heading. + + Default: 0. + + -- Register: \n[HORPHANS] + Defines the minimum number of lines of an immediately succeeding + paragraph that should be kept together with any heading introduced + by the 'NH' or 'SH' macros. If a heading is placed close to the + bottom of a page, and there is insufficient space to accommodate + both the heading and at least 'HORPHANS' lines of the following + paragraph, before an automatic page break, then the page break is + forced before the heading. This is a GNU extension. + + Effective: next paragraph. + + Default: 1. + + -- String: \*[SN-STYLE] + Defines the style used to print numbered headings. *Note Headings + in ms::. This is a GNU extension. + + Effective: next heading. + + Default: alias of 'SN-DOT' + +Footnote settings +................. + + -- Register: \n[FI] + Defines the footnote indentation. This is a Berkeley extension. + + Effective: next footnote. + + Default: 2n. + + -- Register: \n[FF] + Defines the format of automatically numbered footnotes, and those + for which the 'FS' request is given a marker argument, at the + bottom of a column or page. This is a Berkeley extension. + '0' + Set an automatic number(1) (*note ms Document Control + Settings-Footnote-1::) as a superscript (on typesetter + devices) or surrounded by square brackets (on terminals). The + footnote paragraph is indented as with 'PP' if there is an + 'FS' argument or an automatic number, and as with 'LP' + otherwise. This is the default. + + '1' + As '0', but set the marker as regular text and follow an + automatic number with a period. + + '2' + As '1', but without indentation (like 'LP'). + + '3' + As '1', but set the footnote paragraph with the marker hanging + (like 'IP'). + + Effective: next footnote. + + Default: 0. + + -- Register: \n[FPS] + Defines the footnote type size. + + Effective: next footnote. + + Default: '\n[PS] - 2p'. + + -- Register: \n[FVS] + Defines the footnote vertical spacing. + + Effective: next footnote. + + Default: '\n[FPS] + 2p'. + + -- Register: \n[FPD] + Defines the footnote paragraph spacing. This is a GNU extension. + + Effective: next footnote. + + Default: '\n[PD] / 2'. + + -- String: \*[FR] + Defines the ratio of the footnote line length to the current line + length. This is a GNU extension. + + Effective: next footnote in single-column arrangements, next page + otherwise. + + Default: '11/12'. + +Display settings +................ + + -- Register: \n[DD] + Sets the display distance--the vertical spacing before and after a + display, a 'tbl' table, an 'eqn' equation, or a 'pic' image. This + is a Berkeley extension. + + Effective: next display boundary. + + Default: 0.5v (1v on low-resolution devices). + + -- Register: \n[DI] + Sets the default amount by which to indent a display started with + 'DS' and 'ID' without arguments, to '.DS I' without an indentation + argument, and to equations set with '.EQ I'. This is a GNU + extension. + + Effective: next indented display. + + Default: 0.5i. + +Other settings +.............. + + -- Register: \n[MINGW] + Defines the default minimum width between columns in a multi-column + document. This is a GNU extension. + + Effective: next page. + + Default: 2n. + + -- Register: \n[TC-MARGIN] + Defines the width of the field in which page numbers are set in a + table of contents entry; the right margin thus moves inboard by + this amount. This is a GNU extension. + + Effective: next 'PX' call. + + Default: '\w'000'' + + +File: groff.info, Node: ms Document Control Settings-Footnotes, Up: ms Document Control Settings + + (1) defined in *note ms Footnotes:: + + +File: groff.info, Node: ms Document Description Macros, Next: ms Body Text, Prev: ms Document Control Settings, Up: ms + +4.6.4 Document Description Macros +--------------------------------- + +Only the simplest document lacks a title.(1) (*note ms Document +Description Macros-Footnote-1::) As its level of sophistication (or +complexity) increases, it tends to acquire a date of revision, +explicitly identified authors, sponsoring institutions for authors, and, +at the rarefied heights, an abstract of its content. Define these data +by calling the macros below in the order shown; 'DA' or 'ND' can be +called to set the document date (or other identifier) at any time before +(a) the abstract, if present, or (b) its information is required in a +header or footer. Use of these macros is optional, except that 'TL' is +mandatory if any of 'RP', 'AU', 'AI', or 'AB' is called, and 'AE' is +mandatory if 'AB' is called. + + -- Macro: .RP [no-repeat-info] [no-renumber] + Use the "report" (AT&T: "released paper") format for your document, + creating a separate cover page. The default arrangement is to + place most of the document description (title, author names and + institutions, and abstract, but not the date) at the top of the + first page. If the optional 'no-repeat-info' argument is given, + 'ms' produces a cover page but does not repeat any of its + information subsequently (but see the 'DA' macro below regarding + the date). Normally, 'RP' sets the page number following the cover + page to 1. Specifying the optional 'no-renumber' argument + suppresses this alteration. Optional arguments can occur in any + order. 'no' is recognized as a synonym of 'no-repeat-info' for + 'AT&T' compatibility. + + -- Macro: .TL + Specify the document title. 'ms' collects text on input lines + following this call into the title until reaching 'AU', 'AB', or a + heading or paragraphing macro call. + + -- Macro: .AU + Specify an author's name. 'ms' collects text on input lines + following this call into the author's name until reaching 'AI', + 'AB', another 'AU', or a heading or paragraphing macro call. Call + it repeatedly to specify multiple authors. + + -- Macro: .AI + Specify the preceding author's institution. An 'AU' call is + usefully followed by at most one 'AI' call; if there are more, the + last 'AI' call controls. 'ms' collects text on input lines + following this call into the author's institution until reaching + 'AU', 'AB', or a heading or paragraphing macro call. + + -- Macro: .DA [x ...] + Typeset the current date, or any arguments X, in the center footer, + and, if 'RP' is also called, left-aligned at the end of the + description information on the cover page. + + -- Macro: .ND [x ...] + Typeset the current date, or any arguments X, if 'RP' is also + called, left-aligned at the end of the document description on the + cover page. This is 'groff' 'ms''s default. + + -- Macro: .AB [no] + Begin the abstract. 'ms' collects text on input lines following + this call into the abstract until reaching an 'AE' call. By + default, 'ms' places the word "ABSTRACT" centered and in italics + above the text of the abstract. The optional argument 'no' + suppresses this heading. + + -- Macro: .AE + End the abstract. + + An example document description, using a cover page, follows. + + .RP + .TL + The Inevitability of Code Bloat + in Commercial and Free Software + .AU + J.\& Random Luser + .AI + University of West Bumblefuzz + .AB + This report examines the long-term growth of the code + bases in two large, + popular software packages; + the free Emacs and the commercial Microsoft Word. + While differences appear in the type or order of + features added, + due to the different methodologies used, + the results are the same in the end. + .PP + The free software approach is shown to be superior in + that while free software can become as bloated as + commercial offerings, + free software tends to have fewer serious bugs and the + added features are more in line with user demand. + .AE + + ...the rest of the paper... + + +File: groff.info, Node: ms Document Description Macros-Footnotes, Up: ms Document Description Macros + + (1) Distinguish a document title from "titles", which are what 'roff' +systems call headers and footers collectively. + + +File: groff.info, Node: ms Body Text, Next: ms Page Layout, Prev: ms Document Description Macros, Up: ms + +4.6.5 Body Text +--------------- + +A variety of macros, registers, and strings can be used to structure and +style the body of your document. They organize your text into +paragraphs, headings, footnotes, and inclusions of material such as +tables and figures. + +* Menu: + +* Text settings in ms:: +* Typographical symbols in ms:: +* Paragraphs in ms:: +* Headings in ms:: +* Typeface and decoration:: +* Lists in ms:: +* Indented regions in ms:: +* ms keeps and displays:: +* ms Insertions:: +* ms Footnotes:: +* ms language and localization:: + + +File: groff.info, Node: Text settings in ms, Next: Typographical symbols in ms, Prev: ms Body Text, Up: ms Body Text + +4.6.5.1 Text settings +..................... + +The 'FAM' string, a GNU extension, sets the font family for body text; +the default is 'T'. The 'PS' and 'VS' registers set the type size and +vertical spacing (distance between text baselines), respectively. The +font family and type size are ignored on terminal devices. Setting +these parameters before the first call of a heading, paragraphing, or +(non-date) document description macro also applies them to headers, +footers, and (for 'FAM') footnotes. + + Which font families are available depends on the output device; as a +convention, 'T' selects a serif family ("Times"), 'H' a sans-serif +family ("Helvetica"), and 'C' a monospaced family ("Courier"). The man +page for the output driver documents its font repertoire. Consult the +'groff(1)' man page for lists of available output devices and their +drivers. + + The hyphenation mode (as used by the 'hy' request) is set from the +'HY' register. Setting 'HY' to '0' is equivalent to using the 'nh' +request. This is a Tenth Edition Research Unix extension. + + +File: groff.info, Node: Typographical symbols in ms, Next: Paragraphs in ms, Prev: Text settings in ms, Up: ms Body Text + +4.6.5.2 Typographical symbols +............................. + +'ms' provides a few strings to obtain typographical symbols not easily +entered with the keyboard. These and many others are available as +special character escape sequences--see the 'groff_char(7)' man page. + + -- String: \*[-] + Interpolate an em dash. + + -- String: \*[Q] + -- String: \*[U] + Interpolate typographer's quotation marks where available, and + neutral double quotes otherwise. '\*Q' is the left quote and '\*U' + the right. + + +File: groff.info, Node: Paragraphs in ms, Next: Headings in ms, Prev: Typographical symbols in ms, Up: ms Body Text + +4.6.5.3 Paragraphs +.................. + +Paragraphing macros "break", or terminate, any pending output line so +that a new paragraph can begin. Several paragraph types are available, +differing in how indentation applies to them: to left, right, or both +margins; to the first output line of the paragraph, all output lines, or +all but the first. All paragraphing macro calls cause the insertion of +vertical space in the amount stored in the 'PD' register, except at page +or column breaks. Alternatively, a blank input line breaks the output +line and vertically spaces by one vee. + + -- Macro: .LP + Set a paragraph without any (additional) indentation. + + -- Macro: .PP + Set a paragraph with a first-line left indentation in the amount + stored in the 'PI' register. + + -- Macro: .IP [marker [width]] + Set a paragraph with a left indentation. The optional MARKER is + not indented and is empty by default. It has several applications; + see *note Lists in ms::. WIDTH overrides the indentation amount + stored in the 'PI' register; its default unit is 'n'. Once + specified, WIDTH applies to further 'IP' calls until specified + again or a heading or different paragraphing macro is called. + + -- Macro: .QP + Set a paragraph indented from both left and right margins by the + amount stored in the 'QI' register. + + -- Macro: .QS + -- Macro: .QE + Begin ('QS') and end ('QE') a region where each paragraph is + indented from both margins by the amount stored in the 'QI' + register. The text between 'QS' and 'QE' can be structured further + by use of other paragraphing macros. + + -- Macro: .XP + Set an "exdented" paragraph--one with a left indentation in the + amount stored in the 'PI' register on every line _except_ the first + (also known as a hanging indent). This is a Berkeley extension. + + The following example illustrates the use of paragraphing macros. + + .NH 2 + Cases used in the 2001 study + .LP + Two software releases were considered for this report. + .PP + The first is commercial software; + the second is free. + .IP \[bu] + Microsoft Word for Windows, + starting with version 1.0 through the current version + (Word 2000). + .IP \[bu] + GNU Emacs, + from its first appearance as a standalone editor through + the current version (v20). + See [Bloggs 2002] for details. + .QP + Franklin's Law applied to software: + software expands to outgrow both RAM and disk space over + time. + .SH + Bibliography + .XP + Bloggs, Joseph R., + .I "Everyone's a Critic" , + Underground Press, March 2002. + A definitive work that answers all questions and + criticisms about the quality and usability of free + software. + + +File: groff.info, Node: Headings in ms, Next: Typeface and decoration, Prev: Paragraphs in ms, Up: ms Body Text + +4.6.5.4 Headings +................ + +Use headings to create a sequential or hierarchical structure for your +document. The 'ms' macros print headings in *bold* using the same font +family and, by default, type size as the body text. Headings are +available with and without automatic numbering. Text on input lines +following the macro call becomes the heading's title. Call a +paragraphing macro to end the heading text and start the section's +content. + + -- Macro: .NH [depth] + -- Macro: .NH S heading-depth-index ... + Set an automatically numbered heading. + + 'ms' produces a numbered heading the form A.B.C..., to any depth + desired, with the numbering of each depth increasing automatically + and being reset to zero when a more significant level is increased. + "1" is the most significant or coarsest division of the document. + Only non-zero values are output. If DEPTH is omitted, it is taken + to be '1'. + + If you specify DEPTH such that an ascending gap occurs relative to + the previous 'NH' call--that is, you "skip a depth", as by '.NH 1' + and then '.NH 3'--'groff' 'ms' emits a warning on the standard + error stream. + + Alternatively, you can give 'NH' a first argument of 'S', followed + by integers to number the heading depths explicitly. Further + automatic numbering, if used, resumes using the specified indices + as their predecessors. This feature is a Berkeley extension. + + An example may be illustrative. + + .NH 1 + Animalia + .NH 2 + Arthropoda + .NH 3 + Crustacea + .NH 2 + Chordata + .NH S 6 6 6 + Daimonia + .NH 1 + Plantae + + The above results in numbering as follows; the vertical space that +normally precedes each heading is omitted. + + 1. Animalia + 1.1. Arthropoda + 1.1.1. Crustacea + 1.2. Chordata + 6.6.6. Daimonia + 7. Plantae + + -- String: \*[SN-STYLE] + -- String: \*[SN-DOT] + -- String: \*[SN-NO-DOT] + -- String: \*[SN] + After 'NH' is called, the assigned number is made available in the + strings 'SN-DOT' (as it appears in a printed heading with default + formatting, followed by a terminating period) and 'SN-NO-DOT' (with + the terminating period omitted). These are GNU extensions. + + You can control the style used to print numbered headings by + defining an appropriate alias for the string 'SN-STYLE'. By + default, 'SN-STYLE' is aliased to 'SN-DOT'. If you prefer to omit + the terminating period from numbers appearing in numbered headings, + you may define the alias as follows. + + .als SN-STYLE SN-NO-DOT + + Any such change in numbering style becomes effective from the next + use of 'NH' following redefinition of the alias for 'SN-STYLE'. + The formatted number of the current heading is available in the + 'SN' string (a feature first documented by Berkeley), which + facilitates its inclusion in, for example, table captions, equation + labels, and 'XS'/'XA'/'XE' table of contents entries. + + -- Macro: .SH [depth] + Set an unnumbered heading. + + The optional DEPTH argument is a GNU extension indicating the + heading depth corresponding to the DEPTH argument of 'NH'. It + matches the type size at which the heading is set to that of a + numbered heading at the same depth when the 'GROWPS' and 'PSINCR' + heading size adjustment mechanism is in effect. + + If the 'GROWPS' register is set to a value greater than the LEVEL +argument to 'NH' or 'SH', the type size of a heading produced by these +macros increases by 'PSINCR' units over the size specified by 'PS' +multiplied by the difference of 'GROWPS' and LEVEL. The value stored in +'PSINCR' is interpreted in 'groff' basic units; the 'p' scaling unit +should be employed when assigning a value specified in points. For +example, the sequence + + .nr PS 10 + .nr GROWPS 3 + .nr PSINCR 1.5p + .NH 1 + Carnivora + .NH 2 + Felinae + .NH 3 + Felis catus + .SH 2 + Machairodontinae + +will cause "1. Carnivora" to be printed in 13-point text, followed by +"1.1. Felinae" in 11.5-point text, while "1.1.1. Felis catus" and all +more deeply nested heading levels will remain in the 10-point text +specified by the 'PS' register. "Machairodontinae" is printed at 11.5 +points, since it corresponds to heading level 2. + + The 'HORPHANS' register operates in conjunction with the 'NH' and +'SH' macros to inhibit the printing of isolated headings at the bottom +of a page; it specifies the minimum number of lines of an immediately +subsequent paragraph that must be kept on the same page as the heading. +If insufficient space remains on the current page to accommodate the +heading and this number of lines of paragraph text, a page break is +forced before the heading is printed. Any display macro call or 'tbl', +'pic', or 'eqn' region between the heading and the subsequent paragraph +suppresses this grouping. *Note ms keeps and displays:: and *note ms +Insertions::. + + +File: groff.info, Node: Typeface and decoration, Next: Lists in ms, Prev: Headings in ms, Up: ms Body Text + +4.6.5.5 Typeface and decoration +............................... + +The 'ms' macros provide a variety of ways to style text. Attend closely +to the ordering of arguments labeled PRE and POST, which is not +intuitive. Support for PRE arguments is a GNU extension.(1) (*note +Typeface and decoration-Footnote-1::) + + -- Macro: .B [text [post [pre]]] + Style TEXT in bold, followed by POST in the previous font style + without intervening space, and preceded by PRE similarly. Without + arguments, 'ms' styles subsequent text in bold until the next + paragraphing, heading, or no-argument typeface macro call. + + -- Macro: .R [text [post [pre]]] + As 'B', but use the roman style (upright text of normal weight) + instead of bold. Argument recognition is a GNU extension. + + -- Macro: .I [text [post [pre]]] + As 'B', but use an italic or oblique style instead of bold. + + -- Macro: .BI [text [post [pre]]] + As 'B', but use a bold italic or bold oblique style instead of + upright bold. This is a Tenth Edition Research Unix extension. + + -- Macro: .CW [text [post [pre]]] + As 'B', but use a constant-width (monospaced) roman typeface + instead of bold. This is a Tenth Edition Research Unix extension. + + -- Macro: .BX [text] + Typeset TEXT and draw a box around it. On terminal devices, + reverse video is used instead. If you want TEXT to contain space, + use unbreakable space or horizontal motion escape sequences ('\~', + '\', '\^', '\|', '\0' or '\h'). + + -- Macro: .UL [text [post]] + Typeset TEXT with an underline. POST, if present, is set after + TEXT with no intervening space. + + -- Macro: .LG + Set subsequent text in larger type (two points larger than the + current size) until the next type size, paragraphing, or heading + macro call. You can specify this macro multiple times to enlarge + the type size as needed. + + -- Macro: .SM + Set subsequent text in smaller type (two points smaller than the + current size) until the next type size, paragraphing, or heading + macro call. You can specify this macro multiple times to reduce + the type size as needed. + + -- Macro: .NL + Set subsequent text at the normal type size (the amount in the 'PS' + register). + + PRE and POST arguments are typically used to simplify the attachment +of punctuation to styled words. When PRE is used, a hyphenation control +escape sequence '\%' that would ordinarily start TEXT must start PRE +instead to have the desired effect. + + The CS course's students found one C language keyword + .CW static ) \%( + most troublesome. + + The foregoing example produces output as follows. + + The CS course's students found one C language keyword (static) + most troublesome. + + You can use the output line continuation escape sequence '\c' to +achieve the same result (*note Line Continuation::). It is also +portable to older 'ms' implementations. + + The CS course's students found one C language keyword + \%(\c + .CW \%static ) + most troublesome. + + 'groff' 'ms' also offers strings to begin and end super- and +subscripting. These are GNU extensions. + + -- String: \*[{] + -- String: \*[}] + Begin and end superscripting, respectively. + + -- String: \*[<] + -- String: \*[>] + Begin and end subscripting, respectively. + + Rather than calling the 'CW' macro, in 'groff' 'ms' you might prefer +to change the font family to Courier by setting the 'FAM' string to 'C'. +You can then use all four style macros above, returning to the default +family (Times) with '.ds FAM T'. Because changes to 'FAM' take effect +only at the next paragraph, 'CW' remains useful to "inline" a change to +the font family, similarly to the practice of this document in noting +syntactical elements of 'ms' and 'groff'. + + +File: groff.info, Node: Typeface and decoration-Footnotes, Up: Typeface and decoration + + (1) This idiosyncrasy arose through feature accretion; for example, +the 'B' macro in Version 6 Unix 'ms' (1975) accepted only one argument, +the text to be set in boldface. By Version 7 (1979) it recognized a +second argument; in 1990, 'groff' 'ms' added a "pre" argument, placing +it third to avoid breaking support for older documents. + + +File: groff.info, Node: Lists in ms, Next: Indented regions in ms, Prev: Typeface and decoration, Up: ms Body Text + +4.6.5.6 Lists +............. + +The MARKER argument to the 'IP' macro can be employed to present a +variety of lists; for instance, you can use a bullet glyph ('\[bu]') for +unordered lists, a number (or auto-incrementing register) for numbered +lists, or a word or phrase for glossary-style or definition lists. If +you set the paragraph indentation register 'PI' before calling 'IP', you +can later reorder the items in the list without having to ensure that a +WIDTH argument remains affixed to the first call. + + The following is an example of a bulleted list. + + .nr PI 2n + A bulleted list: + .IP \[bu] + lawyers + .IP \[bu] + guns + .IP \[bu] + money + + A bulleted list: + + * lawyers + + * guns + + * money + + The following is an example of a numbered list. + + .nr step 0 1 + .nr PI 3n + A numbered list: + .IP \n+[step] + lawyers + .IP \n+[step] + guns + .IP \n+[step] + money + + A numbered list: + + 1. lawyers + + 2. guns + + 3. money + + Here we have employed the 'nr' request to create a register of our +own, 'step'. We initialized it to zero and assigned it an +auto-increment of 1. Each time we use the escape sequence '\n+[PI]' +(note the plus sign), the formatter applies the increment just before +interpolating the register's value. Preparing the 'PI' register as well +enables us to rearrange the list without the tedium of updating macro +calls. + + The next example illustrates a glossary-style list. + + A glossary-style list: + .IP lawyers 0.4i + Two or more attorneys. + .IP guns + Firearms, + preferably large-caliber. + .IP money + Gotta pay for those + lawyers and guns! + + A glossary-style list: + + lawyers + Two or more attorneys. + + guns Firearms, preferably large-caliber. + + money + Gotta pay for those lawyers and guns! + + In the previous example, observe how the 'IP' macro places the +definition on the same line as the term if it has enough space. If this +is not what you want, there are a few workarounds we will illustrate by +modifying the example. First, you can use a 'br' request to force a +break after printing the term or label. + + .IP guns + .br + Firearms, + + Second, you could apply the '\p' escape sequence to force a break. +The space following the escape sequence is important; if you omit it, +'groff' prints the first word of the paragraph text on the same line as +the term or label (if it fits) _then_ breaks the line. + + .IP guns + \p Firearms, + + Finally, you may append a horizontal motion to the marker with the +'\h' escape sequence; using the same amount as the indentation will +ensure that the marker is too wide for 'groff' to treat it as "fitting" +on the same line as the paragraph text. + + .IP guns\h'0.4i' + Firearms, + + In each case, the result is the same. + + A glossary-style list: + + lawyers + Two or more attorneys. + + guns + Firearms, preferably large-caliber. + + money + Gotta pay for those lawyers and guns! + + +File: groff.info, Node: Indented regions in ms, Next: ms keeps and displays, Prev: Lists in ms, Up: ms Body Text + +4.6.5.7 Indented regions +........................ + +You may need to indent a region of text while otherwise formatting it +normally. Indented regions can be nested; you can change '\n[PI]' +before each call to vary the amount of inset. + + -- Macro: .RS + Begin a region where headings, paragraphs, and displays are + indented (further) by the amount stored in the 'PI' register. + + -- Macro: .RE + End the (next) most recent indented region. + + This feature enables you to easily line up text under hanging and +indented paragraphs. For example, you may wish to structure lists +hierarchically. + + .IP \[bu] 2 + Lawyers: + .RS + .IP \[bu] + Dewey, + .IP \[bu] + Cheatham, + and + .IP \[bu] + and Howe. + .RE + .IP \[bu] + Guns + + * Lawyers: + + * Dewey, + + * Cheatham, and + + * Howe. + + * Guns + + +File: groff.info, Node: ms keeps and displays, Next: ms Insertions, Prev: Indented regions in ms, Up: ms Body Text + +4.6.5.8 Keeps, boxed keeps, and displays +........................................ + +On occasion, you may want to "keep" several lines of text, or a region +of a document, together on a single page, preventing an automatic page +break within certain boundaries. This can cause a page break to occur +earlier than it normally would. For example, you may want to keep two +paragraphs together, or a paragraph that refers to a table, list, or +figure adjacent to the item it discusses. 'ms' provides the 'KS' and +'KE' macros for this purpose. + + You can alternatively specify a "floating keep": if a keep cannot fit +on the current page, 'ms' holds its contents and allows material +following the keep (in the source document) to fill the remainder of the +current page. When the page breaks, whether by reaching the end or 'bp' +request, 'ms' puts the floating keep at the beginning of the next page. +This is useful for placing large graphics or tables that do not need to +appear exactly where they occur in the source document. + + -- Macro: .KS + -- Macro: .KF + -- Macro: .KE + 'KS' begins a keep, 'KF' a floating keep, and 'KE' ends a keep of + either kind. + + As an alternative to the keep mechanism, the 'ne' request forces a +page break if there is not at least the amount of vertical space +specified in its argument remaining on the page (*note Page Control::). +One application of 'ne' is to reserve space on the page for a figure or +illustration to be included later. + + A "boxed keep" has a frame drawn around it. + + -- Macro: .B1 + -- Macro: .B2 + 'B1' begins a keep with a box drawn around it. 'B2' ends a boxed + keep. + + Boxed keep macros cause breaks; if you need to box a word or phrase +within a line, see the 'BX' macro in *note Typeface and decoration::. +Box lines are drawn as close as possible to the text they enclose so +that they are usable within paragraphs. If you wish to box one or more +paragraphs, you may improve the appearance by calling 'B1' after the +first paragraphing macro, and by adding a small amount of vertical space +before calling 'B2'. + + .LP + .B1 + .I Warning: + Happy Fun Ball may suddenly accelerate to dangerous + speeds. + .sp \n[PD]/2 \" space by half the inter-paragraph distance + .B2 + + If you want a boxed keep to float, you will need to enclose the 'B1' +and 'B2' calls within a pair of 'KF' and 'KE' calls. + + "Displays" turn off filling; lines of verse or program code are shown +with their lines broken as in the source document without requiring 'br' +requests between lines. Displays can be kept on a single page or +allowed to break across pages. The 'DS' macro begins a kept display of +the layout specified in its first argument; non-kept displays are begun +with dedicated macros corresponding to their layout. + + -- Macro: .DS L + -- Macro: .LD + Begin ('DS': kept) left-aligned display. + + -- Macro: .DS [I [indent]] + -- Macro: .ID [indent] + Begin ('DS': kept) display indented by INDENT if specified, and by + the amount of the 'DI' register otherwise. + + -- Macro: .DS B + -- Macro: .BD + Begin a ('DS': kept) a block display: the entire display is + left-aligned, but indented such that the longest line in the + display is centered on the page. + + -- Macro: .DS C + -- Macro: .CD + Begin a ('DS': kept) centered display: each line in the display is + centered. + + -- Macro: .DS R + -- Macro: .RD + Begin a ('DS': kept) right-aligned display. This is a GNU + extension. + + -- Macro: .DE + End any display. + + The distance stored in the 'DD' register is inserted before and after +each pair of display macros; this is a Berkeley extension. In 'groff' +'ms', this distance replaces any adjacent inter-paragraph distance or +subsequent spacing prior to a section heading. The 'DI' register is a +GNU extension; its value is an indentation applied to displays created +with '.DS' and '.ID' without arguments, to '.DS I' without an +indentation argument, and to indented equations set with '.EQ'. Changes +to either register take effect at the next display boundary. + + +File: groff.info, Node: ms Insertions, Next: ms Footnotes, Prev: ms keeps and displays, Up: ms Body Text + +4.6.5.9 Tables, figures, equations, and references +.................................................. + +The 'ms' package is often used with the 'tbl', 'pic', 'eqn', and 'refer' +preprocessors. Mark text meant for preprocessors by enclosing it in +pairs of tokens as follows, with nothing between the dot and the macro +name. The preprocessors match these tokens only at the start of an +input line. + + -- Macro: .TS [H] + -- Macro: .TE + Demarcate a table to be processed by the 'tbl' preprocessor. The + optional argument 'H' to 'TS' instructs 'ms' to repeat table rows + (often column headings) at the top of each new page the table + spans, if applicable; calling the 'TH' macro marks the end of such + rows. The GNU 'tbl(1)' man page provides a comprehensive reference + to the preprocessor and offers examples of its use. + + -- Macro: .PS + -- Macro: .PE + -- Macro: .PF + 'PS' begins a picture to be processed by the 'gpic' preprocessor; + either of 'PE' or 'PF' ends it, the latter with "flyback" to the + vertical position at its top. You can create 'pic' input manually + or with a program such as 'xfig'. + + -- Macro: .EQ [align [label]] + -- Macro: .EN + Demarcate an equation to be processed by the 'eqn' preprocessor. + The equation is centered by default; ALIGN can be 'C', 'L', or 'I' + to (explicitly) center, left-align, or indent it by the amount + stored in the 'DI' register, respectively. If specified, LABEL is + set right-aligned. + + -- Macro: .[ + -- Macro: .] + Demarcate a bibliographic citation to be processed by the 'refer' + preprocessor. The GNU 'refer(1)' man page provides a comprehensive + reference to the preprocessor and the format of its bibliographic + database. Type 'man refer' at the command line to view it. + + When 'refer' emits collected references (as might be done on a "Works +Cited" page), it interpolates the 'REFERENCES' string as an unnumbered +heading ('SH'). + + The following is an example of how to set up a table that may print +across two or more pages. + + .TS H + allbox; + Cb | Cb . + Part->Description + _ + .TH + .T& + GH-1978->Fribulating gonkulator + ...the rest of the table follows... + .TE + +Attempting to place a multi-page table inside a keep can lead to +unpleasant results, particularly if the 'tbl' 'allbox' option is used. + + Mathematics can be typeset using the language of the 'eqn' +preprocessor. + + .EQ C (\*[SN-NO-DOT]a) + p ~ = ~ q sqrt { ( 1 + ~ ( x / q sup 2 ) } + .EN + +This input formats a labelled equation. We used the 'SN-NO-DOT' string +to base the equation label on the current heading number, giving us more +flexibility to reorganize the document. + + Use 'groff' options to run preprocessors on the input: '-e' for +'geqn', '-p' for 'gpic', '-R' for 'grefer', and '-t' for 'gtbl'. + + +File: groff.info, Node: ms Footnotes, Prev: ms Insertions, Up: ms Body Text + +4.6.5.10 Footnotes +.................. + +A footnote is typically anchored to a place in the text with a "marker", +which is a small integer, a symbol such as a dagger, or arbitrary +user-specified text. + + -- String: \*[*] + Place an "automatic number", an automatically generated numeric + footnote marker, in the text. Each time this string is + interpolated, the number it produces increments by one. Automatic + numbers start at 1. This is a Berkeley extension. + + Enclose the footnote text in 'FS' and 'FE' macro calls to set it at +the nearest available "foot", or bottom, of a text column or page. + + -- Macro: .FS [marker] + -- Macro: .FE + Begin ('FS') and end ('FE') a footnote. 'FS' calls 'FS-MARK' with + any supplied MARKER argument, which is then also placed at the + beginning of the footnote text. If MARKER is omitted, the next + pending automatic footnote number enqueued by interpolation of the + '*' string is used, and if none exists, nothing is prefixed. + + You may not desire automatically numbered footnotes in spite of their +convenience. You can indicate a footnote with a symbol or other text by +specifying its marker at the appropriate place (for example, by using +'\[dg]' for the dagger glyph) _and_ as an argument to the 'FS' macro. +Such manual marks should be repeated as arguments to 'FS' or as part of +the footnote text to disambiguate their correspondence. You may wish to +use '\*{' and '\*}' to superscript the marker at the anchor point, in +the footnote text, or both. + + 'groff' 'ms' provides a hook macro, 'FS-MARK', for user-determined +operations to be performed when the 'FS' macro is called. It is passed +the same arguments as 'FS' itself. An application of 'FS-MARK' is +anchor placement for a hyperlink reference, so that a footnote can link +back to its referential context.(1) (*note ms Footnotes-Footnote-1::) +By default, this macro has an empty definition. 'FS-MARK' is a GNU +extension. + + Footnotes can be safely used within keeps and displays, but you +should avoid using automatically numbered footnotes within floating +keeps. You can place a second '\**' interpolation between a '\**' and +its corresponding 'FS' call as long as each 'FS' call occurs _after_ the +corresponding '\**' and occurrences of 'FS' are in the same order as +corresponding occurrences of '\**'. + + Footnote text is formatted as paragraphs are, using analogous +parameters. The registers 'FI', 'FPD', 'FPS', and 'FVS' correspond to +'PI', 'PD', 'PS', and 'CS', respectively; 'FPD', 'FPS', and 'FVS' are +GNU extensions. + + The 'FF' register controls the formatting of automatically numbered +footnote paragraphs and those for which 'FS' is given a marker argument. +*Note ms Document Control Settings::. + + The default footnote line length is 11/12ths of the normal line +length for compatibility with the expectations of historical 'ms' +documents; you may wish to set the 'FR' string to '1' to align with +contemporary typesetting practices. In the past,(2) (*note ms +Footnotes-Footnote-2::) an 'FL' register was used for the line length in +footnotes; however, setting this register at document initialization +time had no effect on the footnote line length in multi-column +arrangements.(3) (*note ms Footnotes-Footnote-3::) + + 'FR' should be used in preference to the old 'FL' register in +contemporary documents. The footnote line length is effectively +computed as 'column-width * \*[FR]'. If an absolute footnote line +length is required, recall that arithmetic expressions in 'roff' input +are evaluated strictly from left to right, with no operator precedence +(parentheses are honored). + + .ds FR 0+3i \" Set footnote line length to 3 inches. + + +File: groff.info, Node: ms Footnotes-Footnotes, Up: ms Footnotes + + (1) "Portable Document Format Publishing with GNU Troff", +'pdfmark.ms' in the 'groff' distribution, uses this technique. + + (2) Unix Version 7 'ms', its descendants, and GNU 'ms' prior to +'groff' version 1.23.0 + + (3) You could reset it after each call to '.1C', '.2C', or '.MC'. + + +File: groff.info, Node: ms language and localization, Next: ms Page Layout, Prev: ms Footnotes, Up: ms Body Text + +4.6.5.11 Language and localization +.................................. + +'groff' 'ms' provides several strings that you can customize for your +own purposes, or redefine to adapt the macro package to languages other +than English. It is already localized for Czech, German, French, +Italian, and Swedish. Load the desired localization macro package after +'ms'; see the 'groff_tmac(5)' man page. + + $ groff -ms -mfr bienvenue.ms + + The following strings are available. + + -- String: \*[REFERENCES] + Contains the string printed at the beginning of a references + (bibliography) page produced with GNU 'refer(1)'. The default is + 'References'. + + -- String: \*[ABSTRACT] + Contains the string printed at the beginning of the abstract. The + default is '\f[I]ABSTRACT\f[]'; it includes font selection escape + sequences to set the word in italics. + + -- String: \*[TOC] + Contains the string printed at the beginning of the table of + contents. The default is 'Table of Contents'. + + -- String: \*[MONTH1] + -- String: \*[MONTH2] + -- String: \*[MONTH3] + -- String: \*[MONTH4] + -- String: \*[MONTH5] + -- String: \*[MONTH6] + -- String: \*[MONTH7] + -- String: \*[MONTH8] + -- String: \*[MONTH9] + -- String: \*[MONTH10] + -- String: \*[MONTH11] + -- String: \*[MONTH12] + Contain the full names of the calendar months. The defaults are in + English: 'January', 'February', and so on. + + +File: groff.info, Node: ms Page Layout, Next: Differences from AT&T ms, Prev: ms Body Text, Up: ms + +4.6.6 Page layout +----------------- + +'ms''s default page layout arranges text in a single column with the +page number between hyphens centered in a header on each page except the +first, and produces no footers. You can customize this arrangement. + +* Menu: + +* ms Headers and Footers:: +* Tab Stops in ms:: +* ms Margins:: +* ms Multiple Columns:: +* ms TOC:: + + +File: groff.info, Node: ms Headers and Footers, Next: Tab Stops in ms, Prev: ms Page Layout, Up: ms Page Layout + +4.6.6.1 Headers and footers +........................... + +There are multiple ways to produce headers and footers. One is to +define the strings 'LH', 'CH', and 'RH' to set the left, center, and +right headers, respectively; and 'LF', 'CF', and 'RF' to set the left, +center, and right footers. This approach suffices for documents that do +not distinguish odd- and even-numbered pages. + + Another method is to call macros that set headers or footers for odd- +or even-numbered pages. Each such macro takes a delimited argument +separating the left, center, and right header or footer texts from each +other. You can replace the neutral apostrophes (''') shown below with +any character not appearing in the header or footer text. These macros +are Berkeley extensions. + + -- Macro: .OH 'left'center'right' + -- Macro: .EH 'left'center'right' + -- Macro: .OF 'left'center'right' + -- Macro: .EF 'left'center'right' + The 'OH' and 'EH' macros define headers for odd- (recto) and + even-numbered (verso) pages, respectively; the 'OF' and 'EF' macros + define footers for them. + + With either method, a percent sign '%' in header or footer text is +replaced by the current page number. By default, 'ms' places no header +on a page numbered "1" (regardless of its number format). + + -- Macro: .P1 + Typeset the header even on page 1. To be effective, this macro + must be called before the header trap is sprung on any page + numbered "1"; in practice, unless your page numbering is unusual, + this means that you should call it early, before 'TL' or any + heading or paragraphing macro. This is a Berkeley extension. + + For even greater flexibility, 'ms' is designed to permit the +redefinition of the macros that are called when the 'groff' traps that +ordinarily cause the headers and footers to be output are sprung. 'PT' +("page trap") is called by 'ms' when the header is to be written, and +'BT' ("bottom trap") when the footer is to be. The 'groff' page +location trap that 'ms' sets up to format the header also calls the +(normally undefined) 'HD' macro after 'PT'; you can define 'HD' if you +need additional processing after setting the header (for example, to +draw a line below it). The 'HD' hook is a Berkeley extension. Any such +macros you (re)define must implement any desired specialization for +odd-, even-, or first numbered pages. + + +File: groff.info, Node: Tab Stops in ms, Next: ms Margins, Prev: ms Headers and Footers, Up: ms Page Layout + +4.6.6.2 Tab stops +................. + +Use the 'ta' request to define tab stops as needed. *Note Tabs and +Fields::. + + -- Macro: .TA + Reset the tab stops to the 'ms' default (every 5 ens). Redefine + this macro to create a different set of default tab stops. + + +File: groff.info, Node: ms Margins, Next: ms Multiple Columns, Prev: Tab Stops in ms, Up: ms Page Layout + +4.6.6.3 Margins +............... + +Control margins using the registers summarized in "Margin settings" in +*note ms Document Control Settings:: above. There is no setting for the +right margin; the combination of page offset '\n[PO]' and line length +'\n[LL]' determines it. + + +File: groff.info, Node: ms Multiple Columns, Next: ms TOC, Prev: ms Margins, Up: ms Page Layout + +4.6.6.4 Multiple columns +........................ + +'ms' can set text in as many columns as reasonably fit on the page. The +following macros force a page break if a multi-column layout is active +when they are called. The 'MINGW' register stores the default minimum +gutter width; it is a GNU extension. When multiple columns are in use, +keeps and the 'HORPHANS' and 'PORPHANS' registers work with respect to +column breaks instead of page breaks. + + -- Macro: .1C + Arrange page text in a single column (the default). + + -- Macro: .2C + Arrange page text in two columns. + + -- Macro: .MC [column-width [gutter-width]] + Arrange page text in multiple columns. If you specify no + arguments, it is equivalent to the '2C' macro. Otherwise, + COLUMN-WIDTH is the width of each column and GUTTER-WIDTH is the + minimum distance between columns. + + +File: groff.info, Node: ms TOC, Next: Differences from AT&T ms, Prev: ms Multiple Columns, Up: ms Page Layout + +4.6.6.5 Creating a table of contents +.................................... + +Because 'roff' formatters process their input in a single pass, material +on page 50, for example, cannot influence what appears on page 1--this +poses a challenge for a table of contents at its traditional location in +front matter, if you wish to avoid manually maintaining it. 'ms' +enables the collection of material to be presented in the table of +contents as it appears, saving its page number along with it, and then +emitting the collected contents on demand toward the end of the +document. The table of contents can then be resequenced to its desired +location by physically rearranging the pages of a printed document, or +as part of post-processing--with a 'sed(1)' script to reorder the pages +in 'troff''s output, with 'pdfjam(1)', or with 'gropdf(1)''s +'.pdfswitchtopage' feature, for example. + + Define an entry to appear in the table of contents by bracketing its +text between calls to the 'XS' and 'XE' macros. A typical application +is to call them immediately after 'NH' or 'SH' and repeat the heading +text within them. The 'XA' macro, used within '.XS'/'.XE' pairs, +supplements an entry--for instance, when it requires multiple output +lines, whether because a heading is too long to fit or because style +dictates that page numbers not be repeated. You may wish to indent the +text thus wrapped to correspond to its heading depth; this can be done +in the entry text by prefixing it with tabs or horizontal motion escape +sequences, or by providing a second argument to the 'XA' macro. 'XS' +and 'XA' automatically associate the page number where they are called +with the text following them, but they accept arguments to override this +behavior. At the end of the document, call 'TC' or 'PX' to emit the +table of contents; 'TC' resets the page number to 'i' (Roman numeral +one), and then calls 'PX'. All of these macros are Berkeley extensions. + + -- Macro: .XS [page-number] + -- Macro: .XA [page-number [indentation]] + -- Macro: .XE + Begin, supplement, and end a table of contents entry. Each entry + is associated with PAGE-NUMBER (otherwise the current page number); + a PAGE-NUMBER of 'no' prevents a leader and page number from being + emitted for that entry. Use of 'XA' within 'XS'/'XE' is optional; + it can be repeated. If INDENTATION is present, a supplemental + entry is indented by that amount; ens are assumed if no unit is + indicated. Text on input lines between 'XS' and 'XE' is stored for + later recall by 'PX'. + + -- Macro: .PX [no] + Switch to single-column layout. Unless 'no' is specified, center + and interpolate the 'TOC' string in bold and two points larger than + the body text. Emit the table of contents entries. + + -- Macro: .TC [no] + Set the page number to 1, the page number format to lowercase Roman + numerals, and call 'PX' (with a 'no' argument, if present). + + Here's an example of typical 'ms' table of contents preparation. We +employ horizontal escape sequences '\h' to indent the entries by +sectioning depth. + + .NH 1 + Introduction + .XS + Introduction + .XE + ... + .NH 2 + Methodology + .XS + \h'2n'Methodology + .XA + \h'4n'Fassbinder's Approach + \h'4n'Kahiu's Approach + .XE + ... + .NH 1 + Findings + .XS + Findings + .XE + ... + .TC + + The remaining features in this subsubsection are GNU extensions. +'groff' 'ms' obviates the need to repeat heading text after 'XS' calls. +Call 'XN' and 'XH' after 'NH' and 'SH', respectively. + + -- Macro: .XN heading-text + -- Macro: .XH depth heading-text + Format HEADING-TEXT and create a corresponding table of contents + entry. 'XN' computes the indentation from the depth of the + preceding 'NH' call; 'XH' requires a DEPTH argument to do so. + + 'groff' 'ms' encourages customization of table of contents entry +production. + + -- Macro: .XN-REPLACEMENT heading-text + -- Macro: .XH-REPLACEMENT depth heading-text + These hook macros implement 'XN' and 'XH', respectively. They call + 'XN-INIT' and pass their HEADING-TEXT arguments to 'XH-UPDATE-TOC'. + + -- Macro: .XN-INIT + -- Macro: .XH-UPDATE-TOC depth heading-text + The 'XN-INIT' hook macro does nothing by default. 'XH-UPDATE-TOC' + brackets HEADING-TEXT with 'XS' and 'XE' calls, indenting it by 2 + ens per level of DEPTH beyond the first. + + We could therefore produce a table of contents similar to that in the +previous example with fewer macro calls. (The difference is that this +input follows the "Approach" entries with leaders and page numbers.) + + .NH 1 + .XN Introduction + ... + .NH 2 + .XN Methodology + .XH 3 "Fassbinder's Approach" + .XH 3 "Kahiu's Approach" + ... + .NH 1 + .XN Findings + ... + + To get the section number of the numbered headings into the table of +contents entries, we might define 'XN-REPLACEMENT' as follows. (We +obtain the heading depth from 'groff' 'ms''s internal register 'nh*hl'.) + + .de XN-REPLACEMENT + .XN-INIT + .XH-UPDATE-TOC \\n[nh*hl] \\$@ + \&\\*[SN] \\$* + .. + + You can change the style of the leader that bridges each table of +contents entry with its page number; define the 'TC-LEADER' special +character by using the 'char' request. A typical leader combines the +dot glyph '.' with a horizontal motion escape sequence to spread the +dots. The width of the page number field is stored in the 'TC-MARGIN' +register. + + +File: groff.info, Node: Differences from AT&T ms, Next: ms Naming Conventions, Prev: ms Page Layout, Up: ms + +4.6.7 Differences from AT&T 'ms' +-------------------------------- + +The 'groff' 'ms' macros are an independent reimplementation, using no +AT&T code. Since they take advantage of the extended features of +'groff', they cannot be used with AT&T 'troff'. 'groff' 'ms' supports +features described above as Berkeley and Tenth Edition Research Unix +extensions, and adds several of its own. + + * The internals of 'groff' 'ms' differ from the internals of AT&T + 'ms'. Documents that depend upon implementation details of AT&T + 'ms' may not format properly with 'groff' 'ms'. Such details + include macros whose function was not documented in the AT&T 'ms' + manual.(1) (*note Differences from AT&T ms-Footnote-1::) + + * The error-handling policy of 'groff' 'ms' is to detect and report + errors, rather than to ignore them silently. + + * Tenth Edition Research Unix supported 'P1'/'P2' macros to bracket + code examples; 'groff' 'ms' does not. + + * 'groff' 'ms' does not work in GNU 'troff''s AT&T compatibility + mode. If loaded when that mode is enabled, it aborts processing + with a diagnostic message. + + * Multiple line spacing is not supported. Use a larger vertical + spacing instead. + + * 'groff' 'ms' uses the same header and footer defaults in both + 'nroff' and 'troff' modes as AT&T 'ms' does in 'troff' mode; AT&T's + default in 'nroff' mode is to put the date, in U.S. traditional + format (e.g., "January 1, 2021"), in the center footer (the 'CF' + string). + + * Many 'groff' 'ms' macros, including those for paragraphs, headings, + and displays, cause a reset of paragraph rendering parameters, and + may change the indentation; they do so not by incrementing or + decrementing it, but by setting it absolutely. This can cause + problems for documents that define additional macros of their own + that try to manipulate indentation. Use the 'ms' 'RS' and 'RE' + macros instead of the 'in' request. + + * AT&T 'ms' interpreted the values of the registers 'PS' and 'VS' in + points, and did not support the use of scaling units with them. + 'groff' 'ms' interprets values of the registers 'PS', 'VS', 'FPS', + and 'FVS' equal to or larger than 1,000 (one thousand) as decimal + fractions multiplied by 1,000.(2) (*note Differences from AT&T + ms-Footnote-2::) This threshold makes use of a scaling unit with + these parameters practical for high-resolution devices while + preserving backward compatibility. It also permits expression of + non-integral type sizes. For example, 'groff -rPS=10.5p' at the + shell prompt is equivalent to placing '.nr PS 10.5p' at the + beginning of the document. + + * AT&T 'ms''s 'AU' macro supported arguments used with some document + types; 'groff' 'ms' does not. + + * Right-aligned displays are available. The AT&T 'ms' manual + observes that "it is tempting to assume that '.DS R' will right + adjust lines, but it doesn't work". In 'groff' 'ms', it does. + + * To make 'groff' 'ms' use the default page offset (which also + specifies the left margin), the 'PO' register must stay undefined + until the first 'ms' macro is called. + + This implies that '\n[PO]' should not be used early in the + document, unless it is changed also: accessing an undefined + register automatically defines it. + + * 'groff' 'ms' supports the 'PN' register, but it is not necessary; + you can access the page number via the usual '%' register and + invoke the 'af' request to assign a different format to it if + desired.(3) (*note Differences from AT&T ms-Footnote-3::) + + * The AT&T 'ms' manual documents registers 'CW' and 'GW' as setting + the default column width and "intercolumn gap", respectively, and + which applied when 'MC' was called with fewer than two arguments. + 'groff' 'ms' instead treats 'MC' without arguments as synonymous + with '2C'; there is thus no occasion for a default column width + register. Further, the 'MINGW' register and the second argument to + 'MC' specify a _minimum_ space between columns, not the fixed + gutter width of AT&T 'ms'. + + * The AT&T 'ms' manual did not document the 'QI' register; Berkeley + and 'groff' 'ms' do. + + -- Register: \n[GS] + The register 'GS' is set to 1 by the 'groff' 'ms' macros, but is + not used by the AT&T 'ms' package. Documents that need to + determine whether they are being formatted with 'groff' 'ms' or + another implementation should test this register. + +* Menu: + +* Missing Unix Version 7 ms Macros:: + + +File: groff.info, Node: Differences from AT&T ms-Footnotes, Up: Differences from AT&T ms + + (1) 'Typing Documents on the UNIX System: Using the -ms Macros with +Troff and Nroff', M. E. Lesk, Bell Laboratories, 1978 + + (2) Register values are converted to and stored as basic units. +*Note Measurements::. + + (3) If you redefine the 'ms' 'PT' macro and desire special treatment +of certain page numbers (like '1'), you may need to handle a non-Arabic +page number format, as 'groff' 'ms''s 'PT' does; see the macro package +source. 'groff' 'ms' aliases the 'PN' register to '%'. + + +File: groff.info, Node: Missing Unix Version 7 ms Macros, Prev: Differences from AT&T ms, Up: Differences from AT&T ms + +4.6.7.1 Unix Version 7 'ms' macros not implemented by 'groff' 'ms' +.................................................................. + +Several macros described in the Unix Version 7 'ms' documentation are +unimplemented by 'groff' 'ms' because they are specific to the +requirements of documents produced internally by Bell Laboratories, some +of which also require a glyph for the Bell System logo that 'groff' does +not support. These macros implemented several document type formats +('EG', 'IM', 'MF', 'MR', 'TM', 'TR'), were meaningful only in +conjunction with the use of certain document types ('AT', 'CS', 'CT', +'OK', 'SG'), stored the postal addresses of Bell Labs sites ('HO', 'IH', +'MH', 'PY', 'WH'), or lacked a stable definition over time ('UX'). To +compatibly render historical 'ms' documents using these macros, we +advise your documents to invoke the 'rm' request to remove any such +macros it uses and then define replacements with an authentically +typeset original at hand.(1) (*note Missing Unix Version 7 ms +Macros-Footnote-1::) For informal purposes, a simple definition of 'UX' +should maintain the readability of the document's substance. + + .rm UX + .ds UX Unix\" + + +File: groff.info, Node: Missing Unix Version 7 ms Macros-Footnotes, Up: Missing Unix Version 7 ms Macros + + (1) The removal beforehand is necessary because 'groff' 'ms' aliases +these macros to a diagnostic macro, and you want to redefine the aliased +name, not its target. + + +File: groff.info, Node: ms Legacy Features, Next: ms Naming Conventions, Prev: Differences from AT&T ms, Up: ms + +4.6.8 Legacy Features +--------------------- + +'groff' 'ms' retains some legacy features solely to support formatting +of historical documents; contemporary ones should not use them because +they can render poorly. See the 'groff_char(7)' man page. + +AT&T accent mark strings +........................ + +AT&T 'ms' defined accent mark strings as follows. + + -- String: \*['] + Apply acute accent to subsequent glyph. + + -- String: \*[`] + Apply grave accent to subsequent glyph. + + -- String: \*[:] + Apply dieresis (umlaut) to subsequent glyph. + + -- String: \*[^] + Apply circumflex accent to subsequent glyph. + + -- String: \*[~] + Apply tilde accent to subsequent glyph. + + -- String: \*[C] + Apply caron to subsequent glyph. + + -- String: \*[,] + Apply cedilla to subsequent glyph. + +Berkeley accent mark and glyph strings +...................................... + +Berkeley 'ms' offered an 'AM' macro; calling it redefined the AT&T +accent mark strings (except for '\*C'), applied them to the _preceding_ +glyph, and defined additional strings, some for spacing glyphs. + + -- Macro: .AM + Enable alternative accent mark and glyph-producing strings. + + -- String: \*['] + Apply acute accent to preceding glyph. + + -- String: \*[`] + Apply grave accent to preceding glyph. + + -- String: \*[:] + Apply dieresis (umlaut) to preceding glyph. + + -- String: \*[^] + Apply circumflex accent to preceding glyph. + + -- String: \*[~] + Apply tilde accent to preceding glyph. + + -- String: \*[,] + Apply cedilla to preceding glyph. + + -- String: \*[/] + Apply stroke (slash) to preceding glyph. + + -- String: \*[v] + Apply caron to preceding glyph. + + -- String: \*[_] + Apply macron to preceding glyph. + + -- String: \*[.] + Apply underdot to preceding glyph. + + -- String: \*[o] + Apply ring accent to preceding glyph. + + -- String: \*[?] + Interpolate inverted question mark. + + -- String: \*[!] + Interpolate inverted exclamation mark. + + -- String: \*[8] + Interpolate small letter sharp s. + + -- String: \*[q] + Interpolate small letter o with hook accent (ogonek). + + -- String: \*[3] + Interpolate small letter yogh. + + -- String: \*[d-] + Interpolate small letter eth. + + -- String: \*[D-] + Interpolate capital letter eth. + + -- String: \*[th] + Interpolate small letter thorn. + + -- String: \*[Th] + Interpolate capital letter thorn. + + -- String: \*[ae] + Interpolate small æ ligature. + + -- String: \*[Ae] + Interpolate capital Æ ligature. + + -- String: \*[oe] + Interpolate small oe ligature. + + -- String: \*[OE] + Interpolate capital OE ligature. + + +File: groff.info, Node: ms Naming Conventions, Prev: ms Legacy Features, Up: ms + +4.6.9 Naming Conventions +------------------------ + +The following conventions are used for names of macros, strings, and +registers. External names available to documents that use the 'groff' +'ms' macros contain only uppercase letters and digits. + + Internally, the macros are divided into modules. Conventions for +identifier names are as follows. + + * Names used only within one module are of the form MODULE'*'NAME. + + * Names used outside the module in which they are defined are of the + form MODULE'@'NAME. + + * Names associated with a particular environment are of the form + ENVIRONMENT':'NAME; these are used only within the 'par' module. + + * NAME does not have a module prefix. + + * Constructed names used to implement arrays are of the form + ARRAY'!'INDEX. + + Thus the 'groff' 'ms' macros reserve the following names. + + * Names containing the characters '*', '@', and ':'. + + * Names containing only uppercase letters and digits. + + +File: groff.info, Node: GNU troff Reference, Next: File Formats, Prev: Major Macro Packages, Up: Top + +5 GNU 'troff' Reference +*********************** + +This chapter covers _all_ of the facilities of the GNU 'troff' +formatting engine. Users of macro packages may skip it if not +interested in details. + +* Menu: + +* Text:: +* Page Geometry:: +* Measurements:: +* Numeric Expressions:: +* Identifiers:: +* Formatter Instructions:: +* Comments:: +* Registers:: +* Manipulating Filling and Adjustment:: +* Manipulating Hyphenation:: +* Manipulating Spacing:: +* Tabs and Fields:: +* Character Translations:: +* troff and nroff Modes:: +* Line Layout:: +* Line Continuation:: +* Page Layout:: +* Page Control:: +* Using Fonts:: +* Manipulating Type Size and Vertical Spacing:: +* Colors:: +* Strings:: +* Conditionals and Loops:: +* Writing Macros:: +* Page Motions:: +* Drawing Geometric Objects:: +* Deferring Output:: +* Traps:: +* Diversions:: +* Punning Names:: +* Environments:: +* Suppressing Output:: +* I/O:: +* Postprocessor Access:: +* Miscellaneous:: +* Gtroff Internals:: +* Debugging:: +* Implementation Differences:: + + +File: groff.info, Node: Text, Next: Measurements, Prev: GNU troff Reference, Up: GNU troff Reference + +5.1 Text +======== + +AT&T 'troff' was designed to take input as it would be composed on a +typewriter, including the teletypewriters used as early computer +terminals, and relieve the user drafting a document of concern with +details like line length, hyphenation breaking, and the achievement of +straight margins. Early in its development, the program gained the +ability to prepare output for a phototypesetter; a document could then +be prepared for output to either a teletypewriter, a phototypesetter, or +both. GNU 'troff' continues this tradition of permitting an author to +compose a single master version of a document which can then be rendered +for a variety of output formats or devices. + + 'roff' input files contain text interspersed with instructions to +control the formatter. Even in the absence of such instructions, GNU +'troff' still processes its input in several ways, by filling, +hyphenating, breaking, and adjusting it, and supplementing it with +inter-sentence space. + +* Menu: + +* Filling:: +* Hyphenation:: +* Sentences:: +* Breaking:: +* Adjustment:: +* Tabs and Leaders:: +* Requests and Macros:: +* Macro Packages:: +* Input Encodings:: +* Input Conventions:: + + +File: groff.info, Node: Filling, Next: Sentences, Prev: Text, Up: Text + +5.1.1 Filling +------------- + +When GNU 'troff' starts up, it obtains information about the device for +which it is preparing output.(1) (*note Filling-Footnote-1::) An +essential property is the length of the output line, such as "6.5 +inches". + + GNU 'troff' interprets plain text files employing the Unix +line-ending convention. It reads input a character at a time, +collecting words as it goes, and fits as many words together on an +output line as it can--this is known as "filling". To GNU 'troff', a +"word" is any sequence of one or more characters that aren't spaces or +newlines. The exceptions separate words.(2) (*note +Filling-Footnote-2::) To disable filling, see *note Manipulating Filling +and Adjustment::. + + It is a truth universally acknowledged + that a single man in possession of a + good fortune must be in want of a wife. + => It is a truth universally acknowledged that a + => single man in possession of a good fortune must + => be in want of a wife. + + +File: groff.info, Node: Filling-Footnotes, Up: Filling + + (1) *Note Device and Font Description Files::. + + (2) Tabs and leaders also separate words. Escape sequences can +function as word characters, word separators, or neither--the last +simply have no effect on GNU 'troff''s idea of whether an input +character is within a word. We'll discuss all of these in due course. + + +File: groff.info, Node: Sentences, Next: Hyphenation, Prev: Filling, Up: Text + +5.1.2 Sentences +--------------- + +A passionate debate has raged for decades among writers of the English +language over whether more space should appear between adjacent +sentences than between words within a sentence, and if so, how much, and +what other circumstances should influence this spacing.(1) (*note +Sentences-Footnote-1::) GNU 'troff' follows the example of AT&T 'troff'; +it attempts to detect the boundaries between sentences, and supplies +additional inter-sentence space between them. + + Hello, world! + Welcome to groff. + => Hello, world! Welcome to groff. + + GNU 'troff' flags certain characters (normally '!', '?', and '.') as +potentially ending a sentence. When GNU 'troff' encounters one of these +"end-of-sentence characters" at the end of an input line, or one of them +is followed by two (unescaped) spaces on the same input line, it appends +an inter-word space followed by an inter-sentence space in the output. + + R. Harper subscribes to a maxim of P. T. Barnum. + => R. Harper subscribes to a maxim of P. T. Barnum. + + In the above example, inter-sentence space is not added after 'P.' or +'T.' because the periods do not occur at the end of an input line, nor +are they followed by two or more spaces. Let's imagine that we've heard +something about defamation from Mr. Harper's attorney, recast the +sentence, and reflowed it in our text editor. + + I submit that R. Harper subscribes to a maxim of P. T. + Barnum. + => I submit that R. Harper subscribes to a maxim of + => P. T. Barnum. + + "Barnum" doesn't begin a sentence! What to do? Let us meet our +first "escape sequence", a series of input characters that give +instructions to GNU 'troff' instead of being used to construct output +device glyphs.(2) (*note Sentences-Footnote-2::) An escape sequence +begins with the backslash character '\' by default, an uncommon +character in natural language text, and is _always_ followed by at least +one other character, hence the term "sequence". + + The dummy character escape sequence '\&' can be used after an +end-of-sentence character to defeat end-of-sentence detection on a +per-instance basis. We can therefore rewrite our input more +defensively. + + I submit that R.\& Harper subscribes to a maxim of P.\& + T.\& Barnum. + => I submit that R. Harper subscribes to a maxim of + => P. T. Barnum. + + Adding text caused our input to wrap; now, we don't need '\&' after +'T.' but we do after 'P.'. Consistent use of the escape sequence +ensures that potential sentence boundaries are robust to editing +activities. Further advice along these lines will follow in *note Input +Conventions::. + + Normally, the occurrence of a visible non-end-of-sentence character +(as opposed to a space or tab) immediately after an end-of-sentence +character cancels detection of the end of a sentence. For example, it +would be incorrect for GNU 'troff' to infer the end of a sentence after +the dot in '3.14159'. However, several characters are treated +_transparently_ after the occurrence of an end-of-sentence character. +That is, GNU 'troff' does not cancel end-of-sentence detection when it +processes them. This is because such characters are often used as +footnote markers or to close quotations and parentheticals. The default +set is '"', ''', ')', ']', '*', '\[dg]', '\[dd]', '\[rq]', and '\[cq]'. +The last four are examples of "special characters", escape sequences +whose purpose is to obtain glyphs that are not easily typed at the +keyboard, or which have special meaning to GNU 'troff' (like '\' +itself).(3) (*note Sentences-Footnote-3::) + + \[lq]The idea that the poor should have leisure has always + been shocking to the rich.\[rq] + (Bertrand Russell, 1935) + => "The idea that the poor should have + => leisure has always been shocking to + => the rich." (Bertrand Russell, 1935) + + The sets of characters that potentially end sentences or are +transparent to sentence endings are configurable. See the 'cflags' +request in *note Using Symbols::. To change the additional +inter-sentence space amount--even to remove it entirely--see *note +Manipulating Filling and Adjustment::. + + +File: groff.info, Node: Sentences-Footnotes, Up: Sentences + + (1) A well-researched jeremiad appreciated by 'groff' contributors on +both sides of the sentence-spacing debate can be found at +. + + (2) This statement oversimplifies; there are escape sequences whose +purpose is precisely to produce glyphs on the output device, and input +characters that _aren't_ part of escape sequences can undergo a great +deal of processing before getting to the output. + + (3) The mnemonics for the special characters shown here are "dagger", +"double dagger", "right (double) quote", and "closing (single) quote". +See the 'groff_char(7)' man page. + + +File: groff.info, Node: Hyphenation, Next: Breaking, Prev: Sentences, Up: Text + +5.1.3 Hyphenation +----------------- + +When an output line is nearly full, it is uncommon for the next word +collected from the input to exactly fill it--typically, there is room +left over only for part of the next word. The process of splitting a +word so that it appears partially on one line (with a hyphen to indicate +to the reader that the word has been broken) with its remainder on the +next is "hyphenation". Hyphenation points can be manually specified; +GNU 'troff' also uses a hyphenation algorithm and language-specific +pattern files (based on those used in TeX) to decide which words can be +hyphenated and where. + + Hyphenation does not always occur even when the hyphenation rules for +a word allow it; it can be disabled, and when not disabled there are +several parameters that can prevent it in certain circumstances. *Note +Manipulating Hyphenation::. + + +File: groff.info, Node: Breaking, Next: Adjustment, Prev: Hyphenation, Up: Text + +5.1.4 Breaking +-------------- + +Once an output line is full, the next word (or remainder of a hyphenated +one) is placed on a different output line; this is called a "break". In +this manual and in 'roff' discussions generally, a "break" if not +further qualified always refers to the termination of an output line. +When the formatter is filling text, it introduces breaks automatically +to keep output lines from exceeding the configured line length. After +an automatic break, GNU 'troff' adjusts the line if applicable (see +below), and then resumes collecting and filling text on the next output +line. + + Sometimes, a line cannot be broken automatically. This usually does +not happen with natural language text unless the output line length has +been manipulated to be extremely short, but it can with specialized text +like program source code. We can use 'perl' at the shell prompt to +contrive an example of failure to break the line. We also employ the +'-z' option to suppress normal output. + + $ perl -e 'print "#" x 80, "\n";' | nroff -z + error-> warning: cannot break line + + The remedy for these cases is to tell GNU 'troff' where the line may +be broken without hyphens. This is done with the non-printing break +point escape sequence '\:'; see *note Manipulating Hyphenation::. + + What if the document author wants to stop filling lines temporarily, +for instance to start a new paragraph? There are several solutions. A +blank input line not only causes a break, but by default it also outputs +a one-line vertical space (effectively a blank output line). This +behavior can be modified; see *note Blank Line Traps::. Macro packages +may discourage or disable the blank line method of paragraphing in favor +of their own macros. + + A line that begins with one or more spaces causes a break. The +spaces are output at the beginning of the next line without being +_adjusted_ (see below); however, this behavior can be modified (*note +Leading Space Traps::). Again, macro packages may provide other methods +of producing indented paragraphs. Trailing spaces on text lines are +discarded.(1) (*note Breaking-Footnote-1::) + + What if the file ends before enough words have been collected to fill +an output line? Or the output line is exactly full but not yet broken, +and there is no more input? GNU 'troff' interprets the end of input as +a break. Certain requests also cause breaks, implicitly or explicitly. +This is discussed in *note Manipulating Filling and Adjustment::. + + +File: groff.info, Node: Breaking-Footnotes, Up: Breaking + + (1) "Text lines" are defined in *note Requests and Macros::. + + +File: groff.info, Node: Adjustment, Next: Tabs and Leaders, Prev: Breaking, Up: Text + +5.1.5 Adjustment +---------------- + +After GNU 'troff' performs an automatic break, it may then "adjust" the +line, widening inter-word spaces until the text reaches the right +margin. Extra spaces between words are preserved. Leading and trailing +spaces are handled as noted above. Text can be aligned to the left or +right margin only, or centered; see *note Manipulating Filling and +Adjustment::. + + +File: groff.info, Node: Tabs and Leaders, Next: Input Conventions, Prev: Adjustment, Up: Text + +5.1.6 Tabs and Leaders +---------------------- + +GNU 'troff' translates input horizontal tab characters ("tabs") and + characters ("leaders") into movements to the next tab stop. +Tabs simply move to the next tab stop; leaders place enough periods to +fill the space. Tab stops are by default located every half inch +measured from the drawing position corresponding to the beginning of the +input line; see *note Page Geometry::. Tabs and leaders do not cause +breaks and therefore do not interrupt filling. Below, we use arrows -> +and bullets * to indicate input tabs and leaders, respectively. + + 1 + -> 2 -> 3 * 4 + -> * 5 + => 1 2 3.......4 ........5 + + Tabs and leaders lend themselves to table construction.(1) (*note +Tabs and Leaders-Footnote-1::) The tab and leader glyphs can be +configured, and further facilities for sophisticated table composition +are available; see *note Tabs and Fields::. There are many details to +track when using such low-level features, so most users turn to the +'tbl(1)' preprocessor to lay out tables. + + +File: groff.info, Node: Tabs and Leaders-Footnotes, Up: Tabs and Leaders + + (1) "Tab" is short for "tabulation", revealing the term's origin as a +spacing mechanism for table arrangement. + + +File: groff.info, Node: Requests and Macros, Next: Macro Packages, Prev: Tabs and Leaders, Up: Text + +5.1.7 Requests and Macros +------------------------- + +We have now encountered almost all of the syntax there is in the 'roff' +language, with an exception already noted in passing. A "request" is an +instruction to the formatter that occurs after a "control character", +which is recognized at the beginning of an input line. The regular +control character is a dot ('.'). Its counterpart, the "no-break +control character", a neutral apostrophe ('''), suppresses the break +that is implied by some requests. These characters were chosen because +it is uncommon for lines of text in natural languages to begin with +them. If you require a formatted period or apostrophe (closing single +quotation mark) where GNU 'troff' is expecting a control character, +prefix the dot or neutral apostrophe with the dummy character escape +sequence, '\&'. + + An input line beginning with a control character is called a "control +line". Every line of input that is not a control line is a "text +line".(1) (*note Requests and Macros-Footnote-1::) + + Requests often take "arguments", words (separated from the request +name and each other by spaces) that specify details of the action GNU +'troff' is expected to perform. If a request is meaningless without +arguments, it is typically ignored. + + GNU 'troff''s requests and escape sequences comprise the control +language of the formatter. Of key importance are the requests that +define macros. Macros are invoked like requests, enabling the request +repertoire to be extended or overridden.(2) (*note Requests and +Macros-Footnote-2::) + + A "macro" can be thought of as an abbreviation you can define for a +collection of control and text lines. When the macro is "called" by +giving its name after a control character, it is replaced with what it +stands for. The process of textual replacement is known as +"interpolation".(3) (*note Requests and Macros-Footnote-3::) +Interpolations are handled as soon as they are recognized, and once +performed, a 'roff' formatter scans the replacement for further +requests, macro calls, and escape sequences. + + In 'roff' systems, the 'de' request defines a macro.(4) (*note +Requests and Macros-Footnote-4::) + + .de DATE + 2020-11-14 + .. + +The foregoing input produces no output by itself; all we have done is +store some information. Observe the pair of dots that ends the macro +definition. This is a default; you can specify your own terminator for +the macro definition as the second argument to the 'de' request. + + .de NAME ENDNAME + Heywood Jabuzzoff + .ENDNAME + + In fact, the ending marker is itself the name of a macro to be +called, or a request to be invoked, if it is defined at the time its +control line is read. + + .de END + Big Rip + .. + .de START END + Big Bang + .END + .START + => Big Rip Big Bang + +In the foregoing example, "Big Rip" printed before "Big Bang" because +its macro was _called_ first. Consider what would happen if we dropped +'END' from the '.de START' line and added '..' after '.END'. Would the +order change? + + Let us consider a more elaborate example. + + .de DATE + 2020-10-05 + .. + . + .de BOSS + D.\& Kruger, + J.\& Peterman + .. + . + .de NOTICE + Approved: + .DATE + by + .BOSS + .. + . + Insert tedious regulatory compliance paragraph here. + + .NOTICE + + Insert tedious liability disclaimer paragraph here. + + .NOTICE + => Insert tedious regulatory compliance paragraph here. + => + => Approved: 2020-10-05 by D. Kruger, J. Peterman + => + => Insert tedious liability disclaimer paragraph here. + => + => Approved: 2020-10-05 by D. Kruger, J. Peterman + +The above document started with a series of control lines. Three macros +were defined, with a 'de' request declaring each macro's name, and the +"body" of the macro starting on the next line and continuing until a +line with two dots ''..'' marked its end. The text proper began only +after the macros were defined; this is a common pattern. Only the +'NOTICE' macro was called "directly" by the document; 'DATE' and 'BOSS' +were called only by 'NOTICE' itself. Escape sequences were used in +'BOSS', two levels of macro interpolation deep. + + The advantage in typing and maintenance economy may not be obvious +from such a short example, but imagine a much longer document with +dozens of such paragraphs, each requiring a notice of managerial +approval. Consider what must happen if you are in charge of generating +a new version of such a document with a different date, for a different +boss. With well-chosen macros, you only have to change each datum in +one place. + + In practice, we would probably use strings (*note Strings::) instead +of macros for such simple interpolations; what is important here is to +glimpse the potential of macros and the power of recursive +interpolation. + + We could have defined 'DATE' and 'BOSS' in the opposite order; +perhaps less obviously, we could also have defined them _after_ +'NOTICE'. "Forward references" like this are acceptable because the +body of a macro definition is not (completely) interpreted, but stored +instead (*note Copy Mode::). While a macro is being defined (or +appended to), requests are not interpreted and macros not interpolated, +whereas some commonly used escape sequences _are_ interpreted. 'roff' +systems also support recursive macro calls, as long as you have a way to +break the recursion (*note Conditionals and Loops::). Maintainable +'roff' documents tend to arrange macro definitions to minimize forward +references. + + +File: groff.info, Node: Requests and Macros-Footnotes, Up: Requests and Macros + + (1) The '\' escape sequence can alter how an input line is +classified; see *note Line Continuation::. + + (2) Argument handling in macros is more flexible but also more +complex. *Note Calling Macros::. + + (3) Some escape sequences undergo interpolation as well. + + (4) GNU 'troff' offers additional ones. *Note Writing Macros::. + + +File: groff.info, Node: Macro Packages, Next: Input Encodings, Prev: Requests and Macros, Up: Text + +5.1.8 Macro Packages +-------------------- + +Macro definitions can be collected into "macro files", 'roff' input +files designed to produce no output themselves but instead ease the +preparation of other 'roff' documents. There is no syntactical +difference between a macro file and any other 'roff' document; only its +purpose distinguishes it. When a macro file is installed at a standard +location and suitable for use by a general audience, it is often termed +a "macro package".(1) (*note Macro Packages-Footnote-1::) Macro +packages can be loaded by supplying the '-m' option to GNU 'troff' or a +'groff' front end. Alternatively, a document requiring a macro package +can load it with the 'mso' ("macro source") request. + + +File: groff.info, Node: Macro Packages-Footnotes, Up: Macro Packages + + (1) Macro files and packages frequently define registers and strings +as well. + + +File: groff.info, Node: Input Encodings, Next: Input Conventions, Prev: Macro Packages, Up: Text + +5.1.9 Input Encodings +--------------------- + +The 'groff' command's '-k' option calls the 'preconv' preprocessor to +perform input character encoding conversions. Input to the GNU 'troff' +formatter itself, on the other hand, must be in one of two encodings it +can recognize. + +'cp1047' + The code page 1047 input encoding works only on EBCDIC platforms + (and conversely, the other input encodings don't work with EBCDIC); + the file 'cp1047.tmac' is loaded at startup. + +'latin1' + ISO Latin-1, an encoding for Western European languages, is the + default input encoding on non-EBCDIC platforms; the file + 'latin1.tmac' is loaded at startup. + +Any document that is encoded in ISO 646:1991 (a descendant of USAS +X3.4-1968 or "US-ASCII"), or, equivalently, uses only code points from +the "C0 Controls" and "Basic Latin" parts of the Unicode character set +is also a valid ISO Latin-1 document; the standards are interchangeable +in their first 128 code points.(1) (*note Input Encodings-Footnote-1::) + + Other encodings are supported by means of macro packages. + +'latin2' + To use ISO Latin-2, an encoding for Central and Eastern European + languages, invoke '.mso latin2.tmac' at the beginning of your + document or supply '-mlatin2' as a command-line argument to + 'groff'. + +'latin5' + To use ISO Latin-5, an encoding for the Turkish language, invoke + '.mso latin5.tmac' at the beginning of your document or supply + '-mlatin5' as a command-line argument to 'groff'. + +'latin9' + ISO Latin-9 succeeds Latin-1; it includes a Euro sign and better + glyph coverage for French. To use this encoding, invoke + '.mso latin9.tmac' at the beginning of your document or supply + '-mlatin9' as a command-line argument to 'groff'. + + Some characters from an input encoding may not be available with a +particular output driver, or their glyphs may not have representation in +the font used. For terminal devices, fallbacks are defined, like 'EUR' +for the Euro sign and '(C)' for the copyright sign. For typesetter +devices, you may need to "mount" fonts that support glyphs required by +the document. *Note Font Positions::. + + Because a Euro glyph was not historically defined in PostScript +fonts, 'groff' comes with a font called 'freeeuro.pfa' that provides the +Euro in several styles. Standard PostScript fonts contain the glyphs +from Latin-5 and Latin-9 that Latin-1 lacks, so these encodings are +supported for the 'ps' and 'pdf' output devices as 'groff' ships, while +Latin-2 is not. + + Unicode supports characters from all other input encodings; the +'utf8' output driver for terminals therefore does as well. The DVI +output driver supports the Latin-2 and Latin-9 encodings if the +command-line option '-mec' is used as well. (2) (*note Input +Encodings-Footnote-2::) + + +File: groff.info, Node: Input Encodings-Footnotes, Up: Input Encodings + + (1) The _semantics_ of certain punctuation code points have gotten +stricter with the successive standards, a cause of some frustration +among man page writers; see the 'groff_char(7)' man page. + + (2) The DVI output device defaults to using the Computer Modern (CM) +fonts; 'ec.tmac' loads the EC fonts instead, which provide Euro '\[Eu]' +and per mille '\[%0]' glyphs. + + +File: groff.info, Node: Input Conventions, Prev: Input Encodings, Up: Text + +5.1.10 Input Conventions +------------------------ + +Since GNU 'troff' fills text automatically, it is common practice in the +'roff' language to avoid visual composition of text in input files: the +esthetic appeal of the formatted output is what matters. Therefore, +'roff' input should be arranged such that it is easy for authors and +maintainers to compose and develop the document, understand the syntax +of 'roff' requests, macro calls, and preprocessor languages used, and +predict the behavior of the formatter. Several traditions have accrued +in service of these goals. + + * Follow sentence endings in the input with newlines to ease their + recognition (*note Sentences::). It is frequently convenient to + end text lines after colons and semicolons as well, as these + typically precede independent clauses. Consider doing so after + commas; they often occur in lists that become easy to scan when + itemized by line, or constitute supplements to the sentence that + are added, deleted, or updated to clarify it. Parenthetical and + quoted phrases are also good candidates for placement on text lines + by themselves. + + * Set your text editor's line length to 72 characters or fewer.(1) + (*note Input Conventions-Footnote-1::) This limit, combined with + the previous item of advice, makes it less common that an input + line will wrap in your text editor, and thus will help you perceive + excessively long constructions in your text. Recall that natural + languages originate in speech, not writing, and that punctuation is + correlated with pauses for breathing and changes in prosody. + + * Use '\&' after '!', '?', and '.' if they are followed by space, + tab, or newline characters and don't end a sentence. + + * In filled text lines, use '\&' before '.' and ''' if they are + preceded by space, so that reflowing the input doesn't turn them + into control lines. + + * Do not use spaces to perform indentation or align columns of a + table. Leading spaces are reliable when text is not being filled. + + * Comment your document. It is never too soon to apply comments to + record information of use to future document maintainers (including + your future self). We thus introduce another escape sequence, + '\"', which causes GNU 'troff' to ignore the remainder of the input + line. + + * Use the empty request--a control character followed immediately by + a newline--to visually manage separation of material in input + files. Many of the 'groff' project's own documents use an empty + request between sentences, after macro definitions, and where a + break is expected, and two empty requests between paragraphs or + other requests or macro calls that will introduce vertical space + into the document. + + You can combine the empty request with the comment escape sequence + to include whole-line comments in your document, and even "comment + out" sections of it. + + We conclude this section with an example sufficiently long to +illustrate most of the above suggestions in practice. For the purpose +of fitting the example between the margins of this manual with the font +used for its typeset version, we have shortened the input line length to +56 columns. As before, an arrow -> indicates a tab character. + + .\" nroff this_file.roff | less + .\" groff -T ps this_file.roff > this_file.ps + ->The theory of relativity is intimately connected with + the theory of space and time. + . + I shall therefore begin with a brief investigation of + the origin of our ideas of space and time, + although in doing so I know that I introduce a + controversial subject. \" remainder of paragraph elided + . + . + + ->The experiences of an individual appear to us arranged + in a series of events; + in this series the single events which we remember + appear to be ordered according to the criterion of + \[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped + which cannot be analysed further. + . + There exists, + therefore, + for the individual, + an I-time, + or subjective time. + . + This itself is not measurable. + . + I can, + indeed, + associate numbers with the events, + in such a way that the greater number is associated with + the later event than with an earlier one; + but the nature of this association may be quite + arbitrary. + . + This association I can define by means of a clock by + comparing the order of events furnished by the clock + with the order of a given series of events. + . + We understand by a clock something which provides a + series of events which can be counted, + and which has other properties of which we shall speak + later. + .\" Albert Einstein, _The Meaning of Relativity_, 1922 + + +File: groff.info, Node: Input Conventions-Footnotes, Up: Input Conventions + + (1) Emacs: 'fill-column: 72'; Vim: 'textwidth=72' + + +File: groff.info, Node: Page Geometry, Next: Measurements, Prev: Text, Up: GNU troff Reference + +5.2 Page Geometry +================= + +'roff' systems format text under certain assumptions about the size of +the output medium, or page. For the formatter to correctly break a line +it is filling, it must know the line length, which it derives from the +page width (*note Line Layout::). For it to decide whether to write an +output line to the current page or wait until the next one, it must know +the page length (*note Page Layout::). + + A device's "resolution" converts practical units like inches or +centimeters to "basic units", a convenient length measure for the output +device or file format. The formatter and output driver use basic units +to reckon page measurements. The device description file defines its +resolution and page dimensions (*note DESC File Format::). + + A "page" is a two-dimensional structure upon which a 'roff' system +imposes a rectangular coordinate system with its upper left corner as +the origin. Coordinate values are in basic units and increase down and +to the right. Useful ones are therefore always positive and within +numeric ranges corresponding to the page boundaries. + + While the formatter (and, later, output driver) is processing a page, +it keeps track of its "drawing position", which is the location at which +the next glyph will be written, from which the next motion will be +measured, or where a geometric object will commence rendering. +Notionally, glyphs are drawn from the text baseline upward and to the +right.(1) (*note Page Geometry-Footnote-1::) The "text baseline" is a +(usually invisible) line upon which the glyphs of a typeface are +aligned. A glyph therefore "starts" at its bottom-left corner. If +drawn at the origin, a typical letter glyph would lie partially or +wholly off the page, depending on whether, like "g", it features a +descender below the baseline. + + Such a situation is nearly always undesirable. It is furthermore +conventional not to write or draw at the extreme edges of the page. +Therefore the initial drawing position of a 'roff' formatter is not at +the origin, but below and to the right of it. This rightward shift from +the left edge is known as the "page offset".(2) (*note Page +Geometry-Footnote-2::) The downward shift leaves room for a text output +line. + + Text is arranged on a one-dimensional lattice of text baselines from +the top to the bottom of the page. "Vertical spacing" is the distance +between adjacent text baselines. Typographic tradition sets this +quantity to 120% of the type size. The initial drawing position is one +unit of vertical spacing below the page top. Typographers term this +unit a vee. + + Vertical spacing has an impact on page-breaking decisions. +Generally, when a break occurs, the formatter moves the drawing position +to the next text baseline automatically. If the formatter were already +writing to the last line that would fit on the page, advancing by one +vee would place the next text baseline off the page. Rather than let +that happen, 'roff' formatters instruct the output driver to eject the +page, start a new one, and again set the drawing position to one vee +below the page top; this is a "page break". + + When the last line of input text corresponds to the last output line +that fits on the page, the break caused by the end of input will also +break the page, producing a useless blank one. Macro packages keep +users from having to confront this difficulty by setting "traps" (*note +Traps::); moreover, all but the simplest page layouts tend to have +headers and footers, or at least bear vertical margins larger than one +vee. + + +File: groff.info, Node: Page Geometry-Footnotes, Up: Page Geometry + + (1) 'groff' does not yet support right-to-left scripts. + + (2) 'groff''s terminal output devices have page offsets of zero. + + +File: groff.info, Node: Measurements, Next: Numeric Expressions, Prev: Text, Up: GNU troff Reference + +5.3 Measurements +================ + +The formatter sometimes requires the input of numeric parameters to +specify measurements. These are specified as integers or decimal +fractions with an optional "scaling unit" suffixed. A scaling unit is a +letter that immediately follows the last digit of a number. Digits +after the decimal point are optional. Measurement expressions include +'10.5p', '11i', and '3.c'. + + Measurements are scaled by the scaling unit and stored internally +(with any fractional part discarded) in basic units. The device +resolution can therefore be obtained by storing a value of '1i' to a +register. The only constraint on the basic unit is that it is at least +as small as any other unit. + +'u' + Basic unit. + +'i' + Inch; defined as 2.54 centimeters. + +'c' + Centimeter; a centimeter is about 0.3937 inches. + +'p' + Point; a typesetter's unit used for measuring type size. There are + 72 points to an inch. + +'P' + Pica; another typesetter's unit. There are 6 picas to an inch and + 12 points to a pica. + +'s' +'z' + *Note Using Fractional Type Sizes::, for a discussion of these + units. + +'f' + GNU 'troff' defines this unit to scale decimal fractions in the + interval [0, 1] to 16-bit unsigned integers. It multiplies a + quantity by 65,536. *Note Colors::, for usage. + + The magnitudes of other scaling units depend on the text formatting +parameters in effect. These are useful when specifying measurements +that need to scale with the typeface or vertical spacing. + +'m' + Em; an em is equal to the current type size in points. It is named + thus because it is approximately the width of the letter 'M'. + +'n' + En; an en is one-half em. + +'v' + Vee; recall *note Page Geometry::. + +'M' + Hundredth of an em. + +* Menu: + +* Motion Quanta:: +* Default Units:: + + +File: groff.info, Node: Motion Quanta, Next: Default Units, Prev: Measurements, Up: Measurements + +5.3.1 Motion Quanta +------------------- + +An output device's basic unit 'u' is not necessarily its smallest +addressable length; 'u' can be smaller to avoid problems with integer +roundoff. The minimum distances that a device can work with in the +horizontal and vertical directions are termed its "motion quanta". +Measurements are rounded to applicable motion quanta. Half-quantum +fractions round toward zero. + + -- Register: \n[.H] + -- Register: \n[.V] + These read-only registers interpolate the horizontal and vertical + motion quanta, respectively, of the output device in basic units. + + For example, we might draw short baseline rules on a terminal device +as follows. *Note Drawing Geometric Objects::. + + .tm \n[.H] + error-> 24 + .nf + \l'36u' 36u + \l'37u' 37u + => _ 36u + => __ 37u + + +File: groff.info, Node: Default Units, Prev: Motion Quanta, Up: Measurements + +5.3.2 Default Units +------------------- + +A general-purpose register (one created or updated with the 'nr' +request; see *note Registers::) is implicitly dimensionless, or reckoned +in basic units if interpreted in a measurement context. But it is +convenient for many requests and escape sequences to infer a scaling +unit for an argument if none is specified. An explicit scaling unit +(not after a closing parenthesis) can override an undesirable default. +Effectively, the default unit is suffixed to the expression if a scaling +unit is not already present. GNU 'troff''s use of integer arithmetic +should also be kept in mind (*note Numeric Expressions::). + + The 'll' request interprets its argument in ems by default. Consider +several attempts to set a line length of 3.5 inches when the type size +is 10 points on a terminal device with a resolution of 240 basic units +and horizontal motion quantum of 24. Some expressions become zero; the +request clamps them to that quantum. + + .ll 3.5i \" 3.5i (= 840u) + .ll 7/2 \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u + .ll (7 / 2)u \" 7u/2u -> as above + .ll 7/2i \" 7u/2i -> 7u/480u -> 0 -> as above + .ll 7i/2 \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u + .ll 7i/2u \" 3.5i (= 840u) + +The safest way to specify measurements is to attach a scaling unit. To +multiply or divide by a dimensionless quantity, use 'u' as its scaling +unit. + + +File: groff.info, Node: Numeric Expressions, Next: Identifiers, Prev: Measurements, Up: GNU troff Reference + +5.4 Numeric Expressions +======================= + +A "numeric expression" evaluates to an integer: it can be as simple as a +literal '0' or it can be a complex sequence of register and string +interpolations interleaved with measurements and operators. + + GNU 'troff' provides a set of mathematical and logical operators +familiar to programmers--as well as some unusual ones--but supports only +integer arithmetic.(1) (*note Numeric Expressions-Footnote-1::) The +internal data type used for computing results is usually a 32-bit signed +integer, which suffices to represent magnitudes within a range of ±2 +billion.(2) (*note Numeric Expressions-Footnote-2::) + + Arithmetic infix operators perform a function on the numeric +expressions to their left and right; they are '+' (addition), '-' +(subtraction), '*' (multiplication), '/' (truncating division), and '%' +(modulus). "Truncating division" rounds to the integer nearer to zero, +no matter how large the fractional portion. Overflow and division (or +modulus) by zero are errors and abort evaluation of a numeric +expression. + + Arithmetic unary operators operate on the numeric expression to their +right; they are '-' (negation) and '+' (assertion--for completeness; it +does nothing). The unary minus must often be used with parentheses to +avoid confusion with the decrementation operator, discussed below. + + Observe the rounding behavior and effect of negative operands on the +modulus and truncating division operators. + + .nr T 199/100 + .nr U 5/2 + .nr V (-5)/2 + .nr W 5/-2 + .nr X 5%2 + .nr Y (-5)%2 + .nr Z 5%-2 + T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z] + => T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1 + +The sign of the modulus of operands of mixed signs is determined by the +sign of the first. Division and modulus operators satisfy the following +property: given a dividend A and a divisor B, a quotient Q formed by '(a +/ b)' and a remainder R by '(a % b)', then qb + r = a. + + GNU 'troff''s scaling operator, used with parentheses as '(C;E)', +evaluates a numeric expression E using C as the default scaling unit. +If C is omitted, scaling units are ignored in the evaluation of E. This +operator can save typing by avoiding the attachment of scaling units to +every operand out of caution. Your macros can select a sensible default +unit in case the user neglects to supply one. + + .\" Indent by amount given in first argument; assume ens. + .de Indent + . in (n;\\$1) + .. + +Without the scaling operator, the foregoing macro would, if called with +a unitless argument, cause indentation by the 'in' request's default +scaling unit (ems). The result would be twice as much indentation as +expected. + + GNU 'troff' also provides a pair of operators to compute the extrema +of two operands: '>?' (maximum) and ' Looks like we'll end up paying 3 salaries. + + Comparison operators comprise '<' (less than), '>' (greater than), +'<=' (less than or equal), '>=' (greater than or equal), and '=' +(equal). '==' is a synonym for '='. When evaluated, a comparison is +replaced with '0' if it is false and '1' if true. In the 'roff' +language, positive values are true, others false. + + We can operate on truth values with the logical operators '&' +(logical conjunction or "and") and ':' (logical disjunction or "or"). +They evaluate as comparison operators do. + + A logical complementation ("not") operator, '!', works only within +'if', 'ie', and 'while' requests. Furthermore, '!' is recognized only +at the beginning of a numeric expression not contained by another +numeric expression. In other words, it must be the "outermost" +operator. Including it elsewhere in the expression produces a warning +in the 'number' category (*note Warnings::), and its expression +evaluates false. This unfortunate limitation maintains compatibility +with AT&T 'troff'. Test a numeric expression for falsity by comparing +it to a false value.(3) (*note Numeric Expressions-Footnote-3::) + + .nr X 1 + .nr Y 0 + .\" This does not work as expected. + .if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false + . + .\" Use this construct instead. + .if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false + error-> warning: expected numeric expression, got '!' + => B: X is true, Y is false + + The 'roff' language has no operator precedence: expressions are +evaluated strictly from left to right, in contrast to schoolhouse +arithmetic. Use parentheses '(' ')' to impose a desired precedence upon +subexpressions. + + .nr X 3+5*4 + .nr Y (3+5)*4 + .nr Z 3+(5*4) + X=\n[X] Y=\n[Y] Z=\n[Z] + => X=32 Y=32 Z=23 + + For many requests and escape sequences that cause motion on the page, +the unary operators '+' and '-' work differently when leading a numeric +expression. They then indicate a motion relative to the drawing +position: positive is down in vertical contexts, right in horizontal +ones. + + '+' and '-' are also treated differently by the following requests +and escape sequences: 'bp', 'in', 'll', 'lt', 'nm', 'nr', 'pl', 'pn', +'po', 'ps', 'pvs', 'rt', 'ti', '\H', '\R', and '\s'. Here, leading plus +and minus signs serve as incrementation and decrementation operators, +respectively. To negate an expression, subtract it from zero or include +the unary minus in parentheses with its argument. *Note Setting +Registers::, for examples. + + A leading '|' operator indicates a motion relative not to the drawing +position but to a boundary. For horizontal motions, the measurement +specifies a distance relative to a drawing position corresponding to the +beginning of the _input_ line. By default, tab stops reckon movements +in this way. Most escape sequences do not; '|' tells them to do so. + + Mind the \h'1.2i'gap. + .br + Mind the \h'|1.2i'gap. + .br + Mind the + \h'|1.2i'gap. + => Mind the gap. + => Mind the gap. + => Mind the gap. + + One use of this feature is to define macros whose scope is limited to +the output they format. + + .\" underline word $1 with trailing punctuation $2 + .de Underline + . nop \\$1\l'|0\[ul]'\\$2 + .. + Typographical emphasis is best used + .Underline sparingly . + +In the above example, '|0' specifies a negative motion from the current +position (at the end of the argument just emitted, '\$1') to the +beginning of the input line. Thus, the '\l' escape sequence in this +case draws a line from right to left. A macro call occurs at the +beginning of an input line;(4) (*note Numeric Expressions-Footnote-4::) +if the '|' operator were omitted, then the underline would be drawn at +zero distance from the current position, producing device-dependent, and +likely undesirable, results. On the 'ps' output device, it underlines +the period. + + For vertical motions, the '|' operator specifies a distance from the +first text baseline on the page or in the current diversion,(5) (*note +Numeric Expressions-Footnote-5::) using the current vertical spacing. + + A + .br + B \Z'C'\v'|0'D + => A D + => B C + + In the foregoing example, we've used the '\Z' escape sequence (*note +Page Motions::) to restore the drawing position after formatting 'C', +then moved vertically to the first text baseline on the page. + + -- Escape sequence: \B'anything' + Interpolate 1 if ANYTHING is a valid numeric expression, and 0 + otherwise. The delimiter need not be a neutral apostrophe; see + *note Delimiters::. + + You might use '\B' along with the 'if' request to filter out invalid +macro or string arguments. *Note Conditionals and Loops::. + + .\" Indent by amount given in first argument; assume ens. + .de Indent + . if \B'\\$1' .in (n;\\$1) + .. + + A register interpolated as an operand in a numeric expression must +have an Arabic format; luckily, this is the default. *Note Assigning +Register Formats::. + + Because spaces separate arguments to requests, spaces are not allowed +in numeric expressions unless the (sub)expression containing them is +surrounded by parentheses. *Note Invoking Requests::, and *note +Conditionals and Loops::. + + .nf + .nr a 1+2 + 2+1 + \na + error-> expected numeric expression, got a space + => 3 + .nr a 1+(2 + 2)+1 + \na + => 6 + + The 'nr' request (*note Setting Registers::) expects its second and +optional third arguments to be numeric expressions; a bare '+' does not +qualify, so our first attempt got a warning. + + +File: groff.info, Node: Numeric Expressions-Footnotes, Up: Numeric Expressions + + (1) Provision is made for interpreting and reporting decimal +fractions in certain cases. + + (2) If that's not enough, see the 'groff_tmac(5)' man page for the +'62bit.tmac' macro package. + + (3) *Note Conditionals and Loops::. + + (4) Control structure syntax creates an exception to this rule, but +is designed to remain useful: recalling our example, '.if 1 .Underline +this' would underline only "this", precisely. *Note Conditionals and +Loops::. + + (5) *Note Diversions::. + + +File: groff.info, Node: Identifiers, Next: Formatter Instructions, Prev: Numeric Expressions, Up: GNU troff Reference + +5.5 Identifiers +=============== + +An "identifier" labels a GNU 'troff' datum such as a register, name +(macro, string, or diversion), typeface, color, special character, +character class, environment, or stream. Valid identifiers consist of +one or more ordinary characters. An ordinary character is an input +character that is not the escape character, a leader, tab, newline, or +invalid as GNU 'troff' input. + + Invalid input characters are a subset of control characters (from the +sets "C0 Controls" and "C1 Controls" as Unicode describes them). When +GNU 'troff' encounters one in an identifier, it produces a warning in +category 'input' (*note Warnings::). They are removed during +interpretation: an identifier 'foo', followed by an invalid character +and then 'bar', is processed as 'foobar'. + + On a machine using the ISO 646, 8859, or 10646 character encodings, +invalid input characters are '0x00', '0x08', '0x0B', '0x0D'-'0x1F', and +'0x80'-'0x9F'. On an EBCDIC host, they are '0x00'-'0x01', '0x08', +'0x09', '0x0B', '0x0D'-'0x14', '0x17'-'0x1F', and '0x30'-'0x3F'.(1) +(*note Identifiers-Footnote-1::) Some of these code points are used by +GNU 'troff' internally, making it non-trivial to extend the program to +accept UTF-8 or other encodings that use characters from these +ranges.(2) (*note Identifiers-Footnote-2::) + + Thus, the identifiers 'br', 'PP', 'end-list', 'ref*normal-print', +'|', '@_', and '!"#$%'()*+,-./' are all valid. Discretion should be +exercised to prevent confusion. Identifiers starting with '(' or '[' +require care. + + .nr x 9 + .nr y 1 + .nr (x 2 + .nr [y 3 + .nr sum1 (\n(x + \n[y]) + error-> a space character is not allowed in an escape + error-> sequence parameter + A:2+3=\n[sum1] + .nr sum2 (\n((x + \n[[y]) + B:2+3=\n[sum2] + .nr sum3 (\n[(x] + \n([y) + C:2+3=\n[sum3] + => A:2+3=1 B:2+3=5 C:2+3=5 + +An identifier with a closing bracket (']') in its name can't be accessed +with bracket-form escape sequences that expect an identifier as a +parameter. For example, '\[foo]]' accesses the glyph 'foo', followed by +']' in whatever the surrounding context is, whereas '\C'foo]'' formats a +glyph named 'foo]'. Similarly, the identifier '(' can't be interpolated +_except_ with bracket forms. + + If you begin a macro, string, or diversion name with either of the +characters '[' or ']', you foreclose use of the 'grefer' preprocessor, +which recognizes '.[' and '.]' as bibliographic reference delimiters. + + -- Escape sequence: \A'anything' + Interpolate 1 if ANYTHING is a valid identifier, and 0 otherwise. + The delimiter need not be a neutral apostrophe; see *note + Delimiters::. Because invalid input characters are removed (see + above), invalid identifiers are empty or contain spaces, tabs, or + newlines. + + You can employ '\A' to validate a macro argument before using it to + construct another escape sequence or identifier. + + .\" usage: .init-coordinate-pair name val1 val2 + .\" Create a coordinate pair where name!x=val1 and + .\" name!y=val2. + .de init-coordinate-pair + . if \A'\\$1' \{\ + . if \B'\\$2' .nr \\$1!x \\$2 + . if \B'\\$3' .nr \\$1!y \\$3 + . \} + .. + .init-coordinate-pair center 5 10 + The center is at (\n[center!x], \n[center!y]). + .init-coordinate-pair "poi->nt" trash garbage \" ignored + .init-coordinate-pair point trash garbage \" ignored + => The center is at (5, 10). + + In this example, we also validated the numeric arguments; the + registers 'point!x' and 'point!y' remain undefined. *Note Numeric + Expressions:: for the '\B' escape sequence. + + How GNU 'troff' handles the interpretation of an undefined identifier +depends on the context. There is no way to invoke an undefined request; +such syntax is interpreted as a macro call instead. If the identifier +is interpreted as a string, macro, or diversion, GNU 'troff' emits a +warning in category 'mac', defines it as empty, and interpolates +nothing. If the identifier is interpreted as a register, GNU 'troff' +emits a warning in category 'reg', initializes it to zero, and +interpolates that value. *Note Warnings::, *note Interpolating +Registers::, and *note Strings::. Attempting to use an undefined +typeface, special character, color, character class, environment, or +stream generally provokes an error diagnostic. + + Identifiers for requests, macros, strings, and diversions share one +name space; special characters and character classes another. No other +object types do. + + .de xxx + . nop foo + .. + .di xxx + bar + .br + .di + . + .xxx + => bar + +The foregoing example shows that GNU 'troff' reuses the identifier +'xxx', changing it from a macro to a diversion. No warning is emitted, +and the previous contents of 'xxx' are lost. + + +File: groff.info, Node: Identifiers-Footnotes, Up: Identifiers + + (1) Historically, control characters like ASCII STX, ETX, and BEL +(, , and ) have been observed in 'roff' +documents, particularly in macro packages employing them as delimiters +with the output comparison operator to try to avoid collisions with the +content of arbitrary user-supplied parameters (*note Operators in +Conditionals::). We discourage this expedient; in GNU 'troff' it is +unnecessary (outside of compatibility mode) because delimited arguments +are parsed at a different input level than the surrounding context. +*Note Implementation Differences::. + + (2) Consider what happens when a C1 control '0x80'-'0x9F' is +necessary as a continuation byte in a UTF-8 sequence. + + +File: groff.info, Node: Formatter Instructions, Next: Registers, Prev: Identifiers, Up: GNU troff Reference + +5.6 Formatter Instructions +========================== + +To support documents that require more than filling, automatic line +breaking and hyphenation, adjustment, and supplemental inter-sentence +space, the 'roff' language offers two means of embedding instructions to +the formatter. + + One is a "request", which begins with a control character and takes +up the remainder of the input line. Requests often perform relatively +large-scale operations such as setting the page length, breaking the +line, or starting a new page. They also conduct internal operations +like defining macros. + + The other is an "escape sequence", which begins with the escape +character and can be embedded anywhere in the input, even in arguments +to requests and other escape sequences. Escape sequences interpolate +special characters, strings, or registers, and handle comparatively +minor formatting tasks like sub- and superscripting. + + Some operations, such as font selection and type size alteration, are +available via both requests and escape sequences. + +* Menu: + +* Control Characters:: +* Invoking Requests:: +* Calling Macros:: +* Using Escape Sequences:: +* Delimiters:: + + +File: groff.info, Node: Control Characters, Next: Invoking Requests, Prev: Formatter Instructions, Up: Formatter Instructions + +5.6.1 Control Characters +------------------------ + +The mechanism of using 'roff''s control characters to invoke requests +and call macros was introduced in *note Requests and Macros::. Control +characters are recognized only at the beginning of an input line, or at +the beginning of the branch of a control structure request; see *note +Conditionals and Loops::. + + A few requests cause a break implicitly; use the no-break control +character to prevent the break. Break suppression is its sole +behavioral distinction. Employing the no-break control character to +invoke requests that don't cause breaks is harmless but poor style. +*Note Manipulating Filling and Adjustment::. + + The control '.' and no-break control ''' characters can each be +changed to any ordinary character(1) (*note Control +Characters-Footnote-1::) with the 'cc' and 'c2' requests, respectively. + + -- Request: .cc [o] + Recognize the ordinary character O as the control character. If O + is absent or invalid, the default control character '.' is + selected. The identity of the control character is associated with + the environment (*note Environments::). + + -- Request: .c2 [o] + Recognize the ordinary character O as the no-break control + character. If O is absent or invalid, the default no-break control + character ''' is selected. The identity of the no-break control + character is associated with the environment (*note + Environments::). + + When writing a macro, you might wish to know which control character +was used to call it. + + -- Register: \n[.br] + This read-only register interpolates 1 if the currently executing + macro was called using the normal control character and 0 + otherwise. If a macro is interpolated as a string, the '.br' + register's value is inherited from the context of the string + interpolation. *Note Strings::. + + Use this register to reliably intercept requests that imply breaks. + + .als bp*orig bp + .de bp + . ie \\n[.br] .bp*orig + . el 'bp*orig + .. + + Testing the '.br' register outside of a macro definition makes no + sense. + + +File: groff.info, Node: Control Characters-Footnotes, Up: Control Characters + + (1) Recall *note Identifiers::. + + +File: groff.info, Node: Invoking Requests, Next: Calling Macros, Prev: Control Characters, Up: Formatter Instructions + +5.6.2 Invoking Requests +----------------------- + +A control character is optionally followed by tabs and/or spaces and +then an identifier naming a request or macro. The invocation of an +unrecognized request is interpreted as a macro call. Defining a macro +with the same name as a request replaces the request. Deleting a +request name with the 'rm' request makes it unavailable. The 'als' +request can alias requests, permitting them to be wrapped or +non-destructively replaced. *Note Strings::. + + There is no inherent limit on argument length or quantity. Most +requests take one or more arguments, and ignore any they do not expect. +A request may be separated from its arguments by tabs or spaces, but +only spaces can separate an argument from its successor. Only one +between arguments is necessary; any excess is ignored. GNU 'troff' does +not allow tabs for argument separation.(1) (*note Invoking +Requests-Footnote-1::) + + Generally, a space _within_ a request argument is not relevant, not +meaningful, or is supported by bespoke provisions, as with the 'tl' +request's delimiters (*note Page Layout::). Some requests, like 'ds', +interpret the remainder of the control line as a single argument. *Note +Strings::. + + Spaces and tabs immediately after a control character are ignored. +Commonly, authors structure the source of documents or macro files with +them. + + .de center + . if \\n[.br] \ + . br + . ce \\$1 + .. + . + . + .de right-align + .->if \\n[.br] \ + .->->br + .->rj \\$1 + .. + + If you assign an empty blank line trap, you can separate macro +definitions (or any input lines) with blank lines. + + .de do-nothing + .. + .blm do-nothing \" activate blank line trap + + .de center + . if \\n[.br] \ + . br + . ce \\$1 + .. + + + .de right-align + .->if \\n[.br] \ + .->->br + .->rj \\$1 + .. + + .blm \" deactivate blank line trap + + *Note Blank Line Traps::. + + +File: groff.info, Node: Invoking Requests-Footnotes, Up: Invoking Requests + + (1) In compatibility mode, a space is not necessary after a request +or macro name of two characters' length. Also, Plan 9 'troff' allows +tabs to separate arguments. + + +File: groff.info, Node: Calling Macros, Next: Using Escape Sequences, Prev: Invoking Requests, Up: Formatter Instructions + +5.6.3 Calling Macros +-------------------- + +If a macro of the desired name does not exist when called, it is +created, assigned an empty definition, and a warning in category 'mac' +is emitted. Calling an undefined macro _does_ end a macro definition +naming it as its end macro (*note Writing Macros::). + + To embed spaces _within_ a macro argument, enclose the argument in +neutral double quotes '"'. Horizontal motion escape sequences are +sometimes a better choice for arguments to be formatted as text. + + Consider calls to a hypothetical section heading macro 'uh'. + + .uh The Mouse Problem + .uh "The Mouse Problem" + .uh The\~Mouse\~Problem + .uh The\ Mouse\ Problem + +The first line calls 'uh' with three arguments: 'The', 'Mouse', and +'Problem'. The remainder call the 'uh' macro with one argument, 'The +Mouse Problem'. The last solution, using escaped spaces, can be found +in documents prepared for AT&T 'troff'. It can cause surprise when text +is adjusted, because '\' inserts a _fixed-width_, non-breaking +space. GNU 'troff''s '\~' escape sequence inserts an adjustable, +non-breaking space.(1) (*note Calling Macros-Footnote-1::) + + The foregoing raises the question of how to embed neutral double +quotes or backslashes in macro arguments when _those_ characters are +desired as literals. In GNU 'troff', the special character escape +sequence '\[rs]' produces a backslash and '\[dq]' a neutral double +quote. + + In GNU 'troff''s AT&T compatibility mode, these characters remain +available as '\(rs' and '\(dq', respectively. AT&T 'troff' did not +consistently define these special characters, but its descendants can be +made to support them. *Note Device and Font Description Files::. + + If even that is not feasible, options remain. To obtain a literal +escape character in a macro argument, you can simply type it if you +change or disable the escape character first. *Note Using Escape +Sequences::. Otherwise, you must escape the escape character repeatedly +to a context-dependent extent. *Note Copy Mode::. + + For the (neutral) double quote, you have recourse to an obscure +syntactical feature of AT&T 'troff'. Because a double quote can begin a +macro argument, the formatter keeps track of whether the current +argument was started thus, and doesn't require a space after the double +quote that ends it.(2) (*note Calling Macros-Footnote-2::) In the +argument list to a macro, a double quote that _isn't_ preceded by a +space _doesn't_ start a macro argument. If not preceded by a double +quote that began an argument, this double quote becomes part of the +argument. Furthermore, within a quoted argument, a pair of adjacent +double quotes becomes a literal double quote. + + .de eq + . tm arg1:\\$1 arg2:\\$2 arg3:\\$3 + . tm arg4:\\$4 arg5:\\$5 arg6:\\$6 + .. \" 4 backslashes on the next line + .eq a" "b c" "de"f\\\\g" h""i "j""k" + error-> arg1:a" arg2:b c arg3:de + error-> arg4:f\g" arg5:h""i arg6:j"k + + Apart from the complexity of the rules, this traditional solution has +the disadvantage that double quotes don't survive repeated argument +expansion in AT&T 'troff' or GNU 'troff''s compatibility mode. This can +frustrate efforts to pass such arguments intact through multiple macro +calls. + + .cp 1 + .de eq + . tm arg1:\\$1 arg2:\\$2 arg3:\\$3 + . tm arg4:\\$4 arg5:\\$5 arg6:\\$6 + .. + .de xe + . eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 + .. \" 8 backslashes on the next line + .xe a" "b c" "de"f\\\\\\\\g" h""i "j""k" + error-> arg1:a" arg2:b arg3:c + error-> arg4:de arg5:f\g" arg6:h""i + + Outside of compatibility mode, GNU 'troff' doesn't exhibit this +problem because it tracks the nesting depth of interpolations. *Note +Implementation Differences::. + + +File: groff.info, Node: Calling Macros-Footnotes, Up: Calling Macros + + (1) '\~' is fairly portable; see *note Other Differences::. + + (2) Strictly, you can neglect to close the last quoted macro +argument, relying on the end of the control line to do so. We consider +this lethargic practice poor style. + + +File: groff.info, Node: Using Escape Sequences, Next: Delimiters, Prev: Calling Macros, Up: Formatter Instructions + +5.6.4 Using Escape Sequences +---------------------------- + +Whereas requests must occur on control lines, escape sequences can occur +intermixed with text and may appear in arguments to requests, macros, +and other escape sequences. An escape sequence is introduced by the +escape character, a backslash '\' (but see the 'ec' request below). The +next character selects the escape's function. + + Escape sequences vary in length. Some take an argument, and of +those, some have different syntactical forms for a one-character, +two-character, or arbitrary-length argument. Others accept _only_ an +arbitrary-length argument. In the former scheme, a one-character +argument follows the function character immediately, an opening +parenthesis '(' introduces a two-character argument (no closing +parenthesis is used), and an argument of arbitrary length is enclosed in +brackets '[]'. In the latter scheme, the user selects a delimiter +character. A few escape sequences are idiosyncratic, and support both +of the foregoing conventions ('\s'), designate their own termination +sequence ('\?'), consume input until the next newline ('\!', '\"', +'\#'), or support an additional modifier character ('\s' again, and +'\n'). As with requests, use of some escape sequences in source +documents may interact poorly with a macro package you use; consult its +documentation to learn of "safe" sequences or alternative facilities it +provides to achieve the desired result. + + If an escape character is followed by a character that does not +identify a defined operation, the escape character is ignored (producing +a diagnostic of the 'escape' warning category, which is not enabled by +default) and the following character is processed normally. + + $ groff -Tps -ww + .nr N 12 + .ds co white + .ds animal elephant + I have \fI\nN \*(co \*[animal]s,\f[] + said \P.\&\~Pseudo Pachyderm. + error-> warning: escape character ignored before 'P' + => I have 12 white elephants, said P. Pseudo Pachyderm. + + Escape sequence interpolation is of higher precedence than escape +sequence argument interpretation. This rule affords flexibility in +using escape sequences to construct parameters to other escape +sequences. + + .ds family C\" Courier + .ds style I\" oblique + Choice a typeface \f(\*[family]\*[style]wisely. + => Choose a typeface wisely. + +In the above, the syntax form '\f(' accepts only two characters for an +argument; the example works because the subsequent escape sequences are +interpolated before the selection escape sequence argument is processed, +and strings 'family' and 'style' interpolate one character each.(1) +(*note Using Escape Sequences-Footnote-1::) + + The escape character is nearly always interpreted when encountered; +it is therefore desirable to have a way to interpolate it, disable it, +or change it. + + -- Escape sequence: \e + Interpolate the escape character. + + The '\[rs]' special character escape sequence formats a backslash +glyph. In macro and string definitions, the input sequences '\\' and +'\E' defer interpretation of escape sequences. *Note Copy Mode::. + + -- Request: .eo + Disable the escape mechanism except in copy mode. Once this + request is invoked, no input character is recognized as starting an + escape sequence in interpretation mode. + + -- Request: .ec [o] + Recognize the ordinary character O as the escape character. If O + is absent or invalid, the default escape character '\' is selected. + + Switching escape sequence interpretation off to define a macro and +back on afterward can obviate the need to double the escape character +within the definition. *Note Writing Macros::. This technique is not +available if your macro needs to interpolate values at the time it is +_defined_--but many do not. + + .\" simplified `BR` macro from the man(7) macro package + .eo + .de BR + . ds result \& + . while (\n[.$] >= 2) \{\ + . as result \fB\$1\fR\$2\" + . shift 2 + . \} + . if \n[.$] .as result \fB\$1\" + \*[result] + . rm result + . ft R + .. + .ec + + -- Request: .ecs + -- Request: .ecr + The 'ecs' request stores the escape character for recall with + 'ecr'. 'ecr' sets the escape character to '\' if none has been + saved. + + Use these requests together to temporarily change the escape + character. + + Using a different escape character, or disabling it, when calling +macros not under your control will likely cause errors, since GNU +'troff' has no mechanism to "intern" macros--that is, to convert a macro +definition into a form independent of its representation.(2) (*note +Using Escape Sequences-Footnote-2::) When a macro is called, its +contents are interpreted literally. + + +File: groff.info, Node: Using Escape Sequences-Footnotes, Up: Using Escape Sequences + + (1) The omission of spaces before the comment escape sequences is +necessary; see *note Strings::. + + (2) TeX does have such a mechanism. + + +File: groff.info, Node: Delimiters, Prev: Using Escape Sequences, Up: Formatter Instructions + +5.6.5 Delimiters +---------------- + +Some escape sequences that require parameters use delimiters. The +neutral apostrophe ''' is a popular choice and shown in this document. +The neutral double quote '"' is also commonly seen. Letters, numerals, +and leaders can be used. Punctuation characters are likely better +choices, except for those defined as infix operators in numeric +expressions; see below. + + \l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs + + The following escape sequences don't take arguments and thus are +allowed as delimiters: '\', '\%', '\|', '\^', '\{', '\}', '\'', +'\`', '\-', '\_', '\!', '\?', '\)', '\/', '\,', '\&', '\:', '\~', '\0', +'\a', '\c', '\d', '\e', '\E', '\p', '\r', '\t', and '\u'. However, +using them this way is discouraged; they can make the input confusing to +read. + + A few escape sequences, '\A', '\b', '\o', '\w', '\X', and '\Z', +accept a newline as a delimiter. Newlines that serve as delimiters +continue to be recognized as input line terminators. + + A caf\o + e\(aa + in Paris + => A café in Paris + +Use of newlines as delimiters in escape sequences is also discouraged. + + Finally, the escape sequences '\D', '\h', '\H', '\l', '\L', '\N', +'\R', '\s', '\S', '\v', and '\x' prohibit many delimiters. + + * the numerals '0'-'9' and the decimal point '.' + + * the (single-character) operators '+-/*%<>=&:()' + + * the space and tab characters + + * any escape sequences other than '\%', '\:', '\{', '\}', '\'', '\`', + '\-', '\_', '\!', '\/', '\c', '\e', and '\p' + + Delimiter syntax is complex and flexible primarily for historical +reasons; the foregoing restrictions need be kept in mind mainly when +using 'groff' in AT&T compatibility mode. GNU 'troff' keeps track of +the nesting depth of escape sequence interpolations, so the only +characters you need to avoid using as delimiters are those that appear +in the arguments you input, not any that result from interpolation. +Typically, ''' works fine. *Note Implementation Differences::. + + $ groff -Tps + .de Mw + . nr wd \w'\\$1' + . tm "\\$1" is \\n(wd units wide. + .. + .Mw Wet'suwet'en + .Mw Wet+200i + .cp 1 \" turn on compatibility mode + .Mw Wet'suwet'en + .Mw Wet' + .Mw Wet+200i + error-> "Wet'suwet'en" is 54740 units wide. + error-> "Wet'+200i" is 42610 units wide. + error-> "Wet'suwet'en" is 15860 units wide. + error-> "Wet'" is 15860 units wide. + error-> "Wet'+200i" is 14415860 units wide. + + We see here that in compatibility mode, the part of the argument +after the ''' delimiter escapes from its context and, if nefariously +crafted, influences the computation of the WD register's value in a +surprising way. + + +File: groff.info, Node: Comments, Next: Registers, Prev: Formatter Instructions, Up: GNU troff Reference + +5.7 Comments +============ + +One of the most common forms of escape sequence is the comment.(1) +(*note Comments-Footnote-1::) + + -- Escape sequence: \" + Start a comment. Everything up to the next newline is ignored. + + This may sound simple, but it can be tricky to keep the comments + from interfering with the appearance of the output. If the escape + sequence is to the right of some text or a request, that portion of + the line is ignored, but spaces preceding it are processed normally + by GNU 'troff'. This affects only the 'ds' and 'as' requests and + their variants. + + One possibly irritating idiosyncrasy is that tabs should not be + used to vertically align comments in the source document. Tab + characters are not treated as separators between a request name and + its first argument, nor between arguments. + + A comment on a line by itself is treated as a blank line, because + after eliminating the comment, that is all that remains. + + Test + \" comment + Test + => Test + => + => Test + + To avoid this, it is common to combine the empty request with the + comment escape sequence as '.\"', causing the input line to be + ignored. + + Another commenting scheme sometimes seen is three consecutive + single quotes (''''') at the beginning of a line. This works, but + GNU 'troff' emits a warning diagnostic (if enabled) about an + undefined macro (namely ''''). + + -- Escape sequence: \# + Start a comment; everything up to and including the next newline is + ignored. This 'groff' extension was introduced to avoid the + problems described above. + + Test + \# comment + Test + => Test Test + + -- Request: .ig [end] + Ignore input until, in the current conditional block (if any),(2) + (*note Comments-Footnote-2::) the macro END is called at the start + of a control line, or the control line '..' is encountered if END + is not specified. 'ig' is parsed as if it were a macro definition, + but its contents are discarded, not stored.(3) (*note + Comments-Footnote-3::) + + hand\c + .de TX + fasting + .. + .ig TX + This is part of a large block of input that has been + temporarily(?) commented out. + We can restore it simply by removing the .ig request and + the call of its end macro. + .TX + => handfasting + + +File: groff.info, Node: Comments-Footnotes, Up: Comments + + (1) This claim may be more aspirational than descriptive. + + (2) *Note Conditional Blocks::. + + (3) Exception: auto-incrementing registers defined outside the +ignored region _will_ be modified if interpolated with '\n±' inside it. +*Note Auto-increment::. + + +File: groff.info, Node: Registers, Next: Manipulating Filling and Adjustment, Prev: Formatter Instructions, Up: GNU troff Reference + +5.8 Registers +============= + +In the 'roff' language, numbers can be stored in "registers". Many +built-in registers exist, supplying anything from the date to details of +formatting parameters. You can also define your own. *Note +Identifiers::, for information on constructing a valid name for a +register. + +* Menu: + +* Setting Registers:: +* Interpolating Registers:: +* Auto-increment:: +* Assigning Register Formats:: +* Built-in Registers:: + + +File: groff.info, Node: Setting Registers, Next: Interpolating Registers, Prev: Registers, Up: Registers + +5.8.1 Setting Registers +----------------------- + +Define registers and update their values with the 'nr' request or the +'\R' escape sequence. + + -- Request: .nr ident value + -- Escape sequence: \R'ident value' + Set register IDENT to VALUE. If IDENT doesn't exist, GNU 'troff' + creates it. In the '\R' escape sequence, the delimiter need not be + a neutral apostrophe; see *note Delimiters::. It also does not + produce an input token in GNU 'troff'. *Note Gtroff Internals::. + + .nr a (((17 + (3 * 4))) % 4) + \n[a] + .\R'a (((17 + (3 * 4))) % 4)' + \n[a] + => 1 1 + + (Later, we will discuss additional forms of 'nr' and '\R' that can + change a register's value after it is dereferenced but before it is + interpolated. *Note Auto-increment::.) + + The complete transparency of '\R' can cause surprising effects if + you use registers like '.k', which get evaluated at the time they + are accessed. + + .ll 1.6i + . + aaa bbb ccc ddd eee fff ggg hhh\R':k \n[.k]' + .tm :k == \n[:k] + => :k == 126950 + . + .br + . + aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]' + .tm :k == \n[:k] + => :k == 15000 + + If you process this with the PostScript device ('-Tps'), there will + be a line break eventually after 'ggg' in both input lines. + However, after processing the space after 'ggg', the partially + collected line is not overfull yet, so GNU 'troff' continues to + collect input until it sees the space (or in this case, the + newline) after 'hhh'. At this point, the line is longer than the + line length, and the line gets broken. + + In the first input line, since the '\R' escape sequence leaves no + traces, the check for the overfull line hasn't been done yet at the + point where '\R' gets handled, and you get a value for the '.k' + register that is even greater than the current line length. + + In the second input line, the insertion of '\h'0'' to cause a + zero-width motion forces GNU 'troff' to check the line length, + which in turn causes the start of a new output line. Now '.k' + returns the expected value. + + 'nr' and '\R' each have two additional special forms to increment or +decrement a register. + + -- Request: .nr ident +value + -- Request: .nr ident -value + -- Escape sequence: \R'ident +value' + -- Escape sequence: \R'ident -value' + Increment (decrement) register IDENT by VALUE. In the '\R' escape + sequence, the delimiter need not be a neutral apostrophe; see *note + Delimiters::. + + .nr a 1 + .nr a +1 + \na + => 2 + + A leading minus sign in VALUE is always interpreted as a + decrementation operator, not an algebraic sign. To assign a + register a negative value or the negated value of another register, + you can force GNU 'troff' to interpret '-' as a negation or minus, + rather than decrementation, operator: enclose it with its operand + in parentheses or subtract it from zero. + + .nr a 7 + .nr b 3 + .nr a -\nb + \na + => 4 + .nr a (-\nb) + \na + => -3 + .nr a 0-\nb + \na + => -3 + + If a register's prior value does not exist (the register was + undefined), an increment or decrement is applied as if to 0. + + -- Request: .rr ident + Remove register IDENT. If IDENT doesn't exist, the request is + ignored. Technically, only the name is removed; the register's + contents are still accessible under aliases created with 'aln', if + any. + + -- Request: .rnn ident1 ident2 + Rename register IDENT1 to IDENT2. If IDENT1 doesn't exist, the + request is ignored. Renaming a built-in register does not + otherwise alter its properties. + + -- Request: .aln new old + Create an alias NEW for an existing register OLD, causing the names + to refer to the same stored object. If OLD is undefined, a warning + in category 'reg' is produced and the request is ignored. *Note + Warnings::, for information about the enablement and suppression of + warnings. + + To remove a register alias, invoke 'rr' on its name. A register's + contents do not become inaccessible until it has no more names. + + +File: groff.info, Node: Interpolating Registers, Next: Auto-increment, Prev: Setting Registers, Up: Registers + +5.8.2 Interpolating Registers +----------------------------- + +Register contents are interpolated with the '\n' escape sequence. + + -- Escape sequence: \ni + -- Escape sequence: \n(id + -- Escape sequence: \n[ident] + Interpolate register with name IDENT (one-character name I, + two-character name ID). '\n' is interpreted even in copy mode + (*note Copy Mode::). If the register is undefined, it is created + and assigned a value of '0', that value is interpolated, and a + warning in category 'reg' is emitted. *Note Warnings::, for + information about the enablement and suppression of warnings. + + .nr a 5 + .nr as \na+\na + \n(as + => 10 + + .nr a1 5 + .nr ab 6 + .ds str b + .ds num 1 + \n[a\n[num]] + => 5 + \n[a\*[str]] + => 6 + + +File: groff.info, Node: Auto-increment, Next: Assigning Register Formats, Prev: Interpolating Registers, Up: Registers + +5.8.3 Auto-increment +-------------------- + +Registers can also be incremented or decremented by a configured amount +at the time they are interpolated. The value of the increment is +specified with a third argument to the 'nr' request, and a special +interpolation syntax is used to alter and then retrieve the register's +value. Together, these features are called "auto-increment".(1) (*note +Auto-increment-Footnote-1::) + + -- Request: .nr ident value incr + Set register IDENT to VALUE and its auto-incrementation amount to + to INCR. The '\R' escape sequence doesn't support an INCR + argument. + + Auto-incrementation is not _completely_ automatic; the '\n' escape +sequence in its basic form never alters the value of a register. To +apply auto-incrementation to a register, interpolate it with '\n±'. + + -- Escape sequence: \n+i + -- Escape sequence: \n-i + -- Escape sequence: \n+(id + -- Escape sequence: \n-(id + -- Escape sequence: \n+[ident] + -- Escape sequence: \n-[ident] + Increment or decrement IDENT (one-character name I, two-character + name ID) by the register's auto-incrementation value and then + interpolate the new register value. If IDENT has no + auto-incrementation value, interpolate as with '\n'. + + .nr a 0 1 + .nr xx 0 5 + .nr foo 0 -2 + \n+a, \n+a, \n+a, \n+a, \n+a + .br + \n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx + .br + \n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo] + => 1, 2, 3, 4, 5 + => -5, -10, -15, -20, -25 + => -2, -4, -6, -8, -10 + + To change the increment value without changing the value of a +register, assign the register's value to itself by interpolating it, and +specify the desired increment normally. Apply an increment of '0' to +disable auto-incrementation of the register. + + +File: groff.info, Node: Auto-increment-Footnotes, Up: Auto-increment + + (1) A negative auto-increment can be considered an "auto-decrement". + + +File: groff.info, Node: Assigning Register Formats, Next: Built-in Registers, Prev: Auto-increment, Up: Registers + +5.8.4 Assigning Register Formats +-------------------------------- + +A writable register's value can be interpolated in several number +formats. By default, conventional Arabic numerals are used. Other +formats see use in sectioning and outlining schemes and alternative page +numbering arrangements. + + -- Request: .af reg fmt + Use number format FMT when interpolating register REG. Valid + number formats are as follows. + + '0...' + Arabic numerals 0, 1, 2, and so on. Any decimal digit is + equivalent to '0'; the formatter merely counts the digits + specified. Multiple Arabic numerals in FMT cause + interpolations to be zero-padded on the left if necessary to + at least as many digits as specified (interpolations never + truncate a register value). A register with format '00' + interpolates values 1, 2, 3 as '01', '02', '03'. The default + format for all writable registers is '0'. + + 'I' + Uppercase Roman numerals: 0, I, II, III, IV, ... + + 'i' + Lowercase Roman numerals: 0, i, ii, iii, iv, ... + + 'A' + Uppercase letters: 0, A, B, C, ..., Z, AA, AB, ... + + 'a' + Lowercase letters: 0, a, b, c, ..., z, aa, ab, ... + + Omitting FMT causes a warning in category 'missing'. *Note + Warnings::, for information about the enablement and suppression of + warnings. Specifying an unrecognized format is an error. + + Zero values are interpolated as '0' in non-Arabic formats. + Negative quantities are prefixed with '-' irrespective of format. + In Arabic formats, the sign supplements the field width. If REG + doesn't exist, it is created with a zero value. + + .nr a 10 + .af a 0 \" the default format + \na, + .af a I + \na, + .af a 321 + .nr a (-\na) + \na, + .af a a + \na + => 10, X, -010, -j + + The representable extrema in the 'i' and 'I' formats correspond to + Arabic ±39,999. GNU 'troff' uses 'w' and 'z' to represent 5,000 + and 10,000 in Roman numerals, respectively, following the + convention of AT&T 'troff'--currently, the correct glyphs for Roman + numerals five thousand ('U+2181') and ten thousand ('U+2182') are + not used. + + Assigning the format of a read-only register is an error. Instead, + copy the read-only register's value to, and assign the format of, a + writable register. + + -- Escape sequence: \gr + -- Escape sequence: \g(rg + -- Escape sequence: \g[reg] + Interpolate the format of the register REG (one-character name R, + two-character name RG). Zeroes represent Arabic formats. If REG + is not defined, REG is not created and nothing is interpolated. + '\g' is interpreted even in copy mode (*note Copy Mode::). + + GNU 'troff' interprets only Arabic numerals. The Roman numeral or +alphabetic formats cannot be used as operands to arithmetic operators in +expressions (*note Numeric Expressions::). For instance, it may be +desirable to test the page number independently of its format. + + .af % i \" front matter + .de header-trap + . \" To test the page number, we need it in Arabic. + . ds saved-page-number-format \\g%\" + . af % 0 + . nr page-number-in-decimal \\n% + . af % \\*[saved-page-number-format] + . ie \\n[page-number-in-decimal]=1 .do-first-page-stuff + . el \{\ + . ie o .do-odd-numbered-page-stuff + . el .do-even-numbered-page-stuff + . \} + . rm saved-page-number-format + .. + .wh 0 header-trap + + +File: groff.info, Node: Built-in Registers, Prev: Assigning Register Formats, Up: Registers + +5.8.5 Built-in Registers +------------------------ + +Predefined registers whose identifiers start with a dot are read-only. +Many are Boolean-valued, interpolating a true or false value testable +with the 'if', 'ie', or 'while' requests. Some read-only registers are +string-valued, meaning that they interpolate text. + + *Caution:* Built-in registers are subject to removal like others; +once removed, they can be recreated only as normal writable registers +and will not reflect formatter state. + + A register name (without the dot) is often associated with a request +of the same name. A complete listing of all built-in registers can be +found in *note Register Index::. + + We present here a few built-in registers that are not described +elsewhere in this manual; they have to do with invariant properties of +GNU 'troff', or obtain information about the formatter's command-line +options, processing progress, or the operating environment. + +'\n[.A]' + Approximate output is being formatted (Boolean-valued); see 'groff' + '-a' option (*note Groff Options::). + +'\n[.c]' +'\n[c.]' + Input line number. 'c.' is a writable synonym, affecting + subsequent interpolations of both '.c' and 'c.'. + +'\n[.F]' + Name of input file (string-valued). + +'\n[.g]' + Always true in GNU 'troff' (Boolean-valued). Documents can use + this to ask the formatter if it claims 'groff' compatibility. + +'\n[.P]' + Output page selection status (Boolean-valued); see 'groff' '-o' + option (*note Groff Options::). + +'\n[.R]' + Count of available unused registers; always 10,000 in GNU + 'troff'.(1) (*note Built-in Registers-Footnote-1::) + +'\n[.T]' + Indicator of output device selection (Boolean-valued); see 'groff' + '-T' option (*note Groff Options::). + +'\n[.U]' + Unsafe mode enablement status (Boolean-valued); see 'groff' '-U' + option (*note Groff Options::). + +'\n[.x]' + Major version number of the running GNU 'troff' formatter. For + example, if the version number is 1.23.0, then '.x' contains '1'. + +'\n[.y]' + Minor version number of the running GNU 'troff' formatter. For + example, if the version number is 1.23.0, then '.y' contains '23'. + +'\n[.Y]' + Revision number of the running GNU 'troff' formatter. For example, + if the version number is 1.23.0, then '.Y' contains '0'. + +'\n[$$]' + Process identifier (PID) of the GNU 'troff' program in its + operating environment. + + Date- and time-related registers are set per the local time as +determined by 'localtime(3)' when the formatter launches. This +initialization can be overridden by 'SOURCE_DATE_EPOCH' and 'TZ'; see +*note Environment::. + +'\n[seconds]' + Count of seconds elapsed in the minute (0-60). + +'\n[minutes]' + Count of minutes elapsed in the hour (0-59). + +'\n[hours]' + Count of hours elapsed since midnight (0-23). + +'\n[dw]' + Day of the week (1-7; 1 is Sunday). + +'\n[dy]' + Day of the month (1-31). + +'\n[mo]' + Month of the year (1-12). + +'\n[year]' + Gregorian year. + +'\n[yr]' + Gregorian year minus 1900. This register is incorrectly documented + in the AT&T 'troff' manual as storing the last two digits of the + current year. That claim stopped being true in 2000. Old 'troff' + input that looks like: + + '\" The year number is a surprise after 1999. + This document was formatted in 19\n(yr. + + can be corrected to: + + This document was formatted in \n[year]. + + or, for portability across many 'roff' programs, to the following. + + .nr y4 1900+\n(yr + This document was formatted in \n(y4. + + +File: groff.info, Node: Built-in Registers-Footnotes, Up: Built-in Registers + + (1) GNU 'troff' dynamically allocates memory for as many registers as +required. + + +File: groff.info, Node: Manipulating Filling and Adjustment, Next: Manipulating Hyphenation, Prev: Registers, Up: GNU troff Reference + +5.9 Manipulating Filling and Adjustment +======================================= + +When an output line is pending (see below), a break moves the drawing +position to the beginning of the next text baseline, interrupting +filling. Various ways of causing breaks were shown in *note Breaking::. +The 'br' request likewise causes a break. Several other requests imply +breaks: 'bp', 'ce', 'cf', 'fi', 'fl', 'in', 'nf', 'rj', 'sp', 'ti', and +'trf'. If the no-break control character is used with any of these +requests, GNU 'troff' suppresses the break; instead the requested +operation takes effect at the next break. ''br' does nothing. + + .ll 55n + This line is normally filled and adjusted. + .br + A line's alignment is decided + 'ce \" Center the next input line (no break). + when it is output. + This line returns to normal filling and adjustment. + => This line is normally filled and adjusted. + => A line's alignment is decided when it is output. + => This line returns to normal filling and adjustment. + +Output line properties like page offset, indentation, adjustment, and +even the location of its text baseline, are not determined until the +line has been broken. An output line is said to be "pending" if some +input has been collected but an output line corresponding to it has not +yet been written; such an output line is also termed "partially +collected". If no output line is pending, it is as if a break has +already happened; additional breaks, whether explicit or implicit, have +no effect. If the vertical drawing position is negative--as it is when +the formatter starts up--a break starts a new page (even if no output +line is pending) unless an end-of-input macro is being interpreted. +*Note End-of-input Traps::. + + -- Request: .br + Break the line: emit any pending output line without adjustment. + + foo bar + .br + baz + 'br + qux + => foo bar + => baz qux + + Sometimes you want to prevent a break within a phrase or between a +quantity and its units. + + -- Escape sequence: \~ + Insert an unbreakable space that is adjustable like an ordinary + space. It is discarded from the end of an output line if a break + is forced. + + Set the output speed to\~1. + There are 1,024\~bytes in 1\~KiB. + J.\~F.\~Ossanna wrote the original CSTR\~#54. + + By default, GNU 'troff' fills text and adjusts it to reach the output +line length. The 'nf' request disables filling; the 'fi' request +reënables it. + + -- Request: .fi + -- Register: \n[.u] + Enable filling of output lines; a pending output line is broken. + The read-only register '.u' is set to 1. The filling enablement + status, sometimes called "fill mode", is associated with the + environment (*note Environments::). *Note Line Continuation::, for + interaction with the '\c' escape sequence. + + -- Request: .nf + Disable filling of output lines: the output line length (*note Line + Layout::) is ignored and output lines are broken where the input + lines are. A pending output line is broken and adjustment is + suppressed. The read-only register '.u' is set to 0. The filling + enablement status is associated with the environment (*note + Environments::). See *note Line Continuation::, for interaction + with the '\c' escape sequence. + + -- Request: .ad [mode] + -- Register: \n[.j] + Enable output line adjustment in MODE, taking effect when the + pending (or next) output line is broken. Adjustment is suppressed + when filling is. MODE can have one of the following values. + + 'b' + 'n' + Adjust "normally": if the output line does not consume the + distance between the indentation and the configured output + line length, GNU 'troff' stretches adjustable spaces within + the line until that length is reached. When the indentation + is zero, this mode spreads the line to both the left and right + margins. This is the GNU 'troff' default. + + 'c' + Center filled text. Contrast with the 'ce' request, which + centers text _without_ filling it. + + 'l' + Align text to the left without adjusting it. + + 'r' + Align text to the right without adjusting it. + + MODE can also be a value previously stored in the '.j' register. + Using 'ad' without an argument is the same as '.ad \n[.j]'; unless + filling is disabled, GNU 'troff' resumes adjusting lines in the + same way it did before adjustment was disabled by invocation of the + 'na' request. + + The adjustment mode and enablement status are encoded in the + read-only register '.j'. These parameters are associated with the + environment (*note Environments::). + + The value of '.j' for any adjustment mode is an implementation + detail and should not be relied upon as a programmer's interface. + Do not write logic to interpret or perform arithmetic on it. + + .ll 48n + .de AD + . br + . ad \\$1 + .. + .de NA + . br + . na + .. + left + .AD r + .nr ad \n(.j + right + .AD c + center + .NA + left + .AD + center + .AD \n(ad + right + => left + => right + => center + => left + => center + => right + + -- Request: .na + Disable output line adjustment. This produces the same output as + left-alignment, but the value of the adjustment mode register '.j' + is altered differently. The adjustment mode and enablement status + are associated with the environment (*note Environments::). + + -- Request: .brp + -- Escape sequence: \p + Break, adjusting the line per the current adjustment mode. '\p' + schedules a break with adjustment at the next word boundary. The + escape sequence is itself neither a break nor a space of any kind; + it can thus be placed in the middle of a word to cause a break at + the end of that word. + + Breaking with immediate adjustment can produce ugly results since + GNU 'troff' doesn't have a sophisticated paragraph-building + algorithm, as TeX has, for example. Instead, GNU 'troff' fills and + adjusts a paragraph line by line. + + .ll 4.5i + This is an uninteresting sentence. + This is an uninteresting sentence.\p + This is an uninteresting sentence. + + is formatted as follows. + + This is an uninteresting sentence. This is + an uninteresting sentence. + This is an uninteresting sentence. + + To clearly present the next couple of requests, we must introduce the +concept of "productive" input lines. A "productive input line" is one +that directly produces formatted output. Text lines produce output,(1) +(*note Manipulating Filling and Adjustment-Footnote-1::) as do control +lines containing requests like 'tl' or escape sequences like '\D'. +Macro calls are not _directly_ productive, and thus not counted, but +their interpolated contents can be. Empty requests, and requests and +escape sequences that define registers or strings or alter the +formatting environment (as with changes to the size, face, height, +slant, or color of the type) are not productive. We will also preview +the output line continuation escape sequence, '\c', which "connects" two +input lines that would otherwise be counted separately. (2) (*note +Manipulating Filling and Adjustment-Footnote-2::) + + .de hello + Hello, world! + .. + .ce \" center output of next productive input line + . + .nr junk-reg 1 + .ft I + Chorus: \c + .ft + .hello + Went the day well? + => Chorus: Hello, world! + => Went the day well? + + -- Request: .ce [n] + -- Register: \n[.ce] + Break (unless the no-break control character is used), center the + output of the next N productive input lines with respect to the + line length and indentation without filling, then break again + regardless of the invoking control character. If the argument is + not positive, centering is disabled. Omitting the argument implies + an N of '1'. The count of lines remaining to be centered is stored + in the read-only register '.ce' and is associated with the + environment (*note Environments::). + + While the '.ad c' request also centers text, it fills the text as + well. + + .de FR + This is a small text fragment that shows the differences + between the `.ce' and the `.ad c' requests. + .. + .ll 4i + .ce 1000 + .FR + .ce 0 + + .ad c + .FR + => This is a small text fragment that shows + => the differences + => between the `.ce' and the `.ad c' requests. + => + => This is a small text fragment that shows + => the differences between the `.ce' and + => the `.ad c' requests. + + The previous example illustrates a common idiom of turning + centering on for a quantity of lines far in excess of what is + required, and off again after the text to be centered. This + technique relieves humans of counting lines for requests that take + a count of input lines as an argument. + + -- Request: .rj [n] + -- Register: \n[.rj] + Break (unless the no-break control character is used), align the + output of the next N productive input lines to the right margin + without filling, then break again regardless of the control + character. If the argument is not positive, right-alignment is + disabled. Omitting the argument implies an N of '1'. The count of + lines remaining to be right-aligned is stored in the read-only + register '.rj' and is associated with the environment (*note + Environments::). + + .ll 49n + .rj 3 + At first I hoped that such a technically unsound + project would collapse but I soon realized it was + doomed to success. \[em] C. A. R. Hoare + => At first I hoped that such a technically unsound + => project would collapse but I soon realized it was + => doomed to success. -- C. A. R. Hoare + + -- Request: .ss word-space-size [additional-sentence-space-size] + -- Register: \n[.ss] + -- Register: \n[.sss] + Set the sizes of spaces between words and sentences(3) (*note + Manipulating Filling and Adjustment-Footnote-3::) in twelfths of + font's space width (typically one-fourth to one-third em for + Western scripts). The default for both parameters is 12. Negative + values are erroneous. The first argument is a minimum; if an + output line undergoes adjustment, such spaces may increase in + width. The optional second argument sets the amount of additional + space separating sentences on the same output line. If omitted, + this amount is set to WORD-SPACE-SIZE. The request is ignored if + there are no parameters. + + Additional inter-sentence space is used only if the output line is + not full when the end of a sentence occurs in the input. If a + sentence ends at the end of an input line, then both an inter-word + space and an inter-sentence space are added to the output; if two + spaces follow the end of a sentence in the middle of an input line, + then the second space becomes an inter-sentence space in the + output. Additional inter-sentence space is not adjusted, but the + inter-word space that always precedes it may be. Further input + spaces after the second, if present, are adjusted as normal. + + The read-only registers '.ss' and '.sss' hold the minimal + inter-word space and additional inter-sentence space amounts, + respectively. These parameters are part of the environment (*note + Environments::), and rounded down to the nearest multiple of 12 on + terminals. + + The 'ss' request can insert discardable horizontal space; that is, + space that is discarded at a break. For example, some footnote + styles collect the notes into a single paragraph with large gaps + between each note. + + .ll 48n + 1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14. + .ss 12 48 \" applies to next sentence ending + Reprints no longer available through FCS. + .ss 12 \" go back to normal + 2.\~Better known for other work. + => 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints + => no longer available through FCS. 2. Better + => known for other work. + + If _undiscardable_ space is required, use the '\h' escape sequence. + + +File: groff.info, Node: Manipulating Filling and Adjustment-Footnotes, Up: Manipulating Filling and Adjustment + + (1) unless diverted; see *note Diversions:: + + (2) *Note Line Continuation::. + + (3) Recall *note Filling:: and *note Sentences:: for the definitions +of word and sentence boundaries, respectively. + + +File: groff.info, Node: Manipulating Hyphenation, Next: Manipulating Spacing, Prev: Manipulating Filling and Adjustment, Up: GNU troff Reference + +5.10 Manipulating Hyphenation +============================= + +When filling, GNU 'troff' hyphenates words as needed at user-specified +and automatically determined hyphenation points. The machine-driven +determination of hyphenation points in words requires algorithms and +data, and is susceptible to conventions and preferences. Before +tackling such "automatic hyphenation", let us consider how hyphenation +points can be set explicitly. + + Explicitly hyphenated words such as "mother-in-law" are eligible for +breaking after each of their hyphens. Relatively few words in a +language offer such obvious break points, however, and automatic +detection of syllabic (or phonetic) boundaries for hyphenation is not +perfect,(1) (*note Manipulating Hyphenation-Footnote-1::) particularly +for unusual words found in technical literature. We can instruct GNU +'troff' how to hyphenate specific words if the need arises. + + -- Request: .hw word ... + Define each "hyphenation exception" WORD with each hyphen '-' in + the word indicating a hyphenation point. For example, the request + + .hw in-sa-lub-rious alpha + + marks potential hyphenation points in "insalubrious", and prevents + "alpha" from being hyphenated at all. + + Besides the space character, any character whose hyphenation code + is zero can be used to separate the arguments of 'hw' (see the + 'hcode' request below). In addition, this request can be used more + than once. + + Hyphenation points specified with 'hw' are not subject to the + within-word placement restrictions imposed by the 'hy' request (see + below). + + Hyphenation exceptions specified with the 'hw' request are + associated with the hyphenation language (see the 'hla' request + below) and environment (*note Environments::); invoking the 'hw' + request in the absence of a hyphenation language is an error. + + The request is ignored if there are no parameters. + + These are known as hyphenation exceptions in the expectation that +most users will avail themselves of automatic hyphenation; these +exceptions override any rules that would normally apply to a word +matching a hyphenation exception defined with 'hw'. + + Situations also arise when only a specific occurrence of a word needs +its hyphenation altered or suppressed, or when a URL or similar string +needs to be breakable in sensible places without hyphenation. + + -- Escape sequence: \% + -- Escape sequence: \: + To tell GNU 'troff' how to hyphenate words as they occur in input, + use the '\%' escape sequence; it is the default "hyphenation + character". Each instance within a word indicates to GNU 'troff' + that the word may be hyphenated at that point, while prefixing a + word with this escape sequence prevents it from being otherwise + hyphenated. This mechanism affects only that occurrence of the + word; to change the hyphenation of a word for the remainder of + input processing, use the 'hw' request. + + GNU 'troff' regards the escape sequences '\X' and '\Y' as starting + a word; that is, the '\%' escape sequence in, say, + '\X'...'\%foobar' or '\Y'...'\%foobar' no longer prevents + hyphenation of 'foobar' but inserts a hyphenation point just prior + to it; most likely this isn't what you want. *Note Postprocessor + Access::. + + '\:' inserts a non-printing break point; that is, a word can break + there, but the soft hyphen glyph (see below) is not written to the + output if it does. This escape sequence is an input word boundary, + so the remainder of the word is subject to hyphenation as normal. + + You can combine '\:' and '\%' to control breaking of a file name or + URL, or to permit hyphenation only after certain explicit hyphens + within a word. + + The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce + was, in retrospect, inevitable once the contents of + \%/var/log/\:\%httpd/\:\%access_log on the family web + server came to light, revealing visitors from Hogwarts. + + -- Request: .hc [char] + Change the hyphenation character to CHAR. This character then + works as the '\%' escape sequence normally does, and thus no longer + appears in the output.(2) (*note Manipulating + Hyphenation-Footnote-2::) Without an argument, 'hc' resets the + hyphenation character to '\%' (the default). The hyphenation + character is associated with the environment (*note + Environments::). + + -- Request: .shc [c] + Set the "soft hyphen character", inserted when a word is hyphenated + automatically or at a hyphenation character, to the ordinary or + special character C.(3) (*note Manipulating + Hyphenation-Footnote-3::) If the argument is omitted, the soft + hyphen character is set to the default, '\[hy]'. If no glyph for C + exists in the font in use at a potential hyphenation point, then + the line is not broken there. Neither character definitions + (specified with the 'char' and similar requests) nor translations + (specified with the 'tr' request) are applied to C. + + Several requests influence automatic hyphenation. Because +conventions vary, a variety of hyphenation modes is available to the +'hy' request; these determine whether hyphenation will apply to a word +prior to breaking a line at the end of a page (more or less; see below +for details), and at which positions within that word automatically +determined hyphenation points are permissible. The places within a word +that are eligible for hyphenation are determined by language-specific +data and lettercase relationships. Furthermore, hyphenation of a word +might be suppressed due to a limit on consecutive hyphenated lines +('hlm'), a minimum line length threshold ('hym'), or because the line +can instead be adjusted with additional inter-word space ('hys'). + + -- Request: .hy [mode] + -- Register: \n[.hy] + Set automatic hyphenation mode to MODE, an integer encoding + conditions for hyphenation; if omitted, '1' is implied. The + hyphenation mode is available in the read-only register '.hy'; it + is associated with the environment (*note Environments::). The + default hyphenation mode depends on the localization file loaded + when GNU 'troff' starts up; see the 'hpf' request below. + + Typesetting practice generally does not avail itself of every + opportunity for hyphenation, but the details differ by language and + site mandates. The hyphenation modes of AT&T 'troff' were + implemented with English-language publishing practices of the 1970s + in mind, not a scrupulous enumeration of conceivable parameters. + GNU 'troff' extends those modes such that finer-grained control is + possible, favoring compatibility with older implementations over a + more intuitive arrangement. The means of hyphenation mode control + is a set of numbers that can be added up to encode the behavior + sought.(4) (*note Manipulating Hyphenation-Footnote-4::) The + entries in the following table are termed "values"; the sum of the + desired values is the "mode". + + '0' + disables hyphenation. + + '1' + enables hyphenation except after the first and before the last + character of a word. + + The remaining values "imply" 1; that is, they enable hyphenation + under the same conditions as '.hy 1', and then apply or lift + restrictions relative to that basis. + + '2' + disables hyphenation of the last word on a page,(5) (*note + Manipulating Hyphenation-Footnote-5::) even for explicitly + hyphenated words. + + '4' + disables hyphenation before the last two characters of a word. + + '8' + disables hyphenation after the first two characters of a word. + + '16' + enables hyphenation before the last character of a word. + + '32' + enables hyphenation after the first character of a word. + + Apart from value 2, restrictions imposed by the hyphenation mode + are _not_ respected for words whose hyphenations have been + specified with the hyphenation character ('\%' by default) or the + 'hw' request. + + Nonzero values in the previous table are additive. For example, + mode 12 causes GNU 'troff' to hyphenate neither the last two nor + the first two characters of a word. Some values cannot be used + together because they contradict; for instance, values 4 and 16, + and values 8 and 32. As noted, it is superfluous to add 1 to any + non-zero even mode. + + The automatic placement of hyphens in words is determined by + "pattern files", which are derived from TeX and available for + several languages. The number of characters at the beginning of a + word after which the first hyphenation point should be inserted is + determined by the patterns themselves; it can't be reduced further + without introducing additional, invalid hyphenation points + (unfortunately, this information is not part of a pattern file--you + have to know it in advance). The same is true for the number of + characters at the end of a word before the last hyphenation point + should be inserted. For example, you can supply the following + input to 'echo $(nroff)'. + + .ll 1 + .hy 48 + splitting + + You will get + + s- plit- t- in- g + + instead of the correct 'split- ting'. English patterns as + distributed with GNU 'troff' need two characters at the beginning + and three characters at the end; this means that value 4 of 'hy' is + mandatory. Value 8 is possible as an additional restriction, but + values 16 and 32 should be avoided, as should mode 1. Modes 4 + and 6 are typical. + + A table of left and right minimum character counts for hyphenation + as needed by the patterns distributed with GNU 'troff' follows; see + the 'groff_tmac(5)' man page for more information on GNU 'troff''s + language macro files. + + language pattern name left min right min + ----------------------------------------------------------- + Czech cs 2 2 + English en 2 3 + French fr 2 3 + German traditional det 2 2 + German reformed den 2 2 + Italian it 2 2 + Swedish sv 1 2 + + Hyphenation exceptions within pattern files (i.e., the words within + a TeX '\hyphenation' group) obey the hyphenation restrictions given + by 'hy'. + + -- Request: .nh + Disable automatic hyphenation; i.e., set the hyphenation mode to 0 + (see above). The hyphenation mode of the last call to 'hy' is not + remembered. + + -- Request: .hpf pattern-file + -- Request: .hpfa pattern-file + -- Request: .hpfcode a b [c d] ... + Read hyphenation patterns from PATTERN-FILE, which is sought in the + same way that macro files are with the 'mso' request or the + '-mNAME' command-line option to 'groff'. The PATTERN-FILE should + have the same format as (simple) TeX pattern files. More + specifically, the following scanning rules are implemented. + + * A percent sign starts a comment (up to the end of the line) + even if preceded by a backslash. + + * "Digraphs" like '\$' are not supported. + + * '^^XX' (where each X is 0-9 or a-f) and '^^C' (character C in + the code point range 0-127 decimal) are recognized; other uses + of '^' cause an error. + + * No macro expansion is performed. + + * 'hpf' checks for the expression '\patterns{...}' (possibly + with whitespace before or after the braces). Everything + between the braces is taken as hyphenation patterns. + Consequently, '{' and '}' are not allowed in patterns. + + * Similarly, '\hyphenation{...}' gives a list of hyphenation + exceptions. + + * '\endinput' is recognized also. + + * For backward compatibility, if '\patterns' is missing, the + whole file is treated as a list of hyphenation patterns + (except that the '%' character is recognized as the start of a + comment). + + The 'hpfa' request appends a file of patterns to the current list. + + The 'hpfcode' request defines mapping values for character codes in + pattern files. It is an older mechanism no longer used by GNU + 'troff''s own macro files; for its successor, see 'hcode' below. + 'hpf' or 'hpfa' apply the mapping after reading the patterns but + before replacing or appending to the active list of patterns. Its + arguments are pairs of character codes--integers from 0 to 255. + The request maps character code A to code B, code C to code D, and + so on. Character codes that would otherwise be invalid in GNU + 'troff' can be used. By default, every code maps to itself except + those for letters 'A' to 'Z', which map to those for 'a' to 'z'. + + The set of hyphenation patterns is associated with the language set + by the 'hla' request (see below). The 'hpf' request is usually + invoked by a localization file loaded by the 'troffrc' file.(6) + (*note Manipulating Hyphenation-Footnote-6::) + + A second call to 'hpf' (for the same language) replaces the + hyphenation patterns with the new ones. Invoking 'hpf' or 'hpfa' + causes an error if there is no hyphenation language. If no 'hpf' + request is specified (either in the document, in a file loaded at + startup, or in a macro package), GNU 'troff' won't automatically + hyphenate at all. + + -- Request: .hcode c1 code1 [c2 code2] ... + Set the hyphenation code of character C1 to CODE1, that of C2 to + CODE2, and so on. A hyphenation code must be an ordinary character + (not a special character escape sequence) other than a digit or a + space. The request is ignored if given no arguments. + + For hyphenation to work, hyphenation codes must be set up. At + startup, GNU 'troff' assigns hyphenation codes to the letters + 'a'-'z' (mapped to themselves), to the letters 'A'-'Z' (mapped to + 'a'-'z'), and zero to all other characters. Normally, hyphenation + patterns contain only lowercase letters which should be applied + regardless of case. In other words, they assume that the words + 'FOO' and 'Foo' should be hyphenated exactly as 'foo' is. The + 'hcode' request extends this principle to letters outside the + Unicode basic Latin alphabet; without it, words containing such + letters won't be hyphenated properly even if the corresponding + hyphenation patterns contain them. + + For example, the following 'hcode' requests are necessary to assign + hyphenation codes to the letters 'ÄäÖöÜüß', needed for German. + + .hcode ä ä Ä ä + .hcode ö ö Ö ö + .hcode ü ü Ü ü + .hcode ß ß + + Without these assignments, GNU 'troff' treats the German word + 'Kindergärten' (the plural form of 'kindergarten') as two words + 'kinderg' and 'rten' because the hyphenation code of the umlaut a + is zero by default, just like a space. There is a German + hyphenation pattern that covers 'kinder', so GNU 'troff' finds the + hyphenation 'kin-der'. The other two hyphenation points + ('kin-der-gär-ten') are missed. + + -- Request: .hla lang + -- Register: \n[.hla] + Set the hyphenation language to LANG. Hyphenation exceptions + specified with the 'hw' request and hyphenation patterns and + exceptions specified with the 'hpf' and 'hpfa' requests are + associated with the hyphenation language. The 'hla' request is + usually invoked by a localization file, which is turn loaded by the + 'troffrc' or 'troffrc-end' file; see the 'hpf' request above. + + The hyphenation language is available in the read-only + string-valued register '.hla'; it is associated with the + environment (*note Environments::). + + -- Request: .hlm [n] + -- Register: \n[.hlm] + -- Register: \n[.hlc] + Set the maximum quantity of consecutive hyphenated lines to N. If + N is negative, there is no maximum. If omitted, N is -1. This + value is associated with the environment (*note Environments::). + Only lines output from a given environment count toward the maximum + associated with that environment. Hyphens resulting from '\%' are + counted; explicit hyphens are not. + + The '.hlm' read-only register stores this maximum. The count of + immediately preceding consecutive hyphenated lines is available in + the read-only register '.hlc'. + + -- Request: .hym [length] + -- Register: \n[.hym] + Set the (right) hyphenation margin to LENGTH. If the adjustment + mode is not 'b' or 'n', the line is not hyphenated if it is shorter + than LENGTH. Without an argument, the hyphenation margin is reset + to its default value, 0. The default scaling unit is 'm'. The + hyphenation margin is associated with the environment (*note + Environments::). + + A negative argument resets the hyphenation margin to zero, emitting + a warning in category 'range'. + + The hyphenation margin is available in the '.hym' read-only + register. + + -- Request: .hys [hyphenation-space] + -- Register: \n[.hys] + Suppress hyphenation of the line in adjustment modes 'b' or 'n' if + it can be justified by adding no more than HYPHENATION-SPACE extra + space to each inter-word space. Without an argument, the + hyphenation space adjustment threshold is set to its default value, + 0. The default scaling unit is 'm'. The hyphenation space + adjustment threshold is associated with the environment (*note + Environments::). + + A negative argument resets the hyphenation space adjustment + threshold to zero, emitting a warning in category 'range'. + + The hyphenation space adjustment threshold is available in the + '.hys' read-only register. + + +File: groff.info, Node: Manipulating Hyphenation-Footnotes, Up: Manipulating Hyphenation + + (1) Whether a perfect algorithm for this application is even possible +is an unsolved problem in computer science: +. + + (2) '\%' itself stops marking hyphenation points but still produces +no output glyph. + + (3) "Soft" because it appears in output only where a hyphenation +break is performed; a "hard" hyphen, as in "long-term", always appears. + + (4) The mode is a vector of Booleans encoded as an integer. To a +programmer, this fact is easily deduced from the exclusive use of powers +of two for the configuration parameters; they are computationally easy +to "mask off" and compare to zero. To almost everyone else, the +arrangement seems recondite and unfriendly. + + (5) Hyphenation is prevented if the next page location trap is closer +to the vertical drawing position than the next text baseline would be. +*Note Page Location Traps::. + + (6) For more on localization, see the 'groff_tmac(5)' man page. + + +File: groff.info, Node: Manipulating Spacing, Next: Tabs and Fields, Prev: Manipulating Hyphenation, Up: GNU troff Reference + +5.11 Manipulating Spacing +========================= + +A break causes the formatter to update the vertical drawing position at +which the new text baseline is aligned. You can alter this location. + + -- Request: .sp [distance] + Break and move the next text baseline down by DISTANCE, or until + springing a page location trap.(1) (*note Manipulating + Spacing-Footnote-1::) If invoked with the no-break control + character, 'sp' moves the pending output line's text baseline by + DISTANCE. A negative DISTANCE will not reduce the position of the + text baseline below zero. Inside a diversion, any DISTANCE + argument is ignored. The default scaling unit is 'v'. If DISTANCE + is not specified, '1v' is assumed. + + .pl 5v \" Set page length to 5 vees. + .de xx + \-\-\- + . br + .. + .wh 0 xx \" Set a trap at the top of the page. + foo on page \n% + .sp 2v + bar on page \n% + .sp 50v \" This will cause a page break. + baz on page \n% + .pl \n(nlu \" Truncate page to current position. + => --- + => foo on page 1 + => + => + => bar on page 1 + => --- + => baz on page 2 + + You might use the following macros to set the baseline of the next + output text at a given distance from the top or the bottom of the + page. We subtract one line height ('\n[.v]') because the '|' + operator moves to one vee below the page top (recall *note Numeric + Expressions::). + + .de y-from-top-down + . sp |\\$1-\\n[.v]u + .. + . + .de y-from-bot-up + . sp |\\n[.p]u-\\$1-\\n[.v]u + .. + + A call to '.y-from-bot-up 10c' means that the next text baseline + will be 10 cm from the bottom edge of the paper. + + -- Request: .ls [count] + -- Register: \n[.L] + Set the line spacing; add COUNT-1 blank lines after each line of + text. With no argument, GNU 'troff' uses the previous value before + the last 'ls' call. The default is '1'. + + The read-only register '.L' contains the current line spacing; it + is associated with the environment (*note Environments::). + + The 'ls' request is a coarse mechanism. *Note Changing the Type +Size::, for the requests 'vs' and 'pvs' as alternatives to 'ls'. + + -- Escape sequence: \x'spacing' + -- Register: \n[.a] + Sometimes, an output line requires additional vertical spacing, for + instance to allow room for a tall construct like an inline equation + with exponents or subscripts (particularly if they are iterated). + The '\x' escape sequence takes a delimited measurement (like + '\x'3p'') to increase the vertical spacing of the pending output + line. The default scaling unit is 'v'. If the measurement is + positive, extra vertical space is inserted below the current line; + a negative measurement adds space above. If '\x' is applied to the + pending output line multiple times, the maxima of the positive and + negative adjustments are separately applied. The delimiter need + not be a neutral apostrophe; see *note Delimiters::. + + The '.a' read-only register contains the extra vertical spacing + _after_ the text baseline of the most recently emitted output line. + (In other words, it is the largest positive argument to '\x' + encountered on that line.) This quantity is exposed via a register + because if an output line requires this "extra post-vertical line + spacing", and the subsequent output line requires "extra + pre-vertical line spacing" (a negative argument to '\x'), then + applying both can lead to excessive spacing between the output + lines. Text that is piling high on line N might not require (as + much) extra pre-vertical line spacing if line N-1 carries extra + post-vertical line spacing. + + Use of '\x' can be necessary in combination with the + bracket-building escape sequence '\b',(2) (*note Manipulating + Spacing-Footnote-2::) as the following example shows. + + .nf + This is a test of \[rs]b (1). + This is a test of \[rs]b (2). + This is a test of \b'xyz'\x'-1m'\x'1m' (3). + This is a test of \[rs]b (4). + This is a test of \[rs]b (5). + => This is a test of \b (1). + => This is a test of \b (2). + => x + => This is a test of y (3). + => z + => This is a test of \b (4). + => This is a test of \b (5). + +Without '\x', the backslashes on the lines marked '(2)' and '(4)' would +be overprinted. + + -- Request: .ns + -- Request: .rs + -- Register: \n[.ns] + Enable "no-space mode". Vertical spacing, whether by 'sp' requests + or blank input lines, is disabled. The 'bp' request to advance to + the next page is also disabled, unless it is accompanied by a page + number (*note Page Control::). No-space mode ends automatically + when text(3) (*note Manipulating Spacing-Footnote-3::) is formatted + for output (4) (*note Manipulating Spacing-Footnote-4::) or the + 'rs' request is invoked, which ends no-space mode. The read-only + register '.ns' interpolates a Boolean value indicating the + enablement of no-space mode. + + A paragraphing macro might ordinarily insert vertical space to + separate paragraphs. A section heading macro could invoke 'ns' to + suppress this spacing for the first paragraph in a section. + + +File: groff.info, Node: Manipulating Spacing-Footnotes, Up: Manipulating Spacing + + (1) *Note Page Location Traps::. + + (2) *Note Drawing Geometric Objects::. + + (3) or geometric objects; see *note Drawing Geometric Objects:: + + (4) to the top-level diversion; see *note Diversions:: + + +File: groff.info, Node: Tabs and Fields, Next: Character Translations, Prev: Manipulating Spacing, Up: GNU troff Reference + +5.12 Tabs and Fields +==================== + +A tab character (ISO code point 9, EBCDIC code point 5) causes a +horizontal movement to the next tab stop, if any. + + -- Escape sequence: \t + Interpolate a tab in copy mode; see *note Copy Mode::. + + -- Request: .ta [[n1 n2 ... nn ]T r1 r2 ... rn] + -- Register: \n[.tabs] + Change tab stop positions. This request takes a series of tab + specifiers as arguments (optionally divided into two groups with + the letter 'T') that indicate where each tab stop is to be, + overriding any previous settings. The default scaling unit is 'm'. + Invoking 'ta' without an argument removes all tab stops. GNU + 'troff''s startup value is 'T 0.5i'. + + Tab stops can be specified absolutely--as distances from the left + margin. The following example sets six tab stops, one every inch. + + .ta 1i 2i 3i 4i 5i 6i + + Tab stops can also be specified using a leading '+', which means + that the specified tab stop is set relative to the previous tab + stop. For example, the following is equivalent to the previous + example. + + .ta 1i +1i +1i +1i +1i +1i + + GNU 'troff' supports an extended syntax to specify repeating tab + stops. These stops appear after a 'T' argument. Their values are + always taken as distances relative to the previous tab stop. This + is the idiomatic way to specify tab stops at equal intervals in + 'groff'. The following is, yet again, the same as the previous + examples. It does more, in fact, since it defines an infinite + number of tab stops at one-inch intervals. + + .ta T 1i + + Now we are ready to interpret the full syntax given above. The + 'ta' request sets tabs at positions N1, N2, ..., NN, then at NN+R1, + NN+R2, ..., NN+RN, then at NN+RN+R1, NN+RN+R2, ..., NN+RN+RN, and + so on. + + For example, '4c +6c T 3c 5c 2c' is equivalent to '4c 10c 13c 18c + 20c 23c 28c 30c ...'. + + Text written to a tab column (i.e., between two tab stops, or + between a tab stop and an output line boundary) may be aligned to + the right or left, or centered in the column. This alignment is + determined by appending 'R', 'L', or 'C' to the tab specifier. The + default is 'L'. + + .ta 1i 2iC 3iR + + The beginning of an output line is not a tab stop; the text that + begins an output line is placed according to the configured + alignment and indentation; see *note Manipulating Filling and + Adjustment:: and *note Line Layout::. + + A tab stop is converted into a non-breakable horizontal movement + that cannot be adjusted. + + .ll 2i + .ds foo a\tb\tc + .ta T 1i + \*[foo] + error-> warning: cannot break line + => a b c + + The above creates a single output line that is a bit longer than + two inches (we use a string to show exactly where the tab stops + are). Now consider the following. + + .ll 2i + .ds bar a\tb c\td + .ta T 1i + \*[bar] + error-> warning: cannot adjust line + => a b + => c d + + GNU 'troff' first converts the line's tab stops into unbreakable + horizontal movements, then breaks after 'b'. This usually isn't + what you want. + + Superfluous tab characters--those that do not correspond to a tab + stop--are ignored except for the first, which delimits the + characters belonging to the last tab stop for right-alignment or + centering. + + .ds Z foo\tbar\tbaz + .ds ZZ foo\tbar\tbazqux + .ds ZZZ foo\tbar\tbaz\tqux + .ta 2i 4iR + \*[Z] + .br + \*[ZZ] + .br + \*[ZZZ] + .br + => foo bar baz + => foo bar bazqux + => foo bar bazqux + + The first line right-aligns "baz" within the second tab stop. The + second line right-aligns "bazqux" within it. The third line + right-aligns only "baz" because of the additional tab character, + which marks the end of the text occupying the last tab stop + defined. + + Tab stops are associated with the environment (*note + Environments::). + + The read-only register '.tabs' contains a string representation of + the current tab settings suitable for use as an argument to the + 'ta' request.(1) (*note Tabs and Fields-Footnote-1::) + + .ds tab-string \n[.tabs] + \*[tab-string] + => T120u + + -- Request: .tc [c] + Set the tab repetition character to the ordinary or special + character C; normally, no glyph is written when moving to a tab + stop (and some output devices may output space characters to + achieve this motion). A "tab repetition character" causes the + formatter to write as many instances of C as are necessary to + occupy the interval from the horizontal drawing position to the + next tab stop. With no argument, GNU 'troff' reverts to the + default behavior. The tab repetition character is associated with + the environment (*note Environments::). Only a single character of + C is recognized; any excess is ignored. + + -- Request: .linetabs n + -- Register: \n[.linetabs] + If N is missing or non-zero, activate "line-tabs"; deactivate it + otherwise (the default). Active line-tabs cause GNU 'troff' to + compute tab distances relative to the start of the output line + instead of the input line. + + .de Tabs + . ds x a\t\c + . ds y b\t\c + . ds z c + . ta 1i 3i + \\*x + \\*y + \\*z + .. + .Tabs + .br + .linetabs + .Tabs + => a b c + => a b c + + Line-tabs activation is associated with the environment (*note + Environments::). The read-only register '.linetabs' interpolates 1 + if line-tabs are active, and 0 otherwise. + +* Menu: + +* Leaders:: +* Fields:: + + +File: groff.info, Node: Tabs and Fields-Footnotes, Up: Tabs and Fields + + (1) Plan 9 'troff' uses the register '.S' for this purpose. + + +File: groff.info, Node: Leaders, Next: Fields, Prev: Tabs and Fields, Up: Tabs and Fields + +5.12.1 Leaders +-------------- + +Sometimes it is desirable to fill a tab stop with a given glyph, but +also use tab stops normally on the same output line. An example is a +table of contents entry that uses dots to bridge the entry name with its +page number, which is itself aligned between tab stops. The 'roff' +language provides "leaders" for this purpose.(1) (*note +Leaders-Footnote-1::) + + A leader character (ISO and EBCDIC code point 1, also known as SOH or +"start of heading"), behaves similarly to a tab character: it moves to +the next tab stop. The difference is that for this movement, the +default fill character is a period '.'. + + -- Escape sequence: \a + Interpolate a leader in copy mode; see *note Copy Mode::. + + -- Request: .lc [c] + Set the leader repetition character to the ordinary or special + character C. Recall *note Tabs and Leaders::: when encountering a + leader character in the input, the formatter writes as many dots + '.' as are necessary until reaching the next tab stop; this is the + "leader definition character". Omitting C unsets the leader + character. With no argument, GNU 'troff' treats leaders the same + as tabs. The leader repetition character is associated with the + environment (*note Environments::). Only a single C is recognized; + any excess is ignored. + + A table of contents, for example, may define tab stops after a +section number, a title, and a gap to be filled with leader dots. The +page number follows the leader, after a right-aligned final tab stop +wide enough to house the largest page number occurring in the document. + + .ds entry1 19.\tThe Prophet\a\t98 + .ds entry2 20.\tAll Astir\a\t101 + .ta .5i 4.5i +.5iR + .nf + \*[entry1] + \*[entry2] + => 19. The Prophet............................. 98 + => 20. All Astir............................... 101 + + +File: groff.info, Node: Leaders-Footnotes, Up: Leaders + + (1) This is pronounced to rhyme with "feeder", and refers to how the +glyphs "lead" the eye across the page to the corresponding page number +or other datum. + + +File: groff.info, Node: Fields, Prev: Leaders, Up: Tabs and Fields + +5.12.2 Fields +------------- + +"Fields" are a more general way of laying out tabular data. A field is +defined as the data between a pair of "delimiting characters". It +contains substrings that are separated by "padding characters". The +width of a field is the distance on the _input_ line from the position +where the field starts to the next tab stop. A padding character +inserts an adjustable space similar to TeX's '\hss' command (thus it can +even be negative) to make the sum of all substring lengths plus the +adjustable space equal to the field width. If more than one padding +character is inserted, the available space is evenly distributed among +them. + + -- Request: .fc [delim-char [padding-char]] + Define a delimiting and a padding character for fields. If the + latter is missing, the padding character defaults to a space + character. If there is no argument at all, the field mechanism is + disabled (which is the default). In contrast to, e.g., the tab + repetition character, delimiting and padding characters are _not_ + associated with the environment (*note Environments::). + + .fc # ^ + .ta T 3i + #foo^bar^smurf# + .br + #foo^^bar^smurf# + => foo bar smurf + => foo bar smurf + + +File: groff.info, Node: Character Translations, Next: troff and nroff Modes, Prev: Tabs and Fields, Up: GNU troff Reference + +5.13 Character Translations +=========================== + +A "translation" is a mapping of an input character to an output glyph. +The mapping occurs at output time, i.e., the input character gets +assigned the metric information of the mapped output character right +before input tokens are converted to nodes (*note Gtroff Internals::, +for more on this process). + + -- Request: .tr abcd... + -- Request: .trin abcd... + Translate character A to glyph B, character C to glyph D, and so + on. If there is an odd number of characters in the argument, the + last one is translated to a fixed-width space (the same one + obtained by the '\' escape sequence). + + The 'trin' request is identical to 'tr', but when you unformat a + diversion with 'asciify' it ignores the translation. *Note + Diversions::, for details about the 'asciify' request. + + Some notes: + + * Special characters ('\(XX', '\[XXX]', '\C'XXX'', '\'', '\`', + '\-', '\_'), glyphs defined with the 'char' request, and + numbered glyphs ('\N'XXX'') can be translated also. + + * The '\e' escape can be translated also. + + * Characters can be mapped onto the '\%' and '\~' escape + sequences (but '\%' and '\~' can't be mapped onto another + glyph). + + * The following characters can't be translated: space (with one + exception, see below), backspace, newline, leader (and '\a'), + tab (and '\t'). + + * Translations are not considered for finding the soft hyphen + character set with the 'shc' request. + + * The pair 'C\&' (an arbitrary character C followed by the dummy + character) maps this character to "nothing". + + .tr a\& + foo bar + => foo br + + Even the space character can be mapped to the dummy character. + + .tr aa \& + foo bar + => foobar + + As shown in the example, the space character can't be the + first character/glyph pair as an argument of 'tr'. + Additionally, it is not possible to map the space character to + any other glyph; requests like '.tr aa x' undo '.tr aa \&' + instead. + + If justification is active, lines are justified in spite of + the 'empty' space character (but there is no minimal distance, + i.e., the space character, between words). + + * After an output glyph has been constructed (this happens at + the moment immediately before the glyph is appended to an + output glyph list, either by direct output, in a macro, + diversion, or string), it is no longer affected by 'tr'. + + * Translating character to glyphs where one of them or both are + undefined is possible also; 'tr' does not check whether the + elements of its argument exist. + + *Note Gtroff Internals::. + + * Without an argument, the 'tr' request is ignored. + + -- Request: .trnt abcd... + 'trnt' is the same as the 'tr' request except that the translations + do not apply to text that is transparently throughput into a + diversion with '\!'. *Note Diversions::. + + For example, + + .tr ab + .di x + \!.tm a + .di + .x + + prints 'b' to the standard error stream; if 'trnt' is used instead + of 'tr' it prints 'a'. + + +File: groff.info, Node: troff and nroff Modes, Next: Line Layout, Prev: Character Translations, Up: GNU troff Reference + +5.14 'troff' and 'nroff' Modes +============================== + +Historically, 'nroff' and 'troff' were two separate programs; the former +for terminal output, the latter for typesetters. GNU 'troff' merges +both functions into one executable(1) (*note troff and nroff +Modes-Footnote-1::) that sends its output to a device driver ('grotty' +for terminal devices, 'grops' for PostScript, and so on) which +interprets this intermediate output format. When discussing AT&T +'troff', it makes sense to talk about "'nroff' mode" and "'troff' mode" +since the differences are hard-coded. GNU 'troff' takes information +from device and font description files without handling requests +specially if a terminal output device is used, so such a strong +distinction is unnecessary. + + Usually, a macro package can be used with all output devices. +Nevertheless, it is sometimes necessary to make a distinction between +terminal and non-terminal devices: GNU 'troff' provides two built-in +conditions 'n' and 't' for the 'if', 'ie', and 'while' requests to +decide whether GNU 'troff' shall behave like 'nroff' or like 'troff'. + + -- Request: .troff + Make the 't' built-in condition true (and the 'n' built-in + condition false) for 'if', 'ie', and 'while' conditional requests. + This is the default if GNU 'troff' (_not_ 'groff') is started with + the '-R' switch to avoid loading of the startup files 'troffrc' and + 'troffrc-end'. Without '-R', GNU 'troff' stays in 'troff' mode if + the output device is not a terminal (e.g., 'ps'). + + -- Request: .nroff + Make the 'n' built-in condition true (and the 't' built-in + condition false) for 'if', 'ie', and 'while' conditional requests. + This is the default if GNU 'troff' uses a terminal output device; + the code for switching to 'nroff' mode is in the file 'tty.tmac', + which is loaded by the startup file 'troffrc'. + + *Note Conditionals and Loops::, for more details on built-in +conditions. + + +File: groff.info, Node: troff and nroff Modes-Footnotes, Up: troff and nroff Modes + + (1) A GNU 'nroff' program is available for convenience; it calls GNU +'troff' to perform the formatting. + + +File: groff.info, Node: Line Layout, Next: Line Continuation, Prev: troff and nroff Modes, Up: GNU troff Reference + +5.15 Line Layout +================ + +The following drawing shows the dimensions that 'gtroff' uses for +placing a line of output onto the page. They are labeled with the +request that manipulates each dimension. + + -->| in |<-- + |<-----------ll------------>| + +----+----+----------------------+----+ + | : : : | + +----+----+----------------------+----+ + -->| po |<-- + |<--------paper width---------------->| + +These dimensions are: + +'po' + "Page offset"--this is the leftmost position of text on the final + output, defining the "left margin". + +'in' + "Indentation"--this is the distance from the left margin where text + is printed. + +'ll' + "Line length"--this is the distance from the left margin to right + margin. + + The right margin is not explicitly configured; the combination of +page offset and line length provides the information necessary to derive +it. + + A simple demonstration: + + .ll 3i + This is text without indentation. + The line length has been set to 3\~inches. + .in +.5i + .ll -.5i + Now the left and right margins are both increased. + .in + .ll + Calling .in and .ll without parameters restores + the previous values. + + => This is text without indenta- + => tion. The line length has + => been set to 3 inches. + => Now the left and + => right margins are + => both increased. + => Calling .in and .ll without + => parameters restores the previ- + => ous values. + + -- Request: .po [offset] + -- Request: .po +offset + -- Request: .po -offset + -- Register: \n[.o] + Set page offset to OFFSET (or increment or decrement its current + value by OFFSET). If invoked without an argument, the page offset + is restored to the value before the previous 'po' request. This + request does not cause a break; the page offset in effect when an + output line is broken prevails (*note Manipulating Filling and + Adjustment::). The initial value is 1i and the default scaling + unit is 'm'. On terminal devices, the page offset is set to zero + by a driver-specific macro file, 'tty.tmac'. The current page + offset can be found in the read-only register '.o'. This request + is incorrectly documented in the AT&T 'troff' manual as using a + default scaling unit of 'v'. + + .po 3i + \n[.o] + => 720 + .po -1i + \n[.o] + => 480 + .po + \n[.o] + => 720 + + -- Request: .in [indent] + -- Request: .in +indent + -- Request: .in -indent + -- Register: \n[.i] + Set indentation to INDENT (or increment or decrement the current + value by INDENT). This request causes a break. Initially, there + is no indentation. + + If 'in' is called without an argument, the indentation is reset to + the previous value before the last call to 'in'. The default + scaling unit is 'm'. + + If a negative indentation value is specified (which is not + allowed), 'gtroff' emits a warning in category 'range' and sets the + indentation to zero. + + The effect of 'in' is delayed until a partially collected line (if + it exists) is output. A temporary indentation value is reset to + zero also. + + The current indentation (as set by 'in') can be found in the + read-only register '.i'. The indentation is associated with the + environment (*note Environments::). + + -- Request: .ti offset + -- Request: .ti +offset + -- Request: .ti -offset + -- Register: \n[.in] + Temporarily indent the next output line by OFFSET. If an increment + or decrement value is specified, adjust the temporary indentation + relative to the value set by the 'in' request. + + This request causes a break; its value is associated with the + environment (*note Environments::). The default scaling unit is + 'm'. A call of 'ti' without an argument is ignored. + + If the total indentation value is negative (which is not allowed), + 'gtroff' emits a warning in category 'range' and sets the temporary + indentation to zero. 'Total indentation' is either OFFSET if + specified as an absolute value, or the temporary plus normal + indentation, if OFFSET is given as a relative value. + + The effect of 'ti' is delayed until a partially collected line (if + it exists) is output. + + The read-only register '.in' is the indentation that applies to the + current output line. + + The difference between '.i' and '.in' is that the latter takes into + account whether a partially collected line still uses the old + indentation value or a temporary indentation value is active. + + -- Request: .ll [length] + -- Request: .ll +length + -- Request: .ll -length + -- Register: \n[.l] + -- Register: \n[.ll] + Set the line length to LENGTH (or increment or decrement the + current value by LENGTH). Initially, the line length is set to + 6.5i. The effect of 'll' is delayed until a partially collected + line (if it exists) is output. The default scaling unit is 'm'. + + If 'll' is called without an argument, the line length is reset to + the previous value before the last call to 'll'. If a negative + line length is specified (which is not allowed), 'gtroff' emits a + warning in category 'range' and sets the line length to zero. The + line length is associated with the environment (*note + Environments::). + + The current line length (as set by 'll') can be found in the + read-only register '.l'. The read-only register '.ll' is the line + length that applies to the current output line. + + Similar to '.i' and '.in', the difference between '.l' and '.ll' is + that the latter takes into account whether a partially collected + line still uses the old line length value. + + +File: groff.info, Node: Line Continuation, Next: Page Layout, Prev: Line Layout, Up: GNU troff Reference + +5.16 Line Continuation +====================== + +When filling is enabled, input and output line breaks generally do not +correspond. The 'roff' language therefore distinguishes input and +output line continuation. + + -- Escape sequence: \ + '\' (a backslash immediately followed by a newline) suppresses + the effects of that newline in the input. The next input line thus + retains the classification of its predecessor as a control or text + line. '\' is useful for managing line lengths in the input + during document maintenance; you can break an input line in the + middle of a request invocation, macro call, or escape sequence. + Input line continuation is invisible to the formatter, with two + exceptions: the '|' operator recognizes the new input line (*note + Numeric Expressions::), and the input line counter register '.c' is + incremented. + + .ll 50n + .de I + . ft I + . nop \\$* + . ft + .. + Our film class watched + .I The Effect of Gamma Rays on Man-in-the-Moon + Marigolds. \" whoops, the input line wrapped + .br + .I My own opus begins on line \n[.c] \ + and ends on line \n[.c]. + => Our film class watched The Effect of Gamma Rays on + => Man-in-the-Moon Marigolds. + => My own opus begins on line 11 and ends on line 12. + + -- Escape sequence: \c + -- Register: \n[.int] + '\c' continues an output line. Nothing after it on the input line + is formatted. In contrast to '\', a line after '\c' remains a + new input line, so a control character is recognized at its + beginning. The visual results depend on whether filling is + enabled; see *note Manipulating Filling and Adjustment::. + + * If filling is enabled, a word interrupted with '\c' is + continued with the text on the next input text line, without + an intervening space. + + This is a te\c + st. + => This is a test. + + * If filling is disabled, the next input text line after '\c' is + handled as a continuation of the same input text line. + + .nf + This is a \c + test. + => This is a test. + + An intervening control line that causes a break overrides '\c', + flushing out the pending output line in the usual way. + + The '.int' register contains a positive value if the last output + line was continued with '\c'; this datum is associated with the + environment (*note Environments::).(1) (*note Line + Continuation-Footnote-1::) + + +File: groff.info, Node: Line Continuation-Footnotes, Up: Line Continuation + + (1) Historically, the '\c' escape sequence has proven challenging to +characterize. Some sources say it "connects the next input text" (to +the input line on which it appears); others describe it as +"interrupting" text, on the grounds that a text line is interrupted +without breaking, perhaps to inject a request invocation or macro call. + + +File: groff.info, Node: Page Layout, Next: Page Control, Prev: Line Continuation, Up: GNU troff Reference + +5.17 Page Layout +================ + +The formatter permits configuration of the page length and page number. + + -- Request: .pl [length] + -- Request: .pl +length + -- Request: .pl -length + -- Register: \n[.p] + Change (increase or decrease) the page length per the numeric + expression LENGTH. The default scaling unit is 'v'. A negative + LENGTH is valid, but an uncommon application: it prevents page + location traps from being sprung,(1) (*note Page + Layout-Footnote-1::) and each output line is placed on a new page. + If LENGTH is invalid, GNU 'troff' emits a warning in category + 'number'. If LENGTH is absent or invalid, '11i' is assumed. + + The read-only register '.p' interpolates the current page length. + + -- Request: .pn num + -- Request: .pn +num + -- Request: .pn -num + -- Register: \n[.pn] + Change (increase or decrease) the page number of the _next_ page + per the numeric expression NUM. If NUM is invalid, GNU 'troff' + emits a warning in category 'number' and ignores the request. + Without an argument, 'pn' is ignored. + + The read-only register '.pn' interpolates NUM if set by 'pn' on the + current page, or the current page number plus 1. + + The formatter offers special support for typesetting headers and +footers, collectively termed "titles". Titles have an independent line +length, and their placement on the page is not restricted. + + -- Request: .tl 'left'center'right' + Format an output line as a title consisting of LEFT, CENTER, and + RIGHT, each aligned accordingly. The delimiter need not be a + neutral apostrophe: 'tl' accepts the same delimiters as most escape + sequences; see *note Delimiters::. If not used as the delimiter, + any "page number character" character is replaced with the current + page number; the default is '%'; see the the 'pc' request below. + Without an argument, 'tl' is ignored. 'tl' writes the title line + immediately, ignoring any partially collected line. + + It is not an error to omit delimiters after the first. For + example, '.tl /Thesis' is interpreted as '.tl /Thesis///': it sets + a title line comprising only the left-aligned word 'Thesis'. + + -- Request: .lt [length] + -- Request: .lt +length + -- Request: .lt -length + -- Register: \n[.lt] + Change (increase or decrease) the line length used by titles per + the numeric expression LENGTH. The default scaling unit is 'm'. + If LENGTH is negative, GNU emits a warning in category 'range' and + treats LENGTH as '0'. If LENGTH is invalid, GNU 'troff' emits a + warning in category 'number' and ignores the request. The + formatter's default title length is '6.5i'. With no argument, the + title length is restored to the previous value. The title length + is is associated with the environment (*note Environments::). + + The read-only register '.lt' interpolates the title line length. + + -- Request: .pc [char] + Set the page number character to CHAR. With no argument, the page + number character is disabled. 'pc' does not affect the + register '%'. + + The following example exercises title features. + + .lt 50n + This is my partially collected + .tl 'Isomers 2023'%'Dextrose Edition' + line. + => Isomers 2023 1 Dextrose Edition + => This is my partially collected line. + + We most often see titles used in page header and footer traps. *Note +Traps::. + + +File: groff.info, Node: Page Layout-Footnotes, Up: Page Layout + + (1) *Note Traps::. + + +File: groff.info, Node: Page Control, Next: Using Fonts, Prev: Page Layout, Up: GNU troff Reference + +5.18 Page Control +================= + +Discretionary page breaks can prevent the unwanted separation of +content. A new page number takes effect during page ejection; see *note +The Implicit Page Trap::. + + -- Request: .bp [page-number] + -- Request: .bp +page-number + -- Request: .bp -page-number + -- Register: \n[%] + Break the page and change (increase or decrease) the next page + number per the numeric expression PAGE-NUMBER. If PAGE-NUMBER is + invalid, GNU 'troff' emits a warning in category 'number' and + ignores the argument. This request causes a break. A page break + advances the vertical drawing position to the bottom of the page, + springing traps. *Note Page Location Traps::. 'bp' has effect + only if invoked within the top-level diversion.(1) (*note Page + Control-Footnote-1::) This request is incorrectly documented in the + AT&T 'troff' manual as having a default scaling unit of 'v'. + + The register '%' interpolates the current page number. + + .de BP + ' bp \" schedule page break once current line is output + .. + + -- Request: .ne [space] + Force a page break if insufficient vertical space is available + (assert "needed" space). 'ne' tests the distance to the next page + location trap; see *note Page Location Traps::, and breaks the page + if that amount is less than SPACE. The default scaling unit is + 'v'. If SPACE is invalid, GNU 'troff' emits a warning in category + 'number' and ignores the argument. If SPACE is not specified, '1v' + is assumed. + + We can require space for at least the first two output lines of a + paragraph, preventing its first line from being widowed at the page + bottom. + + .ne 2v + Considering how common illness is, + how tremendous the spiritual change that it brings, + how astonishing, + when the lights of health go down, + the undiscovered countries that are then disclosed, + what wastes and deserts of the soul a slight attack + of influenza brings to view, + + This method is reliable only if no output line is pending when 'ne' + is invoked. When macro packages are used, this is often not the + case: their paragraphing macros perform the break. You may need to + experiment with placing the 'ne' after the paragraphing macro, or + 'br' and 'ne' before it. + + 'ne' is also useful to force grouping of section headings with + their subsequent paragraphs, or tables with their captions and/or + explanations. Macro packages often use 'ne' with diversions to + implement keeps and displays; see *note Diversions::. They may + also offer parameters for widow and orphan management. + + -- Request: .sv [space] + -- Request: .os + Require vertical space as 'ne' does, but also save it for later + output by the 'os' request. If SPACE is available before the next + page location trap, it is output immediately. Both requests ignore + a partially collected line, taking effect at the next break. 'sv' + and 'os' ignore no-space mode (recall *note Manipulating + Spacing::). While the 'sv' request allows negative values for + SPACE, 'os' ignores them. The default scaling unit is 'v'. If + SPACE is not specified, '1v' is assumed. + + -- Register: \n[nl] + 'nl' interpolates or sets the vertical drawing position. When the + formatter starts, the first page transition hasn't happened yet, + and 'nl' is negative. If a header trap has been planted on the + page (typically at vertical position '0'), you can assign a + negative value to 'nl' to spring it if that page has already + started (*note Page Location Traps::). + + .de HD + . sp + . tl ''Goldbach Solution'' + . sp + .. + . + First page. + .bp + .wh 0 HD \" plant header trap at top of page + .nr nl (-1) + Second page. + => First page. + => + => (blank lines elided) + => + => Goldbach Solution + => + => (blank lines elided) + => + => Second page. + + Without resetting 'nl' to a negative value, the trap just planted + would be active beginning with the _next_ page, not the current + one. + + *Note Diversions::, for a comparison of 'nl' with the '.h' and '.d' + registers. + + +File: groff.info, Node: Page Control-Footnotes, Up: Page Control + + (1) *Note Diversions::. + + +File: groff.info, Node: Using Fonts, Next: Manipulating Type Size and Vertical Spacing, Prev: Page Control, Up: GNU troff Reference + +5.19 Using Fonts +================ + +In digital typography, a "font" is a collection of characters in a +specific typeface that a device can render as glyphs at a desired +size.(1) (*note Using Fonts-Footnote-1::) A 'roff' formatter can change +typefaces at any point in the text. The basic faces are a set of +"styles" combining upright and slanted shapes with normal and heavy +stroke weights: 'R', 'I', 'B', and 'BI'--these stand for roman, italic, +bold, and bold-italic. For linguistic text, GNU 'troff' groups +typefaces into "families" containing each of these styles.(2) (*note +Using Fonts-Footnote-2::) A "text font" is thus often a family combined +with a style, but it need not be: consider the 'ps' and 'pdf' devices' +'ZCMI' (Zapf Chancery Medium italic)--often, no other style of Zapf +Chancery Medium is provided. On typesetting devices, at least one +"special font" is available, comprising "unstyled" glyphs for +mathematical operators and other purposes. + + Like AT&T 'troff', GNU 'troff' does not itself load or manipulate a +digital font file;(3) (*note Using Fonts-Footnote-3::) instead it works +with a "font description file" that characterizes it, including its +glyph repertoire and the "metrics" (dimensions) of each glyph.(4) +(*note Using Fonts-Footnote-4::) This information permits the formatter +to accurately place glyphs with respect to each other. Before using a +font description, the formatter associates it with a "mounting +position", a place in an ordered list of available typefaces. So that a +document need not be strongly coupled to a specific font family, in GNU +'troff' an output device can associate a style in the abstract sense +with a mounting position. Thus the default family can be combined with +a style dynamically, producing a "resolved font name". + + Fonts often have trademarked names, and even Free Software fonts can +require renaming upon modification. 'groff' maintains a convention that +a device's serif font family is given the name 'T' ("Times"), its +sans-serif family 'H' ("Helvetica"), and its monospaced family 'C' +("Courier"). Historical inertia has driven 'groff''s font identifiers +to short uppercase abbreviations of font names, as with 'TR', 'TI', +'TB', 'TBI', and a special font 'S'. + + The default family used with abstract styles can be changed at any +time; initially, it is 'T'. Typically, abstract styles are arranged in +the first four mounting positions in the order shown above. The default +mounting position, and therefore style, is always '1' ('R'). By issuing +appropriate formatter instructions, you can override these defaults +before your document writes its first glyph. + + Terminal output devices cannot change font families and lack special +fonts. They support style changes by overstriking, or by altering +ISO 6429/ECMA-48 "graphic renditions" (character cell attributes). + +* Menu: + +* Selecting Fonts:: +* Font Families:: +* Font Positions:: +* Using Symbols:: +* Character Classes:: +* Special Fonts:: +* Artificial Fonts:: +* Ligatures and Kerning:: +* Italic Corrections:: +* Dummy Characters:: + + +File: groff.info, Node: Using Fonts-Footnotes, Up: Using Fonts + + (1) Terminals and some output devices have fonts that render at only +one or two sizes. As examples of the latter, take the 'groff' 'lj4' +device's Lineprinter, and 'lbp''s Courier and Elite faces. + + (2) Font designers prepare families such that the styles share +esthetic properties. + + (3) Historically, the fonts 'troff's dealt with were not Free +Software or, as with the Graphic Systems C/A/T, did not even exist in +the digital domain. + + (4) *Note Font Description File Format::. + diff --git a/doc/groff.info-2 b/doc/groff.info-2 new file mode 100644 index 0000000..44572a0 --- /dev/null +++ b/doc/groff.info-2 @@ -0,0 +1,7529 @@ +This is groff.info, produced by makeinfo version 7.0.3 from groff.texi. + +This manual documents GNU 'troff' version 1.23.0. + + Copyright © 1994-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". +INFO-DIR-SECTION Typesetting +START-INFO-DIR-ENTRY +* Groff: (groff). The GNU roff document formatting system. +END-INFO-DIR-ENTRY + + +File: groff.info, Node: Selecting Fonts, Next: Font Families, Prev: Using Fonts, Up: Using Fonts + +5.19.1 Selecting Fonts +---------------------- + +We use "font" to refer to any of several means of identifying a font: by +mounting position ('3'), by abstract style ('B'), or by its identifier +('TB'). + + -- Request: .ft [font] + -- Escape sequence: \ff + -- Escape sequence: \f(fn + -- Escape sequence: \f[font] + -- Register: \n[.fn] + The 'ft' request selects the typeface FONT. If the argument is + absent or 'P', it selects the previously chosen font. If FONT is a + non-negative integer, it is interpreted as mounting position; the + font mounted there is selected. If that position refers to an + abstract style, it is combined with the default family (see 'fam' + and '\F' below) to make a resolved font name. If the mounting + position is not a style and no font is mounted there, GNU 'troff' + emits a warning in category 'font' and ignores the request. + + If FONT matches a style name, it is combined with the current + family to make a resolved font name. Otherwise, FONT is assumed to + already be a resolved font name. + + The resolved font name is subject to translation (see request 'ftr' + below). Next, the (possibly translated) font name's mounting + position is looked up; if not mounted, FONT is sought on the file + system as a font description file and, if located, automatically + mounted at the next available position (see register '.fp' below). + If the font was mounted using an identifier different from its font + description file name (see request 'fp' below), that file name is + then looked up. If a font description file for the resolved font + name is not found, GNU 'troff' emits a warning in category 'font' + and ignores the request. + + The '\f' escape sequence is similar, using one-character name (or + mounting position) F, two-character name FN, or a name FONT of + arbitrary length. '\f[]' selects the previous font. The syntax + form '\fP' is supported for backward compatibility, and '\f[P]' for + consistency. + + eggs, bacon, + .ft I + spam, + .ft + and sausage. + .br + eggs, bacon, \fIspam,\fP and sausage. + => eggs, bacon, spam, and sausage + => eggs, bacon, spam, and sausage + + The current and previously selected fonts are properties of the + environment (*note Environments::). + + The read-only string-valued register '.fn' contains the resolved + font name of the selected font. + + '\f' doesn't produce an input token in GNU 'troff'; it thus can be + used in requests that expect a single-character argument. We can + assign a font to a margin character as follows (*note + Miscellaneous::). + + .mc \f[I]x\f[] + + -- Request: .ftr f [g] + Translate font F to font G. Whenever a font named F is referred to + in a '\f' escape sequence, in the 'F' and 'S' conditional + operators, or in the 'ft', 'ul', 'bd', 'cs', 'tkf', 'special', + 'fspecial', 'fp', or 'sty' requests, font G is used. If G is + missing or equal to F the translation is undone. + + Font translations cannot be chained. + + .ftr XXX TR + .ftr XXX YYY + .ft XXX + error-> warning: can't find font 'XXX' + + -- Request: .fzoom f [zoom] + -- Register: \n[.zoom] + Set magnification of font F to factor ZOOM, which must be a + non-negative integer multiple of 1/1000th. This request is useful + to adjust the optical size of a font in relation to the others. In + the example below, font 'CR' is magnified by 10% (the zoom factor + is thus 1.1). + + .fam P + .fzoom CR 1100 + .ps 12 + Palatino and \f[CR]Courier\f[] + + A missing or zero value of ZOOM is the same as a value of 1000, + which means no magnification. F must be a resolved font name, not + an abstract style. + + The magnification of a font is completely transparent to GNU + 'troff'; a change of the zoom factor doesn't cause any effect + except that the dimensions of glyphs, (word) spaces, kerns, etc., + of the affected font are adjusted accordingly. + + The zoom factor of the current font is available in the read-only + register '.zoom', in multiples of 1/1000th. It returns zero if + there is no magnification. + + +File: groff.info, Node: Font Families, Next: Font Positions, Prev: Selecting Fonts, Up: Using Fonts + +5.19.2 Font Families +-------------------- + +To accommodate the wide variety of fonts available, GNU 'troff' +distinguishes "font families" and "font styles". A resolved font name +is the catenation of a font family and a style. Selecting an abstract +style causes GNU 'troff' to combine it with the default font family. + + You can thus compose a document using abstract styles exclusively for +its body or running text, selecting a specific family only for titles or +examples, for instance, and change the default family on the command +line (recall *note Groff Options::). + + Fonts for the devices 'ps', 'pdf', 'dvi', 'lj4', 'lbp', and the X11 +devices support this mechanism. By default, GNU 'troff' uses the Times +family with the four styles 'R', 'I', 'B', and 'BI'. + + -- Request: .fam [family] + -- Register: \n[.fam] + -- Escape sequence: \Ff + -- Escape sequence: \F(fm + -- Escape sequence: \F[family] + Set the default font family, used in combination with abstract + styles to construct a resolved font name, to FAMILY (one-character + name F, two-character name FM). If no argument is given, GNU + 'troff' selects the previous font family; if there none, is it + falls back to the device's default(1) (*note Font + Families-Footnote-1::) or its own ('T'). + + The '\F' escape sequence works similarly. In disanalogy to '\f', + '\FP' makes 'P' the default family. Use '\F[]' to select the + previous default family. The default font family is available in + the read-only string-valued register '.fam'; it is associated with + the environment (*note Environments::). + + spam, \" startup defaults are T (Times) R (roman) + .fam H \" make Helvetica the default family + spam, \" family H + style R = HR + .ft B \" family H + style B = HB + spam, + .ft CR \" Courier roman (default family not changed) + spam, + .ft \" back to Helvetica bold + spam, + .fam T \" make Times the default family + spam, \" family T + style B = TB + .ft AR \" font AR (not a style) + baked beans, + .ft R \" family T + style R = TR + and spam. + + '\F' doesn't produce an input token in GNU 'troff'. As a + consequence, it can be used in requests like 'mc' (which expects a + single character as an argument) to change the font family on the + fly. + + .mc \F[P]x\F[] + + -- Request: .sty n style + -- Register: \n[.sty] + Associate an abstract style STYLE with mounting position N, which + must be a non-negative integer. If the requests 'cs', 'bd', 'tkf', + 'uf', or 'fspecial' are applied to an abstract style, they are + instead applied to the member of the current family corresponding + to that style. + + The default family can be set with the '-f' option (*note Groff + Options::). The 'styles' command in the 'DESC' file controls which + font positions (if any) are initially associated with abstract + styles rather than fonts. + + *Caution:* The STYLE argument is not validated. Errors may occur + later, when the formatter attempts to construct a resolved font + name, or format a character for output. + + .nr BarPos \n[.fp] + .sty \n[.fp] Bar + .fam Foo + .ft \n[BarPos] + .tm .f=\n[.f] + A + error-> error: no font family named 'Foo' exists + error-> .f=41 + error-> error: cannot format glyph: no current font + + When an abstract style has been selected, the read-only + string-valued register '.sty' interpolates its name; this datum is + associated with the environment (*note Environments::). Otherwise, + '.sty' interpolates nothing. + + +File: groff.info, Node: Font Families-Footnotes, Up: Font Families + + (1) *Note DESC File Format::. + + +File: groff.info, Node: Font Positions, Next: Using Symbols, Prev: Font Families, Up: Using Fonts + +5.19.3 Font Positions +--------------------- + +To support typeface indirection through abstract styles, and for +compatibility with AT&T 'troff', the formatter maintains a list of font +"positions" at which fonts required by a document are "mounted". An +output device's description file 'DESC' typically configures a set of +pre-mounted fonts; see *note Device and Font Description Files::. A +font need not be explicitly mounted before it is selected; GNU 'troff' +will search 'GROFF_FONT_PATH' for it by name and mount it at the first +free mounting position on demand. + + -- Request: .fp pos id [font-description-file-name] + -- Register: \n[.f] + -- Register: \n[.fp] + Mount a font under the name ID at mounting position POS, a + non-negative integer. When the formatter starts up, it reads the + output device's description to mount an initial set of faces, and + selects font position 1. Position 0 is unused by default. Unless + the FONT-DESCRIPTION-FILE-NAME argument is given, ID should be the + name of a font description file stored in a directory corresponding + to the selected output device. GNU 'troff' does not traverse + directories to locate the font description file. + + The optional third argument enables font names to be aliased, which + can be necessary in compatibility mode since AT&T 'troff' syntax + affords no means of identifying fonts with names longer than two + characters, like 'TBI' or 'ZCMI', in a font selection escape + sequence. *Note Compatibility Mode::. You can also alias fonts on + mounting for convenience or abstraction. (See below regarding the + '.fp' register.) + + .fp \n[.fp] SC ZCMI + Send a \f(SChand-written\fP thank-you note. + .fp \n[.fp] Emph TI + .fp \n[.fp] Strong TB + Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]? + + 'DESC', 'P', and non-negative integers are not usable as font + identifiers. + + The position of the currently selected font (or abstract style) is + available in the read-only register '.f'. It is associated with + the environment (*note Environments::). + + You can copy the value of '.f' to another register to save it for + later use. + + .nr saved-font \n[.f] + ... text involving many font changes ... + .ft \n[saved-font] + + The index of the next (non-zero) free font position is available in + the read-only register '.fp'. Fonts not listed in the 'DESC' file + are automatically mounted at position '\n[.fp]' when selected with + the 'ft' request or '\f' escape sequence. When mounting a font at + a position explicitly with the 'fp' request, this same practice + should be followed, although GNU 'troff' does not enforce this + strictly. + + +File: groff.info, Node: Using Symbols, Next: Character Classes, Prev: Font Positions, Up: Using Fonts + +5.19.4 Using Symbols +-------------------- + +A "glyph" is a graphical representation of a "character". While a +character is an abstraction of semantic information, a glyph is +something that can be seen on screen or paper. A character has many +possible representation forms (for example, the character 'A' can be +written in an upright or slanted typeface, producing distinct glyphs). +Sometimes, a sequence of characters map to a single glyph: this is a +"ligature"--the most common is 'fi'. + + Space characters never become glyphs in GNU 'troff'. If not +discarded (as when trailing on text lines), they are represented by +horizontal motions in the output. + + A "symbol" is simply a named glyph. Within 'gtroff', all glyph names +of a particular font are defined in its font file. If the user requests +a glyph not available in this font, 'gtroff' looks up an ordered list of +"special fonts". By default, the PostScript output device supports the +two special fonts 'SS' (slanted symbols) and 'S' (symbols) (the former +is looked up before the latter). Other output devices use different +names for special fonts. Fonts mounted with the 'fonts' keyword in the +'DESC' file are globally available. To install additional special fonts +locally (i.e., for a particular font), use the 'fspecial' request. + + Here are the exact rules how 'gtroff' searches a given symbol: + + * If the symbol has been defined with the 'char' request, use it. + This hides a symbol with the same name in the current font. + + * Check the current font. + + * If the symbol has been defined with the 'fchar' request, use it. + + * Check whether the current font has a font-specific list of special + fonts; test all fonts in the order of appearance in the last + 'fspecial' call if appropriate. + + * If the symbol has been defined with the 'fschar' request for the + current font, use it. + + * Check all fonts in the order of appearance in the last 'special' + call. + + * If the symbol has been defined with the 'schar' request, use it. + + * As a last resort, consult all fonts loaded up to now for special + fonts and check them, starting with the lowest font number. This + can sometimes lead to surprising results since the 'fonts' line in + the 'DESC' file often contains empty positions, which are filled + later on. For example, consider the following: + + fonts 3 0 0 FOO + + This mounts font 'foo' at font position 3. We assume that 'FOO' is + a special font, containing glyph 'foo', and that no font has been + loaded yet. The line + + .fspecial BAR BAZ + + makes font 'BAZ' special only if font 'BAR' is active. We further + assume that 'BAZ' is really a special font, i.e., the font + description file contains the 'special' keyword, and that it also + contains glyph 'foo' with a special shape fitting to font 'BAR'. + After executing 'fspecial', font 'BAR' is loaded at font + position 1, and 'BAZ' at position 2. + + We now switch to a new font 'XXX', trying to access glyph 'foo' + that is assumed to be missing. There are neither font-specific + special fonts for 'XXX' nor any other fonts made special with the + 'special' request, so 'gtroff' starts the search for special fonts + in the list of already mounted fonts, with increasing font + positions. Consequently, it finds 'BAZ' before 'FOO' even for + 'XXX', which is not the intended behaviour. + + *Note Device and Font Description Files::, and *note Special Fonts::, +for more details. + + The 'groff_char(7)' man page houses a complete list of predefined +special character names, but the availability of any as a glyph is +device- and font-dependent. For example, say + + man -Tdvi groff_char > groff_char.dvi + +to obtain those available with the DVI device and default font +configuration.(1) (*note Using Symbols-Footnote-1::) If you want to use +an additional macro package to change the fonts used, 'groff' (or +'gtroff') must be run directly. + + groff -Tdvi -mec -man groff_char.7 > groff_char.dvi + + Special character names not listed in 'groff_char(7)' are derived +algorithmically, using a simplified version of the Adobe Glyph List +(AGL) algorithm, which is described in +. The (frozen) set of +names that can't be derived algorithmically is called the "'groff' glyph +list (GGL)". + + * A glyph for Unicode character U+XXXX[X[X]], which is not a + composite character is named 'uXXXX[X[X]]'. X must be an uppercase + hexadecimal digit. Examples: 'u1234', 'u008E', 'u12DB8'. The + largest Unicode value is 0x10FFFF. There must be at least four 'X' + digits; if necessary, add leading zeroes (after the 'u'). No zero + padding is allowed for character codes greater than 0xFFFF. + Surrogates (i.e., Unicode values greater than 0xFFFF represented + with character codes from the surrogate area U+D800-U+DFFF) are not + allowed either. + + * A glyph representing more than a single input character is named + + 'u' COMPONENT1 '_' COMPONENT2 '_' COMPONENT3 ... + + Example: 'u0045_0302_0301'. + + For simplicity, all Unicode characters that are composites must be + maximally decomposed to NFD;(2) (*note Using Symbols-Footnote-2::) + for example, 'u00CA_0301' is not a valid glyph name since U+00CA + (LATIN CAPITAL LETTER E WITH CIRCUMFLEX) can be further decomposed + into U+0045 (LATIN CAPITAL LETTER E) and U+0302 (COMBINING + CIRCUMFLEX ACCENT). 'u0045_0302_0301' is thus the glyph name for + U+1EBE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE. + + * groff maintains a table to decompose all algorithmically derived + glyph names that are composites itself. For example, 'u0100' + (LATIN LETTER A WITH MACRON) is automatically decomposed into + 'u0041_0304'. Additionally, a glyph name of the GGL is preferred + to an algorithmically derived glyph name; 'groff' also + automatically does the mapping. Example: The glyph 'u0045_0302' is + mapped to '^E'. + + * glyph names of the GGL can't be used in composite glyph names; for + example, '^E_u0301' is invalid. + + -- Escape sequence: \(nm + -- Escape sequence: \[name] + -- Escape sequence: \[base-glyph combining-component ...] + Typeset a special character NAME (two-character name NM) or a + composite glyph consisting of BASE-GLYPH overlaid with one or more + COMBINING-COMPONENTs. For example, '\[A ho]' is a capital letter + "A" with a "hook accent" (ogonek). + + There is no special syntax for one-character names--the analogous + form '\N' would collide with other escape sequences. However, the + four escape sequences '\'', '\-', '\_', and '\`', are translated on + input to the special character escape sequences '\[aa]', '\[-]', + '\[ul]', and '\[ga]', respectively. + + A special character name of length one is not the same thing as an + ordinary character: that is, the character 'a' is not the same as + '\[a]'. + + If NAME is undefined, a warning in category 'char' is produced and + the escape is ignored. *Note Warnings::, for information about the + enablement and suppression of warnings. + + GNU 'troff' resolves '\[...]' with more than a single component as + follows: + + * Any component that is found in the GGL is converted to the + 'uXXXX' form. + + * Any component 'uXXXX' that is found in the list of + decomposable glyphs is decomposed. + + * The resulting elements are then concatenated with '_' in + between, dropping the leading 'u' in all elements but the + first. + + No check for the existence of any component (similar to 'tr' + request) is done. + + Examples: + + '\[A ho]' + 'A' maps to 'u0041', 'ho' maps to 'u02DB', thus the final + glyph name would be 'u0041_02DB'. This is not the expected + result: the ogonek glyph 'ho' is a spacing ogonek, but for a + proper composite a non-spacing ogonek (U+0328) is necessary. + Looking into the file 'composite.tmac', one can find + '.composite ho u0328', which changes the mapping of 'ho' while + a composite glyph name is constructed, causing the final glyph + name to be 'u0041_0328'. + + '\[^E u0301]' + '\[^E aa]' + '\[E a^ aa]' + '\[E ^ ']' + '^E' maps to 'u0045_0302', thus the final glyph name is + 'u0045_0302_0301' in all forms (assuming proper calls of the + 'composite' request). + + It is not possible to define glyphs with names like 'A ho' within a + 'groff' font file. This is not really a limitation; instead, you + have to define 'u0041_0328'. + + -- Escape sequence: \C'xxx' + Typeset the glyph of the special character XXX. Normally, it is + more convenient to use '\[XXX]', but '\C' has some advantages: it + is compatible with AT&T device-independent 'troff' (and therefore + available in compatibility mode(3) (*note Using + Symbols-Footnote-3::)) and can interpolate special characters with + ']' in their names. The delimiter need not be a neutral + apostrophe; see *note Delimiters::. + + -- Request: .composite id1 id2 + Map special character name ID1 to ID2 if ID1 is used in '\[...]' + with more than one component. See above for examples. This is a + strict rewriting of the special character name; no check is + performed for the existence of a glyph for either. A set of + default mappings for many accents can be found in the file + 'composite.tmac', loaded by the default 'troffrc' at startup. + + -- Escape sequence: \N'n' + Typeset the glyph with code N in the current font ('n' is _not_ the + input character code). The number N can be any non-negative + decimal integer. Most devices only have glyphs with codes between + 0 and 255; the Unicode output device uses codes in the range + 0-65535. If the current font does not contain a glyph with that + code, special fonts are _not_ searched. The '\N' escape sequence + can be conveniently used in conjunction with the 'char' request: + + .char \[phone] \f[ZD]\N'37' + + The code of each glyph is given in the fourth column in the font + description file after the 'charset' command. It is possible to + include unnamed glyphs in the font description file by using a name + of '---'; the '\N' escape sequence is the only way to use these. + + No kerning is applied to glyphs accessed with '\N'. The delimiter + need not be a neutral apostrophe; see *note Delimiters::. + + A few escape sequences are also special characters. + + -- Escape sequence: \' + An escaped neutral apostrophe is a synonym for '\[aa]' (acute + accent). + + -- Escape sequence: \` + An escaped grave accent is a synonym for '\[ga]' (grave accent). + + -- Escape sequence: \- + An escaped hyphen-minus is a synonym for '\[-]' (minus sign). + + -- Escape sequence: \_ + An escaped underscore ("low line") is a synonym for '\[ul]' + (underrule). On typesetting devices, the underrule is + font-invariant and drawn lower than the underscore '_'. + + -- Request: .cflags n c1 c2 ... + Assign properties encoded by the number N to characters C1, C2, and + so on. + + Input characters, including special characters introduced by an + escape, have certain properties associated with them.(4) (*note + Using Symbols-Footnote-4::) These properties can be modified with + this request. The first argument is the sum of the desired flags + and the remaining arguments are the characters to be assigned those + properties. Spaces between the CN arguments are optional. Any + argument CN can be a character class defined with the 'class' + request rather than an individual character. *Note Character + Classes::. + + The non-negative integer N is the sum of any of the following. + Some combinations are nonsensical, such as '33' (1 + 32). + + '1' + Recognize the character as ending a sentence if followed by a + newline or two spaces. Initially, characters '.?!' have this + property. + + '2' + Enable breaks before the character. A line is not broken at a + character with this property unless the characters on each + side both have non-zero hyphenation codes. This exception can + be overridden by adding 64. Initially, no characters have + this property. + + '4' + Enable breaks after the character. A line is not broken at a + character with this property unless the characters on each + side both have non-zero hyphenation codes. This exception can + be overridden by adding 64. Initially, characters + '\-\[hy]\[em]' have this property. + + '8' + Mark the glyph associated with this character as overlapping + other instances of itself horizontally. Initially, characters + '\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]' have this property. + + '16' + Mark the glyph associated with this character as overlapping + other instances of itself vertically. Initially, the + character '\[br]' has this property. + + '32' + Mark the character as transparent for the purpose of + end-of-sentence recognition. In other words, an + end-of-sentence character followed by any number of characters + with this property is treated as the end of a sentence if + followed by a newline or two spaces. This is the same as + having a zero space factor in TeX. Initially, characters + '"')]*\[dg]\[dd]\[rq]\[cq]' have this property. + + '64' + Ignore hyphenation codes of the surrounding characters. Use + this in combination with values 2 and 4 (initially, no + characters have this property). + + For example, if you need an automatic break point after the + en-dash in numeric ranges like "3000-5000", insert + + .cflags 68 \[en] + + into your document. However, this practice can lead to bad + layout if done thoughtlessly; in most situations, a better + solution instead of changing the 'cflags' value is to insert + '\:' right after the hyphen at the places that really need a + break point. + + The remaining values were implemented for East Asian language + support; those who use alphabetic scripts exclusively can disregard + them. + + '128' + Prohibit a line break before the character, but allow a line + break after the character. This works only in combination + with flags 256 and 512 and has no effect otherwise. + Initially, no characters have this property. + + '256' + Prohibit a line break after the character, but allow a line + break before the character. This works only in combination + with flags 128 and 512 and has no effect otherwise. + Initially, no characters have this property. + + '512' + Allow line break before or after the character. This works + only in combination with flags 128 and 256 and has no effect + otherwise. Initially, no characters have this property. + + In contrast to values 2 and 4, the values 128, 256, and 512 work + pairwise. If, for example, the left character has value 512, and + the right character 128, no break will be automatically inserted + between them. If we use value 6 instead for the left character, a + break after the character can't be suppressed since the neighboring + character on the right doesn't get examined. + + -- Request: .char c [contents] + -- Request: .fchar c [contents] + -- Request: .fschar f c [contents] + -- Request: .schar c [contents] + Define a new character or glyph C to be CONTENTS, which can be + empty. More precisely, 'char' defines a 'groff' object (or + redefines an existing one) that is accessed with the name C on + input, and produces CONTENTS on output. Every time glyph C needs + to be printed, CONTENTS is processed in a temporary environment and + the result is wrapped up into a single object. Compatibility mode + is turned off and the escape character is set to '\' while CONTENTS + is processed. Any emboldening, constant spacing, or track kerning + is applied to this object rather than to individual glyphs in + CONTENTS. + + An object defined by these requests can be used just like a normal + glyph provided by the output device. In particular, other + characters can be translated to it with the 'tr' or 'trin' + requests; it can be made the leader character with the 'lc' + request; repeated patterns can be drawn with it using the '\l' and + '\L' escape sequences; and words containing C can be hyphenated + correctly if the 'hcode' request is used to give the object a + hyphenation code. + + There is a special anti-recursion feature: use of the object within + its own definition is handled like a normal character (not defined + with 'char'). + + The 'tr' and 'trin' requests take precedence if 'char' accesses the + same symbol. + + .tr XY + X + => Y + .char X Z + X + => Y + .tr XX + X + => Z + + The 'fchar' request defines a fallback glyph: 'gtroff' only checks + for glyphs defined with 'fchar' if it cannot find the glyph in the + current font. 'gtroff' carries out this test before checking + special fonts. + + 'fschar' defines a fallback glyph for font F: 'gtroff' checks for + glyphs defined with 'fschar' after the list of fonts declared as + font-specific special fonts with the 'fspecial' request, but before + the list of fonts declared as global special fonts with the + 'special' request. + + Finally, the 'schar' request defines a global fallback glyph: + 'gtroff' checks for glyphs defined with 'schar' after the list of + fonts declared as global special fonts with the 'special' request, + but before the already mounted special fonts. + + *Note Character Classes::. + + -- Request: .rchar c ... + -- Request: .rfschar f c ... + Remove definition of each ordinary or special character C, undoing + the effect of a 'char', 'fchar', or 'schar' request. Those + supplied by font description files cannot be removed. Spaces and + tabs may separate C arguments. + + The request 'rfschar' removes glyph definitions defined with + 'fschar' for font F. + + +File: groff.info, Node: Using Symbols-Footnotes, Up: Using Symbols + + (1) Not all versions of the 'man' program support the '-T' option; +use the subsequent example for an alternative. + + (2) This is "Normalization Form D" as documented in Unicode Standard +Annex #15 (). + + (3) *Note Compatibility Mode::. + + (4) Output glyphs don't--to GNU 'troff', a glyph is simply a box with +an index into a font, a given height above and depth below the baseline, +and a width. + + +File: groff.info, Node: Character Classes, Next: Special Fonts, Prev: Using Symbols, Up: Using Fonts + +5.19.5 Character Classes +------------------------ + +Classes are particularly useful for East Asian languages such as +Chinese, Japanese, and Korean, where the number of needed characters is +much larger than in European languages, and where large sets of +characters share the same properties. + + -- Request: .class name c1 c2 ... + Define a character class (or simply "class") NAME comprising the + characters C1, C2, and so on. + + A class thus defined can then be referred to in lieu of listing all + the characters within it. Currently, only the 'cflags' request can + handle references to character classes. + + In the request's simplest form, each CN is a character (or special + character). + + .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq] + + Since class and glyph names share the same name space, it is + recommended to start and end the class name with '[' and ']', + respectively, to avoid collisions with existing character names + defined by GNU 'troff' or the user (with 'char' and related + requests). This practice applies the presence of ']' in the class + name to prevent the use of the special character escape form + '\[...]', thus you must use the '\C' escape to access a class with + such a name. + + You can also use a character range notation consisting of a start + character followed by '-' and then an end character. Internally, + GNU 'troff' converts these two symbol names to Unicode code points + (according to the 'groff' glyph list [GGL]), which then give the + start and end value of the range. If that fails, the class + definition is skipped. + + Furthermore, classes can be nested. + + .class [prepunct] , : ; > } + .class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016] + + The class '[prepunctx]' thus contains the contents of the class + '[prepunct]' as defined above (the set ', : ; > }'), and characters + in the range between 'U+2013' and 'U+2016'. + + If you want to include '-' in a class, it must be the first + character value in the argument list, otherwise it gets + misinterpreted as part of the range syntax. + + It is not possible to use class names as end points of range + definitions. + + A typical use of the 'class' request is to control line-breaking + and hyphenation rules as defined by the 'cflags' request. For + example, to inhibit line breaks before the characters belonging to + the 'prepunctx' class defined in the previous example, you can + write the following. + + .cflags 2 \C'[prepunctx]' + + See the 'cflags' request in *note Using Symbols::, for more + details. + + +File: groff.info, Node: Special Fonts, Next: Artificial Fonts, Prev: Character Classes, Up: Using Fonts + +5.19.6 Special Fonts +-------------------- + +Special fonts are those that 'gtroff' searches when it cannot find the +requested glyph in the current font. The Symbol font is usually a +special font. + + 'gtroff' provides the following two requests to add more special +fonts. *Note Using Symbols::, for a detailed description of the glyph +searching mechanism in 'gtroff'. + + Usually, only non-TTY devices have special fonts. + + -- Request: .special [s1 s2 ...] + -- Request: .fspecial f [s1 s2 ...] + Use the 'special' request to define special fonts. Initially, this + list is empty. + + Use the 'fspecial' request to designate special fonts only when + font F is active. Initially, this list is empty. + + Previous calls to 'special' or 'fspecial' are overwritten; without + arguments, the particular list of special fonts is set to empty. + Special fonts are searched in the order they appear as arguments. + + All fonts that appear in a call to 'special' or 'fspecial' are + loaded. + + *Note Using Symbols::, for the exact search order of glyphs. + + +File: groff.info, Node: Artificial Fonts, Next: Ligatures and Kerning, Prev: Special Fonts, Up: Using Fonts + +5.19.7 Artificial Fonts +----------------------- + +There are a number of requests and escape sequences for artificially +creating fonts. These are largely vestiges of the days when output +devices did not have a wide variety of fonts, and when 'nroff' and +'troff' were separate programs. Most of them are no longer necessary in +GNU 'troff'. Nevertheless, they are supported. + + -- Escape sequence: \H'height' + -- Escape sequence: \H'+height' + -- Escape sequence: \H'-height' + -- Register: \n[.height] + Change (increment, decrement) the height of the current font, but + not the width. If HEIGHT is zero, restore the original height. + Default scaling unit is 'z'. + + The read-only register '.height' contains the font height as set by + '\H'. + + Currently, only the '-Tps' and '-Tpdf' devices support this + feature. + + '\H' doesn't produce an input token in GNU 'troff'. As a + consequence, it can be used in requests like 'mc' (which expects a + single character as an argument) to change the font on the fly: + + .mc \H'+5z'x\H'0' + + In compatibility mode, 'gtroff' behaves differently: If an + increment or decrement is used, it is always taken relative to the + current type size and not relative to the previously selected font + height. Thus, + + .cp 1 + \H'+5'test \H'+5'test + + prints the word 'test' twice with the same font height (five points + larger than the current font size). + + -- Escape sequence: \S'slant' + -- Register: \n[.slant] + Slant the current font by SLANT degrees. Positive values slant to + the right. Only integer values are possible. + + The read-only register '.slant' contains the font slant as set by + '\S'. + + Currently, only the '-Tps' and '-Tpdf' devices support this + feature. + + '\S' doesn't produce an input token in GNU 'troff'. As a + consequence, it can be used in requests like 'mc' (which expects a + single character as an argument) to change the font on the fly: + + .mc \S'20'x\S'0' + + This escape is incorrectly documented in the AT&T 'troff' manual; + the slant is always set to an absolute value. + + -- Request: .ul [lines] + The 'ul' request normally underlines subsequent lines if a TTY + output device is used. Otherwise, the lines are printed in italics + (only the term 'underlined' is used in the following). The single + argument is the quantity of input lines to be underlined; with no + argument, the next line is underlined. If LINES is zero or + negative, stop the effects of 'ul' (if it was active). Requests + and empty lines do not count for computing the number of underlined + input lines, even if they produce some output like 'tl'. Lines + inserted by macros (e.g., invoked by a trap) do count. + + At the beginning of 'ul', the current font is stored and the + underline font is activated. Within the span of a 'ul' request, it + is possible to change fonts, but after the last line affected by + 'ul' the saved font is restored. + + This number of lines still to be underlined is associated with the + environment (*note Environments::). The underline font can be + changed with the 'uf' request. + + The 'ul' request does not underline spaces. + + -- Request: .cu [lines] + The 'cu' request is similar to 'ul' but underlines spaces as well + (if a TTY output device is used). + + -- Request: .uf font + Set the underline font (globally) used by 'ul' and 'cu'. By + default, this is the font at position 2. FONT can be either a + non-negative font position or the name of a font. + + -- Request: .bd font [offset] + -- Request: .bd font1 font2 [offset] + -- Register: \n[.b] + Embolden FONT by overstriking its glyphs offset by OFFSET units + minus one. + + Two syntax forms are available. + + * Imitate a bold font unconditionally. The first argument + specifies the font to embolden, and the second is the number + of basic units, minus one, by which the two glyphs are offset. + If the second argument is missing, emboldening is turned off. + + FONT can be either a non-negative font position or the name of + a font. + + OFFSET is available in the '.b' read-only register if a + special font is active; in the 'bd' request, its default unit + is 'u'. + + * Imitate a bold form conditionally. Embolden FONT1 by OFFSET + only if font FONT2 is the current font. This request can be + issued repeatedly to set up different emboldening values for + different current fonts. If the second argument is missing, + emboldening is turned off for this particular current font. + + This affects special fonts only (either set up with the + 'special' command in font files or with the 'fspecial' + request). + + -- Request: .cs font [width [em-size]] + Switch to and from "constant glyph space mode". If activated, the + width of every glyph is WIDTH/36 ems. The em size is given + absolutely by EM-SIZE; if this argument is missing, the em value is + taken from the current font size (as set with the 'ps' request) + when the font is effectively in use. Without second and third + argument, constant glyph space mode is deactivated. + + Default scaling unit for EM-SIZE is 'z'; WIDTH is an integer. + + +File: groff.info, Node: Ligatures and Kerning, Next: Dummy Characters, Prev: Artificial Fonts, Up: Using Fonts + +5.19.8 Ligatures and Kerning +---------------------------- + +Ligatures are groups of characters that are run together, i.e, producing +a single glyph. For example, the letters 'f' and 'i' can form a +ligature 'fi' as in the word 'file'. This produces a cleaner look +(albeit subtle) to the printed output. Usually, ligatures are not +available in fonts for TTY output devices. + + Most PostScript fonts support the fi and fl ligatures. The C/A/T +typesetter that was the target of AT&T 'troff' also supported 'ff', +'ffi', and 'ffl' ligatures. Advanced typesetters or 'expert' fonts may +include ligatures for 'ft' and 'ct', although GNU 'troff' does not +support these (yet). + + Only the current font is checked for ligatures and kerns; neither +special fonts nor special charcters defined with the 'char' request (and +its siblings) are taken into account. + + -- Request: .lg [flag] + -- Register: \n[.lg] + Switch the ligature mechanism on or off; if the parameter is + non-zero or missing, ligatures are enabled, otherwise disabled. + Default is on. The current ligature mode can be found in the + read-only register '.lg' (set to 1 or 2 if ligatures are enabled, + 0 otherwise). + + Setting the ligature mode to 2 enables the two-character ligatures + (fi, fl, and ff) and disables the three-character ligatures (ffi + and ffl). + + "Pairwise kerning" is another subtle typesetting mechanism that +modifies the distance between a glyph pair to improve readability. In +most cases (but not always) the distance is decreased. Typewriter-like +fonts and fonts for terminals where all glyphs have the same width don't +use kerning. + + -- Request: .kern [flag] + -- Register: \n[.kern] + Switch kerning on or off. If the parameter is non-zero or missing, + enable pairwise kerning, otherwise disable it. The read-only + register '.kern' is set to 1 if pairwise kerning is enabled, + 0 otherwise. + + If the font description file contains pairwise kerning information, + glyphs from that font are kerned. Kerning between two glyphs can + be inhibited by placing '\&' between them: 'V\&A'. + + *Note Font Description File Format::. + + "Track kerning" expands or reduces the space between glyphs. This +can be handy, for example, if you need to squeeze a long word onto a +single line or spread some text to fill a narrow column. It must be +used with great care since it is usually considered bad typography if +the reader notices the effect. + + -- Request: .tkf f s1 n1 s2 n2 + Enable track kerning for font F. If the current font is F the + width of every glyph is increased by an amount between N1 and N2 + (N1, N2 can be negative); if the current type size is less than or + equal to S1 the width is increased by N1; if it is greater than or + equal to S2 the width is increased by N2; if the type size is + greater than or equal to S1 and less than or equal to S2 the + increase in width is a linear function of the type size. + + The default scaling unit is 'z' for S1 and S2, 'p' for N1 and N2. + + The track kerning amount is added even to the rightmost glyph in a + line; for large values it is thus recommended to increase the line + length by the same amount to compensate. + + +File: groff.info, Node: Italic Corrections, Next: Dummy Characters, Prev: Ligatures and Kerning, Up: Using Fonts + +5.19.9 Italic Corrections +------------------------- + +When typesetting adjacent glyphs from typefaces of different slants, the +space between them may require adjustment. + + -- Escape sequence: \/ + Apply an "italic correction": modify the spacing of the preceding + glyph so that the distance between it and the following glyph is + correct if the latter is of upright shape. For example, if an + italic 'f' is followed immediately by a roman right parenthesis, + then in many fonts the top right portion of the 'f' overlaps the + top left of the right parenthesis, which is ugly. Use this escape + sequence whenever an oblique glyph is immediately followed by an + upright glyph without any intervening space. + + -- Escape sequence: \, + Apply a "left italic correction": modify the spacing of the + following glyph so that the distance between it and the preceding + glyph is correct if the latter is of upright shape. For example, + if a roman left parenthesis is immediately followed by an + italic 'f', then in many fonts the bottom left portion of the 'f' + overlaps the bottom of the left parenthesis, which is ugly. Use + this escape sequence whenever an upright glyph is followed + immediately by an oblique glyph without any intervening space. + + +File: groff.info, Node: Dummy Characters, Prev: Italic Corrections, Up: Using Fonts + +5.19.10 Dummy Characters +------------------------ + +As discussed in *note Requests and Macros::, the first character on an +input line is treated specially. Further, formatting a glyph has many +consequences on formatter state (*note Environments::). Occasionally, +we want to escape this context or embrace some of those consequences +without actually rendering a glyph to the output. + + -- Escape sequence: \& + Interpolate a dummy character, which is constitutive of output but + invisible.(1) (*note Dummy Characters-Footnote-1::) Its presence + alters the interpretation context of a subsequent input character, + and enjoys several applications. + + * Prevent insertion of extra space after an end-of-sentence + character. + + Test. + Test. + => Test. Test. + Test.\& + Test. + => Test. Test. + + * Prevent recognition of a control character. + + .Test + error-> warning: macro 'Test' not defined + \&.Test + => .Test + + * Prevent kerning between two glyphs. + + * Translate a character to "nothing". + + .tr JIjiK\&k\&UVuv + Post universitum, alea jacta est, OK? + => Post vniversitvm, alea iacta est, O? + + The dummy character escape sequence sees use in macro definitions + as a means of ensuring that arguments are treated as text even if + they begin with spaces or control characters. + + .de HD \" typeset a simple bold heading + . sp + . ft B + \&\\$1 \" exercise: remove the \& + . ft + . sp + .. + .HD .\|.\|.\|surprised? + + One way to think about the dummy character is to imagine placing the +symbol '&' in the input at a certain location; if doing so has all the +side effects on formatting that you desire except for sticking an ugly +ampersand in the midst of your text, the dummy character is what you +want in its place. + + -- Escape sequence: \) + Interpolate a transparent dummy character--one that is transparent + to end-of-sentence detection. It behaves as '\&', except that '\&' + is treated as letters and numerals normally are after '.', '?' and + '!'; '\&' cancels end-of-sentence detection, and '\)' does not. + + .de Suffix-& + . nop \&\\$1 + .. + . + .de Suffix-) + . nop \)\\$1 + .. + . + Here's a sentence.\c + .Suffix-& ' + Another one.\c + .Suffix-) ' + And a third. + => Here's a sentence.' Another one.' And a third. + + +File: groff.info, Node: Dummy Characters-Footnotes, Up: Dummy Characters + + (1) Opinions of this escape sequence's name abound. "Zero-width +space" is a popular misnomer: 'roff' formatters do not treat it like a +space. Ossanna called it a "non-printing, zero-width character", but +the character causes _output_ even though it does not "print". If no +output line is pending, the dummy character starts one. Contrast an +empty input document with one containing only '\&'. The former produces +no output; the latter, a blank page. + + +File: groff.info, Node: Manipulating Type Size and Vertical Spacing, Next: Colors, Prev: Using Fonts, Up: GNU troff Reference + +5.20 Manipulating Type Size and Vertical Spacing +================================================ + +These concepts were introduced in *note Page Geometry::. The height of +a font's tallest glyph is one em, which is equal to the type size in +points.(1) (*note Manipulating Type Size and Vertical +Spacing-Footnote-1::) A vertical spacing of less than 120% of the type +size can make a document hard to read. Larger proportions can be useful +to spread the text for annotations or proofreader's marks. By default, +GNU 'troff' uses 10 point type on 12 point spacing. Typographers call +the difference between type size and vertical spacing "leading".(2) +(*note Manipulating Type Size and Vertical Spacing-Footnote-2::) + +* Menu: + +* Changing the Type Size:: +* Changing the Vertical Spacing:: +* Using Fractional Type Sizes:: + + +File: groff.info, Node: Manipulating Type Size and Vertical Spacing-Footnotes, Up: Manipulating Type Size and Vertical Spacing + + (1) In text fonts, the tallest glyphs are typically parentheses. +Unfortunately, in many cases the actual dimensions of the glyphs in a +font do not closely match its declared type size! For example, in the +standard PostScript font families, 10-point Times sets better with +9-point Helvetica and 11-point Courier than if all three were used at +10 points. + + (2) Rhyme with "sledding"; mechanical typography used lead metal +(Latin _plumbum_). + + +File: groff.info, Node: Changing the Type Size, Next: Changing the Vertical Spacing, Prev: Manipulating Type Size and Vertical Spacing, Up: Manipulating Type Size and Vertical Spacing + +5.20.1 Changing the Type Size +----------------------------- + + -- Request: .ps [size] + -- Request: .ps +size + -- Request: .ps -size + -- Escape sequence: \ssize + -- Register: \n[.s] + Use the 'ps' request or the '\s' escape sequence to change + (increase, decrease) the type size (in scaled points). Specify + SIZE as either an absolute type size, or as a relative change from + the current size. 'ps' with no argument restores the previous + size. The 'ps' request's default scaling unit is 'z'. The + requested size is rounded to the nearest valid size (with ties + rounding down) within the limits supported by the device. If the + requested size is non-positive, it is treated as 1u. + + Type size alteration is incorrectly documented in the AT&T 'troff' + manual, which claims "if [the requested size] is invalid, the next + larger valid size will result, with a maximum of 36".(1) (*note + Changing the Type Size-Footnote-1::) + + The read-only string-valued register '.s' interpolates the type + size in points as a decimal fraction; it is associated with the + environment (*note Environments::). To obtain the type size in + scaled points, interpolate the '.ps' register instead (*note Using + Fractional Type Sizes::). + + The '\s' escape sequence supports a variety of syntax forms. + + '\sN' + Set the type size to N points. N must be a single digit. If + N is 0, restore the previous size. + + '\s+N' + '\s-N' + Increase or decrease the type size by N points. N must be + exactly one digit. + + '\s(NN' + Set the type size to NN points. NN must be exactly two + digits. + + '\s+(NN' + '\s-(NN' + '\s(+NN' + '\s(-NN' + Alter the type size in points by the two-digit value NN. + + *Note Using Fractional Type Sizes::, for further syntactical forms + of the '\s' escape sequence that additionally accept decimal + fractions. + + snap, snap, + .ps +2 + grin, grin, + .ps +2 + wink, wink, \s+2nudge, nudge,\s+8 say no more! + .ps 10 + + The '\s' escape sequence affects the environment immediately and +doesn't produce an input token. Consequently, it can be used in +requests like 'mc', which expects a single character as an argument, to +change the type size on the fly. + + .mc \s[20]x\s[0] + + -- Request: .sizes s1 s2 ... sn [0] + The 'DESC' file specifies which type sizes are allowed by the + output device; see *note DESC File Format::. Use the 'sizes' + request to change this set of permissible sizes. Arguments are in + scaled points; see *note Using Fractional Type Sizes::. Each can + be a single type size (such as '12000'), or a range of sizes (such + as '4000-72000'). You can optionally end the list with a '0'. + + +File: groff.info, Node: Changing the Type Size-Footnotes, Up: Changing the Type Size + + (1) The claim appears to have been true of Ossanna 'troff' for the +C/A/T device; Kernighan made device-independent 'troff' more flexible. + + +File: groff.info, Node: Changing the Vertical Spacing, Next: Using Fractional Type Sizes, Prev: Changing the Type Size, Up: Manipulating Type Size and Vertical Spacing + +5.20.2 Changing the Vertical Spacing +------------------------------------ + + -- Request: .vs [space] + -- Request: .vs +space + -- Request: .vs -space + -- Register: \n[.v] + Set the vertical spacing to, or alter it by, SPACE. The default + scaling unit is 'p'. If 'vs' is called without an argument, the + vertical spacing is reset to the previous value before the last + call to 'vs'. GNU 'troff' emits a warning in category 'range' if + SPACE is negative; the vertical spacing is then set to the smallest + possible positive value, the vertical motion quantum (as found in + the '.V' register). + + '.vs 0' isn't saved in a diversion since it doesn't result in a + vertical motion. You must explicitly issue this request before + interpolating the diversion. + + The read-only register '.v' contains the vertical spacing; it is + associated with the environment (*note Environments::). + +When a break occurs, GNU 'troff' performs the following procedure. + + * Move the drawing position vertically by the "extra pre-vertical + line space", the minimum of all negative '\x' escape sequence + arguments in the pending output line. + + * Move the drawing position vertically by the vertical line spacing. + + * Write out the pending output line. + + * Move the drawing position vertically by the "extra post-vertical + line space", the maximum of all positive '\x' escape sequence + arguments in the line that has just been output. + + * Move the drawing position vertically by the "post-vertical line + spacing" (see below). + + Prefer 'vs' or 'pvs' over 'ls' to produce double-spaced documents. +'vs' and 'pvs' have finer granularity than 'ls'; moreover, some +preprocessors assume single spacing. *Note Manipulating Spacing::, +regarding the '\x' escape sequence and the 'ls' request. + + -- Request: .pvs [space] + -- Request: .pvs +space + -- Request: .pvs -space + -- Register: \n[.pvs] + Set the post-vertical spacing to, or alter it by, SPACE. The + default scaling unit is 'p'. If 'pvs' is called without an + argument, the post-vertical spacing is reset to the previous value + before the last call to 'pvs'. GNU 'troff' emits a warning in + category 'range' if SPACE is negative; the post-vertical spacing is + then set to zero. + + The read-only register '.pvs' contains the post-vertical spacing; + it is associated with the environment (*note Environments::). + + +File: groff.info, Node: Using Fractional Type Sizes, Prev: Changing the Type Size, Up: Manipulating Type Size and Vertical Spacing + +5.20.3 Using Fractional Type Sizes +---------------------------------- + +AT&T 'troff' interpreted all type size measurements in points. Combined +with integer arithmetic, this design choice made it impossible to +support, for instance, ten and a half-point type. In GNU 'troff', an +output device can select a scaling factor that subdivides a point into +"scaled points". A type size expressed in scaled points can thus +represent a non-integral type size. + + A "scaled point" is equal to 1/SIZESCALE points, where SIZESCALE is +specified in the device description file 'DESC', and defaults to 1.(1) +(*note Using Fractional Type Sizes-Footnote-1::) Requests and escape +sequences in GNU 'troff' interpret arguments that represent a type size +in scaled points, which the formatter multiplies by SIZESCALE and +converts to an integer. Arguments treated in this way comprise those to +the escape sequences '\H' and '\s', to the request 'ps', the third +argument to the 'cs' request, and the second and fourth arguments to the +'tkf' request. Scaled points may be specified explicitly with the 'z' +scaling unit. + + For example, if SIZESCALE is 1000, then a scaled point is one +thousandth of a point. The request '.ps 10.5' is synonymous with '.ps +10.5z' and sets the type size to 10,500 scaled points, or 10.5 points. +Consequently, in GNU 'troff', the register '.s' can interpolate a +non-integral type size. + + -- Register: \n[.ps] + This read-only register interpolates the type size in scaled + points; it is associated with the environment (*note + Environments::). + + It makes no sense to use the 'z' scaling unit in a numeric expression +whose default scaling unit is neither 'u' nor 'z', so GNU 'troff' +disallows this. Similarly, it is nonsensical to use a scaling unit +other than 'z' or 'u' in a numeric expression whose default scaling unit +is 'z', and so GNU 'troff' disallows this as well. + + Another GNU 'troff' scaling unit, 's', multiplies by the number of +basic units in a scaled point. Thus, '\n[.ps]s' is equal to '1m' by +definition. Do not confuse the 's' and 'z' scaling units. + + -- Register: \n[.psr] + -- Register: \n[.sr] + Output devices may be limited in the type sizes they can employ. + The '.s' and '.ps' registers represent the type size selected by + the output driver as it understands a device's capability. The + last _requested_ type size is interpolated in scaled points by the + read-only register '.psr' and in points as a decimal fraction by + the read-only string-valued register '.sr'. Both are associated + with the environment (*note Environments::). + + For example, if a type size of 10.95 points is requested, and the + nearest size permitted by a 'sizes' request (or by the 'sizes' or + 'sizescale' directives in the device's 'DESC' file) is 11 points, + the output driver uses the latter value. + + The '\s' escape sequence offers the following syntax forms that work +with fractional type sizes and accept scaling units. You may of course +give them integral arguments. The delimited forms need not use the +neutral apostrophe; see *note Delimiters::. + +'\s[N]' +'\s'N'' + Set the type size to N scaled points; N is a numeric expression + with a default scaling unit of 'z'. + +'\s[+N]' +'\s[-N]' +'\s+[N]' +'\s-[N]' +'\s'+N'' +'\s'-N'' +'\s+'N'' +'\s-'N'' + Increase or decrease the type size by N scaled points; N is a + numeric expression (which may start with a minus sign) with a + default scaling unit of 'z'. + + +File: groff.info, Node: Using Fractional Type Sizes-Footnotes, Up: Using Fractional Type Sizes + + (1) *Note Device and Font Description Files::. + + +File: groff.info, Node: Colors, Next: Strings, Prev: Manipulating Type Size and Vertical Spacing, Up: GNU troff Reference + +5.21 Colors +=========== + +GNU 'troff' supports color output with a variety of color spaces and up +to 16 bits per channel. Some devices, particularly terminals, may be +more limited. When color support is enabled, two colors are current at +any given time: the "stroke color", with which glyphs, rules (lines), +and geometric objects like circles and polygons are drawn, and the "fill +color", which can be used to paint the interior of a closed geometric +figure. + + -- Request: .color [n] + -- Register: \n[.color] + If N is missing or non-zero, enable the output of color-related + device-independent output commands (this is the default); + otherwise, disable them. This request sets a global flag; it does + not produce an input token (*note Gtroff Internals::). + + The read-only register '.color' is 1 if colors are enabled, + 0 otherwise. + + Color can also be disabled with the '-c' command-line option. + + -- Request: .defcolor ident scheme color-component ... + Define a color named IDENT. SCHEME selects a color space and + determines the quantity of required COLOR-COMPONENTs; it must be + one of 'rgb' (three components), 'cmy' (three), 'cmyk' (four), or + 'gray' (one). 'grey' is accepted as a synonym of 'gray'. The + color components can be encoded as a single hexadecimal value + starting with '#' or '##'. The former indicates that each + component is in the range 0-255 (0-FF), the latter the range + 0-65,535 (0-FFFF). + + .defcolor half gray #7f + .defcolor pink rgb #FFC0CB + .defcolor magenta rgb ##ffff0000ffff + + Alternatively, each color component can be specified as a decimal + fraction in the range 0-1, interpreted using a default scaling unit + of 'f', which multiplies its value by 65,536 (but clamps it at + 65,535). + + .defcolor gray50 rgb 0.5 0.5 0.5 + .defcolor darkgreen rgb 0.1f 0.5f 0.2f + + Each output device has a color named 'default', which cannot be +redefined. A device's default stroke and fill colors are not +necessarily the same. For the 'dvi', 'html', 'pdf', 'ps', and 'xhtml' +output devices, GNU 'troff' automatically loads a macro file defining +many color names at startup. By the same mechanism, the devices +supported by 'grotty' recognize the eight standard ISO 6429/EMCA-48 +color names.(1) (*note Colors-Footnote-1::) + + -- Request: .gcolor [color] + -- Escape sequence: \mc + -- Escape sequence: \m(co + -- Escape sequence: \m[color] + -- Register: \n[.m] + Set the stroke color to COLOR. + + .gcolor red + The next words + .gcolor + \m[red]are in red\m[] + and these words are in the previous color. + + The escape sequence '\m[]' restores the previous stroke color, as + does a 'gcolor' request without an argument. + + The name of the current stroke color is available in the read-only + string-valued register '.m'; it is associated with the environment + (*note Environments::). It interpolates nothing when the stroke + color is the default. + + '\m' doesn't produce an input token in GNU 'troff' (*note Gtroff + Internals::). It therefore can be used in requests like 'mc' + (which expects a single character as an argument) to change the + color on the fly: + + .mc \m[red]x\m[] + + -- Request: .fcolor [color] + -- Escape sequence: \Mc + -- Escape sequence: \M(co + -- Escape sequence: \M[color] + -- Register: \n[.M] + Set the fill color for objects drawn with '\D'...'' escape + sequences. The escape sequence '\M[]' restores the previous fill + color, as does an 'fcolor' request without an argument. + + The name of the current fill color is available in the read-only + string-valued register '.M'; it is associated with the environment + (*note Environments::). It interpolates nothing when the fill + color is the default. '\M' doesn't produce an input token in GNU + 'troff'. + + Create an ellipse with a red interior as follows. + + \M[red]\h'0.5i'\D'E 2i 1i'\M[] + + +File: groff.info, Node: Colors-Footnotes, Up: Colors + + (1) also known vulgarly as "ANSI colors" + + +File: groff.info, Node: Strings, Next: Conditionals and Loops, Prev: Colors, Up: GNU troff Reference + +5.22 Strings +============ + +GNU 'troff' supports strings primarily for user convenience. +Conventionally, if one would define a macro only to interpolate a small +amount of text, without invoking requests or calling any other macros, +one defines a string instead. Only one string is predefined by the +language. + + -- String: \*[.T] + Contains the name of the output device (for example, 'utf8' or + 'pdf'). + + The 'ds' request creates a string with a specified name and contents +and the '\*' escape sequence dereferences its name, interpolating its +contents. If the string named by the '\*' escape sequence does not +exist, it is defined as empty, nothing is interpolated, and a warning in +category 'mac' is emitted. *Note Warnings::, for information about the +enablement and suppression of warnings. + + -- Request: .ds name [contents] + -- Request: .ds1 name [contents] + -- Escape sequence: \*n + -- Escape sequence: \*(nm + -- Escape sequence: \*[name [arg1 arg2 ...]] + Define a string called NAME with contents CONTENTS. If NAME + already exists as an alias, the target of the alias is redefined; + see 'als' and 'rm' below. If 'ds' is called with only one + argument, NAME is defined as an empty string. Otherwise, GNU + 'troff' stores CONTENTS in copy mode.(1) (*note + Strings-Footnote-1::) + + The '\*' escape sequence interpolates a previously defined string + variable NAME (one-character name N, two-character name NM). The + bracketed interpolation form accepts arguments that are handled as + macro arguments are; recall *note Calling Macros::. In contrast to + macro calls, however, if a closing bracket ']' occurs in a string + argument, that argument must be enclosed in double quotes. '\*' is + interpreted even in copy mode. When defining strings, argument + interpolations must be escaped if they are to reference parameters + from the calling context; *Note Parameters::. + + .ds cite (\\$1, \\$2) + Gray codes are explored in \*[cite Morgan 1998]. + => Gray codes are explored in (Morgan, 1998). + + *Caution:* Unlike other requests, the second argument to the 'ds' + request consumes the remainder of the input line, including + trailing spaces. This means that comments on a line with such a + request can introduce unwanted space into a string when they are + set off from the material they annotate, as is conventional. + + .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water + + Instead, place the comment on another line or put the comment + escape sequence immediately adjacent to the last character of the + string. + + .ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water + + Ending string definitions (and appendments) with a comment, even an + empty one, prevents unwanted space from creeping into them during + source document maintenance. + + .ds author Alice Pleasance Liddell\" + .ds empty \" might be appended to later with .as + + An initial neutral double quote '"' in CONTENTS is stripped to + allow embedding of leading spaces. Any other '"' is interpreted + literally, but it is wise to use the special character escape + sequence '\[dq]' instead if the string might be interpolated as + part of a macro argument; see *note Calling Macros::. + + .ds salutation " Yours in a white wine sauce,\" + .ds c-var-defn " char mydate[]=\[dq]2020-07-29\[dq];\" + + Strings are not limited to a single input line of text. '\' + works just as it does elsewhere. The resulting string is stored + _without_ the newlines. Care is therefore required when + interpolating strings while filling is disabled. + + .ds foo This string contains \ + text on multiple lines \ + of input. + + It is not possible to embed a newline in a string that will be + interpreted as such when the string is interpolated. To achieve + that effect, use '\*' to interpolate a macro instead; see *note + Punning Names::. + + Because strings are similar to macros, they too can be defined so + as to suppress AT&T 'troff' compatibility mode when used; see *note + Writing Macros:: and *note Compatibility Mode::. The 'ds1' request + defines a string such that compatibility mode is off when the + string is later interpolated. To be more precise, a "compatibility + save" input token is inserted at the beginning of the string, and a + "compatibility restore" input token at the end. + + .nr xxx 12345 + .ds aa The value of xxx is \\n[xxx]. + .ds1 bb The value of xxx is \\n[xxx]. + . + .cp 1 + . + \*(aa + error-> warning: register '[' not defined + => The value of xxx is 0xxx]. + \*(bb + => The value of xxx is 12345. + + -- Request: .as name [contents] + -- Request: .as1 name [contents] + The 'as' request is similar to 'ds' but appends CONTENTS to the + string stored as NAME instead of redefining it. If NAME doesn't + exist yet, it is created. If 'as' is called with only one + argument, no operation is performed (beyond dereferencing the + string). + + .as salutation " with shallots, onions and garlic,\" + + The 'as1' request is similar to 'as', but compatibility mode is + switched off when the appended portion of the string is later + interpolated. To be more precise, a "compatibility save" input + token is inserted at the beginning of the appended string, and a + "compatibility restore" input token at the end. + + Several requests exist to perform rudimentary string operations. +Strings can be queried ('length') and modified ('chop', 'substring', +'stringup', 'stringdown'), and their names can be manipulated through +renaming, removal, and aliasing ('rn', 'rm', 'als'). + + -- Request: .length reg anything + Compute the number of characters of ANYTHING and store the count in + the register REG. If REG doesn't exist, it is created. ANYTHING + is read in copy mode. + + .ds xxx abcd\h'3i'efgh + .length yyy \*[xxx] + \n[yyy] + => 14 + + -- Request: .chop object + Remove the last character from the macro, string, or diversion + named OBJECT. This is useful for removing the newline from the end + of a diversion that is to be interpolated as a string. This + request can be used repeatedly on the same OBJECT; see *note Gtroff + Internals::, for details on nodes inserted additionally by GNU + 'troff'. + + -- Request: .substring str start [end] + Replace the string named STR with its substring bounded by the + indices START and END, inclusively. The first character in the + string has index 0. If END is omitted, it is implicitly set to the + largest valid value (the string length minus one). Negative + indices count backward from the end of the string: the last + character has index -1, the character before the last has index -2, + and so on. + + .ds xxx abcdefgh + .substring xxx 1 -4 + \*[xxx] + => bcde + .substring xxx 2 + \*[xxx] + => de + + -- Request: .stringdown str + -- Request: .stringup str + Alter the string named STR by replacing each of its bytes with its + lowercase ('stringdown') or uppercase ('stringup') version (if one + exists). Special characters in the string will often transform in + the expected way due to the regular naming convention for accented + characters. When they do not, use substrings and/or catenation. + + .ds resume R\['e]sum\['e] + \*[resume] + .stringdown resume + \*[resume] + .stringup resume + \*[resume] + => Résumé résumé RÉSUMÉ + + (In practice, we would end the 'ds' request with a comment escape +'\"' to prevent space from creeping into the definition during source +document maintenance.) + + -- Request: .rn old new + Rename the request, macro, diversion, or string OLD to NEW. + + -- Request: .rm name + Remove the request, macro, diversion, or string NAME. GNU 'troff' + treats subsequent invocations as if the name had never been + defined. + + -- Request: .als new old + Create an alias NEW for the existing request, string, macro, or + diversion object named OLD, causing the names to refer to the same + stored object. If OLD is undefined, a warning in category 'mac' is + produced, and the request is ignored. *Note Warnings::, for + information about the enablement and suppression of warnings. + + To understand how the 'als' request works, consider two different + storage pools: one for objects (macros, strings, etc.), and another + for names. As soon as an object is defined, GNU 'troff' adds it to + the object pool, adds its name to the name pool, and creates a link + between them. When 'als' creates an alias, it adds a new name to + the name pool that gets linked to the same object as the old name. + + Now consider this example. + + .de foo + .. + . + .als bar foo + . + .de bar + . foo + .. + . + .bar + error-> input stack limit exceeded (probable infinite + error-> loop) + + In the above, 'bar' remains an _alias_--another name for--the + object referred to by 'foo', which the second 'de' request + replaces. Alternatively, imagine that the 'de' request + _dereferences_ its argument before replacing it. Either way, the + result of calling 'bar' is a recursive loop that finally leads to + an error. *Note Writing Macros::. + + To remove an alias, call 'rm' on its name. The object itself is + not destroyed until it has no more names. + + When a request, macro, string, or diversion is aliased, + redefinitions and appendments "write through" alias names. To + replace an alias with a separately defined object, you must use the + 'rm' request on its name first. + + +File: groff.info, Node: Strings-Footnotes, Up: Strings + + (1) *Note Copy Mode::. + + +File: groff.info, Node: Conditionals and Loops, Next: Writing Macros, Prev: Strings, Up: GNU troff Reference + +5.23 Conditionals and Loops +=========================== + +'groff' has 'if' and 'while' control structures like other languages. +However, the syntax for grouping multiple input lines in the branches or +bodies of these structures is unusual. + +* Menu: + +* Operators in Conditionals:: +* if-then:: +* if-else:: +* Conditional Blocks:: +* while:: + + +File: groff.info, Node: Operators in Conditionals, Next: if-then, Prev: Conditionals and Loops, Up: Conditionals and Loops + +5.23.1 Operators in Conditionals +-------------------------------- + +In 'if', 'ie', and 'while' requests, in addition to the numeric +expressions described in *note Numeric Expressions::, several Boolean +operators are available; the members of this expanded class are termed +"conditional expressions". + +'c GLYPH' + True if GLYPH is available, where GLYPH is an ordinary character, a + special character '\(XX' or '\[XXX]', '\N'XXX'', or has been + defined by any of the 'char', 'fchar', 'fschar', or 'schar' + requests. + +'d NAME' + True if a string, macro, diversion, or request called NAME exists. + +'e' + True if the current page is even-numbered. + +'F FONT' + True if FONT exists. FONT is handled as if it were opened with the + 'ft' request (that is, font translation and styles are applied), + without actually mounting it. + +'m COLOR' + True if COLOR is defined. + +'n' + True if the document is being processed in 'nroff' mode. *Note + troff and nroff Modes::. + +'o' + True if the current page is odd-numbered. + +'r REGISTER' + True if REGISTER exists. + +'S STYLE' + True if STYLE is available for the current font family. Font + translation is applied. + +'t' + True if the document is being processed in 'troff' mode. *Note + troff and nroff Modes::. + +'v' + Always false. This condition is recognized only for compatibility + with certain other 'troff' implementations.(1) (*note Operators in + Conditionals-Footnote-1::) + + If the first argument to an 'if', 'ie', or 'while' request begins +with a non-alphanumeric character apart from '!' (see below); it +performs an output comparison test. (2) (*note Operators in +Conditionals-Footnote-2::) + +''XXX'YYY'' + True if formatting the comparands XXX and YYY produces the same + output commands. The delimiter need not be a neutral apostrophe: + the output comparison operator accepts the same delimiters as most + escape sequences; see *note Delimiters::. This "output comparison + operator" formats XXX and YYY in separate environments; after the + comparison, the resulting data are discarded. + + .ie "|"\fR|\fP" true + .el false + => true + + The resulting glyph properties, including font family, style, size, + and slant, must match, but not necessarily the requests and/or + escape sequences used to obtain them. In the previous example, '|' + and '\fR|\fP' result in '|' glyphs in the same typefaces at the + same positions, so the comparands are equal. If '.ft I' had been + added before the '.ie', they would differ: the first '|' would + produce an italic '|', not a roman one. Motions must match in + orientation and magnitude to within the applicable horizontal and + vertical motion quanta of the device, after rounding. '.if + "\u\d"\v'0'"' is false even though both comparands result in zero + net motion, because motions are not interpreted or optimized but + sent as-is to the output.(3) (*note Operators in + Conditionals-Footnote-3::) On the other hand, '.if "\d"\v'0.5m'"' + is true, because '\d' is defined as a downward motion of one-half + em.(4) (*note Operators in Conditionals-Footnote-4::) + + Surround the comparands with '\?' to avoid formatting them; this + causes them to be compared character by character, as with string + comparisons in other programming languages. + + .ie "\?|\?"\?\fR|\fP\?" true + .el false + => false + + Since comparands protected with '\?' are read in copy mode (*note + Copy Mode::), they need not even be valid 'groff' syntax. The + escape character is still lexically recognized, however, and + consumes the next character. + + .ds a \[ + .ds b \[ + .if '\?\*a\?'\?\*b\?' a and b equivalent + .if '\?\\?'\?\\?' backslashes equivalent + => a and b equivalent + + The above operators can't be combined with most others, but a leading +'!', not followed immediately by spaces or tabs, complements an +expression. + + .nr x 1 + .ie !r x register x is not defined + .el register x is defined + => register x is defined + + Spaces and tabs are optional immediately after the 'c', 'd', 'F', +'m', 'r', and 'S' operators, but right after '!', they end the predicate +and the conditional evaluates true.(5) (*note Operators in +Conditionals-Footnote-5::) + + .nr x 1 + .ie ! r x register x is not defined + .el register x is defined + => r x register x is not defined + +The unexpected 'r x' in the output is a clue that our conditional was +not interpreted as we planned, but matters may not always be so obvious. + + +File: groff.info, Node: Operators in Conditionals-Footnotes, Up: Operators in Conditionals + + (1) This refers to 'vtroff', a translator that would convert the +C/A/T output from early-vintage AT&T 'troff' to a form suitable for +Versatec and Benson-Varian plotters. + + (2) Strictly, letters not otherwise recognized _are_ treated as +output comparison delimiters. For portability, it is wise to avoid +using letters not in the list above; for example, Plan 9 'troff' uses +'h' to test a mode it calls 'htmlroff', and GNU 'troff' may provide +additional operators in the future. + + (3) Because formatting of the comparands takes place in a dummy +environment, vertical motions within them cannot spring traps. + + (4) All of this is to say that the lists of output nodes created by +formatting XXX and YYY must be identical. *Note Gtroff Internals::. + + (5) This bizarre behavior maintains compatibility with AT&T 'troff'. + + +File: groff.info, Node: if-then, Next: if-else, Prev: Operators in Conditionals, Up: Conditionals and Loops + +5.23.2 if-then +-------------- + + -- Request: .if cond-expr anything + Evaluate the conditional expression COND-EXPR, and if it evaluates + true (or to a positive value), interpret the remainder of the line + ANYTHING as if it were an input line. Recall from *note Invoking + Requests:: that any quantity of spaces between arguments to + requests serves only to separate them; leading spaces in ANYTHING + are thus not seen. ANYTHING effectively _cannot_ be omitted; if + COND-EXPR is true and ANYTHING is empty, the newline at the end of + the control line is interpreted as a blank input line (and + therefore a blank text line). + + super\c + tanker + .nr force-word-break 1 + super\c + .if ((\n[force-word-break] = 1) & \n[.int]) + tanker + => supertanker super tanker + + -- Request: .nop anything + Interpret ANYTHING as if it were an input line. This is similar to + '.if 1'. 'nop' is not really "no operation"; its argument _is_ + processed--unconditionally. It can be used to cause text lines to + share indentation with surrounding control lines. + + .als real-MAC MAC + .de wrapped-MAC + . tm MAC: called with arguments \\$@ + . nop \\*[real-MAC]\\ + .. + .als MAC wrapped-MAC + \# Later... + .als MAC real-MAC + + In the above, we've used aliasing, 'nop', and the interpolation of + a macro as a string to interpose a wrapper around the macro 'MAC' + (perhaps to debug it). + + +File: groff.info, Node: if-else, Next: while, Prev: Operators in Conditionals, Up: Conditionals and Loops + +5.23.3 if-else +-------------- + + -- Request: .ie cond-expr anything + -- Request: .el anything + Use the 'ie' and 'el' requests to write an if-then-else. The first + request is the "if" part and the latter is the "else" part. + Unusually among programming languages, any number of + non-conditional requests may be interposed between the 'ie' branch + and the 'el' branch. + + .nr a 0 + .ie \na a is non-zero. + .nr a +1 + .el a was not positive but is now \na. + => a was not positive but is now 1. + + Another way in which 'el' is an ordinary request is that it does + not lexically "bind" more tightly to its 'ie' counterpart than it + does to any other request. This fact can surprise C programmers. + + .nr a 1 + .nr z 0 + .ie \nz \ + . ie \na a is true + . el a is false + .el z is false + error-> warning: unbalanced 'el' request + => a is false + + To conveniently nest conditionals, keep reading. + + +File: groff.info, Node: Conditional Blocks, Next: while, Prev: Operators in Conditionals, Up: Conditionals and Loops + +5.23.4 Conditional Blocks +------------------------- + +It is frequently desirable for a control structure to govern more than +one request, macro call, text line, or a combination of the foregoing. +The opening and closing brace escape sequences '\{' and '\}' define such +groups. These "conditional blocks" can furthermore be nested. + + -- Escape sequence: \{ + -- Escape sequence: \} + '\{' begins a conditional block; it must appear (after optional + spaces and tabs) immediately subsequent to the conditional + expression of an 'if', 'ie', or 'while' request,(1) (*note + Conditional Blocks-Footnote-1::) or as the argument to an 'el' + request. + + '\}' ends a condition block and should appear on a line with other + occurrences of itself as necessary to match '\{' sequences. It can + be preceded by a control character, spaces, and tabs. Input after + any quantity of '\}' sequences on the same line is processed only + if all of the preceding conditions to which they correspond are + true. Furthermore, a '\}' closing the body of a 'while' request + must be the last such escape sequence on an input line. + + Brace escape sequences outside of control structures have no + meaning and produce no output. + + *Caution:* Input lines using '\{' often end with '\RET', especially + in macros that consist primarily of control lines. Forgetting to + use '\RET' on an input line after '\{' is a common source of error. + + We might write the following in a page header macro. If we delete +'\RET', the header will carry an unwanted extra empty line (except on +page 1). + + .if (\\n[%] != 1) \{\ + . ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title] + . el .tl \\*[odd-numbered-page-title] + .\} + + Let us take a closer look at how conditional blocks nest. + + A + .if 0 \{ B + C + D + \}E + F + => A F + + N + .if 1 \{ O + . if 0 \{ P + Q + R\} S\} T + U + => N O U + + The above behavior may challenge the intuition; it was implemented to +retain compatibility with AT&T 'troff'. For clarity, it is idiomatic to +end input lines with '\{' (followed by '\' if appropriate), and to +precede '\}' on an input line with nothing more than a control +character, spaces, tabs, and other instances of itself. + + We can use 'ie', 'el', and conditional blocks to simulate the +multi-way "switch" or "case" control structures of other languages. The +following example is adapted from the 'groff' 'man' package. +Indentation is used to clarify the logic. + + .\" Simulate switch/case in roff. + . ie '\\$2'1' .ds title General Commands\" + .el \{.ie '\\$2'2' .ds title System Calls\" + .el \{.ie '\\$2'3' .ds title Library Functions\" + .el \{.ie '\\$2'4' .ds title Kernel Interfaces\" + .el \{.ie '\\$2'5' .ds title File Formats\" + .el \{.ie '\\$2'6' .ds title Games\" + .el \{.ie '\\$2'7' .ds title Miscellaneous Information\" + .el \{.ie '\\$2'8' .ds title System Management\" + .el \{.ie '\\$2'9' .ds title Kernel Development\" + .el .ds title \" empty + .\}\}\}\}\}\}\}\} + + +File: groff.info, Node: Conditional Blocks-Footnotes, Up: Conditional Blocks + + (1) *Note while::. + + +File: groff.info, Node: while, Prev: if-else, Up: Conditionals and Loops + +5.23.5 while +------------ + +'groff' provides a looping construct: the 'while' request. Its syntax +matches the 'if' request. + + -- Request: .while cond-expr anything + Evaluate the conditional expression COND-EXPR, and repeatedly + execute ANYTHING unless and until COND-EXPR evaluates false. + ANYTHING, which is often a conditional block, is referred to as the + 'while' request's "body". + + .nr a 0 1 + .while (\na < 9) \{\ + \n+a, + .\} + \n+a + => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + + GNU 'troff' treats the body of a 'while' request similarly to that + of a 'de' request (albeit one not read in copy mode(1) (*note + while-Footnote-1::)), but stores it under an internal name and + deletes it when the loop finishes. The operation of a macro + containing a 'while' request can slow significantly if the 'while' + body is large. Each time the macro is executed, the 'while' body + is parsed and stored again. + + .de xxx + . nr num 10 + . while (\\n[num] > 0) \{\ + . \" many lines of code + . nr num -1 + . \} + .. + + An often better solution--and one that is more portable, since AT&T + 'troff' lacked the 'while' request--is to instead write a recursive + macro. It will be parsed only once.(2) (*note while-Footnote-2::) + + .de yyy + . if (\\n[num] > 0) \{\ + . \" many lines of code + . nr num -1 + . yyy + . \} + .. + . + .de xxx + . nr num 10 + . yyy + .. + + To prevent infinite loops, the default number of available + recursion levels is 1,000 or somewhat less.(3) (*note + while-Footnote-3::) You can disable this protective measure, or + raise the limit, by setting the 'slimit' register. *Note + Debugging::. + + As noted above, if a 'while' body begins with a conditional block, + its closing brace must end an input line. + + .if 1 \{\ + . nr a 0 1 + . while (\n[a] < 10) \{\ + . nop \n+[a] + .\}\} + error-> unbalanced brace escape sequences + + -- Request: .break + Exit a 'while' loop. Do not confuse this request with a + typographical break or the 'br' request. + + -- Request: .continue + Skip the remainder of a 'while' loop's body, immediately starting + the next iteration. + + +File: groff.info, Node: while-Footnotes, Up: while + + (1) *Note Copy Mode::. + + (2) unless you redefine it + + (3) "somewhat less" because things other than macro calls can be on +the input stack + + +File: groff.info, Node: Writing Macros, Next: Page Motions, Prev: Conditionals and Loops, Up: GNU troff Reference + +5.24 Writing Macros +=================== + +A "macro" is a stored collection of text and control lines that can be +interpolated multiple times. Use macros to define common operations. +Macros are called in the same way that requests are invoked. While +requests exist for the purpose of creating macros, simply calling an +undefined macro, or interpolating it as a string, will cause it to be +defined as empty. *Note Identifiers::. + + -- Request: .de name [end] + Define a macro NAME, replacing the definition of any existing + request, macro, string, or diversion called NAME. If NAME already + exists as an alias, the target of the alias is redefined; recall + *note Strings::. GNU 'troff' enters copy mode,(1) (*note Writing + Macros-Footnote-1::) storing subsequent input lines as the macro + definition. If the optional second argument is not specified, the + definition ends with the control line '..' (two dots). + Alternatively, END identifies a macro whose call syntax at the + start of a control line ends the definition of NAME; END is then + called normally. A macro definition must end in the same + conditional block (if any) in which it began (*note Conditional + Blocks::). Spaces or tabs are permitted after the control + character in the line containing this ending token (either '.' or + 'END'), but a tab immediately after the token prevents its + recognition as the end of a macro definition. The macro END can be + called with arguments.(2) (*note Writing Macros-Footnote-2::) + + Here is a small example macro called 'P' that causes a break and + inserts some vertical space. It could be used to separate + paragraphs. + + .de P + . br + . sp .8v + .. + + We can define one macro within another. Attempting to nest '..' + naïvely will end the outer definition because the inner definition + isn't interpreted as such until the outer macro is later + interpolated. We can use an end macro instead. Each level of + nesting should use a unique end macro. + + An end macro need not be defined until it is called. This fact + enables a nested macro definition to begin inside one macro and end + inside another. Consider the following example.(3) (*note Writing + Macros-Footnote-3::) + + .de m1 + . de m2 m3 + you + .. + .de m3 + Hello, + Joe. + .. + .de m4 + do + .. + .m1 + know? + . m3 + What + .m4 + .m2 + => Hello, Joe. What do you know? + + A nested macro definition _can_ be terminated with '..' and nested + macros _can_ reuse end macros, but these control lines must be + escaped multiple times for each level of nesting. The necessity of + this escaping and the utility of nested macro definitions will + become clearer when we employ macro parameters and consider the + behavior of copy mode in detail. + + 'de' defines a macro that inherits the compatibility mode enablement +status of its context (*note Implementation Differences::). Often it is +desirable to make a macro that uses 'groff' features callable from +contexts where compatibility mode is on; for instance, when writing +extensions to a historical macro package. To achieve this, +compatibility mode needs to be switched off while such a macro is +interpreted--without disturbing that state when it is finished. + + -- Request: .de1 name [end] + The 'de1' request defines a macro to be interpreted with + compatibility mode disabled. When NAME is called, compatibility + mode enablement status is saved; it is restored when the call + completes. Observe the extra backlash before the interpolation of + register 'xxx'; we'll explore this subject in *note Copy Mode::. + + .nr xxx 12345 + .de aa + The value of xxx is \\n[xxx]. + . br + .. + .de1 bb + The value of xxx is \\n[xxx]. + .. + .cp 1 + .aa + error-> warning: register '[' not defined + => The value of xxx is 0xxx]. + .bb + => The value of xxx is 12345. + + -- Request: .dei name [end] + -- Request: .dei1 name [end] + The 'dei' request defines a macro with its name and end macro + indirected through strings. That is, it interpolates strings named + NAME and END before performing the definition. + + The following examples are equivalent. + + .ds xx aa + .ds yy bb + .dei xx yy + + .de aa bb + + The 'dei1' request bears the same relationship to 'dei' as 'de1' + does to 'de'; it temporarily turns compatibility mode off when NAME + is called. + + -- Request: .am name [end] + -- Request: .am1 name [end] + -- Request: .ami name [end] + -- Request: .ami1 name [end] + 'am' appends subsequent input lines to macro NAME, extending its + definition, and otherwise working as 'de' does. + + To make the previously defined 'P' macro set indented instead of + block paragraphs, add the necessary code to the existing macro. + + .am P + .ti +5n + .. + + The other requests are analogous to their 'de' counterparts. The + 'am1' request turns off compatibility mode during interpretation of + the appendment. The 'ami' request appends indirectly, meaning that + strings NAME and END are interpolated with the resulting names used + before appending. The 'ami1' request is similar to 'ami', + disabling compatibility mode during interpretation of the appended + lines. + + Using 'trace.tmac', you can trace calls to 'de', 'de1', 'am', and +'am1'. You can also use the 'backtrace' request at any point desired to +troubleshoot tricky spots (*note Debugging::). + + *Note Strings::, for the 'als', 'rm', and 'rn' requests to create an +alias of, remove, and rename a macro, respectively. + + Macro identifiers share their name space with requests, strings, and +diversions; see *note Identifiers::. The 'am', 'as', 'da', 'de', 'di', +and 'ds' requests (together with their variants) create a new object +only if the name of the macro, diversion, or string is currently +undefined or if it is defined as a request; normally, they modify the +value of an existing object. *Note the description of the 'als' +request: als, for pitfalls when redefining a macro that is aliased. + + -- Request: .return [anything] + Exit a macro, immediately returning to the caller. If called with + an argument ANYTHING, exit twice--the current macro and the macro + one level higher. This is used to define a wrapper macro for + 'return' in 'trace.tmac'. + +* Menu: + +* Parameters:: +* Copy Mode:: + + +File: groff.info, Node: Writing Macros-Footnotes, Up: Writing Macros + + (1) *Note Copy Mode::. + + (2) While it is possible to define and call a macro '.', you can't +use it as an end macro: during a macro definition, '..' is never handled +as calling '.', even if '.de NAME .' explicitly precedes it. + + (3) Its structure is adapted from, and isomorphic to, part of a +solution by Tadziu Hoffman to the problem of reflowing text multiple +times to find an optimal configuration for it. + + + +File: groff.info, Node: Parameters, Next: Copy Mode, Prev: Writing Macros, Up: Writing Macros + +5.24.1 Parameters +----------------- + +Macro calls and string interpolations optionally accept a list of +arguments; recall *note Calling Macros::. At the time such an +interpolation takes place, these "parameters" can be examined using a +register and a variety of escape sequences starting with '\$'. All such +escape sequences are interpreted even in copy mode, a fact we shall +motivate and explain below (*note Copy Mode::). + + -- Register: \n[.$] + The count of parameters available to a macro or string is kept in + this read-only register. The 'shift' request can change its value. + + Any individual parameter can be accessed by its position in the list +of arguments to the macro call, numbered from left to right starting at +1, with one of the following escape sequences. + + -- Escape sequence: \$n + -- Escape sequence: \$(nn + -- Escape sequence: \$[nnn] + Interpolate the Nth, NNth, or NNNth parameter. The first form + expects only a single digit (1<=N<=9)), the second two digits + (01<=NN<=99)), and the third any positive integer NNN. Macros and + strings accept an unlimited number of parameters. + + -- Request: .shift [n] + Shift the parameters N places (1 by default). This is a "left + shift": what was parameter I becomes parameter I-N. The parameters + formerly in positions 1 to N are no longer available. Shifting by + a non-positive amount performs no operation. The register '.$' is + adjusted accordingly. + + In practice, parameter interpolations are usually seen prefixed with +an extra escape character. This is because the '\$' family of escape +sequences is interpreted even in copy mode.(1) (*note +Parameters-Footnote-1::) + + -- Escape sequence: \$* + -- Escape sequence: \$@ + -- Escape sequence: \$^ + In some cases it is convenient to interpolate all of the parameters + at once (to pass them to a request, for instance). The '\$*' + escape concatenates the parameters, separating them with spaces. + '\$@' is similar, concatenating the parameters, surrounding each + with double quotes and separating them with spaces. If not in + compatibility mode, the interpolation depth of double quotes is + preserved (*note Calling Macros::). '\$^' interpolates all + parameters as if they were arguments to the 'ds' request. + + .de foo + . tm $1='\\$1' + . tm $2='\\$2' + . tm $*='\\$*' + . tm $@='\\$@' + . tm $^='\\$^' + .. + .foo " This is a "test" + error-> $1=' This is a ' + error-> $2='test"' + error-> $*=' This is a test"' + error-> $@='" This is a " "test""' + error-> $^='" This is a "test"' + + '\$*' is useful when writing a macro that doesn't need to + distinguish its arguments, or even to not interpret them; examples + include macros that produce diagnostic messages by wrapping the + 'tm' or 'ab' requests. Use '\$@' when writing a macro that may + need to shift its parameters and/or wrap a macro or request that + finds the count significant. If in doubt, prefer '\$@' to '\$*'. + An application of '\$^' is seen in 'trace.tmac', which redefines + some requests and macros for debugging purposes. + + -- Escape sequence: \$0 + Interpolate the name by which the macro being interpreted was + called. The 'als' request can cause a macro to have more than one + name. Applying string interpolation to a macro does not change + this name. + + .de foo + . tm \\$0 + .. + .als bar foo + . + .de aaa + . foo + .. + .de bbb + . bar + .. + .de ccc + \\*[foo]\\ + .. + .de ddd + \\*[bar]\\ + .. + . + .aaa + error-> foo + .bbb + error-> bar + .ccc + error-> ccc + .ddd + error-> ddd + + +File: groff.info, Node: Parameters-Footnotes, Up: Parameters + + (1) If they were not, parameter interpolations would be similar to +command-line parameters--fixed for the entire duration of a 'roff' +program's run. The advantage of interpolating '\$' escape sequences +even in copy mode is that they can interpolate different contents from +one call to the next, like function parameters in a procedural language. +The additional escape character is the price of this power. + + +File: groff.info, Node: Copy Mode, Prev: Parameters, Up: Writing Macros + +5.24.2 Copy Mode +---------------- + +When GNU 'troff' processes certain requests, most importantly those +which define or append to a macro or string, it does so in "copy mode": +it copies the characters of the definition into a dedicated storage +region, interpolating the escape sequences '\n', '\g', '\$', '\*', '\V', +and '\?' normally; interpreting '\' immediately; discarding +comments '\"' and '\#'; interpolating the current leader, escape, or tab +character with '\a', '\e', and '\t', respectively; and storing all other +escape sequences in an encoded form. + + The complement of copy mode--a 'roff' formatter's behavior when not +defining or appending to a macro, string, or diversion--where all macros +are interpolated, requests invoked, and valid escape sequences processed +immediately upon recognition, can be termed "interpretation mode". + + -- Escape sequence: \\ + The escape character, '\' by default, can escape itself. This + enables you to control whether a given '\n', '\g', '\$', '\*', + '\V', or '\?' escape sequence is interpreted at the time the macro + containing it is defined, or later when the macro is called.(1) + (*note Copy Mode-Footnote-1::) + + .nr x 20 + .de y + .nr x 10 + \&\nx + \&\\nx + .. + .y + => 20 10 + + You can think of '\\' as a "delayed" backslash; it is the escape + character followed by a backslash from which the escape character + has removed its special meaning. Consequently, '\\' is not an + escape sequence in the usual sense. In any escape sequence '\X' + that GNU 'troff' does not recognize, the escape character is + ignored and X is output. An unrecognized escape sequence causes a + warning in category 'escape', with two exceptions--'\\' is the + first. + + -- Escape sequence: \. + '\.' escapes the control character. It is similar to '\\' in that + it isn't a true escape sequence. It is used to permit nested macro + definitions to end without a named macro call to conclude them. + Without a syntax for escaping the control character, this would not + be possible. + + .de m1 + foo + . + . de m2 + bar + \\.. + . + .. + .m1 + .m2 + => foo bar + + The first backslash is consumed while the macro is read, and the + second is interpreted when macro 'm1' is called. + + 'roff' documents should not use the '\\' or '\.' character sequences +outside of copy mode; they serve only to obfuscate the input. Use '\e' +to represent the escape character, '\[rs]' to obtain a backslash glyph, +and '\&' before '.' and ''' where GNU 'troff' expects them as control +characters if you mean to use them literally (recall *note Requests and +Macros::). + + Macro definitions can be nested to arbitrary depth. The mechanics of +parsing the escape character have significant consequences for this +practice. + + .de M1 + \\$1 + . de M2 + \\\\$1 + . de M3 + \\\\\\\\$1 + \\\\.. + . M3 hand. + \\.. + . M2 of + .. + This understeer is getting + .M1 out + => This understeer is getting out of hand. + + Each escape character is interpreted twice--once in copy mode, when +the macro is defined, and once in interpretation mode, when the macro is +called. As seen above, this fact leads to exponential growth in the +quantity of escape characters required to delay interpolation of '\n', +'\g', '\$', '\*', '\V', and '\?' at each nesting level, which can be +daunting. GNU 'troff' offers a solution. + + -- Escape sequence: \E + '\E' represents an escape character that is not interpreted in copy + mode. You can use it to ease the writing of nested macro + definitions. + + .de M1 + . nop \E$1 + . de M2 + . nop \E$1 + . de M3 + . nop \E$1 + \\\\.. + . M3 better. + \\.. + . M2 bit + .. + This vehicle handles + .M1 a + => This vehicle handles a bit better. + + Observe that because '\.' is not a true escape sequence, we can't + use '\E' to keep '..' from ending a macro definition prematurely. + If the multiplicity of backslashes complicates maintenance, use end + macros. + + '\E' is also convenient to define strings containing escape + sequences that need to work when used in copy mode (for example, as + macro arguments), or which will be interpolated at varying macro + nesting depths. We might define strings to begin and end + superscripting as follows.(2) (*note Copy Mode-Footnote-2::) + + .ds { \v'-.9m\s'\En[.s]*7u/10u'+.7m' + .ds } \v'-.7m\s0+.9m' + + When the 'ec' request is used to redefine the escape character, + '\E' also makes it easier to distinguish the semantics of an escape + character from the other meaning(s) its character might have. + Consider the use of an unusual escape character, '-'. + + .nr a 1 + .ec - + .de xx + --na + .. + .xx + => -na + + This result may surprise you; some people expect '1' to be output + since register 'a' has clearly been defined with that value. What + has happened? The robotic replacement of '\' with '-' has led us + astray. You might recognize the sequence '--' more readily with + the default escape character as '\-', the special character escape + sequence for the minus sign glyph. + + .nr a 1 + .ec - + .de xx + -Ena + .. + .xx + => 1 + + +File: groff.info, Node: Copy Mode-Footnotes, Up: Copy Mode + + (1) Compare this to the '\def' and '\edef' commands in TeX. + + (2) These are lightly adapted from the 'groff' implementation of the +'ms' macros. + + +File: groff.info, Node: Page Motions, Next: Drawing Geometric Objects, Prev: Writing Macros, Up: GNU troff Reference + +5.25 Page Motions +================= + +*Note Manipulating Spacing::, for a discussion of the most commonly used +request for vertical motion, 'sp', which spaces downward by one vee. + + -- Request: .mk [reg] + -- Request: .rt [dist] + You can "mark" a location on a page for subsequent "return". 'mk' + takes an argument, a register name in which to store the current + page location. If given no argument, it stores the location in an + internal register. This location can be used later by the 'rt' or + the 'sp' requests (or the '\v' escape). + + The 'rt' request returns _upward_ to the location marked with the + last 'mk' request. If used with an argument, it returns to a + vertical position DIST from the top of the page (no previous call + to 'mk' is necessary in this case). The default scaling unit is + 'v'. + + If a page break occurs between a 'mk' request and its matching 'rt' + request, the 'rt' request is silently ignored. + + A simple implementation of a macro to set text in two columns + follows. + + .nr column-length 1.5i + .nr column-gap 4m + .nr bottom-margin 1m + . + .de 2c + . br + . mk + . ll \\n[column-length]u + . wh -\\n[bottom-margin]u 2c-trap + . nr right-side 0 + .. + . + .de 2c-trap + . ie \\n[right-side] \{\ + . nr right-side 0 + . po -(\\n[column-length]u + \\n[column-gap]u) + . \" remove trap + . wh -\\n[bottom-margin]u + . \} + . el \{\ + . \" switch to right side + . nr right-side 1 + . po +(\\n[column-length]u + \\n[column-gap]u) + . rt + . \} + .. + + Now let us apply our two-column macro. + + .pl 1.5i + .ll 4i + This is a small test that shows how the + rt request works in combination with mk. + + .2c + Starting here, text is typeset in two columns. + Note that this implementation isn't robust + and thus not suited for a real two-column + macro. + => This is a small test that shows how the + => rt request works in combination with mk. + => + => Starting here, isn't robust + => text is typeset and thus not + => in two columns. suited for a + => Note that this real two-column + => implementation macro. + + Several escape sequences enable fine control of movement about the +page. + + -- Escape sequence: \v'expr' + Vertically move the drawing position. EXPR indicates the magnitude + of motion: positive is downward and and negative upward. The + default scaling unit is 'v'. The motion is relative to the current + drawing position unless EXPR begins with the boundary-relative + motion operator '|'. *Note Numeric Expressions::. + + Text processing continues at the new drawing position; usually, + vertical motions should be in balanced pairs to avoid a confusing + page layout. + + '\v' will not spring a vertical position trap. This can be useful; + for example, consider a page bottom trap macro that prints a marker + in the margin to indicate continuation of a footnote. *Note + Traps::. + + A few escape sequences that produce vertical motion are unusual. +They are thought to originate early in AT&T 'nroff' history to achieve +super- and subscripting by half-line motions on line printers and +teletypewriters before the phototypesetter made more precise positioning +available. They are reckoned in ems--not vees--to maintain continuity +with their original purpose of moving relative to the size of the type +rather than the distance between text baselines (vees).(1) (*note Page +Motions-Footnote-1::) + + -- Escape sequence: \r + -- Escape sequence: \u + -- Escape sequence: \d + Move upward 1m, upward .5m, and downward .5m, respectively. + +Let us see these escape sequences in use. + + Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU. + + In the foregoing we have paired '\u' and '\d' to typeset a +superscript, and later a full em negative ("reverse") motion to place a +superscript above a subscript. A numeral-width horizontal motion escape +sequence aligns the proton and nucleon numbers, while '\k' marks a +horizontal position to which '\h' returns so that we could stack them. +(We shall discuss these horizontal motion escape sequences presently.) +In serious applications, we often want to alter the type size of the +-scripts and to fine-tune the vertical motions, as the 'groff' 'ms' +package does with its super- and subscripting string definitions. + + -- Escape sequence: \h'expr' + Horizontally move the drawing position. EXPR indicates the + magnitude of motion: positive is rightward and negative leftward. + The default scaling unit is 'm'. The motion is relative to the + current drawing position unless EXPR begins with the + boundary-relative motion operator '|'. *Note Numeric + Expressions::. + + The following string definition sets the TeX logo.(2) (*note Page +Motions-Footnote-2::) + + .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\" + + There are a number of special-case escape sequences for horizontal +motion. + + -- Escape sequence: \ + Move right one word space. (The input is a backslash followed by a + space.) This escape sequence can be thought of as a + non-adjustable, unbreakable space. Usually you want '\~' instead; + see *note Manipulating Filling and Adjustment::. + + -- Escape sequence: \| + Move one-sixth em to the right on typesetting output devices. If a + glyph named '\|' is defined in the current font, its width is used + instead, even on terminal output devices. + + -- Escape sequence: \^ + Move one-twelfth em to the right on typesetting output devices. If + a glyph named '\^' is defined in the current font, its width is + used instead, even on terminal output devices. + + -- Escape sequence: \0 + Move right by the width of a numeral in the current font. + + Horizontal motions are not discarded at the end of an output line as +word spaces are. *Note Breaking::. + + -- Escape sequence: \w'anything' + -- Register: \n[st] + -- Register: \n[sb] + -- Register: \n[rst] + -- Register: \n[rsb] + -- Register: \n[ct] + -- Register: \n[ssc] + -- Register: \n[skw] + Interpolate the width of ANYTHING in basic units. This escape + sequence allows several properties of formatted output to be + measured without writing it out. + + The length of the string 'abc' is \w'abc'u. + => The length of the string 'abc' is 72u. + + ANYTHING is processed in a dummy environment: this means that font + and type size changes, for example, may occur within it without + affecting subsequent output. + + After each use, '\w' sets several registers. + + 'st' + 'sb' + The maximum vertical displacements of the text baseline above + and below, respectively. The sign convention is opposite that + of relative vertical motions; that is, depth below the + (original) baseline is negative. These registers are + incorrectly documented in the AT&T 'troff' manual as "the + highest and lowest extent of [the argument to '\w'] relative + to the baseline". + + 'rst' + 'rsb' + Like 'st' and 'sb', but taking account of the heights and + depths of glyphs. In other words, these registers store the + highest and lowest vertical positions attained by ANYTHING, + doing what AT&T 'troff' documented 'st' and 'sb' as doing. + + 'ct' + Characterizes the geometry of glyphs occurring in ANYTHING. + + 0 + only short glyphs, no descenders or tall glyphs + + 1 + at least one descender + + 2 + at least one tall glyph + + 3 + at least one each of a descender and a tall glyph + + 'ssc' + The amount of horizontal space (possibly negative) that should + be added to the last glyph before a subscript. + + 'skw' + How far to right of the center of the last glyph in the '\w' + argument, the center of an accent from a roman font should be + placed over that glyph. + + -- Escape sequence: \kp + -- Escape sequence: \k(ps + -- Escape sequence: \k[position] + Store the current horizontal position in the _input_ line in a + register with the name POSITION (one-character name P, + two-character name PS). Use this, for example, to return to the + beginning of a string for highlighting or other decoration. + + -- Register: \n[hp] + The current horizontal position at the input line. + + -- Register: \n[.k] + A read-only register containing the current horizontal output + position (relative to the current indentation). + + -- Escape sequence: \o'abc...' + Overstrike the glyphs of characters A, B, C, ...; the glyphs are + centered, written, and the drawing position advanced by the widest + of the glyphs. + + -- Escape sequence: \zc + Format the character C with zero width; that is, without advancing + the drawing position. Use '\z' to overstrike glyphs aligned to + their left edges, in contrast to '\o''s centering. + + -- Escape sequence: \Z'anything' + Save the drawing position, format ANYTHING, then restore it. Tabs + and leaders in the argument are ignored with an error diagnostic. + + We might implement a strike-through macro thus. + + .de ST + .nr width \w'\\$1' + \Z@\v'-.25m'\l'\\n[width]u'@\\$1 + .. + . + This is + .ST "a test" + an actual emergency! + + +File: groff.info, Node: Page Motions-Footnotes, Up: Page Motions + + (1) At the 'grops' defaults of 10-point type on 12-point vertical +spacing, the difference between half a vee and half an em can be subtle: +large spacings like '.vs .5i' make it obvious. + + (2) *Note Strings::, for an explanation of the trailing '\"'. + + +File: groff.info, Node: Drawing Geometric Objects, Next: Traps, Prev: Page Motions, Up: GNU troff Reference + +5.26 Drawing Geometric Objects +============================== + +A few of the formatter's escape sequences draw lines and other geometric +objects. Combined with each other and with page motion commands (*note +Page Motions::), a wide variety of figures is possible. For complex +drawings, these operations can be cumbersome; the preprocessors 'gpic' +or 'ggrn' are typically used instead. + + The '\l' and '\L' escape sequences draw horizontal and vertical +sequences of glyphs, respectively. Even the simplest of output devices +supports them. + + -- Escape sequence: \l'l' + -- Escape sequence: \l'lc' + Draw a horizontal line of length L from the drawing position. + Rightward motion is positive. Afterward, the drawing position is + at the right end of the line. The default scaling unit is 'm'. + + The optional second parameter C is a character with which to draw + the line. The default is the baseline rule special character, + '\[ru]'. + + If C is a valid scaling unit, put '\&' after L to disambiguate the + input. + + .de textbox + \[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]' + .. + + The foregoing outputs a box rule (a vertical line), the text + argument(s), and another box rule. We employ the boundary-relative + motion operator '|'. Finally, the line-drawing escape sequences + draw a radical extender (a form of overline) and an underline from + the drawing position to the position coresponding to beginning of + the _input_ line. The drawing position returns to just after the + right-hand box rule because the lengths of the drawn lines are + negative, as noted above. + + -- Escape sequence: \L'l' + -- Escape sequence: \L'lc' + Draw a vertical line of length L from the drawing position. + Downward motion is positive. The default scaling unit is 'v'. The + default character is the box rule, '\[br]'. As with vertical + motion escape sequences, text processing continues where the line + ends. '\L' is otherwise similar to '\l'. + + $ nroff < This is a + => | + => | + => |test. + + When writing text, the drawing position is at the text baseline; + recall *note Page Geometry::. + + The '\D' escape sequence provides "drawing commands" that direct the +output device to render geometrical objects rather than glyphs. +Specific devices may support only a subset, or may feature additional +ones; consult the man page for the output driver in use. Terminal +devices in particular implement almost none. *Note Graphics Commands::. + + Rendering starts at the drawing position; when finished, the drawing +position is left at the rightmost point of the object, even for closed +figures, except where noted. GNU 'troff' draws stroked (outlined) +objects with the stroke color, and shades filled ones with the fill +color. *Note Colors::. Coordinates H and V are horizontal and vertical +motions relative to the drawing position or previous point in the +command. The default scaling unit for horizontal measurements (and +diameters of circles) is 'm'; for vertical ones, 'v'. + + Circles, ellipses, and polygons can be drawn filled or stroked. +These are independent properties; if you want a filled, stroked figure, +you must draw the same figure twice using each drawing command. A +filled figure is always smaller than an outlined one because the former +is drawn only within its defined area, whereas strokes have a line +thickness (set with '\D't''). + + \h'1i'\v'1i'\ + \# increase line thickness + \Z'\D't 5p''\ + \# draw stroked (unfilled) polygon + \Z'\D'p 3 3 -6 0''\ + \# draw filled (solid) polygon + \Z'\D'P 3 3 -6 0'' + + -- Escape sequence: \D'command argument ...' + Drawing command escape sequence parameters begin with an ordinary + character, COMMAND, selecting the type of object to be drawn, + followed by ARGUMENTs whose meaning is determined by COMMAND. + + '\D'~ H1 V1 ... HN VN'' + Draw a B-spline to each point in sequence, leaving the drawing + position at (HN, VN). + + '\D'a HC VC H V'' + Draw a circular arc centered at (HC, VC) counterclockwise from + the drawing position to a point (H, V) relative to the center. + (1) (*note Drawing Geometric Objects-Footnote-1::) + + '\D'c D'' + Draw a circle of diameter D with its leftmost point at the + drawing position. + + '\D'C D'' + As '\D'C ...'', but the circle is filled. + + '\D'e H V'' + Draw an ellipse of width H and height V with its leftmost + point at the drawing position. + + '\D'E X Y'' + As '\D'e ...'', but the ellipse is filled. + + '\D'l DX DY'' + Draw line from the drawing position to (H, V). + + The following is a macro for drawing a box around a text + argument; for simplicity, the box margin is a fixed at 0.2m. + + .de TEXTBOX + . nr @wd \w'\\$1' + \h'.2m'\ + \h'-.2m'\v'(.2m - \\n[rsb]u)'\ + \D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\ + \D'l (\\n[@wd]u + .4m) 0'\ + \D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\ + \D'l -(\\n[@wd]u + .4m) 0'\ + \h'.2m'\v'-(.2m - \\n[rsb]u)'\ + \\$1\ + \h'.2m' + .. + + The argument is measured with the '\w' escape sequence. Its + width is stored in register '@wd'. '\w' also sets the + registers 'rst' and 'rsb'; these contain its maximum vertical + extents of the argument. Then, four lines are drawn to form a + box, offset by the box margin. + + '\D'p H1 V1 ... HN VN'' + Draw polygon with vertices at drawing position and each point + in sequence. GNU 'troff' closes the polygon by drawing a line + from (HN, VN) back to the initial drawing position. + Afterward, the drawing position is left at (HN, VN). + + '\D'P DX1 DY1 DX2 DY2 ...'' + As '\D'P ...'', but the polygon is filled. + + The following macro is like the '\D'l'' example, but shades + the box. We draw the box before writing the text because + colors in GNU 'troff' have no transparency; in othe opposite + order, the filled polygon would occlude the text. + + .de TEXTBOX + . nr @wd \w'\\$1' + \h'.2m'\ + \h'-.2m'\v'(.2m - \\n[rsb]u)'\ + \M[lightcyan]\ + \D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \ + (\\n[@wd]u + .4m) 0 \ + 0 (\\n[rst]u - \\n[rsb]u + .4m) \ + -(\\n[@wd]u + .4m) 0'\ + \h'.2m'\v'-(.2m - \\n[rsb]u)'\ + \M[]\ + \\$1\ + \h'.2m' + .. + + '\D't N'' + Set the stroke thickness of geometric objects to N basic + units. A zero N selects the minimal supported thickness. A + negative N selects a thickness proportional to the type size; + this is the default. + + In a hazy penumbra between text rendering and drawing commands we +locate the bracket-building escape sequence, '\b'. It can assemble +apparently large glyphs by vertically stacking ordinary ones. + + -- Escape sequence: \b'contents' + Pile and center a sequence of glyphs vertically on the output line. + "Piling" stacks glyphs corresponding to each character in CONTENTS, + read from left to right, and placed from top to bottom. GNU + 'troff' separates the glyphs vertically by 1m, and the pile itself + is centered 0.5m above the text baseline. The horizontal drawing + position is then advanced by the width of the widest glyph in the + pile. + + This rather inflexible positioning algorithm doesn't work with the + 'dvi' output device since its bracket pieces vary in height. + Instead, use the 'geqn' preprocessor. + + *note Manipulating Spacing:: describes how to adjust the vertical + spacing of the output line with the '\x' escape sequence. + + The application of '\b' that lends its name is construction of + brackets, braces, and parentheses when typesetting mathematics. We + might construct a large opening (left) brace as follows. + + \b'\[lt]\[bv]\[lk]\[bv]\[lb]' + + See 'groff_char(7)' for a list of special character identifiers. + + +File: groff.info, Node: Drawing Geometric Objects-Footnotes, Up: Drawing Geometric Objects + + (1) (HC, VC) is adjusted to the point nearest the perpendicular +bisector of the arc's chord. + + +File: groff.info, Node: Deferring Output, Next: Traps, Prev: Drawing Geometric Objects, Up: GNU troff Reference + +5.27 Deferring Output +===================== + +A few 'roff' language elements are generally not used in simple +documents, but arise as page layouts become more sophisticated and +demanding. "Environments" collect formatting parameters like line +length and typeface. A "diversion" stores formatted output for later +use. A "trap" is a condition on the input or output, tested +automatically by the formatter, that is associated with a macro, causing +it to be called when that condition is fulfilled. + + Footnote support often exercises all three of the foregoing features. +A simple implementation might work as follows. A pair of macros is +defined: one starts a footnote and the other ends it. The author calls +the first macro where a footnote marker is desired. The macro +establishes a diversion so that the footnote text is collected at the +place in the body text where its corresponding marker appears. An +environment is created for the footnote so that it is set at a smaller +typeface. The footnote text is formatted in the diversion using that +environment, but it does not yet appear in the output. The document +author calls the footnote end macro, which returns to the previous +environment and ends the diversion. Later, after much more body text in +the document, a trap, set a small distance above the page bottom, is +sprung. The macro called by the trap draws a line across the page and +emits the stored diversion. Thus, the footnote is rendered. + + Diversions and traps make the text formatting process non-linear. +Let us imagine a set of text lines or paragraphs labelled 'A', 'B', and +so on. If we set up a trap that produces text 'T' (as a page footer, +say), and we also use a diversion to store the formatted text 'D', then +a document with input text in the order 'A B C D E F' might render as 'A +B C E T F'. The diversion 'D' will never be output if we do not call +for it. + + Environments of themselves are not a source of non-linearity in +document formatting: environment switches have immediate effect. One +could always write a macro to change as many formatting parameters as +desired with a single convenient call. But because diversions can be +nested and macros called by traps that are sprung by other trap-called +macros, they may be called upon in varying contexts. For example, +consider a page header that is always to be set in Helvetica. A +document that uses Times for most of its body text, but Courier for +displayed code examples, poses a challenge if a page break occurs in the +middle of a code display; if the header trap assumes that the "previous +font" is always Times, the rest of the example will be formatted in the +wrong typeface. One could carefully save all formatting parameters upon +entering the trap and restore them upon leaving it, but this is verbose, +error-prone, and not future-proof as the 'groff' language develops. +Environments save us considerable effort. + + +File: groff.info, Node: Traps, Next: Diversions, Prev: Deferring Output, Up: GNU troff Reference + +5.28 Traps +========== + +"Traps" are locations in the output or conditions on the input that, +when reached or fulfilled, call a specified macro. These traps can +occur at a given location on the page, at a given location in the +current diversion (together, these are known as vertical position +traps), at a blank line, at a line with leading space characters, after +a quantity of input lines, or at the end of input. Macros called by +traps are passed no arguments. Setting a trap is also called "planting" +one. It is said that a trap is "sprung" if its condition is fulfilled. + +* Menu: + +* Vertical Position Traps:: +* Diversion Traps:: +* Input Line Traps:: +* Blank Line Traps:: +* Leading Space Traps:: +* End-of-input Traps:: + + +File: groff.info, Node: Vertical Position Traps, Next: Page Location Traps, Prev: Traps, Up: Traps + +5.28.1 Vertical Position Traps +------------------------------ + +A "vertical position trap" calls a macro when the formatter's vertical +drawing position reaches or passes, in the downward direction, a certain +location on the output page or in a diversion. Its applications include +setting page headers and footers, body text in multiple columns, and +footnotes. + + -- Request: .vpt [flag] + -- Register: \n[.vpt] + Enable vertical position traps if FLAG is non-zero or absent; + disable them otherwise. Vertical position traps are those set by + the 'wh' request or by 'dt' within a diversion. The parameter that + controls whether vertical position traps are enabled is global. + Initially, vertical position traps are enabled. The current value + is stored in the '.vpt' read-only register. + + A page can't be ejected if 'vpt' is set to zero; see *note The + Implicit Page Trap::. + +* Menu: + +* Page Location Traps:: +* The Implicit Page Trap:: +* Diversion Traps:: + + +File: groff.info, Node: Page Location Traps, Next: The Implicit Page Trap, Prev: Vertical Position Traps, Up: Vertical Position Traps + +5.28.1.1 Page Location Traps +............................ + +A "page location trap" is a vertical position trap that applies to the +page; that is, to undiverted output. Many can be present; manage them +with the 'wh' and 'ch' requests. + + -- Request: .wh dist [name] + Plant macro NAME as page location trap at DIST. The default + scaling unit is 'v'. Non-negative values for DIST set the trap + relative to the top of the page; negative values set the trap + relative to the bottom of the page. It is not possible to plant a + trap less than one basic unit from the page bottom: a DIST of '-0' + is interpreted as '0', the top of the page.(1) (*note Page + Location Traps-Footnote-1::) An existing _visible_ trap (see below) + at DIST is removed; this is 'wh''s sole function if NAME is + missing. + + A trap is sprung only if it is "visible", meaning that its location + is reachable on the page(2) (*note Page Location + Traps-Footnote-2::) and it is not hidden by another trap at the + same location already planted there. + + A macro package might set headers and footers as follows; this + example configures vertical margins of one inch to the body text, + and one half-inch to the titles. Observe the use of the no-break + control character with 'sp' request to position our text baselines, + and the page number character '%' used with the 'tl' request. + + .\" hdfo.roff + .de hd \" page header + ' sp .5i + ' tl '\\*(Ti''\\*(Da' \" title and date strings + ' sp .5i + .. + .de fo \" page footer + ' sp .5i + . tl ''%'' + . bp + .. + .wh 0 hd \" trap at top of the page + .wh -1i fo \" trap 1 inch from bottom + + To use these traps, copy the above (or load it from a file with the + 'so' or 'mso' requests), then set up the strings it uses. + + .so hdfo.roff + .ds Ti Final Report\" + .ds Da 21 May 2023\" + .ti + On 5 August of last year, + this committee tasked me with the investigation of the + CFIT (controlled flight into terrain) incident of + .\" ...and so on... + + A trap above the top or at or below the bottom of the page can be + made visible by either moving it into the page area or increasing + the page length so that the trap is on the page. Negative trap + values always use the _current_ page length; they are not converted + to an absolute vertical position. We can use the 'ptr' request to + dump our page location traps to the standard error stream (*note + Debugging::). Their positions are reported in basic units; an + 'nroff' device example follows. + + .pl 5i + .wh -1i xx + .ptr + error-> xx -240 + .pl 100i + .ptr + error-> xx -240 + + It is possible to have more than one trap at the same location + (although only one at a time can be visible); to achieve this, the + traps must be defined at different locations, then moved to the + same place with the 'ch' request. In the following example, the + many empty lines caused by the 'bp' request are not shown in the + output. + + .de a + . nop a + .. + .de b + . nop b + .. + .de c + . nop c + .. + . + .wh 1i a + .wh 2i b + .wh 3i c + .bp + => a b c + .ch b 1i + .ch c 1i + .bp + => a + .ch a 0.5i + .bp + => a b + + -- Register: \n[.t] + The read-only register '.t' holds the distance to the next vertical + position trap. If there are no traps between the current position + and the bottom of the page, it contains the distance to the page + bottom. Within a diversion, in the absence of a diversion trap, + this distance is the largest representable integer in basic + units--effectively infinite. + + -- Request: .ch name [dist] + Change the location of a trap by moving macro NAME to new location + DIST, or by unplanting it altogether if DIST is absent. The + default scaling unit is 'v'. Parameters to 'ch' are specified in + the opposite order from 'wh'. If NAME is the earliest planted + macro of multiple traps at the same location, (re)moving it from + that location exposes the macro next least recently planted at the + same place.(3) (*note Page Location Traps-Footnote-3::) + + Changing a trap's location is useful for building up footnotes in a + diversion to allow more space at the bottom of the page for them. + + The same macro can be installed simultaneously at multiple locations; +however, only the earliest-planted instance--that has not yet been +deleted with 'wh'--will be moved by 'ch'. The following example (using +an 'nroff' device) illustrates this behavior. Blank lines have been +elided from the output. + + .de T + Trap sprung at \\n(nlu. + .br + .. + .wh 1i T + .wh 2i T + foo + .sp 11i + .bp + .ch T 4i + bar + .sp 11i + .bp + .ch T 5i + baz + .sp 11i + .bp + .wh 5i + .ch T 6i + qux + .sp 11i + => foo + => Trap sprung at 240u. + => Trap sprung at 480u. + => bar + => Trap sprung at 480u. + => Trap sprung at 960u. + => baz + => Trap sprung at 480u. + => Trap sprung at 1200u. + => qux + => Trap sprung at 1440u. + + -- Register: \n[.ne] + The read-only register '.ne' contains the amount of space that was + needed in the last 'ne' request that caused a trap to be sprung; it + is useful in conjunction with the '.trunc' register. *Note Page + Control::. Since the '.ne' register is set only by traps, it + doesn't make sense to interpolate it outside of macros called by + traps. + + -- Register: \n[.trunc] + A read-only register containing the amount of vertical space + truncated from an 'sp' request by the most recently sprung vertical + position trap, or, if the trap was sprung by an 'ne' request, minus + the amount of vertical motion produced by the 'ne' request. In + other words, at the point a trap is sprung, it represents the + difference of what the vertical position would have been but for + the trap, and what the vertical position actually is. Since the + '.trunc' register is set only by traps, it doesn't make sense to + interpolate it outside of macros called by traps. + + -- Register: \n[.pe] + This Boolean-valued, read-only register interpolates 1 while a page + is being ejected, and 0 otherwise. + + In the following example, we plant the same trap at the top and the + bottom of the page. We also make the trap report its name and the + vertical drawing position. + + .de T + .tm \\$0: page \\n%, nl=\\n[nl] .pe=\\n[.pe] + .. + .ll 46n + .wh 0 T + .wh -1v T + Those who can make you believe absurdities can make you + commit atrocities. \[em] Voltaire + error-> T: page 1, nl=0 .pe=0 + error-> T: page 1, nl=2600 .pe=1 + => Those who can make you believe absurdities can + => make you commit atrocities. -- Voltaire + + When designing macros, keep in mind that diversions and traps do +normally interact. For example, if a trap calls a header macro (while +outputting a diversion) that tries to change the font on the current +page, the effect is not visible before the diversion has completely been +printed (except for input protected with '\!' or '\?') since the data in +the diversion is already formatted. In most cases, this is not the +expected behaviour. + + +File: groff.info, Node: Page Location Traps-Footnotes, Up: Page Location Traps + + (1) *Note The Implicit Page Trap::. + + (2) A trap planted at '20i' or '-30i' will not be sprung on a page of +length '11i'. + + (3) It may help to think of each trap location as maintaining a +queue; 'wh' operates on the head of the queue, and 'ch' operates on its +tail. Only the trap at the head of the queue is visible. + + +File: groff.info, Node: The Implicit Page Trap, Next: Diversion Traps, Prev: Page Location Traps, Up: Vertical Position Traps + +5.28.1.2 The Implicit Page Trap +............................... + +If, after starting GNU 'troff' without loading a macro package, you use +the 'ptr' request to dump a list of the active traps to the standard +error stream,(1) (*note The Implicit Page Trap-Footnote-1::) nothing is +reported. Yet the '.t' register will report a steadily decreasing value +with every output line your document produces, and once the value of +'.t' gets to within '.V' of zero, you will notice that something +trap-like happens--the page is ejected, a new one begins, and the value +of '.t' becomes large once more. + + This "implicit page trap" always exists in the top-level +diversion;(2) (*note The Implicit Page Trap-Footnote-2::) it works like +a trap in some ways but not others. Its purpose is to eject the current +page and start the next one. It has no name, so it cannot be moved or +deleted with 'wh' or 'ch' requests. You cannot hide it by placing +another trap at its location, and can move it only by redefining the +page length with 'pl'. Its operation is suppressed when vertical page +traps are disabled with GNU 'troff''s 'vpt' request. + + +File: groff.info, Node: The Implicit Page Trap-Footnotes, Up: The Implicit Page Trap + + (1) *Note Debugging::. + + (2) *Note Diversions::. + + +File: groff.info, Node: Diversion Traps, Next: Input Line Traps, Prev: The Implicit Page Trap, Up: Vertical Position Traps + +5.28.1.3 Diversion Traps +........................ + +A diversion is not formatted in the context of a page, so it lacks page +location traps; instead it can have a "diversion trap". There can exist +at most one such vertical position trap per diversion. + + -- Request: .dt [dist name] + Set a trap _within_ a diversion at location DIST, which is + interpreted relative to diversion rather than page boundaries. If + invoked with fewer than two arguments, any diversion trap in the + current diversion is removed. The register '.t' works within + diversions. It is an error to invoke 'dt' in the top-level + diversion. *Note Diversions::. + + +File: groff.info, Node: Input Line Traps, Next: Blank Line Traps, Prev: Diversion Traps, Up: Traps + +5.28.2 Input Line Traps +----------------------- + + -- Request: .it [n name] + -- Request: .itc [n name] + Set an input line trap, calling macro NAME after processing the + next N productive input lines (recall *note Manipulating Filling + and Adjustment::). Any existing input line trap in the environment + is replaced. Without arguments, 'it' and 'itc' clear any input + line trap that has not yet sprung. + + Consider a macro '.ST S N' which sets the next N input lines in the + font style S. + + .de ST \" Use style $1 for next $2 text lines. + . it \\$2 ES + . ft \\$1 + .. + .de ES \" end ST + . ft R + .. + .ST I 1 + oblique + face + .ST I 1 + oblique\c + face + => oblique face obliqueface (second "face" upright) + + Unlike the 'ce' and 'rj' requests, 'it' counts lines interrupted + with the '\c' escape sequence separately (*note Line + Continuation::); 'itc' does not. To see the difference, let's + change the previous example to use 'itc' instead. + + ... + . itc \\$2 ES + ... + => oblique face obliqueface (second "face" oblique) + + You can think of the 'ce' and 'rj' requests as implicitly creating + an input line trap with 'itc' that schedules a break when the trap + is sprung. + + .de BR + . br + . internal: disable centering-without-filling + .. + . + .de ce + . if \\n[.br] .br + . itc \\$1 BR + . internal: enable centering-without-filling + .. + + Let us consider in more detail the sorts of input lines that are or + are not "productive". + + .de Trap + TRAP SPRUNG + .. + .de Mac + .if r a \l'5n' + .. + .it 2 Trap + . + foo + .Mac + bar + baz + .it 1 Trap + .sp \" moves, but does not write or draw + qux + .itc 1 Trap + \h'5n'\c \" moves, but does not write or draw + jat + + When 'Trap' gets called depends on whether the 'a' register is + defined; the control line with the 'if' request may or may not + produce written output. We also see that the spacing request 'sp', + while certainly affecting the output, does not spring the input + line trap. Similarly, the horizontal motion escape sequence '\h' + also affected the output, but was not "written". Observe that we + had to follow it with '\c' and use 'itc' to prevent the newline at + the end of the text line from causing a word break, which, like an + ordinary space character, counts as written output. + + $ groff -Tascii input-trap-example.groff + => foo bar TRAP SPRUNG baz + => + => qux TRAP SPRUNG jat TRAP SPRUNG + $ groff -Tascii -ra1 input-trap-example.groff + => foo _____ TRAP SPRUNG bar baz + => + => qux TRAP SPRUNG jat TRAP SPRUNG + + Input line traps are associated with the environment (*note +Environments::); switching to another environment suspends the current +input line trap, and going back resumes it, restoring the count of +qualifying lines enumerated in that environment. + + +File: groff.info, Node: Blank Line Traps, Next: Leading Space Traps, Prev: Input Line Traps, Up: Traps + +5.28.3 Blank Line Traps +----------------------- + + -- Request: .blm [name] + Set a blank line trap, calling the macro NAME when GNU 'troff' + encounters a blank line in an input file, instead of the usual + behavior (*note Breaking::). A line consisting only of spaces is + also treated as blank and subject to this trap. If no argument is + supplied, the default blank line behavior is (re-)established. + + +File: groff.info, Node: Leading Space Traps, Next: End-of-input Traps, Prev: Blank Line Traps, Up: Traps + +5.28.4 Leading Space Traps +-------------------------- + + -- Request: .lsm [name] + -- Register: \n[lsn] + -- Register: \n[lss] + Set a leading space trap, calling the macro NAME when GNU 'troff' + encounters leading spaces in an input line; the implicit line break + that normally happens in this case is suppressed. If no argument + is supplied, the default leading space behavior is (re-)established + (*note Breaking::). + + The count of leading spaces on an input line is stored in register + 'lsn', and the amount of corresponding horizontal motion in + register 'lss', irrespective of whether a leading space trap is + set. When it is, the leading spaces are removed from the input + line, and no motion is produced before calling NAME. + + +File: groff.info, Node: End-of-input Traps, Prev: Leading Space Traps, Up: Traps + +5.28.5 End-of-input Traps +------------------------- + + -- Request: .em [name] + Set a trap at the end of input, calling macro NAME after the last + line of the last input file has been processed. If no argument is + given, any existing end-of-input trap is removed. + + For example, if the document had to have a section at the bottom of + the last page for someone to approve it, the 'em' request could be + used. + + .de approval + \c + . ne 3v + . sp (\\n[.t]u - 3v) + . in +4i + . lc _ + . br + Approved:\t\a + . sp + Date:\t\t\a + .. + . + .em approval + + The '\c' in the above example needs explanation. For historical + reasons (compatibility with AT&T 'troff'), the end-of-input macro + exits as soon as it causes a page break if no partially collected + line remains.(1) (*note End-of-input Traps-Footnote-1::) + + Let us assume that there is no '\c' in the above 'approval' macro, + that the page is full, and last output line has been broken with, + say, a 'br' request. Because there is no more room, a 'ne' request + at this point causes a page ejection, which in turn makes 'troff' + exit immediately as just described. In most situations, this is + not desired; people generally want to format the input after 'ne'. + + To force processing of the whole end-of-input macro independently + of this behavior, it is thus advisable to (invisibly) ensure the + existence of a partially collected line ('\c') whenever there is a + chance that a page break can happen. In the above example, + invoking the 'ne' request ensures that there is room for the + subsequent formatted output on the same page, so we need insert + '\c' only once. + + The next example shows how to append three lines, then start a new + page unconditionally. Since '.ne 1' doesn't give the desired + effect--there is always one line available or we are already at the + beginning of the next page--we temporarily increase the page length + by one line so that we can use '.ne 2'. + + .de EM + .pl +1v + \c + .ne 2 + line one + .br + \c + .ne 2 + line two + .br + \c + .ne 2 + line three + .br + .pl -1v + \c + 'bp + .. + .em EM + + This specific feature affects only the first potential page break + caused by the end-of-input macro; further page breaks emitted by + the macro are handled normally. + + Another possible use of the 'em' request is to make GNU 'troff' + emit a single large page instead of multiple pages. For example, + one may want to produce a long plain text file for reading in a + terminal or emulator without page footers and headers interrupting + the body of the document. One approach is to set the page length + at the beginning of the document to a very large value to hold all + the text,(2) (*note End-of-input Traps-Footnote-2::) and + automatically adjust it to the exact height of the document after + the text has been output. + + .de adjust-page-length + . br + . pl \\n[nl]u \" \n[nl]: current vertical position + .. + . + .de single-page-mode + . pl 99999 + . em adjust-page-length + .. + . + .\" Activate the above code if configured. + .if \n[do-continuous-rendering] \ + . single-page-mode + + Since only one end-of-input trap exists and another macro package + may already use it, care must be taken not to break the mechanism. + A simple solution would be to append the above macro to the macro + package's end-of-input macro using the 'am' request. + + +File: groff.info, Node: End-of-input Traps-Footnotes, Up: End-of-input Traps + + (1) While processing an end-of-input macro, the formatter assumes +that the next page break must be the last; it goes into "sudden death +overtime". + + (2) Another, taken by the 'groff' 'man' macros, is to intercept 'ne' +requests and wrap 'bp' ones. + + +File: groff.info, Node: Diversions, Next: Punning Names, Prev: Traps, Up: GNU troff Reference + +5.29 Diversions +=============== + +In 'roff' systems it is possible to format text as if for output, but +instead of writing it immediately, one can "divert" the formatted text +into a named storage area. It is retrieved later by specifying its name +after a control character. The same name space is used for such +diversions as for strings and macros; see *note Identifiers::. Such +text is sometimes said to be "stored in a macro", but this coinage +obscures the important distinction between macros and strings on one +hand and diversions on the other; the former store _unformatted_ input +text, and the latter capture _formatted_ output. Diversions also do not +interpret arguments. Applications of diversions include "keeps" +(preventing a page break from occurring at an inconvenient place by +forcing a set of output lines to be set as a group), footnotes, tables +of contents, and indices. For orthogonality it is said that GNU 'troff' +is in the "top-level diversion" if no diversion is active (that is, +formatted output is being "diverted" immediately to the output device). + + Dereferencing an undefined diversion will create an empty one of that +name and cause a warning in category 'mac' to be emitted. *Note +Warnings::, for information about the enablement and suppression of +warnings. A diversion does not exist for the purpose of testing with +the 'd' conditional operator until its initial definition ends (*note +Operators in Conditionals::). The following requests are used to create +and alter diversions. + + -- Request: .di [name] + -- Request: .da [name] + Start collecting formatted output in a diversion called NAME. The + 'da' request appends to a diversion called NAME, creating it if + necessary. If NAME already exists as an alias, the target of the + alias is replaced or appended to; recall *note Strings::. The + pending output line is diverted as well. Switching to another + environment (with the 'ev' request) before invoking 'di' or 'da' + avoids including any pending output line in the diversion; see + *note Environments::. + + Invoking 'di' or 'da' without an argument stops diverting output to + the diversion named by the most recent corresponding request. If + 'di' or 'da' is called without an argument when there is no current + diversion, a warning in category 'di' is produced. *Note + Warnings::, for information about the enablement and suppression of + warnings. + + Before the diversion. + .di yyy + In the diversion. + .br + .di + After the diversion. + .br + => After the diversion. + .yyy + => Before the diversion. In the diversion. + + GNU 'troff' supports "box" requests to exclude a partially collected +line from a diversion, as this is often desirable. + + -- Request: .box [name] + -- Request: .boxa [name] + Divert (or append) output to NAME, similarly to the 'di' and 'da' + requests, respectively. Any pending output line is _not_ included + in the diversion. Without an argument, stop diverting output; any + pending output line inside the diversion is discarded. + + Before the box. + .box xxx + In the box. + .br + Hidden treasure. + .box + After the box. + .br + => Before the box. After the box. + .xxx + => In the box. + + Apart from pending output line inclusion and the request names that +populate them, boxes are handled exactly as diversions are. All of the +following 'groff' language elements can be used with them +interchangeably. + + -- Register: \n[.z] + -- Register: \n[.d] + Diversions may be nested. The read-only string-valued register + '.z' contains the name of the current diversion. The read-only + register '.d' contains the current vertical place in the diversion. + If the input text is not being diverted, '.d' reports the same + location as the register 'nl'. + + -- Register: \n[.h] + The read-only register '.h' stores the "high-water mark" on the + current page or in the current diversion. It corresponds to the + text baseline of the lowest line on the page.(1) (*note + Diversions-Footnote-1::) + + .tm .h==\n[.h], nl==\n[nl] + => .h==0, nl==-1 + This is a test. + .br + .sp 2 + .tm .h==\n[.h], nl==\n[nl] + => .h==40, nl==120 + + As implied by the example, vertical motion does not produce text + baselines and thus does not increase the value interpolated by + '\n[.h]'. + + -- Register: \n[dn] + -- Register: \n[dl] + After completing a diversion, the writable registers 'dn' and 'dl' + contain its vertical and horizontal sizes. Only the lines just + processed are counted: for the computation of 'dn' and 'dl', the + requests 'da' and 'boxa' are handled as if 'di' and 'box' had been + used, respectively--lines that have been already stored in the + diversion (box) are not taken into account. + + .\" Center text both horizontally and vertically. + .\" Macro .(c starts centering mode; .)c terminates it. + . + .\" Disable the escape character with .eo so that we + .\" don't have to double backslashes on the "\n"s. + .eo + .de (c + . br + . ev (c + . evc 0 + . in 0 + . nf + . di @c + .. + .de )c + . br + . ev + . di + . nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v) + . sp \n[@s]u + . ce 1000 + . @c + . ce 0 + . sp \n[@s]u + . br + . fi + . rr @s + . rm @c + .. + .ec + + -- Escape sequence: \!anything + -- Escape sequence: \?anything\? + "Transparently" embed ANYTHING into the current diversion, + preventing requests, macro calls, and escape sequences from being + interpreted when read into a diversion. This is useful for + preventing them from taking effect until the diverted text is + actually output. The '\!' escape sequence transparently embeds + input up to and including the end of the line. The '\?' escape + sequence transparently embeds input until its own next occurrence. + + ANYTHING may not contain newlines; use '\!' by itself to embed + newlines in a diversion. The escape sequence '\?' is also + recognized in copy mode and turned into a single internal code; it + is this code that terminates ANYTHING. Thus the following example + prints 4. + + .nr x 1 + .nf + .di d + \?\\?\\\\?\\\\\\\\nx\\\\?\\?\? + .di + .nr x 2 + .di e + .d + .di + .nr x 3 + .di f + .e + .di + .nr x 4 + .f + + Both escape sequences read the data in copy mode. + + If '\!' is used in the top-level diversion, its argument is + directly embedded into GNU 'troff''s intermediate output. This can + be used, for example, to control a postprocessor that processes the + data before it is sent to an output driver. + + The '\?' escape used in the top-level diversion produces no output + at all; its argument is simply ignored. + + -- Request: .output contents + Emit CONTENTS directly to GNU 'troff''s intermediate output + (subject to copy mode interpretation); this is similar to '\!' used + at the top level. An initial neutral double quote in CONTENTS is + stripped to allow embedding of leading spaces. + + This request can't be used before the first page has started--if + you get an error, simply insert '.br' before the 'output' request. + + Use with caution! It is normally only needed for mark-up used by a + postprocessor that does something with the output before sending it + to the output device, filtering out CONTENTS again. + + -- Request: .asciify div + "Unformat" the diversion DIV in a way such that Unicode basic Latin + (ASCII) characters, characters translated with the 'trin' request, + space characters, and some escape sequences, that were formatted + and diverted into DIV are treated like ordinary input characters + when DIV is reread. Doing so can be useful in conjunction with the + 'writem' request. 'asciify' can be also used for gross hacks; for + example, the following sets register 'n' to 1. + + .tr @. + .di x + @nr n 1 + .br + .di + .tr @@ + .asciify x + .x + + 'asciify' cannot return all items in a diversion to their source + equivalent: nodes such as those produced by the '\N' escape + sequence will remain nodes, so the result cannot be guaranteed to + be a pure string. *Note Copy Mode::. Glyph parameters such as the + type face and size are not preserved; use 'unformat' to achieve + that. + + -- Request: .unformat div + Like 'asciify', unformat the diversion DIV. However, 'unformat' + handles only tabs and spaces between words, the latter usually + arising from spaces or newlines in the input. Tabs are treated as + input tokens, and spaces become adjustable again. The vertical + sizes of lines are not preserved, but glyph information (font, type + size, space width, and so on) is retained. + + +File: groff.info, Node: Diversions-Footnotes, Up: Diversions + + (1) Thus, the "water" gets "higher" proceeding _down_ the page. + + +File: groff.info, Node: Punning Names, Next: Environments, Prev: Diversions, Up: GNU troff Reference + +5.30 Punning Names +================== + +Macros, strings, and diversions share a name space; recall *note +Identifiers::. Internally, the same mechanism is used to store them. +You can thus call a macro with string interpolation syntax and vice +versa. + + .de subject + Typesetting + .. + .de predicate + rewards attention to detail + .. + \*[subject] \*[predicate]. + Truly. + => Typesetting + => rewards attention to detail Truly. + +What went wrong? Strings don't contain newlines, but macros do. String +interpolation placed a newline at the end of '\*[subject]', and the next +thing on the input was a space. Then when '\*[predicate]' was +interpolated, it was followed by the empty request '.' on a line by +itself. If we want to use macros as strings, we must take interpolation +behavior into account. + + .de subject + Typesetting\\ + .. + .de predicate + rewards attention to detail\\ + .. + \*[subject] \*[predicate]. + Truly. + => Typesetting rewards attention to detail. Truly. + +By ending each text line of the macros with an escaped '\', we get +the desired effect (*note Line Continuation::).(1) (*note Punning +Names-Footnote-1::) What would have happened if we had used only one +backslash at a time instead? + + Interpolating a string does not hide existing macro arguments. We +can also place the escaped newline outside the string interpolation +instead of within the string definition. Thus, in a macro, a more +efficient way of doing + + .xx \\$@ + +is + + \\*[xx]\\ + +The latter calling syntax doesn't change the value of '\$0', which is +then inherited from the calling macro (*note Parameters::). + + Diversions can be also called with string syntax. It is sometimes +convenient to copy one-line diversions to a string. + + .di xx + the + .ft I + interpolation system + .ft + .br + .di + .ds yy This is a test of \*(xx\c + \*(yy. + => This is a test of the interpolation system. + +As the previous example shows, it is possible to store formatted output +in strings. The '\c' escape sequence prevents the subsequent newline +from being interpreted as a break (again, *note Line Continuation::). + + Copying multi-output line diversions produces unexpected results. + + .di xxx + a funny + .br + test + .br + .di + .ds yyy This is \*[xxx]\c + \*[yyy]. + => test This is a funny. + + Usually, it is not predictable whether a diversion contains one or +more output lines, so this mechanism should be avoided. With AT&T +'troff', this was the only solution to strip off a final newline from a +diversion. Another disadvantage is that the spaces in the copied string +are already formatted, preventing their adjustment. This can cause ugly +results. + + A clean solution to this problem is available in GNU 'troff', using +the requests 'chop' to remove the final newline of a diversion, and +'unformat' to make the horizontal spaces adjustable again. + + .box xxx + a funny + .br + test + .br + .box + .chop xxx + .unformat xxx + This is \*[xxx]. + => This is a funny test. + + *Note Gtroff Internals::. + + +File: groff.info, Node: Punning Names-Footnotes, Up: Punning Names + + (1) The backslash is doubled. *Note Copy Mode::. + + +File: groff.info, Node: Environments, Next: Suppressing Output, Prev: Diversions, Up: GNU troff Reference + +5.31 Environments +================= + +As discussed in *note Deferring Output::, environments store most of the +parameters that determine the appearance of text. A default environment +named '0' exists when GNU 'troff' starts up; it is modified by +formatting-related requests and escape sequences. + + You can create new environments and switch among them. Only one is +current at any given time. Active environments are managed using a +"stack", a data structure supporting "push" and "pop" operations. The +current environment is at the top of the stack. The same environment +name can be pushed onto the stack multiple times, possibly interleaved +with others. Popping the environment stack does not destroy the current +environment; it remains accessible by name and can be made current again +by pushing it at any time. Environments cannot be renamed or deleted, +and can only be modified when current. To inspect the environment +stack, use the 'pev' request; see *note Debugging::. + + Environments store the following information. + + * a partially collected line, if any + + * data about the most recently output glyph and line (registers + '.cdp', '.cht', '.csk', '.n', '.w') + + * typeface parameters (size, family, style, height and slant, + inter-word and inter-sentence space sizes) + + * page parameters (line length, title length, vertical spacing, line + spacing, indentation, line numbering, centering, right-alignment, + underlining, hyphenation parameters) + + * filling enablement; adjustment enablement and mode + + * tab stops; tab, leader, escape, control, no-break control, + hyphenation, and margin characters + + * input line traps + + * stroke and fill colors + + -- Request: .ev [ident] + -- Register: \n[.ev] + Enter the environment IDENT, which is created if it does not + already exist, using the same parameters as for the default + environment used at startup. With no argument, GNU 'troff' + switches to the previous environment. + + Invoking 'ev' with an argument puts environment IDENT onto the top + of the environment stack. (If it isn't already present in the + stack, this is a proper push.) Without an argument, 'ev' pops the + environment stack, making the previous environment current. It is + an error to pop the environment stack with no previous environment + available. The read-only string-valued register '.ev' contains the + name of the current environment--the one at the top of the stack. + + .ev footnote-env + .fam N + .ps 6 + .vs 8 + .ll -.5i + .ev + + ... + + .ev footnote-env + \[dg] Observe the smaller text and vertical spacing. + .ev + + We can familiarize ourselves with stack behavior by wrapping the + 'ev' request with a macro that reports the contents of the '.ev' + register to the standard error stream. + + .de EV + . ev \\$1 + . tm environment is now \\n[.ev] + .. + . + .EV foo + .EV bar + .EV + .EV baz + .EV + .EV + .EV + + error-> environment is now foo + error-> environment is now bar + error-> environment is now foo + error-> environment is now baz + error-> environment is now foo + error-> environment is now 0 + error-> error: environment stack underflow + error-> environment is now 0 + + -- Request: .evc environment + Copy the contents of ENVIRONMENT to the current environment. + + The following environment data are not copied. + + * a partially collected line, if present; + + * the interruption status of the previous input line (due to use + of the '\c' escape sequence); + + * the count of remaining lines to center, to right-justify, or + to underline (with or without underlined spaces)--these are + set to zero; + + * the activation status of temporary indentation; + + * input line traps and their associated data; + + * the activation status of line numbering (which can be + reactivated with '.nm +0'); and + + * the count of consecutive hyphenated lines (set to zero). + + -- Register: \n[.w] + -- Register: \n[.cht] + -- Register: \n[.cdp] + -- Register: \n[.csk] + The '\n[.w]' register contains the width of the last glyph + formatted in the environment. + + The '\n[.cht]' register contains the height of the last glyph + formatted in the environment. + + The '\n[.cdp]' register contains the depth of the last glyph + formatted in the environment. It is positive for glyphs extending + below the baseline. + + The '\n[.csk]' register contains the "skew" (how far to the right + of the glyph's center that GNU 'troff' should place an accent) of + the last glyph formatted in the environment. + + -- Register: \n[.n] + The '\n[.n]' register contains the length of the previous output + line emitted in the environment. + + +File: groff.info, Node: Suppressing Output, Next: Colors, Prev: Environments, Up: GNU troff Reference + +5.32 Suppressing Output +======================= + + -- Escape sequence: \O[num] + Suppress GNU 'troff' output of glyphs and geometric objects. The + sequences '\O2', '\O3', '\O4', and '\O5' are intended for internal + use by 'grohtml'. + + '\O0' + Disable the emission of glyphs and geometric objects to the + output driver, provided that this sequence occurs at the + outermost suppression level (see '\O3' and '\04' below). + Horizontal motions corresponding to non-overstruck glyph + widths still occur. + + '\O1' + Enable the emission of glyphs and geometric objects to the + output driver, provided that this sequence occurs at the + outermost suppression level. + + '\O0' and '\O1' also reset the four registers 'opminx', 'opminy', + 'opmaxx', and 'opmaxy' to -1. These four registers mark the top + left and bottom right hand corners of a box encompassing all + written or drawn output. + + '\O2' + At the outermost suppression level, enable emission of glyphs + and geometric objects, and write to the standard error stream + the page number and values of the four aforementioned + registers encompassing glyphs written since the last + interpolation of a '\O' sequence, as well as the page offset, + line length, image file name (if any), horizontal and vertical + device motion quanta, and input file name. Numeric values are + in basic units. + + '\O3' + Begin a nested suppression level. 'grohtml' uses this + mechanism to create images of output preprocessed with 'gpic', + 'geqn', and 'gtbl'. At startup, GNU 'troff' is at the + outermost suppression level. 'pre-grohtml' generates these + sequences when processing the document, using GNU 'troff' with + the 'ps' output device, Ghostscript, and the PNM tools to + produce images in PNG format. They start a new page if the + device is not 'html' or 'xhtml', to reduce the number of + images crossing a page boundary. + + '\O4' + End a nested suppression level. + + '\O[5PFILE]' + At the outermost suppression level, write the name 'file' to + the standard error stream at position P, which must be one of + 'l', 'r', 'c', or 'i', corresponding to left, right, centered, + and inline alignments within the document, respectively. FILE + is a name associated with the production of the next image. + + -- Register: \n[.O] + Output suppression nesting level applied by '\O3' and '\O4' escape + sequences. + + +File: groff.info, Node: I/O, Next: Postprocessor Access, Prev: Suppressing Output, Up: GNU troff Reference + +5.33 I/O +======== + +'gtroff' has several requests for including files: + + -- Request: .so file + -- Request: .soquiet file + Replace the 'so' request's control line with the contents of the + file named by the argument, "sourcing" it. FILE is sought in the + directories specified by '-I' command-line option. If FILE does + not exist, a warning in category 'file' is produced and the request + has no further effect. *Note Warnings::, for information about the + enablement and suppression of warnings. + + 'so' can be useful for large documents; e.g., allowing each chapter + of a book to be kept in a separate file. However, files + interpolated with 'so' are not preprocessed; to overcome this + limitation, see the 'gsoelim(1)' man page. + + Since GNU 'troff' replaces the entire control line with the + contents of a file, it matters whether 'file' is terminated with a + newline or not. Assume that file 'xxx' contains only the word + 'foo' without a trailing newline. + + $ printf 'foo' > xxx + + The situation is + .so xxx + bar. + => The situation is foobar. + + 'soquiet' works the same way, except that no warning diagnostic is + issued if FILE does not exist. + + -- Request: .pso command + Read the standard output from the specified COMMAND and include it + in place of the 'pso' request. + + It is an error to use this request in safer mode, which is the + default. Invoke GNU 'troff' or a front end with the '-U' option to + enable unsafe mode. + + The comment regarding a final newline for the 'so' request is valid + for 'pso' also. + + -- Request: .mso file + -- Request: .msoquiet file + Identical to the 'so' and 'soquiet' requests, respectively, except + that 'gtroff' searches for the specified FILE in the same + directories as macro files for the '-m' command-line option. If + the file name to be included has the form 'NAME.tmac' and it isn't + found, these requests try to include 'tmac.NAME' and vice versa. + + -- Request: .trf file + -- Request: .cf file + Transparently output the contents of FILE. Each line is output as + if it were preceded by '\!'; however, the lines are _not_ subject + to copy mode interpretation. If the file does not end with a + newline, 'trf' adds one. Both requests cause a break. + + When used in a diversion, these requests embed a node (*note Gtroff + Internals::) in it that, when reread, causes the contents of FILE + to be transparently copied to the output. In AT&T 'troff', the + contents of FILE are immediately copied to the output regardless of + whether there is a current diversion; this behaviour is so + anomalous that it must be considered a bug. + + While 'cf' copies the contents of FILE completely unprocessed, + 'trf' disallows characters such as NUL that are not valid 'gtroff' + input characters (*note Identifiers::). + + For 'cf', within a diversion, "completely unprocessed" means that + each line of a file to be inserted is handled as if it were + preceded by '\!\\!'. + + To define a macro 'x' containing the contents of file 'f', use + + .ev 1 + .di x + .trf f + .di + .ev + + The calls to 'ev' prevent the partially collected output line from + becoming part of the diversion (*note Diversions::). + + -- Request: .nx [file] + Force 'gtroff' to continue processing of the file specified as an + argument. If no argument is given, immediately jump to the end of + file. + + -- Request: .rd [prompt [arg1 arg2 ...]] + Read from standard input, and include what is read as though it + were part of the input file. Text is read until a blank line is + encountered. + + If standard input is a TTY input device (keyboard), write PROMPT to + standard error, followed by a colon (or send BEL for a beep if no + argument is given). + + Arguments after PROMPT are available for the input. For example, + the line + + .rd data foo bar + + with the input 'This is \$2.' prints + + This is bar. + + Using the 'nx' and 'rd' requests, it is easy to set up form letters. +The form letter template is constructed like this, putting the following +lines into a file called 'repeat.let': + + .ce + \*(td + .sp 2 + .nf + .rd + .sp + .rd + .fi + Body of letter. + .bp + .nx repeat.let + +When this is run, a file containing the following lines should be +redirected in. Requests included in this file are executed as though +they were part of the form letter. The last block of input is the 'ex' +request, which tells GNU 'troff' to stop processing. If this were not +there, 'troff' would not know when to stop. + + Trent A. Fisher + 708 NW 19th Av., #202 + Portland, OR 97209 + + Dear Trent, + + Len Adollar + 4315 Sierra Vista + San Diego, CA 92103 + + Dear Mr. Adollar, + + .ex + + -- Request: .pi pipe + Pipe the output of 'gtroff' to the shell command(s) specified by + PIPE. This request must occur before 'gtroff' has a chance to + print anything. + + It is an error to use this request in safer mode, which is the + default. Invoke GNU 'troff' or a front end with the '-U' option to + enable unsafe mode. + + Multiple calls to 'pi' are allowed, acting as a chain. For + example, + + .pi foo + .pi bar + ... + + is the same as '.pi foo | bar'. + + The intermediate output format of GNU 'troff' is piped to the + specified commands. Consequently, calling 'groff' without the '-Z' + option normally causes a fatal error. + + -- Request: .sy cmds + -- Register: \n[systat] + Execute the shell command(s) specified by CMDS. The output is not + saved anywhere, so it is up to the user to do so. + + It is an error to use this request in safer mode; this is the + default. Give GNU 'troff' or a front end program the '-U' option + to enable unsafe mode. + + The following code fragment introduces the current time into a + document. + + .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\ + (localtime(time))[2,1,0]' > /tmp/x\n[$$] + .so /tmp/x\n[$$] + .sy rm /tmp/x\n[$$] + \nH:\nM:\nS + + This works by having the Perl script (run by 'sy') write 'nr' + requests that set the registers 'H', 'M', and 'S' to a temporary + file. The 'roff' document then reads the temporary file using the + 'so' request. + + The registers 'seconds', 'minutes', and 'hours', initialized at + startup of GNU 'troff', should satisfy most requirements. Use the + 'af' request to format their values for output. + + .af hours 00 + .af minutes 00 + .af seconds 00 + \n[hours]:\n[minutes]:\n[seconds] + => 02:17:54 + + The writable register 'systat' contains the return value of the + 'system()' function executed by the last 'sy' request. + + -- Request: .open stream file + -- Request: .opena stream file + Open the specified FILE for writing and associates the specified + STREAM with it. + + The 'opena' request is like 'open', but if the file exists, append + to it instead of truncating it. + + It is an error to use these requests in safer mode; this is the + default. Give GNU 'troff' or a front end program the '-U' option + to enable unsafe mode. + + -- Request: .write stream data + -- Request: .writec stream data + Write to the file associated with the specified STREAM. The stream + must previously have been the subject of an open request. The + remainder of the line is interpreted as the 'ds' request reads its + second argument: an initial neutral double quote in CONTENTS is + stripped to allow embedding of leading spaces, and it is read in + copy mode. + + The 'writec' request is like 'write', but only 'write' appends a + newline to the data. + + -- Request: .writem stream xx + Write the contents of the macro or string XX to the file associated + with the specified STREAM. + + XX is read in copy mode, i.e., already formatted elements are + ignored. Consequently, diversions must be unformatted with the + 'asciify' request before calling 'writem'. Usually, this means a + loss of information. + + -- Request: .close stream + Close the specified STREAM; the stream is no longer an acceptable + argument to the 'write' request. + + Here a simple macro to write an index entry. + + .open idx test.idx + . + .de IX + . write idx \\n[%] \\$* + .. + . + .IX test entry + . + .close idx + + -- Escape sequence: \Ve + -- Escape sequence: \V(ev + -- Escape sequence: \V[env] + Interpolate the contents of the specified environment variable ENV + (one-character name E, two-character name EV) as returned by the + function 'getenv(3)'. '\V' is interpreted even in copy mode (*note + Copy Mode::). + + +File: groff.info, Node: Postprocessor Access, Next: Miscellaneous, Prev: I/O, Up: GNU troff Reference + +5.34 Postprocessor Access +========================= + +Two escape sequences and two requests enable documents to pass +information directly to a postprocessor. These are useful for +exercising device-specific capabilities that the 'groff' language does +not abstract or generalize; examples include the embedding of hyperlinks +and image files. Device-specific functions are documented in each +output driver's man page, such as 'gropdf(1)', 'grops(1)', or +'grotty(1)'. + + -- Request: .device xxx ... + -- Escape sequence: \X'xxx ...' + Embed all XXX arguments into GNU 'troff' output as parameters to a + device control command 'x X'. The meaning and interpretation of + such parameters is determined by the output driver or other + postprocessor. + + The 'device' request processes its arguments in copy mode (*note + Copy Mode::). An initial neutral double quote in CONTENTS is + stripped to allow embedding of leading spaces. By contrast, within + '\X' arguments, the escape sequences '\&', '\)', '\%', and '\:' are + ignored; '\' and '\~' are converted to single space characters; + and '\\' has its escape character stripped. So that the basic + Latin subset of the Unicode character set(1) (*note Postprocessor + Access-Footnote-1::) can be reliably encoded in device control + commands, seven special character escape sequences ('\-', '\[aq]', + '\[dq]', '\[ga]', '\[ha]', '\[rs]', and '\[ti]',) are mapped to + basic Latin characters; see the 'groff_char(7)' man page. For this + transformation, character translations and special character + definitions are ignored.(2) (*note Postprocessor + Access-Footnote-2::) The use of any other escape sequence in '\X' + parameters is normally an error. + + If the 'use_charnames_in_special' directive appears in the output + device's 'DESC' file, the use of special character escape sequences + is _not_ an error; they are simply output verbatim (with the + exception of the seven mapped to Unicode basic Latin characters, + discussed above). 'use_charnames_in_special' is currently employed + only by 'grohtml'. + + -- Request: .devicem name + -- Escape sequence: \Yn + -- Escape sequence: \Y(nm + -- Escape sequence: \Y[name] + This is approximately equivalent to '\X'\*[NAME]'' (one-character + name N, two-character name NM). However, the contents of the + string or macro NAME are not interpreted; also it is permitted for + NAME to have been defined as a macro and thus contain newlines (it + is not permitted for the argument to '\X' to contain newlines). + The inclusion of newlines requires an extension to the AT&T 'troff' + output format, and confuses drivers that do not know about this + extension (*note Device Control Commands::). + + -- Request: .tag name + -- Request: .taga name + Reserved for internal use. + + +File: groff.info, Node: Postprocessor Access-Footnotes, Up: Postprocessor Access + + (1) that is, ISO 646:1991-IRV or, popularly, "US-ASCII" + + (2) They are bypassed because these parameters are not rendered as +glyphs in the output; instead, they remain abstract characters--in a PDF +bookmark or a URL, for example. + + +File: groff.info, Node: Miscellaneous, Next: Gtroff Internals, Prev: Postprocessor Access, Up: GNU troff Reference + +5.35 Miscellaneous +================== + +We document here GNU 'troff' features that fit poorly elsewhere. + + -- Request: .nm [start [increment [space [indentation]]]] + -- Register: \n[ln] + -- Register: \n[.nm] + Begin (or, with no arguments, cease) numbering output lines. START + assigns the number of the _next_ output line. Only line numbers + divisible by INCREMENT are marked (default: '1'). SPACE configures + the horizontal spacing between the number and the text (default: + '1'). Any given INDENTATION is applied to the numbers (default: + '0'). The third and fourth arguments are reckoned in numeral + widths ('\0'). START must be non-negative and INCREMENT positive. + + The formatter aligns the number to the right in a width of three + numeral spaces plus INDENTATION, then catenates SPACE and the + output line. The line length is _not_ reduced. Depending on the + value of the page offset,(1) (*note Miscellaneous-Footnote-1::) + numbers wider than the allocated space protrude into the left + margin, or shift the output line to the right. + + Line numbering parameters corresponding to missing arguments are + not altered. After numbering is disabled, '.nm +0' resumes it + using the previously active parameters. + + The parameters of 'nm' are associated with the environment (*note + Environments::). + + While numbering is enabled, the output line number register 'ln' is + updated as each line is output, even if no line number is formatted + with it because it is being skipped (it is not a multiple of + INCREMENT) or because numbering is suppressed (see the 'nn' request + below). + + The '.nm' register tracks the enablement status of numbering. + Temporary suspension of numbering with the 'nn' request does _not_ + alter its value. + + .po 5n + .ll 44n + Programming, + when stripped of all its circumstantial irrelevancies, + .nm 999 1 1 -4 + boils down to no more and no less than + .nm +0 3 + very effective thinking so as to avoid unmastered + .nn 2 + complexity, + to very vigorous separation of your many + different concerns. + .br + \(em Edsger Dijkstra + .sp + .nm 1 1 1 + This guy's arrogance takes your breath away. + .br + \(em John Backus + => Programming, when stripped of all its cir- + => 999 cumstantial irrelevancies, boils down to no + => more and no less than very effective think- + => ing so as to avoid unmastered complexity, to + => very vigorous separation of your many dif- + => ferent concerns. + => 1002 -- Edsger Dijkstra + => + => 1 This guy's arrogance takes your breath away. + => 2 -- John Backus + + -- Request: .nn [skip] + -- Register: \n[.nn] + Suppress numbering of the next SKIP output lines that would + otherwise be numbered. The default is 1. 'nn' can be invoked when + line numbering is not active; suppression of numbering will take + effect for SKIP lines once 'nm' enables it. + + The '.nn' register stores the count of output lines still to have + their numbering suppressed. + + This count is associated with the environment (*note + Environments::). + + To test whether the current output line will be numbered, you must +check both the '.nm' and '.nn' registers. + + .de is-numbered + . nop This line + . ie (\\n[.nm] & (1-\\n[.nn])) IS + . el ISN'T + . nop numbered. + . br + .. + Test line numbering. + .is-numbered + .nm 1 + .nn 1 + .is-numbered + .is-numbered + .nm + .is-numbered + => Test line numbering. This line ISN'T numbered. + => This line ISN'T numbered. + => 1 This line IS numbered. + => This line ISN'T numbered. + + -- Request: .mc [margin-character [distance] + Begin (or, with no arguments, cease) writing a "margin-character" + to the right of each output line. The DISTANCE argument separates + MARGIN-CHARACTER from the right margin. If absent, the most recent + value is used; the default is 10 points. If an output line exceeds + the line length, the margin character is appended to it. No margin + character is written on lines produced by the 'tl' request. + + The margin character is a property of the output line; the margin + character last configured when the line is output controls. If the + margin character is disabled before an output line breaks, none is + output (but see below). + + The margin character is associated with the environment (*note + Environments::). + + .ll 5i + .nf + .mc \[br] + This paragraph is marked with a margin character. + .sp + As seen above, vertical space isn't thus marked. + \& + An output line that is present, but empty, is. + => This paragraph is marked with a margin character. | + => + => As seen above, vertical space isn't thus marked. | + => | + => An output line that is present, but empty, is. | + + For compatibility with AT&T 'troff', a call to 'mc' to set the margin +character can't be undone immediately; at least one line gets a margin +character. + + .ll 10n + .nf + .mc | + .mc * + .mc + foo + bar + => foo * + => bar + + The margin character mechanism is commonly used to annotate changes +in documents. The 'groff' distribution ships a program, 'gdiffmk', to +assist with this task.(2) (*note Miscellaneous-Footnote-2::) + + -- Request: .psbb file + -- Register: \n[llx] + -- Register: \n[lly] + -- Register: \n[urx] + -- Register: \n[ury] + Retrieve the bounding box of the PostScript image found in FILE, + which must conform to Adobe's "Document Structuring Conventions" + (DSC), locate a '%%BoundingBox' comment, and store the (upper-, + lower-, -left, -right) values into the registers 'llx', 'lly', + 'urx', and 'ury'. If an error occurs (for example, if no + '%%BoundingBox' comment is present), the formatter sets these + registers to 0. + + The search path for FILE can be controlled with the '-I' + command-line option. + + +File: groff.info, Node: Miscellaneous-Footnotes, Up: Miscellaneous + + (1) Recall *note Line Layout::. + + (2) Historically, tools named 'nrchbar' and 'changebar' were +developed for marking changes with margin characters and could be found +in archives of the 'comp.sources.unix' USENET group. Some proprietary +Unices also offer(ed) a 'diffmk' program. + + +File: groff.info, Node: Gtroff Internals, Next: Debugging, Prev: Miscellaneous, Up: GNU troff Reference + +5.36 'gtroff' Internals +======================= + +'gtroff' processes input in three steps. One or more input characters +are converted to an "input token".(1) (*note Gtroff +Internals-Footnote-1::) Then, one or more input tokens are converted to +an "output node". Finally, output nodes are converted to the +intermediate output language understood by all output devices. + + Actually, before step one happens, 'gtroff' converts certain escape +sequences into reserved input characters (not accessible by the user); +such reserved characters are used for other internal processing also - +this is the very reason why not all characters are valid input. *Note +Identifiers::, for more on this topic. + + For example, the input string 'fi\[:u]' is converted into a character +token 'f', a character token 'i', and a special token ':u' (representing +u umlaut). Later on, the character tokens 'f' and 'i' are merged to a +single output node representing the ligature glyph 'fi' (provided the +current font has a glyph for this ligature); the same happens with ':u'. +All output glyph nodes are 'processed', which means that they are +invariably associated with a given font, font size, advance width, etc. +During the formatting process, 'gtroff' itself adds various nodes to +control the data flow. + + Macros, diversions, and strings collect elements in two chained +lists: a list of input tokens that have been passed unprocessed, and a +list of output nodes. Consider the following diversion. + + .di xxx + a + \!b + c + .br + .di + +It contains these elements. + +node list token list element number + +line start node -- 1 +glyph node 'a' -- 2 +word space node -- 3 +-- 'b' 4 +-- '\n' 5 +glyph node 'c' -- 6 +vertical size node -- 7 +vertical size node -- 8 +-- '\n' 9 + +Elements 1, 7, and 8 are inserted by 'gtroff'; the latter two (which are +always present) specify the vertical extent of the last line, possibly +modified by '\x'. The 'br' request finishes the pending output line, +inserting a newline input token, which is subsequently converted to a +space when the diversion is reread. Note that the word space node has a +fixed width that isn't adjustable anymore. To convert horizontal space +nodes back to input tokens, use the 'unformat' request. + + Macros only contain elements in the token list (and the node list is +empty); diversions and strings can contain elements in both lists. + + The 'chop' request simply reduces the number of elements in a macro, +string, or diversion by one. Exceptions are "compatibility save" and +"compatibility ignore" input tokens, which are ignored. The 'substring' +request also ignores those input tokens. + + Some requests like 'tr' or 'cflags' work on glyph identifiers only; +this means that the associated glyph can be changed without destroying +this association. This can be very helpful for substituting glyphs. In +the following example, we assume that glyph 'foo' isn't available by +default, so we provide a substitution using the 'fchar' request and map +it to input character 'x'. + + .fchar \[foo] foo + .tr x \[foo] + +Now let us assume that we install an additional special font 'bar' that +has glyph 'foo'. + + .special bar + .rchar \[foo] + +Since glyphs defined with 'fchar' are searched before glyphs in special +fonts, we must call 'rchar' to remove the definition of the fallback +glyph. Anyway, the translation is still active; 'x' now maps to the +real glyph 'foo'. + + Macro and request arguments preserve compatibility mode enablement. + + .cp 1 \" switch to compatibility mode + .de xx + \\$1 + .. + .cp 0 \" switch compatibility mode off + .xx caf\['e] + => café + +Since compatibility mode is enabled while 'de' is invoked, the macro +'xx' enables compatibility mode when it is called. Argument '$1' can +still be handled properly because it inherits the compatibility mode +enablement status that was active at the point where 'xx' was called. + + After interpolation of the parameters, the compatibility save and +restore tokens are removed. + + +File: groff.info, Node: Gtroff Internals-Footnotes, Up: Gtroff Internals + + (1) Except the escape sequences '\f', '\F', '\H', '\m', '\M', '\R', +'\s', and '\S', which are processed immediately if not in copy mode. + + +File: groff.info, Node: Debugging, Next: Implementation Differences, Prev: Gtroff Internals, Up: GNU troff Reference + +5.37 Debugging +============== + + Standard troff voodoo, just put a power of two backslashes in + front of it until it works and if you still have problems add a \c. + -- Ron Natalie + + GNU 'troff' is not the easiest language to debug, in part thanks to +its design features of recursive interpolation and the use of +multi-stage pipeline processing in the surrounding system. Nevertheless +there exist several features useful for troubleshooting. + + Preprocessors use the 'lf' request to preserve the identity of the +line numbers and names of input files. GNU 'troff' emits a variety of +error diagnostics and supports several categories of warning; the output +of these can be selectively suppressed. A trace of the formatter's +input processing stack can be emitted when errors or warnings occur by +means of GNU 'troff''s '-b' option, or produced on demand with the +'backtrace' request. The 'tm' and related requests can be used to emit +customized diagnostic messages or for instrumentation while +troubleshooting. The 'ex' and 'ab' requests cause early termination +with successful and error exit codes respectively, to halt further +processing when continuing would be fruitless. Examine the state of the +formatter with requests that write lists of defined names (macros, +strings, and diversions), environments, registers, and page location +traps to the standard error stream. + + -- Request: .lf line [file] + Set the input line number (and, optionally, the file name) GNU + 'troff' shall use for error and warning messages. LINE is the + input line number of the _next_ line. Without an argument, the + request is ignored. + + 'lf''s primary purpose is to aid the debugging of documents that + undergo preprocessing. Programs like 'tbl' that transform input in + their own languages into 'roff' requests use it so that any + diagnostic messages emitted by 'troff' correspond to the source + document. + + -- Request: .tm message + -- Request: .tm1 message + -- Request: .tmc message + Send MESSAGE, which consumes the remainder of the input line and + cannot contain special characters, to the standard error stream, + followed by a newline. Leading spaces in MESSAGE are ignored. + + 'tm1' is similar, but recognizes and strips a leading neutral + double quote from MESSAGE to allow the embedding of leading spaces. + + 'tmc' works as 'tm1', but does not append a newline. + + -- Request: .ab [message] + Write any MESSAGE to the standard error stream (like 'tm') and then + abort GNU 'troff'; that is, stop processing and terminate with a + failure status. + + -- Request: .ex + Exit GNU 'troff'; that is, stop processing and terminate with a + successful status. To stop processing only the current file, use + the 'nx' request; see *note I/O::. + + When doing something involved, it is useful to leave the debugging +statements in the code and have them turned on by a command-line flag. + + .if \n[DB] .tm debugging output + +To activate such statements, use the '-r' option to set the register. + + groff -rDB=1 file + + If it is known in advance that there are many errors and no useful +output, GNU 'troff' can be forced to suppress formatted output with the +'-z' option. + + -- Request: .pev + Report the state of the current environment followed by that of all + other environments to the standard error stream. + + -- Request: .pm + Report, to the standard error stream, the names of all defined + macros, strings, and diversions with their sizes in bytes. + + -- Request: .pnr + Report the names and contents of all currently defined registers to + the standard error stream. + + -- Request: .ptr + Report the names and positions of all page location traps to the + standard error stream. Empty slots in the list, where a trap has + been planted but subsequently (re)moved, are printed as well. + + -- Request: .fl + Instruct 'gtroff' to flush its output immediately. The intent is + for interactive use, but this behaviour is currently not + implemented in 'gtroff'. Contrary to Unix 'troff', TTY output is + sent to a device driver also ('grotty'), making it non-trivial to + communicate interactively. + + This request causes a line break. + + -- Request: .backtrace + Write the state of the input stack to the standard error stream. + + Consider the following in a file 'test'. + + .de xxx + . backtrace + .. + .de yyy + . xxx + .. + . + .yyy + error-> troff: backtrace: 'test':2: macro 'xxx' + error-> troff: backtrace: 'test':5: macro 'yyy' + error-> troff: backtrace: file 'test':8 + + The '-b' option of GNU 'troff' causes a backtrace to be generated + on each error or warning. Some warnings have to be enabled; *Note + Warnings::. + + -- Register: \n[slimit] + If greater than 0, sets the maximum quantity of objects on GNU + 'troff''s internal input stack. If less than or equal to 0, there + is no limit: recursion can continue until program memory is + exhausted. The default is 1,000. + + -- Request: .warnscale su + Set the scaling unit used in certain warnings to SU, which can take + the values 'u', 'i', 'c', 'p', and 'P'. The default is 'i'. + + -- Request: .spreadwarn [limit] + Emit a 'break' warning if the additional space inserted for each + space between words in an output line adjusted to both margins with + '.ad b' is larger than or equal to LIMIT. A negative value is + treated as zero; an absent argument toggles the warning on and off + without changing LIMIT. The default scaling unit is 'm'. At + startup, 'spreadwarn' is inactive and LIMIT is 3m. + + For example, + + .spreadwarn 0.2m + + causes a warning if 'break' warnings are not suppressed and + 'gtroff' must add 0.2m or more for each inter-word space in a line. + *Note Warnings::. + + GNU 'troff' has command-line options for reporting warnings ('-w') +and backtraces ('-b') when a warning or an error occurs. + + -- Request: .warn [n] + -- Register: \n[.warn] + Select the categories, or "types", of reported warnings. N is the + sum of the numeric codes associated with each warning category that + is to be enabled; all other categories are disabled. The + categories and their associated codes are listed in *note + Warnings::. For example, '.warn 0' disables all warnings, and + '.warn 1' disables all warnings except those about missing glyphs. + If no argument is given, all warning categories are enabled. + + The read-only register '.warn' contains the sum of the numeric + codes of enabled warning categories. + +* Menu: + +* Warnings:: + + +File: groff.info, Node: Warnings, Prev: Debugging, Up: Debugging + +5.37.1 Warnings +--------------- + +Warning diagnostics emitted by GNU 'troff' are divided into named, +numbered categories. The name associated with each warning category is +used by the '-w' and '-W' options. Each category is also assigned a +power of two; the sum of enabled category values is used by the 'warn' +request and the '.warn' register. + + Warnings of each category are produced under the following +circumstances. + +'char' +'1' + No mounted font defines a glyph for the requested character. This + category is enabled by default. + +'number' +'2' + An invalid numeric expression was encountered. This category is + enabled by default. *Note Numeric Expressions::. + +'break' +'4' + A filled output line could not be broken such that its length was + less than the output line length '\n[.l]'. This category is + enabled by default. + +'delim' +'8' + The closing delimiter in an escape sequence was missing or + mismatched. + +'el' +'16' + The 'el' request was encountered with no prior corresponding 'ie' + request. *Note if-else::. + +'scale' +'32' + A scaling unit inappropriate to its context was used in a numeric + expression. + +'range' +'64' + A numeric expression was out of range for its context. + +'syntax' +'128' + A self-contradictory hyphenation mode was requested; an empty or + incomplete numeric expression was encountered; an operand to a + numeric operator was missing; an attempt was made to define a + recursive, empty, or nonsensical character class; or a 'groff' + extension conditional expression operator was used while in + compatibility mode. + +'di' +'256' + A 'di', 'da', 'box', or 'boxa' request was invoked without an + argument when there was no current diversion. + +'mac' +'512' + An undefined string, macro, or diversion was used. When such an + object is dereferenced, an empty one of that name is automatically + created. So, unless it is later deleted, at most one warning is + given for each. + + This warning is also emitted upon an attempt to move an unplanted + trap macro (*note Page Location Traps::). In such cases, the + unplanted macro is _not_ dereferenced, so it is not created if it + does not exist. + +'reg' +'1024' + An undefined register was used. When an undefined register is + dereferenced, it is automatically defined with a value of 0. So, + unless it is later deleted, at most one warning is given for each. + +'tab' +'2048' + A tab character was encountered where a number was expected, or + appeared in an unquoted macro argument. + +'right-brace' +'4096' + A right brace escape sequence '\}' was encountered where a number + was expected. + +'missing' +'8192' + A request was invoked with a mandatory argument absent. + +'input' +'16384' + An invalid character occurred on the input stream. + +'escape' +'32768' + An unsupported escape sequence was encountered. + +'space' +'65536' + A space was missing between a request or macro and its argument. + This warning is produced when an undefined name longer than two + characters is encountered and the first two characters of the name + constitute a defined name. No request is invoked, no macro called, + and an empty macro is not defined. This category is enabled by + default. It never occurs in compatibility mode. + +'font' +'131072' + A non-existent font was selected, or the selection was ignored + because a font selection escape sequence was used after the output + line continuation escape sequence on an input line. This category + is enabled by default. + +'ig' +'262144' + An invalid escape sequence occurred in input ignored using the 'ig' + request. This warning category diagnoses a condition that is an + error when it occurs in non-ignored input. + +'color' +'524288' + An undefined color was selected, an attempt was made to define a + color using an unrecognized color space, an invalid component in a + color definition was encountered, or an attempt was made to + redefine a default color. + +'file' +'1048576' + An attempt was made to load a file that does not exist. This + category is enabled by default. + + Two warning names group other warning categories for convenience. + +'all' + All warning categories except 'di', 'mac' and 'reg'. This + shorthand is intended to produce all warnings that are useful with + macro packages written for AT&T 'troff' and its descendants, which + have less fastidious diagnostics than GNU 'troff'. + +'w' + All warning categories. Authors of documents and macro packages + targeting 'groff' are encouraged to use this setting. + + +File: groff.info, Node: Implementation Differences, Next: Safer Mode, Prev: Debugging, Up: GNU troff Reference + +5.38 Implementation Differences +=============================== + +GNU 'troff' has a number of features that cause incompatibilities with +documents written for other versions of 'troff'. Some GNU extensions to +'troff' have become supported by other implementations. + +* Menu: + +* Safer Mode:: +* Compatibility Mode:: +* Other Differences:: + + +File: groff.info, Node: Safer Mode, Next: Compatibility Mode, Prev: Implementation Differences, Up: Implementation Differences + +5.38.1 Safer Mode +----------------- + +The formatter operates in "safer" mode by default; to mitigate risks +from untrusted input documents, the 'pi' and 'sy' requests are disabled. +GNU 'troff''s '-U' option enables "unsafe mode", restoring their +function and enabling additional 'groff' extension requests, 'open', +'opena', and 'pso'. *Note I/O::. + + +File: groff.info, Node: Compatibility Mode, Next: Safer Mode, Prev: Other Differences, Up: Implementation Differences + +5.38.2 Compatibility Mode +------------------------- + +Long identifier names may be GNU 'troff''s most obvious innovation. +AT&T 'troff' interprets '.dsabcd' as defining a string 'ab' with +contents 'cd'. Normally, GNU 'troff' interprets this as a call of a +macro named 'dsabcd'. AT&T 'troff' also interprets '\*[' and '\n[' as +an interpolation of a string or register, respectively, named '['. In +GNU 'troff', however, the '[' is normally interpreted as delimiting a +long name. In compatibility mode, GNU 'troff' interprets names in the +traditional way; they thus can be two characters long at most. + + -- Request: .cp [n] + -- Register: \n[.C] + If N is missing or non-zero, turn on compatibility mode; otherwise, + turn it off. + + The read-only register '.C' is 1 if compatibility mode is on, + 0 otherwise. + + Compatibility mode can be also turned on with the '-C' command-line + option. + + -- Request: .do name + -- Register: \n[.cp] + The 'do' request interprets the string, request, diversion, or + macro NAME (along with any further arguments) with compatibility + mode disabled. Compatibility mode is restored (only if it was + active) when the _expansion_ of NAME is interpreted; that is, the + restored compatibility state applies to the contents of the macro, + string, or diversion NAME as well as data read from files or pipes + if NAME is any of the 'so', 'soquiet', 'mso', 'msoquiet', or 'pso' + requests. + + The following example illustrates several aspects of 'do' behavior. + + .de mac1 + FOO + .. + .de1 mac2 + groff + .mac1 + .. + .de mac3 + compatibility + .mac1 + .. + .de ma + \\$1 + .. + .cp 1 + .do mac1 + .do mac2 \" mac2, defined with .de1, calls "mac1" + .do mac3 \" mac3 calls "ma" with argument "c1" + .do mac3 \[ti] \" groff syntax accepted in .do arguments + => FOO groff FOO compatibility c1 ~ + + The read-only register '.cp', meaningful only when dereferenced + from a 'do' request, is 1 if compatibility mode was on when the + 'do' request was encountered, and 0 if it was not. This register + is specialized and may require a statement of rationale. + + When writing macro packages or documents that use GNU 'troff' + features and which may be mixed with other packages or documents + that do not--common scenarios include serial processing of man + pages or use of the 'so' or 'mso' requests--you may desire correct + operation regardless of compatibility mode enablement in the + surrounding context. It may occur to you to save the existing + value of '\n(.C' into a register, say, '_C', at the beginning of + your file, turn compatibility mode off with '.cp 0', then restore + it from that register at the end with '.cp \n(_C'. At the same + time, a modular design of a document or macro package may lead you + to multiple layers of inclusion. You cannot use the same register + name everywhere lest you "clobber" the value from a preceding or + enclosing context. The two-character register name space of AT&T + 'troff' is confining and mnemonically challenging; you may wish to + use the more capacious name space of GNU 'troff'. However, + attempting '.nr _my_saved_C \n(.C' will not work in compatibility + mode; the register name is too long. "This is exactly what 'do' is + for," you think, '.do nr _my_saved_C \n(.C'. The foregoing will + always save zero to your register, because 'do' turns compatibility + mode _off_ while it interprets its argument list. + + To robustly save compatibility mode before switching it off, use + + .do nr _my_saved_C \n[.cp] + .cp 0 + + at the beginning of your file, followed by + + .cp \n[_my_saved_C] + .do rr _my_saved_C + + at the end. As in the C language, we all have to share one big + name space, so choose a register name that is unlikely to collide + with other uses. + + Normally, GNU 'troff' preserves the interpolation depth in delimited +arguments, but not in compatibility mode. + + .ds xx ' + \w'abc\*(xxdef' + => 168 (normal mode on a terminal device) + => 72def' (compatibility mode on a terminal device) + + Furthermore, the escape sequences '\f', '\H', '\m', '\M', '\R', '\s', +and '\S' are transparent for the purpose of recognizing a control +character at the beginning of a line only in compatibility mode. For +example, this code produces bold output in both cases, but the text +differs. + + .de xx + Hello! + .. + \fB.xx\fP + => .xx (normal mode) + => Hello! (compatibility mode) + + Normally, the syntax form '\s'N accepts only a single character (a +digit) for N, consistently with other forms that originated in AT&T +'troff', like '\*', '\$', '\f', '\g', '\k', '\n', and '\z'. In +compatibility mode only, a non-zero N must be in the range 4-39. Legacy +documents relying upon this quirk of parsing(1) (*note Compatibility +Mode-Footnote-1::) should be migrated to another '\s' form. + + +File: groff.info, Node: Compatibility Mode-Footnotes, Up: Compatibility Mode + + (1) The Graphic Systems C/A/T phototypesetter (the original device +target for AT&T 'troff') supported only a few discrete type sizes in the +range 6-36 points, so Ossanna contrived a special case in the parser to +do what the user must have meant. Kernighan warned of this in the 1992 +revision of CSTR #54 (§2.3), and more recently, McIlroy referred to it +as a "living fossil". + + +File: groff.info, Node: Other Differences, Prev: Compatibility Mode, Up: Implementation Differences + +5.38.3 Other Differences +------------------------ + +'groff' request names unrecognized by other 'troff' implementations will +likely be ignored by them; escape sequences that are 'groff' extensions +are liable to be interpreted as if the escape character were not +present. For example, the adjustable, non-breaking escape sequence '\~' +is also supported by Heirloom Doctools 'troff' 050915 (September 2005), +'mandoc' 1.9.5 (2009-09-21), 'neatroff' (commit 1c6ab0f6e, 2016-09-13), +and Plan 9 from User Space 'troff' (commit 93f8143600, 2022-08-12), but +not by Solaris or Documenter's Workbench 'troff's. *Note Manipulating +Filling and Adjustment::. + + GNU 'troff' does not allow the use of the escape sequences '\|', +'\^', '\&', '\{', '\}', '\', '\'', '\`', '\-', '\_', '\!', '\%', and +'\c' in identifiers; AT&T 'troff' does. The '\A' escape sequence (*note +Identifiers::) may be helpful in avoiding use of these escape sequences +in names. + + When adjusting to both margins, AT&T 'troff' at first adjusts spaces +starting from the right; GNU 'troff' begins from the left. Both +implementations adjust spaces from opposite ends on alternating output +lines in this adjustment mode to prevent "rivers" in the text. + + GNU 'troff' does not always hyphenate words as AT&T 'troff' does. +The AT&T implementation uses a set of hard-coded rules specific to +English, while GNU 'troff' uses language-specific hyphenation pattern +files derived from TeX. Furthermore, in old versions of 'troff' there +was a limited amount of space to store hyphenation exceptions (arguments +to the 'hw' request); GNU 'troff' has no such restriction. + + GNU 'troff' predefines a string '.T' containing the argument given to +the '-T' command-line option, namely the current output device (for +example, 'pdf' or 'utf8'). The existence of this string is a common +feature of post-CSTR #54 'troff's(1) (*note Other +Differences-Footnote-1::) but valid values are specific to each +implementation. + + AT&T 'troff' ignored attempts to remove read-only registers; GNU +'troff' honors such requests. *Note Built-in Registers::. + + The (read-only) register '.T' interpolates 1 if GNU 'troff' is called +with the '-T' command-line option, and 0 otherwise. This behavior +differs from AT&T 'troff', which interpolated 1 only if 'nroff' was the +formatter and was called with '-T'. + + AT&T 'troff' and other implementations handle the 'lf' request +differently. For them, its LINE argument changes the line number of the +_current_ line. + + AT&T 'troff' had only environments named '0', '1', and '2'. In GNU +'troff', any number of environments may exist, using any valid +identifiers for their names (*note Identifiers::.) + + Fractional type sizes cause one noteworthy incompatibility. In AT&T +'troff' the 'ps' request ignores scaling units and thus '.ps 10u' sets +the type size to 10 points, whereas in GNU 'troff' it sets the type size +to 10 _scaled_ points. *Note Using Fractional Type Sizes::. + + The 'ab' request differs from AT&T 'troff': GNU 'troff' writes no +message to the standard error stream if no arguments are given, and it +exits with a failure status instead of a successful one. + + The 'bp' request differs from AT&T 'troff': GNU 'troff' does not +accept a scaling unit on the argument, a page number; the former +(somewhat uselessly) does. + + The 'pm' request differs from AT&T 'troff': GNU 'troff' reports the +sizes of macros, strings, and diversions in bytes and ignores an +argument to report only the sum of the sizes. + + Unlike AT&T 'troff', GNU 'troff' does not ignore the 'ss' request if +the output is a terminal device; instead, the values of minimal +inter-word and additional inter-sentence space are each rounded down to +the nearest multiple of 12. + + In GNU 'troff' there is a fundamental difference between +(unformatted) characters and (formatted) glyphs. Everything that +affects how a glyph is output is stored with the glyph node; once a +glyph node has been constructed, it is unaffected by any subsequent +requests that are executed, including 'bd', 'cs', 'tkf', 'tr', or 'fp' +requests. Normally, glyphs are constructed from characters immediately +before the glyph is added to an output line. Macros, diversions, and +strings are all, in fact, the same type of object; they contain a +sequence of intermixed character and glyph nodes. Special characters +transform from one to the other: before being added to the output, they +behave as characters; afterward, they are glyphs. A glyph node does not +behave like a character node when it is processed by a macro: it does +not inherit any of the special properties that the character from which +it was constructed might have had. For example, the input + + .di x + \\\\ + .br + .di + .x + +produces '\\' in GNU 'troff'. Each pair of backslashes becomes one +backslash _glyph_; the resulting backslashes are thus not interpreted as +escape _characters_ when they are reread as the diversion is output. +AT&T 'troff' _would_ interpret them as escape characters when rereading +them and end up printing one '\'. + + One correct way to obtain a printable backslash in most documents is +to use the '\e' escape sequence; this always prints a single instance of +the current escape character,(2) (*note Other Differences-Footnote-2::) +regardless of whether or not it is used in a diversion; it also works in +both GNU 'troff' and AT&T 'troff'. + + The other correct way, appropriate in contexts independent of the +backslash's common use as a 'troff' escape character--perhaps in +discussion of character sets or other programming languages--is the +character escape '\(rs' or '\[rs]', for "reverse solidus", from its name +in the ECMA-6 (ISO/IEC 646) standard.(3) (*note Other +Differences-Footnote-3::) + + To store an escape sequence in a diversion that is interpreted when +the diversion is reread, either use the traditional '\!' transparent +output facility, or, if this is unsuitable, the new '\?' escape +sequence. *Note Diversions:: and *note Gtroff Internals::. + + In the somewhat pathological case where a diversion exists containing +a partially collected line and a partially collected line at the +top-level diversion has never existed, AT&T 'troff' will output the +partially collected line at the end of input; GNU 'troff' will not. + + +File: groff.info, Node: Other Differences-Footnotes, Up: Other Differences + + (1) DWB 3.3, Solaris, Heirloom Doctools, and Plan 9 'troff' all +support it. + + (2) Naturally, if you've changed the escape character, you need to +prefix the 'e' with whatever it is--and you'll likely get something +other than a backslash in the output. + + (3) The 'rs' special character identifier was not defined in AT&T +'troff''s font description files, but is in those of its lineal +descendant, Heirloom Doctools 'troff', as of the latter's 060716 release +(July 2006). + + +File: groff.info, Node: File Formats, Next: Copying This Manual, Prev: GNU troff Reference, Up: Top + +6 File Formats +************** + +All files read and written by 'gtroff' are text files. The following +two sections describe their format. + +* Menu: + +* gtroff Output:: +* Device and Font Description Files:: + + +File: groff.info, Node: gtroff Output, Next: Device and Font Description Files, Prev: File Formats, Up: File Formats + +6.1 'gtroff' Output +=================== + +This section describes the 'groff' intermediate output format produced +by GNU 'troff'. + + As 'groff' is a wrapper program around GNU 'troff' and automatically +calls an output driver (or "postprocessor"), this output does not show +up normally. This is why it is called _intermediate_. 'groff' provides +the option '-Z' to inhibit postprocessing such that the produced +intermediate output is sent to standard output just as it is when +calling GNU 'troff' directly. + + Here, the term "troff output" describes what is output by GNU +'troff', while "intermediate output" refers to the language that is +accepted by the parser that prepares this output for the output drivers. +This parser handles whitespace more flexibly than AT&T's implementation +and implements obsolete elements for compatibility; otherwise, both +formats are the same.(1) (*note gtroff Output-Footnote-1::) + + The main purpose of the intermediate output concept is to facilitate +the development of postprocessors by providing a common programming +interface for all devices. It has a language of its own that is +completely different from the 'gtroff' language. While the 'gtroff' +language is a high-level programming language for text processing, the +intermediate output language is a kind of low-level assembler language +by specifying all positions on the page for writing and drawing. + + The intermediate output produced by 'gtroff' is fairly readable, +while output from AT&T 'troff' is rather hard to understand because of +strange habits that are still supported, but not used any longer by +'gtroff'. + +* Menu: + +* Language Concepts:: +* Command Reference:: +* Intermediate Output Examples:: +* Output Language Compatibility:: + + +File: groff.info, Node: gtroff Output-Footnotes, Up: gtroff Output + + (1) The parser and postprocessor for intermediate output can be found +in the file +'GROFF-SOURCE-DIR/src/libs/libdriver/input.cpp'. + + +File: groff.info, Node: Language Concepts, Next: Command Reference, Prev: gtroff Output, Up: gtroff Output + +6.1.1 Language Concepts +----------------------- + +The fundamental operation of the GNU 'troff' formatter is the +translation of the 'groff' input language into a device-independent form +primarily concerned with what has to be written or drawn at specific +positions on the output device. This language is simple and imperative. +In the following discussion, the term "command" always refers to this +intermediate output language, and never to the 'groff' language intended +for direct use by document authors. Intermediate output commands +comprise several categories: glyph output; font, color, and text size +selection; motion of the printing position; page advancement; drawing of +geometric objects; and device control commands, a catch-all for +operations not easily classified as any of the foregoing, such as +directives to start and stop output, identify the intended output +device, or place URL hyperlinks in supported output formats. + +* Menu: + +* Separation:: +* Argument Units:: +* Document Parts:: + + +File: groff.info, Node: Separation, Next: Argument Units, Prev: Language Concepts, Up: Language Concepts + +6.1.1.1 Separation +.................. + +AT&T 'troff' output has strange requirements regarding whitespace. The +'gtroff' output parser, however, is more tolerant, making whitespace +maximally optional. Such characters, i.e., the tab, space, and newline, +always have a syntactical meaning. They are never printable because +spacing within the output is always done by positioning commands. + + Any sequence of space or tab characters is treated as a single +"syntactical space". It separates commands and arguments, but is only +required when there would occur a clashing between the command code and +the arguments without the space. Most often, this happens when +variable-length command names, arguments, argument lists, or command +clusters meet. Commands and arguments with a known, fixed length need +not be separated by syntactical space. + + A line break is a syntactical element, too. Every command argument +can be followed by whitespace, a comment, or a newline character. Thus +a "syntactical line break" is defined to consist of optional syntactical +space that is optionally followed by a comment, and a newline character. + + The normal commands, those for positioning and text, consist of a +single letter taking a fixed number of arguments. For historical +reasons, the parser allows stacking of such commands on the same line, +but fortunately, in 'gtroff''s intermediate output, every command with +at least one argument is followed by a line break, thus providing +excellent readability. + + The other commands--those for drawing and device controlling--have a +more complicated structure; some recognize long command names, and some +take a variable number of arguments. So all 'D' and 'x' commands were +designed to request a syntactical line break after their last argument. +Only one command, 'x X', has an argument that can span several input +lines; all other commands must have all of their arguments on the same +line as the command, i.e., the arguments may not be split by a line +break. + + Empty lines (these are lines containing only space and/or a comment), +can occur everywhere. They are just ignored. + + +File: groff.info, Node: Argument Units, Next: Document Parts, Prev: Separation, Up: Language Concepts + +6.1.1.2 Argument Units +...................... + +Some commands take integer arguments that are assumed to represent +values in a measurement unit, but the letter for the corresponding +scaling unit is not written with the output command arguments. Most +commands assume the scaling unit 'u', the basic unit of the device, some +use 'z', the scaled point unit of the device, while others, such as the +color commands, expect plain integers. + + Single characters can have the eighth bit set, as can the names of +fonts and special characters. The names of characters and fonts can be +of arbitrary length. A character that is to be printed is always in the +current font. + + A string argument is always terminated by the next whitespace +character (space, tab, or newline); an embedded '#' character is +regarded as part of the argument, not as the beginning of a comment +command. An integer argument is already terminated by the next +non-digit character, which then is regarded as the first character of +the next argument or command. + + +File: groff.info, Node: Document Parts, Prev: Argument Units, Up: Language Concepts + +6.1.1.3 Document Parts +...................... + +A correct intermediate output document consists of two parts, the +"prologue" and the "body". + + The task of the prologue is to set the general device parameters +using three exactly specified commands. 'gtroff''s prologue is +guaranteed to consist of the following three lines (in that order): + + x T DEVICE + x res N H V + x init + +with the arguments set as outlined in *note Device Control Commands::. +The parser for the intermediate output format is able to interpret +additional whitespace and comments as well even in the prologue. + + The body is the main section for processing the document data. +Syntactically, it is a sequence of any commands different from the ones +used in the prologue. Processing is terminated as soon as the first +'x stop' command is encountered; the last line of any 'gtroff' +intermediate output always contains such a command. + + Semantically, the body is page oriented. A new page is started by a +'p' command. Positioning, writing, and drawing commands are always done +within the current page, so they cannot occur before the first 'p' +command. Absolute positioning (by the 'H' and 'V' commands) is done +relative to the current page; all other positioning is done relative to +the current location within this page. + + +File: groff.info, Node: Command Reference, Next: Intermediate Output Examples, Prev: Language Concepts, Up: gtroff Output + +6.1.2 Command Reference +----------------------- + +This section describes all intermediate output commands, both from AT&T +'troff' as well as the 'gtroff' extensions. + +* Menu: + +* Comment Command:: +* Simple Commands:: +* Graphics Commands:: +* Device Control Commands:: +* Obsolete Command:: + + +File: groff.info, Node: Comment Command, Next: Simple Commands, Prev: Command Reference, Up: Command Reference + +6.1.2.1 Comment Command +....................... + +'#ANYTHING' + A comment. Ignore any characters from the '#' character up to the + next newline character. + + This command is the only possibility for commenting in the + intermediate output. Each comment can be preceded by arbitrary + syntactical space; every command can be terminated by a comment. + + +File: groff.info, Node: Simple Commands, Next: Graphics Commands, Prev: Comment Command, Up: Command Reference + +6.1.2.2 Simple Commands +....................... + +The commands in this subsection have a command code consisting of a +single character, taking a fixed number of arguments. Most of them are +commands for positioning and text writing. These commands are tolerant +of whitespace. Optionally, syntactical space can be inserted before, +after, and between the command letter and its arguments. All of these +commands are stackable; i.e., they can be preceded by other simple +commands or followed by arbitrary other commands on the same line. A +separating syntactical space is necessary only when two integer +arguments would clash or if the preceding argument ends with a string +argument. + +'C ID' + Typeset the glyph of the special character ID. Trailing + syntactical space is necessary to allow special character names of + arbitrary length. The drawing position is not advanced. + +'c G' + Typeset the glyph of the ordinary character C. The drawing + position is not advanced. + +'f N' + Select the font mounted at position N. N cannot be negative. + +'H N' + Horizontally move the drawing position to N basic units from the + left edge of the page. N cannot be negative. + +'h N' + Move the drawing position right N basic units. AT&T 'troff' + allowed negative N; GNU 'troff' does not produce such values, but + 'groff''s output driver library handles them. + +'m COLOR-SCHEME [COMPONENT ...]' + Select the stroke color using the COMPONENTs in the color space + SCHEME. Each COMPONENT is an integer between 0 and 65535. The + quantity of components and their meanings vary with each SCHEME. + This command is a 'groff' extension. + + 'mc CYAN MAGENTA YELLOW' + Use the CMY color scheme with components cyan, magenta, and + yellow. + + 'md' + Use the default color (no components; black in most cases). + + 'mg GRAY' + Use a grayscale color scheme with a component ranging between + 0 (black) and 65535 (white). + + 'mk CYAN MAGENTA YELLOW BLACK' + Use the CMYK color scheme with components cyan, magenta, + yellow, and black. + + 'mr RED GREEN BLUE' + Use the RGB color scheme with components red, green, and blue. + +'N N' + Typeset the glyph with index N in the current font. N is normally + a non-negative integer. The drawing position is not advanced. The + 'html' and 'xhtml' devices use this command with negative N to + produce unbreakable space; the absolute value of N is taken and + interpreted in basic units. + +'n B A' + Indicate a break. No action is performed; the command is present + to make the output more easily parsed. The integers B and A + describe the vertical space amounts before and after the break, + respectively. GNU 'troff' issues this command but 'groff''s output + driver library ignores it. See 'v' and 'V' below. + +'p N' + Begin a new page, setting its number to N. Each page is + independent, even from those using the same number. The vertical + drawing position is set to 0. All positioning, writing, and + drawing commands are interpreted in the context of a page, so a + 'p' command must precede them. + +'s N' + Set type size to N scaled points (unit 'z' in GNU 'troff'. AT&T + 'troff' used unscaled points 'p' instead; see *note Output Language + Compatibility::. + +'t XYZ' +'t XYZ DUMMY-ARG' + Typeset a word XYZ; that is, set a sequence of ordinary glyphs + named X, Y, Z, ..., terminated by a space character or a line + break; an optional second integer argument is ignored (this allows + the formatter to generate an even number of arguments). Each glyph + is set at the current drawing position, and the position is then + advanced horizontally by the glyph's width. A glyph's width is + read from its metrics in the font description file, scaled to the + current type size, and rounded to a multiple of the horizontal + motion quantum. Use the 'C' command to emplace glyphs of special + characters. The 't' command is a 'groff' extension and is output + only for devices whose 'DESC' file contains the 'tcommand' + directive; see *note DESC File Format::. + +'u N XYZ' + Typeset word XYZ with track kerning. As 't', but after placing + each glyph, the drawing position is further advanced horizontally + by N basic units ('u'). The 'u' command is a 'groff' extension and + is output only for devices whose 'DESC' file contains the + 'tcommand' directive; see *note DESC File Format::. + +'V N' + Vertically move the drawing position to N basic units from the top + edge of the page. N cannot be negative. + +'v N' + Move the drawing position down N basic units. AT&T 'troff' allowed + negative N; GNU 'troff' does not produce such values, but 'groff''s + output driver library handles them. + +'w' + Indicate an inter-word space. No action is performed; the command + is present to make the output more easily parsed. Only adjustable, + breakable inter-word spaces are thus described; those resulting + from '\~' or horizontal motion escape sequences are not. GNU + 'troff' issues this command but 'groff''s output driver library + ignores it. See 'h' and 'H' above. + + +File: groff.info, Node: Graphics Commands, Next: Device Control Commands, Prev: Simple Commands, Up: Command Reference + +6.1.2.3 Graphics Commands +......................... + +Each graphics or drawing command in the intermediate output starts with +the letter 'D', followed by one or two characters that specify a +subcommand; this is followed by a fixed or variable number of integer +arguments that are separated by a single space character. A 'D' command +may not be followed by another command on the same line (apart from a +comment), so each 'D' command is terminated by a syntactical line break. + + 'gtroff' output follows the classical spacing rules (no space between +command and subcommand, all arguments are preceded by a single space +character), but the parser allows optional space between the command +letters and makes the space before the first argument optional. As +usual, each space can be any sequence of tab and space characters. + + Some graphics commands can take a variable number of arguments. In +this case, they are integers representing a size measured in basic units +'u'. The arguments called H1, H2, ..., HN stand for horizontal +distances where positive means right, negative left. The arguments +called V1, V2, ..., VN stand for vertical distances where positive means +down, negative up. All these distances are offsets relative to the +current location. + + Each graphics command directly corresponds to a similar 'gtroff' '\D' +escape sequence. *Note Drawing Geometric Objects::. + + Unknown 'D' commands are assumed to be device-specific. Its +arguments are parsed as strings; the whole information is then sent to +the postprocessor. + + In the following command reference, the syntax element +means a syntactical line break as defined above. + +'D~ H1 V1 H2 V2 ... HN VN' + Draw B-spline from current position to offset (H1,V1), then to + offset (H2,V2), if given, etc., up to (HN,VN). This command takes + a variable number of argument pairs; the current position is moved + to the terminal point of the drawn curve. + +'Da H1 V1 H2 V2' + Draw arc from current position to (H1,V1)+(H2,V2) with center at + (H1,V1); then move the current position to the final point of the + arc. + +'DC D' +'DC D DUMMY-ARG' + Draw a solid circle using the current fill color with diameter D + (integer in basic units 'u') with leftmost point at the current + position; then move the current position to the rightmost point of + the circle. An optional second integer argument is ignored (this + allows the formatter to generate an even number of arguments). + This command is a 'gtroff' extension. + +'Dc D' + Draw circle line with diameter D (integer in basic units 'u') with + leftmost point at the current position; then move the current + position to the rightmost point of the circle. + +'DE H V' + Draw a solid ellipse in the current fill color with a horizontal + diameter of H and a vertical diameter of V (both integers in basic + units 'u') with the leftmost point at the current position; then + move to the rightmost point of the ellipse. This command is a + 'gtroff' extension. + +'De H V' + Draw an outlined ellipse with a horizontal diameter of H and a + vertical diameter of V (both integers in basic units 'u') with the + leftmost point at current position; then move to the rightmost + point of the ellipse. + +'DF COLOR-SCHEME [COMPONENT ...]' + Set fill color for solid drawing objects using different color + schemes; the analogous command for setting the color of text, line + graphics, and the outline of graphic objects is 'm'. The color + components are specified as integer arguments between 0 and 65535. + The number of color components and their meaning vary for the + different color schemes. These commands are generated by + 'gtroff''s escape sequences '\D'F ...'' and '\M' (with no other + corresponding graphics commands). No position changing. This + command is a 'gtroff' extension. + + 'DFc CYAN MAGENTA YELLOW' + Set fill color for solid drawing objects using the CMY color + scheme, having the 3 color components CYAN, MAGENTA, and + YELLOW. + + 'DFd' + Set fill color for solid drawing objects to the default fill + color value (black in most cases). No component arguments. + + 'DFg GRAY' + Set fill color for solid drawing objects to the shade of gray + given by the argument, an integer between 0 (black) and 65535 + (white). + + 'DFk CYAN MAGENTA YELLOW BLACK' + Set fill color for solid drawing objects using the CMYK color + scheme, having the 4 color components CYAN, MAGENTA, YELLOW, + and BLACK. + + 'DFr RED GREEN BLUE' + Set fill color for solid drawing objects using the RGB color + scheme, having the 3 color components RED, GREEN, and BLUE. + +'Df N' + The argument N must be an integer in the range -32767 to 32767. + + 0 <= N <= 1000 + Set the color for filling solid drawing objects to a shade of + gray, where 0 corresponds to solid white, 1000 (the default) + to solid black, and values in between to intermediate shades + of gray; this is obsoleted by command 'DFg'. + + N < 0 or N > 1000 + Set the filling color to the color that is currently being + used for the text and the outline, see command 'm'. For + example, the command sequence + + mg 0 0 65535 + Df -1 + + sets all colors to blue. + + No position changing. This command is a 'gtroff' extension. + +'Dl H V' + Draw line from current position to offset (H,V) (integers in basic + units 'u'); then set current position to the end of the drawn line. + +'Dp H1 V1 H2 V2 ... HN VN' + Draw a polygon line from current position to offset (H1,V1), from + there to offset (H2,V2), etc., up to offset (HN,VN), and from there + back to the starting position. For historical reasons, the + position is changed by adding the sum of all arguments with odd + index to the actual horizontal position and the even ones to the + vertical position. Although this doesn't make sense it is kept for + compatibility. This command is a 'gtroff' extension. + +'DP H1 V1 H2 V2 ... HN VN' + Draw a solid polygon in the current fill color rather than an + outlined polygon, using the same arguments and positioning as the + corresponding 'Dp' command. This command is a 'gtroff' extension. + +'Dt N' + Set the current line thickness to N (an integer in basic units 'u') + if N>0; if N=0 select the smallest available line thickness; if N<0 + set the line thickness proportional to the type size (this is the + default before the first 'Dt' command was specified). For + historical reasons, the horizontal position is changed by adding + the argument to the actual horizontal position, while the vertical + position is not changed. Although this doesn't make sense it is + kept for compatibility. This command is a 'gtroff' extension. + + +File: groff.info, Node: Device Control Commands, Next: Obsolete Command, Prev: Graphics Commands, Up: Command Reference + +6.1.2.4 Device Control Commands +............................... + +Each device control command starts with the letter 'x', followed by a +space character (optional or arbitrary space or tab in 'gtroff') and a +subcommand letter or word; each argument (if any) must be preceded by a +syntactical space. All 'x' commands are terminated by a syntactical +line break; no device control command can be followed by another command +on the same line (except a comment). + + The subcommand is basically a single letter, but to increase +readability, it can be written as a word, i.e., an arbitrary sequence of +characters terminated by the next tab, space, or newline character. All +characters of the subcommand word but the first are simply ignored. For +example, 'gtroff' outputs the initialization command 'x i' as 'x init' +and the resolution command 'x r' as 'x res'. + + In the following, the syntax element means a syntactical +line break (*note Separation::). + +'xF NAME' + The 'F' stands for FILENAME. + + Use NAME as the intended name for the current file in error + reports. This is useful for remembering the original file name + when 'gtroff' uses an internal piping mechanism. The input file is + not changed by this command. This command is a 'gtroff' extension. + +'xf N S' + The 'f' stands for FONT. + + Mount font position N (a non-negative integer) with font named S (a + text word). *Note Font Positions::. + +'xH N' + The 'H' stands for HEIGHT. + + Set glyph height to N (a positive integer in scaled points 'z'). + AT&T 'troff' uses the unit points ('p') instead. *Note Output + Language Compatibility::. + +'xi' + The 'i' stands for INIT. + + Initialize device. This is the third command of the prologue. + +'xp' + The 'p' stands for PAUSE. + + Parsed but ignored. The AT&T 'troff' manual documents this command + as + + pause device, can be restarted + + but GNU 'troff' output drivers do nothing with this command. + +'xr N H V' + The 'r' stands for RESOLUTION. + + Resolution is N, while H is the minimal horizontal motion, and V + the minimal vertical motion possible with this device; all + arguments are positive integers in basic units 'u' per inch. This + is the second command of the prologue. + +'xS N' + The 'S' stands for SLANT. + + Set slant to N (an integer in basic units 'u'). + +'xs' + The 's' stands for STOP. + + Terminates the processing of the current file; issued as the last + command of any intermediate 'troff' output. + +'xt' + The 't' stands for TRAILER. + + Generate trailer information, if any. In GNU 'troff', this is + ignored. + +'xT XXX' + The 'T' stands for TYPESETTER. + + Set the name of the output driver to XXX, a sequence of + non-whitespace characters terminated by whitespace. The possible + names correspond to those of 'groff''s '-T' option. This is the + first command of the prologue. + +'xu N' + The 'u' stands for UNDERLINE. + + Configure underlining of spaces. If N is 1, start underlining of + spaces; if N is 0, stop underlining of spaces. This is needed for + the 'cu' request in 'nroff' mode and is ignored otherwise. This + command is a 'gtroff' extension. + +'xX ANYTHING' + The 'x' stands for X-ESCAPE. + + Send string ANYTHING uninterpreted to the device. If the line + following this command starts with a '+' character this line is + interpreted as a continuation line in the following sense. The '+' + is ignored, but a newline character is sent instead to the device, + the rest of the line is sent uninterpreted. The same applies to + all following lines until the first character of a line is not a + '+' character. This command is generated by the 'gtroff' escape + sequence '\X'. The line-continuing feature is a 'gtroff' + extension. + + +File: groff.info, Node: Obsolete Command, Prev: Device Control Commands, Up: Command Reference + +6.1.2.5 Obsolete Command +........................ + +In AT&T 'troff' output, the writing of a single glyph is mostly done by +a very strange command that combines a horizontal move and a single +character giving the glyph name. It doesn't have a command code, but is +represented by a 3-character argument consisting of exactly 2 digits and +a character. + +DDG + Move right DD (exactly two decimal digits) basic units 'u', then + print glyph G (represented as a single character). + + In GNU 'troff', arbitrary syntactical space around and within this + command is allowed. Only when a preceding command on the same line + ends with an argument of variable length is a separating space + obligatory. In AT&T 'troff', large clusters of these and other + commands are used, mostly without spaces; this made such output + almost unreadable. + + For modern high-resolution devices, this command does not make sense +because the width of the glyphs can become much larger than two decimal +digits. In 'gtroff', this is only used for the devices 'X75', 'X75-12', +'X100', and 'X100-12'. For other devices, the commands 't' and 'u' +provide a better functionality. + + +File: groff.info, Node: Intermediate Output Examples, Next: Output Language Compatibility, Prev: Command Reference, Up: gtroff Output + +6.1.3 Intermediate Output Examples +---------------------------------- + +This section presents the intermediate output generated from the same +input for three different devices. The input is the sentence 'hell +world' fed into 'gtroff' on the command line. + +High-resolution device 'ps' + + This is the standard output of 'gtroff' if no '-T' option is given. + + shell> echo "hell world" | groff -Z -T ps + + x T ps + x res 72000 1 1 + x init + p1 + x font 5 TR + f5 + s10000 + V12000 + H72000 + thell + wh2500 + tw + H96620 + torld + n12000 0 + x trailer + V792000 + x stop + + This output can be fed into 'grops' to get its representation as a + PostScript file. + +Low-resolution device 'latin1' + + This is similar to the high-resolution device except that the + positioning is done at a minor scale. Some comments (lines + starting with '#') were added for clarification; they were not + generated by the formatter. + + shell> echo "hell world" | groff -Z -T latin1 + + # prologue + x T latin1 + x res 240 24 40 + x init + # begin a new page + p1 + # font setup + x font 1 R + f1 + s10 + # initial positioning on the page + V40 + H0 + # write text 'hell' + thell + # inform about space, and issue a horizontal jump + wh24 + # write text 'world' + tworld + # announce line break, but do nothing because... + n40 0 + # ...the end of the document has been reached + x trailer + V2640 + x stop + + This output can be fed into 'grotty' to get a formatted text + document. + +AT&T 'troff' output + Since a computer monitor has a much lower resolution than modern + printers, the intermediate output for X11 devices can use the + jump-and-write command with its 2-digit displacements. + + shell> echo "hell world" | groff -Z -T X100 + + x T X100 + x res 100 1 1 + x init + p1 + x font 5 TR + f5 + s10 + V16 + H100 + # write text with jump-and-write commands + ch07e07l03lw06w11o07r05l03dh7 + n16 0 + x trailer + V1100 + x stop + + This output can be fed into 'xditview' or 'gxditview' for + displaying in X. + + Due to the obsolete jump-and-write command, the text clusters in + the AT&T 'troff' output are almost unreadable. + + +File: groff.info, Node: Output Language Compatibility, Prev: Intermediate Output Examples, Up: gtroff Output + +6.1.4 Output Language Compatibility +----------------------------------- + +The intermediate output language of AT&T 'troff' was first documented in +'A Typesetter-independent TROFF', by Brian Kernighan, and by 1992 the +AT&T 'troff' manual was updated to incorprate a description of it. + + The GNU 'troff' intermediate output format is compatible with this +specification except for the following features. + + * The classical quasi-device independence is not yet implemented. + + * The old hardware was very different from what we use today. So the + 'groff' devices are also fundamentally different from the ones in + AT&T 'troff'. For example, the AT&T PostScript device is called + 'post' and has a resolution of only 720 units per inch, suitable + for printers 20 years ago, while 'groff''s 'ps' device has a + resolution of 72000 units per inch. Maybe, by implementing some + rescaling mechanism similar to the classical quasi-device + independence, 'groff' could emulate AT&T's 'post' device. + + * The B-spline command 'D~' is correctly handled by the intermediate + output parser, but the drawing routines aren't implemented in some + of the postprocessor programs. + + * The argument of the commands 's' and 'x H' has the implicit unit + scaled point 'z' in 'gtroff', while AT&T 'troff' has point ('p'). + This isn't an incompatibility but a compatible extension, for both + units coincide for all devices without a 'sizescale' parameter in + the 'DESC' file, including all postprocessors from AT&T and + 'groff''s text devices. The few 'groff' devices with a 'sizescale' + parameter either do not exist for AT&T 'troff', have a different + name, or seem to have a different resolution. So conflicts are + very unlikely. + + * The position changing after the commands 'Dp', 'DP', and 'Dt' is + illogical, but as old versions of 'gtroff' used this feature it is + kept for compatibility reasons. + + +File: groff.info, Node: Device and Font Description Files, Prev: gtroff Output, Up: File Formats + +6.2 Device and Font Description Files +===================================== + +The 'groff' font and output device description formats are slight +extensions of those used by AT&T device-independent 'troff'. In +distinction to the AT&T implementation, 'groff' lacks a binary format; +all files are text files.(1) (*note Device and Font Description +Files-Footnote-1::) The device and font description files for a device +NAME are stored in a 'devNAME' directory. The device description file +is called 'DESC', and, for each font supported by the device, a font +description file is called 'F', where F is usually an abbreviation of a +font's name and/or style. For example, the 'ps' (PostScript) device has +'groff' font description files for Times roman ('TR') and Zapf Chancery +Medium italic ('ZCMI'), among many others, while the 'utf8' device (for +terminal emulators) has only font descriptions for the roman, italic, +bold, and bold-italic styles ('R', 'I', 'B', and 'BI', respectively). + + Device and font description files are read both by the formatter, GNU +'troff', and by output drivers. The programs delegate these files' +processing to an internal library, 'libgroff', ensuring their consistent +interpretation. + +* Menu: + +* DESC File Format:: +* Font Description File Format:: + + +File: groff.info, Node: Device and Font Description Files-Footnotes, Up: Device and Font Description Files + + (1) Plan 9 'troff' has also abandoned the binary format. + + +File: groff.info, Node: DESC File Format, Next: Font Description File Format, Prev: Device and Font Description Files, Up: Device and Font Description Files + +6.2.1 'DESC' File Format +------------------------ + +The 'DESC' file contains a series of directives; each begins a line. +Their order is not important, with two exceptions: (1) the 'res' +directive must precede any 'papersize' directive; and (2) the 'charset' +directive must come last (if at all). If a directive name is repeated, +later entries in the file override previous ones (except that the paper +dimensions are computed based on the 'res' directive last seen when +'papersize' is encountered). Spaces and/or tabs separate words and are +ignored at line boundaries. Comments start with the '#' character and +extend to the end of a line. Empty lines are ignored. + +'family FAM' + The default font family is FAM. + +'fonts N F1 ... FN' + Fonts F1, ..., FN are mounted at font positions M+1, ..., M+N where + M is the number of 'styles' (see below). This directive may extend + over more than one line. A font name of '0' causes no font to be + mounted at the corresponding position. + +'hor N' + The horizontal motion quantum is N basic units. All horizontal + quantities are rounded to multiples of N. + +'image_generator PROGRAM' + Use PROGRAM to generate PNG images from PostScript input. Under + GNU/Linux, this is usually 'gs', but under other systems (notably + Cygwin) it might be set to another name. The 'grohtml' driver uses + this directive. + +'paperlength N' + The vertical dimension of the output medium is N basic units + (deprecated: use 'papersize' instead). + +'papersize FORMAT-OR-DIMENSION-PAIR-OR-FILE-NAME ...' + The dimensions of the output medium are as according to the + argument, which is either a standard paper format, a pair of + dimensions, or the name of a plain text file containing either of + the foregoing. + + Recognized paper formats are the ISO and DIN formats 'A0'-'A7', + 'B0'-'B7', 'C0'-'C7', 'D0'-'D7'; the U.S. paper types 'letter', + 'legal', 'tabloid', 'ledger', 'statement', and 'executive'; and the + envelope formats 'com10', 'monarch', and 'DL'. Matching is + performed without regard for lettercase. + + Alternatively, the argument can be a custom paper format in the + format 'LENGTH,WIDTH' (with no spaces before or after the comma). + Both LENGTH and WIDTH must have a unit appended; valid units are + 'i' for inches, 'c' for centimeters, 'p' for points, and 'P' for + picas. Example: '12c,235p'. An argument that starts with a digit + is always treated as a custom paper format. + + Finally, the argument can be a file name (e.g., '/etc/papersize'); + if the file can be opened, the first line is read and a match + attempted against each of the other forms. No comment syntax is + supported. + + More than one argument can be specified; each is scanned in turn + and the first valid paper specification used. + +'paperwidth N' + The horizontal dimension of the output medium is N basic units + (deprecated: use 'papersize' instead). + +'pass_filenames' + Direct GNU 'troff' to emit the name of the source file being + processed. This is achieved with the intermediate output command + 'x F', which 'grohtml' interprets. + +'postpro PROGRAM' + Use PROGRAM as the postprocessor. + +'prepro PROGRAM' + Use PROGRAM as a preprocessor. The 'html' and 'xhtml' output + devices use this directive. + +'print PROGRAM' + Use PROGRAM as a spooler program for printing. If omitted, the + '-l' and '-L' options of 'groff' are ignored. + +'res N' + The device resolution is N basic units per inch. + +'sizes S1 ... SN 0' + The device has fonts at S1, ..., SN scaled points (see below). The + list of sizes must be terminated by '0'. Each SI can also be a + range of sizes M-N. The list can extend over more than one line. + +'sizescale N' + A typographical point is subdivided into N scaled points. The + default is '1'. *Note Using Fractional Type Sizes::. + +'styles S1 ... SM' + The first M mounting positions are associated with styles S1, ..., + SM. + +'tcommand' + The postprocessor can handle the 't' and 'u' intermediate output + commands. + +'unicode' + The output device supports the complete Unicode repertoire. This + directive is useful only for devices that produce character + entities instead of glyphs. + + If 'unicode' is present, no 'charset' section is required in the + font description files since the Unicode handling built into + 'groff' is used. However, if there are entries in a font + description file's 'charset' section, they either override the + default mappings for those particular characters or add new + mappings (normally for composite characters). + + The 'utf8', 'html', and 'xhtml' output devices use this directive. + +'unitwidth N' + Quantities in the font description files are in basic units for + fonts whose type size is N scaled points. + +'unscaled_charwidths' + Make the font handling module always return unscaled character + widths. The 'grohtml' driver uses this directive. + +'use_charnames_in_special' + GNU 'troff' should encode special characters inside device control + commands; see *note Postprocessor Access::. The 'grohtml' driver + uses this directive. + +'vert N' + The vertical motion quantum is N basic units. All vertical + quantities are rounded to multiples of N. + +'charset' + This line and everything following it in the file are ignored. It + is recognized for compatibility with other 'troff' implementations. + In GNU 'troff', character set repertoire is described on a per-font + basis. + + GNU 'troff' recognizes but ignores the directives 'spare1', 'spare2', +and 'biggestfont'. + + The 'res', 'unitwidth', 'fonts', and 'sizes' lines are mandatory. +Directives not listed above are ignored by GNU 'troff' but may be used +by postprocessors to obtain further information about the device. + + +File: groff.info, Node: Font Description File Format, Prev: DESC File Format, Up: Device and Font Description Files + +6.2.2 Font Description File Format +---------------------------------- + +On typesetting output devices, each font is typically available at +multiple sizes. While paper measurements in the device description file +are in absolute units, measurements applicable to fonts must be +proportional to the type size. 'groff' achieves this using the +precedent set by AT&T device-independent 'troff': one font size is +chosen as a norm, and all others are scaled linearly relative to that +basis. The "unit width" is the number of basic units per point when the +font is rendered at this nominal size. + + For instance, 'groff''s 'lbp' device uses a 'unitwidth' of 800. Its +Times roman font 'TR' has a 'spacewidth' of 833; this is also the width +of its comma, period, centered period, and mathematical asterisk, while +its 'M' is 2,963 basic units. Thus, an 'M' on the 'lbp' device is 2,963 +basic units wide at a notional type size of 800 points.(1) (*note Font +Description File Format-Footnote-1::) + + A font description file has two sections. The first is a sequence of +directives, and is parsed similarly to the 'DESC' file described above. +Except for the directive names that begin the second section, their +ordering is immaterial. Later directives of the same name override +earlier ones, spaces and tabs are handled in the same way, and the same +comment syntax is supported. Empty lines are ignored throughout. + +'name F' + The name of the font is F. 'DESC' is an invalid font name. Simple + integers are valid, but their use is discouraged.(2) (*note Font + Description File Format-Footnote-2::) + +'spacewidth N' + The width of an unadjusted inter-word space is N basic units. + + The directives above must appear in the first section; those below +are optional. + +'slant N' + The font's glyphs have a slant of N degrees; a positive N slants in + the direction of text flow. + +'ligatures LIG1 ... LIGN [0]' + Glyphs LIG1, ..., LIGN are ligatures; possible ligatures are 'ff', + 'fi', 'fl', 'ffi' and 'ffl'. For compatibility with other 'troff' + implementations, the list of ligatures may be terminated with + a '0'. The list of ligatures must not extend over more than one + line. + +'special' + The font is "special": when a glyph is requested that is not + present in the current font, it is sought in any mounted fonts that + bear this property. + + Other directives in this section are ignored by GNU 'troff', but may +be used by postprocessors to obtain further information about the font. + + The second section contains one or two subsections. These can appear +in either order; the first one encountered commences the second section. +Each starts with a directive on a line by itself. A 'charset' +subsection is mandatory unless the associated 'DESC' file contains the +'unicode' directive. Another subsection, 'kernpairs', is optional. + + The directive 'charset' starts the character set subsection.(3) +(*note Font Description File Format-Footnote-3::) It precedes a series +of glyph descriptions, one per line. Each such glyph description +comprises a set of fields separated by spaces or tabs and organized as +follows. + + NAME METRICS TYPE CODE [ENTITY-NAME] ['--' COMMENT] + +NAME identifies the glyph: if NAME is a printable character C, it +corresponds to the 'troff' ordinary character C. If NAME is a +multi-character sequence not beginning with '\', it corresponds to the +GNU 'troff' special character escape sequence '\[NAME]'. A name +consisting of three minus signs, '---', is special and indicates that +the glyph is unnamed: such glyphs can be accessed only by the '\N' +escape sequence in 'troff'. A special character named '---' can still +be defined using 'char' and similar requests. The NAME '\-' defines the +minus sign glyph. Finally, NAME can be the unbreakable one-sixth and +one-twelfth space escape sequences, '\|' and '\^' ("thin" and "hair" +spaces, respectively), in which case only the width metric described +below is interpreted; a font can thus customize the widths of these +spaces. + + The form of the METRICS field is as follows. + + WIDTH[','[HEIGHT[','[DEPTH[','[ITALIC-CORRECTION + [','[LEFT-ITALIC-CORRECTION[','[SUBSCRIPT-CORRECTION]]]]]]]]]] + +There must not be any spaces, tabs, or newlines between these +"subfields" (which have been split here into two lines only for better +legibility). The subfields are in basic units expressed as decimal +integers. Unspecified subfields default to '0'. Since there is no +associated binary format, these values are not required to fit into the +C language data type 'char' as they are in AT&T device-independent +'troff'. + + The WIDTH subfield gives the width of the glyph. The HEIGHT subfield +gives the height of the glyph (upward is positive); if a glyph does not +extend above the baseline, it should be given a zero height, rather than +a negative height. The DEPTH subfield gives the depth of the glyph, +that is, the distance below the baseline to which the glyph extends +(downward is positive); if a glyph does not extend below the baseline, +it should be given a zero depth, rather than a negative depth. Italic +corrections are relevant to glyphs in italic or oblique styles. The +ITALIC-CORRECTION is the amount of space that should be added after an +oblique glyph to be followed immediately by an upright glyph. The +LEFT-ITALIC-CORRECTION is the amount of space that should be added +before an oblique glyph to be preceded immediately by an upright glyph. +The SUBSCRIPT-CORRECTION is the amount of space that should be added +after an oblique glyph to be followed by a subscript; it should be less +than the italic correction. + + For fonts used with typesetting devices, the TYPE field gives a +featural description of the glyph: it is a bit mask recording whether +the glyph is an ascender, descender, both, or neither. When a '\w' +escape sequence is interpolated, these values are bitwise or-ed together +for each glyph and stored in the 'nr' register. In font descriptions +for terminal devices, all glyphs might have a type of zero, regardless +of their appearance. + +'0' + means the glyph lies entirely between the baseline and a horizontal + line at the "x-height" of the font; typical examples are 'a', 'c', + and 'x'; + +'1' + means the glyph descends below the baseline, like 'p'; + +'2' + means the glyph ascends above the font's x-height, like 'A' or 'b'; + and + +'3' + means the glyph is both an ascender and a descender--this is true + of parentheses in some fonts. + + The CODE field gives a numeric identifier that the postprocessor uses +to render the glyph. The glyph can be specified to 'troff' using this +code by means of the '\N' escape sequence. CODE can be any integer.(4) +(*note Font Description File Format-Footnote-4::) + + The ENTITY-NAME field defines an identifier for the glyph that the +postprocessor uses to print the GNU 'troff' glyph NAME. This field is +optional; it was introduced so that the 'grohtml' output driver could +encode its character set. For example, the glyph '\[Po]' is represented +by '£' in HTML 4.0. For efficiency, these data are now compiled +directly into 'grohtml'. 'grops' uses the field to build sub-encoding +arrays for PostScript fonts containing more than 256 glyphs. Anything +on the line after the ENTITY-NAME field or '--' is ignored. + + A line in the 'charset' section can also have the form + + NAME " + +identifying NAME as another name for the glyph mentioned in the +preceding line. Such aliases can be chained. + + The directive 'kernpairs' starts a list of kerning adjustments to be +made to adjacent glyph pairs from this font. It contains a sequence of +lines formatted as follows. + + G1 G2 N + +The foregoing means that when glyph G1 is typeset immediately before G2, +the space between them should be increased by N. Most kerning pairs +should have a negative value for N. + + +File: groff.info, Node: Font Description File Format-Footnotes, Up: Font Description File Format + + (1) 800-point type is not practical for most purposes, but using it +enables the quantities in the font description files to be expressed as +integers. + + (2) 'groff' requests and escape sequences interpret non-negative font +names as mounting positions instead. Further, a font named '0' cannot +be automatically mounted by the 'fonts' directive of a 'DESC' file. + + (3) For typesetter devices, this directive is misnamed since it +starts a list of glyphs, not characters. + + (4) that is, any integer parsable by the C standard library's +'strtol(3)' function + + +File: groff.info, Node: Copying This Manual, Next: Request Index, Prev: Font Description File Format, Up: Top + +Appendix A Copying This Manual +****************************** + + Version 1.3, 3 November 2008 + + Copyright © 2000-2018 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: groff.info, Node: Request Index, Next: Escape Sequence Index, Prev: Copying This Manual, Up: Top + +Appendix B Request Index +************************ + +Request names appear without a leading control character; the defaults +are '.' for the regular control character and ''' for the no-break +control character. + +[index] +* Menu: + +* ab: Debugging. (line 55) +* ad: Manipulating Filling and Adjustment. + (line 83) +* af: Assigning Register Formats. + (line 12) +* aln: Setting Registers. (line 110) +* als: Strings. (line 198) +* am: Writing Macros. (line 126) +* am1: Writing Macros. (line 127) +* ami: Writing Macros. (line 128) +* ami1: Writing Macros. (line 129) +* as: Strings. (line 114) +* as1: Strings. (line 115) +* asciify: Diversions. (line 208) +* backtrace: Debugging. (line 104) +* bd: Artificial Fonts. (line 95) +* blm: Blank Line Traps. (line 7) +* box: Diversions. (line 63) +* boxa: Diversions. (line 64) +* bp: Page Control. (line 11) +* br: Manipulating Filling and Adjustment. + (line 39) +* break: while. (line 72) +* brp: Manipulating Filling and Adjustment. + (line 156) +* c2: Control Characters. (line 29) +* cc: Control Characters. (line 23) +* ce: Manipulating Filling and Adjustment. + (line 208) +* cf: I/O. (line 58) +* cflags: Using Symbols. (line 252) +* ch: Page Location Traps. (line 114) +* char: Using Symbols. (line 351) +* chop: Strings. (line 145) +* class: Character Classes. (line 12) +* close: I/O. (line 240) +* color: Colors. (line 15) +* composite: Using Symbols. (line 208) +* continue: while. (line 76) +* cp: Compatibility Mode. (line 16) +* cs: Artificial Fonts. (line 125) +* cu: Artificial Fonts. (line 86) +* da: Diversions. (line 32) +* de: Writing Macros. (line 14) +* de1: Writing Macros. (line 86) +* defcolor: Colors. (line 27) +* dei: Writing Macros. (line 108) +* dei1: Writing Macros. (line 109) +* device: Postprocessor Access. + (line 15) +* devicem: Postprocessor Access. + (line 45) +* di: Diversions. (line 31) +* do: Compatibility Mode. (line 27) +* ds: ms Document Control Settings. + (line 15) +* ds <1>: Strings. (line 24) +* ds1: Strings. (line 25) +* dt: Diversion Traps. (line 11) +* ec: Using Escape Sequences. + (line 76) +* ecr: Using Escape Sequences. + (line 102) +* ecs: Using Escape Sequences. + (line 101) +* el: if-else. (line 8) +* em: End-of-input Traps. (line 7) +* eo: Using Escape Sequences. + (line 71) +* ev: Environments. (line 46) +* evc: Environments. (line 100) +* ex: Debugging. (line 60) +* fam: Font Families. (line 21) +* fc: Fields. (line 18) +* fchar: Using Symbols. (line 352) +* fcolor: Colors. (line 85) +* fi: Manipulating Filling and Adjustment. + (line 66) +* fl: Debugging. (line 95) +* fp: Font Positions. (line 16) +* fschar: Using Symbols. (line 353) +* fspecial: Special Fonts. (line 18) +* ft: Selecting Fonts. (line 11) +* ftr: Selecting Fonts. (line 69) +* fzoom: Selecting Fonts. (line 83) +* gcolor: Colors. (line 57) +* hc: Manipulating Hyphenation. + (line 88) +* hcode: Manipulating Hyphenation. + (line 293) +* hla: Manipulating Hyphenation. + (line 327) +* hlm: Manipulating Hyphenation. + (line 340) +* hpf: Manipulating Hyphenation. + (line 233) +* hpfa: Manipulating Hyphenation. + (line 234) +* hpfcode: Manipulating Hyphenation. + (line 235) +* hw: Manipulating Hyphenation. + (line 22) +* hy: Manipulating Hyphenation. + (line 120) +* hym: Manipulating Hyphenation. + (line 354) +* hys: Manipulating Hyphenation. + (line 369) +* ie: if-else. (line 7) +* if: if-then. (line 7) +* ig: Comments. (line 54) +* in: Line Layout. (line 86) +* it: Input Line Traps. (line 7) +* itc: Input Line Traps. (line 8) +* kern: Ligatures and Kerning. + (line 41) +* lc: Leaders. (line 22) +* length: Strings. (line 135) +* lf: Debugging. (line 31) +* lg: Ligatures and Kerning. + (line 23) +* linetabs: Tabs and Fields. (line 139) +* ll: Line Layout. (line 138) +* ls: Manipulating Spacing. + (line 57) +* lsm: Leading Space Traps. (line 7) +* lt: Page Layout. (line 53) +* mc: Miscellaneous. (line 110) +* mk: Page Motions. (line 10) +* mso: I/O. (line 49) +* msoquiet: I/O. (line 50) +* na: Manipulating Filling and Adjustment. + (line 150) +* ne: Page Control. (line 31) +* nf: Manipulating Filling and Adjustment. + (line 74) +* nh: Manipulating Hyphenation. + (line 228) +* nm: Miscellaneous. (line 9) +* nn: Miscellaneous. (line 74) +* nop: if-then. (line 26) +* nr: ms Document Control Settings. + (line 11) +* nr <1>: Setting Registers. (line 10) +* nr <2>: Setting Registers. (line 64) +* nr <3>: Auto-increment. (line 14) +* nroff: troff and nroff Modes. + (line 33) +* ns: Manipulating Spacing. + (line 116) +* nx: I/O. (line 90) +* open: I/O. (line 207) +* opena: I/O. (line 208) +* os: Page Control. (line 66) +* output: Diversions. (line 195) +* pc: Page Layout. (line 68) +* pev: Debugging. (line 78) +* pi: I/O. (line 149) +* pl: Page Layout. (line 9) +* pm: Debugging. (line 82) +* pn: Page Layout. (line 23) +* pnr: Debugging. (line 86) +* po: Line Layout. (line 60) +* ps: Changing the Type Size. + (line 7) +* psbb: Miscellaneous. (line 158) +* pso: I/O. (line 38) +* ptr: Debugging. (line 90) +* pvs: Changing the Vertical Spacing. + (line 48) +* rchar: Using Symbols. (line 410) +* rd: I/O. (line 95) +* return: Writing Macros. (line 163) +* rfschar: Using Symbols. (line 411) +* rj: Manipulating Filling and Adjustment. + (line 247) +* rm: Strings. (line 193) +* rn: Strings. (line 190) +* rnn: Setting Registers. (line 105) +* rr: Setting Registers. (line 99) +* rs: Manipulating Spacing. + (line 117) +* rt: Page Motions. (line 11) +* schar: Using Symbols. (line 354) +* shc: Manipulating Hyphenation. + (line 97) +* shift: Parameters. (line 30) +* sizes: Changing the Type Size. + (line 71) +* so: I/O. (line 9) +* soquiet: I/O. (line 10) +* sp: Manipulating Spacing. + (line 10) +* special: Special Fonts. (line 17) +* spreadwarn: Debugging. (line 135) +* ss: Manipulating Filling and Adjustment. + (line 267) +* stringdown: Strings. (line 170) +* stringup: Strings. (line 171) +* sty: Font Families. (line 62) +* substring: Strings. (line 153) +* sv: Page Control. (line 65) +* sy: I/O. (line 171) +* ta: Tabs and Fields. (line 13) +* tag: Postprocessor Access. + (line 58) +* taga: Postprocessor Access. + (line 59) +* tc: Tabs and Fields. (line 127) +* ti: Line Layout. (line 110) +* tkf: Ligatures and Kerning. + (line 60) +* tl: Page Layout. (line 39) +* tm: Debugging. (line 43) +* tm1: Debugging. (line 44) +* tmc: Debugging. (line 45) +* tr: Character Translations. + (line 13) +* trf: I/O. (line 57) +* trin: Character Translations. + (line 14) +* trnt: Character Translations. + (line 79) +* troff: troff and nroff Modes. + (line 25) +* uf: Artificial Fonts. (line 90) +* ul: Artificial Fonts. (line 64) +* unformat: Diversions. (line 233) +* vpt: Vertical Position Traps. + (line 13) +* vs: Changing the Vertical Spacing. + (line 7) +* warn: Debugging. (line 154) +* warnscale: Debugging. (line 131) +* wh: Page Location Traps. (line 11) +* while: while. (line 10) +* write: I/O. (line 219) +* writec: I/O. (line 220) +* writem: I/O. (line 231) + diff --git a/doc/groff.info-3 b/doc/groff.info-3 new file mode 100644 index 0000000000000000000000000000000000000000..151c7968d4ad8aa1b54fd276b9f1343315c4f189 GIT binary patch literal 238373 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

    6~2FkQI|`C5|>iE6Eg=^E^Q&3R_q4-uAvU?UlaD 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 {*cD_56hBZ~# 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 z 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

    o1z$B}4aMBr(m*#)*f9H|Ic`S(EA;6jK}O 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�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ÜVVsPk3Us`H(+1%1 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%0A79qw%q;NULgI>lX@Za9Bqg}*6 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

    RrFZQd_ZdjAuy4 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

    1bGaa#sd9;KnM_qF^Mhi7 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

    cgZ2R) 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

    4zU6n(kri&nCUuooxx9Hjd%0VQ_s60 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

    n8E)b&7X5fKj9Jyk+KT0Gzro)3GuiHQn>ua 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 literal 0 HcmV?d00001 diff --git a/doc/groff.texi b/doc/groff.texi index e7fe4aa..2a6635e 100644 --- a/doc/groff.texi +++ b/doc/groff.texi @@ -4,7 +4,7 @@ @c Please convert this manual with `texi2dvi -e groff.texi' due to @c problems in texinfo regarding expansion of user-defined macros. @c -@c You need texinfo 4.8 or newer to format this document! +@c You need texinfo 5.0 or newer to format this document! @c @c %**start of header (This is for running Texinfo on a region.) @@ -24,21 +24,17 @@ @copying -This manual documents GNU @code{troff} version 1.22.4. +This manual documents GNU @code{troff} version 1.23.0. -Copyright @copyright{} 1994--2018 Free Software Foundation, Inc. +Copyright @copyright{} 1994--2023 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' -and with the Back-Cover Texts as in (a) below. A copy of the license is -included in the section entitled ``GNU Free Documentation License.'' - -(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and -modify this GNU manual. Buying copies from the FSF supports it in -developing GNU and promoting software freedom.'' +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A +copy of the license is included in the section entitled ``GNU Free +Documentation License''. @end quotation @end copying @@ -47,7 +43,7 @@ developing GNU and promoting software freedom.'' @c @c cindex: concepts @c rqindex: requests -@c esindex: escapes +@c esindex: escape sequences @c vindex: registers @c kindex: commands in font files @c pindex: programs and files @@ -161,41 +157,41 @@ developing GNU and promoting software freedom.'' @end macro -@c definition of escapes +@c definition of escape sequences @macro Defesc{name, delimI, arg, delimII} -@deffn Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffn Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @esindex \name\ @c @end macro @macro DefescList{name, delimI, arg, delimII} -@deffn Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffn Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @defdummy @esindex \name\ @c @end macro @macro DefescItem{name, delimI, arg, delimII} -@deffnx Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @defdummy @c @end macro @macro DefescItemx{name, delimI, arg, delimII} -@deffnx Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @defdummy @esindex \name\ @c @end macro @macro DefescListEnd{name, delimI, arg, delimII} -@deffnx Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @c @end macro @macro DefescListEndx{name, delimI, arg, delimII} -@deffnx Escape @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} +@deffnx Escape@tie{}sequence @t{\name\\delimI\}@Var{\arg\}@t{\delimII\} @esindex \name\ @c @end macro @@ -205,7 +201,7 @@ developing GNU and promoting software freedom.'' @end macro -@c definition of registers +@c definition of registers (built in to GNU troff) @macro Defreg{name} @deffn Register @t{\\n[\name\]} @@ -249,7 +245,51 @@ developing GNU and promoting software freedom.'' @end macro -@c definition of registers specific to macro packages, preprocessors, etc. +@c string definitions (built in to GNU troff) + +@macro Defstr{name} +@deffn String @t{\\*[\name\]} +@stindex \name\ +@c +@end macro + +@macro DefstrList{name} +@deffn String @t{\\*[\name\]} +@defdummy +@stindex \name\ +@c +@end macro + +@macro DefstrItem{name} +@deffnx String @t{\\*[\name\]} +@defdummy +@c +@end macro + +@macro DefstrItemx{name} +@deffnx String @t{\\*[\name\]} +@defdummy +@stindex \name\ +@c +@end macro + +@macro DefstrListEnd{name} +@deffnx String @t{\\*[\name\]} +@c +@end macro + +@macro DefstrListEndx{name} +@deffnx String @t{\\*[\name\]} +@stindex \name\ +@c +@end macro + +@macro endDefstr +@end deffn +@end macro + + +@c register definitions specific to macro packages, preprocessors, ... @macro Defmpreg{name, package} @deffn Register @t{\\n[\name\]} @@ -337,46 +377,46 @@ developing GNU and promoting software freedom.'' @end macro -@c definition of strings +@c string definitions specific to macro packages, preprocessors, ... -@macro Defstr{name, package} +@macro Defmpstr{name, package} @deffn String @t{\\*[\name\]} @stindex \name\ @r{[}\package\@r{]} @c @end macro -@macro DefstrList{name, package} +@macro DefmpstrList{name, package} @deffn String @t{\\*[\name\]} @defdummy @stindex \name\ @r{[}\package\@r{]} @c @end macro -@macro DefstrItem{name, package} +@macro DefmpstrItem{name, package} @deffnx String @t{\\*[\name\]} @defdummy @c @end macro -@macro DefstrItemx{name, package} +@macro DefmpstrItemx{name, package} @deffnx String @t{\\*[\name\]} @defdummy @stindex \name\ @r{[}\package\@r{]} @c @end macro -@macro DefstrListEnd{name, package} +@macro DefmpstrListEnd{name, package} @deffnx String @t{\\*[\name\]} @c @end macro -@macro DefstrListEndx{name, package} +@macro DefmpstrListEndx{name, package} @deffnx String @t{\\*[\name\]} @stindex \name\ @r{[}\package\@r{]} @c @end macro -@macro endDefstr +@macro endDefmpstr @end deffn @end macro @@ -404,132 +444,11 @@ developing GNU and promoting software freedom.'' @end macro -@c - -@tex -\gdef\Langlemacro{\angleleft} -\gdef\Ranglemacro{\angleright} -@end tex - -@iftex -@set Langlemacro @Langlemacro -@set Ranglemacro @Ranglemacro -@end iftex - -@ifnottex -@set Langlemacro < -@set Ranglemacro > -@end ifnottex +@c Render text with angle brackets around it, as in . @macro angles{text} -@value{Langlemacro}@r{\text\}@value{Ranglemacro} -@end macro - - -@c a <= sign -@c -@c Since expansion of macros has changed between texinfo 4.x and 5.x, -@c we can't define a macro but have to use @value directly. - -@tex -\gdef\LE{\le} -@end tex - -@iftex -@set LE @LE -@end iftex - -@ifnottex -@set LE <= -@end ifnottex - - -@c Special care is required with parentheses, brackets, and braces: -@c -@c . Real parentheses in @deffn produce an error while compiling with -@c TeX. -@c . Real brackets use the wrong font in @deffn, overriding @t{}. -@c -@c . @{ and @} fail with info if used in a macro. -@c -@c Since macros aren't expanded in @deffn during -E, the following -@c definitions are for non-TeX only. -@c -@c This is true for texinfo 4.0 and above. - -@iftex -@set Lparenmacro @lparen -@set Rparenmacro @rparen -@set Lbrackmacro @lbrack -@set Rbrackmacro @rbrack -@set Lbracemacro @{ -@set Rbracemacro @} -@end iftex - -@ifnottex -@set Lparenmacro ( -@set Rparenmacro ) -@set Lbrackmacro [ -@set Rbrackmacro ] -@set Lbracemacro @{ -@set Rbracemacro @} -@end ifnottex - -@macro Lparen{} -@value{Lparenmacro} -@end macro -@macro Rparen{} -@value{Rparenmacro} -@end macro -@macro Lbrack{} -@value{Lbrackmacro} +@guilsinglleft{}@r{\text\}@guilsinglright{} @end macro -@macro Rbrack{} -@value{Rbrackmacro} -@end macro -@macro Lbrace{} -@value{Lbracemacro} -@end macro -@macro Rbrace{} -@value{Rbracemacro} -@end macro - - -@c This suppresses the word `Appendix' in the appendix headers. - -@tex -\gdef\gobblefirst#1#2{#2} -\gdef\putwordAppendix{\gobblefirst} -@end tex - - -@c We map some latin-1 characters to corresponding texinfo macros. -@c Newer versions of texinfo.tex have similar code included already. - -@tex -\global\catcode`^^e4\active % ä -\gdef^^e4{\"a} -\global\catcode`^^c4\active % Ä -\gdef^^c4{\"A} -\global\catcode`^^e9\active % é -\gdef^^e9{\'e} -\global\catcode`^^c9\active % É -\gdef^^c9{\'E} -\global\catcode`^^f6\active % ö -\gdef^^f6{\"o} -\global\catcode`^^d6\active % Ö -\gdef^^d6{\"O} -\global\catcode`^^fc\active % ü -\gdef^^fc{\"u} -\global\catcode`^^dc\active % Ü -\gdef^^dc{\"U} -\global\catcode`^^e6\active % æ -\gdef^^e6{\ae} -\global\catcode`^^c6\active % Æ -\gdef^^c6{\AE} -\global\catcode`^^df\active % ß -\gdef^^df{\ss} -@end tex @c Note: We say `Roman numerals' but `roman font'. @@ -537,17 +456,18 @@ developing GNU and promoting software freedom.'' @dircategory Typesetting @direntry -* Groff: (groff). The GNU troff document formatting system. +* Groff: (groff). The GNU roff document formatting system. @end direntry @titlepage @title groff @subtitle The GNU implementation of @code{troff} -@subtitle Edition 1.22.4 -@subtitle Autumn 2018 -@author by Trent A.@tie{}Fisher -@author and Werner Lemberg +@subtitle Edition 1.23.0 +@subtitle June 2023 +@author Trent@tie{}A.@: Fisher +@author Werner Lemberg +@author G.@tie{}Branden Robinson @page @vskip 0pt plus 1filll @@ -558,28 +478,24 @@ developing GNU and promoting software freedom.'' @ifnottex @node Top, Introduction, (dir), (dir) -@top GNU troff +@top GNU @code{troff} @end ifnottex @menu * Introduction:: * Invoking groff:: * Tutorial for Macro Users:: -* Macro Packages:: -* gtroff Reference:: -* Preprocessors:: -* Output Devices:: -* File formats:: -* Installation:: +* Major Macro Packages:: +* GNU troff Reference:: +* File Formats:: * Copying This Manual:: * Request Index:: -* Escape Index:: +* Escape Sequence Index:: * Operator Index:: * Register Index:: * Macro Index:: * String Index:: -* Glyph Name Index:: -* Font File Keyword Index:: +* File Keyword Index:: * Program and File Index:: * Concept Index:: @end menu @@ -593,366 +509,315 @@ developing GNU and promoting software freedom.'' @c ===================================================================== @c ===================================================================== +@codequotebacktick on +@codequoteundirected on + @node Introduction, Invoking groff, Top, Top @chapter Introduction @cindex introduction -GNU @code{troff} (or @code{groff}) is a system for typesetting -documents. @code{troff} is very flexible and has been used extensively -for some thirty years. It is well entrenched in the Unix community. +GNU @code{roff} (or @code{groff}) is a programming system for +typesetting documents. It is highly flexible and has been used +extensively for over thirty years. @menu -* What Is groff?:: -* History:: -* groff Capabilities:: +* Background:: +* What Is @code{groff}?:: +* @code{groff} Capabilities:: * Macro Package Intro:: * Preprocessor Intro:: -* Output device intro:: +* Output Device Intro:: +* Conventions Used in This Manual:: +* Installation:: * Credits:: @end menu @c ===================================================================== -@node What Is groff?, History, Introduction, Introduction -@section What Is @code{groff}? -@cindex what is @code{groff}? -@cindex @code{groff} -- what is it? - -@code{groff} belongs to an older generation of document preparation -systems, which operate more like compilers than the more recent -interactive @acronym{WYSIWYG}@footnote{What You See Is What You Get} -systems. @code{groff} and its contemporary counterpart, @TeX{}, both -work using a @dfn{batch} paradigm: The input (or @dfn{source}) files are -normal text files with embedded formatting commands. These files can -then be processed by @code{groff} to produce a typeset document on a -variety of devices. +@node Background, What Is @code{groff}?, Introduction, Introduction +@section Background +@cindex background -@code{groff} should not be confused with a @dfn{word processor}, an -integrated system of editor and text formatter. Also, many word -processors follow the @acronym{WYSIWYG} paradigm discussed earlier. - -Although @acronym{WYSIWYG} systems may be easier to use, they have a -number of disadvantages compared to @code{troff}: - -@itemize @bullet -@item -They must be used on a graphics display to work on a document. - -@item -Most of the @acronym{WYSIWYG} systems are either non-free or are not -very portable. - -@item -@code{troff} is firmly entrenched in all Unix systems. - -@item -It is difficult to have a wide range of capabilities within the confines -of a GUI/window system. - -@item -It is more difficult to make global changes to a document. -@end itemize +M.@: Douglas McIlroy, formerly of AT&T Bell Laboratories and present at +the creation of the Unix operating system, offers an authoritative +historical summary. @quotation -``GUIs normally make it simple to accomplish simple actions and -impossible to accomplish complex actions.'' --Doug Gwyn (22/Jun/91 in -@code{comp.unix.wizards}) +The prime reason for Unix was the desire of Ken [Thompson], Dennis +[Ritchie], and Joe Ossanna to have a pleasant environment for software +development. The fig leaf that got the nod from @dots{} +management was that an early use would be to develop a ``stand-alone'' +word-processing system for use in typing pools and secretarial offices. +Perhaps they had in mind ``dedicated'', as distinct from +``stand-alone''; that's what eventuated in various cases, most notably +in the legal/patent department and in the AT&T CEO's office. + +Both those systems were targets of opportunity, not foreseen from the +start. When Unix was up and running on the PDP-11, Joe got wind of +the legal department having installed a commercial word processor. +He went to pitch Unix as an alternative and clinched a trial by +promising to make @code{roff} able to number lines by tomorrow in order +to fulfill a patent-office requirement that the commercial system did +not support. + +Modems were installed so legal-department secretaries could try the +Research machine. They liked it and Joe's superb customer service. +Soon the legal department got a system of their own. Joe went on to +create @code{nroff} and @code{troff}. Document preparation became a +widespread use of Unix, but no stand-alone word-processing system was +ever undertaken. @end quotation +@c https://minnie.tuhs.org/pipermail/tuhs/2022-March/025535.html +A history relating @code{groff} to its predecessors @code{roff}, +@code{nroff}, and @code{troff} is available in the @cite{roff@r{(7)}} +man page. -@c ===================================================================== - -@node History, groff Capabilities, What Is groff?, Introduction -@section History -@cindex history - -@cindex @code{RUNOFF}, the program -@cindex @code{rf}, the program -@code{troff} can trace its origins back to a formatting program called -@code{RUNOFF}, written by Jerry Saltzer, which ran on the @acronym{CTSS} -(@emph{Compatible Time Sharing System}, a project of MIT, the -Massachusetts Institute of Technology) in the -mid-sixties.@footnote{Jerome H.@: Saltzer, a grad student then, later a -Professor of Electrical Engineering, now retired. Saltzer's PhD thesis -was the first application for @code{RUNOFF} and is available from the -MIT Libraries.} The name came from the use of the phrase ``run off a -document'', meaning to print it out. -@c -@c Tom Van Vleck writes about the following: -@c -@c I am not sure about this.. I think the BCPL runoff was the port to -@c the 635 architecture, and that the order of events is -@c 1. CTSS runoff -@c 2. BCPL runoff on Multics -@c 3. BCPL runoff on 635 -@c 4. rf on PDP-7 -@c -Bob Morris ported it to the 635 architecture and called the program -@code{roff} (an abbreviation of @code{runoff}). It was rewritten as -@code{rf} for the @w{PDP-7} (before having Unix), and at the -same time (1969), Doug McIlroy rewrote an extended and simplified -version of @code{roff} in the @acronym{BCPL} programming language. - -@cindex @code{roff}, the program -In 1971, the Unix developers wanted to get a @w{PDP-11}, and to justify -the cost, proposed the development of a document formatting system for -the @acronym{AT&T} patents division. This first formatting program was -a reimplementation of McIlroy's @code{roff}, written by J.@tie{}F.@: -Ossanna. - -@cindex @code{nroff}, the program -When they needed a more flexible language, a new version of @code{roff} -called @code{nroff} (``Newer @code{roff}'') was written. It had a much -more complicated syntax, but provided the basis for all future versions. -When they got a Graphic Systems CAT Phototypesetter, Ossanna wrote a -version of @code{nroff} that would drive it. It was dubbed -@code{troff}, for ``typesetter @code{roff}'', although many people have -speculated that it actually means ``Times @code{roff}'' because of the -use of the Times font family in @code{troff} by default. As such, the -name @code{troff} is pronounced `@w{t-roff}' rather than `trough'. - -With @code{troff} came @code{nroff} (they were actually the same program -except for some @samp{#ifdef}s), which was for producing output for line -printers and character terminals. It understood everything @code{troff} -did, and ignored the commands that were not applicable (e.g.@: font -changes). - -Since there are several things that cannot be done easily in -@code{troff}, work on several preprocessors began. These programs would -transform certain parts of a document into @code{troff}, which made a -very natural use of pipes in Unix. - -The @code{eqn} preprocessor allowed mathematical formulae to be specified -in a much simpler and more intuitive manner. @code{tbl} is a -preprocessor for formatting tables. The @code{refer} preprocessor (and -the similar program, @code{bib}) processes citations in a document -according to a bibliographic database. - -Unfortunately, Ossanna's @code{troff} was written in @w{PDP-11} assembly -language and produced output specifically for the CAT phototypesetter. -He rewrote it in C, although it was now 7000@tie{}lines of uncommented -code and still dependent on the CAT@. As the CAT became less common, and -was no longer supported by the manufacturer, the need to make it support -other devices became a priority. However, before this could be done, -Ossanna died by a severe heart attack in a hospital while recovering -from a previous one. - -@pindex ditroff -@cindex @code{ditroff}, the program -So, Brian Kernighan took on the task of rewriting @code{troff}. The -newly rewritten version produced device independent code that was very -easy for postprocessors to read and translate to the appropriate printer -codes. Also, this new version of @code{troff} (called @code{ditroff} -for ``device independent @code{troff}'') had several extensions, which -included drawing functions. - -Due to the additional abilities of the new version of @code{troff}, -several new preprocessors appeared. The @code{pic} preprocessor -provides a wide range of drawing functions. Likewise the @code{ideal} -preprocessor did the same, although via a much different paradigm. The -@code{grap} preprocessor took specifications for graphs, but, unlike -other preprocessors, produced @code{pic} code. - -James Clark began work on a GNU implementation of @code{ditroff} in -early@tie{}1989. The first version, @code{groff}@tie{}0.3.1, was -released June@tie{}1990. @code{groff} included: - -@itemize @bullet -@item -A replacement for @code{ditroff} with many extensions. - -@item -The @code{soelim}, @code{pic}, @code{tbl}, and @code{eqn} preprocessors. - -@item -Postprocessors for character devices, @sc{PostScript}, @TeX{} DVI, and -X@tie{}Windows. GNU @code{troff} also eliminated the need for a -separate @code{nroff} program with a postprocessor that would produce -@acronym{ASCII} output. - -@item -A version of the @file{me} macros and an implementation of the -@file{man} macros. -@end itemize -Also, a front-end was included that could construct the, sometimes -painfully long, pipelines required for all the post- and preprocessors. - -Development of GNU @code{troff} progressed rapidly, and saw the -additions of a replacement for @code{refer}, an implementation of the -@file{ms} and @file{mm} macros, and a program to deduce how to format a -document (@code{grog}). - -It was declared a stable (i.e.@: non-beta) package with the release of -version@tie{}1.04 around November@tie{}1991. +@c ===================================================================== -Beginning in@tie{}1999, @code{groff} has new maintainers (the package -was an orphan for a few years). As a result, new features and programs -like @code{grn}, a preprocessor for gremlin images, and an output device -to produce @acronym{HTML} and @acronym{XHTML} have been added. +@node What Is @code{groff}?, @code{groff} Capabilities, Introduction, Introduction +@section What Is @code{groff}? +@cindex what is @code{groff}? +@cindex @code{groff}---what is it? + +@c BEGIN Keep parallel with groff(1), section "Description" (after the +@c first sentence). +@c This language is slightly expanded from that in the "ANNOUNCE" file +@c and on the groff home page. +@code{groff} (GNU @code{roff}) is a typesetting system that reads plain +text input files that include formatting commands to produce output in +PostScript, PDF, HTML, DVI, or other formats, or for display to a +terminal. Formatting commands can be low-level typesetting primitives, +macros from a supplied package, or user-defined macros. All three +approaches can be combined. + +A reimplementation and extension of the typesetter from @acronym{AT&T} +Unix, @code{groff} is present on most @acronym{POSIX} systems owing to +its long association with Unix manuals (including man pages). It and +its predecessor are notable for their production of several best-selling +software engineering texts. @code{groff} is capable of producing +typographically sophisticated documents while consuming minimal system +resources. +@c END Keep parallel with groff(1), section "Description" (after the +@c first sentence). @c ===================================================================== -@node groff Capabilities, Macro Package Intro, History, Introduction +@node @code{groff} Capabilities, Macro Package Intro, What Is @code{groff}?, Introduction @section @code{groff} Capabilities @cindex @code{groff} capabilities @cindex capabilities of @code{groff} -So what exactly is @code{groff} capable of doing? @code{groff} provides -a wide range of low-level text formatting operations. Using these, it -is possible to perform a wide range of formatting tasks, such as -footnotes, table of contents, multiple columns, etc. Here's a list of -the most important operations supported by @code{groff}: +GNU @code{troff} is a typesetting document formatter; it provides a wide +range of low-level text and page operations within the framework of a +programming language. These operations compose to generate footnotes, +tables of contents, mathematical equations, diagrams, multi-column text, +and other elements of typeset works. Here is a survey of formatter +features; all are under precise user control. @itemize @bullet @item -text filling, adjusting, and centering - -@item -hyphenation - -@item -page control - -@item -font and glyph size control - -@item -vertical spacing (e.g.@: double-spacing) - -@item -line length and indenting - -@item -macros, strings, diversions, and traps - -@item -number registers - -@item -tabs, leaders, and fields - -@item -input and output conventions and character translation +text filling, breaking, alignment to the left or right margin; centering @item -overstrike, bracket, line drawing, and zero-width functions +adjustment of inter-word space size to justify text, and of +inter-sentence space size to suit local style conventions @item -local horizontal and vertical motions and the width function +automatic and manual determination of hyphenation break points @item -three-part titles +pagination @item -output line numbering +selection of any font available to the output device @item -conditional acceptance of input +adjustment of type size and vertical spacing (or ``leading'') @item -environment switching +configuration of line length and indentation amounts; columnation @item -insertions from the standard input +drawing of geometric primitives (lines, arcs, polygons, circles, +@dots{}) @item -input/output file switching +setup of stroke and fill colors (where supported by the output +device) @item -output and error messages +embedding of hyperlinks, images, document metadata, and other inclusions +(where supported by the output device) @end itemize @c ===================================================================== -@node Macro Package Intro, Preprocessor Intro, groff Capabilities, Introduction +@node Macro Package Intro, Preprocessor Intro, @code{groff} Capabilities, Introduction @section Macro Packages -@cindex macro packages +@cindex macro package, introduction +@cindex package, macro, introduction -Since @code{groff} provides such low-level facilities, it can be quite -difficult to use by itself. However, @code{groff} provides a -@dfn{macro} facility to specify how certain routine operations -(e.g.@tie{}starting paragraphs, printing headers and footers, etc.)@: -should be done. These macros can be collected together into a -@dfn{macro package}. There are a number of macro packages available; -the most common (and the ones described in this manual) are @file{man}, -@file{mdoc}, @file{me}, @file{ms}, and @file{mm}. +Elemental typesetting functions can be be challenging to use directly +with complex documents. A @dfn{macro} facility specifies how certain +routine operations, such as starting paragraphs, or printing headers and +footers, should be performed in terms of those low-level instructions. +Macros can be specific to one document or collected together into a +@dfn{macro package} for use by many. Several macro packages available; +the most widely used are provided with @code{groff}. They are +@file{man}, @file{mdoc}, @file{me}, @file{mm}, @file{mom}, and +@file{ms}. @c ===================================================================== -@node Preprocessor Intro, Output device intro, Macro Package Intro, Introduction +@node Preprocessor Intro, Output Device Intro, Macro Package Intro, Introduction @section Preprocessors @cindex preprocessors -Although @code{groff} provides most functions needed to format a -document, some operations would be unwieldy (e.g.@: to draw pictures). -Therefore, programs called @dfn{preprocessors} were written that -understand their own language and produce the necessary @code{groff} -operations. These preprocessors are able to differentiate their own -input from the rest of the document via markers. - -To use a preprocessor, Unix pipes are used to feed the output from the -preprocessor into @code{groff}. Any number of preprocessors may be used -on a given document; in this case, the preprocessors are linked together -into one pipeline. However, with @code{groff}, the user does not need -to construct the pipe, but only tell @code{groff} what preprocessors to +An alternative approach to complexity management, particularly when +constructing tables, setting mathematics, or drawing diagrams, lies in +preprocessing. A @dfn{preprocessor} employs a domian-specific language +to ease the generation of tables, equations, and so forth in terms that +are convenient for human entry. Each preprocessor reads a document and +translates the parts of it that apply to it into GNU @code{troff} input. +Command-line options to @command{groff} tell it which preprocessors to use. -@code{groff} currently has preprocessors for producing tables -(@code{tbl}), typesetting equations (@code{eqn}), drawing pictures -(@code{pic} and @code{grn}), processing bibliographies -(@code{refer}), and drawing chemical structures (@code{chem}). An -associated program that is useful when dealing with preprocessors is -@code{soelim}. +@code{groff} provides preprocessors for laying out tables +(@command{gtbl}), typesetting equations (@command{geqn}), drawing +diagrams (@command{gpic} and @command{ggrn}), inserting bibliographic +references (@command{grefer}), and drawing chemical structures +(@command{gchem}). An associated program that is useful when dealing +with preprocessors is @command{gsoelim}.@footnote{The @samp{g} prefix is +not used on all systems; see @ref{Invoking groff}.} -A free implementation of @code{grap}, a preprocessor for drawing graphs, -can be obtained as an extra package; @code{groff} can use @code{grap} -also. +@code{groff} also supports @code{grap}, a preprocessor for drawing +graphs. A free implementation of it can be obtained separately. Unique to @code{groff} is the @code{preconv} preprocessor that enables -@code{groff} to handle documents in various input encodings. +@code{groff} to handle documents in a variety of input encodings. -There are other preprocessors in existence, but, unfortunately, no free -implementations are available. Among them is a preprocessor for drawing -mathematical pictures (@code{ideal}). +Other preprocessors exist, but no free implementations +are known. An example is @command{ideal}, which draws diagrams using a +mathematical constraint language. @c ===================================================================== -@node Output device intro, Credits, Preprocessor Intro, Introduction +@node Output Device Intro, Installation, Preprocessor Intro, Introduction @section Output Devices @cindex postprocessors @cindex output devices @cindex devices for output -@code{groff} actually produces device independent code that may be fed -into a postprocessor to produce output for a particular device. -Currently, @code{groff} has postprocessors for @sc{PostScript} devices, -character terminals, X@tie{}Windows (for previewing), @TeX{} DVI format, -HP LaserJet@tie{}4 and Canon LBP printers (which use @acronym{CAPSL}), -@acronym{HTML}, @acronym{XHTML}, and PDF. +GNU @code{troff}'s output is in a device-independent page description +language, which is then read by an @dfn{output driver} that translates +this language into a file format or byte stream that a piece of +(possibly emulated) hardware understands. @code{groff} features output +drivers for PostScript devices, terminal emulators (and other simple +typewriter-like machines), X11 (for previewing), @TeX{} DVI, HP +LaserJet@tie{}4/PCL5 and Canon LBP printers (which use @acronym{CaPSL}), +@acronym{HTML}, @acronym{XHTML}, and @acronym{PDF}. @c ===================================================================== -@node Credits, , Output device intro, Introduction -@section Credits -@cindex credits +@node Installation, Conventions Used in This Manual, Output Device Intro, Introduction +@section Installation +@cindex installation + +Locate installation instructions in the files @file{INSTALL}, +@file{INSTALL.extra}, and @file{INSTALL.REPO} in the @code{groff} source +distribution. Being a GNU project, @code{groff} supports the familiar +@samp{./configure && make} command sequence. + + +@c ===================================================================== + +@node Conventions Used in This Manual, Credits, Installation, Introduction +@section Conventions Used in This Manual + +We apply the term ``groff'' to the language documented here, the GNU +implementation of the overall system, the project that develops that +system, and the command of that name. In the first sense, @code{groff} +is an extended dialect of the @code{roff} language, for which many +similar implementations exist. + +The @code{roff} language features several major categories for which +many items are predefined. Presentations of these items feature the +form in which the item is most commonly used on the left, and, aligned +to the right margin, the name of the category in brackets. + +@deffn Register \n[example] +The register @samp{example} is one that that @code{groff} @emph{doesn't} +predefine. You can create it yourself, though; see @ref{Setting +Registers}. +@end deffn -Large portions of this manual were taken from existing documents, most -notably, the manual pages for the @code{groff} package by James Clark, -and Eric Allman's papers on the @file{me} macro package. +To make this document useful as a reference and not merely amiable +bedtime reading, we tend to present these syntax items in exhaustive +detail when they arise. References to topics discussed later in the +text are frequent; skip material you don't understand yet. + +We use Texinfo's ``result'' (@result{}) and @error{} notations to +present output written to the standard output and standard error +streams, respectively. Diagnostic messages from the GNU @code{troff} +formatter and other programs are examples of the latter, but the +formatter can also be directed to write user-specified messages to the +standard error stream. The notation then serves to identify the +output stream and does not necessarily mean that an error has +occurred.@footnote{Unix and related operating systems distinguish +standard output and standard error streams @emph{because} of +@code{troff}:@: +@uref{https://minnie.tuhs.org/pipermail/tuhs/2013-December/006113.html}.} + +@Example +$ echo "Twelve o'clock and" | groff -Tascii | sed '/^$/d' + @result{} Twelve o'clock and +$ echo '.tm all is well.' | groff > /dev/null + @error{} all is well. +@endExample + +Sometimes we use @result{} somewhat abstractly to represent formatted +text that you will need to use a PostScript or PDF viewer program (or a +printer) to observe. While arguably an abuse of notation, we think this +preferable to requiring the reader to understand the syntax of these +page description languages. + +We also present diagnostic messages in an abbreviated form, often +omitting the name of the program issuing them, the input file name, and +line number or other positional information when such data do not serve +to illuminate the topic under discussion. + +Most examples are of @code{roff} language input that would be placed in +a text file. Occasionally, we start an example with a @samp{$} +character to indicate a shell prompt, as seen above. + +You are encouraged to try the examples yourself, and to alter them to +better learn @code{groff}'s behavior. Our examples frequently need to +direct the formatter to set a line length (with @samp{.ll}) that will +fit within the page margins of this manual. We mention this so that you +know why it is there before we discuss the @code{ll} request +formally.@footnote{@xref{Line Layout}.} -The section on the @file{man} macro package is partly based on -Susan@tie{}G.@: Kleinmann's @file{groff_man} manual page written for the -Debian GNU/Linux system. -Larry Kollar contributed the section on the @file{ms} macro package. +@c ===================================================================== + +@node Credits, , Conventions Used in This Manual, Introduction +@section Credits +@cindex credits +We adapted portions of this manual from existing documents. James +Clark's man pages were an essential resource; we have updated them in +parallel with the development of this manual. We based the tutorial for +macro users on Eric Allman's introduction to his @file{me} macro package +(which we also provide, little altered from 4.4BSD). Larry Kollar +contributed much of the material on the @file{ms} macro package. @c ===================================================================== @@ -963,32 +828,34 @@ Larry Kollar contributed the section on the @file{ms} macro package. @cindex invoking @code{groff} @cindex @code{groff} invocation -This section focuses on how to invoke the @code{groff} front end. This +This chapter focuses on how to invoke the @code{groff} front end. This front end takes care of the details of constructing the pipeline among the preprocessors, @code{gtroff} and the postprocessor. It has become a tradition that GNU programs get the prefix @samp{g} to -distinguish it from its original counterparts provided by the host (see -@ref{Environment}, for more details). Thus, for example, @code{geqn} is -GNU @code{eqn}. On operating systems like GNU/Linux or the Hurd, which +distinguish them from their original counterparts provided by the host +(@pxref{Environment}). Thus, for example, @code{geqn} is GNU +@code{eqn}. On operating systems like GNU/Linux or the Hurd, which don't contain proprietary versions of @code{troff}, and on MS-DOS/MS-Windows, where @code{troff} and associated programs are not available at all, this prefix is omitted since GNU @code{troff} is the -only used incarnation of @code{troff}. Exception: @samp{groff} is never +only incarnation of @code{troff} used. Exception: @samp{groff} is never replaced by @samp{roff}. In this document, we consequently say @samp{gtroff} when talking about -the GNU @code{troff} program. All other implementations of @code{troff} -are called @acronym{AT&T} @code{troff}, which is the common origin of all -@code{troff} derivates (with more or less compatible changes). -Similarly, we say @samp{gpic}, @samp{geqn}, etc. +the GNU @code{troff} program. @c XXX: Not for much longer... -- GBR +All other implementations of @code{troff} are called @acronym{AT&T} +@code{troff}, which is the common origin of almost all @code{troff} +implementations@footnote{Besides @code{groff}, @code{neatroff} is an +exception.} (with more or less compatible changes). Similarly, we say +@samp{gpic}, @samp{geqn}, and so on. @menu * Groff Options:: * Environment:: * Macro Directories:: * Font Directories:: -* Paper Size:: +* Paper Format:: * Invocation Examples:: @end menu @@ -1017,15 +884,15 @@ built). It can optionally preprocess with any of @code{gpic}, @code{geqn}, @code{gtbl}, @code{ggrn}, @code{grap}, @code{gchem}, @code{grefer}, @code{gsoelim}, or @code{preconv}. -This section only documents options to the @code{groff} front end. Many -of the arguments to @code{groff} are passed on to @code{gtroff}, -therefore those are also included. Arguments to pre- or postprocessors -can be found in @ref{Invoking gpic}, @ref{Invoking geqn}, @ref{Invoking -gtbl}, @ref{Invoking ggrn}, @ref{Invoking grefer}, @ref{Invoking gchem}, -@ref{Invoking gsoelim}, @ref{Invoking preconv}, @ref{Invoking grotty}, -@ref{Invoking grops}, @ref{Invoking gropdf}, @ref{Invoking grohtml}, -@ref{Invoking grodvi}, @ref{Invoking grolj4}, @ref{Invoking grolbp}, and -@ref{Invoking gxditview}. +This section documents only options to the @code{groff} front end. Many +of the arguments to @code{groff} are passed on to @code{gtroff}; +therefore, those are also included. Arguments to preprocessors and +output drivers can be found in the man pages @cite{gpic@r{(1)}}, +@cite{geqn@r{(1)}}, @cite{gtbl@r{(1)}}, @cite{ggrn@r{(1)}}, +@cite{grefer@r{(1)}}, @cite{gchem@r{(1)}}, @cite{gsoelim@r{(1)}}, +@cite{preconv@r{(1)}}, @cite{grotty@r{(1)}}, @cite{grops@r{(1)}}, +@cite{gropdf@r{(1)}}, @cite{grohtml@r{(1)}}, @cite{grodvi@r{(1)}}, +@cite{grolj4@r{(1)}}, @cite{grolbp@r{(1)}}, and @cite{gxditview@r{(1)}}. The command-line format for @code{groff} is: @@ -1052,195 +919,238 @@ Obviously, many of the options to @code{groff} are actually passed on to Options without an argument can be grouped behind a single@tie{}@option{-}. A filename of@tie{}@file{-} denotes the -standard input. It is possible to have whitespace between an option and -its parameter. +standard input. Whitespace is permitted between an option and its +argument. The @code{grog} command can be used to guess the correct @code{groff} -command to format a file. +command to format a file. See its man page @cite{grog@r{(1)}}; type +@samp{man grog} at the command line to view it. -Here's the description of the command-line options: +@command{groff}'s command-line options are as follows. @cindex command-line options @table @samp @item -a -@cindex @acronym{ASCII} approximation output register (@code{.A}) -Generate an @acronym{ASCII} approximation of the typeset output. The -read-only register @code{.A} is then set to@tie{}1. @xref{Built-in -Registers}. A typical example is +@cindex plain text approximation output register (@code{.A}) +Generate a plain text approximation of the typeset output. The +read-only register @code{.A} is set to@tie{}1. @xref{Built-in +Registers}. This option produces a sort of abstract preview of the +formatted output. -@Example -groff -a -man -Tdvi troff.man | less -@endExample +@itemize @bullet +@item +Page breaks are marked by a phrase in angle brackets; for example, +@samp{}. -@noindent -which shows how lines are broken for the DVI device. Note that this -option is rather useless today since graphic output devices are -available virtually everywhere. +@item +Lines are broken where they would be in the formatted output. + +@item +A horizontal motion of any size is represented as one space. Adjacent +horizontal motions are not combined. Inter-sentence space nodes (those +arising from the second argument to the @code{ss} request) are not +represented. + +@item +Vertical motions are not represented. + +@item +Special characters are rendered in angle brackets; for example, the +default soft hyphen character appears as @samp{}. +@end itemize + +The above description should not be considered a specification; the +details of @option{-a} output are subject to change. @item -b -Print a backtrace with each warning or error message. This backtrace -should help track down the cause of the error. The line numbers given -in the backtrace may not always be correct: @code{gtroff} can get -confused by @code{as} or @code{am} requests while counting line numbers. +Write a backtrace reporting the state of @command{gtroff}'s input parser +to the standard error stream with each diagnostic message. The line +numbers given in the backtrace might not always be correct, because +@command{gtroff}'s idea of line numbers can be confused by requests that +append to +@c XXX: strings or (??? strings never contain newlines) +macros. @item -c -Suppress color output. +Start with color output disabled. @item -C -Enable compatibility mode. @xref{Implementation Differences}, for the -list of incompatibilities between @code{groff} and @acronym{AT&T} -@code{troff}. - -@item -d@var{c}@var{s} -@itemx -d@var{name}=@var{s} -Define @var{c} or @var{name} to be a string@tie{}@var{s}. -@var{c}@tie{}must be a one-letter name; @var{name} can be of arbitrary -length. All string assignments happen before loading any macro file -(including the start-up file). - -@item -D@var{arg} -Set default input encoding used by @code{preconv} to @var{arg}. Implies -@option{-k}. +Enable AT&T @command{troff} compatibility mode; implies @option{-c}. +@xref{Implementation Differences}, for the list of incompatibilities +between @command{groff} and @acronym{AT&T} @command{troff}. + +@item -d@var{c}@var{text} +@itemx -d@var{string}=@var{text} +Define @code{roff} string @var{c} or @var{string} as@tie{}@var{t} or +@var{text}. @var{c}@tie{}must be one character; @var{string} can be +of arbitrary length. Such string assignments happen before any macro +file is loaded, including the startup file. Due to @code{getopt_long} +limitations, @var{c}@tie{}cannot be, and @var{string} cannot contain, an +equals sign, even though that is a valid character in a @code{roff} +identifier. + +@item -D@var{enc} +Set fallback input encoding used by @command{preconv} to @var{enc}; +implies @option{-k}. @item -e -Preprocess with @code{geqn}. +Run @command{geqn} preprocessor. @item -E -Inhibit all error messages. +Inhibit @command{gtroff} error messages. This option does @emph{not} +suppress messages sent to the standard error stream by documents or +macro packages using @code{tm} or related requests. @item -f@var{fam} Use @var{fam} as the default font family. @xref{Font Families}. @item -F@var{dir} -Search @file{@var{dir}} for subdirectories @file{dev@var{name}} -(@var{name} is the name of the device), for the @file{DESC} file, and -for font files before looking in the standard directories (@pxref{Font -Directories}). This option is passed to all pre- and postprocessors -using the @env{GROFF_FONT_PATH} environment variable. +Search in directory @file{@var{dir}} for the selected output device's +directory of device and font description files. See the description of +@env{GROFF_FONT_PATH} in @ref{Environment} below for the default search +locations and ordering. @item -g -Preprocess with @code{ggrn}. +Run @command{ggrn} preprocessor. @item -G -Preprocess with @code{grap}. Implies @option{-p}. +Run @command{grap} preprocessor; implies @option{-p}. @item -h -Print a help message. +Display a usage message and exit. @item -i Read the standard input after all the named input files have been processed. @item -I@var{dir} -This option may be used to specify a directory to search for files. -It is passed to the following programs: +Search the directory @var{dir} for files named in several contexts; +implies @option{-g} and @option{-s}. @itemize @item -@code{gsoelim} (see @ref{gsoelim} for more details); -it also implies @code{groff}'s @option{-s} option. +@command{gsoelim} replaces @code{so} requests with the contents of their +file name arguments. @item -@code{gtroff}; it is used to search files named in the @code{psbb} and -@code{so} requests. +@command{gtroff} searches for files named as operands in its command +line and as arguments to @code{psbb}, @code{so}, and @code{soquiet} +requests. @item -@code{grops}; it is used to search files named in the -@w{@code{\X'ps: import}} and @w{@code{\X'ps: file}} escapes. +Output drivers may search for files; for instance, @command{grops} looks +for files named in @samp{\X'ps: import @r{@dots{}}'}, @samp{\X'ps: file +@r{@dots{}}'}, and @samp{\X'pdf: pdfpic @r{@dots{}}'} device control +escape sequences. @end itemize -The current directory is always searched first. This option may be -specified more than once; the directories are searched in the order -specified. No directory search is performed for files specified using -an absolute path. +This option may be specified more than once; the directories are +searched in the order specified. If you want to search the current +directory before others, add @samp{-I .} at the desired place. The +current working directory is otherwise searched last. @option{-I} works +similarly to, and is named for, the ``include'' option of Unix C +compilers. + +@option{-I} options are passed to @command{gsoelim}, @command{gtroff}, +and output drivers; with the flag letter changed to @option{-M}, they +are also passed to @command{ggrn}. @item -j -Preprocess with @code{gchem}. Implies @option{-p}. +Run @command{gchem} preprocessor. Implies @option{-p}. @item -k -Preprocess with @code{preconv}. This is run before any other -preprocessor. Please refer to @code{preconv}'s manual page for its -behaviour if no @option{-K} (or @option{-D}) option is specified. +Run @command{preconv} preprocessor. Refer to its man page for its +behavior if neither of @command{groff}'s @option{-K} or @option{-D} +options is also specified. -@item -K@var{arg} -Set input encoding used by preconv to @var{arg}. Implies @option{-k}. +@item -K@var{enc} +Set input encoding used by @command{preconv} to @var{enc}; implies +@option{-k}. @item -l -Send the output to a spooler for printing. The command used for this is -specified by the @code{print} command in the device description file -(see @ref{Font Files}, for more info). If not present, @option{-l} is -ignored. +Send the output to a spooler for printing. The @code{print} directive +in the device description file specifies the default command to be used; +see @ref{Device and Font Description Files}. +@c XXX: This document is not parameterized in configuration variables. +@c If no such directive is present for the output device, +@c .ie '@PSPRINT@'' \{\ +@c this option is ignored. +@c .\} +@c .el \{\ +@c output is piped to +@c .MR @PSPRINT@ 1 . +@c .\} +See options @option{-L} and @option{-X}. @item -L@var{arg} -Pass @var{arg} to the spooler. Each argument should be passed with a -separate @option{-L} option. Note that @code{groff} does not prepend a -@samp{-} to @var{arg} before passing it to the postprocessor. If the -@code{print} keyword in the device description file is missing, -@option{-L} is ignored. +Pass @var{arg} to the print spooler program. If multiple @var{arg}s are +required, pass each with a separate @option{-L} option. @command{groff} +does not prefix an option dash to @var{arg} before passing it to the +spooler program. @item -m@var{name} -Read in the file @file{@var{name}.tmac}. Normally @code{groff} searches -for this in its macro directories. If it isn't found, it tries -@file{tmac.@var{name}} (searching in the same directories). +Process the file @file{@var{name}.tmac} prior to any input files. +If not found, @file{tmac.@var{name}} is attempted. @var{name} +(in both arrangements) is presumed to be a macro file; see the +description of @env{GROFF_TMAC_PATH} in @ref{Environment} below for the +default search locations and ordering. This option and its argument are +also passed to @command{geqn}, @command{grap}, and @command{ggrn}. @item -M@var{dir} -Search directory @file{@var{dir}} for macro files before the standard -directories (@pxref{Macro Directories}). +Search directory @file{@var{dir}} for macro files; see the description +of @env{GROFF_TMAC_PATH} in @ref{Environment} below for the default +search locations and ordering. This option and its argument are also +passed to @command{geqn}, @command{grap}, and @command{ggrn}. @item -n@var{num} Number the first page @var{num}. @item -N -Don't allow newlines with @code{eqn} delimiters. This is the same as -the @option{-N} option in @code{geqn}. +Prohibit newlines between @code{eqn} delimiters:@: pass @option{-N} to +@command{geqn}. @item -o@var{list} @cindex print current page register (@code{.P}) Output only pages in @var{list}, which is a comma-separated list of page -ranges; @samp{@var{n}} means print page@tie{}@var{n}, -@samp{@var{m}-@var{n}} means print every page between @var{m} -and@tie{}@var{n}, @samp{-@var{n}} means print every page up -to@tie{}@var{n}, @samp{@var{n}-} means print every page beginning -with@tie{}@var{n}. @code{gtroff} exits after printing the last page in -the list. All the ranges are inclusive on both ends. - -Within @code{gtroff}, this information can be extracted with the -@samp{.P} register. @xref{Built-in Registers}. - -If your document restarts page numbering at the beginning of each -chapter, then @code{gtroff} prints the specified page range for each -chapter. +ranges; @samp{@var{n}} means page@tie{}@var{n}, @samp{@var{m}-@var{n}} +means every page between @var{m} and@tie{}@var{n}, @samp{-@var{n}} means +every page up to@tie{}@var{n}, @samp{@var{n}-} means every page from +@var{n}@tie{}on. @command{gtroff} stops processing and exits after +formatting the last page enumerated in @var{list}. @item -p -Preprocess with @code{gpic}. +Run @command{gpic} preprocessor. @item -P@var{arg} -Pass @var{arg} to the postprocessor. Each argument should be passed -with a separate @option{-P} option. Note that @code{groff} does not -prepend @samp{-} to @var{arg} before passing it to the postprocessor. - -@item -r@var{c}@var{n} -@itemx -r@var{name}=@var{n} -Set number register@tie{}@var{c} or @var{name} to the -value@tie{}@var{n}. @var{c}@tie{}must be a one-letter name; @var{name} -can be of arbitrary length. @var{n}@tie{}can be any @code{gtroff} -numeric expression. All register assignments happen before loading any -macro file (including the start-up file). +Pass @var{arg} to the postprocessor. If multiple @var{arg}s are +required, pass each with a separate @option{-P} option. @command{groff} +does not prefix an option dash to @var{arg} before passing it to the +postprocessor. + +@item -r@var{c}@var{numeric-expression} +@itemx -r@var{register}=@var{expr} +Set @code{roff} register@tie{}@var{c} or @var{register} to the value +@var{numeric-expression} (@pxref{Numeric Expressions}). +@var{c}@tie{}must be one character; @var{register} can be of arbitrary +length. Such register assignments happen before any macro file is +loaded, including the startup file. Due to @code{getopt_long} +limitations, @var{c}@tie{}cannot be, and @var{register} cannot contain, +an equals sign, even though that is a valid character in a @code{roff} +identifier. @item -R -Preprocess with @code{grefer}. No mechanism is provided for passing -arguments to @code{grefer} because most @code{grefer} options have -equivalent commands that can be included in the file. @xref{grefer}, -for more details. +Run @command{grefer} preprocessor. No mechanism is provided for passing +arguments to @command{grefer} because most @command{grefer} options have +equivalent language elements that can be specified within the document. @pindex troffrc @pindex troffrc-end -Note that @code{gtroff} also accepts a @option{-R} option, which is not -accessible via @code{groff}. This option prevents the loading of the +@command{gtroff} also accepts a @option{-R} option, which is not +accessible via @command{groff}. This option prevents the loading of the @file{troffrc} and @file{troffrc-end} files. @item -s -Preprocess with @code{gsoelim}. +Run @command{gsoelim} preprocessor. @item -S @cindex @code{open} request, and safer mode @@ -1250,24 +1160,24 @@ Preprocess with @code{gsoelim}. @cindex @code{pi} request, and safer mode @cindex safer mode @cindex mode, safer -Safer mode. Pass the @option{-S} option to @code{gpic} and disable the -@code{open}, @code{opena}, @code{pso}, @code{sy}, and @code{pi} -requests. For security reasons, this is enabled by default. +Operate in ``safer'' mode; see @option{-U} below for its opposite. For +security reasons, safer mode is enabled by default. @item -t -Preprocess with @code{gtbl}. +Run @command{gtbl} preprocessor. @item -T@var{dev} -Prepare output for device @var{dev}. The default device is @samp{ps}, -unless changed when @code{groff} was configured and built. The -following are the output devices currently available: +Direct @command{gtroff} to format the input for the output device +@var{dev}. @command{groff} then calls an output driver to convert +@command{gtroff}'s output to a form appropriate for @var{dev}. The +following output devices are available. @table @code @item ps -For @sc{PostScript} printers and previewers. +For PostScript printers and previewers. @item pdf -For PDF viewers or printers. +For @acronym{PDF} viewers or printers. @item dvi For @TeX{} DVI format. @@ -1276,54 +1186,58 @@ For @TeX{} DVI format. For a 75@dmn{dpi} X11 previewer. @item X75-12 -For a 75@dmn{dpi} X11 previewer with a 12@dmn{pt} base font in the +For a 75@dmn{dpi} X11 previewer with a 12-point base font in the document. @item X100 For a 100@dmn{dpi} X11 previewer. @item X100-12 -For a 100@dmn{dpi} X11 previewer with a 12@dmn{pt} base font in the +For a 100@dmn{dpi} X11 previewer with a 12-point base font in the document. @item ascii @cindex encoding, output, @acronym{ASCII} -@cindex @acronym{ASCII}, output encoding +@cindex encoding, output, ISO@tie{}646 +@cindex @acronym{ASCII} output encoding +@cindex ISO@tie{}646 output encoding @cindex output encoding, @acronym{ASCII} +@cindex output encoding, ISO@tie{}646 For typewriter-like devices using the (7-bit) @acronym{ASCII} -character set. +(ISO@tie{}646) character set. @item latin1 -@cindex encoding, output, @w{latin-1} (ISO @w{8859-1}) -@cindex @w{latin-1} (ISO @w{8859-1}), output encoding -@cindex ISO @w{8859-1} (@w{latin-1}), output encoding -@cindex output encoding, @w{latin-1} (ISO @w{8859-1}) +@cindex encoding, output, @w{Latin-1} (ISO @w{8859-1}) +@cindex @w{Latin-1} (ISO @w{8859-1}) output encoding +@cindex ISO @w{8859-1} (@w{Latin-1}) output encoding +@cindex output encoding, @w{Latin-1} (ISO @w{8859-1}) For typewriter-like devices that support the @w{Latin-1} (ISO@tie{}@w{8859-1}) character set. @item utf8 -@cindex encoding, output, @w{utf-8} -@cindex @w{utf-8}, output encoding -@cindex output encoding, @w{utf-8} +@cindex encoding, output, @w{UTF-8} +@cindex @w{UTF-8} output encoding +@cindex output encoding, @w{UTF-8} For typewriter-like devices that use the Unicode (ISO@tie{}10646) character set with @w{UTF-8} encoding. @item cp1047 @cindex encoding, output, @acronym{EBCDIC} -@cindex @acronym{EBCDIC}, output encoding +@cindex @acronym{EBCDIC} output encoding @cindex output encoding, @acronym{EBCDIC} -@cindex encoding, output, cp1047 -@cindex cp1047, output encoding -@cindex output encoding, cp1047 -@cindex IBM cp1047 output encoding +@cindex encoding, output, code page 1047 +@cindex code page 1047 output encoding +@cindex output encoding, code page 1047 +@cindex IBM code page 1047 output encoding +@cindex CCSID 1047 output encoding (EBCDIC) For typewriter-like devices that use the @acronym{EBCDIC} encoding IBM -cp1047. +code page 1047. @item lj4 For HP LaserJet4-compatible (or other PCL5-compatible) printers. @item lbp -For Canon @acronym{CAPSL} printers (@w{LBP-4} and @w{LBP-8} series laser +For Canon @acronym{CaPSL} printers (@w{LBP-4} and @w{LBP-8} series laser printers). @pindex pre-grohtml @@ -1332,58 +1246,67 @@ printers). @item html @itemx xhtml To produce @acronym{HTML} and @acronym{XHTML} output, respectively. -Note that this driver consists of two parts, a preprocessor -(@code{pre-grohtml}) and a postprocessor (@code{post-grohtml}). +This driver consists of two parts, a preprocessor +(@command{pre-grohtml}) and a postprocessor (@command{post-grohtml}). @end table -@cindex output device name string register (@code{.T}) -@cindex output device usage number register (@code{.T}) -The predefined @code{gtroff} string register @code{.T} contains the -current output device; the read-only number register @code{.T} is set -to@tie{}1 if this option is used (which is always true if @code{groff} -is used to call @code{gtroff}). @xref{Built-in Registers}. +@cindex output device name string (@code{.T}) +@cindex output device usage register (@code{.T}) +The predefined GNU @code{troff} string @code{.T} contains the name of +the output device; the read-only register @code{.T} is set to@tie{}1 if +this option is used (which is always true if @command{groff} is used to +call GNU @command{troff}). @xref{Built-in Registers}. The postprocessor to be used for a device is specified by the -@code{postpro} command in the device description file. (@xref{Font -Files}, for more info.) This can be overridden with the @option{-X} -option. +@code{postpro} command in the device description file. (@xref{Device +and Font Description Files}.) This can be overridden with the +@option{-X} option. @item -U @cindex mode, unsafe @cindex unsafe mode -Unsafe mode. This enables the @code{open}, @code{opena}, @code{pso}, -@code{sy}, and @code{pi} requests. - -@item -w@var{name} -Enable warning @var{name}. Available warnings are described in -@ref{Debugging}. Multiple @option{-w} options are allowed. - -@item -W@var{name} -Inhibit warning @var{name}. Multiple @option{-W} options are allowed. +Operate in @dfn{unsafe mode}, which enables the @code{open}, +@code{opena}, @code{pi}, @code{pso}, and @code{sy} requests. These +requests are disabled by default because they allow an untrusted input +document to write to arbitrary file names and run arbitrary commands. +This option also adds the current directory to the macro package search +path; see the @option{-m} option above. @option{-U} is passed to +@command{gpic} and @command{gtroff}. @item -v -Make programs run by @code{groff} print out their version number. +Write version information for @command{groff} and all programs run by it +to the standard output stream; that is, the given command line is +processed in the usual way, passing @option{-v} to the formatter and any +pre- or postprocessors invoked. @item -V -Print the pipeline on @code{stdout} instead of executing it. If -specified more than once, print the pipeline on @code{stderr} and -execute it. +Output the pipeline that would be run by @command{groff} +(as a wrapper program) to the standard output stream, but do not execute +it. If given more than once, the pipeline is both written to the +standard error stream and run. -@item -X -Preview with @code{gxditview} instead of using the usual postprocessor. -This is unlikely to produce good results except with @option{-Tps}. +@item -w@var{category} +Enable warnings in @var{category}. Categories are listed in +@ref{Warnings}. -Note that this is not the same as using @option{-TX75} or -@option{-TX100} to view a document with @code{gxditview}: The former -uses the metrics of the specified device, whereas the latter uses -X-specific fonts and metrics. +@item -W@var{category} +Inhibit warnings in @var{category}. Categories are listed in +@ref{Warnings}. + +@item -X +Use @command{gxditview} instead of the usual postprocessor to (pre)view +a document on an X11 display. Combining this option with +@option{-Tps} uses the font metrics of the PostScript device, whereas +the @option{-TX75} and @option{-TX100} options use the metrics of X11 +fonts. @item -z -Suppress output from @code{gtroff}. Only error messages are printed. +Suppress formatted output from @command{gtroff}. @item -Z -Do not postprocess the output of @code{gtroff}. Normally @code{groff} -automatically runs the appropriate postprocessor. +Disable postprocessing. @command{gtroff} output will appear on the +standard output stream (unless suppressed with @option{-z}; see +@ref{gtroff Output} for a description of this format. @end table @@ -1407,37 +1330,44 @@ by @code{groff}. @tindex GROFF_COMMAND_PREFIX@r{, environment variable} @cindex command prefix @cindex prefix, for commands -If this is set to@tie{}@var{X}, then @code{groff} runs -@code{@var{X}troff} instead of @code{gtroff}. This also applies to -@code{tbl}, @code{pic}, @code{eqn}, @code{grn}, @code{chem}, -@code{refer}, and @code{soelim}. It does not apply to @code{grops}, -@code{grodvi}, @code{grotty}, @code{pre-grohtml}, @code{post-grohtml}, -@code{preconv}, @code{grolj4}, @code{gropdf}, and @code{gxditview}. +If this is set to@tie{}@var{X}, then @command{groff} runs +@command{@var{X}troff} instead of @command{gtroff}. This also applies +to @command{tbl}, @command{pic}, @command{eqn}, @command{grn}, +@command{chem}, @command{refer}, and @command{soelim}. It does not +apply to @command{grops}, @command{grodvi}, @command{grotty}, +@command{pre-grohtml}, @command{post-grohtml}, @command{preconv}, +@command{grolj4}, @command{gropdf}, and @command{gxditview}. The default command prefix is determined during the installation -process. If a non-GNU troff system is found, prefix @samp{g} is used, -none otherwise. +process. If a non-GNU @code{troff} system is found, prefix @samp{g} is +used, none otherwise. @item GROFF_ENCODING @tindex GROFF_ENCODING@r{, environment variable} -The value of this environment value is passed to the @code{preconv} -preprocessor to select the encoding of input files. Setting this option -implies @code{groff}'s command-line option @option{-k} (that is, -@code{groff} actually always calls @code{preconv}). If set without a -value, @code{groff} calls @code{preconv} without arguments. An explicit -@option{-K} command-line option overrides the value of -@env{GROFF_ENCODING}. See the manual page of @code{preconv} for details. +The value of this variable is passed to the @code{preconv} +preprocessor's @option{-e} option to select the character encoding of +input files. This variable's existence implies the @code{groff} option +@option{-k}. If set but empty, @code{groff} calls @code{preconv} +without an @option{-e} option. @code{groff}'s @option{-K} option +overrides @env{GROFF_ENCODING}. See the @cite{preconv@r{(7)}} man page; +type @samp{man preconv} at the command line to view it. @item GROFF_FONT_PATH @tindex GROFF_FONT_PATH@r{, environment variable} -A colon-separated list of directories in which to search for the -@code{dev}@var{name} directory (before the default directories are -tried). @xref{Font Directories}. +A list of directories in which to seek the selected output device's +directory of device and font description files. GNU @code{troff} +will search directories given as arguments to any specified @option{-F} +options before these, and a built-in list of directories after them. +@xref{Font Directories} and the @cite{troff@r{(1)}} or +@cite{gtroff@r{(1)}} man pages. @item GROFF_TMAC_PATH @tindex GROFF_TMAC_PATH@r{, environment variable} -A colon-separated list of directories in which to search for macro files -(before the default directories are tried). @xref{Macro Directories}. +A list of directories in which to seek macro files. GNU @code{troff} +will search directories given as arguments to any specified @option{-M} +options before these, and a built-in list of directories after them. +@xref{Macro Directories} and the @cite{troff@r{(1)}} or +@cite{gtroff@r{(1)}} man pages. @item GROFF_TMPDIR @tindex GROFF_TMPDIR@r{, environment variable} @@ -1451,18 +1381,27 @@ default directory (on Unix and GNU/Linux systems, this is usually @item GROFF_TYPESETTER @tindex GROFF_TYPESETTER@r{, environment variable} -The default output device. +Sets the default output device. If empty or not set, a build-time +default (often @code{ps}) is used. The @option{-T@var{dev}} option +overrides @env{GROFF_TYPESETTER}. @item SOURCE_DATE_EPOCH @tindex SOURCE_DATE_EPOCH@r{, environment variable} -A timestamp (expressed as seconds since the Unix epoch) to use in place of -the current time when initializing time-based built-in registers such as -@code{\n[seconds]}. +A timestamp (expressed as seconds since the Unix epoch) to use as the +output creation timestamp in place of the current time. The time is +converted to human-readable form using @cite{localtime@r{(3)}} when the +formatter starts up and stored in registers usable by documents and +macro packages (@pxref{Built-in Registers}). + +@item TZ +@tindex TZ@r{, environment variable} +The time zone to use when converting the current time (or value of +@env{SOURCE_DATE_EPOCH}) to human-readable form; see +@cite{tzset@r{(3)}}. @end table -Note that MS-DOS and MS-Windows ports of @code{groff} use semi-colons, -rather than colons, to separate the directories in the lists described -above. +MS-DOS and MS-Windows ports of @code{groff} use semicolons, rather than +colons, to separate the directories in the lists described above. @c ===================================================================== @@ -1474,31 +1413,32 @@ above. @cindex searching macros @cindex macros, searching -All macro file names must be named @code{@var{name}.tmac} or -@code{tmac.@var{name}} to make the @option{-m@var{name}} command-line -option work. The @code{mso} request doesn't have this restriction; any -file name can be used, and @code{gtroff} won't try to append or prepend -the @samp{tmac} string. - +A macro file must have a name in the form @code{@var{name}.tmac} or +@code{tmac.@var{name}} and be placed in a @dfn{tmac directory} to be +found by the @option{-m@var{name}} command-line option.@footnote{The +@code{mso} request does not have these limitations. @xref{I/O}.} @cindex tmac, directory @cindex directory, for tmac files @cindex tmac, path @cindex path, for tmac files -@cindex searching macro files -@cindex macro files, searching -@cindex files, macro, searching -Macro files are kept in the @dfn{tmac directories}, all of which -constitute the @dfn{tmac path}. The elements of the search path for -macro files are (in that order): +@cindex locating macro files +@cindex macro file search path +@cindex file, macro, search path +@cindex locating macro packages +@cindex macro package search path +@cindex package, macro, search path +Together, these directories constitute the @dfn{tmac path}. Each +directory is searched in the following order until the desired macro +file is found or the list is exhausted. @itemize @bullet @item -The directories specified with @code{gtroff}'s or @code{groff}'s +Directories specified with GNU @code{troff}'s or @code{groff}'s @option{-M} command-line option. @item @tindex GROFF_TMAC_PATH@r{, environment variable} -The directories given in the @env{GROFF_TMAC_PATH} environment variable. +Directories listed in the @env{GROFF_TMAC_PATH} environment variable. @item @cindex safer mode @@ -1507,251 +1447,235 @@ The directories given in the @env{GROFF_TMAC_PATH} environment variable. @cindex mode, unsafe @cindex current directory @cindex directory, current -The current directory (only if in unsafe mode using the @option{-U} -command-line switch). +The current working directory (only if in unsafe mode using the +@option{-U} command-line option). @item @cindex home directory @cindex directory, home -The home directory. +The user's home directory, @env{HOME}. @item -@cindex site-specific directory -@cindex directory, site-specific +@cindex site-local directory +@cindex directory, site-local @cindex platform-specific directory @cindex directory, platform-specific -A platform-dependent directory, a site-specific (platform-independent) -directory, and the main tmac directory; the default locations are +A platform-dependent directory, a site-local (platform-independent) +directory, and the main @slanted{tmac} directory. The locations +corresponding to your installation are listed in section ``Environment'' +of @cite{gtroff@r{(1)}}. If not otherwise configured, they are as +follows. @Example /usr/local/lib/groff/site-tmac /usr/local/share/groff/site-tmac -/usr/local/share/groff/1.22.3/tmac +/usr/local/share/groff/1.23.0/tmac @endExample @noindent -assuming that the version of @code{groff} is 1.22.3, and the -installation prefix was @file{/usr/local}. It is possible to fine-tune -those directories during the installation process. +The foregoing assumes that the version of @code{groff} is 1.23.0, and +that the installation prefix was @file{/usr/local}. It is possible to +fine-tune these locations during the source configuration process. @end itemize @c ===================================================================== -@node Font Directories, Paper Size, Macro Directories, Invoking groff +@node Font Directories, Paper Format, Macro Directories, Invoking groff @section Font Directories @cindex font directories @cindex directories for fonts @cindex searching fonts @cindex fonts, searching -Basically, there is no restriction how font files for @code{groff} are -named and how long font names are; however, to make the font family -mechanism work (@pxref{Font Families}), fonts within a family should -start with the family name, followed by the shape. For example, the -Times family uses @samp{T} for the family name and @samp{R}, @samp{B}, -@samp{I}, and @samp{BI} to indicate the shapes `roman', `bold', -`italic', and `bold italic', respectively. Thus the final font names -are @samp{TR}, @samp{TB}, @samp{TI}, and @samp{TBI}. +@code{groff} enforces few restrictions on how font description files are +named. For its family/style mechanism to work (@pxref{Font Families}), +the names of fonts within a family should start with the family name, +followed by the style. For example, the Times family uses @samp{T} for +the family name and @samp{R}, @samp{B}, @samp{I}, and @samp{BI} to +indicate the styles `roman', `bold', `italic', and `bold italic', +respectively. Thus the final font names are @samp{TR}, @samp{TB}, +@samp{TI}, and @samp{TBI}. @cindex font path @cindex path, for font files -All font files are kept in the @dfn{font directories}, which constitute -the @dfn{font path}. The file search functions always append the -directory @code{dev}@var{name}, where @var{name} is the name of the -output device. Assuming, say, DVI output, and @file{/foo/bar} as a font -directory, the font files for @code{grodvi} must be in -@file{/foo/bar/devdvi}. - -The elements of the search path for font files are (in that order): +Font description files are kept in @dfn{font directories}, which +together constitute the @dfn{font path}. The search procedure +always appends the directory @code{dev}@var{name}, where @var{name} is +the name of the output device. Assuming @TeX{} DVI output, and +@file{/foo/bar} as a font directory, the font description files for +@command{grodvi} must be in @file{/foo/bar/devdvi}. +Each directory in the font path is searched in the following order until +the desired font description file is found or the list is exhausted. @itemize @bullet @item -The directories specified with @code{gtroff}'s or @code{groff}'s -@option{-F} command-line option. All device drivers and some -preprocessors also have this option. +Directories specified with GNU @code{troff}'s or @code{groff}'s +@option{-f} command-line option. All output drivers (and some +preprocessors) support this option as well, because they require +information about the glyphs to be rendered in the document. @item @tindex GROFF_FONT_PATH@r{, environment variable} -The directories given in the @env{GROFF_FONT_PATH} environment variable. +Directories listed in the @env{GROFF_FONT_PATH} environment variable. @item -@cindex site-specific directory -@cindex directory, site-specific -A site-specific directory and the main font directory; the default -locations are +@cindex site-local directory +@cindex directory, site-local +A site-local directory and the main font description directory. +The locations corresponding to your installation are listed in section +``Environment'' of @cite{gtroff@r{(1)}}. If not otherwise configured, +they are as follows. @Example /usr/local/share/groff/site-font -/usr/local/share/groff/1.22.3/font +/usr/local/share/groff/1.23.0/font @endExample @noindent -assuming that the version of @code{groff} is 1.22.3, and the -installation prefix was @file{/usr/local}. It is possible to fine-tune -those directories during the installation process. +The foregoing assumes that the version of @code{groff} is 1.23.0, and +that the installation prefix was @file{/usr/local}. It is possible to +fine-tune these locations during the source configuration process. @end itemize @c ===================================================================== -@node Paper Size, Invocation Examples, Font Directories, Invoking groff -@section Paper Size +@node Paper Format, Invocation Examples, Font Directories, Invoking groff +@section Paper Format +@cindex paper format +@cindex format, paper @cindex paper size @cindex size, paper @cindex landscape page orientation @cindex orientation, landscape @cindex page orientation, landscape -In groff, the page size for @code{gtroff} and for output devices are -handled separately. @xref{Page Layout}, for vertical manipulation of -the page size. @xref{Line Layout}, for horizontal changes. - -A default paper size can be set in the device's @file{DESC} file. Most -output devices also have a command-line option @option{-p} to override -the default paper size and option @option{-l} to use landscape -orientation. @xref{DESC File Format}, for a description of the -@code{papersize} keyword, which takes the same argument as @option{-p}. - +In @code{groff}, the page dimensions for the formatter GNU @code{troff} +and for output devices are handled separately. @xref{Page Layout}, for +vertical manipulation of the page size, and @xref{Line Layout}, for +horizontal changes. @pindex papersize.tmac @pindex troffrc -A convenient shorthand to set a particular paper size for @code{gtroff} -is command-line option @option{-dpaper=@var{size}}. This defines string -@code{paper}, which is processed in file @file{papersize.tmac} (loaded in -the start-up file @file{troffrc} by default). Possible values for -@var{size} are the same as the predefined values for the -@code{papersize} keyword (but only in lowercase) except -@code{a7}--@code{d7}. An appended @samp{l} (ell) character denotes -landscape orientation. - -For example, use the following for PS output on A4 paper in landscape -orientation: +The @file{papersize} macro package, normally loaded by @file{troffrc} at +startup, provides an interface for configuring page dimensions by +convenient names, like @samp{letter} or @samp{a4}; see +@cite{groff_tmac@r{(5)}}. The default used by the formatter depends on +its build configuration, but is usually one of the foregoing, as +geographically appropriate. +@c groff(1), being generated, says what the default is. + +It is up to each macro package to respect the page dimensions configured +in this way. + +For each output device, the size of the output medium can be set in its +@file{DESC} file. Most output drivers also recognize a command-line +option @option{-p} to override the default dimensions and an option +@option{-l} to use landscape orientation. @xref{DESC File Format}, for +a description of the @code{papersize} keyword, which takes an argument +of the same form as @option{-p}. The output driver's man page, such as +@cite{grops@r{(1)}}, may also be helpful. + +@code{groff} uses the command-line option @option{-P} to pass options to +postprocessors; for example, use the following for PostScript output on +A4 paper in landscape orientation. @Example groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps @endExample -Note that it is up to the particular macro package to respect default -page dimensions set in this way (most do). - @c ===================================================================== -@node Invocation Examples, , Paper Size, Invoking groff +@c BEGIN Keep parallel with groff(1), section "Examples". +@node Invocation Examples, , Paper Format, Invoking groff @section Invocation Examples @cindex invocation examples @cindex examples of invocation -This section lists several common uses of @code{groff} and the -corresponding command lines. +@code{roff} systems are best known for formatting man pages. Once a +@command{man} librarian program has located a man page, it may execute +a @code{groff} command much like the following. @Example -groff file +groff -t -man -Tutf8 /usr/share/man/man1/groff.1 @endExample -@noindent -This command processes @file{file} without a macro package or a -preprocessor. The output device is the default, @samp{ps}, and the -output is sent to @code{stdout}. +The librarian will also pipe the output through a pager, which might not +interpret the SGR terminal escape sequences @command{groff} emits for +boldface, underlining, or italics; see the @cite{grotty@r{(1)}} man page +for a discussion. + +To process a @code{roff} input file using the preprocessors +@command{gtbl} and @command{gpic} and the @file{me} macro package in the +way to which AT&T @code{troff} users were accustomed, one would type (or +script) a pipeline. @Example -groff -t -mandoc -Tascii file | less +gpic foo.me | gtbl | gtroff -me -Tutf8 | grotty @endExample -@noindent -This is basically what a call to the @code{man} program does. -@code{gtroff} processes the manual page @file{file} with the -@file{mandoc} macro file (which in turn either calls the @file{man} or -the @file{mdoc} macro package), using the @code{tbl} preprocessor and -the @acronym{ASCII} output device. Finally, the @code{less} pager -displays the result. +Using @command{groff}, this pipe can be shortened to an equivalent +command. @Example -groff -X -m me file +groff -p -t -me -T utf8 foo.me @endExample -@noindent -Preview @file{file} with @code{gxditview}, using the @file{me} macro -package. Since no @option{-T} option is specified, use the default -device (@samp{ps}). Note that you can either say @w{@samp{-m me}} or -@w{@samp{-me}}; the latter is an anachronism from the early days of -Unix.@footnote{The same is true for the other main macro packages that -come with @code{groff}: @file{man}, @file{mdoc}, @file{ms}, @file{mm}, -and @file{mandoc}. This won't work in general; for example, to load -@file{trace.tmac}, either @samp{-mtrace} or @w{@samp{-m trace}} must be -used.} +An even easier way to do this is to use @command{grog} to guess the +preprocessor and macro options and execute the result by using the +command substitution feature of the shell. @Example -groff -man -rD1 -z file +$(grog -Tutf8 foo.me) @endExample -@noindent -Check @file{file} with the @file{man} macro package, forcing -double-sided printing -- don't produce any output. - -@menu -* grog:: -@end menu - -@c --------------------------------------------------------------------- - -@node grog, , Invocation Examples, Invocation Examples -@subsection @code{grog} - -@pindex grog -@code{grog} reads files, guesses which of the @code{groff} preprocessors -and/or macro packages are required for formatting them, and prints the -@code{groff} command including those options on the standard output. It -generates one or more of the options @option{-e}, @option{-man}, -@option{-me}, @option{-mm}, @option{-mom}, @option{-ms}, @option{-mdoc}, -@option{-mdoc-old}, @option{-p}, @option{-R}, @option{-g}, @option{-G}, -@option{-s}, and @option{-t}. - -A special file name@tie{}@file{-} refers to the standard input. -Specifying no files also means to read the standard input. Any -specified options are included in the printed command. No space is -allowed between options and their arguments. The only options -recognized are @option{-C} (which is also passed on) to enable -compatibility mode, and @option{-v} to print the version number and -exit. - -For example, +Each command-line option to a postprocessor must be specified with any +required leading dashes @samp{-} +@c No GNU roff postprocessor uses long options for anything except +@c --help or --version. +@c or @samp{--} +@c XXX: grolbp does. +because @command{groff} passes the arguments as-is to the postprocessor; +this permits arbitrary arguments to be transmitted. For example, to +pass a title to the @command{gxditview} postprocessor, +the shell commands @Example -grog -Tdvi paper.ms +groff -X -P -title -P 'trial run' mydoc.t @endExample @noindent -guesses the appropriate command to print @file{paper.ms} and then prints -it to the command line after adding the @option{-Tdvi} option. For -direct execution, enclose the call to @code{grog} in backquotes at the -Unix shell prompt: +and @Example -`grog -Tdvi paper.ms` > paper.dvi +groff -X -Z mydoc.t | gxditview -title 'trial run' - @endExample @noindent -As seen in the example, it is still necessary to redirect the output to -something meaningful (i.e.@: either a file or a pager program like -@code{less}). +are equivalent. +@c END Keep parallel with groff(1), section "Examples". @c ===================================================================== @c ===================================================================== -@node Tutorial for Macro Users, Macro Packages, Invoking groff, Top +@node Tutorial for Macro Users, Major Macro Packages, Invoking groff, Top @chapter Tutorial for Macro Users @cindex tutorial for macro users @cindex macros, tutorial for users @cindex user's tutorial for macros @cindex user's macro tutorial -Most users tend to use a macro package to format their papers. This -means that the whole breadth of @code{groff} is not necessary for most -people. This chapter covers the material needed to efficiently use a -macro package. +Most users of the @code{roff} language employ a macro package to format +their documents. Successful macro packages ease the composition +process; their users need not have mastered the full formatting +language, nor understand features like diversions, traps, and +environments. This chapter aims to familiarize you with basic concepts +and mechanisms common to many macro packages (like ``displays''). If +you prefer a meticulous and comprehensive presentation, try @ref{GNU +troff Reference} instead. @menu * Basics:: @@ -1763,24 +1687,24 @@ macro package. @node Basics, Common Features, Tutorial for Macro Users, Tutorial for Macro Users @section Basics -@cindex basics of macros -@cindex macro basics +@cindex basics of macro package usage +@cindex macro package usage, basics of -This section covers some of the basic concepts necessary to understand -how to use a macro package.@footnote{This section is derived from -@cite{Writing Papers with nroff using -me} by Eric P.@tie{}Allman.} -References are made throughout to more detailed information, if desired. +Let us first survey some basic concepts necessary to use a macro package +fruitfully.@footnote{The remainder of this chapter is based on +@cite{Writing Papers with nroff using -me} by Eric@tie{}P.@: Allman, +which is distributed with @code{groff} as @file{meintro.me}.} +References are made throughout to more detailed information. -@code{gtroff} reads an input file prepared by the user and outputs a +GNU @code{troff} reads an input file prepared by the user and outputs a formatted document suitable for publication or framing. The input consists of text, or words to be printed, and embedded commands -(@dfn{requests} and @dfn{escapes}), which tell @code{gtroff} how to -format the output. For more detail on this, see @ref{Embedded -Commands}. +(@slanted{requests} and @slanted{escape sequences}), which tell GNU +@code{troff} how to format the output. @xref{Formatter Instructions}. -The word @dfn{argument} is used in this chapter to mean a word or number -that appears on the same line as a request, and which modifies the -meaning of that request. For example, the request +The word @slanted{argument} is used in this chapter to mean a word or +number that appears on the same line as a request, and which modifies +the meaning of that request. For example, the request @Example .sp @@ -1796,13 +1720,12 @@ spaces one line, but @noindent spaces four lines. The number@tie{}4 is an argument to the @code{sp} request, which says to space four lines instead of one. Arguments are -separated from the request and from each other by spaces (@emph{no} -tabs). More details on this can be found in @ref{Request and Macro -Arguments}. +separated from the request and from each other by spaces (@emph{not} +tabs). @xref{Invoking Requests}. -The primary function of @code{gtroff} is to collect words from input -lines, fill output lines with those words, justify the right-hand margin -by inserting extra spaces in the line, and output the result. For +The primary function of GNU @code{troff} is to collect words from input +lines, fill output lines with those words, adjust the line to the +right-hand margin by widening spaces, and output the result. For example, the input: @Example @@ -1817,34 +1740,33 @@ years ago, etc. @noindent is read, packed onto output lines, and justified to produce: -@quotation -Now is the time for all good men to come to the aid of their party. -Four score and seven years ago, etc. -@end quotation +@Example + @result{} Now is the time for all good men to come to the aid of + @result{} their party. Four score and seven years ago, etc. +@endExample -@cindex break -@cindex line break Sometimes a new output line should be started even though the current -line is not yet full; for example, at the end of a paragraph. To do -this it is possible to cause a @dfn{break}, which starts a new output -line. Some requests cause a break automatically, as normally do blank -input lines and input lines beginning with a space. - -Not all input lines are text to be formatted. Some input lines are -requests that describe how to format the text. Requests always have a -period (@samp{.}) or an apostrophe (@samp{'}) as the first character of -the input line. - -The text formatter also does more complex things, such as automatically +line is not yet full---for example, at the end of a paragraph. To do +this it is possible to force a @slanted{break}, starting a new output +line. Some requests cause a break automatically, as do (normally) blank +input lines and input lines beginning with a space or tab. + +Not all input lines are @slanted{text lines}---words to be formatted. +Some are @slanted{control lines} that tell a macro package (or GNU +@code{troff} directly) how to format the text. Control lines start with +a dot (@samp{.}) or an apostrophe (@samp{'}) as the first character, and +can be followed by a @slanted{macro call}. + +The formatter also does more complex things, such as automatically numbering pages, skipping over page boundaries, putting footnotes in the correct place, and so forth. -Here are a few hints for preparing text for input to @code{gtroff}. +Here are a few hints for preparing text for input to GNU @code{troff}. @itemize @bullet @item First, keep the input lines short. Short input lines are easier to -edit, and @code{gtroff} packs words onto longer lines anyhow. +edit, and GNU @code{troff} packs words onto longer lines anyhow. @item In keeping with this, it is helpful to begin a new line after every @@ -1852,37 +1774,39 @@ comma or phrase, since common corrections are to add or delete sentences or phrases. @item -End each sentence with two spaces -- or better, start each sentence on a -new line. @code{gtroff} recognizes characters that usually end a -sentence, and inserts sentence space accordingly. +End each sentence with two spaces---or better, start each sentence on a +new line. GNU @code{troff} recognizes characters that usually end a +sentence, and inserts inter-sentence space accordingly. @item -Do not hyphenate words at the end of lines -- @code{gtroff} is smart +Do not hyphenate words at the end of lines---GNU @code{troff} is smart enough to hyphenate words as needed, but is not smart enough to take hyphens out and join a word back together. Also, words such as ``mother-in-law'' should not be broken over a line, since then a space can occur where not wanted, such as ``@w{mother- in}-law''. @end itemize -@cindex double-spacing (@code{ls}) -@cindex spacing -@code{gtroff} double-spaces output text automatically if you use the -request @w{@samp{.ls 2}}. Reactivate single-spaced mode by typing -@w{@samp{.ls 1}}.@footnote{If you need finer granularity of the vertical -space, use the @code{pvs} request (@pxref{Changing Type Sizes}).} - -A number of requests allow to change the way the output looks, sometimes -called the @dfn{layout} of the output page. Most of these requests -adjust the placing of @dfn{whitespace} (blank lines or spaces). - -@cindex new page (@code{bp}) -The @code{bp} request starts a new page, causing a line break. - -@cindex blank line (@code{sp}) -@cindex empty line (@code{sp}) -@cindex line, empty (@code{sp}) +We offer further advice in @ref{Input Conventions}. + +@cindex vertical spacing (introduction) +@cindex spacing, vertical (introduction) +GNU @code{troff} permits alteration of the distance between lines of +text. This is termed @slanted{vertical spacing} and is expressed in the +same units as the type size---the point. The default is 10-point type +on 12-point spacing. To get @slanted{double-spaced} text you would set +the vertical spacing to 24 points. Some, but not all, macro packages +expose a macro or register to configure the vertical spacing. + +A number of requests allow you to change the way the output is arranged +on the page, sometimes called the @slanted{layout} of the output page. +Most macro packages don't supply macros for performing these (at least +not without performing other actions besides), as they are such basic +operations. The macro packages for writing man pages, @file{man} and +@file{mdoc}, don't encourage explicit use of these requests at all. + +@cindex spacing (introduction) The request @w{@samp{.sp @var{N}}} leaves @var{N}@tie{}lines of blank -space. @var{N}@tie{}can be omitted (meaning skip a single line) or can +space. @var{N}@tie{}can be omitted (skipping a single line) or can be of the form @var{N}i (for @var{N}@tie{}inches) or @var{N}c (for @var{N}@tie{}centimeters). For example, the input: @@ -1895,10 +1819,18 @@ My thoughts on the subject @noindent leaves one and a half inches of space, followed by the line ``My thoughts on the subject'', followed by a single blank line (more -measurement units are available, see @ref{Measurements}). - -@cindex centering lines (@code{ce}) -@cindex lines, centering (@code{ce}) +measurement units are available; see @ref{Measurements}). + +If you seek precision in spacing, be advised when using a macro package +that it might not honor @code{sp} requests as you expect; it can use a +formatter feature called @slanted{no-space mode} to prevent excess space +from accumulating. Macro packages typically offer registers to control +spacing between paragraphs, before section headings, and around displays +(discussed below); use these facilities preferentially. +@xref{Manipulating Spacing}. + +@cindex centering lines (introduction) +@cindex lines, centering (introduction) Text lines can be centered by using the @code{ce} request. The line after @code{ce} is centered (horizontally) on the page. To center more than one line, use @w{@samp{.ce @var{N}}} (where @var{N} is the number @@ -1912,14 +1844,29 @@ lines to center @endExample @noindent -The @w{@samp{.ce 0}} request tells @code{groff} to center zero more +The @w{@samp{.ce 0}} request tells GNU @code{troff} to center zero more lines, in other words, stop centering. -@cindex line break (@code{br}) -@cindex break (@code{br}) +@cindex right-aligning lines (introduction) +@cindex lines, right-aligning (introduction) +@cindex right-justifying lines (introduction) +@cindex lines, right-justifying (introduction) +GNU @code{troff} also offers the @code{rj} request for right-aligning +text. It works analogously to @code{ce} and is convenient for setting +epigraphs. + +@cindex page break (introduction) +@cindex break, page (introduction) +The @code{bp} request starts a new page; this necessarily implies an +ordinary (line) break. + +@cindex break (introduction) +@cindex line break (introduction) All of these requests cause a break; that is, they always start a new line. To start a new line without performing any other action, use -@code{br}. +@code{br}. If you invoke them with the apostrophe @samp{'}, the +@slanted{no-break control character}, the (initial) break they normally +perform is suppressed. @samp{'br} does nothing. @c ===================================================================== @@ -1929,27 +1876,35 @@ line. To start a new line without performing any other action, use @cindex common features @cindex features, common -@code{gtroff} provides very low-level operations for formatting a -document. There are many common routine operations that are done in -all documents. These common operations are written into @dfn{macros} -and collected into a @dfn{macro package}. +GNU @code{troff} provides low-level operations for formatting a +document. Many routine operations are undertaken in nearly all +documents that require a series of such primitive operations to be +performed. These common tasks are grouped into @slanted{macros}, which +are then collected into a @slanted{macro package}. -All macro packages provide certain common capabilities that fall into -the following categories. +Macro packages come in two varieties:@: ``major'' or ``full-service'' +ones that manage page layout, and ``minor'' or ``auxiliary'' ones that +do not, instead fulfilling narrow, specific tasks. Find a list in the +@cite{groff_tmac@r{(5)}} man page. Type @samp{man groff_tmac} at the +command line to view it. + +We survey several capabilities of full-service macro package below. +Each package employs its own macros to exercise them. For details, +consult its man page or, for @file{ms}, see @ref{ms}. @menu * Paragraphs:: * Sections and Chapters:: * Headers and Footers:: * Page Layout Adjustment:: -* Displays:: -* Footnotes and Annotations:: +* Displays and Keeps:: +* Footnotes and Endnotes:: * Table of Contents:: -* Indices:: -* Paper Formats:: -* Multiple Columns:: +* Indexing:: +* Document Formats:: +* Columnation:: * Font and Size Changes:: -* Predefined Strings:: +* Predefined Text:: * Preprocessor Support:: * Configuration and Customization:: @end menu @@ -1960,44 +1915,56 @@ the following categories. @subsection Paragraphs @cindex paragraphs -One of the most common and most used capability is starting a paragraph. -There are a number of different types of paragraphs, any of which can be -initiated with macros supplied by the macro package. Normally, -paragraphs start with a blank line and the first line indented, like the -text in this manual. There are also block style paragraphs, which omit -the indentation: +Paragraphs can be separated and indented in various ways. Some start +with a blank line and have a first-line indentation, like most of the +ones in this manual. Block paragraphs omit the indentation. + +@Example + @result{} Some men look at constitutions with sanctimonious + @result{} reverence, and deem them like the ark of the + @result{} covenant, too sacred to be touched. +@endExample + +@cindex tags, paragraph +@cindex tagged paragraphs +@cindex lists +@noindent +We also frequently encounter @slanted{tagged} paragraphs, which begin +with a tag or label at the left margin and indent the remaining text. @Example -Some men look at constitutions with sanctimonious -reverence, and deem them like the ark of the covenant, too -sacred to be touched. + @result{} one This is the first paragraph. Notice how the + @result{} first line of the resulting paragraph lines + @result{} up with the other lines in the paragraph. @endExample @noindent -And there are also indented paragraphs, which begin with a tag or label -at the margin and the remaining text indented. +If the tag is too wide for the indentation, the line is broken. @Example -one This is the first paragraph. Notice how the first - line of the resulting paragraph lines up with the - other lines in the paragraph. + @result{} longlabel + @result{} The label does not align with the subsequent + @result{} lines, but they align with each other. @endExample +@noindent +A variation of the tagged paragraph is the itemized or enumerated +paragraph, which might use punctuation or a digit for a tag, +respectively. These are frequently used to construct lists. + @Example -longlabel - This paragraph had a long label. The first - character of text on the first line does not line up - with the text on second and subsequent lines, - although they line up with each other. + @result{} o This list item starts with a bullet. When + @result{} producing output for a device using the ASCII + @result{} character set, an 'o' is formatted instead. @endExample -A variation of this is a bulleted list. +@noindent +Often, use of the same macro without a tag continues such a discussion. @Example -. Bulleted lists start with a bullet. It is possible - to use other glyphs instead of the bullet. In nroff - mode using the ASCII character set for output, a dot - is used instead of a real bullet. + @result{} -xyz This option is recognized but ignored. + @result{} + @result{} It had a security hole that we don't discuss. @endExample @c --------------------------------------------------------------------- @@ -2005,724 +1972,286 @@ A variation of this is a bulleted list. @node Sections and Chapters, Headers and Footers, Paragraphs, Common Features @subsection Sections and Chapters -Most macro packages supply some form of section headers. The simplest -kind is simply the heading on a line by itself in bold type. Others -supply automatically numbered section heading or different heading -styles at different levels. Some, more sophisticated, macro packages -supply macros for starting chapters and appendices. +The simplest kind of section heading is unnumbered, set in a bold or +italic style, and occupies a line by itself. Others possess +automatically numbered multi-level headings and/or different typeface +styles or sizes at different levels. More sophisticated macro packages +supply macros for designating chapters and appendices. @c --------------------------------------------------------------------- @node Headers and Footers, Page Layout Adjustment, Sections and Chapters, Common Features @subsection Headers and Footers -Every macro package gives some way to manipulate the @dfn{headers} and -@dfn{footers} (also called @dfn{titles}) on each page. This is text put -at the top and bottom of each page, respectively, which contain data -like the current page number, the current chapter title, and so on. Its -appearance is not affected by the running text. Some packages allow for -different ones on the even and odd pages (for material printed in a book -form). +@slanted{Headers} and @slanted{footers} occupy the top and bottom of +each page, respectively, and contain data like the page number and the +article or chapter title. Their appearance is not affected by the +running text. Some packages allow for different titles on even- and +odd-numbered pages (for printed, bound material). -The titles are called @dfn{three-part titles}, that is, there is a -left-justified part, a centered part, and a right-justified part. An -automatically generated page number may be put in any of these fields -with the @samp{%} character (see @ref{Page Layout}, for more details). +Headers and footers are together called @slanted{titles}, and comprise +three parts:@: left-aligned, centered, and right-aligned. A @samp{%} +character appearing anywhere in a title is automatically replaced by the +page number. @xref{Page Layout}. @c --------------------------------------------------------------------- -@node Page Layout Adjustment, Displays, Headers and Footers, Common Features +@node Page Layout Adjustment, Displays and Keeps, Headers and Footers, Common Features @subsection Page Layout -Most macro packages let the user specify top and bottom margins and -other details about the appearance of the printed pages. +Most macro packages let the user specify the size of the page margins. +The top and bottom margins are typically handled differently than the +left and right margins; the latter two are derived from the +@slanted{page offset}, @slanted{indentation}, and @slanted{line length}. +@xref{Line Layout}. Commonly, packages support registers to tune these +values. @c --------------------------------------------------------------------- -@node Displays, Footnotes and Annotations, Page Layout Adjustment, Common Features -@subsection Displays +@node Displays and Keeps, Footnotes and Endnotes, Page Layout Adjustment, Common Features +@subsection Displays and Keeps @cindex displays -@dfn{Displays} are sections of text to be set off from the body of the -paper. Major quotes, tables, and figures are types of displays, as are -all the examples used in this document. - -@cindex quotes, major -@cindex major quotes -@dfn{Major quotes} are quotes that are several lines long, and hence -are set in from the rest of the text without quote marks around them. +@slanted{Displays} are sections of text set off from the surrounding +material (typically paragraphs), often differing in indentation, and/or +spacing. Tables, block quotations, and figures are displayed. +Equations and code examples, when not much shorter than an output line, +often are. Lists may or may not be. Packages for setting man pages +support example displays but not keeps. +@c XXX: man, mdoc keep support planned -@cindex list -A @dfn{list} is an indented, single-spaced, unfilled display. Lists -should be used when the material to be printed should not be filled and -justified like normal text, such as columns of figures or the examples -used in this paper. - -@cindex keep -A @dfn{keep} is a display of lines that are kept on a single page if -possible. An example for a keep might be a diagram. Keeps differ from -lists in that lists may be broken over a page boundary whereas keeps are -not. +@cindex keeps (introduction) +A @slanted{keep} is a group of output lines, often a display, that is +formatted on a single page if possible; it causes a page break to happen +early so as to not interrupt the kept material. @cindex keep, floating @cindex floating keep -@dfn{Floating keeps} move relative to the text. Hence, they are good -for things that are referred to by name, such as ``See figure@tie{}3''. -A floating keep appears at the bottom of the current page if it fits; -otherwise, it appears at the top of the next page. Meanwhile, the -surrounding text `flows' around the keep, thus leaving no blank areas. +@slanted{Floating keeps} can move, or ``float'', relative to the text +around them in the input. They are useful for displays that are +captioned and referred to by name, as with ``See figure@tie{}3''. +Depending on the package, a floating keep appears at the bottom of the +current page if it fits, and at the top of the next otherwise. +Alternatively, floating keeps might be deferred to the end of a section. +Using a floating keep can avoid the large vertical spaces that may +precede a tall keep of the ordinary sort when it won't fit on the page. @c --------------------------------------------------------------------- -@node Footnotes and Annotations, Table of Contents, Displays, Common Features -@subsection Footnotes and Annotations +@node Footnotes and Endnotes, Table of Contents, Displays and Keeps, Common Features +@subsection Footnotes and Endnotes @cindex footnotes -@cindex annotations - -There are a number of requests to save text for later printing. +@cindex endnotes -@dfn{Footnotes} are printed at the bottom of the current page. - -@cindex delayed text -@dfn{Delayed text} is very similar to a footnote except that it is -printed when called for explicitly. This allows a list of references to -appear (for example) at the end of each chapter, as is the convention in -some disciplines. - -Most macro packages that supply this functionality also supply a means -of automatically numbering either type of annotation. +@slanted{Footnotes} and @slanted{endnotes} are forms of delayed +formatting. They are recorded at their points of relevance in +the input, but not formatted there. Instead, a @slanted{mark} cues the +reader to check the ``foot'', or bottom, of the current page, or in the +case of endnotes, an annotation list later in the document. Macro +packages that support these features also supply a means of +automatically numbering either type of annotation. @c --------------------------------------------------------------------- -@node Table of Contents, Indices, Footnotes and Annotations, Common Features +@node Table of Contents, Indexing, Footnotes and Endnotes, Common Features @subsection Table of Contents @cindex table of contents @cindex contents, table of -@dfn{Tables of contents} are a type of delayed text having a tag -(usually the page number) attached to each entry after a row of dots. -The table accumulates throughout the paper until printed, usually after -the paper has ended. Many macro packages provide the ability to have -several tables of contents (e.g.@: a standard table of contents, a list -of tables, etc). +A package may handle a @slanted{table of contents} by directing section +heading macros to save section heading text and the page number where it +occurs for use in a later @slanted{entry} for a table of contents. It +writes the collected entries at the end of the document, once all are +known, upon request. A row of dots (a @slanted{leader}) bridges the +text on the left with its location on the right. Other collections +might work in this manner, providing lists of figures or tables. + +A table of contents is often found at the end of a GNU @code{troff} +document because the formatter processes the document in a single pass. +The @command{gropdf} output driver supports a PDF feature that relocates +pages at the time the document is rendered; see the @cite{gropdf@r{(1)}} +man page. Type @samp{man gropdf} at the command line to view it. @c --------------------------------------------------------------------- -@node Indices, Paper Formats, Table of Contents, Common Features -@subsection Indices +@node Indexing, Document Formats, Table of Contents, Common Features +@subsection Indexing @cindex index, in macro package -While some macro packages use the term @dfn{index}, none actually -provide that functionality. The facilities they call indices are -actually more appropriate for tables of contents. - @pindex makeindex -To produce a real index in a document, external tools like the -@code{makeindex} program are necessary. +An index is similar to a table of contents, in that entry labels and +locations must be collected, but poses a greater challenge because it +needs to be sorted before it is output. Here, processing the document +in multiple passes is inescapable, and tools like the @code{makeindex} +program are necessary. @c --------------------------------------------------------------------- -@node Paper Formats, Multiple Columns, Indices, Common Features -@subsection Paper Formats -@cindex paper formats +@node Document Formats, Columnation, Indexing, Common Features +@subsection Document Formats +@cindex document formats -Some macro packages provide stock formats for various kinds of -documents. Many of them provide a common format for the title and -opening pages of a technical paper. The @file{mm} macros in particular -provide formats for letters and memoranda. +Some macro packages supply stock configurations of certain documents, +like business letters and memoranda. These often also have provision +for a @slanted{cover sheet}, which may be rigid in its format. With +these features, it is even more important to use the package's macros in +preference to the formatter requests presented earlier, where possible. @c --------------------------------------------------------------------- -@node Multiple Columns, Font and Size Changes, Paper Formats, Common Features -@subsection Multiple Columns +@node Columnation, Font and Size Changes, Document Formats, Common Features +@subsection Columnation -Some macro packages (but not @file{man}) provide the ability to have two -or more columns on a page. +Macro packages apart from @file{man} and @file{mdoc} for man page +formatting offer a facility for setting multiple columns on the page. @c --------------------------------------------------------------------- -@node Font and Size Changes, Predefined Strings, Multiple Columns, Common Features +@node Font and Size Changes, Predefined Text, Columnation, Common Features @subsection Font and Size Changes -The built-in font and size functions are not always intuitive, so all -macro packages provide macros to make these operations simpler. +The formatter's requests and escape sequences for setting the typeface +and size are not always intuitive, so all macro packages provide macros +to make these operations simpler. They also make it more convenient to +change typefaces in the middle of a word and can handle italic +corrections automatically. @xref{Italic Corrections}. @c --------------------------------------------------------------------- -@node Predefined Strings, Preprocessor Support, Font and Size Changes, Common Features -@subsection Predefined Strings +@node Predefined Text, Preprocessor Support, Font and Size Changes, Common Features +@subsection Predefined Text -Most macro packages provide various predefined strings for a variety of -uses; examples are sub- and superscripts, printable dates, quotes and -various special characters. +Most macro packages supply predefined strings to set prepared text like +the date, or to perform operations like super- and subscripting. @c --------------------------------------------------------------------- -@node Preprocessor Support, Configuration and Customization, Predefined Strings, Common Features +@node Preprocessor Support, Configuration and Customization, Predefined Text, Common Features @subsection Preprocessor Support All macro packages provide support for various preprocessors and may -extend their functionality. - -For example, all macro packages mark tables (which are processed with -@code{gtbl}) by placing them between @code{TS} and @code{TE} macros. -The @file{ms} macro package has an option, @samp{.TS@tie{}H}, that -prints a caption at the top of a new page (when the table is too long to -fit on a single page). +extend their functionality by defining macros to set their contents in +displays. Examples include @code{TS} and @code{TE} for @command{gtbl}, +@code{EQ} and @code{EN} for @command{geqn}, and @code{PS} and @code{PE} +for @command{gpic}. @c --------------------------------------------------------------------- @node Configuration and Customization, , Preprocessor Support, Common Features @subsection Configuration and Customization -Some macro packages provide means of customizing many of the details of -how the package behaves. This ranges from setting the default type size -to changing the appearance of section headers. +Packages provide means of customizing many of the details of how the +package behaves. These range from setting the default type size to +changing the appearance of section headers. + +@codequotebacktick off +@codequoteundirected off @c ===================================================================== @c ===================================================================== -@node Macro Packages, gtroff Reference, Tutorial for Macro Users, Top +@node Major Macro Packages, GNU troff Reference, Tutorial for Macro Users, Top @chapter Macro Packages -@cindex macro packages -@cindex packages, macros +@cindex major macro package +@cindex package, macro, major +@cindex macro package, major -This chapter documents the main macro packages that come with -@code{groff}. +This chapter surveys the ``major'' macro packages that come with +@code{groff}. One, @file{ms}, is presented in detail. -Different main macro packages can't be used at the same time; for -example +@cindex full-service macro package +@cindex package, macro, full-service +@cindex macro package, full-service +Major macro packages are also sometimes described as @dfn{full-service} +due to the breadth of features they provide and because more than one +cannot be used by the same document; for example @Example groff -m man foo.man -m ms bar.doc @endExample @noindent -doesn't work. Note that option arguments are processed before -non-option arguments; the above (failing) sample is thus reordered to +doesn't work. Option arguments are processed before non-option +arguments; the above (failing) sample is thus reordered to @Example groff -m man -m ms foo.man bar.doc @endExample +@cindex minor macro package +@cindex package, macro, minor +@cindex macro package, minor +@cindex auxiliary macro package +@cindex package, macro, auxiliary +@cindex macro package, auxiliary +Many auxiliary, or ``minor'', macro packages are also available. They +may in general be used with any full-service macro package and handle a +variety of tasks from character encoding selection, to language +localization, to inlining of raster images. See the +@cite{groff_tmac@r{(5)}} man page for a list. Type @samp{man +groff_tmac} at the command line to view it. + @menu * man:: * mdoc:: -* ms:: * me:: * mm:: * mom:: +* ms:: @end menu @c ===================================================================== -@node man, mdoc, Macro Packages, Macro Packages +@node man, mdoc, Major Macro Packages, Major Macro Packages @section @file{man} @cindex manual pages @cindex man pages @pindex an.tmac @pindex man.tmac -@pindex man-old.tmac -This is the most popular and probably the most important macro package -of @code{groff}. It is easy to use, and a vast majority of manual pages -are based on it. +The @code{man} macro package is the most widely used and probably the +most important ever developed for @code{troff}. It is easy to use, and +a vast majority of manual pages (``man pages'') are written in it. + +@code{groff}'s implementation is documented in the +@cite{groff_man@r{(7)}} man page. Type @samp{man groff_man} at the +command line to view it. @menu -* Man options:: -* Man usage:: -* Man font macros:: -* Miscellaneous man macros:: -* Predefined man strings:: -* Preprocessors in man pages:: * Optional man extensions:: @end menu @c --------------------------------------------------------------------- -@node Man options, Man usage, man, man -@subsection Options +@node Optional man extensions, , , man +@subsection Optional @file{man} extensions -The command-line format for using the @file{man} macros with -@code{groff} is: +@pindex man.local +Use the file @file{man.local} for local extensions to the @code{man} +macros or for style changes. -@Example -groff -m man [ -rLL=@var{length} ] [ -rLT=@var{length} ] [ -rFT=@var{dist} ] - [ -rcR=1 ] [ -rC1 ] [ -rD1 ] [-rHY=@var{flags} ] - [ -rP@var{nnn} ] [ -rS@var{xx} ] [ -rX@var{nnn} ] - [ -rIN=@var{length} ] [ -rSN=@var{length} ] [ @var{files}@dots{} ] -@endExample +@unnumberedsubsubsec Custom headers and footers +@cindex @code{man} macros, custom headers and footers -@noindent -It is possible to use @samp{-man} instead of @w{@samp{-m man}}. +In @code{groff} versions 1.18.2 and later, you can specify custom +headers and footers by redefining the following macros in +@file{man.local}. -@table @code -@item -rcR=1 -This option (the default if a TTY output device is used) creates a -single, very long page instead of multiple pages. Use @code{-rcR=0} to -disable it. - -@item -rC1 -If more than one manual page is given on the command line, number the -pages continuously, rather than starting each at@tie{}1. - -@item -rD1 -Double-sided printing. Footers for even and odd pages are formatted -differently. - -@item -rFT=@var{dist} -Set the position of the footer text to @var{dist}. If positive, the -distance is measured relative to the top of the page, otherwise it is -relative to the bottom. The default is @minus{}0.5@dmn{i}. - -@item -rHY=@var{flags} -Set hyphenation flags. Possible values are 1@tie{}to hyphenate without -restrictions, 2@tie{}to not hyphenate the last word on a page, 4@tie{}to -not hyphenate the last two characters of a word, and 8@tie{}to not -hyphenate the first two characters of a word. These values are -additive; the default is@tie{}8. - -@item -rIN=@var{length} -Set the body text indentation to @var{length}. If not specified, the -indentation defaults to 7@dmn{n} (7@tie{}characters) in nroff mode and -7.2@dmn{n} otherwise. For nroff, this value should always be an integer -multiple of unit @samp{n} to get consistent indentation. - -@item -rLL=@var{length} -Set line length to @var{length}. If not specified, the line length is -set to respect any value set by a prior @samp{ll} request (which -@emph{must} be in effect when the @samp{TH} macro is invoked), if this -differs from the built-in default for the formatter; otherwise it -defaults to 78@dmn{n} in nroff mode (this is 78 characters per line) and -6.5@dmn{i} in troff mode.@footnote{Note that the use of a @samp{.ll -@var{length}} request to initialize the line length, prior to use of the -@samp{TH} macro, is supported for backward compatibility with some -versions of the @code{man} program. @emph{Always} use the -@option{-rLL=@var{length}} option, or an equivalent @samp{.nr LL -@var{length}} request, in preference to such a @samp{.ll @var{length}} -request. In particular, note that in nroff mode, the request @samp{.ll -65n}, (with any @var{length} expression that evaluates equal to -65@dmn{n}, i.e., the formatter's default line length in nroff mode), -does @emph{not} set the line length to 65@dmn{n} (it is adjusted to the -@code{man} macro package's default setting of 78@dmn{n}), whereas the -use of the @option{-rLL=65n} option, or the @samp{.nr LL 65n} request -@emph{does} establish a line length of 65@dmn{n}.} - -@item -rLT=@var{length} -Set title length to @var{length}. If not specified, the title length -defaults to the line length. - -@item -rP@var{nnn} -Page numbering starts with @var{nnn} rather than with@tie{}1. - -@item -rS@var{xx} -Use @var{xx} (which can be 10, 11, or@tie{}12@dmn{pt}) as the base -document font size instead of the default value of@tie{}10@dmn{pt}. - -@item -rSN=@var{length} -Set the indentation for sub-subheadings to @var{length}. If not -specified, the indentation defaults to 3@dmn{n}. - -@item -rX@var{nnn} -After page @var{nnn}, number pages as @var{nnn}a, @var{nnn}b, -@var{nnn}c, etc. For example, the option @option{-rX2} produces the -following page numbers: 1, 2, 2a, 2b, 2c, etc. -@end table - -@c --------------------------------------------------------------------- - -@node Man usage, Man font macros, Man options, man -@subsection Usage -@cindex @code{man} macros -@cindex macros for manual pages [@code{man}] - -@pindex man.local -This section describes the available macros for manual pages. For -further customization, put additional macros and requests into the file -@file{man.local}, which is loaded immediately after the @file{man} -package. - -@Defmac {TH, title section [@Var{extra1} [@Var{extra2} [@Var{extra3}]]], man} -Set the title of the man page to @var{title} and the section to -@var{section}, which must have a value between 1 and@tie{}8. The value -of @var{section} may also have a string appended, e.g.@: @samp{.pm}, to -indicate a specific subsection of the man pages. - -Both @var{title} and @var{section} are positioned at the left and right -in the header line (with @var{section} in parentheses immediately -appended to @var{title}. @var{extra1} is positioned in the middle of -the footer line. @var{extra2} is positioned at the left in the footer -line (or at the left on even pages and at the right on odd pages if -double-sided printing is active). @var{extra3} is centered in the -header line. - -For @acronym{HTML} and @acronym{XHTML} output, headers and footers are -completely suppressed. - -Additionally, this macro starts a new page; the new line number -is@tie{}1 again (except if the @option{-rC1} option is given on the -command line) -- this feature is intended only for formatting multiple -man pages; a single man page should contain exactly one @code{TH} macro -at the beginning of the file. -@endDefmac - -@Defmac {SH, [@Var{heading}], man} -Set up an unnumbered section heading sticking out to the left. Prints -out all the text following @code{SH} up to the end of the line (or the -text in the next line if there is no argument to @code{SH}) in bold face -(or the font specified by the string @code{HF}), one size larger than -the base document size. Additionally, the left margin and the -indentation for the following text is reset to its default value. -@endDefmac - -@Defmac {SS, [@Var{heading}], man} -Set up an unnumbered (sub)section heading. Prints out all the text -following @code{SS} up to the end of the line (or the text in the next -line if there is no argument to @code{SS}) in bold face (or the font -specified by the string @code{HF}), at the same size as the base -document size. Additionally, the left margin and the indentation for -the following text is reset to its default value. -@endDefmac - -@Defmac {TP, [@Var{nnn}], man} -Set up an indented paragraph with label. The indentation is set to -@var{nnn} if that argument is supplied (the default unit is @samp{n} if -omitted), otherwise it is set to the previous indentation value -specified with @code{TP}, @code{IP}, or @code{HP} (or to the default -value if none of them have been used yet). - -The first line of text following this macro is interpreted as a string -to be printed flush-left, as it is appropriate for a label. It is not -interpreted as part of a paragraph, so there is no attempt to fill the -first line with text from the following input lines. Nevertheless, if -the label is not as wide as the indentation the paragraph starts at the -same line (but indented), continuing on the following lines. If the -label is wider than the indentation the descriptive part of the -paragraph begins on the line following the label, entirely indented. -Note that neither font shape nor font size of the label is set to a -default value; on the other hand, the rest of the text has default font -settings. -@endDefmac - -@DefmacList {LP, , man} -@DefmacItemx {PP, , man} -@DefmacListEndx {P, , man} -These macros are mutual aliases. Any of them causes a line break at the -current position, followed by a vertical space downwards by the amount -specified by the @code{PD} macro. The font size and shape are reset to -the default value (10@dmn{pt} roman if no @option{-rS} option is given -on the command line). Finally, the current left margin and the -indentation is restored. -@endDefmac - -@Defmac {IP, [@Var{designator} [@Var{nnn}]], man} -Set up an indented paragraph, using @var{designator} as a tag to mark -its beginning. The indentation is set to @var{nnn} if that argument is -supplied (default unit is @samp{n}), otherwise it is set to the previous -indentation value specified with @code{TP}, @code{IP}, or @code{HP} (or -the default value if none of them have been used yet). Font size and -face of the paragraph (but not the designator) are reset to their -default values. - -To start an indented paragraph with a particular indentation but without -a designator, use @samp{""} (two double quotes) as the first argument of -@code{IP}. - -For example, to start a paragraph with bullets as the designator and -4@tie{}en indentation, write - -@Example -.IP \(bu 4 -@endExample -@endDefmac - -@Defmac {HP, [@Var{nnn}], man} -@cindex hanging indentation [@code{man}] -@cindex @code{man} macros, hanging indentation -Set up a paragraph with hanging left indentation. The indentation is -set to @var{nnn} if that argument is supplied (default unit is -@samp{n}), otherwise it is set to the previous indentation value -specified with @code{TP}, @code{IP}, or @code{HP} (or the default value -if non of them have been used yet). Font size and face are reset to -their default values. -@endDefmac - -@Defmac {RS, [@Var{nnn}], man} -@cindex left margin, how to move [@code{man}] -@cindex @code{man} macros, moving left margin -Move the left margin to the right by the value @var{nnn} if specified -(default unit is @samp{n}); otherwise it is set to the previous -indentation value specified with @code{TP}, @code{IP}, or @code{HP} (or -to the default value if none of them have been used yet). The -indentation value is then set to the default. - -Calls to the @code{RS} macro can be nested. -@endDefmac - -@Defmac {RE, [@Var{nnn}], man} -Move the left margin back to level @var{nnn}, restoring the previous -left margin. If no argument is given, it moves one level back. The -first level (i.e., no call to @code{RS} yet) has number@tie{}1, and each -call to @code{RS} increases the level by@tie{}1. -@endDefmac - -@cindex line breaks, with vertical space [@code{man}] -@cindex @code{man} macros, line breaks with vertical space -To summarize, the following macros cause a line break with the insertion -of vertical space (which amount can be changed with the @code{PD} -macro): @code{SH}, @code{SS}, @code{TP}, @code{LP} (@code{PP}, -@code{P}), @code{IP}, and @code{HP}. - -@cindex line breaks, without vertical space [@code{man}] -@cindex @code{man} macros, line breaks without vertical space -The macros @code{RS} and @code{RE} also cause a break but do not insert -vertical space. - -@cindex default indentation, resetting [@code{man}] -@cindex indentation, resetting to default [@code{man}] -@cindex @code{man} macros, resetting default indentation -Finally, the macros @code{SH}, @code{SS}, @code{LP} (@code{PP}, -@code{P}), and @code{RS} reset the indentation to its default value. - -@c --------------------------------------------------------------------- - -@node Man font macros, Miscellaneous man macros, Man usage, man -@subsection Macros to set fonts -@cindex font selection [@code{man}] -@cindex @code{man} macros, how to set fonts - -The standard font is roman; the default text size is 10@tie{}points. If -command-line option @option{-rS=@var{n}} is given, use -@var{n}@tie{}points as the default text size. - -@Defmac {SM, [@Var{text}], man} -Set the text on the same line or the text on the next line in a font -that is one point size smaller than the default font. -@endDefmac - -@Defmac {SB, [@Var{text}], man} -@cindex bold face [@code{man}] -@cindex @code{man} macros, bold face -Set the text on the same line or the text on the next line in bold face -font, one point size smaller than the default font. -@endDefmac - -@Defmac {BI, text, man} -Set its arguments alternately in bold face and italic, without a space -between the arguments. Thus, - -@Example -.BI this "word and" that -@endExample - -@noindent -produces ``thisword andthat'' with ``this'' and ``that'' in bold face, -and ``word and'' in italics. -@endDefmac - -@Defmac {IB, text, man} -Set its arguments alternately in italic and bold face, without a space -between the arguments. -@endDefmac - -@Defmac {RI, text, man} -Set its arguments alternately in roman and italic, without a space -between the arguments. -@endDefmac - -@Defmac {IR, text, man} -Set its arguments alternately in italic and roman, without a space -between the arguments. -@endDefmac - -@Defmac {BR, text, man} -Set its arguments alternately in bold face and roman, without a space -between the arguments. -@endDefmac - -@Defmac {RB, text, man} -Set its arguments alternately in roman and bold face, without a space -between the arguments. -@endDefmac - -@Defmac {B, [@Var{text}], man} -Set @var{text} in bold face. If no text is present on the line where -the macro is called, then the text of the next line appears in bold -face. -@endDefmac - -@Defmac {I, [@Var{text}], man} -@cindex italic fonts [@code{man}] -@cindex @code{man} macros, italic fonts -Set @var{text} in italic. If no text is present on the line where the -macro is called, then the text of the next line appears in italic. -@endDefmac - -@c --------------------------------------------------------------------- - -@node Miscellaneous man macros, Predefined man strings, Man font macros, man -@subsection Miscellaneous macros - -@pindex grohtml -@cindex @code{man} macros, default indentation -@cindex default indentation [@code{man}] -The default indentation is 7.2@dmn{n} in troff mode and 7@dmn{n} in -nroff mode except for @code{grohtml}, which ignores indentation. - -@Defmac {DT, , man} -@cindex tab stops [@code{man}] -@cindex @code{man} macros, tab stops -Set tabs every 0.5@tie{}inches. Since this macro is always executed -during a call to the @code{TH} macro, it makes sense to call it only if -the tab positions have been changed. -@endDefmac - -@Defmac {PD, [@Var{nnn}], man} -@cindex empty space before a paragraph [@code{man}] -@cindex @code{man} macros, empty space before a paragraph -Adjust the empty space before a new paragraph (or section). The -optional argument gives the amount of space (default unit is @samp{v}); -without parameter, the value is reset to its default value (1@tie{}line -in nroff mode, 0.4@dmn{v}@tie{}otherwise). - -This affects the macros @code{SH}, @code{SS}, @code{TP}, @code{LP} (as -well as @code{PP} and @code{P}), @code{IP}, and @code{HP}. -@endDefmac - -The following two macros are included for BSD compatibility. - -@Defmac {AT, [@Var{system} [@Var{release}]], man} -@cindex @code{man}macros, BSD compatibility -Alter the footer for use with @acronym{AT&T} manpages. This command -exists only for compatibility; don't use it. The first argument -@var{system} can be: - -@table @code -@item 3 -7th Edition (the default) - -@item 4 -System III - -@item 5 -System V -@end table - -An optional second argument @var{release} to @code{AT} specifies the -release number (such as ``System V Release 3''). -@endDefmac - -@Defmac {UC, [@Var{version}], man} -@cindex @code{man}macros, BSD compatibility -Alters the footer for use with BSD manpages. This command exists only -for compatibility; don't use it. The argument can be: - -@table @code -@item 3 -3rd Berkeley Distribution (the default) - -@item 4 -4th Berkeley Distribution - -@item 5 -4.2 Berkeley Distribution - -@item 6 -4.3 Berkeley Distribution - -@item 7 -4.4 Berkeley Distribution -@end table -@endDefmac - -@c --------------------------------------------------------------------- - -@node Predefined man strings, Preprocessors in man pages, Miscellaneous man macros, man -@subsection Predefined strings - -The following strings are defined: - -@Defstr {S, man} -Switch back to the default font size. -@endDefstr - -@Defstr {HF, man} -The typeface used for headings. -The default is @samp{B}. -@endDefstr - -@Defstr {R, man} -The `registered' sign. -@endDefstr - -@Defstr {Tm, man} -The `trademark' sign. -@endDefstr - -@DefstrList {lq, man} -@DefstrListEndx {rq, man} -@cindex @code{lq} glyph, and @code{lq} string [@code{man}] -@cindex @code{rq} glyph, and @code{rq} string [@code{man}] -Left and right quote. This is equal to @code{\(lq} and @code{\(rq}, -respectively. -@endDefstr - -@c --------------------------------------------------------------------- - -@node Preprocessors in man pages, Optional man extensions, Predefined man strings, man -@subsection Preprocessors in @file{man} pages - -@cindex preprocessor, calling convention -@cindex calling convention of preprocessors -If a preprocessor like @code{gtbl} or @code{geqn} is needed, it has -become common usage to make the first line of the man page look like -this: - -@Example -'\" @var{word} -@endExample - -@pindex geqn@r{, invocation in manual pages} -@pindex grefer@r{, invocation in manual pages} -@pindex gtbl@r{, invocation in manual pages} -@pindex man@r{, invocation of preprocessors} -@noindent -Note the single space character after the double quote. @var{word} -consists of letters for the needed preprocessors: @samp{e} for -@code{geqn}, @samp{r} for @code{grefer}, @samp{t} for @code{gtbl}. -Modern implementations of the @code{man} program read this first line -and automatically call the right preprocessor(s). - -@c --------------------------------------------------------------------- - -@node Optional man extensions, , Preprocessors in man pages, man -@subsection Optional @file{man} extensions - -@pindex man.local -Use the file @file{man.local} for local extensions to the @code{man} -macros or for style changes. - -@unnumberedsubsubsec Custom headers and footers -@cindex @code{man} macros, custom headers and footers - -In groff versions 1.18.2 and later, you can specify custom headers and -footers by redefining the following macros in @file{man.local}. - -@Defmac {PT, , man} -Control the content of the headers. Normally, the header prints the -command name and section number on either side, and the optional fifth -argument to @code{TH} in the center. -@endDefmac +@Defmac {PT, , man} +Control the content of the headers. Normally, the header prints the +command name and section number on either side, and the optional fifth +argument to @code{TH} in the center. +@endDefmac @Defmac {BT, , man} Control the content of the footers. Normally, the footer prints the page number and the third and fourth arguments to @code{TH}. -Use the @code{FT} number register to specify the footer position. The -default is @minus{}0.5@dmn{i}. +Use the @code{FT} register to specify the footer position. The default +is @minus{}0.5@dmn{i}. @endDefmac @unnumberedsubsubsec Ultrix-specific man macros @@ -2740,7 +2269,8 @@ Print @samp{}. @endDefmac @Defmac {CW, , man} -Print subsequent text using the constant width (Courier) typeface. +Print subsequent text using a ``constant-width'' (monospaced) typeface +(Courier roman). @endDefmac @Defmac {Ds, , man} @@ -2752,7 +2282,7 @@ End a non-filled display started with @code{Ds}. @endDefmac @Defmac {EX, [@Var{indent}], man} -Begin a non-filled display using the constant width (Courier) typeface. +Begin a non-filled display using a monospaced typeface (Courier roman). Use the optional @var{indent} argument to indent the display. @endDefmac @@ -2767,15 +2297,15 @@ Helvetica. @endDefmac @Defmac {GL, [@Var{text}], man} -Set @var{text} in Helvetica Oblique. If no text is present on the line +Set @var{text} in Helvetica oblique. If no text is present on the line where the macro is called, then the text of the next line appears in Helvetica Oblique. @endDefmac @Defmac {HB, [@Var{text}], man} -Set @var{text} in Helvetica Bold. If no text is present on the line +Set @var{text} in Helvetica bold. If no text is present on the line where the macro is called, then all text up to the next @code{HB} -appears in Helvetica Bold. +appears in Helvetica bold. @endDefmac @Defmac {TB, [@Var{text}], man} @@ -2783,9 +2313,9 @@ Identical to @code{HB}. @endDefmac @Defmac {MS, @Var{title} @Var{sect} [@Var{punct}], man} -Set a manpage reference in Ultrix format. The @var{title} is in Courier -instead of italic. Optional punctuation follows the section number -without an intervening space. +Set a man page reference in Ultrix format. The @var{title} is in +Courier instead of italic. Optional punctuation follows the section +number without an intervening space. @endDefmac @Defmac {NT, [@code{C}] [@Var{title}], man} @@ -2801,14 +2331,15 @@ End a note begun with @code{NT}. @endDefmac @Defmac {PN, @Var{path} [@Var{punct}], man} -Set the path name in constant width (Courier), followed by optional -punctuation. +Set the path name in a monospaced typeface (Courier roman), followed by +optional punctuation. @endDefmac @Defmac {Pn, [@Var{punct}] @Var{path} [@Var{punct}], man} If called with two arguments, identical to @code{PN}. If called with -three arguments, set the second argument in constant width (Courier), -bracketed by the first and third arguments in the current font. +three arguments, set the second argument in a monospaced typeface +(Courier roman), bracketed by the first and third arguments in the +current font. @endDefmac @Defmac {R, , man} @@ -2832,13 +2363,13 @@ End printing the change bar begun by @code{VS}. The following example @file{man.local} file alters the @code{SH} macro to add some extra vertical space before printing the heading. Headings -are printed in Helvetica Bold. +are printed in Helvetica bold. @Example .\" Make the heading fonts Helvetica .ds HF HB . -.\" Put more whitespace in front of headings. +.\" Put more space in front of headings. .rn SH SH-orig .de SH . if t .sp (u;\\n[PD]*2) @@ -2849,129 +2380,357 @@ are printed in Helvetica Bold. @c ===================================================================== -@node mdoc, ms, man, Macro Packages +@node mdoc, me, man, Major Macro Packages @section @file{mdoc} @cindex @code{mdoc} macros -@c XXX documentation -@c XXX this is a placeholder until we get stuff knocked into shape -See the @cite{groff_mdoc(7)} man page (type @command{man groff_mdoc} -at the command line). +@code{groff}'s implementation of the BSD @file{doc} package for man +pages is documented in the @cite{groff_mdoc@r{(7)}} man page. Type +@samp{man groff_mdoc} at the command line to view it. @c ===================================================================== -@node ms, me, mdoc, Macro Packages -@section @file{ms} -@cindex @code{ms} macros +@node me, mm, mdoc, Major Macro Packages +@section @file{me} +@cindex @code{me} macro package + +@code{groff}'s implementation of the BSD @file{me} macro package is +documented using itself. A tutorial, @file{meintro.me}, and reference, +@file{meref.me}, are available in @code{groff}'s documentation +directory. A @cite{groff_me@r{(7)}} man page is also available and +identifies the installation path for these documents. Type @samp{man +groff_me} at the command line to view it. -The @file{-ms} macros are suitable for reports, letters, books, user -manuals, and so forth. The package provides macros for cover pages, -section headings, paragraphs, lists, footnotes, pagination, and a table -of contents. +A French translation of the tutorial is available as +@file{meintro_fr.me} and installed parallel to the English version. + + +@c ===================================================================== + +@node mm, mom, me, Major Macro Packages +@section @file{mm} +@cindex @code{mm} macro package + +@code{groff}'s implementation of the @acronym{AT&T} memorandum macro +package is documented in the @cite{groff_mm@r{(7)}} man page. Type +@samp{man groff_mm} at the command line) to view it. + +A Swedish localization of @file{mm} is also available; see +@cite{groff_mmse@r{(7)}}. + + +@c ===================================================================== + +@node mom, ms, mm, Major Macro Packages +@section @file{mom} +@cindex @code{mom} macro package + +The main documentation files for the @file{mom} macros are in +@acronym{HTML} format. Additional, useful documentation is in +@acronym{PDF} format. See the @cite{groff@r{(1)}} man page, section +``Installation Directories'', for their location. + +@itemize @bullet +@item +@file{toc.html} +@noindent +Entry point to the full mom manual. + +@item +@file{macrolist.html} +@noindent +Hyperlinked index of macros with brief descriptions, arranged by +category. + +@item +@file{mom-pdf.pdf} +@noindent +@acronym{PDF} features and usage. +@end itemize + +The mom macros are in active development between @code{groff} releases. +The most recent version, along with up-to-date documentation, is +available at @uref{http://www.schaffter.ca/mom/mom-05.html}. + +The @cite{groff_mom@r{(7)}} man page (type @samp{man groff_mom} at +the command line) contains a partial list of available macros, however +their usage is best understood by consulting the @acronym{HTML} +documentation. + + +@c ===================================================================== + +@codequotebacktick on +@codequoteundirected on + +@node ms, , mom, Major Macro Packages +@section @file{ms} +@cindex @file{ms} macros + +The @file{ms} (``manuscript'') package is suitable for the preparation +of letters, memoranda, reports, and books. These @code{groff} +macros feature cover page and table of contents generation, +automatically numbered headings, several paragraph styles, a variety of +text styling options, footnotes, and multi-column page layouts. +@file{ms} supports the @command{tbl}, @command{eqn}, @command{pic}, and +@command{refer} preprocessors for inclusion of tables, mathematical +equations, diagrams, and standardized bibliographic citations. This +implementation is mostly compatible with the documented interface and +behavior of AT&T Unix Version@tie{}7 @file{ms}. Many extensions from +4.2BSD (Berkeley) +@c Few changes were made in 4.3, Tahoe, Reno, or 4.4. +and Tenth Edition Research Unix have been recreated. @menu -* ms Intro:: -* General ms Structure:: -* ms Document Control Registers:: -* ms Cover Page Macros:: +* ms Introduction:: +* ms Document Structure:: +* ms Document Control Settings:: +* ms Document Description Macros:: * ms Body Text:: * ms Page Layout:: * Differences from AT&T ms:: -* Naming Conventions:: +* ms Legacy Features:: +* ms Naming Conventions:: @end menu @c --------------------------------------------------------------------- -@node ms Intro, General ms Structure, ms, ms -@subsection Introduction to @file{ms} +@node ms Introduction, ms Document Structure, ms, ms +@subsection Introduction -The original @file{-ms} macros were included with @acronym{AT&T} -@code{troff} as well as the @file{man} macros. While the @file{man} -package is intended for brief documents that can be read on-line as well -as printed, the @file{ms} macros are suitable for longer documents that -are meant to be printed rather than read on-line. +The @file{ms} macros are the oldest surviving package for @code{roff} +systems.@footnote{While manual @emph{pages} are older, early ones used +macros supplanted by the @file{man} package of Seventh Edition Unix +(1979). @file{ms} shipped with Sixth Edition (1975) and was documented +by Mike Lesk in a Bell Labs internal memorandum.} While the @file{man} +package was designed for brief reference documents, the @file{ms} macros +are also suitable for longer works intended for printing and possible +publication. -The @file{ms} macro package included with @code{groff} is a complete, -bottom-up re-implementation. Several macros (specific to @acronym{AT&T} -or Berkeley) are not included, while several new commands are. -@xref{Differences from AT&T ms}, for more information. +@menu +* ms basic information:: +@end menu @c --------------------------------------------------------------------- -@node General ms Structure, ms Document Control Registers, ms Intro, ms -@subsection General structure of an @file{ms} document -@cindex @code{ms} macros, general structure +@node ms basic information, ms Document Structure, ms Introduction, ms Introduction +@subsubsection Basic information + +@file{ms} documents are plain text files; prepare them with your +preferred text editor. If you're in a hurry to start, know that +@file{ms} needs one of its macros called at the beginning of a document +so that it can initialize. A @dfn{macro} is a formatting instruction to +@file{ms}. Put a macro call on a line by itself. Use @samp{.PP} if you +want your paragraph's first line to be indented, or @samp{.LP} if you +don't. + +After that, start typing normally. It is a good practice to start each +sentence on a new line, or to put two spaces after sentence-ending +punctuation, so that the formatter knows where the sentence boundaries +are. You can separate paragraphs with further paragraphing macros, or +with blank lines, and you can indent with tabs. When you need one of +the features mentioned earlier (@pxref{ms}), return to this part of the +manual. + +Format the document with the @command{groff} command. @command{nroff} +can be useful for previewing. + +@CartoucheExample +$ editor radical.ms +$ nroff -ww -z -ms radical.ms # check for errors +$ nroff -ms radical.ms | less -R +$ groff -T ps -ms radical.ms > radical.ps +$ see radical.ps +@endCartoucheExample + +Our @file{radical.ms} document might look like this. + +@CartoucheExample +.LP +Radical novelties are so disturbing that they tend to be +suppressed or ignored, to the extent that even the +possibility of their existence in general is more often +denied than admitted. + +@arrow{}That's what Dijkstra said, anyway. +@endCartoucheExample + +@file{ms} exposes many aspects of document layout to user control via +@code{groff}'s @dfn{registers} and @dfn{strings}, which store numbers +and text, respectively. Measurements in @code{groff} are expressed with +a suffix called a @dfn{scaling unit}. + +@table @code +@item i +inches + +@item c +centimeters + +@item p +points (1/72 inch) + +@item P +picas (1/6 inch) + +@item v +vees; current vertical spacing + +@item m +ems; width of an ``M'' in the current font + +@item n +ens; one-half em +@end table + +Set registers with the @code{nr} request and strings with the @code{ds} +request. @dfn{Requests} are like macro calls; they go on lines by +themselves and start with the @dfn{control character}, a dot (@code{.}). +The difference is that they directly instruct the formatter program, +rather than the macro package. We'll discuss a few as applicable. It +is wise to specify a scaling unit when setting any register that +represents a length, size, or distance. + +@CartoucheExample +.nr PS 10.5p \" Use 10.5-point type. +.ds FAM P \" Use Palatino font family. +@endCartoucheExample + +@noindent +In the foregoing, we see that @code{\"} begins a comment. This is an +example of an @dfn{escape sequence}, the other kind of formatting +instruction. Escape sequences can appear anywhere. They begin with the +escape character (@code{\}) and are followed by at least one more +character. @file{ms} documents +@c like this one +tend to use only a few of @code{groff}'s many requests and escape +sequences; see @ref{Request Index} and @ref{Escape Sequence Index} or +the @cite{groff@r{(7)}} man page for complete lists. + +@table @code +@item \" +Begin comment; ignore remainder of line. + +@item \n[@var{reg}] +Interpolate value of register @var{reg}. + +@item \*[@var{str}] +Interpolate contents of string @var{str}. + +@item \*@var{s} +abbreviation of @code{\*[@var{s}]}; the name @var{s} must be only one +character + +@item \[@var{char}] +Interpolate glyph of special character named @var{char}. + +@item \& +dummy character + +@item \~ +Insert an unbreakable space that is adjustable like a normal space. + +@item \| +Move horizontally by one-sixth em (``thin space''). +@end table + +Prefix any words that start with a dot @samp{.} or neutral apostrophe +@samp{'} with @code{\&} if they are at the beginning of an input line +(or might become that way in editing) to prevent them from being +interpreted as macro calls or requests. Suffix @samp{.}, @samp{?}, and +@samp{!} with @code{\&} when needed to cancel end-of-sentence detection. + +@CartoucheExample +My exposure was \&.5 to \&.6 Sv of neutrons, said Dr.\& +Wallace after the criticality incident. +@endCartoucheExample + +@c --------------------------------------------------------------------- -The @file{ms} macro package expects a certain amount of structure, but -not as much as packages such as @file{man} or @file{mdoc}. +@node ms Document Structure, ms Document Control Settings, ms Introduction, ms +@subsection Document Structure +@cindex @file{ms} macros, general structure -The simplest documents can begin with a paragraph macro (such as -@code{LP} or @code{PP}), and consist of text separated by paragraph -macros or even blank lines. Longer documents have a structure as -follows: +The @file{ms} macro package expects a certain amount of structure: +a well-formed document contains at least one paragraphing or heading +macro call. Longer documents have a structure as follows. @table @strong @item Document type -If you invoke the @code{RP} (report) macro on the first line of the -document, @code{groff} prints the cover page information on its own -page; otherwise it prints the information on the first page with your -document text immediately following. Other document formats found in -@acronym{AT&T} @code{troff} are specific to @acronym{AT&T} or Berkeley, -and are not supported in @code{groff}. +Calling the @code{RP} macro at the beginning of your document puts the +document description (see below) on a cover page. Otherwise, @file{ms} +places the information (if any) on the first page, followed immediately +by the body text. Some document types found in other @file{ms} +implementations are specific to @acronym{AT&T} or Berkeley, and are not +supported by @code{groff} @file{ms}. @item Format and layout -By setting number registers, you can change your document's type (font -and size), margins, spacing, headers and footers, and footnotes. -@xref{ms Document Control Registers}, for more details. - -@item Cover page -A cover page consists of a title, the author's name and institution, an -abstract, and the date.@footnote{Actually, only the title is required.} -@xref{ms Cover Page Macros}, for more details. - -@item Body -Following the cover page is your document. You can use the @file{ms} -macros to write reports, letters, books, and so forth. The package is -designed for structured documents, consisting of paragraphs interspersed -with headings and augmented by lists, footnotes, tables, and other -common constructs. @xref{ms Body Text}, for more details. - -@item Table of contents -Longer documents usually include a table of contents, which you can -invoke by placing the @code{TC} macro at the end of your document. The -@file{ms} macros have minimal indexing facilities, consisting of the -@code{IX} macro, which prints an entry on standard error. Printing the -table of contents at the end is necessary since @code{groff} is a -single-pass text formatter, thus it cannot determine the page number of -each section until that section has actually been set and printed. -Since @file{ms} output is intended for hardcopy, you can manually -relocate the pages containing the table of contents between the cover -page and the body text after printing. +By setting registers and strings, you can configure your document's +typeface, margins, spacing, headers and footers, and footnote +arrangement. @xref{ms Document Control Settings}. + +@item Document description +A document description consists of any of: a title, one or more authors' +names and affiliated institutions, an abstract, and a date or other +identifier. @xref{ms Document Description Macros}. + +@item Body text +The main matter of your document follows its description (if any). +@file{ms} supports highly structured text consisting of paragraphs +interspersed with multi-level headings (chapters, sections, subsections, +and so forth) and augmented by lists, footnotes, tables, diagrams, and +similar material. @xref{ms Body Text}. + +@item Tables of contents +Macros enable the collection of entries for a table of contents (or +index) as the material they discuss appears in the document. You then +call a macro to emit the table of contents at the end of your document. +The table of contents must necessarily follow the rest of the text since +GNU @code{troff} is a single-pass formatter; it thus cannot determine +the page number of a division of the text until it has been set and +output. Since @file{ms} was designed for the production of hard copy, +the traditional procedure was to manually relocate the pages containing +the table of contents between the cover page and the body text. Today, +page resequencing is more often done in the digital domain. An index +works similarly, but because it typically needs to be sorted after +collection, its preparation requires separate processing. @end table @c --------------------------------------------------------------------- -@node ms Document Control Registers, ms Cover Page Macros, General ms Structure, ms -@subsection Document control registers -@cindex @code{ms} macros, document control registers +@node ms Document Control Settings, ms Document Description Macros, ms Document Structure, ms +@subsection Document Control Settings +@cindex @file{ms} macros, document control settings -The following is a list of document control number registers. For the -sake of consistency, set registers related to margins at the beginning -of your document, or just after the @code{RP} macro. You can set other -registers later in your document, but you should keep them together at -the beginning to make them easy to find and edit as necessary. +@file{ms} exposes many aspects of document layout to user control via +@code{groff} requests. To use them, you must understand how to define +registers and strings. -@unnumberedsubsubsec Margin Settings +@Defreq {nr, reg value} +Set register @var{reg} to @var{value}. If @var{reg} doesn't exist, GNU +@code{troff} creates it. +@endDefreq + +@Defreq {ds, name contents} +Set string @var{name} to @var{contents}. +@endDefreq + +A list of document control registers and strings follows. For any +parameter whose default is unsatisfactory, define its register or string +before calling any @file{ms} macro other than @code{RP}. + +@unnumberedsubsubsec Margin settings @Defmpreg {PO, ms} -Defines the page offset (i.e., the left margin). There is no explicit -right margin setting; the combination of the @code{PO} and @code{LL} -registers implicitly define the right margin width. +Defines the page offset (i.e., the left margin). +@c not in V6 Effective: next page. -Default value: 1@dmn{i}. +Default: Varies by output device and paper format; 1@dmn{i} is used for +typesetters using U.S.@: letter paper, and zero for terminals. +@xref{Paper Format}. @endDefmpreg @Defmpreg {LL, ms} @@ -2979,20 +2738,25 @@ Defines the line length (i.e., the width of the body text). Effective: next paragraph. -Default: 6@dmn{i}. +Default: Varies by output device and paper format; 6.5@dmn{i} is used +for typesetters using U.S.@: letter paper (@pxref{Paper Format}) and +65@dmn{n} on terminals. @endDefmpreg @Defmpreg {LT, ms} -Defines the title length (i.e., the header and footer width). This -is usually the same as @code{LL}, but not necessarily. +Defines the title line length (i.e., the header and footer width). This +is usually the same as @code{LL}, but need not be. Effective: next paragraph. -Default: 6@dmn{i}. +Default: Varies by output device and paper format; 6.5@dmn{i} is used +for typesetters using U.S.@: letter paper (@pxref{Paper Format}) and +65@dmn{n} on terminals. @endDefmpreg @Defmpreg {HM, ms} Defines the header margin height at the top of the page. +@c not in V6 Effective: next page. @@ -3001,102 +2765,126 @@ Default: 1@dmn{i}. @Defmpreg {FM, ms} Defines the footer margin height at the bottom of the page. +@c not in V6 Effective: next page. Default: 1@dmn{i}. @endDefmpreg -@unnumberedsubsubsec Text Settings +@unnumberedsubsubsec Titles (headers, footers) -@Defmpreg {PS, ms} -Defines the point size of the body text. If the value is larger than or -equal to 1000, divide it by 1000 to get a fractional point size. For -example, @samp{.nr PS 10250} sets the document's point size to -10.25@dmn{p}. +@Defmpstr {LH, ms} +Defines the text displayed in the left header position. -Effective: next paragraph. +Effective: next header. -Default: 10@dmn{p}. -@endDefmpreg +Default: empty. +@endDefmpstr -@Defmpreg {VS, ms} -Defines the space between lines (line height plus leading). If the -value is larger than or equal to 1000, divide it by 1000 to get a -fractional point size. Due to backwards compatibility, @code{VS} must -be smaller than 40000 (this is 40.0@dmn{p}). +@Defmpstr {CH, ms} +Defines the text displayed in the center header position. -Effective: next paragraph. +Effective: next header. -Default: 12@dmn{p}. -@endDefmpreg +Default: @samp{-\n[%]-}. +@endDefmpstr -@Defmpreg {PSINCR, ms} -Defines an increment in point size, which is applied to section headings -at nesting levels below the value specified in @code{GROWPS}. The value -of @code{PSINCR} should be specified in points, with the @dmn{p} scaling -factor, and may include a fractional component; for example, -@w{@samp{.nr PSINCR 1.5p}} sets a point size increment of 1.5@dmn{p}. +@Defmpstr {RH, ms} +Defines the text displayed in the right header position. -Effective: next section heading. +Effective: next header. -Default: 1@dmn{p}. -@endDefmpreg +Default: empty. +@endDefmpstr -@Defmpreg {GROWPS, ms} -Defines the heading level below which the point size increment set by -@code{PSINCR} becomes effective. Section headings at and above the -level specified by @code{GROWPS} are printed at the point size set by -@code{PS}; for each level below the value of @code{GROWPS}, the point -size is increased in steps equal to the value of @code{PSINCR}. Setting -@code{GROWPS} to any value less than@tie{}2 disables the incremental -heading size feature. +@Defmpstr {LF, ms} +Defines the text displayed in the left footer position. -Effective: next section heading. +Effective: next footer. -Default: 0. -@endDefmpreg +Default: empty. +@endDefmpstr -@Defmpreg {HY, ms} -Defines the hyphenation level. @code{HY} sets safely the value of the -low-level @code{hy} register. Setting the value of @code{HY} to@tie{}0 -is equivalent to using the @code{nh} request. +@Defmpstr {CF, ms} +Defines the text displayed in the center footer position. -Effective: next paragraph. +Effective: next footer. -Default: 6. -@endDefmpreg +Default: empty. +@endDefmpstr -@Defmpreg {FAM, ms} -Defines the font family used to typeset the document. +@Defmpstr {RF, ms} +Defines the text displayed in the right footer position. -Effective: next paragraph. +Effective: next footer. -Default: as defined in the output device. -@endDefmpreg +Default: empty. +@endDefmpstr -@unnumberedsubsubsec Paragraph Settings +@unnumberedsubsubsec Text settings -@Defmpreg {PI, ms} -Defines the initial indentation of a (@code{PP} macro) paragraph. +@Defmpreg {PS, ms} +Defines the type size of the body text. Effective: next paragraph. -Default: 5@dmn{n}. +Default: 10@dmn{p}. @endDefmpreg -@Defmpreg {PD, ms} -Defines the space between paragraphs. +@Defmpreg {VS, ms} +Defines the vertical spacing (type size plus leading). Effective: next paragraph. -Default: 0.3@dmn{v}. +Default: 12@dmn{p}. +@endDefmpreg + +@Defmpreg {HY, ms} +Defines the automatic hyphenation mode used with the @code{hy} request. +Setting @code{HY} to@tie{}0 is equivalent to using the @code{nh} +request. This is a Tenth Edition Research Unix extension. +@c possibly 9th, but definitely not Berkeley + +Effective: next paragraph. + +Default: 6. +@endDefmpreg + +@Defmpstr {FAM, ms} +Defines the font family used to typeset the document. This is a GNU +extension. + +Effective: next paragraph. + +Default: defined by the output device; often @samp{T} (@pxref{ms Body +Text}) +@endDefmpstr + +@unnumberedsubsubsec Paragraph settings + +@Defmpreg {PI, ms} +Defines the indentation amount used by the @code{PP}, @code{IP} (unless +overridden by an optional argument), @code{XP}, and @code{RS} macros. +@c not in V6 + +Effective: next paragraph. + +Default: 5@dmn{n}. +@endDefmpreg + +@Defmpreg {PD, ms} +Defines the space between paragraphs. +@c not in V6 + +Effective: next paragraph. + +Default: 0.3@dmn{v} (1@dmn{v} on low-resolution devices). @endDefmpreg @Defmpreg {QI, ms} -Defines the indentation on both sides of a quoted (@code{QP}, -@code{QS}, and @code{QE} macros) -paragraph. +Defines the indentation amount used on both sides of a paragraph set +with the @code{QP} or between the @code{QS} and @code{QE} macros. Effective: next paragraph. @@ -3104,44 +2892,72 @@ Default: 5@dmn{n}. @endDefmpreg @Defmpreg {PORPHANS, ms} -Defines the minimum number of initial lines of any paragraph that -should be kept together, to avoid orphan lines at the bottom of a page. -If a new paragraph is started close to the bottom of a page, and there -is insufficient space to accommodate @code{PORPHANS} lines before an -automatic page break, then the page break is forced, before the start of -the paragraph. +Defines the minimum number of initial lines of any paragraph that must +be kept together to avoid isolated lines at the bottom of a page. If a +new paragraph is started close to the bottom of a page, and there is +insufficient space to accommodate @code{PORPHANS} lines before an +automatic page break, then a page break is forced before the start of +the paragraph. This is a GNU extension. Effective: next paragraph. Default: 1. @endDefmpreg +@unnumberedsubsubsec Heading settings + +@Defmpreg {PSINCR, ms} +Defines an increment in type size to be applied to a heading at a +lesser depth than that specified in @code{GROWPS}. The value of +@code{PSINCR} should be specified in points with the @dmn{p} scaling +unit and may include a fractional component; for example, @w{@samp{.nr +PSINCR 1.5p}} sets a type size increment of 1.5@dmn{p}. This is a GNU +extension. + +Effective: next heading. + +Default: 1@dmn{p}. +@endDefmpreg + +@Defmpreg {GROWPS, ms} +Defines the heading depth above which the type size increment set by +@code{PSINCR} becomes effective. For each heading depth less than the +value of @code{GROWPS}, the type size is increased by @code{PSINCR}. +Setting @code{GROWPS} to any value less than@tie{}2 disables the +incremental heading size feature. This is a GNU extension. + +Effective: next heading. + +Default: 0. +@endDefmpreg + @Defmpreg {HORPHANS, ms} -Defines the minimum number of lines of the following paragraph that -should be kept together with any section heading introduced by the -@code{NH} or @code{SH} macros. If a section heading is placed close to -the bottom of a page, and there is insufficient space to accommodate -both the heading and at least @code{HORPHANS} lines of the following +Defines the minimum number of lines of an immediately succeeding +paragraph that should be kept together with any heading introduced by +the @code{NH} or @code{SH} macros. If a heading is placed close to the +bottom of a page, and there is insufficient space to accommodate both +the heading and at least @code{HORPHANS} lines of the following paragraph, before an automatic page break, then the page break is forced -before the heading. +before the heading. This is a GNU extension. Effective: next paragraph. Default: 1. @endDefmpreg -@unnumberedsubsubsec Footnote Settings +@Defmpstr {SN-STYLE, ms} +Defines the style used to print numbered headings. @xref{Headings in +ms}. This is a GNU extension. -@Defmpreg {FL, ms} -Defines the length of a footnote. +Effective: next heading. -Effective: next footnote. +Default: alias of @code{SN-DOT} +@endDefmpstr -Default: @math{@code{@\n[LL]} * 5 / 6}. -@endDefmpreg +@unnumberedsubsubsec Footnote settings @Defmpreg {FI, ms} -Defines the footnote indentation. +Defines the footnote indentation. This is a Berkeley extension. Effective: next footnote. @@ -3149,21 +2965,27 @@ Default: 2@dmn{n}. @endDefmpreg @Defmpreg {FF, ms} -The footnote format: +Defines the format of automatically numbered footnotes, +and those for which the @code{FS} request is given a marker argument, at +the bottom of a column or page. This is a Berkeley extension. @table @code @item 0 -Print the footnote number as a superscript; indent the footnote -(default). +Set an automatic number@footnote{defined in @ref{ms Footnotes}} as a +superscript (on typesetter devices) or surrounded by square brackets (on +terminals). The footnote paragraph is indented as with @code{PP} if +there is an @code{FS} argument or an automatic number, and as with +@code{LP} otherwise. This is the default. @item 1 -Print the number followed by a period (like 1.@:) and indent the -footnote. +As @code{0}, but set the marker as regular text and follow an +automatic number with a period. @item 2 -Like 1, without an indentation. +As @code{1}, but without indentation (like @code{LP}). @item 3 -Like 1, but print the footnote number as a hanging paragraph. +As @code{1}, but set the footnote paragraph with the marker hanging +(like @code{IP}). @end table Effective: next footnote. @@ -3172,131 +2994,173 @@ Default: 0. @endDefmpreg @Defmpreg {FPS, ms} -Defines the footnote point size. If the value is larger than or equal -to 1000, divide it by 1000 to get a fractional point size. +Defines the footnote type size. Effective: next footnote. -Default: @math{@code{@\n[PS]} - 2}. +Default: @code{\n[PS] - 2p}. @endDefmpreg @Defmpreg {FVS, ms} -Defines the footnote vertical spacing. If the value is larger than or -equal to 1000, divide it by 1000 to get a fractional point size. +Defines the footnote vertical spacing. Effective: next footnote. -Default: @math{@code{@\n[FPS]} + 2}. +Default: @code{\n[FPS] + 2p}. @endDefmpreg @Defmpreg {FPD, ms} -Defines the footnote paragraph spacing. +Defines the footnote paragraph spacing. This is a GNU extension. Effective: next footnote. -Default: @math{@code{@\n[PD]} / 2}. +Default: @code{\n[PD] / 2}. @endDefmpreg -@unnumberedsubsubsec Miscellaneous Number Registers +@Defmpstr {FR, ms} +Defines the ratio of the footnote line length to the current line +length. This is a GNU extension. -@Defmpreg {MINGW, ms} -Defines the minimum width between columns in a multi-column document. +Effective: next footnote in single-column arrangements, next page +otherwise. -Effective: next page. +Default: @code{11/12}. +@endDefmpstr -Default: 2@dmn{n}. -@endDefmpreg +@unnumberedsubsubsec Display settings @Defmpreg {DD, ms} -Sets the vertical spacing before and after a display, a @code{tbl} table, an -@code{eqn} equation, or a @code{pic} image. +Sets the display distance---the vertical spacing before and after a +display, a @code{tbl} table, an @code{eqn} equation, or a @code{pic} +image. This is a Berkeley extension. -Effective: next paragraph. +Effective: next display boundary. -Default: 0.5@dmn{v}. +Default: 0.5@dmn{v} (1@dmn{v} on low-resolution devices). @endDefmpreg -@c --------------------------------------------------------------------- +@Defmpreg {DI, ms} +Sets the default amount by which to indent a display started with +@code{DS} and @code{ID} without arguments, to @samp{.DS@tie{}I} without +an indentation argument, and to equations set with @samp{.EQ@tie{}I}. +This is a GNU extension. -@node ms Cover Page Macros, ms Body Text, ms Document Control Registers, ms -@subsection Cover page macros -@cindex @code{ms} macros, cover page -@cindex cover page macros, [@code{ms}] +Effective: next indented display. -Use the following macros to create a cover page for your document in the -order shown. +Default: 0.5@dmn{i}. +@endDefmpreg -@Defmac {RP, [@code{no}], ms} -Specifies the report format for your document. The report format -creates a separate cover page. The default action (no @code{RP} macro) -is to print a subset of the cover page on page@tie{}1 of your document. +@unnumberedsubsubsec Other settings -If you use the word @code{no} as an optional argument, @code{groff} -prints a title page but does not repeat any of the title page -information (title, author, abstract, etc.@:) on page@tie{}1 of the -document. -@endDefmac +@Defmpreg {MINGW, ms} +Defines the default minimum width between columns in a multi-column +document. This is a GNU extension. -@Defmac {P1, , ms} -(P-one) Prints the header on page@tie{}1. The default is to suppress -the header. -@endDefmac +Effective: next page. -@Defmac {DA, [@dots{}], ms} -(optional) Prints the current date, or the arguments to the macro if -any, on the title page (if specified) and in the footers. This is the -default for @code{nroff}. -@endDefmac +Default: 2@dmn{n}. +@endDefmpreg + +@Defmpreg {TC-MARGIN, ms} +Defines the width of the field in which page numbers are set in a table +of contents entry; the right margin thus moves inboard by this amount. +This is a GNU extension. + +Effective: next @code{PX} call. + +Default: @code{\w'000'} +@endDefmpreg -@Defmac {ND, [@dots{}], ms} -(optional) Prints the current date, or the arguments to the macro if -any, on the title page (if specified) but not in the footers. This is -the default for @code{troff}. +@c XXX: Normally we'd have an entry for TC-LEADER here, but it's a +@c special character and we have no custom Texinfo macros for defining +@c (and indexing) these. There would be little point in an index for +@c one item, and the plan is to drop this entire @section from this +@c manual once doc/ms.ms is ready. See Savannah #60061. + +@c --------------------------------------------------------------------- + +@node ms Document Description Macros, ms Body Text, ms Document Control Settings, ms +@subsection Document Description Macros +@cindex @file{ms} macros, document description +@cindex document description macros, [@file{ms}] + +Only the simplest document lacks a title.@footnote{Distinguish a +document title from ``titles'', which are what @code{roff} systems call +headers and footers collectively.} As its level of sophistication (or +complexity) increases, it tends to acquire a date of revision, +explicitly identified authors, sponsoring institutions for authors, and, +at the rarefied heights, an abstract of its content. Define these +data by calling the macros below in the order shown; @code{DA} or +@code{ND} can be called to set the document date (or other identifier) +at any time before (a) the abstract, if present, or (b) its information +is required in a header or footer. Use of these macros is optional, +except that @code{TL} is mandatory if any of @code{RP}, @code{AU}, +@code{AI}, or @code{AB} is called, and @code{AE} is mandatory if +@code{AB} is called. + +@Defmac {RP, [@code{no-repeat-info}] [@code{no-renumber}], ms} +Use the ``report'' (@acronym{AT&T}: ``released paper'') format for your +document, creating a separate cover page. The default arrangement is to +place most of the document description (title, author names and +institutions, and abstract, but not the date) at the top of the first +page. If the optional @code{no-repeat-info} argument is given, +@file{ms} produces a cover page but does not repeat any of its +information subsequently (but see the @code{DA} macro below regarding +the date). Normally, @code{RP} sets the page number following the cover +page to@tie{}1. Specifying the optional @code{no-renumber} argument +suppresses this alteration. Optional arguments can occur in any order. +@code{no} is recognized as a synonym of @code{no-repeat-info} for +@code{AT&T} compatibility. @endDefmac @Defmac {TL, , ms} -Specifies the document title. @code{groff} collects text following the -@code{TL} macro into the title, until reaching the author name or -abstract. +Specify the document title. @file{ms} collects text on input lines +following this call into the title until reaching @code{AU}, @code{AB}, +or a heading or paragraphing macro call. @endDefmac @Defmac {AU, , ms} -Specifies the author's name, which appears on the line (or lines) -immediately following. You can specify multiple authors as follows: +Specify an author's name. @file{ms} collects text on input lines +following this call into the author's name until reaching @code{AI}, +@code{AB}, another @code{AU}, or a heading or paragraphing macro call. +Call it repeatedly to specify multiple authors. +@endDefmac -@Example -.AU -John Doe -.AI -University of West Bumblefuzz -.AU -Martha Buck -.AI -Monolithic Corporation +@Defmac {AI, , ms} +Specify the preceding author's institution. An @code{AU} call is +usefully followed by at most one @code{AI} call; if there are more, the +last @code{AI} call controls. @file{ms} collects text on input lines +following this call into the author's institution until reaching +@code{AU}, @code{AB}, or a heading or paragraphing macro call. +@endDefmac -... -@endExample +@Defmac {DA, [@Var{x} @dots{}], ms} +Typeset the current date, or any arguments @var{x}, in the center +footer, and, if @code{RP} is also called, left-aligned at the end of the +description information on the cover page. @endDefmac -@Defmac {AI, , ms} -Specifies the author's institution. You can specify multiple -institutions in the same way that you specify multiple authors. +@Defmac {ND, [@Var{x} @dots{}], ms} +Typeset the current date, or any arguments @var{x}, if @code{RP} is also +called, left-aligned at the end of the document description on the cover +page. This is @code{groff} @file{ms}'s default. @endDefmac @Defmac {AB, [@code{no}], ms} -Begins the abstract. The default is to print the word -@acronym{ABSTRACT}, centered and in italics, above the text of the -abstract. The word @code{no} as an optional argument suppresses this -heading. +Begin the abstract. @file{ms} collects text on input lines following +this call into the abstract until reaching an @code{AE} call. By +default, @file{ms} places the word ``ABSTRACT'' centered and in italics +above the text of the abstract. The optional argument @code{no} +suppresses this heading. @endDefmac @Defmac {AE, , ms} -Ends the abstract. +End the abstract. @endDefmac -The following is example mark-up for a title page. -@cindex title page, example markup -@cindex example markup, title page +An example document description, using a cover page, follows. +@cindex cover page in [@file{ms}], example markup +@cindex example markup, cover page in [@file{ms}] @CartoucheExample .RP @@ -3304,362 +3168,516 @@ The following is example mark-up for a title page. The Inevitability of Code Bloat in Commercial and Free Software .AU -J. Random Luser +J.\& Random Luser .AI University of West Bumblefuzz .AB -This report examines the long-term growth -of the code bases in two large, popular software -packages; the free Emacs and the commercial -Microsoft Word. -While differences appear in the type or order -of features added, due to the different -methodologies used, the results are the same -in the end. +This report examines the long-term growth of the code +bases in two large, +popular software packages; +the free Emacs and the commercial Microsoft Word. +While differences appear in the type or order of +features added, +due to the different methodologies used, +the results are the same in the end. .PP -The free software approach is shown to be -superior in that while free software can -become as bloated as commercial offerings, -free software tends to have fewer serious -bugs and the added features are in line with -user demand. +The free software approach is shown to be superior in +that while free software can become as bloated as +commercial offerings, +free software tends to have fewer serious bugs and the +added features are more in line with user demand. .AE -... the rest of the paper follows ... +@r{@dots{}the rest of the paper@dots{}} @endCartoucheExample @c --------------------------------------------------------------------- -@node ms Body Text, ms Page Layout, ms Cover Page Macros, ms -@subsection Body text -@cindex @code{ms} macros, body text +@node ms Body Text, ms Page Layout, ms Document Description Macros, ms +@subsection Body Text +@cindex @file{ms} macros, body text -This section describes macros used to mark up the body of your document. -Examples include paragraphs, sections, and other groups. +A variety of macros, registers, and strings can be used to structure and +style the body of your document. They organize your text into +paragraphs, headings, footnotes, and inclusions of material such as +tables and figures. @menu +* Text settings in ms:: +* Typographical symbols in ms:: * Paragraphs in ms:: * Headings in ms:: -* Highlighting in ms:: +* Typeface and decoration:: * Lists in ms:: -* Indentation values in ms:: -* Tabstops in ms:: -* ms Displays and Keeps:: +* Indented regions in ms:: +* ms keeps and displays:: * ms Insertions:: -* Example multi-page table:: * ms Footnotes:: +* ms language and localization:: @end menu @c --------------------------------------------------------------------- -@node Paragraphs in ms, Headings in ms, ms Body Text, ms Body Text +@node Text settings in ms, Typographical symbols in ms, ms Body Text, ms Body Text +@subsubsection Text settings +@cindex @file{ms} macros, text settings + +The @code{FAM} string, a GNU extension, sets the font family for body +text; the default is @samp{T}. The @code{PS} and @code{VS} registers +set the type size and vertical spacing (distance between text +baselines), respectively. The font family and type size are ignored on +terminal devices. Setting these parameters before the first call of a +heading, paragraphing, or (non-date) document description macro also +applies them to headers, footers, and (for @code{FAM}) footnotes. + +Which font families are available depends on the output device; as a +convention, @code{T} selects a serif family (``Times''), @code{H} a +sans-serif family (``Helvetica''), and @code{C} a monospaced family +(``Courier''). The man page for the output driver documents its font +repertoire. Consult the @cite{groff@r{(1)}} man page for lists of +available output devices and their drivers. + +The hyphenation mode (as used by the @code{hy} request) is set from the +@code{HY} register. Setting @code{HY} to @samp{0} is equivalent to +using the @code{nh} request. This is a Tenth Edition Research Unix +extension. + +@c --------------------------------------------------------------------- + +@node Typographical symbols in ms, Paragraphs in ms, Text settings in ms, ms Body Text +@subsubsection Typographical symbols +@cindex @file{ms} macros, obtaining typographical symbols + +@file{ms} provides a few strings to obtain typographical symbols not +easily entered with the keyboard. These and many others are available +as special character escape sequences---see the @cite{groff_char@r{(7)}} +man page. + +@Defmpstr {-, ms} +Interpolate an em dash. +@endDefmpstr + +@DefmpstrList {Q, ms} +@DefmpstrListEndx {U, ms} +Interpolate typographer's quotation marks where available, and neutral +double quotes otherwise. @code{\*Q} is the left quote and @code{\*U} +the right. +@endDefmpstr + +@c --------------------------------------------------------------------- + +@node Paragraphs in ms, Headings in ms, Typographical symbols in ms, ms Body Text @subsubsection Paragraphs -@cindex @code{ms} macros, paragraph handling +@cindex @file{ms} macros, paragraph handling + +Paragraphing macros @dfn{break}, or terminate, any pending output line +so that a new paragraph can begin. Several paragraph types are +available, differing in how indentation applies to them: to left, right, +or both margins; to the first output line of the paragraph, all output +lines, or all but the first. All paragraphing macro calls cause the +insertion of vertical space in the amount stored in the @code{PD} +register, except at page or column breaks. Alternatively, a blank input +line breaks the output line and vertically spaces by one vee. -The following paragraph types are available. +@Defmac {LP, , ms} +Set a paragraph without any (additional) indentation. +@endDefmac @Defmac {PP, , ms} -Sets a paragraph with an initial indentation. +Set a paragraph with a first-line left indentation in the amount stored +in the @code{PI} register. @endDefmac -@Defmac {LP, , ms} -Sets a paragraph without an initial indentation. +@Defmac {IP, [@Var{marker} [@Var{width}]], ms} +Set a paragraph with a left indentation. The optional @var{marker} is +not indented and is empty by default. It has several applications; +see @ref{Lists in ms}. @var{width} overrides the indentation amount +stored in the @code{PI} register; its default unit is @samp{n}. Once +specified, @var{width} applies to further @code{IP} calls until +specified again or a heading or different paragraphing macro is called. @endDefmac @Defmac {QP, , ms} -Sets a paragraph that is indented at both left and right margins -by the amount of the register @code{QI}. -The effect is identical to the @acronym{HTML} @code{

    } element. -The next paragraph or heading returns margins to normal. -@code{QP} inserts vertical space of amount set by register @code{PD} -before the paragraph. +Set a paragraph indented from both left and right margins by the amount +stored in the @code{QI} register. @endDefmac @DefmacList {QS, , ms} @DefmacListEndx {QE, , ms} -These macros begin and end a quoted section. -The @code{QI} register -controls the amount of indentation. -Both @code{QS} and @code{QE} insert inter-paragraph vertical space -set by register @code{PD}. -The text between @code{QS} and @code{QE} can be structured further -by use of the macros @code{LP} or @code{PP}. +Begin (@code{QS}) and end (@code{QE}) a region where each paragraph is +indented from both margins by the amount stored in the @code{QI} +register. The text between @code{QS} and @code{QE} can be structured +further by use of other paragraphing macros. @endDefmac @Defmac {XP, , ms} -Sets a paragraph whose lines are indented, except for the first line. -This is a Berkeley extension. +Set an ``exdented'' paragraph---one with a left indentation in the +amount stored in the @code{PI} register on every line @emph{except} the +first (also known as a hanging indent). This is a Berkeley extension. @endDefmac -The following markup uses all four paragraph macros. +The following example illustrates the use of paragraphing macros. @CartoucheExample .NH 2 -Cases used in the study +Cases used in the 2001 study .LP -The following software and versions were -considered for this report. -.PP -For commercial software, we chose -.B "Microsoft Word for Windows" , -starting with version 1.0 through the -current version (Word 2000). +Two software releases were considered for this report. .PP -For free software, we chose -.B Emacs , -from its first appearance as a standalone -editor through the current version (v20). +The first is commercial software; +the second is free. +.IP \[bu] +Microsoft Word for Windows, +starting with version 1.0 through the current version +(Word 2000). +.IP \[bu] +GNU Emacs, +from its first appearance as a standalone editor through +the current version (v20). See [Bloggs 2002] for details. .QP Franklin's Law applied to software: -software expands to outgrow both -RAM and disk space over time. -.LP -Bibliography: +software expands to outgrow both RAM and disk space over +time. +.SH +Bibliography .XP Bloggs, Joseph R., .I "Everyone's a Critic" , Underground Press, March 2002. -A definitive work that answers all questions -and criticisms about the quality and usability of -free software. +A definitive work that answers all questions and +criticisms about the quality and usability of free +software. @endCartoucheExample -The @code{PORPHANS} register (@pxref{ms Document Control Registers}) -operates in conjunction with each of these macros, to inhibit the -printing of orphan lines at the bottom of any page. - @c --------------------------------------------------------------------- -@node Headings in ms, Highlighting in ms, Paragraphs in ms, ms Body Text +@node Headings in ms, Typeface and decoration, Paragraphs in ms, ms Body Text @subsubsection Headings -@cindex @code{ms} macros, headings - -Use headings to create a hierarchical structure for your document. The -@file{ms} macros print headings in @strong{bold}, using the same font -family and point size as the body text. - -The following describes the heading macros: - -@DefmacList {NH, @Var{curr-level}, ms} -@DefmacListEnd {NH, @t{S} @Var{level0} @dots{}, ms} -Numbered heading. The argument is either a numeric argument to indicate -the level of the heading, or the letter@tie{}@code{S} followed by -numeric arguments to set the heading level explicitly. - -If you specify heading levels out of sequence, such as invoking -@samp{.NH 3} after @samp{.NH 1}, @code{groff} prints a warning on -standard error. +@cindex @file{ms} macros, headings + +Use headings to create a sequential or hierarchical structure for your +document. The @file{ms} macros print headings in @strong{bold} using +the same font family and, by default, type size as the body text. +Headings are available with and without automatic numbering. Text on +input lines following the macro call becomes the heading's title. Call +a paragraphing macro to end the heading text and start the section's +content. + +@DefmacList {NH, [@Var{depth}], ms} +@DefmacListEnd {NH, @t{S} @Var{heading-depth-index} @dots{}, ms} +Set an automatically numbered heading. + +@file{ms} produces a numbered heading the form @var{a.b.c@dots{}}, to +any depth desired, with the numbering of each depth increasing +automatically and being reset to zero when a more significant level is +increased. ``1''@tie{}is the most significant or coarsest division of +the document. Only non-zero values are output. If @var{depth} is +omitted, it is taken to be @samp{1}. + +If you specify @var{depth} such that an ascending gap occurs relative to +the previous @code{NH} call---that is, you ``skip a depth'', as by +@samp{.NH 1} and then @samp{.NH 3}---@code{groff} @file{ms} emits a +warning on the standard error stream. + +Alternatively, you can give @code{NH} a first argument of@tie{}@code{S}, +followed by integers to number the heading depths explicitly. Further +automatic numbering, if used, resumes using the specified indices as +their predecessors. +@c Although undocumented in Tuthill's 4.2BSD ms.diffs paper... +This feature is a Berkeley extension. @endDefmac -@DefstrList {SN, ms} -@DefstrItemx {SN-DOT, ms} -@DefstrListEndx {SN-NO-DOT, ms} -After invocation of @code{NH}, the assigned section number is made -available in the strings @code{SN-DOT} (as it appears in a printed -section heading with default formatting, followed by a terminating -period), and @code{SN-NO-DOT} (with the terminating period omitted). -The string @code{SN} is also defined, as an alias for @code{SN-DOT}; if -preferred, you may redefine it as an alias for @code{SN-NO-DOT}, by -including the initialization -@Example -.als SN SN-NO-DOT -@endExample +An example may be illustrative. -@noindent -at any time @strong{before} you would like the change to take effect. -@endDefstr +@CartoucheExample +.NH 1 +Animalia +.NH 2 +Arthropoda +.NH 3 +Crustacea +.NH 2 +Chordata +.NH S 6 6 6 +Daimonia +.NH 1 +Plantae +@endCartoucheExample -@Defstr {SN-STYLE, ms} -You may control the style used to print section numbers, within numbered -section headings, by defining an appropriate alias for the string -@code{SN-STYLE}. The default style, in which the printed section number -is followed by a terminating period, is obtained by defining the alias +The above results in numbering as follows; the vertical space that +normally precedes each heading is omitted. @Example -.als SN-STYLE SN-DOT +1. Animalia +1.1. Arthropoda +1.1.1. Crustacea +1.2. Chordata +6.6.6. Daimonia +7. Plantae @endExample -@noindent -If you prefer to omit the terminating period, from section numbers -appearing in numbered section headings, you may define the alias +@DefmpstrList {SN-STYLE, ms} +@DefmpstrItemx {SN-DOT, ms} +@DefmpstrItemx {SN-NO-DOT, ms} +@DefmpstrListEndx {SN, ms} +After @code{NH} is called, the assigned number is made available in the +strings @code{SN-DOT} (as it appears in a printed heading with default +formatting, followed by a terminating period) and @code{SN-NO-DOT} (with +the terminating period omitted). These are GNU extensions. + +You can control the style used to print numbered headings by defining an +appropriate alias for the string @code{SN-STYLE}. By default, +@code{SN-STYLE} is aliased to @code{SN-DOT}. If you prefer to omit the +terminating period from numbers appearing in numbered headings, you may +define the alias as follows. @Example .als SN-STYLE SN-NO-DOT @endExample @noindent -Any such change in section numbering style becomes effective from the -next use of @code{.NH}, following redefinition of the alias for -@code{SN-STYLE}. -@endDefstr - -@Defmac {SH, [@Var{match-level}], ms} -Unnumbered subheading. - -The optional @var{match-level} argument is a GNU extension. It is a -number indicating the level of the heading, in a manner analogous to the -@var{curr-level} argument to @code{.NH}. Its purpose is to match the -point size, at which the heading is printed, to the size of a numbered -heading at the same level, when the @code{GROWPS} and @code{PSINCR} -heading size adjustment mechanism is in effect. @xref{ms Document -Control Registers}. +Any such change in numbering style becomes effective from the next use +of @code{NH} following redefinition of the alias for @code{SN-STYLE}. +The formatted number of the current heading is available in the +@code{SN} string (a feature first documented by Berkeley), which +facilitates its inclusion in, for example, table captions, equation +labels, and @code{XS}/@code{XA}/@code{XE} table of contents entries. +@endDefmpstr + +@Defmac {SH, [@Var{depth}], ms} +Set an unnumbered heading. + +The optional @var{depth} argument is a GNU extension indicating the +heading depth corresponding to the @var{depth} argument of @code{NH}. +It matches the type size at which the heading is set to that of a +numbered heading at the same depth when the @code{GROWPS} and +@code{PSINCR} heading size adjustment mechanism is in effect. @endDefmac -The @code{HORPHANS} register (@pxref{ms Document Control Registers}) -operates in conjunction with the @code{NH} and @code{SH} macros, to -inhibit the printing of orphaned section headings at the bottom of any -page. - -@c --------------------------------------------------------------------- - -@node Highlighting in ms, Lists in ms, Headings in ms, ms Body Text -@subsubsection Highlighting -@cindex @code{ms} macros, highlighting - -The @file{ms} macros provide a variety of methods to highlight or -emphasize text: +If the @code{GROWPS} register is set to a value greater than the +@var{level} argument to @code{NH} or @code{SH}, the type size of a +heading produced by these macros increases by @code{PSINCR} units over +the size specified by @code{PS} multiplied by the difference of +@code{GROWPS} and @var{level}. The value stored in @code{PSINCR} is +interpreted in @code{groff} basic units; the @code{p} scaling unit +should be employed when assigning a value specified in points. For +example, the sequence -@Defmac {B, [@Var{txt} [@Var{post} [@Var{pre}]]], ms} -Sets its first argument in @strong{bold type}. If you specify a second -argument, @code{groff} prints it in the previous font after the bold -text, with no intervening space (this allows you to set punctuation -after the highlighted text without highlighting the punctuation). -Similarly, it prints the third argument (if any) in the previous font -@strong{before} the first argument. For example, +@CartoucheExample +.nr PS 10 +.nr GROWPS 3 +.nr PSINCR 1.5p +.NH 1 +Carnivora +.NH 2 +Felinae +.NH 3 +Felis catus +.SH 2 +Machairodontinae +@endCartoucheExample -@Example -.B foo ) ( -@endExample +@noindent +will cause ``1. Carnivora'' to be printed in 13-point text, followed by +``1.1. Felinae'' in 11.5-point text, while ``1.1.1. Felis catus'' and +all more deeply nested heading levels will remain in the 10-point text +specified by the @code{PS} register. ``Machairodontinae'' is printed at +11.5 points, since it corresponds to heading level@tie{}2. + +The @code{HORPHANS} register operates in conjunction with the @code{NH} +and @code{SH} macros to inhibit the printing of isolated headings at the +bottom of a page; it specifies the minimum number of lines of an +immediately subsequent paragraph that must be kept on the same page as +the heading. If insufficient space remains on the current page to +accommodate the heading and this number of lines of paragraph text, a +page break is forced before the heading is printed. Any display macro +call or @code{tbl}, @code{pic}, or @code{eqn} region between the heading +and the subsequent paragraph suppresses this grouping. @xref{ms keeps +and displays} and @ref{ms Insertions}. -prints (@strong{foo}). +@c --------------------------------------------------------------------- -If you give this macro no arguments, @code{groff} prints all text -following in bold until the next highlighting, paragraph, or heading -macro. +@node Typeface and decoration, Lists in ms, Headings in ms, ms Body Text +@subsubsection Typeface and decoration + +The @file{ms} macros provide a variety of ways to style text. +Attend closely to the ordering of arguments labeled @var{pre} and +@var{post}, which is not intuitive. Support for @var{pre} +arguments is a GNU extension.@footnote{This idiosyncrasy arose through +feature accretion; for example, the @code{B} macro in Version@tie{}6 +Unix @file{ms} (1975) accepted only one argument, the text to be set in +boldface. By Version@tie{}7 (1979) it recognized a second argument; in +1990, @code{groff} @file{ms} added a ``pre'' argument, placing it third +to avoid breaking support for older documents.} + +@Defmac {B, [@Var{text} [@Var{post} [@Var{pre}]]], ms} +Style @var{text} in @b{bold}, followed by @var{post} in the previous +font style without intervening space, and preceded by @var{pre} +similarly. Without arguments, @file{ms} styles subsequent text in bold +until the next paragraphing, heading, or no-argument typeface macro +call. @endDefmac -@Defmac {R, [@Var{txt} [@Var{post} [@Var{pre}]]], ms} -Sets its first argument in roman (or regular) type. It operates -similarly to the @code{B}@tie{}macro otherwise. +@Defmac {R, [@Var{text} [@Var{post} [@Var{pre}]]], ms} +As @code{B}, but use the roman style (upright text of normal weight) +instead of bold. Argument recognition is a GNU extension. @endDefmac -@Defmac {I, [@Var{txt} [@Var{post} [@Var{pre}]]], ms} -Sets its first argument in @emph{italic type}. It operates similarly -to the @code{B}@tie{}macro otherwise. +@Defmac {I, [@Var{text} [@Var{post} [@Var{pre}]]], ms} +As @code{B}, but use an @i{italic} or oblique style instead of bold. @endDefmac -@Defmac {CW, [@Var{txt} [@Var{post} [@Var{pre}]]], ms} -Sets its first argument in a @code{constant width face}. It operates -similarly to the @code{B}@tie{}macro otherwise. +@Defmac {BI, [@Var{text} [@Var{post} [@Var{pre}]]], ms} +As @code{B}, but use a bold italic or bold oblique style instead of +upright bold. This is a Tenth Edition Research Unix extension. +@c possibly 9th, but definitely not Berkeley @endDefmac -@Defmac {BI, [@Var{txt} [@Var{post} [@Var{pre}]]], ms} -Sets its first argument in bold italic type. It operates similarly to -the @code{B}@tie{}macro otherwise. +@Defmac {CW, [@Var{text} [@Var{post} [@Var{pre}]]], ms} +As @code{B}, but use a @t{constant-width} (monospaced) roman typeface +instead of bold. This is a Tenth Edition Research Unix extension. +@c possibly 9th, but definitely not Berkeley @endDefmac -@Defmac {BX, [@Var{txt}], ms} -Prints its argument and draws a box around it. If you want to box a -string that contains spaces, use a digit-width space (@code{\0}). +@Defmac {BX, [@Var{text}], ms} +Typeset @var{text} and draw a box around it. On terminal devices, +reverse video is used instead. If you want @var{text} to contain space, +use unbreakable space or horizontal motion escape sequences (@code{\~}, +@code{\@key{SP}}, @code{\^}, @code{\|}, @code{\0} or @code{\h}). @endDefmac -@Defmac {UL, [@Var{txt} [@Var{post}]], ms} -Prints its first argument with an underline. If you specify a second -argument, @code{groff} prints it in the previous font after the -underlined text, with no intervening space. +@Defmac {UL, [@Var{text} [@Var{post}]], ms} +Typeset @var{text} with an underline. @var{post}, if present, is set +after @var{text} with no intervening space. @endDefmac @Defmac {LG, , ms} -Prints all text following in larger type (two points larger than the -current point size) until the next font size, highlighting, paragraph, -or heading macro. You can specify this macro multiple times to -enlarge the point size as needed. +Set subsequent text in larger type (two points larger than the +current size) until the next type size, paragraphing, or heading macro +call. You can specify this macro multiple times to enlarge the type +size as needed. @endDefmac @Defmac {SM, , ms} -Prints all text following in smaller type (two points smaller than the -current point size) until the next type size, highlighting, paragraph, -or heading macro. You can specify this macro multiple times to reduce -the point size as needed. +Set subsequent text in smaller type (two points smaller than the current +size) until the next type size, paragraphing, or heading macro call. +You can specify this macro multiple times to reduce the type size as +needed. @endDefmac @Defmac {NL, , ms} -Prints all text following in the normal point size (that is, the value -of the @code{PS} register). +Set subsequent text at the normal type size (the amount in the @code{PS} +register). @endDefmac -@DefstrList {@Lbrace{}, ms} -@DefstrListEndx {@Rbrace{}, ms} -Text enclosed with @code{\*@{} and @code{\*@}} is printed as a -superscript. -@endDefstr +@var{pre} and @var{post} arguments are typically used to simplify the +attachment of punctuation to styled words. When @var{pre} is used, +a hyphenation control escape sequence @code{\%} that would ordinarily +start @var{text} must start @var{pre} instead to have the desired +effect. + +@CartoucheExample +The CS course's students found one C language keyword +.CW static ) \%( +most troublesome. +@endCartoucheExample + +The foregoing example produces output as follows. + +@CartoucheExample +@r{The CS course's students found one C language keyword (@t{static}) +most troublesome.} +@endCartoucheExample + +You can use the output line continuation escape sequence @code{\c} to +achieve the same result (@pxref{Line Continuation}). It is also +portable to older @file{ms} implementations. + +@CartoucheExample +The CS course's students found one C language keyword +\%(\c +.CW \%static ) +most troublesome. +@endCartoucheExample + +@code{groff} @file{ms} also offers strings to begin and end super- and +subscripting. These are GNU extensions. + +@DefmpstrList {@lbracechar{}, ms} +@DefmpstrListEndx {@rbracechar{}, ms} +Begin and end superscripting, respectively. +@endDefmpstr + +@DefmpstrList {<, ms} +@DefmpstrListEndx {>, ms} +Begin and end subscripting, respectively. +@endDefmpstr + +Rather than calling the @code{CW} macro, in @code{groff} @file{ms} you +might prefer to change the font family to Courier by setting the +@code{FAM} string to @samp{C}. You can then use all four style macros +above, returning to the default family (Times) with @samp{.ds FAM T}. +Because changes to @code{FAM} take effect only at the next paragraph, +@code{CW} remains useful to ``inline'' a change to the font family, +similarly to the practice of this document in noting syntactical +elements of @file{ms} and @code{groff}. @c --------------------------------------------------------------------- -@node Lists in ms, Indentation values in ms, Highlighting in ms, ms Body Text +@node Lists in ms, Indented regions in ms, Typeface and decoration, ms Body Text @subsubsection Lists -@cindex @code{ms} macros, lists - -The @code{IP} macro handles duties for all lists. +@cindex @file{ms} macros, lists -@Defmac {IP, [@Var{marker} [@Var{width}]], ms} -The @var{marker} is usually a bullet glyph (@code{\[bu]}) for unordered -lists, a number (or auto-incrementing number register) for numbered -lists, or a word or phrase for indented (glossary-style) lists. - -The @var{width} specifies the indentation for the body of each list -item; its default unit is @samp{n}. Once specified, the indentation -remains the same for all list items in the document until specified -again. - -The @code{PORPHANS} register (@pxref{ms Document Control Registers}) -operates in conjunction with the @code{IP} macro, to inhibit the -printing of orphaned list markers at the bottom of any page. -@endDefmac +The @var{marker} argument to the @code{IP} macro can be employed to +present a variety of lists; for instance, you can use a bullet glyph +(@code{\[bu]}) for unordered lists, a number (or auto-incrementing +register) for numbered lists, or a word or phrase for glossary-style or +definition lists. If you set the paragraph indentation register +@code{PI} before calling @code{IP}, you can later reorder the items in +the list without having to ensure that a @var{width} argument remains +affixed to the first call. The following is an example of a bulleted list. -@cindex example markup, bulleted list [@code{ms}] -@cindex bulleted list, example markup [@code{ms}] +@cindex example markup, bulleted list [@file{ms}] +@cindex bulleted list, example markup [@file{ms}] -@Example +@CartoucheExample +.nr PI 2n A bulleted list: -.IP \[bu] 2 +.IP \[bu] lawyers .IP \[bu] guns .IP \[bu] money -@endExample - -Produces: +@endCartoucheExample @Example A bulleted list: -o lawyers +@bullet{} lawyers -o guns +@bullet{} guns -o money +@bullet{} money @endExample The following is an example of a numbered list. -@cindex example markup, numbered list [@code{ms}] -@cindex numbered list, example markup [@code{ms}] +@cindex example markup, numbered list [@file{ms}] +@cindex numbered list, example markup [@file{ms}] -@Example -.nr step 1 1 +@CartoucheExample +.nr step 0 1 +.nr PI 3n A numbered list: -.IP \n[step] 3 +.IP \n+[step] lawyers .IP \n+[step] guns .IP \n+[step] money -@endExample - -Produces: +@endCartoucheExample @Example A numbered list: @@ -3671,25 +3689,29 @@ A numbered list: 3. money @endExample -Note the use of the auto-incrementing number register in this example. +Here we have employed the @code{nr} request to create a register of our +own, @samp{step}. We initialized it to zero and assigned it an +auto-increment of 1. Each time we use the escape sequence +@samp{\n+[PI]} (note the plus sign), the formatter applies the increment +just before interpolating the register's value. Preparing the @code{PI} +register as well enables us to rearrange the list without the tedium of +updating macro calls. -The following is an example of a glossary-style list. -@cindex example markup, glossary-style list [@code{ms}] -@cindex glossary-style list, example markup [@code{ms}] +The next example illustrates a glossary-style list. +@cindex example markup, glossary-style list [@file{ms}] +@cindex glossary-style list, example markup [@file{ms}] -@Example +@CartoucheExample A glossary-style list: .IP lawyers 0.4i Two or more attorneys. .IP guns -Firearms, preferably -large-caliber. +Firearms, +preferably large-caliber. .IP money Gotta pay for those lawyers and guns! -@endExample - -Produces: +@endCartoucheExample @Example A glossary-style list: @@ -3703,48 +3725,76 @@ money Gotta pay for those lawyers and guns! @endExample -In the last example, the @code{IP} macro places the definition on the -same line as the term if it has enough space; otherwise, it breaks to -the next line and starts the definition below the term. This may or may -not be the effect you want, especially if some of the definitions break -and some do not. The following examples show two possible ways to force -a break. - -The first workaround uses the @code{br} request to force a break after -printing the term or label. +In the previous example, observe how the @code{IP} macro places the +definition on the same line as the term if it has enough space. If this +is not what you want, there are a few workarounds we will illustrate by +modifying the example. First, you can use a @code{br} request to force +a break after printing the term or label. @CartoucheExample -A glossary-style list: -.IP lawyers 0.4i -Two or more attorneys. .IP guns .br -Firearms, preferably large-caliber. -.IP money -Gotta pay for those lawyers and guns! +Firearms, @endCartoucheExample -The second workaround uses the @code{\p} escape to force the break. -Note the space following the escape; this is important. If you omit the -space, @code{groff} prints the first word on the same line as the term -or label (if it fits) @strong{then} breaks the line. +Second, you could apply the @code{\p} escape sequence to force a break. +The space following the escape sequence is important; if you omit it, +@code{groff} prints the first word of the paragraph text on the same +line as the term or label (if it fits) @emph{then} breaks the line. @CartoucheExample -A glossary-style list: -.IP lawyers 0.4i -Two or more attorneys. .IP guns -\p Firearms, preferably large-caliber. -.IP money -Gotta pay for those lawyers and guns! +\p Firearms, +@endCartoucheExample + +Finally, you may append a horizontal motion to the marker with the +@code{\h} escape sequence; using the same amount as the indentation will +ensure that the marker is too wide for @code{groff} to treat it as +``fitting'' on the same line as the paragraph text. + +@CartoucheExample +.IP guns\h'0.4i' +Firearms, @endCartoucheExample -To set nested lists, use the @code{RS} and @code{RE} macros. -@xref{Indentation values in ms}, for more information. -@cindex @code{ms} macros, nested lists -@cindex nested lists [@code{ms}] +In each case, the result is the same. + +@Example +A glossary-style list: + +lawyers + Two or more attorneys. + +guns + Firearms, preferably large-caliber. + +money + Gotta pay for those lawyers and guns! +@endExample + +@c --------------------------------------------------------------------- + +@node Indented regions in ms, ms keeps and displays, Lists in ms, ms Body Text +@subsubsection Indented regions + +You may need to indent a region of text while otherwise formatting it +normally. Indented regions can be nested; you can change @code{\n[PI]} +before each call to vary the amount of inset. + +@Defmac {RS, , ms} +Begin a region where headings, paragraphs, and displays are indented +(further) by the amount stored in the @code{PI} register. +@endDefmac + +@Defmac {RE, , ms} +End the (next) most recent indented region. +@endDefmac -For example: +This feature enables you to easily line up text under hanging and +indented paragraphs. +@cindex @file{ms} macros, nested lists +@cindex nested lists [@file{ms}] +For example, you may wish to structure lists hierarchically. @CartoucheExample .IP \[bu] 2 @@ -3754,6 +3804,7 @@ Lawyers: Dewey, .IP \[bu] Cheatham, +and .IP \[bu] and Howe. .RE @@ -3761,416 +3812,596 @@ and Howe. Guns @endCartoucheExample -Produces: - @Example -o Lawyers: +@bullet{} Lawyers: - o Dewey, + @bullet{} Dewey, - o Cheatham, + @bullet{} Cheatham, and - o and Howe. + @bullet{} Howe. -o Guns +@bullet{} Guns @endExample @c --------------------------------------------------------------------- -@node Indentation values in ms, Tabstops in ms, Lists in ms, ms Body Text -@subsubsection Indentation values +@node ms keeps and displays, ms Insertions, Indented regions in ms, ms Body Text +@subsubsection Keeps, boxed keeps, and displays +@cindex @file{ms} macros, displays +@cindex @file{ms} macros, keeps +@cindex keeps [@file{ms}] + +On occasion, you may want to @dfn{keep} several lines of text, or a +region of a document, together on a single page, preventing an automatic +page break within certain boundaries. This can cause a page break to +occur earlier than it normally would. For example, you may want to keep +two paragraphs together, or a paragraph that refers to a table, list, or +figure adjacent to the item it discusses. @file{ms} provides the +@code{KS} and @code{KE} macros for this purpose. + +You can alternatively specify a @dfn{floating keep}:@: if a keep cannot +fit on the current page, @file{ms} holds its contents and +allows material following the keep (in the source document) to fill the +remainder of the current page. When the page breaks, whether by +reaching the end or @code{bp} request, @file{ms} puts the floating keep +at the beginning of the next page. This is useful for placing large +graphics or tables that do not need to appear exactly where they occur +in the source document. -In many situations, you may need to indentation a section of text while -still wrapping and filling. @xref{Lists in ms}, for an example of -nested lists. - -@DefmacList {RS, , ms} -@DefmacListEndx {RE, , ms} -These macros begin and end an indented section. The @code{PI} register -controls the amount of indentation, allowing the indented text to line -up under hanging and indented paragraphs. +@DefmacList {KS, , ms} +@DefmacItemx {KF, , ms} +@DefmacListEndx {KE, , ms} +@code{KS} begins a keep, @code{KF} a floating keep, and @code{KE} ends a +keep of either kind. @endDefmac -@xref{ms Displays and Keeps}, for macros to indentation and turn off -filling. - -@c --------------------------------------------------------------------- - -@node Tabstops in ms, ms Displays and Keeps, Indentation values in ms, ms Body Text -@subsubsection Tab Stops +As an alternative to the keep mechanism, the @code{ne} request forces a +page break if there is not at least the amount of vertical space +specified in its argument remaining on the page (@pxref{Page Control}). +One application of @code{ne} is to reserve space on the page for a +figure or illustration to be included later. -Use the @code{ta} request to define tab stops as needed. @xref{Tabs and -Fields}. +@cindex boxes [@file{ms}] +A @dfn{boxed keep} has a frame drawn around it. -@Defmac {TA, , ms} -Use this macro to reset the tab stops to the default for @file{ms} -(every 5n). You can redefine the @code{TA} macro to create a different -set of default tab stops. +@DefmacList {B1, , ms} +@DefmacListEndx {B2, , ms} +@code{B1} begins a keep with a box drawn around it. @code{B2} ends a +boxed keep. @endDefmac -@c --------------------------------------------------------------------- +Boxed keep macros cause breaks; if you need to box a word or phrase +within a line, see the @code{BX} macro in @ref{Typeface and decoration}. +Box lines are drawn as close as possible to the text they enclose so +that they are usable within paragraphs. If you wish to box one or more +paragraphs, you may improve the appearance by calling @code{B1} after +the first paragraphing macro, and by adding a small amount of vertical +space before calling @code{B2}. -@node ms Displays and Keeps, ms Insertions, Tabstops in ms, ms Body Text -@subsubsection Displays and keeps -@cindex @code{ms} macros, displays -@cindex @code{ms} macros, keeps -@cindex keeps [@code{ms}] -@cindex displays [@code{ms}] +@c Wrap example at 58 columns. +@CartoucheExample +.LP +.B1 +.I Warning: +Happy Fun Ball may suddenly accelerate to dangerous +speeds. +.sp \n[PD]/2 \" space by half the inter-paragraph distance +.B2 +@endCartoucheExample -Use displays to show text-based examples or figures (such as code -listings). +If you want a boxed keep to float, you will need to enclose the +@code{B1} and @code{B2} calls within a pair of @code{KF} and @code{KE} +calls. -Displays turn off filling, so lines of code are displayed as-is without -inserting @code{br} requests in between each line. Displays can be -@dfn{kept} on a single page, or allowed to break across pages. +@cindex displays [@file{ms}] +@dfn{Displays} turn off filling; lines of verse or program code are +shown with their lines broken as in the source document without +requiring @code{br} requests between lines. Displays can be kept on a +single page or allowed to break across pages. The @code{DS} macro +begins a kept display of the layout specified in its first argument; +non-kept displays are begun with dedicated macros corresponding to their +layout. @DefmacList {DS, @t{L}, ms} -@DefmacItemx {LD, , ms} -@DefmacListEndx {DE, , ms} -Left-justified display. The @samp{.DS L} call generates a page break, -if necessary, to keep the entire display on one page. The @code{LD} -macro allows the display to break across pages. The @code{DE} macro -ends the display. +@DefmacListEndx {LD, , ms} +Begin (@code{DS}:@: kept) left-aligned display. @endDefmac -@DefmacList {DS, @t{I}, ms} -@DefmacItemx {ID, , ms} -@DefmacListEndx {DE, , ms} -Indents the display as defined by the @code{DI} register. The @samp{.DS -I} call generates a page break, if necessary, to keep the entire display -on one page. The @code{ID} macro allows the display to break across -pages. The @code{DE} macro ends the display. +@DefmacList {DS, [@t{I} [@Var{indent}]], ms} +@DefmacListEndx {ID, [@Var{indent}], ms} +Begin (@code{DS}:@: kept) display indented by @var{indent} if specified, +and by the amount of the @code{DI} register otherwise. @endDefmac @DefmacList {DS, @t{B}, ms} -@DefmacItemx {BD, , ms} -@DefmacListEndx {DE, , ms} -Sets a block-centered display: the entire display is left-justified, but -indented so that the longest line in the display is centered on the -page. The @samp{.DS B} call generates a page break, if necessary, to -keep the entire display on one page. The @code{BD} macro allows the -display to break across pages. The @code{DE} macro ends the display. +@DefmacListEndx {BD, , ms} +Begin a (@code{DS}:@: kept) a block display:@: the entire display is +left-aligned, but indented such that the longest line in the display +is centered on the page. @endDefmac @DefmacList {DS, @t{C}, ms} -@DefmacItemx {CD, , ms} -@DefmacListEndx {DE, , ms} -Sets a centered display: each line in the display is centered. The -@samp{.DS C} call generates a page break, if necessary, to keep the -entire display on one page. The @code{CD} macro allows the display to -break across pages. The @code{DE} macro ends the display. +@DefmacListEndx {CD, , ms} +Begin a (@code{DS}:@: kept) centered display:@: each line in the display +is centered. @endDefmac @DefmacList {DS, @t{R}, ms} -@DefmacItemx {RD, , ms} -@DefmacListEndx {DE, , ms} -Right-justifies each line in the display. The @samp{.DS R} call -generates a page break, if necessary, to keep the entire display on one -page. The @code{RD} macro allows the display to break across pages. -The @code{DE} macro ends the display. -@endDefmac - -@DefmacList {Ds, , ms} -@DefmacListEndx {De, , ms} -These two macros were formerly provided as aliases for @code{DS} and -@code{DE}, respectively. They have been removed, and should no longer -be used. The original implementations of @code{DS} and @code{DE} are -retained, and should be used instead. X11 documents that actually use -@code{Ds} and @code{De} always load a specific macro file from the X11 -distribution (@file{macros.t}) that provides proper definitions for the -two macros. -@endDefmac - -On occasion, you may want to @dfn{keep} other text together on a page. -For example, you may want to keep two paragraphs together, or a -paragraph that refers to a table (or list, or other item) immediately -following. The @file{ms} macros provide the @code{KS} and @code{KE} -macros for this purpose. - -@DefmacList {KS, , ms} -@DefmacListEndx {KE, , ms} -The @code{KS} macro begins a block of text to be kept on a single page, -and the @code{KE} macro ends the block. +@DefmacListEndx {RD, , ms} +Begin a (@code{DS}:@: kept) right-aligned display. This is a GNU +extension. @endDefmac -@DefmacList {KF, , ms} -@DefmacListEndx {KE, , ms} -Specifies a @dfn{floating keep}; if the keep cannot fit on the current -page, @code{groff} holds the contents of the keep and allows text -following the keep (in the source file) to fill in the remainder of the -current page. When the page breaks, whether by an explicit @code{bp} -request or by reaching the end of the page, @code{groff} prints the -floating keep at the top of the new page. This is useful for printing -large graphics or tables that do not need to appear exactly where -specified. +@Defmac {DE, , ms} +End any display. @endDefmac -You can also use the @code{ne} request to force a page break if there is -not enough vertical space remaining on the page. - -Use the following macros to draw a box around a section of text (such as -a display). - -@DefmacList {B1, , ms} -@DefmacListEndx {B2, , ms} -Marks the beginning and ending of text that is to have a box drawn -around it. The @code{B1} macro begins the box; the @code{B2} macro ends -it. Text in the box is automatically placed in a diversion (keep). -@endDefmac +The distance stored in the @code{DD} register is inserted before and +after each pair of display macros; this is a Berkeley extension. In +@code{groff} @file{ms}, this distance replaces any adjacent +inter-paragraph distance or subsequent spacing prior to a section +heading. The @code{DI} register is a GNU extension; its value is an +indentation applied to displays created with @samp{.DS} and @samp{.ID} +without arguments, to @samp{.DS I} without an indentation argument, and +to indented equations set with @samp{.EQ}. Changes to either register +take effect at the next display boundary. @c --------------------------------------------------------------------- -@node ms Insertions, Example multi-page table, ms Displays and Keeps, ms Body Text +@node ms Insertions, ms Footnotes, ms keeps and displays, ms Body Text @subsubsection Tables, figures, equations, and references -@cindex @code{ms} macros, tables -@cindex @code{ms} macros, figures -@cindex @code{ms} macros, equations -@cindex @code{ms} macros, references -@cindex tables [@code{ms}] -@cindex figures [@code{ms}] -@cindex equations [@code{ms}] -@cindex references [@code{ms}] - -The @file{ms} macros support the standard @code{groff} preprocessors: -@code{tbl}, @code{pic}, @code{eqn}, and @code{refer}. +@cindex @file{ms} macros, tables +@cindex @file{ms} macros, figures +@cindex @file{ms} macros, equations +@cindex @file{ms} macros, references +@cindex tables [@file{ms}] +@cindex figures [@file{ms}] +@cindex equations [@file{ms}] +@cindex references [@file{ms}] + +The @file{ms} package is often used with the @code{tbl}, @code{pic}, +@code{eqn}, and @code{refer} preprocessors. @pindex tbl @pindex pic @pindex eqn @pindex refer -You mark text meant for preprocessors by enclosing it in pairs of tags -as follows. +Mark text meant for preprocessors by enclosing it in pairs of tokens +as follows, with nothing between the dot and the macro name. The +preprocessors match these tokens only at the start of an input line. @DefmacList {TS, [@code{H}], ms} @DefmacListEndx {TE, , ms} -Denotes a table, to be processed by the @code{tbl} preprocessor. The -optional argument@tie{}@code{H} to @code{TS} instructs @code{groff} to -create a running header with the information up to the @code{TH} macro. -@code{groff} prints the header at the beginning of the table; if the -table runs onto another page, @code{groff} prints the header on the next -page as well. +Demarcate a table to be processed by the @code{tbl} preprocessor. The +optional argument@tie{}@code{H} to @code{TS} instructs @file{ms} to +repeat table rows (often column headings) at the top of each new page +the table spans, if applicable; calling the @code{TH} macro marks the +end of such rows. The GNU @cite{tbl@r{(1)}} man page provides a +comprehensive reference to the preprocessor and offers examples of its +use. @endDefmac @DefmacList {PS, , ms} -@DefmacListEndx {PE, , ms} -Denotes a graphic, to be processed by the @code{pic} preprocessor. You -can create a @code{pic} file by hand, using the @acronym{AT&T} -@code{pic} manual available on the Web as a reference, or by using a -graphics program such as @code{xfig}. +@DefmacItemx {PE, , ms} +@DefmacListEndx {PF, , ms} +@code{PS} begins a picture to be processed by the @command{gpic} +preprocessor; either of @code{PE} or @code{PF} ends it, the latter with +``flyback'' to the vertical position at its top. You can create +@code{pic} input manually or with a program such as @code{xfig}. @endDefmac -@DefmacList {EQ, [@Var{align}], ms} +@DefmacList {EQ, [@Var{align} [@Var{label}]], ms} @DefmacListEndx {EN, , ms} -Denotes an equation, to be processed by the @code{eqn} preprocessor. -The optional @var{align} argument can be @code{C}, @code{L}, -or@tie{}@code{I} to center (the default), left-justify, or indent the -equation. +Demarcate an equation to be processed by the @code{eqn} preprocessor. +The equation is centered by default; @var{align} can be @samp{C}, +@samp{L}, or @samp{I} to (explicitly) center, left-align, or indent it +by the amount stored in the @code{DI} register, respectively. If +specified, @var{label} is set right-aligned. @endDefmac @DefmacList {[, , ms} @DefmacListEndx {], , ms} -Denotes a reference, to be processed by the @code{refer} preprocessor. -The GNU @cite{refer(1)} man page provides a comprehensive reference to -the preprocessor and the format of the bibliographic database. +Demarcate a bibliographic citation to be processed by the @code{refer} +preprocessor. The GNU @cite{refer@r{(1)}} man page provides a +comprehensive reference to the preprocessor and the format of its +bibliographic database. Type @samp{man refer} at the command line to +view it. @endDefmac -@menu -* Example multi-page table:: -@end menu - -@c --------------------------------------------------------------------- - -@node Example multi-page table, ms Footnotes, ms Insertions, ms Body Text -@subsubsection An example multi-page table -@cindex example markup, multi-page table [@code{ms}] -@cindex multi-page table, example markup [@code{ms}] +When @code{refer} emits collected references (as might be done on a +``Works Cited'' page), it interpolates the @code{REFERENCES} string as +an unnumbered heading (@code{SH}). +@cindex table, multi-page, example [@file{ms}] +@cindex multi-page table example [@file{ms}] The following is an example of how to set up a table that may print across two or more pages. @CartoucheExample .TS H -allbox expand; -cb | cb . -Text ...of heading... +allbox; +Cb | Cb . +Part@arrow{}Description _ .TH .T& -l | l . -... the rest of the table follows... -.CW +GH-1978@arrow{}Fribulating gonkulator +@r{@dots{}the rest of the table follows@dots{}} .TE @endCartoucheExample -@c --------------------------------------------------------------------- +@noindent +Attempting to place a multi-page table inside a keep can lead to +unpleasant results, particularly if the @code{tbl} @code{allbox} option +is used. -@node ms Footnotes, , Example multi-page table, ms Body Text -@subsubsection Footnotes -@cindex @code{ms} macros, footnotes -@cindex footnotes [@code{ms}] +@cindex equation example [@file{ms}] +Mathematics can be typeset using the language of the @code{eqn} +preprocessor. + +@CartoucheExample +.EQ C (\*[SN-NO-DOT]a) +p ~ = ~ q sqrt @{ ( 1 + ~ ( x / q sup 2 ) @} +.EN +@endCartoucheExample + +@noindent +This input formats a labelled equation. We used the @code{SN-NO-DOT} +string to base the equation label on the current heading number, giving +us more flexibility to reorganize the document. + +Use @command{groff} options to run preprocessors on the input:@: +@option{-e} for @command{geqn}, @option{-p} for @command{gpic}, +@option{-R} for @command{grefer}, and @option{-t} for @command{gtbl}. -The @file{ms} macro package has a flexible footnote system. You can -specify either numbered footnotes or symbolic footnotes (that is, using -a marker such as a dagger symbol). +@c --------------------------------------------------------------------- -@Defstr {*, ms} -Specifies the location of a numbered footnote marker in the text. +@node ms Footnotes, , ms Insertions, ms Body Text +@subsubsection Footnotes +@cindex @file{ms} macros, footnotes +@cindex footnotes [@file{ms}] + +@cindex footnote marker [@file{ms}] +@cindex marker, footnote [@file{ms}] +A footnote is typically anchored to a place in the text with a +@dfn{marker}, which is a small integer, a symbol such as a dagger, or +arbitrary user-specified text. + +@Defmpstr {*, ms} +Place an @dfn{automatic number}, an automatically generated numeric +footnote marker, in the text. Each time this string is interpolated, +the number it produces increments by one. Automatic numbers start at 1. +This is a Berkeley extension. @endDefesc -@DefmacList {FS, , ms} +Enclose the footnote text in @code{FS} and @code{FE} macro calls to set +it at the nearest available ``foot'', or bottom, of a text column or +page. + +@DefmacList {FS, [@Var{marker}], ms} @DefmacListEndx {FE, , ms} -Specifies the text of the footnote. The default action is to create a -numbered footnote; you can create a symbolic footnote by specifying a -@dfn{mark} glyph (such as @code{\[dg]} for the dagger glyph) in the body -text and as an argument to the @code{FS} macro, followed by the text of -the footnote and the @code{FE} macro. +Begin (@code{FS}) and end (@code{FE}) a footnote. @code{FS} calls +@code{FS-MARK} with any supplied @var{marker} argument, which is then +also placed at the beginning of the footnote text. If @var{marker} is +omitted, the next pending automatic footnote number enqueued by +interpolation of the @code{*} string is used, and if none exists, +nothing is prefixed. @endDefmac -You can control how @code{groff} prints footnote numbers by changing the -value of the @code{FF} register. @xref{ms Document Control Registers}. - -@cindex footnotes, and keeps [@code{ms}] -@cindex keeps, and footnotes [@code{ms}] -@cindex footnotes, and displays [@code{ms}] -@cindex displays, and footnotes [@code{ms}] +You may not desire automatically numbered footnotes in spite of their +convenience. You can indicate a footnote with a symbol or other text by +specifying its marker at the appropriate place (for example, by using +@code{\[dg]} for the dagger glyph) @emph{and} as an argument to the +@code{FS} macro. Such manual marks should be repeated as arguments to +@code{FS} or as part of the footnote text to disambiguate their +correspondence. You may wish to use @code{\*@{} and @code{\*@}} to +superscript the marker at the anchor point, in the footnote text, or +both. + +@code{groff} @file{ms} provides a hook macro, @code{FS-MARK}, for +user-determined operations to be performed when the @code{FS} macro is +called. It is passed the same arguments as @code{FS} itself. An +application of @code{FS-MARK} is anchor placement for a hyperlink +reference, so that a footnote can link back to its referential +context.@footnote{``Portable Document Format Publishing with GNU +Troff'', @file{pdfmark.ms} in the @code{groff} distribution, uses this +technique.} By default, this macro has an empty definition. +@code{FS-MARK} is a GNU extension. + +@cindex footnotes, and keeps [@file{ms}] +@cindex keeps, and footnotes [@file{ms}] +@cindex footnotes, and displays [@file{ms}] +@cindex displays, and footnotes [@file{ms}] Footnotes can be safely used within keeps and displays, but you should -avoid using numbered footnotes within floating keeps. You can set a -second @code{\**} marker between a @code{\**} and its corresponding -@code{.FS} entry; as long as each @code{FS} macro occurs @emph{after} -the corresponding @code{\**} and the occurrences of @code{.FS} are in -the same order as the corresponding occurrences of @code{\**}. +avoid using automatically numbered footnotes within floating keeps. You +can place a second @code{\**} interpolation between a @code{\**} and its +corresponding @code{FS} call as long as each @code{FS} call occurs +@emph{after} the corresponding @code{\**} and occurrences of @code{FS} +are in the same order as corresponding occurrences of @code{\**}. + +Footnote text is formatted as paragraphs are, using analogous +parameters. The registers @code{FI}, @code{FPD}, @code{FPS}, and +@code{FVS} correspond to @code{PI}, @code{PD}, @code{PS}, and @code{CS}, +respectively; @code{FPD}, @code{FPS}, and @code{FVS} are GNU extensions. + +The @code{FF} register controls the formatting of automatically numbered +footnote paragraphs and those for which @code{FS} is given a marker +argument. @xref{ms Document Control Settings}. + +The default footnote line length is 11/12ths of the normal line length +for compatibility with the expectations of historical @file{ms} +documents; you may wish to set the @code{FR} string to @samp{1} to align +with contemporary typesetting practices. In the +past,@footnote{Unix Version@tie{}7 @file{ms}, its descendants, and GNU +@file{ms} prior to @code{groff} version 1.23.0} an @code{FL} register +was used for the line length in footnotes; however, setting this +register at document initialization time had no effect on the footnote +line length in multi-column arrangements.@footnote{You could reset it +after each call to @code{.1C}, @code{.2C}, or @code{.MC}.} + +@code{FR} should be used in preference to the old @code{FL} register in +contemporary documents. The footnote line length is effectively +computed as @samp{@slanted{column-width} * \*[FR]}. If an absolute +footnote line length is required, recall that arithmetic expressions in +@code{roff} input are evaluated strictly from left to right, with no +operator precedence (parentheses are honored). + +@Example +.ds FR 0+3i \" Set footnote line length to 3 inches. +@endExample @c --------------------------------------------------------------------- -@node ms Page Layout, Differences from AT&T ms, ms Body Text, ms -@subsection Page layout -@cindex @code{ms} macros, page layout -@cindex page layout [@code{ms}] +@node ms language and localization, ms Page Layout, ms Footnotes, ms Body Text +@subsubsection Language and localization +@cindex @file{ms} macros, language +@cindex @file{ms} macros, localization +@cindex language [@file{ms}] +@cindex localization [@file{ms}] + +@code{groff} @file{ms} provides several strings that you can customize +for your own purposes, or redefine to adapt the macro package to +languages other than English. It is already localized for +@c cs, de, fr, it, sv +Czech, German, French, Italian, and Swedish. Load the desired +localization macro package after @file{ms}; see the +@cite{groff_tmac@r{(5)}} man page. -The default output from the @file{ms} macros provides a minimalist page -layout: it prints a single column, with the page number centered at the -top of each page. It prints no footers. +@CartoucheExample +$ groff -ms -mfr bienvenue.ms +@endCartoucheExample -You can change the layout by setting the proper number registers and -strings. +The following strings are available. -@menu +@Defmpstr {REFERENCES, ms} +Contains the string printed at the beginning of a references +(bibliography) page produced with GNU @cite{refer@r{(1)}}. The default +is @samp{References}. +@c XXX: Use of refer(1) with ms is insufficiently documented. +@endDefmpstr + +@Defmpstr {ABSTRACT, ms} +Contains the string printed at the beginning of the abstract. The +default is @samp{\f[I]ABSTRACT\f[]}; it includes font selection escape +sequences to set the word in italics. +@endDefmpstr + +@Defmpstr {TOC, ms} +Contains the string printed at the beginning of the table of contents. +The default is @samp{Table of Contents}. +@endDefmpstr + +@DefmpstrList {MONTH1, ms} +@DefmpstrItemx {MONTH2, ms} +@DefmpstrItemx {MONTH3, ms} +@DefmpstrItemx {MONTH4, ms} +@DefmpstrItemx {MONTH5, ms} +@DefmpstrItemx {MONTH6, ms} +@DefmpstrItemx {MONTH7, ms} +@DefmpstrItemx {MONTH8, ms} +@DefmpstrItemx {MONTH9, ms} +@DefmpstrItemx {MONTH10, ms} +@DefmpstrItemx {MONTH11, ms} +@DefmpstrListEndx {MONTH12, ms} +Contain the full names of the calendar months. The defaults are in +English: @samp{January}, @samp{February}, and so on. +@endDefmpstr + +@c --------------------------------------------------------------------- + +@node ms Page Layout, Differences from AT&T ms, ms Body Text, ms +@subsection Page layout +@cindex @file{ms} macros, page layout +@cindex page layout [@file{ms}] + +@file{ms}'s default page layout arranges text in a single column with +the page number between hyphens centered in a header on each page except +the first, and produces no footers. You can customize this arrangement. + +@menu * ms Headers and Footers:: +* Tab Stops in ms:: * ms Margins:: * ms Multiple Columns:: * ms TOC:: -* ms Strings and Special Characters:: @end menu @c --------------------------------------------------------------------- -@node ms Headers and Footers, ms Margins, ms Page Layout, ms Page Layout +@node ms Headers and Footers, Tab Stops in ms, ms Page Layout, ms Page Layout @subsubsection Headers and footers -@cindex @code{ms} macros, headers -@cindex @code{ms} macros, footers -@cindex headers [@code{ms}] -@cindex footers [@code{ms}] - -For documents that do not distinguish between odd and even pages, set -the following strings: - -@DefstrList {LH, ms} -@DefstrItemx {CH, ms} -@DefstrListEndx {RH, ms} -Sets the left, center, and right headers. -@endDefstr - -@DefstrList {LF, ms} -@DefstrItemx {CF, ms} -@DefstrListEndx {RF, ms} -Sets the left, center, and right footers. -@endDefstr - -For documents that need different information printed in the even and -odd pages, use the following macros: - -@DefmacList {OH, @t{'}@Var{left}@t{'}@Var{center}@t{'}@Var{right}@t{'}, ms} -@DefmacItemx {EH, @t{'}@Var{left}@t{'}@Var{center}@t{'}@Var{right}@t{'}, ms} -@DefmacItemx {OF, @t{'}@Var{left}@t{'}@Var{center}@t{'}@Var{right}@t{'}, ms} -@DefmacListEndx {EF, @t{'}@Var{left}@t{'}@Var{center}@t{'}@Var{right}@t{'}, ms} -The @code{OH} and @code{EH} macros define headers for the odd and even -pages; the @code{OF} and @code{EF} macros define footers for the odd and -even pages. This is more flexible than defining the individual strings. - -You can replace the quote (@code{'}) marks with any character not -appearing in the header or footer text. +@cindex @file{ms} macros, headers +@cindex @file{ms} macros, footers +@cindex headers [@file{ms}] +@cindex footers [@file{ms}] + +There are multiple ways to produce headers and footers. One is to +define the strings @code{LH}, @code{CH}, and @code{RH} to set the left, +center, and right headers, respectively; and @code{LF}, @code{CF}, and +@code{RF} to set the left, center, and right footers. This approach +suffices for documents that do not distinguish odd- and even-numbered +pages. + +Another method is to call macros that set headers or footers for odd- or +even-numbered pages. Each such macro takes a delimited argument +separating the left, center, and right header or footer texts from each +other. You can replace the neutral apostrophes (@code{'}) shown below +with any character not appearing in the header or footer text. These +macros are Berkeley extensions. + +@DefmacList {OH, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms} +@DefmacItemx {EH, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms} +@DefmacItemx {OF, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms} +@DefmacListEndx {EF, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}, ms} +The @code{OH} and @code{EH} macros define headers for odd- (recto) +and even-numbered (verso) pages, respectively; the @code{OF} and +@code{EF} macros define footers for them. +@endDefmac + +With either method, a percent sign @code{%} in header or footer text is +replaced by the current page number. By default, @file{ms} places no +header on a page numbered ``1'' (regardless of its number format). + +@Defmac {P1, , ms} +Typeset the header even on page@tie{}1. To be effective, this macro +must be called before the header trap is sprung on any page numbered +``1''; in practice, unless your page numbering is unusual, this means +that you should call it early, before @code{TL} or any heading or +paragraphing macro. This is a Berkeley extension. @endDefmac -To specify custom header and footer processing, redefine the following -macros: +For even greater flexibility, @file{ms} is designed to permit the +redefinition of the macros that are called when the @code{groff} traps +that ordinarily cause the headers and footers to be output are sprung. +@code{PT} (``page trap'') is called by @file{ms} when the header is to +be written, and @code{BT} (``bottom trap'') when the footer is to be. +The @code{groff} page location trap that @file{ms} sets up to format the +header also calls the (normally undefined) @code{HD} macro after +@code{PT}; you can define @code{HD} if you need additional processing +after setting the header (for example, to draw a line below it). +@c Although undocumented in Tuthill's 4.2BSD ms.diffs paper... +The @code{HD} hook is a Berkeley extension. Any such macros you +(re)define must implement any desired specialization for odd-, even-, or +first numbered pages. -@DefmacList {PT,, ms} -@DefmacItemx {HD,, ms} -@DefmacListEndx {BT,, ms} -The @code{PT} macro defines a custom header; the @code{BT} macro defines -a custom footer. These macros must handle odd/even/first page -differences if necessary. +@c --------------------------------------------------------------------- + +@node Tab Stops in ms, ms Margins, ms Headers and Footers, ms Page Layout +@subsubsection Tab stops + +Use the @code{ta} request to define tab stops as needed. @xref{Tabs and +Fields}. -The @code{HD} macro defines additional header processing to take place -after executing the @code{PT} macro. +@Defmac {TA, , ms} +Reset the tab stops to the @file{ms} default (every 5 ens). +Redefine this macro to create a different set of default tab stops. @endDefmac @c --------------------------------------------------------------------- -@node ms Margins, ms Multiple Columns, ms Headers and Footers, ms Page Layout +@node ms Margins, ms Multiple Columns, Tab Stops in ms, ms Page Layout @subsubsection Margins -@cindex @code{ms} macros, margins +@cindex @file{ms} macros, margins -You control margins using a set of number registers. @xref{ms Document -Control Registers}, for details. +Control margins using the registers summarized in ``Margin settings'' in +@ref{ms Document Control Settings} above. There is no setting for the +right margin; the combination of page offset @code{\n[PO]} and line +length @code{\n[LL]} determines it. @c --------------------------------------------------------------------- @node ms Multiple Columns, ms TOC, ms Margins, ms Page Layout @subsubsection Multiple columns -@cindex @code{ms} macros, multiple columns -@cindex multiple columns [@code{ms}] +@cindex @file{ms} macros, multiple columns +@cindex multiple columns [@file{ms}] -The @file{ms} macros can set text in as many columns as do reasonably -fit on the page. The following macros are available; all of them force -a page break if a multi-column mode is already set. However, if the -current mode is single-column, starting a multi-column mode does -@emph{not} force a page break. +@file{ms} can set text in as many columns as reasonably fit on the page. +The following macros force a page break if a multi-column layout is +active when they are called. The @code{MINGW} register stores the +default minimum gutter width; it is a GNU extension. When multiple +columns are in use, keeps and the @code{HORPHANS} and @code{PORPHANS} +registers work with respect to column breaks instead of page breaks. @Defmac {1C, , ms} -Single-column mode. +Arrange page text in a single column (the default). @endDefmac @Defmac {2C, , ms} -Two-column mode. +Arrange page text in two columns. @endDefmac -@Defmac {MC, [@Var{width} [@Var{gutter}]], ms} -Multi-column mode. If you specify no arguments, it is equivalent to the -@code{2C} macro. Otherwise, @var{width} is the width of each column and -@var{gutter} is the space between columns. The @code{MINGW} number -register controls the default gutter width. +@Defmac {MC, [@Var{column-width} [@Var{gutter-width}]], ms} +Arrange page text in multiple columns. If you specify no arguments, it +is equivalent to the @code{2C} macro. Otherwise, @var{column-width} is +the width of each column and @var{gutter-width} is the minimum distance +between columns. @endDefmac @c --------------------------------------------------------------------- -@node ms TOC, ms Strings and Special Characters, ms Multiple Columns, ms Page Layout +@node ms TOC, Differences from AT&T ms, ms Multiple Columns, ms Page Layout @subsubsection Creating a table of contents -@cindex @code{ms} macros, creating table of contents -@cindex table of contents, creating [@code{ms}] +@cindex @file{ms} macros, creating table of contents +@cindex table of contents, creating [@file{ms}] + +Because @code{roff} formatters process their input in a single pass, +material on page 50, for example, cannot influence what appears on +page@tie{}1---this poses a challenge for a table of contents at its +traditional location in front matter, if you wish to avoid manually +maintaining it. @file{ms} enables the collection of material to be +presented in the table of contents as it appears, saving its page number +along with it, and then emitting the collected contents on demand toward +the end of the document. The table of contents can then be resequenced +to its desired location by physically rearranging the pages of a printed +document, or as part of post-processing---with a @cite{sed@r{(1)}} +script to reorder the pages in @command{troff}'s output, with +@cite{pdfjam@r{(1)}}, or with @cite{gropdf@r{(1)}}'s +@samp{.pdfswitchtopage} feature, for example. + +Define an entry to appear in the table of contents by bracketing its +text between calls to the @code{XS} and @code{XE} macros. A typical +application is to call them immediately after @code{NH} or @code{SH} and +repeat the heading text within them. The @code{XA} macro, used within +@samp{.XS}/@samp{.XE} pairs, supplements an entry---for instance, when +it requires multiple output lines, whether because a heading is too long +to fit or because style dictates that page numbers not be repeated. You +may wish to indent the text thus wrapped to correspond to its heading +depth; this can be done in the entry text by prefixing it with tabs or +horizontal motion escape sequences, or by providing a second argument to +the @code{XA} macro. @code{XS} and @code{XA} automatically associate +the page number where they are called with the text following them, but +they accept arguments to override this behavior. At the end of the +document, call @code{TC} or @code{PX} to emit the table of contents; +@code{TC} resets the page number to @samp{i} (Roman numeral one), and +then calls @code{PX}. All of these macros are Berkeley extensions. + +@DefmacList {XS, [@Var{page-number}], ms} +@DefmacItemx {XA, [@Var{page-number} [@Var{indentation}]], ms} +@DefmacListEndx {XE, , ms} +Begin, supplement, and end a table of contents entry. Each entry is +associated with @var{page-number} (otherwise the current page number); a +@var{page-number} of @samp{no} prevents a leader and page number from +being emitted for that entry. Use of @code{XA} within +@code{XS}/@code{XE} is optional; it can be repeated. If +@var{indentation} is present, a supplemental entry is indented by that +amount; ens are assumed if no unit is indicated. Text on input lines +between @code{XS} and @code{XE} is stored for later recall by @code{PX}. +@endDefmac -The facilities in the @file{ms} macro package for creating a table of -contents are semi-automated at best. Assuming that you want the table -of contents to consist of the document's headings, you need to repeat -those headings wrapped in @code{XS} and @code{XE} macros. +@Defmac {PX, [@code{no}], ms} +Switch to single-column layout. Unless @code{no} is specified, center +and interpolate the @code{TOC} string in bold and two points larger than +the body text. Emit the table of contents entries. +@endDefmac -@DefmacList {XS, [@Var{page}], ms} -@DefmacItemx {XA, [@Var{page}], ms} -@DefmacListEndx {XE, , ms} -These macros define a table of contents or an individual entry in the -table of contents, depending on their use. The macros are very simple; -they cannot indent a heading based on its level. The easiest way to -work around this is to add tabs to the table of contents string. The -following is an example: +@Defmac {TC, [@code{no}], ms} +Set the page number to@tie{}1, the page number format to lowercase Roman +numerals, and call @code{PX} (with a @code{no} argument, if present). +@endDefmac + +Here's an example of typical @file{ms} table of contents preparation. +We employ horizontal escape sequences @code{\h} to indent the entries by +sectioning depth. @CartoucheExample .NH 1 @@ -4178,411 +4409,442 @@ Introduction .XS Introduction .XE -.LP -... -.CW +@r{@dots{}} .NH 2 Methodology .XS -Methodology +\h'2n'Methodology +.XA +\h'4n'Fassbinder's Approach +\h'4n'Kahiu's Approach .XE -.LP -... -@endCartoucheExample - -You can manually create a table of contents by beginning with the -@code{XS} macro for the first entry, specifying the page number for that -entry as the argument to @code{XS}. Add subsequent entries using the -@code{XA} macro, specifying the page number for that entry as the -argument to @code{XA}. The following is an example: - -@CartoucheExample -.XS 1 -Introduction -.XA 2 -A Brief History of the Universe -.XA 729 -Details of Galactic Formation -... +@r{@dots{}} +.NH 1 +Findings +.XS +Findings .XE +@r{@dots{}} +.TC @endCartoucheExample -@endDefmac -@Defmac {TC, [@code{no}], ms} -Prints the table of contents on a new page, setting the page number -to@tie{}@strong{i} (Roman lowercase numeral one). You should usually -place this macro at the end of the file, since @code{groff} is a -single-pass formatter and can only print what has been collected up to -the point that the @code{TC} macro appears. - -The optional argument @code{no} suppresses printing the title specified -by the string register @code{TOC}. +The remaining features in this subsubsection are GNU extensions. +@code{groff} @file{ms} obviates the need to repeat heading text after +@code{XS} calls. Call @code{XN} and @code{XH} after @code{NH} and +@code{SH}, respectively. + +@DefmacList {XN, @Var{heading-text}, ms} +@DefmacListEndx {XH, @Var{depth} @Var{heading-text}, ms} +Format @var{heading-text} and create a corresponding table of contents +entry. @code{XN} computes the indentation from the depth of the +preceding @code{NH} call; @code{XH} requires a @var{depth} argument to +do so. @endDefmac -@Defmac {PX, [@code{no}], ms} -Prints the table of contents on a new page, using the current page -numbering sequence. Use this macro to print a manually generated table -of contents at the beginning of your document. +@code{groff} @file{ms} encourages customization of table of contents +entry production. -The optional argument @code{no} suppresses printing the title specified -by the string register @code{TOC}. +@DefmacList {XN-REPLACEMENT, @Var{heading-text}, ms} +@DefmacListEndx {XH-REPLACEMENT, @Var{depth} @Var{heading-text}, ms} +These hook macros implement @code{XN} and @code{XH}, respectively. +They call @code{XN-INIT} and pass their @var{heading-text} arguments to +@code{XH-UPDATE-TOC}. @endDefmac -The @cite{Groff and Friends HOWTO} includes a @code{sed} script that -automatically inserts @code{XS} and @code{XE} macro entries after each -heading in a document. - -Altering the @code{NH} macro to automatically build the table of -contents is perhaps initially more difficult, but would save a great -deal of time in the long run if you use @file{ms} regularly. - -@c --------------------------------------------------------------------- +@DefmacList {XN-INIT, , ms} +@DefmacListEndx {XH-UPDATE-TOC, @Var{depth} @Var{heading-text}, ms} +The @code{XN-INIT} hook macro does nothing by default. +@code{XH-UPDATE-TOC} brackets @var{heading-text} with @code{XS} and +@code{XE} calls, indenting it by 2 ens per level of @var{depth} beyond +the first. +@endDefmac -@node ms Strings and Special Characters, , ms TOC, ms Page Layout -@subsubsection Strings and Special Characters -@cindex @code{ms} macros, strings -@cindex @code{ms} macros, special characters -@cindex @code{ms} macros, accent marks -@cindex accent marks [@code{ms}] -@cindex special characters [@code{ms}] -@cindex strings [@code{ms}] - -The @file{ms} macros provide the following predefined strings. You can -change the string definitions to help in creating documents in languages -other than English. - -@Defstr {REFERENCES, ms} -Contains the string printed at the beginning of the references -(bibliography) page. The default is @samp{References}. -@endDefstr - -@Defstr {ABSTRACT, ms} -Contains the string printed at the beginning of the abstract. The -default is @samp{ABSTRACT}. -@endDefstr +We could therefore produce a table of contents similar to that in the +previous example with fewer macro calls. (The difference is that this +input follows the ``Approach'' entries with leaders and page numbers.) -@Defstr {TOC, ms} -Contains the string printed at the beginning of the table of contents. -@endDefstr - -@DefstrList {MONTH1, ms} -@DefstrItemx {MONTH2, ms} -@DefstrItemx {MONTH3, ms} -@DefstrItemx {MONTH4, ms} -@DefstrItemx {MONTH5, ms} -@DefstrItemx {MONTH6, ms} -@DefstrItemx {MONTH7, ms} -@DefstrItemx {MONTH8, ms} -@DefstrItemx {MONTH9, ms} -@DefstrItemx {MONTH10, ms} -@DefstrItemx {MONTH11, ms} -@DefstrListEndx {MONTH12, ms} -Prints the full name of the month in dates. The default is -@samp{January}, @samp{February}, etc. -@endDefstr - -The following special characters are available@footnote{For an -explanation what special characters are see @ref{Special Characters}.}: - -@Defstr {-, ms} -Prints an em dash. -@endDefstr - -@DefstrList {Q, ms} -@DefstrListEndx {U, ms} -Prints typographer's quotes in troff, and plain quotes in nroff. -@code{\*Q} is the left quote and @code{\*U} is the right quote. -@endDefstr - -Improved accent marks are available in the @file{ms} macros. +@CartoucheExample +.NH 1 +.XN Introduction +@r{@dots{}} +.NH 2 +.XN Methodology +.XH 3 "Fassbinder's Approach" +.XH 3 "Kahiu's Approach" +@r{@dots{}} +.NH 1 +.XN Findings +@r{@dots{}} +@endCartoucheExample -@Defmac {AM, , ms} -Specify this macro at the beginning of your document to enable extended -accent marks and special characters. This is a Berkeley extension. +To get the section number of the numbered headings into the table of +contents entries, we might define @code{XN-REPLACEMENT} as follows. +(We obtain the heading depth from @code{groff} @file{ms}'s internal +register @code{nh*hl}.) -To use the accent marks, place them @strong{after} the character being -accented. +@CartoucheExample +.de XN-REPLACEMENT +.XN-INIT +.XH-UPDATE-TOC \\n[nh*hl] \\$@@ +\&\\*[SN] \\$* +.. +@endCartoucheExample -Note that groff's native support for accents is superior to the -following definitions. -@endDefmac +You can change the style of the leader that bridges each table of +contents entry with its page number; define the @code{TC-LEADER} special +character by using the @code{char} request. A typical leader combines +the dot glyph @samp{.} with a horizontal motion escape sequence to +spread the dots. The width of the page number field is stored in the +@code{TC-MARGIN} register. -The following accent marks are available after invoking the @code{AM} -macro: +@c --------------------------------------------------------------------- -@Defstr {', ms} -Acute accent. -@endDefstr +@node Differences from AT&T ms, ms Naming Conventions, ms Page Layout, ms +@subsection Differences from @acronym{AT&T} @file{ms} +@cindex @file{ms} macros, @code{groff} differences from @acronym{AT&T} +@cindex @acronym{AT&T} @file{ms}, macro package differences -@Defstr {`, ms} -Grave accent. -@endDefstr +The @code{groff} @file{ms} macros are an independent reimplementation, +using no @acronym{AT&T} code. Since they take advantage of the extended +features of @code{groff}, they cannot be used with @acronym{AT&T} +@code{troff}. @code{groff} @file{ms} supports features described above +as Berkeley and Tenth Edition Research Unix extensions, and adds several +of its own. -@Defstr {^, ms} -Circumflex. -@endDefstr +@itemize @bullet +@item +The internals of @code{groff} @file{ms} differ from the internals of +@acronym{AT&T} @file{ms}. Documents that depend upon implementation +details of @acronym{AT&T} @file{ms} may not format properly with +@code{groff} @file{ms}. Such details include macros whose function was +not documented in the @acronym{AT&T} @file{ms} +manual.@footnote{@cite{Typing Documents on the UNIX System: Using the +-ms Macros with Troff and Nroff}, M.@tie{}E.@: Lesk, Bell Laboratories, +1978} +@c XXX: We support RT anyway; maybe we should stop? -@Defstr {\,, ms} -Cedilla. -@endDefstr +@item +The error-handling policy of @code{groff} @file{ms} is to detect and +report errors, rather than to ignore them silently. -@Defstr {~, ms} -Tilde. -@endDefstr +@item +Tenth Edition @c possibly 9th +Research Unix supported @code{P1}/@code{P2} macros to bracket code +examples; @code{groff} @file{ms} does not. -@deffn String @t{\*[:]} -@ifnotinfo -@stindex : @r{[}ms@r{]} -@end ifnotinfo -@ifinfo -@stindex \*[@r{}] @r{[}ms@r{]} -@end ifinfo -Umlaut. -@end deffn +@item +@code{groff} @file{ms} does not work in GNU @code{troff}'s +@acronym{AT&T} compatibility mode. If loaded when that mode is enabled, +it aborts processing with a diagnostic message. -@Defstr {v, ms} -Hacek. -@endDefstr +@item +Multiple line spacing is not supported. Use a larger vertical spacing +instead. -@Defstr {_, ms} -Macron (overbar). -@endDefstr +@item +@code{groff} @file{ms} uses the same header and footer defaults in both +@code{nroff} and @code{troff} modes as @acronym{AT&T} @file{ms} does in +@code{troff} mode; @acronym{AT&T}'s default in @code{nroff} mode is to +put the date, in U.S.@: traditional format (e.g., ``January 1, 2021''), +in the center footer (the @code{CF} string). -@Defstr {., ms} -Underdot. -@endDefstr +@item +Many @code{groff} @file{ms} macros, including those for paragraphs, +headings, and displays, cause a reset of paragraph rendering parameters, +and may change the indentation; they do so not by incrementing or +decrementing it, but by setting it absolutely. This can cause problems +for documents that define additional macros of their own that try to +manipulate indentation. Use the @file{ms} @code{RS} and @code{RE} +macros instead of the @code{in} request. -@Defstr {o, ms} -Ring above. -@endDefstr +@item +@cindex fractional type sizes in @file{ms} macros +@cindex @file{ms} macros, fractional type sizes in +@acronym{AT&T} @file{ms} interpreted the values of the registers +@code{PS} and @code{VS} in points, and did not support the use of +scaling units with them. @code{groff} @file{ms} interprets values of +the registers @code{PS}, @code{VS}, @code{FPS}, and @code{FVS} equal to +or larger than@tie{}1,000 (one thousand) as decimal fractions multiplied +by@tie{}1,000.@footnote{Register values are converted to and stored as +basic units. @xref{Measurements}.} This threshold makes use of a +scaling unit with these parameters practical for high-resolution +devices while preserving backward compatibility. It also permits +expression of non-integral type sizes. For example, @samp{groff +-rPS=10.5p} at the shell prompt is equivalent to placing @samp{.nr PS +10.5p} at the beginning of the document. -The following are standalone characters available after invoking the -@code{AM} macro: +@item +@acronym{AT&T} @file{ms}'s @code{AU} macro supported arguments used with +some document types; @code{groff} @file{ms} does not. -@Defstr {?, ms} -Upside-down question mark. -@endDefstr +@item +Right-aligned displays are available. The @acronym{AT&T} @file{ms} +manual observes that ``it is tempting to assume that @samp{.DS R} will +right adjust lines, but it doesn't work''. In @code{groff} @file{ms}, +it does. -@Defstr {!, ms} -Upside-down exclamation point. -@endDefstr +@item +To make @code{groff} @file{ms} use the default page offset (which also +specifies the left margin), the @code{PO} register must stay undefined +until the first @file{ms} macro is called. -@Defstr {8, ms} -German ß ligature. -@endDefstr +This implies that @samp{\n[PO]} should not be used early in the +document, unless it is changed also: accessing an undefined register +automatically defines it. -@Defstr {3, ms} -Yogh. -@endDefstr +@item +@code{groff} @file{ms} supports the @code{PN} register, but it is not +necessary; you can access the page number via the usual @code{%} +register and invoke the @code{af} request to assign a different format +to it if desired.@footnote{If you redefine the @file{ms} @code{PT} macro +@c I wouldn't mention that, but Lesk 1978 encourages doing so. :-/ +and desire special treatment of certain page numbers (like @samp{1}), +you may need to handle a non-Arabic page number format, as @code{groff} +@file{ms}'s @code{PT} does; see the macro package source. @code{groff} +@file{ms} aliases the @code{PN} register to @code{%}.} -@Defstr {Th, ms} -Uppercase thorn. -@endDefstr +@item +The @acronym{AT&T} @file{ms} manual documents registers @code{CW} and +@code{GW} as setting the default column width and ``intercolumn gap'', +respectively, and which applied when @code{MC} was called with fewer +than two arguments. @code{groff} @file{ms} instead treats @code{MC} +without arguments as synonymous with @code{2C}; there is thus no +occasion for a default column width register. Further, the @code{MINGW} +register and the second argument to @code{MC} specify a @emph{minimum} +space between columns, not the fixed gutter width of @acronym{AT&T} +@file{ms}. -@Defstr {th, ms} -Lowercase thorn. -@endDefstr +@item +The @acronym{AT&T} @file{ms} manual did not document the @code{QI} +register; Berkeley and @code{groff} @file{ms} do. +@end itemize -@Defstr {D-, ms} -Uppercase eth. -@endDefstr +@Defmpreg {GS, ms} +The register @code{GS} is set to@tie{}1 by the @code{groff} @file{ms} +macros, but is not used by the @acronym{AT&T} @file{ms} package. +Documents that need to determine whether they are being formatted with +@code{groff} @file{ms} or another implementation should test this +register. +@endDefmpreg -@Defstr {d-, ms} -Lowercase eth. -@endDefstr +@menu +* Missing Unix Version 7 ms Macros:: +@end menu -@Defstr {q, ms} -Hooked o. -@endDefstr +@c --------------------------------------------------------------------- -@Defstr {ae, ms} -Lowercase æ ligature. -@endDefstr +@node Missing Unix Version 7 ms Macros, , Differences from AT&T ms, Differences from AT&T ms +@subsubsection Unix Version 7 @file{ms} macros not implemented by @code{groff} @file{ms} + +Several macros described in the Unix Version@tie{}7 @file{ms} +documentation are unimplemented by @code{groff} @file{ms} because they +are specific to the requirements of documents produced internally by +Bell Laboratories, some of which also require a glyph for the Bell +System logo that @code{groff} does not support. These macros +implemented several document type formats +(@code{EG}, @c engineer's notes +@code{IM}, @c internal memorandum +@code{MF}, @c memorandum for file +@code{MR}, @c memorandum for record +@code{TM}, @c technical memorandum +@code{TR}), @c technical report +were meaningful only in conjunction with the use of certain document +types +(@code{AT}, @c attachments +@code{CS}, @c cover sheet info for `TM` documents +@code{CT}, @c copies to +@code{OK}, @c "other keywords" for `TM` documents +@code{SG}), @c signatures for `TM` documents +stored the postal addresses of Bell Labs sites +(@code{HO}, @c Holmdel +@code{IH}, @c Naperville +@code{MH}, @c Murray Hill +@code{PY}, @c Piscataway +@code{WH}), @c Whippany +or lacked a stable definition over time +(@code{UX}). @c Unix; on 1st use, add footnote id'ing trademark owner +To compatibly render historical @file{ms} documents using these macros, +we advise your documents to invoke the @code{rm} request to remove any +such macros it uses and then define replacements with an authentically +typeset original at hand.@footnote{The removal beforehand is necessary +because @code{groff} @file{ms} aliases these macros to a diagnostic +macro, and you want to redefine the aliased name, not its target.} For +informal purposes, a simple definition of @code{UX} should maintain the +readability of the document's substance. -@Defstr {Ae, ms} -Uppercase Æ ligature. -@endDefstr +@CartoucheExample +.rm UX +.ds UX Unix\" +@endCartoucheExample @c --------------------------------------------------------------------- -@node Differences from AT&T ms, Naming Conventions, ms Page Layout, ms -@subsection Differences from @acronym{AT&T} @file{ms} -@cindex @code{ms} macros, differences from @acronym{AT&T} -@cindex @acronym{AT&T} @code{troff}, @code{ms} macro package differences +@node ms Legacy Features, ms Naming Conventions, Differences from AT&T ms, ms +@subsection Legacy Features +@cindex @file{ms} macros, strings +@cindex @file{ms} macros, special characters +@cindex @file{ms} macros, accent marks +@cindex accent marks [@file{ms}] +@cindex special characters [@file{ms}] +@cindex strings [@file{ms}] -This section lists the (minor) differences between the @code{groff -ms} -macros and @acronym{AT&T} @code{troff -ms} macros. +@code{groff} @file{ms} retains some legacy features solely to support +formatting of historical documents; contemporary ones should not use +them because they can render poorly. See the @cite{groff_char@r{(7)}} +man page. -@itemize @bullet -@item -The internals of @code{groff -ms} differ from the internals of -@acronym{AT&T} @code{troff -ms}. Documents that depend upon -implementation details of @acronym{AT&T} @code{troff -ms} may not format -properly with @code{groff -ms}. +@unnumberedsubsubsec AT&T accent mark strings -@item -The general error-handling policy of @code{groff -ms} is to detect and -report errors, rather than silently to ignore them. +AT&T @file{ms} defined accent mark strings as follows. -@item -@code{groff -ms} does not work in compatibility mode (that is, with the -@option{-C} option). +@Defmpstr {@code{'}, ms} +Apply acute accent to subsequent glyph. +@endDefmpstr -@item -There is no special support for typewriter-like devices. +@Defmpstr {@code{`}, ms} +Apply grave accent to subsequent glyph. +@endDefmpstr -@item -@code{groff -ms} does not provide cut marks. +@Defmpstr {:, ms} +Apply dieresis (umlaut) to subsequent glyph. +@endDefmpstr -@item -Multiple line spacing is not supported. Use a larger vertical spacing -instead. +@Defmpstr {^, ms} +Apply circumflex accent to subsequent glyph. +@endDefmpstr -@item -Some Unix @code{ms} documentation says that the @code{CW} and @code{GW} -number registers can be used to control the column width and gutter -width, respectively. These number registers are not used in @code{groff --ms}. +@Defmpstr {~, ms} +Apply tilde accent to subsequent glyph. +@endDefmpstr -@item -Macros that cause a reset (paragraphs, headings, etc.@:) may change the -indentation. Macros that change the indentation do not increment or -decrement the indentation, but rather set it absolutely. This can cause -problems for documents that define additional macros of their own. The -solution is to use not the @code{in} request but instead the @code{RS} -and @code{RE} macros. +@Defmpstr {C, ms} +Apply caron to subsequent glyph. +@endDefmpstr -@item -To make @code{groff -ms} use the default page offset (which also -specifies the left margin), the @code{PO} register must stay undefined -until the first @file{-ms} macro is evaluated. This implies that -@code{PO} should not be used early in the document, unless it is changed -also: Remember that accessing an undefined register automatically -defines it. -@end itemize +@Defmpstr {\,, ms} +Apply cedilla to subsequent glyph. +@endDefmpstr -@Defmpreg {GS, ms} -This number register is set to@tie{}1 by the @code{groff -ms} macros, -but it is not used by the @code{AT&T} @code{troff -ms} macros. -Documents that need to determine whether they are being formatted with -@code{AT&T} @code{troff -ms} or @code{groff -ms} should use this number -register. -@endDefmpreg +@unnumberedsubsubsec Berkeley accent mark and glyph strings -Emulations of a few ancient Bell Labs macros can be re-enabled by -calling the otherwise undocumented @code{SC} section-header macro. -Calling @code{SC} enables @code{UC} for marking up a product or -application name, and the pair @code{P1}/@code{P2} for surrounding code -example displays. +Berkeley @file{ms} offered an @code{AM} macro; calling it redefined the +AT&T accent mark strings (except for @samp{\*C}), applied them to the +@emph{preceding} glyph, and defined additional strings, some for spacing +glyphs. -These are not enabled by default because (a)@tie{}they were not -documented, in the original @code{ms} manual, and (b)@tie{}the @code{P1} -and @code{UC} macros collide with different macros with the same names -in the Berkeley version of @code{ms}. +@Defmac {AM, , ms} +Enable alternative accent mark and glyph-producing strings. +@endDefmac -These @code{groff} emulations are sufficient to give back the 1976 -Kernighan@tie{}& Cherry paper @cite{Typesetting Mathematics -- User's -Guide} its section headings, and restore some text that had gone missing -as arguments of undefined macros. No warranty express or implied is -given as to how well the typographic details these produce match the -original Bell Labs macros. +@Defmpstr {@code{'}, ms} +Apply acute accent to preceding glyph. +@endDefmpstr -@menu -* Missing ms Macros:: -* Additional ms Macros:: -@end menu +@Defmpstr {@code{`}, ms} +Apply grave accent to preceding glyph. +@endDefmpstr -@c --------------------------------------------------------------------- +@Defmpstr {:, ms} +Apply dieresis (umlaut) to preceding glyph. +@endDefmpstr -@node Missing ms Macros, Additional ms Macros, Differences from AT&T ms, Differences from AT&T ms -@subsubsection @code{troff} macros not appearing in @code{groff} +@Defmpstr {^, ms} +Apply circumflex accent to preceding glyph. +@endDefmpstr -Macros missing from @code{groff -ms} are cover page macros specific to -Bell Labs and Berkeley. The macros known to be missing are: +@Defmpstr {~, ms} +Apply tilde accent to preceding glyph. +@endDefmpstr -@table @code -@item .TM -Technical memorandum; a cover sheet style +@Defmpstr {\,, ms} +Apply cedilla to preceding glyph. +@endDefmpstr -@item .IM -Internal memorandum; a cover sheet style +@Defmpstr {/, ms} +Apply stroke (slash) to preceding glyph. +@endDefmpstr -@item .MR -Memo for record; a cover sheet style +@Defmpstr {v, ms} +Apply caron to preceding glyph. +@endDefmpstr -@item .MF -Memo for file; a cover sheet style +@Defmpstr {_, ms} +Apply macron to preceding glyph. +@endDefmpstr -@item .EG -Engineer's notes; a cover sheet style +@Defmpstr {., ms} +Apply underdot to preceding glyph. +@endDefmpstr -@item .TR -Computing Science Tech Report; a cover sheet style +@Defmpstr {o, ms} +Apply ring accent to preceding glyph. +@endDefmpstr -@item .OK -Other keywords +@Defmpstr {?, ms} +Interpolate inverted question mark. +@endDefmpstr -@item .CS -Cover sheet information +@Defmpstr {!, ms} +Interpolate inverted exclamation mark. +@endDefmpstr -@item .MH -A cover sheet macro -@end table +@Defmpstr {8, ms} +Interpolate small letter sharp s. +@endDefmpstr -@c --------------------------------------------------------------------- +@Defmpstr {q, ms} +Interpolate small letter o with hook accent (ogonek). +@endDefmpstr -@node Additional ms Macros, , Missing ms Macros, Differences from AT&T ms -@subsubsection @code{groff} macros not appearing in @acronym{AT&T} @code{troff} +@Defmpstr {3, ms} +Interpolate small letter yogh. +@endDefmpstr -The @code{groff -ms} macros have a few minor extensions compared to the -@acronym{AT&T} @code{troff -ms} macros. +@Defmpstr {d-, ms} +Interpolate small letter eth. +@endDefmpstr -@Defmac {AM, , ms} -Improved accent marks. @xref{ms Strings and Special Characters}, for -details. -@endDefmac +@Defmpstr {D-, ms} +Interpolate capital letter eth. +@endDefmpstr -@Defmac {DS, @t{I}, ms} -Indented display. The default behavior of @acronym{AT&T} @code{troff --ms} was to indent; the @code{groff} default prints displays flush left -with the body text. -@endDefmac +@Defmpstr {th, ms} +Interpolate small letter thorn. +@endDefmpstr -@Defmac {CW, , ms} -Print text in @code{constant width} (Courier) font. -@endDefmac +@Defmpstr {Th, ms} +Interpolate capital letter thorn. +@endDefmpstr -@Defmac {IX, , ms} -Indexing term (printed on standard error). You can write a script to -capture and process an index generated in this manner. -@endDefmac +@Defmpstr {ae, ms} +Interpolate small æ ligature. +@endDefmpstr -The following additional number registers -appear in @code{groff -ms}: +@Defmpstr {Ae, ms} +Interpolate capital Æ ligature. +@endDefmpstr -@Defmpreg {MINGW, ms} -Specifies a minimum space between columns (for multi-column output); -this takes the place of the @code{GW} register that was documented but -apparently not implemented in @acronym{AT&T} @code{troff}. -@endDefmpreg +@Defmpstr {oe, ms} +Interpolate small oe ligature. +@endDefmpstr -Several new string registers are available as well. You can change -these to handle (for example) the local language. @xref{ms Strings and -Special Characters}, for details. +@Defmpstr {OE, ms} +Interpolate capital OE ligature. +@endDefmpstr @c --------------------------------------------------------------------- -@node Naming Conventions, , Differences from AT&T ms, ms +@node ms Naming Conventions, , ms Legacy Features, ms @subsection Naming Conventions -@cindex @code{ms} macros, naming conventions -@cindex naming conventions, @code{ms} macros +@cindex @file{ms} macros, naming conventions +@cindex naming conventions, @file{ms} macros -The following conventions are used for names of macros, strings and -number registers. External names available to documents that use the -@code{groff -ms} macros contain only uppercase letters and digits. +The following conventions are used for names of macros, strings, and +registers. External names available to documents that use the +@code{groff} @file{ms} macros contain only uppercase letters and digits. -Internally the macros are divided into modules; naming conventions are -as follows: +Internally, the macros are divided into modules. Conventions for +identifier names are as follows. @itemize @bullet @item @@ -4606,7 +4868,7 @@ Constructed names used to implement arrays are of the form @var{array}@code{!}@var{index}. @end itemize -Thus the groff ms macros reserve the following names: +Thus the @code{groff} @file{ms} macros reserve the following names. @itemize @bullet @item @@ -4617,110 +4879,52 @@ Names containing only uppercase letters and digits. @end itemize -@c ===================================================================== - -@node me, mm, ms, Macro Packages -@section @file{me} -@cindex @code{me} macro package - -@c XXX documentation -@c XXX this is a placeholder until we get stuff knocked into shape -See the @file{meintro.me} and @file{meref.me} documents in groff's -@file{doc} directory. - - -@c ===================================================================== - -@node mm, mom, me, Macro Packages -@section @file{mm} -@cindex @code{mm} macro package - -@c XXX documentation -@c XXX this is a placeholder until we get stuff knocked into shape -See the @cite{groff_mm(7)} man page (type @command{man groff_mm} at the -command line). - - -@c ===================================================================== - -@node mom, , mm, Macro Packages -@section @file{mom} -@cindex @code{mom} macro package - -@c XXX documentation -@c XXX this is a placeholder until we get stuff knocked into shape -The main documentation files for the @file{mom} macros are in -@acronym{HTML} format. Additional, useful documentation is in PDF -format. See the @cite{groff(1)} man page, section ``Installation -Directories'', for their location. - -@itemize @bullet -@item -@file{toc.html} -@noindent -Entry point to the full mom manual. - -@item -@file{macrolist.html} -@noindent -Hyperlinked index of macros with brief descriptions, arranged by -category. - -@item -@file{mom-pdf.pdf} -@noindent -PDF features and usage. -@end itemize - -The mom macros are in active development between groff releases. -The most recent version, along with up-to-date documentation, is -available at @uref{http://www.schaffter.ca/mom/mom-05.html}. - -The @cite{groff_mom(7)} man page (type @command{man groff_mom} at the -command line) contains a partial list of available macros, however their -usage is best understood by consulting the @acronym{HTML} documentation. - @c ===================================================================== @c ===================================================================== -@node gtroff Reference, Preprocessors, Macro Packages, Top -@chapter @code{gtroff} Reference +@node GNU troff Reference, File Formats, Major Macro Packages, Top +@chapter GNU @code{troff} Reference @cindex reference, @code{gtroff} @cindex @code{gtroff}, reference -This chapter covers @strong{all} of the facilities of @code{gtroff}. -Users of macro packages may skip it if not interested in details. +This chapter covers @emph{all} of the facilities of the GNU +@code{troff} formatting engine. Users of macro packages may skip it if +not interested in details. @menu * Text:: +* Page Geometry:: * Measurements:: -* Expressions:: +* Numeric Expressions:: * Identifiers:: -* Embedded Commands:: +* Formatter Instructions:: +* Comments:: * Registers:: -* Manipulating Filling and Adjusting:: +* Manipulating Filling and Adjustment:: * Manipulating Hyphenation:: * Manipulating Spacing:: * Tabs and Fields:: * Character Translations:: -* Troff and Nroff Mode:: +* @code{troff} and @code{nroff} Modes:: * Line Layout:: -* Line Control:: +* Line Continuation:: * Page Layout:: * Page Control:: -* Fonts and Symbols:: -* Sizes:: +* Using Fonts:: +* Manipulating Type Size and Vertical Spacing:: +* Colors:: * Strings:: * Conditionals and Loops:: * Writing Macros:: * Page Motions:: -* Drawing Requests:: +* Drawing Geometric Objects:: +* Deferring Output:: * Traps:: * Diversions:: +* Punning Names:: * Environments:: -* Suppressing output:: -* Colors:: +* Suppressing Output:: * I/O:: * Postprocessor Access:: * Miscellaneous:: @@ -4732,107 +4936,162 @@ Users of macro packages may skip it if not interested in details. @c ===================================================================== -@node Text, Measurements, gtroff Reference, gtroff Reference +@c BEGIN Keep roughly parallel with roff(7) section "Concepts". +@node Text, Measurements, GNU troff Reference, GNU troff Reference @section Text -@cindex text, @code{gtroff} processing - -@code{gtroff} input files contain text with control commands -interspersed throughout. But, even without control codes, @code{gtroff} -still does several things with the input text: - -@itemize @bullet -@item -filling and adjusting - -@item -adding additional space after sentences - -@item -hyphenating - -@item -inserting implicit line breaks -@end itemize +@cindex text, GNU @code{troff} processing + +@acronym{AT&T} @code{troff} was designed to take input as it would be +composed on a typewriter, including the teletypewriters used as early +computer terminals, and relieve the user drafting a document of concern +with details like line length, hyphenation breaking, and the achievement +of straight margins. Early in its development, the program gained the +ability to prepare output for a phototypesetter; a document could then +be prepared for output to either a teletypewriter, a phototypesetter, or +both. GNU @code{troff} continues this tradition of permitting an author +to compose a single master version of a document which can then be +rendered for a variety of output formats or devices. + +@code{roff} input files contain text interspersed with instructions to +control the formatter. Even in the absence of such instructions, GNU +@code{troff} still processes its input in several ways, by filling, +hyphenating, breaking, and adjusting it, and supplementing it with +inter-sentence space. @menu -* Filling and Adjusting:: +* Filling:: * Hyphenation:: * Sentences:: -* Tab Stops:: -* Implicit Line Breaks:: -* Input Conventions:: +* Breaking:: +* Adjustment:: +* Tabs and Leaders:: +* Requests and Macros:: +* Macro Packages:: * Input Encodings:: +* Input Conventions:: @end menu @c --------------------------------------------------------------------- -@node Filling and Adjusting, Hyphenation, Text, Text -@subsection Filling and Adjusting +@node Filling, Sentences, Text, Text +@subsection Filling + +When GNU @code{troff} starts up, it obtains information about the device +for which it is preparing output.@footnote{@xref{Device and Font +Description Files}.} An essential property is the length of the output +line, such as ``6.5 inches''. + +@cindex word, definition of @cindex filling -@cindex adjusting +GNU @code{troff} interprets plain text files employing the Unix +line-ending convention. It reads input a character at a time, +collecting words as it goes, and fits as many words together on an +output line as it can---this is known as @dfn{filling}. To GNU +@code{troff}, a @dfn{word} is any sequence of one or more characters +that aren't spaces or newlines. The exceptions separate +words.@footnote{@slanted{Tabs} and @slanted{leaders} also separate +words. @slanted{Escape sequences} can function as word characters, word +separators, or neither---the last simply have no effect on GNU +@code{troff}'s idea of whether an input character is within a word. +We'll discuss all of these in due course.} To disable filling, see +@ref{Manipulating Filling and Adjustment}. + +@Example +It is a truth universally acknowledged +that a single man in possession of a +good fortune must be in want of a wife. + @result{} It is a truth universally acknowledged that a + @result{} single man in possession of a good fortune must + @result{} be in want of a wife. +@endExample -When @code{gtroff} reads text, it collects words from the input and fits -as many of them together on one output line as it can. This is known as -@dfn{filling}. +@c --------------------------------------------------------------------- -@cindex leading spaces -@cindex spaces, leading and trailing -@cindex extra spaces -@cindex trailing spaces -Once @code{gtroff} has a @dfn{filled} line, it tries to @dfn{adjust} it. -This means it widens the spacing between words until the text reaches -the right margin (in the default adjustment mode). Extra spaces between -words are preserved, but spaces at the end of lines are ignored. Spaces -at the front of a line cause a @dfn{break} (breaks are explained in -@ref{Implicit Line Breaks}). +@node Sentences, Hyphenation, Filling, Text +@subsection Sentences +@cindex sentences -@xref{Manipulating Filling and Adjusting}. +A passionate debate has raged for decades among writers of the English +language over whether more space should appear between adjacent +sentences than between words within a sentence, and if so, how much, and +what other circumstances should influence this spacing.@footnote{A +well-researched jeremiad appreciated by @code{groff} contributors on +both sides of the sentence-spacing debate can be found at +@uref{https://web.archive.org@//web@//20171217060354@//http://www.heracliteanriver.com@//?p=324}.} +GNU @code{troff} follows the example of @acronym{AT&T} @code{troff}; +it attempts to detect the boundaries between sentences, and supplies +additional inter-sentence space between them. -@c --------------------------------------------------------------------- +@Example +Hello, world! +Welcome to groff. + @result{} Hello, world! Welcome to groff. +@endExample -@node Hyphenation, Sentences, Filling and Adjusting, Text -@subsection Hyphenation -@cindex hyphenation +@cindex end-of-sentence characters +@cindex sentence space +@cindex space between sentences +@cindex French spacing +GNU @code{troff} flags certain characters (normally @samp{!}, @samp{?}, +and @samp{.}) as potentially ending a sentence. When GNU @code{troff} +encounters one of these @dfn{end-of-sentence characters} at the end of +an input line, or one of them is followed by two (unescaped) spaces on +the same input line, it appends an inter-word space followed by an +inter-sentence space in the output. -Since the odds are not great for finding a set of words, for every -output line, which fit nicely on a line without inserting excessive -amounts of space between words, @code{gtroff} hyphenates words so that -it can justify lines without inserting too much space between words. It -uses an internal hyphenation algorithm (a simplified version of the -algorithm used within @TeX{}) to indicate which words can be hyphenated -and how to do so. When a word is hyphenated, the first part of the word -is added to the current filled line being output (with an attached -hyphen), and the other portion is added to the next line to be filled. +@Example +R. Harper subscribes to a maxim of P. T. Barnum. + @result{} R. Harper subscribes to a maxim of P. T. Barnum. +@endExample -@xref{Manipulating Hyphenation}. +In the above example, inter-sentence space is not added after @samp{P.} +or @samp{T.} because the periods do not occur at the end of an input +line, nor are they followed by two or more spaces. Let's imagine that +we've heard something about defamation from Mr.@: Harper's attorney, +recast the sentence, and reflowed it in our text editor. -@c --------------------------------------------------------------------- +@Example +I submit that R. Harper subscribes to a maxim of P. T. +Barnum. + @result{} I submit that R. Harper subscribes to a maxim of + @result{} P. T. Barnum. +@endExample -@node Sentences, Tab Stops, Hyphenation, Text -@subsection Sentences -@cindex sentences +``Barnum'' doesn't begin a sentence! What to do? Let us meet our first +@dfn{escape sequence}, a series of input characters that give +instructions to GNU @code{troff} instead of being used to construct +output device glyphs.@footnote{This statement oversimplifies; there are +escape sequences whose purpose is precisely to produce glyphs on the +output device, and input characters that @emph{aren't} part of escape +sequences can undergo a great deal of processing before getting to the +output.} An escape sequence begins with the backslash character @code{\} +by default, an uncommon character in natural language text, and is +@emph{always} followed by at least one other character, hence the term +``sequence''. -Although it is often debated, some typesetting rules say there should be -different amounts of space after various punctuation marks. For -example, the @cite{Chicago typesetting manual} says that a period at the -end of a sentence should have twice as much space following it as would -a comma or a period as part of an abbreviation. +@cindex @code{\&}, at end of sentence +The dummy character escape sequence @code{\&} can be used after an +end-of-sentence character to defeat end-of-sentence detection on a +per-instance basis. We can therefore rewrite our input more +defensively. -@c XXX exact citation of Chicago manual +@Example +I submit that R.\& Harper subscribes to a maxim of P.\& +T.\& Barnum. + @result{} I submit that R. Harper subscribes to a maxim of + @result{} P. T. Barnum. +@endExample -@cindex sentence space -@cindex space between sentences -@cindex french-spacing -@code{gtroff} does this by flagging certain characters (normally -@samp{!}, @samp{?}, and @samp{.}) as @dfn{end-of-sentence} characters. -When @code{gtroff} encounters one of these characters at the end of a -line, it appends a normal space followed by a @dfn{sentence space} in -the formatted output. (This justifies one of the conventions mentioned -in @ref{Input Conventions}.) +Adding text caused our input to wrap; now, we don't need @code{\&} after +@samp{T.} but we do after @samp{P.}. Consistent use of the escape +sequence ensures that potential sentence boundaries are robust to +editing activities. Further advice along these lines will follow in +@ref{Input Conventions}. -@cindex transparent characters -@cindex character, transparent +@cindex end-of-sentence transparent characters +@cindex characters, end-of-sentence transparent @cindex @code{dg} glyph, at end of sentence +@cindex @code{dd} glyph, at end of sentence @cindex @code{rq} glyph, at end of sentence @cindex @code{cq} glyph, at end of sentence @cindex @code{"}, at end of sentence @@ -4840,405 +5099,1071 @@ in @ref{Input Conventions}.) @cindex @code{)}, at end of sentence @cindex @code{]}, at end of sentence @cindex @code{*}, at end of sentence -In addition, the following characters and symbols are treated -transparently while handling end-of-sentence characters: @samp{"}, -@samp{'}, @samp{)}, @samp{]}, @samp{*}, @code{\[dg]}, @code{\[rq]}, and -@code{\[cq]}. - -See the @code{cflags} request in @ref{Using Symbols}, for more details. +@cindex special characters +@cindex characters, special +Normally, the occurrence of a visible non-end-of-sentence character (as +opposed to a space or tab) immediately after an end-of-sentence +character cancels detection of the end of a sentence. For example, it +would be incorrect for GNU @code{troff} to infer the end of a sentence +after the dot in @samp{3.14159}. However, several characters are +treated @emph{transparently} after the occurrence of an end-of-sentence +character. That is, GNU @code{troff} does not cancel end-of-sentence +detection when it processes them. This is because such characters are +often used as footnote markers or to close quotations and +parentheticals. The default set is @samp{"}, @samp{'}, @samp{)}, +@samp{]}, @samp{*}, @code{\[dg]}, @code{\[dd]}, @code{\[rq]}, and +@code{\[cq]}. The last four are examples of @dfn{special characters}, +escape sequences whose purpose is to obtain glyphs that are not easily +typed at the keyboard, or which have special meaning to GNU @code{troff} +(like @code{\} itself).@footnote{The mnemonics for the special +characters shown here are ``dagger'', ``double dagger'', ``right +(double) quote'', and ``closing (single) quote''. See the +@cite{groff_char@r{(7)}} man page.} + +@Example +\[lq]The idea that the poor should have leisure has always +been shocking to the rich.\[rq] +(Bertrand Russell, 1935) +@c XXX: @iftex puts a blank line on the output. This seems like a bug. +@c @newline works around it. But we need a weird inverse indent. +@iftex @ + @result{} @quotedblleft{}The idea that the poor should have + @result{} leisure has always been shocking to + @result{} the rich.@quotedblright{} (Bertrand Russell, 1935) +@end iftex +@ifnottex + @result{} "The idea that the poor should have + @result{} leisure has always been shocking to + @result{} the rich." (Bertrand Russell, 1935) +@end ifnottex +@endExample -@cindex @code{\&}, at end of sentence -To prevent the insertion of extra space after an end-of-sentence -character (at the end of a line), append @code{\&}. +The sets of characters that potentially end sentences or are transparent +to sentence endings are configurable. See the @code{cflags} request in +@ref{Using Symbols}. To change the additional inter-sentence space +amount---even to remove it entirely---see @ref{Manipulating Filling and +Adjustment}. @c --------------------------------------------------------------------- -@node Tab Stops, Implicit Line Breaks, Sentences, Text -@subsection Tab Stops -@cindex tab stops -@cindex stops, tabulator -@cindex tab character -@cindex character, tabulator - -@cindex @acronym{EBCDIC} encoding -@cindex encoding, @acronym{EBCDIC} -@code{gtroff} translates @dfn{tabulator characters}, also called -@dfn{tabs} (normally code point @acronym{ASCII} @code{0x09} or -@acronym{EBCDIC} @code{0x05}), in the input into movements to the next -tabulator stop. These tab stops are initially located every half inch -across the page. Using this, simple tables can be made easily. -However, it can often be deceptive as the appearance (and width) of the -text on a terminal and the results from @code{gtroff} can vary greatly. - -Also, a possible sticking point is that lines beginning with tab -characters are still filled, again producing unexpected results. For -example, the following input - -@multitable {12345678} {12345678} {12345678} {12345678} -@item -@tab 1 @tab 2 @tab 3 -@item -@tab @tab 4 @tab 5 -@end multitable +@node Hyphenation, Breaking, Sentences, Text +@subsection Hyphenation +@cindex hyphenation -@noindent -produces +When an output line is nearly full, it is uncommon for the next word +collected from the input to exactly fill it---typically, there is room +left over only for part of the next word. The process of splitting a +word so that it appears partially on one line (with a hyphen to indicate +to the reader that the word has been broken) with its remainder on the +next is @dfn{hyphenation}. Hyphenation points can be manually +specified; GNU @code{troff} also uses a hyphenation algorithm and +language-specific pattern files (based on those used in @TeX{}) to +decide which words can be hyphenated and where. + +Hyphenation does not always occur even when the hyphenation rules for a +word allow it; it can be disabled, and when not disabled there are +several parameters that can prevent it in certain circumstances. +@xref{Manipulating Hyphenation}. -@multitable {12345678} {12345678} {12345678} {12345678} {12345678} {12345678} {12345678} -@item -@tab 1 @tab 2 @tab 3 @tab @tab 4 @tab 5 -@end multitable +@c --------------------------------------------------------------------- + +@node Breaking, Adjustment, Hyphenation, Text +@subsection Breaking +@cindex break +@cindex implicit line break +@cindex line break, output +@cindex output line break -@xref{Tabs and Fields}. +Once an output line is full, the next word (or remainder of a hyphenated +one) is placed on a different output line; this is called a @dfn{break}. +In this manual and in @code{roff} discussions generally, a ``break'' if +not further qualified always refers to the termination of an output +line. When the formatter is filling text, it introduces breaks +automatically to keep output lines from exceeding the configured line +length. After an automatic break, GNU @code{troff} adjusts the line if +applicable (see below), and then resumes collecting and filling text on +the next output line. -@c --------------------------------------------------------------------- +Sometimes, a line cannot be broken automatically. This usually does +not happen with natural language text unless the output line length has +been manipulated to be extremely short, but it can with specialized +text like program source code. We can use @code{perl} at the shell +prompt to contrive an example of failure to break the line. We also +employ the @option{-z} option to suppress normal output. -@node Implicit Line Breaks, Input Conventions, Tab Stops, Text -@subsection Implicit Line Breaks -@cindex implicit line breaks -@cindex implicit breaks of lines -@cindex line, implicit breaks -@cindex break, implicit -@cindex line break +@Example +$ perl -e 'print "#" x 80, "\n";' | nroff -z + @error{} warning: cannot break line +@endExample -An important concept in @code{gtroff} is the @dfn{break}. When a break -occurs, @code{gtroff} outputs the partially filled line (unjustified), -and resumes collecting and filling text on the next output line. +The remedy for these cases is to tell GNU @code{troff} where the line +may be broken without hyphens. This is done with the non-printing break +point escape sequence @samp{\:}; see @ref{Manipulating Hyphenation}. @cindex blank line @cindex empty line @cindex line, blank @cindex blank line macro (@code{blm}) -There are several ways to cause a break in @code{gtroff}. A blank line -not only causes a break, but it also outputs a one-line vertical space -(effectively a blank line). Note that this behaviour can be modified -with the blank line macro request @code{blm}. @xref{Blank Line Traps}. +What if the document author wants to stop filling lines temporarily, for +instance to start a new paragraph? There are several solutions. A +blank input line not only causes a break, but by default it also outputs +a one-line vertical space (effectively a blank output line). This +behavior can be modified; see @ref{Blank Line Traps}. Macro packages +may discourage or disable the blank line method of paragraphing in favor +of their own macros. -@cindex fill mode -@cindex mode, fill -@cindex leading spaces macro (@code{lsm}) -A line that begins with a space causes a break and the space is output -at the beginning of the next line. Note that this space isn't adjusted, -even in fill mode; however, the behaviour can be modified with the -leading spaces macro request @code{lsm}. @xref{Leading Spaces Traps}. +@cindex leading spaces +@cindex spaces, leading and trailing +@cindex trailing spaces on text lines +@cindex leading space macro (@code{lsm}) +A line that begins with one or more spaces causes a break. The spaces +are output at the beginning of the next line without being +@emph{adjusted} (see below); however, this behavior can be modified +(@pxref{Leading Space Traps}). Again, macro packages may provide other +methods of producing indented paragraphs. Trailing spaces on text lines +are discarded.@footnote{``Text lines'' are defined in @ref{Requests and +Macros}.} + +What if the file ends before enough words have been collected to fill an +output line? Or the output line is exactly full but not yet broken, and +there is no more input? GNU @code{troff} interprets the end of input as +a break. Certain requests also cause breaks, implicitly or explicitly. +This is discussed in @ref{Manipulating Filling and Adjustment}. -The end of file also causes a break -- otherwise the last line of the -document may vanish! +@c --------------------------------------------------------------------- + +@node Adjustment, Tabs and Leaders, Breaking, Text +@subsection Adjustment -Certain requests also cause breaks, implicitly or explicitly. This is -discussed in @ref{Manipulating Filling and Adjusting}. +@cindex extra spaces between words +After GNU @code{troff} performs an automatic break, it may then +@dfn{adjust} the line, widening inter-word spaces until the text reaches +the right margin. Extra spaces between words are preserved. Leading +and trailing spaces are handled as noted above. Text can be aligned to +the left or right margin only, or centered; see @ref{Manipulating +Filling and Adjustment}. +@c END Keep roughly parallel with roff(7) section "Concepts". @c --------------------------------------------------------------------- -@node Input Conventions, Input Encodings, Implicit Line Breaks, Text -@subsection Input Conventions -@cindex input conventions -@cindex conventions for input +@node Tabs and Leaders, Input Conventions, Adjustment, Text +@subsection Tabs and Leaders -Since @code{gtroff} does filling automatically, it is traditional in -@code{groff} not to try and type things in as nicely formatted -paragraphs. These are some conventions commonly used when typing -@code{gtroff} text: +@cindex horizontal tab character +@cindex tab character +@cindex character, horizontal tab +@cindex leader character +@cindex character, leader +@cindex tab stops +@cindex stops, tab +GNU @code{troff} translates input horizontal tab characters (``tabs'') +and @key{Control+A} characters (``leaders'') into movements to the next +tab stop. Tabs simply move to the next tab stop; leaders place enough +periods to fill the space. Tab stops are by default located every half +inch measured from the drawing position corresponding to the beginning +of the input line; see @ref{Page Geometry}. Tabs and leaders do not +cause breaks and therefore do not interrupt filling. Below, we use +arrows @arrow{} and bullets @bullet{} to indicate input tabs and +leaders, respectively. + +@Example +1 +@arrow{} 2 @arrow{} 3 @bullet{} 4 +@arrow{} @bullet{} 5 +@result{} 1 2 3.......4 ........5 +@endExample + +Tabs and leaders lend themselves to table construction.@footnote{``Tab'' +is short for ``tabulation'', revealing the term's origin as a spacing +mechanism for table arrangement.} The tab and leader glyphs can be +configured, and further facilities for sophisticated table composition +are available; see @ref{Tabs and Fields}. There are many details to +track when using such low-level features, so most users turn to the +@cite{tbl@r{(1)}} preprocessor to lay out tables. -@itemize @bullet -@item -Break lines after punctuation, particularly at the end of a sentence and -in other logical places. Keep separate phrases on lines by themselves, -as entire phrases are often added or deleted when editing. +@c --------------------------------------------------------------------- -@item -Try to keep lines less than 40--60@tie{}characters, to allow space for -inserting more text. +@node Requests and Macros, Macro Packages, Tabs and Leaders, Text +@subsection Requests and Macros -@item -Do not try to do any formatting in a @acronym{WYSIWYG} manner (i.e., -don't try using spaces to get proper indentation). -@end itemize +We have now encountered almost all of the syntax there is in the +@code{roff} language, with an exception already noted in passing. +@cindex request +@cindex control character (@code{.}) +@cindex character, control (@code{.}) +@cindex no-break control character (@code{'}) +@cindex character, no-break control (@code{'}) +@cindex control character, no-break (@code{'}) +A @dfn{request} is an instruction to the formatter that occurs after a +@dfn{control character}, which is recognized at the beginning of an +input line. The regular control character is a dot (@code{.}). Its +counterpart, the @dfn{no-break control character}, a neutral apostrophe +(@code{'}), suppresses the break that is implied by some requests. +These characters were chosen because it is uncommon for lines of text in +natural languages to begin with them. +@cindex dummy character (@code{\&}), as control character suppressor +@cindex character, dummy (@code{\&}), as control character suppressor +If you require a formatted period or apostrophe (closing single +quotation mark) where GNU @code{troff} is expecting a control character, +prefix the dot or neutral apostrophe with the dummy character escape +sequence, @samp{\&}. + +@cindex control line +An input line beginning with a control character is called a +@dfn{control line}. +@cindex text line +Every line of input that is not a control line is a @dfn{text +line}.@footnote{The @code{\@key{RET}} escape sequence can alter how an +input line is classified; see @ref{Line Continuation}.} + +@cindex argument +Requests often take @dfn{arguments}, words (separated from the request +name and each other by spaces) that specify details of the action GNU +@code{troff} is expected to perform. If a request is meaningless +without arguments, it is typically ignored. + +GNU @code{troff}'s requests and escape sequences comprise the control +language of the formatter. Of key importance are the requests that +define macros. Macros are invoked like requests, enabling the request +repertoire to be extended or overridden.@footnote{Argument handling in +macros is more flexible but also more complex. @xref{Calling Macros}.} + +@cindex macro +@cindex calling a macro +@cindex interpolation +A @dfn{macro} can be thought of as an abbreviation you can define for a +collection of control and text lines. When the macro is @dfn{called} by +giving its name after a control character, it is replaced with what it +stands for. The process of textual replacement is known as +@dfn{interpolation}.@footnote{Some escape sequences undergo +interpolation as well.} Interpolations are handled as soon as they are +recognized, and once performed, a @code{roff} formatter scans the +replacement for further requests, macro calls, and escape sequences. + +In @code{roff} systems, the @code{de} request defines a +macro.@footnote{GNU @code{troff} offers additional ones. @xref{Writing +Macros}.} + +@Example +.de DATE +2020-11-14 +.. +@endExample + +@noindent +The foregoing input produces no output by itself; all we have done is +store some information. Observe the pair of dots that ends the macro +definition. This is a default; you can specify your own terminator for +the macro definition as the second argument to the @code{de} request. + +@Example +.de NAME ENDNAME +Heywood Jabuzzoff +.ENDNAME +@endExample + +In fact, the ending marker is itself the name of a macro to be +called, or a request to be invoked, if it is defined at the time its +control line is read. + +@Example +.de END +Big Rip +.. +.de START END +Big Bang +.END +.START + @result{} Big Rip Big Bang +@endExample + +@noindent +In the foregoing example, ``Big Rip'' printed before ``Big Bang'' +because its macro was @emph{called} first. Consider what would happen +if we dropped @code{END} from the @samp{.de START} line and added +@code{..} after @code{.END}. Would the order change? + +Let us consider a more elaborate example. + +@Example +.de DATE +2020-10-05 +.. +. +.de BOSS +D.\& Kruger, +J.\& Peterman +.. +. +.de NOTICE +Approved: +.DATE +by +.BOSS +.. +. +Insert tedious regulatory compliance paragraph here. + +.NOTICE + +Insert tedious liability disclaimer paragraph here. + +.NOTICE + @result{} Insert tedious regulatory compliance paragraph here. + @result{} + @result{} Approved: 2020-10-05 by D. Kruger, J. Peterman + @result{} + @result{} Insert tedious liability disclaimer paragraph here. + @result{} + @result{} Approved: 2020-10-05 by D. Kruger, J. Peterman +@endExample + +@noindent +The above document started with a series of control lines. Three macros +were defined, with a @code{de} request declaring each macro's name, and +the ``body'' of the macro starting on the next line and continuing until +a line with two dots @samp{@code{..}} marked its end. The text proper +began only after the macros were defined; this is a common pattern. +Only the @code{NOTICE} macro was called ``directly'' by the document; +@code{DATE} and @code{BOSS} were called only by @code{NOTICE} itself. +Escape sequences were used in @code{BOSS}, two levels of macro +interpolation deep. + +The advantage in typing and maintenance economy may not be obvious from +such a short example, but imagine a much longer document with dozens of +such paragraphs, each requiring a notice of managerial approval. +Consider what must happen if you are in charge of generating a new +version of such a document with a different date, for a different boss. +With well-chosen macros, you only have to change each datum in one +place. + +In practice, we would probably use strings (@pxref{Strings}) instead of +macros for such simple interpolations; what is important here is to +glimpse the potential of macros and the power of recursive +interpolation. + +We could have defined @code{DATE} and @code{BOSS} in the opposite order; +perhaps less obviously, we could also have defined them @emph{after} +@code{NOTICE}. ``Forward references'' like this are acceptable because +the body of a macro definition is not (completely) interpreted, but +stored instead (@pxref{Copy Mode}). While a macro is being defined (or +appended to), requests are not interpreted and macros not interpolated, +whereas some commonly used escape sequences @emph{are} interpreted. +@code{roff} systems also support recursive macro calls, as long as you +have a way to break the recursion (@pxref{Conditionals and Loops}). +Maintainable @code{roff} documents tend to arrange macro definitions to +minimize forward references. @c --------------------------------------------------------------------- -@node Input Encodings, , Input Conventions, Text +@node Macro Packages, Input Encodings, Requests and Macros, Text +@subsection Macro Packages +@cindex macro package +@cindex package, macro + +@c TODO: Consider parallelizing with groff_tmac(5) "Description". +Macro definitions can be collected into @dfn{macro files}, @code{roff} +input files designed to produce no output themselves but instead ease +the preparation of other @code{roff} documents. There is no syntactical +difference between a macro file and any other @code{roff} document; only +its purpose distinguishes it. When a macro file is installed at a +standard location and suitable for use by a general audience, it is +often termed a @dfn{macro package}.@footnote{Macro files and packages +frequently define registers and strings as well.} Macro packages can be +loaded by supplying the @option{-m} option to GNU @command{troff} or a +@code{groff} front end. Alternatively, a document requiring a macro +package can load it with the @code{mso} (``macro source'') request. + +@c --------------------------------------------------------------------- + +@c TODO: Move a lot of this node to the "Invoking groff" chapter. Some +@c of the discussion is better placed in discussion of output drivers +@c (e.g., what character encodings _they_ support for output and their +@c responsibility for converting to them) as well. + +@node Input Encodings, Input Conventions, Macro Packages, Text @subsection Input Encodings -Currently, the following input encodings are available. +The @command{groff} command's @option{-k} option calls the +@command{preconv} preprocessor to perform input character encoding +conversions. Input to the GNU @code{troff} formatter itself, on the +other hand, must be in one of two encodings it can recognize. -@table @asis +@table @code @item cp1047 @cindex encoding, input, @acronym{EBCDIC} @cindex @acronym{EBCDIC}, input encoding @cindex input encoding, @acronym{EBCDIC} -@cindex encoding, input, cp1047 -@cindex cp1047, input encoding -@cindex input encoding, cp1047 -@cindex IBM cp1047 input encoding +@cindex encoding, input, code page 1047 +@cindex code page 1047, input encoding +@cindex input encoding, code page 1047 +@cindex IBM code page 1047 input encoding @pindex cp1047.tmac -This input encoding works only on @acronym{EBCDIC} platforms (and vice -versa, the other input encodings don't work with @acronym{EBCDIC}); the -file @file{cp1047.tmac} is by default loaded at start-up. - -@item latin-1 -@cindex encoding, input, @w{latin-1} (ISO @w{8859-1}) -@cindex @w{latin-1} (ISO @w{8859-1}), input encoding -@cindex ISO @w{8859-1} (@w{latin-1}), input encoding -@cindex input encoding, @w{latin-1} (ISO @w{8859-1}) +The code page 1047 input encoding works only on @acronym{EBCDIC} +platforms (and conversely, the other input encodings don't work with +@acronym{EBCDIC}); the file @file{cp1047.tmac} is loaded at startup. + +@item latin1 +@cindex encoding, input, @w{Latin-1} (ISO @w{8859-1}) +@cindex @w{Latin-1} (ISO @w{8859-1}), input encoding +@cindex ISO @w{8859-1} (@w{Latin-1}), input encoding +@cindex input encoding, @w{Latin-1} (ISO @w{8859-1}) @pindex latin1.tmac -This is the default input encoding on non-@acronym{EBCDIC} platforms; -the file @file{latin1.tmac} is loaded at start-up. - -@item latin-2 -@cindex encoding, input, @w{latin-2} (ISO @w{8859-2}) -@cindex @w{latin-2} (ISO @w{8859-2}), input encoding -@cindex ISO @w{8859-2} (@w{latin-2}), input encoding -@cindex input encoding, @w{latin-2} (ISO @w{8859-2}) +ISO @w{Latin-1}, an encoding for Western European languages, is the +default input encoding on non-@acronym{EBCDIC} platforms; the file +@file{latin1.tmac} is loaded at startup. +@end table + +@noindent +Any document that is encoded in ISO 646:1991 (a descendant of USAS +@w{X3.4-1968} or ``US-ASCII''), or, equivalently, uses only code points +from the ``C0 Controls'' and ``Basic Latin'' parts of the Unicode +character set is also a valid ISO @w{Latin-1} document; the standards +are interchangeable in their first 128 code points.@footnote{The +@emph{semantics} of certain punctuation code points have gotten stricter +with the successive standards, a cause of some frustration among man +page writers; see the @cite{groff_char@r{(7)}} man page.} + +Other encodings are supported by means of macro packages. + +@table @code +@item latin2 +@cindex encoding, input, @w{Latin-2} (ISO @w{8859-2}) +@cindex @w{Latin-2} (ISO @w{8859-2}), input encoding +@cindex ISO @w{8859-2} (@w{Latin-2}), input encoding +@cindex input encoding, @w{Latin-2} (ISO @w{8859-2}) @pindex latin2.tmac -To use this encoding, either say @w{@samp{.mso latin2.tmac}} at the very -beginning of your document or use @samp{-mlatin2} as a command-line -argument for @code{groff}. - -@item latin-5 -@cindex encoding, input, @w{latin-5} (ISO @w{8859-9}) -@cindex @w{latin-5} (ISO @w{8859-9}), input encoding -@cindex ISO @w{8859-9} (@w{latin-5}), input encoding -@cindex input encoding, @w{latin-5} (ISO @w{8859-9}) +To use ISO @w{Latin-2}, an encoding for Central and Eastern European +languages, invoke @w{@samp{.mso latin2.tmac}} at the beginning of your +document or supply @samp{-mlatin2} as a command-line argument to +@code{groff}. + +@item latin5 +@cindex encoding, input, @w{Latin-5} (ISO @w{8859-9}) +@cindex @w{Latin-5} (ISO @w{8859-9}), input encoding +@cindex ISO @w{8859-9} (@w{Latin-5}), input encoding +@cindex input encoding, @w{Latin-5} (ISO @w{8859-9}) @pindex latin5.tmac -For Turkish. Either say @w{@samp{.mso latin5.tmac}} at the very -beginning of your document or use @samp{-mlatin5} as a command-line -argument for @code{groff}. - -@item latin-9 (latin-0) -@cindex encoding, input, @w{latin-9} (@w{latin-0}, ISO @w{8859-15}) -@cindex @w{latin-9} (@w{latin-0}, ISO @w{8859-15}), input encoding -@cindex ISO @w{8859-15} (@w{latin-9}, @w{latin-0}), input encoding -@cindex input encoding, @w{latin-9} (@w{latin-9}, ISO @w{8859-15}) +To use ISO @w{Latin-5}, an encoding for the Turkish language, invoke +@w{@samp{.mso latin5.tmac}} at the beginning of your document or +supply @samp{-mlatin5} as a command-line argument to @code{groff}. + +@item latin9 +@cindex encoding, input, @w{Latin-9} (ISO @w{8859-15}) +@cindex @w{Latin-9} (ISO @w{8859-15}), input encoding +@cindex ISO @w{8859-15} (@w{Latin-9}), input encoding +@cindex input encoding, @w{Latin-9} (ISO @w{8859-15}) @pindex latin9.tmac -This encoding is intended (at least in Europe) to replace @w{latin-1} -encoding. The main difference to @w{latin-1} is that @w{latin-9} -contains the Euro character. To use this encoding, either say -@w{@samp{.mso latin9.tmac}} at the very beginning of your document or -use @samp{-mlatin9} as a command-line argument for @code{groff}. +ISO @w{Latin-9} succeeds @w{Latin-1}; it includes a Euro sign and better +glyph coverage for French. To use this encoding, invoke @w{@samp{.mso +latin9.tmac}} at the beginning of your document or supply +@samp{-mlatin9} as a command-line argument to @code{groff}. @end table -Note that it can happen that some input encoding characters are not -available for a particular output device. For example, saying - -@Example -groff -Tlatin1 -mlatin9 ... -@endExample - -@noindent -fails if you use the Euro character in the input. Usually, this -limitation is present only for devices that have a limited set of -output glyphs (e.g.@: @option{-Tascii} and @option{-Tlatin1}); for other -devices it is usually sufficient to install proper fonts that contain -the necessary glyphs. +Some characters from an input encoding may not be available with a +particular output driver, or their glyphs may not have representation in +the font used. For terminal devices, fallbacks are defined, like +@samp{EUR} for the Euro sign and @samp{(C)} for the copyright sign. For +typesetter devices, you may need to ``mount'' fonts that support glyphs +required by the document. @xref{Font Positions}. @pindex freeeuro.pfa @pindex ec.tmac -Due to the importance of the Euro glyph in Europe, the groff package now -comes with a @sc{PostScript} font called @file{freeeuro.pfa}, which -provides various glyph shapes for the Euro. In other words, -@w{latin-9} encoding is supported for the @option{-Tps} device out of -the box (@w{latin-2} isn't). +Because a Euro glyph was not historically defined in PostScript fonts, +@code{groff} comes with a font called @file{freeeuro.pfa} that provides +the Euro in several styles. Standard PostScript fonts contain the +glyphs from @w{Latin-5} and @w{Latin-9} that @w{Latin-1} lacks, so these +encodings are supported for the @option{ps} and @option{pdf} output +devices as @code{groff} ships, while @w{Latin-2} is not. + +Unicode supports characters from all other input encodings; the +@option{utf8} output driver for terminals therefore does as well. The +DVI output driver supports the @w{Latin-2} and @w{Latin-9} encodings if +the command-line option @option{-mec} is used as well. @footnote{The +DVI output device defaults to using the Computer Modern (CM) fonts; +@file{ec.tmac} loads the EC fonts instead, which provide Euro +@samp{\[Eu]} and per mille @samp{\[%0]} glyphs.} + +@c --------------------------------------------------------------------- + +@node Input Conventions, , Input Encodings, Text +@subsection Input Conventions +@cindex input conventions +@cindex conventions for input + +Since GNU @code{troff} fills text automatically, it is common practice +in the @code{roff} language to avoid visual composition of text in input +files: the esthetic appeal of the formatted output is what matters. +Therefore, @code{roff} input should be arranged such that it is easy for +authors and maintainers to compose and develop the document, understand +the syntax of @code{roff} requests, macro calls, and preprocessor +languages used, and predict the behavior of the formatter. Several +traditions have accrued in service of these goals. + +@itemize @bullet +@item +Follow sentence endings in the input with newlines to ease their +recognition (@pxref{Sentences}). It is frequently convenient to end +text lines after colons and semicolons as well, as these typically +precede independent clauses. Consider doing so after commas; they often +occur in lists that become easy to scan when itemized by line, or +constitute supplements to the sentence that are added, deleted, or +updated to clarify it. Parenthetical and quoted phrases are also good +candidates for placement on text lines by themselves. + +@item +Set your text editor's line length to 72 characters or +fewer.@footnote{Emacs: @code{fill-column: 72}; Vim: @code{textwidth=72}} +This limit, combined with the previous item of advice, makes it less +common that an input line will wrap in your text editor, and thus will +help you perceive excessively long constructions in your text. Recall +that natural languages originate in speech, not writing, and that +punctuation is correlated with pauses for breathing and changes in +prosody. + +@item +Use @code{\&} after @samp{!}, @samp{?}, and @samp{.} if they are +followed by space, tab, or newline characters and don't end a sentence. + +@item +In filled text lines, use @code{\&} before @samp{.} and @samp{'} if they +are preceded by space, so that reflowing the input doesn't turn them +into control lines. + +@item +Do not use spaces to perform indentation or align columns of a table. +Leading spaces are reliable when text is not being filled. + +@item +Comment your document. It is never too soon to apply comments to +record information of use to future document maintainers (including your +future self). We thus introduce another escape sequence, @code{\"}, +which causes GNU @code{troff} to ignore the remainder of the input line. + +@item +Use the empty request---a control character followed immediately by a +newline---to visually manage separation of material in input files. +Many of the @code{groff} project's own documents use an empty request +between sentences, after macro definitions, and where a break is +expected, and two empty requests between paragraphs or other requests or +macro calls that will introduce vertical space into the document. + +You can combine the empty request with the comment escape sequence to +include whole-line comments in your document, and even ``comment out'' +sections of it. +@end itemize + +We conclude this section with an example sufficiently long to illustrate +most of the above suggestions in practice. For the purpose of fitting +the example between the margins of this manual with the font used for +its typeset version, we have shortened the input line length to 56 +columns. As before, an arrow @arrow{} indicates a tab character. + +@c Wrap example at 56 columns (not counting @arrow{}). +@CartoucheExample +.\" nroff this_file.roff | less +.\" groff -T ps this_file.roff > this_file.ps +@arrow{}The theory of relativity is intimately connected with +the theory of space and time. +. +I shall therefore begin with a brief investigation of +the origin of our ideas of space and time, +although in doing so I know that I introduce a +controversial subject. \" remainder of paragraph elided +. +. + +@arrow{}The experiences of an individual appear to us arranged +in a series of events; +in this series the single events which we remember +appear to be ordered according to the criterion of +\[lq]earlier\[rq] and \[lq]later\[rq], \" punct swapped +which cannot be analysed further. +. +There exists, +therefore, +for the individual, +an I-time, +or subjective time. +. +This itself is not measurable. +. +I can, +indeed, +associate numbers with the events, +in such a way that the greater number is associated with +the later event than with an earlier one; +but the nature of this association may be quite +arbitrary. +. +This association I can define by means of a clock by +comparing the order of events furnished by the clock +with the order of a given series of events. +. +We understand by a clock something which provides a +series of events which can be counted, +and which has other properties of which we shall speak +later. +.\" Albert Einstein, _The Meaning of Relativity_, 1922 +@endCartoucheExample + +@node Page Geometry, Measurements, Text, GNU troff Reference +@section Page Geometry +@cindex page, geometry of +@cindex geometry, page + +@code{roff} systems format text under certain assumptions about the size +of the output medium, or page. For the formatter to correctly break a +line it is filling, it must know the line length, which it derives from +the page width (@pxref{Line Layout}). For it to decide whether to write +an output line to the current page or wait until the next one, it must +know the page length (@pxref{Page Layout}). + +@cindex device resolution +@cindex resolution, device +@cindex basic units +@cindex units, basic +@cindex machine units +@cindex units, machine +A device's @dfn{resolution} converts practical units like inches or +centimeters to @dfn{basic units}, a convenient length measure for the +output device or file format. The formatter and output driver use basic +units to reckon page measurements. The device description file defines +its resolution and page dimensions (@pxref{DESC File Format}). + +@cindex page +A @dfn{page} is a two-dimensional structure upon which a @code{roff} +system imposes a rectangular coordinate system with its upper left +corner as the origin. Coordinate values are in basic units and increase +down and to the right. Useful ones are therefore always positive and +within numeric ranges corresponding to the page boundaries. + +@cindex drawing position +@cindex position, drawing +While the formatter (and, later, output driver) is processing a page, it +keeps track of its @dfn{drawing position}, which is the location at +which the next glyph will be written, from which the next motion will be +measured, or where a geometric object will commence rendering. +@cindex text baseline +@cindex baseline, text +Notionally, glyphs are drawn from the text baseline upward and to the +right.@footnote{@code{groff} does not yet support right-to-left +scripts.} The @dfn{text baseline} is a (usually invisible) line upon +which the glyphs of a typeface are aligned. A glyph therefore +``starts'' at its bottom-left corner. If drawn at the origin, a typical +letter glyph would lie partially or wholly off the page, depending on +whether, like ``g'', it features a descender below the baseline. + +@cindex page offset +@cindex offset, page +Such a situation is nearly always undesirable. It is furthermore +conventional not to write or draw at the extreme edges of the page. +Therefore the initial drawing position of a @code{roff} formatter is not +at the origin, but below and to the right of it. This rightward shift +from the left edge is known as the @dfn{page +offset}.@footnote{@code{groff}'s terminal output devices have page +offsets of zero.} The downward shift leaves room for a text output +line. -By its very nature, @option{-Tutf8} supports all input encodings; -@option{-Tdvi} has support for both @w{latin-2} and @w{latin-9} if the -command-line @option{-mec} is used also to load the file @file{ec.tmac} -(which flips to the EC fonts). +Text is arranged on a one-dimensional lattice of text baselines from the +top to the bottom of the page. +@cindex vertical spacing +@cindex spacing, vertical +@cindex vee +@dfn{Vertical spacing} is the distance between adjacent text baselines. +Typographic tradition sets this quantity to 120% of the type size. The +initial drawing position is one unit of vertical spacing below the page +top. Typographers term this unit a @slanted{vee}. + +@cindex page break +@cindex break, page +@cindex page ejection +@cindex ejection, page +Vertical spacing has an impact on page-breaking decisions. Generally, +when a break occurs, the formatter moves the drawing position to the +next text baseline automatically. If the formatter were already writing +to the last line that would fit on the page, advancing by one vee would +place the next text baseline off the page. Rather than let that happen, +@code{roff} formatters instruct the output driver to eject the page, +start a new one, and again set the drawing position to one vee below the +page top; this is a @dfn{page break}. + +When the last line of input text corresponds to the last output line +that fits on the page, the break caused by the end of input will also +break the page, producing a useless blank one. Macro packages keep +users from having to confront this difficulty by setting ``traps'' +(@pxref{Traps}); moreover, all but the simplest page layouts tend to +have headers and footers, or at least bear vertical margins larger than +one vee. +@c ===================================================================== +@c TODO: Add a section here about interpolations and input processing. +@c +@c We need to level up the reader's macro brain from reasoning about +@c interpolation at the scope of input lines to interpolations _within_ +@c lines. It is also a good time to introduce the \n and \* escape +@c sequences to avoid painful, "WTF"-producing forward references later. +@c Some materal from groff_mm(7) might be adaptable to this purpose. +@c +@c Earlier material from @Defesc{\\n}: +@c "This means that the value of the register is expanded in place while +@c GNU @code{troff} is parsing the input line. Nested assignments (also +@c called indirect assignments) are possible." +@c +@c We can probably drop the term "indirect assignments"; there's nothing +@c special about these--they are a consequence of *roffs' left-to-right +@c parsing and they apply to escape sequences in general. @c ===================================================================== -@node Measurements, Expressions, Text, gtroff Reference +@c BEGIN Keep (roughly) parallel with section "Measurements" of +@c groff(7). +@node Measurements, Numeric Expressions, Text, GNU troff Reference @section Measurements @cindex measurements @cindex scaling indicator @cindex indicator, scaling @cindex units of measurement -@cindex basic unit (@code{u}) -@cindex machine unit (@code{u}) -@cindex measurement unit -@cindex @code{u} unit -@cindex unit, @code{u} -@code{gtroff} (like many other programs) requires numeric parameters to -specify various measurements. Most numeric parameters@footnote{those -that specify vertical or horizontal motion or a type size} may have a -@dfn{measurement unit} attached. These units are specified as a single -character that immediately follows the number or expression. Each of -these units are understood, by @code{gtroff}, to be a multiple of its -@dfn{basic unit}. So, whenever a different measurement unit is -specified @code{gtroff} converts this into its @dfn{basic units}. This -basic unit, represented by a @samp{u}, is a device dependent measurement, -which is quite small, ranging from 1/75@dmn{th} to 1/72000@dmn{th} of an -inch. The values may be given as fractional numbers; however, -fractional basic units are always rounded to integers. - -Some of the measurement units are completely independent of any of the -current settings (e.g.@: type size) of @code{gtroff}. - -Although groff's basic unit is device-dependent, it may still be smaller -than the smallest unit the device is capable of producing. The register -@code{.H} specifies how many groff basic units constitute the current -device's basic unit horizontally, and the register @code{.V} specifies -this value vertically. +@cindex measurement units +The formatter sometimes requires the input of numeric parameters to +specify measurements. These are specified as integers or decimal +fractions with an optional @dfn{scaling unit} suffixed. A scaling unit +is a letter that immediately follows the last digit of a number. Digits +after the decimal point are optional. Measurement expressions include +@samp{10.5p}, @samp{11i}, and @samp{3.c}. + +@cindex basic units, conversion to +@cindex units, basic, conversion to +@cindex conversion to basic units +Measurements are scaled by the scaling unit and stored internally (with +any fractional part discarded) in basic units. +@cindex device resolution, obtaining in the formatter +@cindex resolution, device, obtaining in the formatter +The device resolution can therefore be obtained by storing a value of +@samp{1i} to a register. The only constraint on the basic unit is that +it is at least as small as any other unit. +@c That's a fib. A device resolution of around 2^31 would surely also +@c cause problems. But nobody does that. @table @code +@cindex basic scaling unit (@code{u}) +@cindex @code{u} scaling unit +@cindex unit, scaling, @code{u} +@cindex scaling unit @code{u} +@item u +Basic unit. + @item i -@cindex inch unit (@code{i}) -@cindex @code{i} unit -@cindex unit, @code{i} -Inches. An antiquated measurement unit still in use in certain -backwards countries with incredibly low-cost computer equipment. One -inch is defined to be 2.54@tie{}cm (worldwide since 1964). +@cindex inch scaling unit (@code{i}) +@cindex @code{i} scaling unit +@cindex unit, scaling, @code{i} +@cindex scaling unit @code{i} +Inch; defined as 2.54@tie{}centimeters. @item c -@cindex centimeter unit (@code{c}) -@cindex @code{c} unit -@cindex unit, @code{c} -Centimeters. One centimeter is about 0.3937@tie{}in. +@cindex centimeter scaling unit (@code{c}) +@cindex @code{c} scaling unit +@cindex unit, scaling, @code{c} +@cindex scaling unit @code{c} +Centimeter; a centimeter is about 0.3937@tie{}inches. @item p -@cindex point unit (@code{p}) -@cindex @code{p} unit -@cindex unit, @code{p} -Points. This is a typesetter's measurement used for measure type size. -It is 72@tie{}points to an inch. +@cindex point scaling unit (@code{p}) +@cindex @code{p} scaling unit +@cindex unit, scaling, @code{p} +@cindex scaling unit @code{p} +Point; a typesetter's unit used for measuring type size. +There are 72@tie{}points to an inch. @item P -@cindex pica unit (@code{P}) -@cindex @code{P} unit -@cindex unit, @code{P} -Pica. Another typesetting measurement. 6@tie{}picas to an inch (and -12@tie{}points to a pica). +@cindex pica scaling unit (@code{P}) +@cindex @code{P} scaling unit +@cindex unit, scaling, @code{P} +@cindex scaling unit @code{P} +Pica; another typesetter's unit. There are 6@tie{}picas to an inch and +12@tie{}points to a pica. @item s @itemx z -@cindex @code{s} unit -@cindex unit, @code{s} -@cindex @code{z} unit -@cindex unit, @code{z} -@xref{Fractional Type Sizes}, for a discussion of these units. +@xref{Using Fractional Type Sizes}, for a discussion of these units. @item f -@cindex @code{f} unit -@cindex unit, @code{f} -Fractions. Value is 65536. -@xref{Colors}, for usage. +GNU @code{troff} defines this unit to scale decimal fractions in the +interval [0, 1] to 16-bit unsigned integers. It multiplies a quantity +by 65,536. @xref{Colors}, for usage. @end table -The other measurements understood by @code{gtroff} depend on settings -currently in effect in @code{gtroff}. These are very useful for -specifying measurements that should look proper with any size of text. +The magnitudes of other scaling units depend on the text formatting +parameters in effect. These are useful when specifying measurements +that need to scale with the typeface or vertical spacing. @table @code @item m -@cindex em unit (@code{m}) -@cindex @code{m} unit -@cindex unit, @code{m} -Ems. This unit is equal to the current font size in points. So called -because it is @emph{approximately} the width of the letter@tie{}@samp{m} -in the current font. +@cindex em scaling unit (@code{m}) +@cindex @code{m} scaling unit +@cindex unit, scaling, @code{m} +@cindex scaling unit @code{m} +Em; an em is equal to the current type size in points. It is named thus +because it is approximately the width of the letter@tie{}@samp{M}. @item n -@cindex en unit (@code{n}) -@cindex @code{n} unit -@cindex unit, @code{n} -Ens. In @code{groff}, this is half of an em. +@cindex en scaling unit (@code{n}) +@cindex @code{n} scaling unit +@cindex unit, scaling, @code{n} +@cindex scaling unit @code{n} +En; an en is one-half em. @item v @cindex vertical space unit (@code{v}) @cindex space, vertical, unit (@code{v}) -@cindex @code{v} unit -@cindex unit, @code{v} -Vertical space. This is equivalent to the current line spacing. -@xref{Sizes}, for more information about this. +@cindex vee scaling unit (@code{v}) +@cindex @code{v} scaling unit +@cindex unit, scaling, @code{v} +@cindex scaling unit @code{v} +Vee; recall @ref{Page Geometry}. @item M -@cindex @code{M} unit -@cindex unit, @code{M} -100ths of an em. +@cindex @code{M} scaling unit +@cindex unit, scaling, @code{M} +@cindex scaling unit @code{M} +Hundredth of an em. @end table @menu +* Motion Quanta:: * Default Units:: @end menu +@c END Keep (roughly) parallel with section "Measurements" of groff(7). + +@c --------------------------------------------------------------------- + +@node Motion Quanta, Default Units, Measurements, Measurements +@subsection Motion Quanta +@cindex motion quanta +@cindex quanta, motion + +@c BEGIN Keep (roughly) parallel with subsection "Motion quanta" of +@c groff(7). +An output device's basic unit @code{u} is not necessarily its smallest +addressable length; @code{u} can be smaller to avoid problems with +integer roundoff. The minimum distances that a device can work with in +the horizontal and vertical directions are termed its @dfn{motion +quanta}. Measurements are rounded to applicable motion quanta. +Half-quantum fractions round toward zero. + +@cindex horizontal motion quantum register (@code{.H}) +@cindex motion quantum, horizontal, register (@code{.H}) +@cindex horizontal resolution register (@code{.H}) +@cindex resolution, horizontal, register (@code{.H}) +@DefregList {.H} +@DefregListEndx {.V} +These read-only registers interpolate the horizontal and vertical motion +quanta, respectively, of the output device in basic units. +@endDefreg + +For example, we might draw short baseline rules on a terminal device as +follows. @xref{Drawing Geometric Objects}. + +@Example +.tm \n[.H] + @error{} 24 +.nf +\l'36u' 36u +\l'37u' 37u + @result{} _ 36u + @result{} __ 37u +@endExample +@c END Keep (roughly) parallel with subsection "Motion quanta" of +@c groff(7). @c --------------------------------------------------------------------- -@node Default Units, , Measurements, Measurements +@node Default Units, , Motion Quanta, Measurements @subsection Default Units @cindex default units @cindex units, default -Many requests take a default unit. While this can be helpful at times, -it can cause strange errors in some expressions. For example, the line -length request expects em units. Here are several attempts to get a -line length of 3.5@tie{}inches and their results: - -@Example -3.5i @result{} 3.5i -7/2 @result{} 0i -7/2i @result{} 0i -(7 / 2)u @result{} 0i -7i/2 @result{} 0.1i -7i/2u @result{} 3.5i +@c BEGIN Keep (roughly) parallel with subsection "Default units" of +@c groff(7). +A general-purpose register (one created or updated with the @code{nr} +request; see @pxref{Registers}) is implicitly dimensionless, or reckoned +in basic units if interpreted in a measurement context. But it is +convenient for many requests and escape sequences to infer a scaling +unit for an argument if none is specified. An explicit scaling unit +(not after a closing parenthesis) can override an undesirable default. +Effectively, the default unit is suffixed to the expression if a scaling +unit is not already present. GNU @code{troff}'s use of integer +arithmetic should also be kept in mind (@pxref{Numeric Expressions}). + +The @code{ll} request interprets its argument in ems by default. +Consider several attempts to set a line length of 3.5@tie{}inches when +the type size is 10@tie{}points on a terminal device with a resolution +of 240 basic units and horizontal motion quantum of 24. Some +expressions become zero; the request clamps them to that quantum. + +@Example +.ll 3.5i \" 3.5i (= 840u) +.ll 7/2 \" 7u/2u -> 3u -> 3m -> 0, clamped to 24u +.ll (7 / 2)u \" 7u/2u -> as above +.ll 7/2i \" 7u/2i -> 7u/480u -> 0 -> as above +.ll 7i/2 \" 7i/2u -> 1680u/2m -> 1680u/24u -> 35u +.ll 7i/2u \" 3.5i (= 840u) @endExample @noindent -Everything is converted to basic units first. In the above example it -is assumed that 1@dmn{i} equals@tie{}240@dmn{u}, and 1@dmn{m} -equals@tie{}10@dmn{p} (thus 1@dmn{m} equals@tie{}33@dmn{u}). The value -7@dmn{i}/2 is first handled as 7@dmn{i}/2@dmn{m}, then converted to -1680@dmn{u}/66@dmn{u}, which is 25@dmn{u}, and this is approximately -0.1@dmn{i}. As can be seen, a scaling indicator after a closing -parenthesis is simply ignored. - @cindex measurements, specifying safely -Thus, the safest way to specify measurements is to always attach a -scaling indicator. If you want to multiply or divide by a certain -scalar value, use @samp{u} as the unit for that value. +The safest way to specify measurements is to attach a scaling unit. To +multiply or divide by a dimensionless quantity, use @samp{u} as its +scaling unit. +@c END Keep (roughly) parallel with subsection "Default units" of +@c groff(7). @c ===================================================================== -@node Expressions, Identifiers, Measurements, gtroff Reference -@section Expressions -@cindex expressions +@c BEGIN Keep (roughly) parallel with section "Numeric expressions" of +@c groff(7). +@node Numeric Expressions, Identifiers, Measurements, GNU troff Reference +@section Numeric Expressions +@cindex numeric expressions +@cindex expressions, numeric + +A @dfn{numeric expression} evaluates to an integer:@: it can be as +simple as a literal @samp{0} or it can be a complex sequence of register +and string interpolations interleaved with measurements and operators. + +GNU @code{troff} provides a set of mathematical and logical operators +familiar to programmers---as well as some unusual ones---but supports +only integer arithmetic.@footnote{Provision is made for interpreting and +reporting decimal fractions in certain cases.} The internal data type +used for computing results is usually a 32-bit signed integer, which +suffices to represent magnitudes within a range of ±2 +billion.@footnote{If that's not enough, see the @cite{groff_tmac@r{(5)}} +man page for the @file{62bit.tmac} macro package.} -@code{gtroff} has most arithmetic operators common to other languages: - -@itemize @bullet -@item @cindex arithmetic operators @cindex operators, arithmetic +@cindex truncating division +@cindex addition +@cindex subtraction +@cindex multiplication +@cindex division, truncating +@cindex modulus @opindex + @opindex - -@opindex / @opindex * +@opindex / @opindex % -Arithmetic: @samp{+} (addition), @samp{-} (subtraction), @samp{/} -(division), @samp{*} (multiplication), @samp{%} (modulo). +Arithmetic infix operators perform a function on the numeric expressions +to their left and right; they are @code{+} (addition), @code{-} +(subtraction), @code{*} (multiplication), @code{/} (truncating +division), and @code{%} (modulus). @dfn{Truncating division} rounds to +the integer nearer to zero, no matter how large the fractional portion. +Overflow and division (or modulus) by zero are errors and abort +evaluation of a numeric expression. +@cindex unary arithmetic operators +@cindex operators, unary arithmetic +@cindex negation +@cindex assertion (arithmetic operator) +@opindex - +@opindex + +@cindex @code{if} request, and the @samp{!} operator +@cindex @code{while} request, and the @samp{!} operator -@code{gtroff} only provides integer arithmetic. The internal type used -for computing results is @samp{int}, which is usually a 32-bit signed -integer. +Arithmetic unary operators operate on the numeric expression to their +right; they are @code{-} (negation) and @code{+} (assertion---for +completeness; it does nothing). The unary minus must often be used +with parentheses to avoid confusion with the decrementation operator, +discussed below. + +Observe the rounding behavior and effect of negative operands on the +modulus and truncating division operators. + +@Example +.nr T 199/100 +.nr U 5/2 +.nr V (-5)/2 +.nr W 5/-2 +.nr X 5%2 +.nr Y (-5)%2 +.nr Z 5%-2 +T=\n[T] U=\n[U] V=\n[V] W=\n[W] X=\n[X] Y=\n[Y] Z=\n[Z] + @result{} T=1 U=2 V=-2 W=-2 X=1 Y=-1 Z=1 +@endExample + +@noindent +The sign of the modulus of operands of mixed signs is determined by the +sign of the first. Division and modulus operators satisfy the following +property:@: given a dividend@tie{}@var{a} and a divisor@tie{}@var{b}, a +quotient@tie{}@var{q} formed by @samp{(a / b)} and a +remainder@tie{}@var{r} by @samp{(a % b)}, then @math{qb + r = a}. + +@cindex scaling operator +@cindex operator, scaling +@opindex ; +GNU @code{troff}'s scaling operator, used with parentheses as +@code{(@var{c};@var{e})}, evaluates a numeric expression@tie{}@var{e} +using@tie{}@var{c} as the default scaling unit. If @var{c} is omitted, +scaling units are ignored in the evaluation of@tie{}@var{e}. This +operator can save typing by avoiding the attachment of scaling units to +every operand out of caution. Your macros can select a sensible default +unit in case the user neglects to supply one. + +@Example +.\" Indent by amount given in first argument; assume ens. +.de Indent +. in (n;\\$1) +.. +@endExample + +@noindent +Without the scaling operator, the foregoing macro would, if called with +a unitless argument, cause indentation by the @code{in} request's +default scaling unit (ems). The result would be twice as much +indentation as expected. + +@cindex extremum operators (@code{>?}, @code{?}, @code{? +@opindex ?} (maximum) and @code{ @opindex >= @opindex <= @opindex = @opindex == -Comparison: @samp{<} (less than), @samp{>} (greater than), @samp{<=} -(less than or equal), @samp{>=} (greater than or equal), @samp{=} -(equal), @samp{==} (the same as @samp{=}). +Comparison operators comprise @code{<} (less than), @code{>} (greater +than), @code{<=} (less than or equal), @code{>=} (greater than or +equal), and @code{=} (equal). @code{==} is a synonym for @code{=}. +When evaluated, a comparison is replaced with @samp{0} if it is false +and @samp{1} if true. In the @code{roff} language, positive values are +true, others false. -@item @cindex logical operators @cindex operators, logical +@cindex logical ``and'' operator +@cindex logical conjunction operator +@cindex logical ``or'' operator +@cindex logical disjunction operator @opindex & @ifnotinfo @opindex : @@ -5246,282 +6171,368 @@ Comparison: @samp{<} (less than), @samp{>} (greater than), @samp{<=} @ifinfo @opindex @r{} @end ifinfo -Logical: @samp{&} (logical and), @samp{:} (logical or). +We can operate on truth values with the logical operators @code{&} +(logical conjunction or ``and'') and @code{:} (logical disjunction or +``or''). They evaluate as comparison operators do. -@item -@cindex unary operators -@cindex operators, unary -@opindex - -@opindex + @opindex ! -@cindex @code{if} request, and the @samp{!} operator -@cindex @code{while} request, and the @samp{!} operator -Unary operators: @samp{-} (negating, i.e.@: changing the sign), @samp{+} -(just for completeness; does nothing in expressions), @samp{!} (logical -not; this works only within @code{if} and @code{while} -requests).@footnote{Note that, for example, @samp{!(-1)} evaluates to -`true' because @code{gtroff} treats both negative numbers and zero as -`false'.} See below for the use of unary operators in motion requests. - +@cindex complementation, logical +@cindex logical complementation operator @cindex logical not, limitation in expression @cindex expression, limitation of logical not in -The logical not operator, -as described above, -works only within @code{if} and @code{while} requests. -Furthermore, it may appear -only at the beginning of an expression, -and negates the entire expression. -Attempting to insert the @samp{!} operator -within the expression results in a -@samp{numeric expression expected} warning. This -maintains compatibility -with old versions of @code{troff}. - -Example: +A logical complementation (``not'') operator, @code{!}, works only +within @code{if}, @code{ie}, and @code{while} requests. +@c This is worded to avoid implying that the operator doesn't apply +@c to conditional expressions in general, albeit without mentioning them +@c because they're out of scope. +Furthermore, @code{!} is recognized only at the beginning of a numeric +expression not contained by another numeric expression. In other words, +it must be the ``outermost'' operator. Including it elsewhere in the +expression produces a warning in the @samp{number} category +(@pxref{Warnings}), and its expression evaluates false. This +unfortunate limitation maintains compatibility with @acronym{AT&T} +@code{troff}. Test a numeric expression for falsity by +comparing it to a false value.@footnote{@xref{Conditionals and Loops}.} @Example .nr X 1 .nr Y 0 -.\" This does not work as expected -.if (\n[X])&(!\n[Y]) .nop X only +.\" This does not work as expected. +.if (\n[X])&(!\n[Y]) .nop A: X is true, Y is false . -.\" Use this construct instead -.if (\n[X]=1)&(\n[Y]=0) .nop X only -@endExample - -@item -@cindex extremum operators (@code{>?}, @code{?}, @code{? -@opindex ?} (maximum), @samp{? \n[y]) +.\" Use this construct instead. +.if (\n[X])&(\n[Y]<=0) .nop B: X is true, Y is false + @error{} warning: expected numeric expression, got '!' + @result{} B: X is true, Y is false @endExample -@noindent -The register@tie{}@code{z} now contains@tie{}5. - -@item -@cindex scaling operator -@cindex operator, scaling -Scaling: @code{(@var{c};@var{e})}. Evaluate@tie{}@var{e} -using@tie{}@var{c} as the default scaling indicator. If @var{c} is -missing, ignore scaling indicators in the evaluation of@tie{}@var{e}. -@end itemize - @cindex parentheses @cindex order of evaluation in expressions @cindex expression, order of evaluation @opindex ( @opindex ) -Parentheses may be used as in any other language. However, in -@code{gtroff} they are necessary to ensure order of evaluation. -@code{gtroff} has no operator precedence; expressions are evaluated left -to right. This means that @code{gtroff} evaluates @samp{3+5*4} as if it -were parenthesized like @samp{(3+5)*4}, not as @samp{3+(5*4)}, as might -be expected. +The @code{roff} language has no operator precedence:@: expressions are +evaluated strictly from left to right, in contrast to schoolhouse +arithmetic. Use parentheses @code{(} @code{)} to impose a desired +precedence upon subexpressions. + +@Example +.nr X 3+5*4 +.nr Y (3+5)*4 +.nr Z 3+(5*4) +X=\n[X] Y=\n[Y] Z=\n[Z] + @result{} X=32 Y=32 Z=23 +@endExample @cindex @code{+}, and page motion @cindex @code{-}, and page motion @cindex motion operators @cindex operators, motion -For many requests that cause a motion on the page, the unary operators -@samp{+} and @samp{-} work differently if leading an expression. They -then indicate a motion relative to the current position (down or up, -respectively). - +@opindex + @r{(unary)} +@opindex - @r{(unary)} +For many requests and escape sequences that cause motion on the page, +the unary operators @code{+} and @code{-} work differently when leading +a numeric expression. They then indicate a motion relative to the +drawing position:@: positive is down in vertical contexts, right in +horizontal ones. + +@cindex @code{bp} request, using @code{+} and@tie{}@code{-} with +@cindex @code{in} request, using @code{+} and@tie{}@code{-} with +@cindex @code{ll} request, using @code{+} and@tie{}@code{-} with +@cindex @code{lt} request, using @code{+} and@tie{}@code{-} with +@cindex @code{nm} request, using @code{+} and@tie{}@code{-} with +@cindex @code{nr} request, using @code{+} and@tie{}@code{-} with +@cindex @code{pl} request, using @code{+} and@tie{}@code{-} with +@cindex @code{pn} request, using @code{+} and@tie{}@code{-} with +@cindex @code{po} request, using @code{+} and@tie{}@code{-} with +@cindex @code{ps} request, using @code{+} and@tie{}@code{-} with +@cindex @code{pvs} request, using @code{+} and@tie{}@code{-} with +@cindex @code{rt} request, using @code{+} and@tie{}@code{-} with +@cindex @code{ti} request, using @code{+} and@tie{}@code{-} with +@cindex @code{\H}, using @code{+} and@tie{}@code{-} with +@cindex @code{\R}, using @code{+} and@tie{}@code{-} with +@cindex @code{\s}, using @code{+} and@tie{}@code{-} with +@code{+} and @code{-} are also treated differently by the following +requests and escape sequences:@: @code{bp}, @code{in}, @code{ll}, +@code{lt}, @code{nm}, @code{nr}, @code{pl}, @code{pn}, @code{po}, +@code{ps}, @code{pvs}, @code{rt}, @code{ti}, @code{\H}, @code{\R}, and +@code{\s}. Here, leading plus and minus signs serve as incrementation +and decrementation operators, respectively. To negate an expression, +subtract it from zero or include the unary minus in parentheses with its +argument. @xref{Setting Registers}, for examples. + +@opindex | @cindex @code{|}, and page motion -@cindex absolute position operator (@code{|}) -@cindex position, absolute, operator (@code{|}) -Similarly, a leading @samp{|} operator indicates an absolute position. -For vertical movements, it specifies the distance from the top of the -page; for horizontal movements, it gives the distance from the beginning -of the @emph{input} line. - -@cindex @code{bp} request, using @code{+} and@tie{}@code{-} -@cindex @code{in} request, using @code{+} and@tie{}@code{-} -@cindex @code{ll} request, using @code{+} and@tie{}@code{-} -@cindex @code{lt} request, using @code{+} and@tie{}@code{-} -@cindex @code{nm} request, using @code{+} and@tie{}@code{-} -@cindex @code{nr} request, using @code{+} and@tie{}@code{-} -@cindex @code{pl} request, using @code{+} and@tie{}@code{-} -@cindex @code{pn} request, using @code{+} and@tie{}@code{-} -@cindex @code{po} request, using @code{+} and@tie{}@code{-} -@cindex @code{ps} request, using @code{+} and@tie{}@code{-} -@cindex @code{pvs} request, using @code{+} and@tie{}@code{-} -@cindex @code{rt} request, using @code{+} and@tie{}@code{-} -@cindex @code{ti} request, using @code{+} and@tie{}@code{-} -@cindex @code{\H}, using @code{+} and@tie{}@code{-} -@cindex @code{\R}, using @code{+} and@tie{}@code{-} -@cindex @code{\s}, using @code{+} and@tie{}@code{-} -@samp{+} and @samp{-} are also treated differently by the following -requests and escapes: @code{bp}, @code{in}, @code{ll}, @code{lt}, -@code{nm}, @code{nr}, @code{pl}, @code{pn}, @code{po}, @code{ps}, -@code{pvs}, @code{rt}, @code{ti}, @code{\H}, @code{\R}, and @code{\s}. -Here, leading plus and minus signs indicate increments and decrements. - -@xref{Setting Registers}, for some examples. - -@Defesc {\\B, ', anything, '} +@cindex absolute @slanted{(sic)} position operator (@code{|}) +@cindex position, absolute @slanted{(sic)} operator (@code{|}) +@cindex boundary-relative motion operator (@code{|}) +@c "motion" and "operators" already indexed above +A leading @code{|} operator indicates a motion relative not to the +drawing position but to a boundary. For horizontal motions, the +measurement specifies a distance relative to a drawing position +corresponding to the beginning of the @emph{input} line. By default, +tab stops reckon movements in this way. Most escape sequences do not; +@c XXX: Which ones do? +@code{|} tells them to do so. + +@Example +Mind the \h'1.2i'gap. +.br +Mind the \h'|1.2i'gap. +.br +Mind the +\h'|1.2i'gap. +@c 13 spaces, 4 spaces, 13 spaces + @result{} Mind the gap. + @result{} Mind the gap. + @result{} Mind the gap. +@endExample + +One use of this feature is to define macros whose scope is limited to +the output they format. + +@Example +.\" underline word $1 with trailing punctuation $2 +.de Underline +. nop \\$1\l'|0\[ul]'\\$2 +.. +Typographical emphasis is best used +.Underline sparingly . +@endExample + +@noindent +In the above example, @samp{|0} specifies a negative motion from the +current position (at the end of the argument just emitted, @code{\$1}) +to the beginning of the input line. Thus, the @code{\l} escape sequence +in this case draws a line from right to left. A macro call occurs at +the beginning of an input line;@footnote{Control structure syntax +creates an exception to this rule, but is designed to remain useful:@: +recalling our example, @samp{.if 1 .Underline this} would underline only +``this'', precisely. @xref{Conditionals and Loops}.} if the @code{|} +operator were omitted, then the underline would be drawn at zero +distance from the current position, producing device-dependent, and +likely undesirable, results. On the @samp{ps} output device, it +underlines the period. + +For vertical motions, the @code{|} operator specifies a distance from +the first text baseline on the page or in the current +diversion,@footnote{@xref{Diversions}.} using the current vertical +spacing. + +@Example +A +.br +B \Z'C'\v'|0'D + @result{} A D + @result{} B C +@endExample + +In the foregoing example, we've used the @code{\Z} escape sequence +(@pxref{Page Motions}) to restore the drawing position after formatting +@samp{C}, then moved vertically to the first text baseline on the page. + +@Defesc {\\B, @code{'}, anything, @code{'}} @cindex numeric expression, valid @cindex valid numeric expression -Return@tie{}1 if @var{anything} is a valid numeric expression; or@tie{}0 -if @var{anything} is empty or not a valid numeric expression. +Interpolate@tie{}1 if @var{anything} is a valid numeric expression, +and@tie{}0 otherwise. The delimiter need not be a neutral apostrophe; +see @ref{Delimiters}. @endDefesc +You might use @code{\B} along with the @code{if} request to filter out +invalid macro or string arguments. @xref{Conditionals and Loops}. + +@Example +.\" Indent by amount given in first argument; assume ens. +.de Indent +. if \B'\\$1' .in (n;\\$1) +.. +@endExample + +A register interpolated as an operand in a numeric expression must have +an Arabic format; luckily, this is the default. @xref{Assigning +Register Formats}. + @cindex space characters, in expressions @cindex expressions, and space characters -Due to the way arguments are parsed, spaces are not allowed in -expressions, unless the entire expression is surrounded by parentheses. +Because spaces separate arguments to requests, spaces are not allowed in +numeric expressions unless the (sub)expression containing them is +surrounded by parentheses. @xref{Invoking Requests}, and +@ref{Conditionals and Loops}. + +@Example +.nf +.nr a 1+2 + 2+1 +\na + @error{} expected numeric expression, got a space + @result{} 3 +.nr a 1+(2 + 2)+1 +\na + @result{} 6 +@endExample -@xref{Request and Macro Arguments}, and @ref{Conditionals and Loops}. +The @code{nr} request (@pxref{Setting Registers}) expects its second and +optional third arguments to be numeric expressions; a bare @code{+} does +not qualify, so our first attempt got a warning. +@c END Keep (roughly) parallel with section "Numeric expressions" of +@c groff(7). @c ===================================================================== -@node Identifiers, Embedded Commands, Expressions, gtroff Reference +@c BEGIN Keep (roughly) parallel with section "Identifiers" of groff(7). +@node Identifiers, Formatter Instructions, Numeric Expressions, GNU troff Reference @section Identifiers @cindex identifiers -Like any other language, @code{gtroff} has rules for properly formed -@dfn{identifiers}. In @code{gtroff}, an identifier can be made up of -almost any printable character, with the exception of the following -characters: - -@itemize @bullet -@item -@cindex whitespace characters -@cindex newline character -@cindex character, whitespace -Whitespace characters (spaces, tabs, and newlines). - -@item -@cindex character, backspace -@cindex backspace character -@cindex @acronym{EBCDIC} encoding of backspace -Backspace (@acronym{ASCII}@tie{}@code{0x08} or -@acronym{EBCDIC}@tie{}@code{0x16}) and character code @code{0x01}. - -@item +An @dfn{identifier} labels a GNU @code{troff} datum such as a register, +name (macro, string, or diversion), typeface, color, special character, +character class, environment, or stream. Valid identifiers consist of +one or more ordinary characters. +@cindex ordinary character +@cindex character, ordinary +An @slanted{ordinary character} is an input character that is not the +escape character, a leader, tab, newline, or invalid as GNU @code{troff} +input. + +@c XXX: We might move this discussion earlier since it is applicable to +@c troff input in general, and include a reference to the `trin` +@c request. @cindex invalid input characters @cindex input characters, invalid @cindex characters, invalid input @cindex Unicode -The following input characters are invalid and are ignored if -@code{groff} runs on a machine based on @acronym{ASCII}, causing a -warning message of type @samp{input} (see @ref{Debugging}, for more -details): @code{0x00}, @code{0x0B}, @code{0x0D}--@code{0x1F}, -@code{0x80}--@code{0x9F}. - -And here are the invalid input characters if @code{groff} runs on an -@acronym{EBCDIC} host: @code{0x00}, @code{0x08}, @code{0x09}, -@code{0x0B}, @code{0x0D}--@code{0x14}, @code{0x17}--@code{0x1F}, -@code{0x30}--@code{0x3F}. - -Currently, some of these reserved codepoints are used internally, thus -making it non-trivial to extend @code{gtroff} to cover Unicode or other -character sets and encodings that use characters of these ranges. - -Note that invalid characters are removed before parsing; an identifier -@code{foo}, followed by an invalid character, followed by @code{bar} is -treated as @code{foobar}. -@end itemize - -For example, any of the following is valid. - -@Example -br -PP -(l -end-list -@@_ +Invalid input characters are a subset of control characters (from the +sets ``C0 Controls'' and ``C1 Controls'' as Unicode describes them). +When GNU @code{troff} encounters one in an identifier, it produces a +warning in category @samp{input} (@pxref{Warnings}). They are removed +during interpretation: an identifier @samp{foo}, followed by an invalid +character and then @samp{bar}, is processed as @samp{foobar}. + +On a machine using the ISO 646, 8859, or 10646 character encodings, +invalid input characters are @code{0x00}, @code{0x08}, @code{0x0B}, +@code{0x0D}--@code{0x1F}, and @code{0x80}--@code{0x9F}. On an +@acronym{EBCDIC} host, they are @code{0x00}--@code{0x01}, @code{0x08}, +@code{0x09}, @code{0x0B}, @code{0x0D}--@code{0x14}, +@code{0x17}--@code{0x1F}, and +@code{0x30}--@code{0x3F}.@footnote{Historically, control characters like +ASCII STX, ETX, and BEL (@key{Control+B}, @key{Control+C}, and +@key{Control+G}) have been observed in @code{roff} documents, +particularly in macro packages employing them as delimiters with the +output comparison operator to try to avoid collisions with the content +of arbitrary user-supplied parameters (@pxref{Operators in +Conditionals}). We discourage this expedient; in GNU @code{troff} it is +unnecessary (outside of compatibility mode) because delimited arguments +are parsed at a different input level than the surrounding context. +@xref{Implementation Differences}.} Some of these code points are used +by GNU @code{troff} internally, making it non-trivial to extend the +program to accept UTF-8 or other encodings that use characters from +these ranges.@footnote{Consider what happens when a C1 control +@code{0x80}--@code{0x9F} is necessary as a continuation byte in a UTF-8 +sequence.} + +Thus, the identifiers @samp{br}, @samp{PP}, @samp{end-list}, +@samp{ref*normal-print}, @samp{|}, @samp{@@_}, and @samp{!"#$%'()*+,-./} +are all valid. Discretion should be exercised to prevent confusion. +Identifiers starting with @samp{(} or @samp{[} require care. + +@Example +.nr x 9 +.nr y 1 +.nr (x 2 +.nr [y 3 +.nr sum1 (\n(x + \n[y]) + @error{} a space character is not allowed in an escape + @error{} sequence parameter +A:2+3=\n[sum1] +.nr sum2 (\n((x + \n[[y]) +B:2+3=\n[sum2] +.nr sum3 (\n[(x] + \n([y) +C:2+3=\n[sum3] + @result{} A:2+3=1 B:2+3=5 C:2+3=5 @endExample @cindex @code{]}, as part of an identifier @noindent -Note that identifiers longer than two characters with a closing bracket -(@samp{]}) in its name can't be accessed with escape sequences that -expect an identifier as a parameter. For example, @samp{\[foo]]} -accesses the glyph @samp{foo}, followed by @samp{]}, whereas -@samp{\C'foo]'} really asks for glyph @samp{foo]}. +An identifier with a closing bracket (@samp{]}) in its name can't be +accessed with bracket-form escape sequences that expect an identifier as +a parameter. For example, @samp{\[foo]]} accesses the glyph @samp{foo}, +followed by @samp{]} in whatever the surrounding context is, whereas +@samp{\C'foo]'} formats a glyph named @samp{foo]}. Similarly, the +identifier @samp{(} can't be interpolated @emph{except} with bracket +forms. @cindex @code{refer}, and macro names starting with @code{[} or @code{]} @cindex @code{[}, macro names starting with, and @code{refer} @cindex @code{]}, macro names starting with, and @code{refer} @cindex macro names, starting with @code{[} or @code{]}, and @code{refer} -To avoid problems with the @code{refer} preprocessor, macro names should -not start with @samp{[} or @samp{]}. Due to backwards compatibility, -everything after @samp{.[} and @samp{.]} is handled as a special -argument to @code{refer}. For example, @samp{.[foo} makes @code{refer} -to start a reference, using @samp{foo} as a parameter. - -@Defesc {\\A, ', ident, '} -Test whether an identifier @var{ident} is valid in @code{gtroff}. It -expands to the character@tie{}1 or@tie{}0 according to whether its -argument (usually delimited by quotes) is or is not acceptable as the -name of a string, macro, diversion, number register, environment, or -font. It returns@tie{}0 if no argument is given. This is useful for -looking up user input in some sort of associative table. - -@Example -\A'end-list' - @result{} 1 +If you begin a macro, string, or diversion name with either of the +characters @samp{[} or @samp{]}, you foreclose use of the @code{grefer} +preprocessor, which recognizes @samp{.[} and @samp{.]} as bibliographic +reference delimiters. + +@Defesc {\\A, @code{'}, anything, @code{'}} +Interpolate@tie{}1 if @var{anything} is a valid identifier, and@tie{}0 +otherwise. The delimiter need not be a neutral apostrophe; see +@ref{Delimiters}. Because invalid input characters are removed (see +above), invalid identifiers are empty or contain spaces, tabs, or +newlines. + +You can employ @code{\A} to validate a macro argument before using it to +construct another escape sequence or identifier. + +@Example +.\" usage: .init-coordinate-pair name val1 val2 +.\" Create a coordinate pair where name!x=val1 and +.\" name!y=val2. +.de init-coordinate-pair +. if \A'\\$1' \@{\ +. if \B'\\$2' .nr \\$1!x \\$2 +. if \B'\\$3' .nr \\$1!y \\$3 +. \@} +.. +.init-coordinate-pair center 5 10 +The center is at (\n[center!x], \n[center!y]). +.init-coordinate-pair "poi@arrow{}nt" trash garbage \" ignored +.init-coordinate-pair point trash garbage \" ignored + @result{} The center is at (5, 10). @endExample -@endDefesc - -@xref{Escapes}, for details on parameter delimiting characters. -Identifiers in @code{gtroff} can be any length, but, in some contexts, -@code{gtroff} needs to be told where identifiers end and text begins -(and in different ways depending on their length): - -@itemize @bullet -@item -Single character. - -@cindex @code{(}, starting a two-character identifier -@item -Two characters. Must be prefixed with @samp{(} in some situations. - -@cindex @code{[}, starting an identifier -@cindex @code{]}, ending an identifier -@item -Arbitrary length (@code{gtroff} only). Must be bracketed with @samp{[} -and@tie{}@samp{]} in some situations. Any length identifier can be put -in brackets. -@end itemize +@noindent +In this example, we also validated the numeric arguments; the registers +@samp{point!x} and @samp{point!y} remain undefined. @xref{Numeric +Expressions} for the @code{\B} escape sequence. +@endDefesc @cindex undefined identifiers @cindex identifiers, undefined -Unlike many other programming languages, undefined identifiers are -silently ignored or expanded to nothing. When @code{gtroff} finds an -undefined identifier, it emits a warning, doing the following: - -@itemize @bullet -@item -If the identifier is a string, macro, or diversion, @code{gtroff} -defines it as empty. - -@item -If the identifier is a number register, @code{gtroff} defines it with a -value of@tie{}0. -@end itemize - -@xref{Warnings}., @ref{Interpolating Registers}, and @ref{Strings}. - -Note that macros, strings, and diversions share the same name space. +How GNU @code{troff} handles the interpretation of an undefined +identifier depends on the context. There is no way to invoke an +undefined request; such syntax is interpreted as a macro call instead. +If the identifier is interpreted as a string, macro, or diversion, GNU +@code{troff} emits a warning in category @samp{mac}, defines it as +empty, and interpolates nothing. If the identifier is interpreted as a +register, GNU @code{troff} emits a warning in category @samp{reg}, +initializes it to zero, and interpolates that value. @xref{Warnings}, +@ref{Interpolating Registers}, and @ref{Strings}. Attempting to use an +undefined typeface, special character, color, character class, +environment, or stream generally provokes an error diagnostic. + +@need 1000 +@cindex name space, common, of macros, diversions, and strings +@cindex common name space of macros, diversions, and strings +@cindex macros, shared name space with strings and diversions +@cindex strings, shared name space with macros and diversions +@cindex diversions, shared name space with macros and strings +Identifiers for requests, macros, strings, and diversions share one name +space; special characters and character classes another. No other +object types do. @Example .de xxx . nop foo .. -. +@c . slack line for pagination management .di xxx bar .br @@ -5532,402 +6543,596 @@ bar @endExample @noindent -As can be seen in the previous example, @code{gtroff} reuses the -identifier @samp{xxx}, changing it from a macro to a diversion. No -warning is emitted! The contents of the first macro definition is lost. - -@xref{Interpolating Registers}, and @ref{Strings}. +The foregoing example shows that GNU @code{troff} reuses the identifier +@samp{xxx}, changing it from a macro to a diversion. No warning is +emitted, and the previous contents of @samp{xxx} are lost. +@c END Keep (roughly) parallel with section "Identifiers" of groff(7). @c ===================================================================== -@node Embedded Commands, Registers, Identifiers, gtroff Reference -@section Embedded Commands -@cindex embedded commands -@cindex commands, embedded - -Most documents need more functionality beyond filling, adjusting and -implicit line breaking. In order to gain further functionality, -@code{gtroff} allows commands to be embedded into the text, in two ways. - -The first is a @dfn{request} that takes up an entire line, and does -some large-scale operation (e.g.@: break lines, start new pages). - -The other is an @dfn{escape} that can be usually embedded anywhere in -the text; most requests can accept it even as an argument. Escapes -generally do more minor operations like sub- and superscripts, print a -symbol, etc. +@node Formatter Instructions, Registers, Identifiers, GNU troff Reference +@section Formatter Instructions +@cindex formatter instructions +@cindex instructing the formatter + +To support documents that require more than filling, automatic line +breaking and hyphenation, adjustment, and supplemental inter-sentence +space, the @code{roff} language offers two means of embedding +instructions to the formatter. + +@cindex request +One is a @dfn{request}, which begins with a control character and takes +up the remainder of the input line. Requests often perform relatively +large-scale operations such as setting the page length, breaking the +line, or starting a new page. They also conduct internal operations +like defining macros. + +@cindex escape sequence +@cindex sequence, escape +The other is an @dfn{escape sequence}, which begins with the escape +character and can be embedded anywhere in the input, even in arguments +to requests and other escape sequences. Escape sequences interpolate +special characters, strings, or registers, and handle comparatively +minor formatting tasks like sub- and superscripting. + +Some operations, such as font selection and type size alteration, are +available via both requests and escape sequences. @menu -* Requests:: -* Macros:: -* Escapes:: +* Control Characters:: +* Invoking Requests:: +* Calling Macros:: +* Using Escape Sequences:: +* Delimiters:: @end menu @c --------------------------------------------------------------------- -@node Requests, Macros, Embedded Commands, Embedded Commands -@subsection Requests -@cindex requests +@node Control Characters, Invoking Requests, Formatter Instructions, Formatter Instructions +@subsection Control Characters +@cindex control characters +@cindex configuring control characters +@cindex changing control characters -@cindex control character (@code{.}) -@cindex character, control (@code{.}) -@cindex no-break control character (@code{'}) -@cindex character, no-break control (@code{'}) -@cindex control character, no-break (@code{'}) -A request line begins with a control character, which is either a single -quote (@samp{'}, the @dfn{no-break control character}) or a period -(@samp{.}, the normal @dfn{control character}). These can be changed; -see @ref{Character Translations}, for details. After this there may be -optional tabs or spaces followed by an identifier, which is the name of -the request. This may be followed by any number of space-separated -arguments (@emph{no} tabs here). +The mechanism of using @code{roff}'s control characters to invoke +requests and call macros was introduced in @ref{Requests and Macros}. +Control characters are recognized only at the beginning of an input +line, or at the beginning of the branch of a control structure request; +see @ref{Conditionals and Loops}. -@cindex structuring source code of documents or macro packages -@cindex documents, structuring the source code -@cindex macro packages, structuring the source code -Since a control character followed by whitespace only is ignored, it is -common practice to use this feature for structuring the source code of -documents or macro packages. +A few requests cause a break implicitly; use the no-break control +character to prevent the break. Break suppression is its sole +behavioral distinction. Employing the no-break control character to +invoke requests that don't cause breaks is harmless but poor style. +@xref{Manipulating Filling and Adjustment}. + +@cindex control character, changing (@code{cc}) +@cindex character, control, changing (@code{cc}) +@cindex no-break control character, changing (@code{c2}) +@cindex character, no-break control, changing (@code{c2}) +@cindex control character, no-break, changing (@code{c2}) +The control @samp{.} and no-break control @samp{'} characters can each +be changed to any ordinary character@footnote{Recall @ref{Identifiers}.} +with the @code{cc} and @code{c2} requests, respectively. + +@Defreq {cc, [@Var{o}]} +Recognize the ordinary character@tie{}@var{o} as the control character. +If@tie{}@var{o} is absent or invalid, the default control character +@samp{.} is selected. The identity of the control character is +associated with the environment (@pxref{Environments}). +@endDefreq + +@Defreq {c2, [@Var{o}]} +Recognize the ordinary character@tie{}@var{o} as the no-break control +character. If@tie{}@var{o} is absent or invalid, the default no-break +control character @samp{'} is selected. The identity of the no-break +control character is associated with the environment +(@pxref{Environments}). +@endDefreq + +When writing a macro, you might wish to know which control character was +used to call it. + +@Defreg {.br} +This read-only register interpolates@tie{}1 if the currently executing +macro was called using the normal control character and@tie{}0 +otherwise. If a macro is interpolated as a string, the @code{.br} +register's value is inherited from the context of the string +interpolation. @xref{Strings}. + +@cindex intercepting requests +@cindex requests, intercepting +@cindex modifying requests +@cindex requests, modifying +Use this register to reliably intercept requests that imply breaks. @Example -.de foo -. tm This is foo. +.als bp*orig bp +.de bp +. ie \\n[.br] .bp*orig +. el 'bp*orig +.. +@endExample + +Testing the @code{.br} register outside of a macro definition makes no +sense. +@endDefreg + +@c --------------------------------------------------------------------- + +@c BEGIN Keep (roughly) parallel with section "Requests" of groff(7). +@node Invoking Requests, Calling Macros, Control Characters, Formatter Instructions +@subsection Invoking Requests +@cindex invoking requests +@cindex requests, invoking + +A control character is optionally followed by tabs and/or spaces and +then an identifier naming a request or macro. The invocation of an +unrecognized request is interpreted as a macro call. Defining a macro +with the same name as a request replaces the request. Deleting a +request name with the @code{rm} request makes it unavailable. The +@code{als} request can alias requests, permitting them to be wrapped or +non-destructively replaced. @xref{Strings}. + +@cindex request arguments +@cindex arguments to requests +@cindex tabs, and macro arguments +@cindex macro arguments, and tabs +@cindex arguments to macros, and tabs +@cindex tabs, and request arguments +@cindex request arguments, and tabs +@cindex arguments to requests, and tabs +There is no inherent limit on argument length or quantity. Most +requests take one or more arguments, and ignore any they do not expect. +A request may be separated from its arguments by tabs or spaces, but +only spaces can separate an argument from its successor. Only one +between arguments is necessary; any excess is ignored. GNU @code{troff} +does not allow tabs for argument separation.@footnote{In compatibility +mode, a space is not necessary after a request or macro name of two +characters' length. Also, Plan@tie{}9 @code{troff} allows tabs to +separate arguments.} + +Generally, a space @emph{within} a request argument is not relevant, not +meaningful, or is supported by bespoke provisions, as with the @code{tl} +request's delimiters (@pxref{Page Layout}). Some requests, like +@code{ds}, interpret the remainder of the control line as a single +argument. @xref{Strings}. + +@need 1000 +@cindex structuring source code of documents or macro packages +@cindex documents, structuring the source of +@cindex macro package, structuring the source of +@cindex package, package, structuring the source of +@cindex indentation, of @code{roff} source code +Spaces and tabs immediately after a control character are ignored. +Commonly, authors structure the source of documents or macro files with +them. + +@Example +.de center +. if \\n[.br] \ +. br +. ce \\$1 .. . . -.de bar -. tm This is bar. +.de right-align +.@arrow{}if \\n[.br] \ +.@arrow{}@arrow{}br +.@arrow{}rj \\$1 .. @endExample -@cindex blank line +@cindex blank line trap (@code{blm}) @cindex blank line macro (@code{blm}) -Another possibility is to use the blank line macro request @code{blm} by -assigning an empty macro to it. +If you assign an empty blank line trap, you can separate macro +definitions (or any input lines) with blank lines. @Example .de do-nothing .. -.blm do-nothing \" activate blank line macro +.blm do-nothing \" activate blank line trap -.de foo -. tm This is foo. +.de center +. if \\n[.br] \ +. br +. ce \\$1 .. -.de bar -. tm This is bar. +.de right-align +.@arrow{}if \\n[.br] \ +.@arrow{}@arrow{}br +.@arrow{}rj \\$1 .. -.blm \" deactivate blank line macro +.blm \" deactivate blank line trap @endExample @xref{Blank Line Traps}. +@c END Keep (roughly) parallel with section "Requests" of groff(7). -@cindex zero width space character (@code{\&}) -@cindex character, zero width space (@code{\&}) -@cindex space character, zero width (@code{\&}) -@cindex @code{\&}, escaping control characters -To begin a line with a control character without it being interpreted, -precede it with @code{\&}. This represents a zero width space, which -means it does not affect the output. - -In most cases the period is used as a control character. Several -requests cause a break implicitly; using the single quote control -character prevents this. - -@Defreg {.br} -A read-only number register, which is set to@tie{}1 if a macro is called -with the normal control character (as defined with the @code{cc} -request), and set to@tie{}0 otherwise. - -@cindex modifying requests -@cindex requests, modifying -This allows reliable modification of requests. - -@Example -.als bp*orig bp -.de bp -. tm before bp -. ie \\n[.br] .bp*orig -. el 'bp*orig -. tm after bp -.. -@endExample - -Using this register outside of a macro makes no sense (it always returns -zero in such cases). - -If a macro is called as a string (that is, using @code{\*}), the value -of the @code{.br} register is inherited from the caller. -@endDefreg - -@menu -* Request and Macro Arguments:: -@end menu +@c --------------------------------------------------------------------- -@node Request and Macro Arguments, , Requests, Requests -@subsubsection Request and Macro Arguments -@cindex request arguments +@need 1000 +@node Calling Macros, Using Escape Sequences, Invoking Requests, Formatter Instructions +@subsection Calling Macros +@cindex calling macros @cindex macro arguments -@cindex arguments to requests and macros +@cindex arguments to macros -@cindex tabs, and macro arguments -@cindex macro arguments, and tabs -@cindex arguments to macros, and tabs -Arguments to requests and macros are processed much like the shell: -The line is split into arguments according to -spaces.@footnote{Plan@tie{}9's @code{troff} implementation also allows -tabs for argument separation -- @code{gtroff} intentionally doesn't -support this.} +If a macro of the desired name does not exist when called, it is +created, assigned an empty definition, and a warning in category +@samp{mac} is emitted. Calling an undefined macro @emph{does} end a +macro definition naming it as its end macro (@pxref{Writing Macros}). @cindex spaces, in a macro argument -An argument to a macro that is intended to contain spaces can either be -enclosed in double quotes, or have the spaces @dfn{escaped} with -backslashes. This is @emph{not} true for requests. +To embed spaces @emph{within} a macro argument, enclose the argument in +neutral double quotes @code{"}. Horizontal motion escape sequences are +sometimes a better choice for arguments to be formatted as text. -Here are a few examples for a hypothetical macro @code{uh}: +Consider calls to a hypothetical section heading macro @samp{uh}. @Example .uh The Mouse Problem .uh "The Mouse Problem" +.uh The\~Mouse\~Problem .uh The\ Mouse\ Problem @endExample -@cindex @code{\~}, difference to @code{\@key{SP}} -@cindex @code{\@key{SP}}, difference to @code{\~} +@cindex @code{\~}, difference from @code{\@key{SP}} +@cindex @code{\@key{SP}}, difference from @code{\~} @noindent -The first line is the @code{uh} macro being called with 3 arguments, -@samp{The}, @samp{Mouse}, and @samp{Problem}. The latter two have the -same effect of calling the @code{uh} macro with one argument, @samp{The -Mouse Problem}.@footnote{The last solution, i.e., using escaped spaces, -is ``classical'' in the sense that it can be found in most @code{troff} -documents. Nevertheless, it is not optimal in all situations, since -@w{@samp{\ }} inserts a fixed-width, non-breaking space character that -can't stretch. @code{gtroff} provides a different command @code{\~} to -insert a stretchable, non-breaking space.} - -@cindex @code{"}, in a macro argument -@cindex double quote, in a macro argument -A double quote that isn't preceded by a space doesn't start a macro -argument. If not closing a string, it is printed literally. - -For example, +The first line calls @code{uh} with three arguments: @samp{The}, +@samp{Mouse}, and @samp{Problem}. The remainder call the @code{uh} +macro with one argument, @samp{The Mouse Problem}. The last solution, +using escaped spaces, can be found in documents prepared for +@acronym{AT&T} @code{troff}. It can cause surprise when text is +adjusted, because @code{\@key{SP}} inserts a @emph{fixed-width}, +non-breaking space. GNU @code{troff}'s @code{\~} escape sequence +inserts an adjustable, non-breaking space.@footnote{@code{\~} is fairly +portable; see @ref{Other Differences}.} + +@cindex @code{"}, embedding in a macro argument +@cindex double quote, embedding in a macro argument +@cindex @code{\}, embedding in a macro argument +@cindex backslash, embedding in a macro argument +The foregoing raises the question of how to embed neutral double quotes +or backslashes in macro arguments when @emph{those} characters are +desired as literals. In GNU @code{troff}, the special character escape +sequence @code{\[rs]} produces a backslash and @code{\[dq]} a neutral +double quote. + +In GNU @code{troff}'s @acronym{AT&T} compatibility mode, these +characters remain available as @code{\(rs} and @code{\(dq}, +respectively. @acronym{AT&T} @code{troff} did not consistently define +these special characters, +@c It seems that AT&T troff never recognized \(rs, though DWB 3.3 +@c defined \(bs as an alias of "\" on its "Latin1" device, in +@c deliberate(?) collision with the Bell System logo identifier. It +@c also defined \(dq for several devices (pcl, Latin1, nroff, ...) along +@c with \(aq. +but its descendants can be made to support them. @xref{Device and Font +Description Files}. + +If even that is not feasible, options remain. To obtain a literal +escape character in a macro argument, you can simply type it if you +change or disable the escape character first. @xref{Using Escape +Sequences}. Otherwise, you must escape the escape character repeatedly +to a context-dependent extent. @xref{Copy Mode}. + +For the (neutral) double quote, you have recourse to an obscure +syntactical feature of @acronym{AT&T} @code{troff}. Because a double +quote can begin a macro argument, the formatter keeps track of whether +the current argument was started thus, and doesn't require a space after +the double quote that ends it.@footnote{Strictly, you can neglect to +close the last quoted macro argument, relying on the end of the control +line to do so. We consider this lethargic practice poor style.} In +the argument list to a macro, a double quote that @emph{isn't} preceded +by a space @emph{doesn't} start a macro argument. If not preceded by a +double quote that began an argument, this double quote becomes part of +the argument. Furthermore, within a quoted argument, a pair of adjacent +double quotes becomes a literal double quote. + +@Example +.de eq +. tm arg1:\\$1 arg2:\\$2 arg3:\\$3 +. tm arg4:\\$4 arg5:\\$5 arg6:\\$6 +.. \" 4 backslashes on the next line +.eq a" "b c" "de"f\\\\g" h""i "j""k" + @error{} arg1:a" arg2:b c arg3:de + @error{} arg4:f\g" arg5:h""i arg6:j"k +@endExample + +Apart from the complexity of the rules, this traditional solution has +the disadvantage that double quotes don't survive repeated argument +expansion in @acronym{AT&T} @code{troff} or GNU @code{troff}'s +compatibility mode. This can frustrate efforts to pass such arguments +intact through multiple macro calls. @Example -.xxx a" "b c" "de"fg" -@endExample +.cp 1 +.de eq +. tm arg1:\\$1 arg2:\\$2 arg3:\\$3 +. tm arg4:\\$4 arg5:\\$5 arg6:\\$6 +.. +.de xe +. eq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 +.. \" 8 backslashes on the next line +.xe a" "b c" "de"f\\\\\\\\g" h""i "j""k" + @error{} arg1:a" arg2:b arg3:c + @error{} arg4:de arg5:f\g" arg6:h""i +@endExample + +@cindex input level +@cindex level, input +@cindex interpolation depth +@cindex depth, interpolation +Outside of compatibility mode, GNU @code{troff} doesn't exhibit this +problem because it tracks the nesting depth of interpolations. +@xref{Implementation Differences}. -@noindent -has the arguments @samp{a"}, @w{@samp{b c}}, @samp{de}, and @samp{fg"}. -Don't rely on this obscure behaviour! +@c --------------------------------------------------------------------- -There are two possibilities to get a double quote reliably. +@c BEGIN Keep (roughly) parallel with section "Using escape sequences" +@c of groff(7). +@node Using Escape Sequences, Delimiters, Calling Macros, Formatter Instructions +@subsection Using Escape Sequences +@cindex using escape sequences +@cindex escape sequences + +Whereas requests must occur on control lines, escape sequences can occur +intermixed with text and may appear in arguments to requests, macros, +and other escape sequences. +@esindex \ +An escape sequence is introduced by the escape character, a backslash +@code{\} (but see the @code{ec} request below). The next character +selects the escape's function. + +Escape sequences vary in length. Some take an argument, and of those, +some have different syntactical forms for a one-character, +two-character, or arbitrary-length argument. Others accept @emph{only} +an arbitrary-length argument. In the former scheme, a one-character +argument follows the function character immediately, an opening +parenthesis @samp{(} introduces a two-character argument (no closing +parenthesis is used), and an argument of arbitrary length is enclosed in +brackets @samp{[]}. In the latter scheme, the user selects a delimiter +character. A few escape sequences are idiosyncratic, and support both +of the foregoing conventions (@code{\s}), designate their own +termination sequence (@code{\?}), consume input until the next newline +(@code{\!}, @code{\"}, @code{\#}), or support an additional modifier +character (@code{\s} again, and @code{\n}). As with requests, use of +some escape sequences in source documents may interact poorly with a +macro package you use; consult its documentation to learn of ``safe'' +sequences or alternative facilities it provides to achieve the desired +result. -@itemize @bullet -@item -Enclose the whole argument with double quotes and use two consecutive -double quotes to represent a single one. This traditional solution has -the disadvantage that double quotes don't survive argument expansion -again if called in compatibility mode (using the @option{-C} option of -@code{groff}): +If an escape character is followed by a character that does not +identify a defined operation, the escape character is ignored (producing +a diagnostic of the @samp{escape} warning category, which is not enabled +by default) and the following character is processed normally. @Example -.de xx -. tm xx: `\\$1' `\\$2' `\\$3' -. -. yy "\\$1" "\\$2" "\\$3" -.. -.de yy -. tm yy: `\\$1' `\\$2' `\\$3' -.. -.xx A "test with ""quotes""" . - @result{} xx: `A' `test with "quotes"' `.' - @result{} yy: `A' `test with ' `quotes""' +$ groff -Tps -ww +.nr N 12 +.ds co white +.ds animal elephant +I have \fI\nN \*(co \*[animal]s,\f[] +said \P.\&\~Pseudo Pachyderm. + @error{} warning: escape character ignored before 'P' + @result{} I have @slanted{12 white elephants,} said P. Pseudo Pachyderm. @endExample -@noindent -If not in compatibility mode, you get the expected result +Escape sequence interpolation is of higher precedence than escape +sequence argument interpretation. This rule affords flexibility in +using escape sequences to construct parameters to other escape +sequences. +@c END Keep (roughly) parallel with section "Escape sequences" of +@c groff(7). @Example -xx: `A' `test with "quotes"' `.' -yy: `A' `test with "quotes"' `.' +.ds family C\" Courier +.ds style I\" oblique +Choice a typeface \f(\*[family]\*[style]wisely. + @result{} Choose a typeface @slanted{wisely.} @endExample @noindent -since @code{gtroff} preserves the input level. - -@item -Use the double quote glyph @code{\(dq}. This works with and without -compatibility mode enabled since @code{gtroff} doesn't convert -@code{\(dq} back to a double quote input character. - -Note that this method won't work with Unix @code{troff} in general since -the glyph `dq' isn't defined normally. -@end itemize - -@cindex @code{ds} request, and double quotes -Double quotes in the @code{ds} request are handled differently. -@xref{Strings}, for more details. - -@c --------------------------------------------------------------------- - -@node Macros, Escapes, Requests, Embedded Commands -@subsection Macros -@cindex macros - -@code{gtroff} has a @dfn{macro} facility for defining a series of lines -that can be invoked by name. They are called in the same manner as -requests -- arguments also may be passed basically in the same manner. - -@xref{Writing Macros}, and @ref{Request and Macro Arguments}. - -@c --------------------------------------------------------------------- - -@node Escapes, , Macros, Embedded Commands -@subsection Escapes -@cindex escapes - -Escapes may occur anywhere in the input to @code{gtroff}. They usually -begin with a backslash and are followed by a single character, which -indicates the function to be performed. The escape character can be -changed; see @ref{Character Translations}. - -Escape sequences that require an identifier as a parameter accept three -possible syntax forms. - -@itemize @bullet -@item -The next single character is the identifier. - -@cindex @code{(}, starting a two-character identifier -@item -If this single character is an opening parenthesis, take the following -two characters as the identifier. Note that there is no closing -parenthesis after the identifier. +In the above, the syntax form @samp{\f(} accepts only two characters for +an argument; the example works because the subsequent escape sequences +are interpolated before the selection escape sequence argument is +processed, and strings @code{family} and @code{style} interpolate one +character each.@footnote{The omission of spaces before the comment +escape sequences is necessary; see @ref{Strings}.} + +@c @need 1000 +The escape character is nearly always interpreted when encountered; it +is therefore desirable to have a way to interpolate it, disable it, or +change it. + +@cindex formatting the escape character (@code{\e}) +@cindex escape character, formatting (@code{\e}) +@Defesc {\\e, , , } +Interpolate the escape character. +@endDefesc -@cindex @code{[}, starting an identifier -@cindex @code{]}, ending an identifier -@item -If this single character is an opening bracket, take all characters -until a closing bracket as the identifier. -@end itemize +@cindex formatting a backslash glyph (@code{\[rs]}) +@cindex backslash glyph, formatting (@code{\[rs]}) +The @code{\[rs]} special character escape sequence formats a backslash +glyph. In macro and string definitions, the input sequences @code{\\} +and @code{\E} defer interpretation of escape sequences. @xref{Copy +Mode}. -@noindent -Examples: +@Defreq {eo, } +@cindex disabling @code{\} (@code{eo}) +@cindex @code{\}, disabling (@code{eo}) +Disable the escape mechanism except in copy mode. Once this request is +invoked, no input character is recognized as starting an escape +sequence in interpretation mode. +@endDefreq -@Example -\fB -\n(XX -\*[TeX] -@endExample +@Defreq {ec, [@Var{o}]} +@cindex escape character, changing (@code{ec}) +@cindex character, escape, changing (@code{ec}) +Recognize the ordinary character@tie{}@var{o} as the escape character. +If@tie{}@var{o} is absent or invalid, the default escape character +@samp{\} is selected. +@endDefreq -@cindex @code{'}, delimiting arguments -@cindex argument delimiting characters -@cindex characters, argument delimiting -@cindex delimiting characters for arguments -Other escapes may require several arguments and/or some special format. -In such cases the argument is traditionally enclosed in single quotes -(and quotes are always used in this manual for the definitions of escape -sequences). The enclosed text is then processed according to what that -escape expects. Example: +Switching escape sequence interpretation off to define a macro and back +on afterward can obviate the need to double the escape character within +the definition. @xref{Writing Macros}. This technique is not available +if your macro needs to interpolate values at the time it is +@emph{defined}---but many do not. @Example -\l'1.5i\(bu' +.\" simplified `BR` macro from the man(7) macro package +.eo +.de BR +. ds result \& +. while (\n[.$] >= 2) \@{\ +. as result \fB\$1\fR\$2\" +. shift 2 +. \@} +. if \n[.$] .as result \fB\$1\" +\*[result] +. rm result +. ft R +.. +.ec @endExample -@cindex @code{\o}, possible quote characters -@cindex @code{\b}, possible quote characters -@cindex @code{\X}, possible quote characters -Note that the quote character can be replaced with any other character -that does not occur in the argument (even a newline or a space -character) in the following escapes: @code{\o}, @code{\b}, and -@code{\X}. This makes e.g. - -@Example -A caf -\o -e\' +@DefreqList {ecs, } +@DefreqListEndx {ecr, } +The @code{ecs} request stores the escape character for recall with +@code{ecr}. @code{ecr} sets the escape character to @samp{\} if none +has been saved. +Use these requests together to temporarily change the escape character. +@endDefreq +Using a different escape character, or disabling it, when calling macros +not under your control will likely cause errors, since GNU @code{troff} +has no mechanism to ``intern'' macros---that is, to convert a macro +definition into a form independent of its +representation.@footnote{@TeX{} does have such a mechanism.} When a +macro is called, its contents are interpreted literally. +@c XXX: all that stuff mapped into the C0 and C1 controls seems pretty +@c close to an interning mechanism to me, though... --GBR + +@c XXX: Motivation? Why are we directing the reader to these? +@c @xref{Diversions}, and @ref{Identifiers}. + +@c BEGIN Keep (roughly) parallel with subsection "Delimiters" of +@c groff(7). +@node Delimiters, , Using Escape Sequences, Formatter Instructions +@subsection Delimiters +@cindex delimiting escape sequence arguments +@cindex escape sequence argument delimiters +@cindex delimiters, for escape sequence arguments +@cindex arguments, to escape sequences, delimiting + +@cindex @code{'}, as delimiter +@cindex @code{"}, as delimiter +Some escape sequences that require parameters use delimiters. The +neutral apostrophe @code{'} is a popular choice and shown in this +document. The neutral double quote @code{"} is also commonly seen. +Letters, numerals, and leaders can be used. Punctuation characters +are likely better choices, except for those defined as infix operators +in numeric expressions; see below. + +@Example +\l'1.5i\[bu]' \" draw 1.5 inches of bullet glyphs +@endExample + +@cindex @code{\%}, as delimiter +@cindex @code{\@key{SP}}, as delimiter +@cindex @code{\|}, as delimiter +@cindex @code{\^}, as delimiter +@cindex @code{\@{}, as delimiter +@cindex @code{\@}}, as delimiter +@cindex @code{\'}, as delimiter +@cindex @code{\`}, as delimiter +@cindex @code{\-}, as delimiter +@cindex @code{\_}, as delimiter +@cindex @code{\!}, as delimiter +@cindex @code{\?}, as delimiter +@cindex @code{\)}, as delimiter +@cindex @code{\/}, as delimiter +@cindex @code{\,}, as delimiter +@cindex @code{\&}, as delimiter +@cindex @code{\:}, as delimiter +@cindex @code{\~}, as delimiter +@cindex @code{\0}, as delimiter +@cindex @code{\a}, as delimiter +@cindex @code{\c}, as delimiter +@cindex @code{\d}, as delimiter +@cindex @code{\e}, as delimiter +@cindex @code{\E}, as delimiter +@cindex @code{\p}, as delimiter +@cindex @code{\r}, as delimiter +@cindex @code{\t}, as delimiter +@cindex @code{\u}, as delimiter +The following escape sequences don't take arguments and thus are allowed +as delimiters: +@code{\@key{SP}}, @code{\%}, @code{\|}, @code{\^}, @code{\@{}, +@code{\@}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!}, +@code{\?}, @code{\)}, @code{\/}, @code{\,}, @code{\&}, @code{\:}, +@code{\~}, @code{\0}, @code{\a}, @code{\c}, @code{\d}, @code{\e}, +@code{\E}, @code{\p}, @code{\r}, @code{\t}, and @code{\u}. However, +using them this way is discouraged; they can make the input confusing to +read. + +@cindex @code{\A}, delimiters allowed by +@cindex @code{\b}, delimiters allowed by +@cindex @code{\o}, delimiters allowed by +@cindex @code{\w}, delimiters allowed by +@cindex @code{\X}, delimiters allowed by +@cindex @code{\Z}, delimiters allowed by +@cindex newline, as delimiter +A few escape sequences, +@code{\A}, +@code{\b}, +@code{\o}, +@code{\w}, +@code{\X}, +and @code{\Z}, accept a newline as a delimiter. Newlines that serve +as delimiters continue to be recognized as input line terminators. + +@Example +A caf\o +e\(aa in Paris - @result{} A café in Paris + @result{} A café in Paris @endExample @noindent -possible, but it is better not to use this feature to avoid confusion. - -@cindex @code{\%}, used as delimiter -@cindex @code{\@key{SP}}, used as delimiter -@cindex @code{\|}, used as delimiter -@cindex @code{\^}, used as delimiter -@cindex @code{\@{}, used as delimiter -@cindex @code{\@}}, used as delimiter -@cindex @code{\'}, used as delimiter -@cindex @code{\`}, used as delimiter -@cindex @code{\-}, used as delimiter -@cindex @code{\_}, used as delimiter -@cindex @code{\!}, used as delimiter -@cindex @code{\?}, used as delimiter -@cindex @code{\)}, used as delimiter -@cindex @code{\/}, used as delimiter -@cindex @code{\,}, used as delimiter -@cindex @code{\&}, used as delimiter -@ifnotinfo -@cindex @code{\:}, used as delimiter -@end ifnotinfo -@ifinfo -@cindex @code{\@r{}}, used as delimiter -@end ifinfo -@cindex @code{\~}, used as delimiter -@cindex @code{\0}, used as delimiter -@cindex @code{\a}, used as delimiter -@cindex @code{\c}, used as delimiter -@cindex @code{\d}, used as delimiter -@cindex @code{\e}, used as delimiter -@cindex @code{\E}, used as delimiter -@cindex @code{\p}, used as delimiter -@cindex @code{\r}, used as delimiter -@cindex @code{\t}, used as delimiter -@cindex @code{\u}, used as delimiter -The following escape sequences (which are handled similarly to -characters since they don't take a parameter) are also allowed as -delimiters: @code{\%}, @w{@samp{\ }}, @code{\|}, @code{\^}, @code{\@{}, -@code{\@}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!}, -@code{\?}, @code{\)}, @code{\/}, @code{\,}, @code{\&}, @code{\:}, -@code{\~}, @code{\0}, @code{\a}, @code{\c}, @code{\d}, @code{\e}, -@code{\E}, @code{\p}, @code{\r}, @code{\t}, and @code{\u}. Again, don't -use these if possible. - -@cindex @code{\A}, allowed delimiters -@cindex @code{\B}, allowed delimiters -@cindex @code{\Z}, allowed delimiters -@cindex @code{\C}, allowed delimiters -@cindex @code{\w}, allowed delimiters -No newline characters as delimiters are allowed in the following -escapes: @code{\A}, @code{\B}, @code{\Z}, @code{\C}, and @code{\w}. - -@cindex @code{\D}, allowed delimiters -@cindex @code{\h}, allowed delimiters -@cindex @code{\H}, allowed delimiters -@cindex @code{\l}, allowed delimiters -@cindex @code{\L}, allowed delimiters -@cindex @code{\N}, allowed delimiters -@cindex @code{\R}, allowed delimiters -@cindex @code{\s}, allowed delimiters -@cindex @code{\S}, allowed delimiters -@cindex @code{\v}, allowed delimiters -@cindex @code{\x}, allowed delimiters -Finally, the escapes @code{\D}, @code{\h}, @code{\H}, @code{\l}, -@code{\L}, @code{\N}, @code{\R}, @code{\s}, @code{\S}, @code{\v}, and -@code{\x} can't use the following characters as delimiters: +Use of newlines as delimiters in escape sequences is also discouraged. + +@cindex @code{\D}, delimiters allowed by +@cindex @code{\h}, delimiters allowed by +@cindex @code{\H}, delimiters allowed by +@cindex @code{\l}, delimiters allowed by +@cindex @code{\L}, delimiters allowed by +@cindex @code{\N}, delimiters allowed by +@cindex @code{\R}, delimiters allowed by +@cindex @code{\s}, delimiters allowed by +@cindex @code{\S}, delimiters allowed by +@cindex @code{\v}, delimiters allowed by +@cindex @code{\x}, delimiters allowed by +Finally, the escape sequences @code{\D}, @code{\h}, @code{\H}, +@code{\l}, @code{\L}, @code{\N}, @code{\R}, @code{\s}, @code{\S}, +@code{\v}, and @code{\x} prohibit many delimiters. @itemize @bullet @item -@cindex numbers, and delimiters -@cindex digits, and delimiters -The digits @code{0}-@code{9}. +@cindex numerals, as delimiters +@cindex digits, as delimiters +@cindex @code{.}, as delimiter +@cindex decimal point, as delimiter +@cindex dot, as delimiter +the numerals @code{0}-@code{9} and the decimal point @code{.} @item @cindex operators, as delimiters @@ -5948,193 +7153,179 @@ The digits @code{0}-@code{9}. @end ifinfo @cindex @code{(}, as delimiter @cindex @code{)}, as delimiter -@cindex @code{.}, as delimiter -The (single-character) operators @samp{+-/*%<>=&:().}. +the (single-character) operators @samp{+-/*%<>=&:()} @item -@cindex space character -@cindex character, space -@cindex tab character -@cindex character, tab -@cindex newline character -@cindex character, newline -The space, tab, and newline characters. +@cindex space character, as delimiter +@cindex tab character, as delimiter +the space and tab characters @item -@cindex @code{\%}, used as delimiter -@ifnotinfo -@cindex @code{\:}, used as delimiter -@end ifnotinfo -@ifinfo -@cindex @code{\@r{}}, used as delimiter -@end ifinfo -@cindex @code{\@{}, used as delimiter -@cindex @code{\@}}, used as delimiter -@cindex @code{\'}, used as delimiter -@cindex @code{\`}, used as delimiter -@cindex @code{\-}, used as delimiter -@cindex @code{\_}, used as delimiter -@cindex @code{\!}, used as delimiter -@cindex @code{\/}, used as delimiter -@cindex @code{\c}, used as delimiter -@cindex @code{\e}, used as delimiter -@cindex @code{\p}, used as delimiter -All escape sequences except @code{\%}, @code{\:}, @code{\@{}, +@cindex @code{\%}, as delimiter +@cindex @code{\:}, as delimiter +@cindex @code{\@{}, as delimiter +@cindex @code{\@}}, as delimiter +@cindex @code{\'}, as delimiter +@cindex @code{\`}, as delimiter +@cindex @code{\-}, as delimiter +@cindex @code{\_}, as delimiter +@cindex @code{\!}, as delimiter +@cindex @code{\/}, as delimiter +@cindex @code{\c}, as delimiter +@cindex @code{\e}, as delimiter +@cindex @code{\p}, as delimiter +any escape sequences other than @code{\%}, @code{\:}, @code{\@{}, @code{\@}}, @code{\'}, @code{\`}, @code{\-}, @code{\_}, @code{\!}, -@code{\/}, @code{\c}, @code{\e}, and @code{\p}. +@code{\/}, @code{\c}, @code{\e}, and @code{\p} @end itemize -@cindex printing backslash (@code{\\}, @code{\e}, @code{\E}, @code{\[rs]}) -@cindex backslash, printing (@code{\\}, @code{\e}, @code{\E}, @code{\[rs]}) -To have a backslash (actually, the current escape character) appear in -the output several escapes are defined: @code{\\}, @code{\e} or -@code{\E}. These are very similar, and only differ with respect to -being used in macros or diversions. @xref{Character Translations}, for -an exact description of those escapes. - -@xref{Implementation Differences}, @ref{Copy-in Mode}, and -@ref{Diversions}, @ref{Identifiers}, for more information. - -@menu -* Comments:: -@end menu +Delimiter syntax is complex and flexible primarily for historical +reasons; the foregoing restrictions need be kept in mind mainly when +using @code{groff} in @acronym{AT&T} compatibility mode. GNU +@code{troff} keeps track of the nesting depth of escape sequence +interpolations, so the only characters you need to avoid using as +delimiters are those that appear in the arguments you input, not any +that result from interpolation. Typically, @code{'} works fine. +@xref{Implementation Differences}. -@node Comments, , Escapes, Escapes -@subsubsection Comments +@Example +$ groff -Tps +.de Mw +. nr wd \w'\\$1' +. tm "\\$1" is \\n(wd units wide. +.. +.Mw Wet'suwet'en +.Mw Wet+200i +.cp 1 \" turn on compatibility mode +.Mw Wet'suwet'en +.Mw Wet' +.Mw Wet+200i + @error{} "Wet'suwet'en" is 54740 units wide. + @error{} "Wet'+200i" is 42610 units wide. + @error{} "Wet'suwet'en" is 15860 units wide. + @error{} "Wet'" is 15860 units wide. + @error{} "Wet'+200i" is 14415860 units wide. +@endExample + +We see here that in compatibility mode, the part of the argument after +the @code{'} delimiter escapes from its context and, if nefariously +crafted, influences the computation of the @var{wd} register's value in +a surprising way. +@c END Keep (roughly) parallel with subsection " Delimiters" of +@c groff(7). + +@node Comments, Registers, Formatter Instructions, GNU troff Reference +@section Comments @cindex comments -Probably one of the most@footnote{Unfortunately, this is a lie. But -hopefully future @code{gtroff} hackers will believe it @code{:-)}} -common forms of escapes is the comment. +One of the most common forms of escape sequence is the +comment.@footnote{This claim may be more aspirational than descriptive.} @Defesc {\\", , , } -Start a comment. Everything to the end of the input line is ignored. +Start a comment. Everything up to the next newline is ignored. This may sound simple, but it can be tricky to keep the comments from -interfering with the appearance of the final output. - +interfering with the appearance of the output. @cindex @code{ds}, @code{ds1} requests, and comments @cindex @code{as}, @code{as1} requests, and comments -If the escape is to the right of some text or a request, that portion of -the line is ignored, but the space leading up to it is noticed by -@code{gtroff}. This only affects the @code{ds} and @code{as} request -and its variants. +If the escape sequence is to the right of some text or a request, that +portion of the line is ignored, but spaces preceding it are processed +normally by GNU @code{troff}. This affects only the @code{ds} and +@code{as} requests and their variants. @cindex tabs, before comments @cindex comments, lining up with tabs -One possibly irritating idiosyncracy is that tabs must not be used to -line up comments. Tabs are not treated as whitespace between the -request and macro arguments. +One possibly irritating idiosyncrasy is that tabs should not be used to +vertically align comments in the source document. Tab characters are +not treated as separators between a request name and its first argument, +nor between arguments. @cindex undefined request @cindex request, undefined A comment on a line by itself is treated as a blank line, because after -eliminating the comment, that is all that remains: +eliminating the comment, that is all that remains. @Example Test \" comment Test + @result{} Test + @result{} + @result{} Test @endExample -@noindent -produces - -@Example -Test - -Test -@endExample - -To avoid this, it is common to start the line with @code{.\"}, which -causes the line to be treated as an undefined request and thus ignored -completely. +To avoid this, it is common to combine the empty request with the +comment escape sequence as @samp{.\"}, causing the input line to be +ignored. @cindex @code{'}, as a comment -Another commenting scheme seen sometimes is three consecutive single -quotes (@code{'''}) at the beginning of a line. This works, but -@code{gtroff} gives a warning about an undefined macro (namely -@code{''}), which is harmless, but irritating. +Another commenting scheme sometimes seen is three consecutive single +quotes (@code{'''}) at the beginning of a line. This works, but GNU +@code{troff} emits a warning diagnostic (if enabled) about an undefined +macro (namely @samp{''}). @endDefesc @Defesc {\\#, , , } -To avoid all this, @code{gtroff} has a new comment mechanism using the -@code{\#} escape. This escape works the same as @code{\"} except that -the newline is also ignored: +Start a comment; everything up to and including the next newline is +ignored. This @code{groff} extension was introduced to avoid the +problems described above. @Example Test \# comment Test + @result{} Test Test @endExample - -@noindent -produces - -@Example -Test Test -@endExample - -@noindent -as expected. @endDefesc @Defreq {ig, [@Var{end}]} -Ignore all input until @code{gtroff} encounters the macro named -@code{.}@var{end} on a line by itself (or @code{..} if @var{end} is not -specified). This is useful for commenting out large blocks of text: - -@Example -text text text... -.ig -This is part of a large block -of text that has been -temporarily(?) commented out. - -We can restore it simply by removing -the .ig request and the ".." at the -end of the block. +Ignore input until, in the current conditional block (if +any),@footnote{@xref{Conditional Blocks}.} the macro @var{end} is called +at the start of a control line, or the control line @samp{..} is +encountered if @var{end} is not specified. @code{ig} is parsed as if it +were a macro definition, but its contents are discarded, not +stored.@footnote{Exception: auto-incrementing registers defined outside +the ignored region @emph{will} be modified if interpolated with +@code{\n±} inside it. @xref{Auto-increment}.} + +@c Wrap example at 56 columns. +@Example +hand\c +.de TX +fasting .. -More text text text... +.ig TX +This is part of a large block of input that has been +temporarily(?) commented out. +We can restore it simply by removing the .ig request and +the call of its end macro. +.TX @endExample - -@noindent -produces - @Example -text text text@dots{} More text text text@dots{} + @result{} handfasting @endExample - -@noindent -Note that the commented-out block of text does not cause a break. - -@cindex @code{ig} request, and copy-in mode -@cindex copy-in mode, and @code{ig} request -@cindex mode, copy-in, and @code{ig} request -@cindex @code{ig} request, and auto-increment -@cindex auto-increment, and @code{ig} request -The input is read in copy-mode; auto-incremented registers @emph{are} -affected (@pxref{Auto-increment}). @endDefreq @c ===================================================================== -@node Registers, Manipulating Filling and Adjusting, Embedded Commands, gtroff Reference +@c BEGIN Keep (roughly) parallel with subsection "Registers" of +@c groff(7). +@node Registers, Manipulating Filling and Adjustment, Formatter Instructions, GNU troff Reference @section Registers @cindex registers -Numeric variables in @code{gtroff} are called @dfn{registers}. There -are a number of built-in registers, supplying anything from the date to -details of formatting parameters. - -@xref{Identifiers}, for details on register identifiers. +In the @code{roff} language, numbers can be stored in @dfn{registers}. +Many built-in registers exist, supplying anything from the date to +details of formatting parameters. You can also define your own. +@xref{Identifiers}, for information on constructing a valid name for a +register. @menu * Setting Registers:: * Interpolating Registers:: * Auto-increment:: -* Assigning Formats:: +* Assigning Register Formats:: * Built-in Registers:: @end menu @@ -6145,36 +7336,32 @@ details of formatting parameters. @cindex setting registers (@code{nr}, @code{\R}) @cindex registers, setting (@code{nr}, @code{\R}) -Define or set registers using the @code{nr} request or the @code{\R} -escape. - -Although the following requests and escapes can be used to create -registers, simply using an undefined register will cause it to be -set to zero. +Define registers and update their values with the @code{nr} request or +the @code{\R} escape sequence. @DefreqList {nr, ident value} -@DefescListEndx {\\R, ', ident value, '} -Set number register @var{ident} to @var{value}. If @var{ident} doesn't -exist, @code{gtroff} creates it. - -The argument to @code{\R} usually has to be enclosed in quotes. -@xref{Escapes}, for details on parameter delimiting characters. - -The @code{\R} escape doesn't produce an input token in @code{gtroff}; -in other words, it vanishes completely after @code{gtroff} has -processed it. - -For example, the following two lines are equivalent: +@DefescListEndx {\\R, @code{'}, ident value, @code{'}} +Set register @var{ident} to @var{value}. If @var{ident} doesn't exist, +GNU @code{troff} creates it. In the @code{\R} escape sequence, the +delimiter need not be a neutral apostrophe; see @ref{Delimiters}. It +also does not produce an input token in GNU @code{troff}. @xref{Gtroff +Internals}. @Example .nr a (((17 + (3 * 4))) % 4) -\R'a (((17 + (3 * 4))) % 4)' - @result{} 1 +\n[a] +.\R'a (((17 + (3 * 4))) % 4)' +\n[a] + @result{} 1 1 @endExample -Note that the complete transparency of @code{\R} can cause surprising -effects if you use number registers like @code{.k}, which get evaluated -at the time they are accessed. +(Later, we will discuss additional forms of @code{nr} and @code{\R} that +can change a register's value after it is dereferenced but before it is +interpolated. @xref{Auto-increment}.) + +The complete transparency of @code{\R} can cause surprising effects if +you use registers like @code{.k}, which get evaluated at the time they +are accessed. @Example .ll 1.6i @@ -6190,33 +7377,35 @@ aaa bbb ccc ddd eee fff ggg hhh\h'0'\R':k \n[.k]' @result{} :k == 15000 @endExample -If you process this with the @sc{PostScript} device (@code{-Tps}), -there will be a line break eventually after @code{ggg} in both input -lines. However, after processing the space after @code{ggg}, the -partially collected line is not overfull yet, so @code{troff} -continues to collect input until it sees the space (or in this case, -the newline) after @code{hhh}. At this point, the line is longer -than the line length, and the line gets broken. +If you process this with the PostScript device (@code{-Tps}), there will +be a line break eventually after @code{ggg} in both input lines. +However, after processing the space after @code{ggg}, the partially +collected line is not overfull yet, so GNU @code{troff} continues to +collect input until it sees the space (or in this case, the newline) +after @code{hhh}. At this point, the line is longer than the line +length, and the line gets broken. -In the first input line, since the @code{\R} escape leaves no traces, -the check for the overfull line hasn't been done yet at the point where -@code{\R} gets handled, and you get a value for the @code{.k} number -register that is even greater than the current line length. +In the first input line, since the @code{\R} escape sequence leaves no +traces, the check for the overfull line hasn't been done yet at the +point where @code{\R} gets handled, and you get a value for the +@code{.k} register that is even greater than the current line length. -In the second input line, the insertion of @code{\h'0'} to emit an -invisible zero-width space forces @code{troff} to check the line length, +In the second input line, the insertion of @code{\h'0'} to cause a +zero-width motion forces GNU @code{troff} to check the line length, which in turn causes the start of a new output line. Now @code{.k} returns the expected value. @endDefreq -Both @code{nr} and @code{\R} have two additional special forms to +@code{nr} and @code{\R} each have two additional special forms to increment or decrement a register. @DefreqList {nr, ident @t{+}@Var{value}} @DefreqItem {nr, ident @t{-}@Var{value}} -@DefescItemx {\\R, ', ident @t{+}value, '} -@DefescListEnd {\\R, ', ident @t{-}value, '} -Increment (decrement) register @var{ident} by @var{value}. +@DefescItemx {\\R, @code{'}, ident @t{+}value, @code{'}} +@DefescListEnd {\\R, @code{'}, ident @t{-}value, @code{'}} +Increment (decrement) register @var{ident} by @var{value}. In the +@code{\R} escape sequence, the delimiter need not be a neutral +apostrophe; see @ref{Delimiters}. @Example .nr a 1 @@ -6226,8 +7415,12 @@ Increment (decrement) register @var{ident} by @var{value}. @endExample @cindex negating register values -To assign the negated value of a register to another register, some care -must be taken to get the desired result: +A leading minus sign in @var{value} is always interpreted as a +decrementation operator, not an algebraic sign. To assign a register a +negative value or the negated value of another register, you can +force GNU @code{troff} to interpret @samp{-} as a negation or minus, +rather than decrementation, operator: enclose it with its operand in +parentheses or subtract it from zero. @Example .nr a 7 @@ -6238,51 +7431,49 @@ must be taken to get the desired result: .nr a (-\nb) \na @result{} -3 -@endExample - -@noindent -The surrounding parentheses prevent the interpretation of the minus sign -as a decrementing operator. An alternative is to start the assignment -with a @samp{0}: - -@Example -.nr a 7 -.nr b -3 -.nr a \nb -\na - @result{} 4 -.nr a 0\nb +.nr a 0-\nb \na @result{} -3 @endExample + +If a register's prior value does not exist (the register was undefined), +an increment or decrement is applied as if to@tie{}0. @endDefreq @Defreq {rr, ident} -@cindex removing number register (@code{rr}) -@cindex number register, removing (@code{rr}) +@cindex removing a register (@code{rr}) @cindex register, removing (@code{rr}) -Remove number register @var{ident}. If @var{ident} doesn't exist, the -request is ignored. +Remove register @var{ident}. If @var{ident} doesn't exist, the request +is ignored. Technically, only the name is removed; the register's +contents are still accessible under aliases created with @code{aln}, if +any. @endDefreq @Defreq {rnn, ident1 ident2} -@cindex renaming number register (@code{rnn}) -@cindex number register, renaming (@code{rnn}) +@cindex renaming a register (@code{rnn}) @cindex register, renaming (@code{rnn}) -Rename number register @var{ident1} to @var{ident2}. If either -@var{ident1} or @var{ident2} doesn't exist, the request is ignored. +Rename register @var{ident1} to @var{ident2}. If @var{ident1} doesn't +exist, the request is ignored. Renaming a built-in register does not +otherwise alter its properties. @endDefreq -@Defreq {aln, ident1 ident2} -@cindex alias, number register, creating (@code{aln}) -@cindex creating alias, for number register (@code{aln}) -@cindex number register, creating alias (@code{aln}) -@cindex register, creating alias (@code{aln}) -Create an alias @var{ident1} for a number register @var{ident2}. The -new name and the old name are exactly equivalent. If @var{ident1} is -undefined, a warning of type @samp{reg} is generated, and the request is -ignored. @xref{Debugging}, for information about warnings. +@Defreq {aln, new old} +@cindex alias, register, creating (@code{aln}) +@cindex creating alias for register (@code{aln}) +@cindex register, creating alias for (@code{aln}) +Create an alias @var{new} for an existing register @var{old}, causing +the names to refer to the same stored object. If @var{old} is +undefined, a warning in category @samp{reg} is produced and the request +is ignored. @xref{Warnings}, for information about the enablement and +suppression of warnings. + +@cindex alias, register, removing (@code{rr}) +@cindex removing alias for register (@code{rr}) +@cindex register, removing alias for (@code{rr}) +To remove a register alias, invoke @code{rr} on its name. A register's +contents do not become inaccessible until it has no more names. @endDefreq +@c END Keep (roughly) parallel with subsection "Registers" of groff(7). @c --------------------------------------------------------------------- @@ -6291,20 +7482,22 @@ ignored. @xref{Debugging}, for information about warnings. @cindex interpolating registers (@code{\n}) @cindex registers, interpolating (@code{\n}) -Numeric registers can be accessed via the @code{\n} escape. +Register contents are interpolated with the @code{\n} escape sequence. @DefescList {\\n, , i, } -@DefescItem {\\n, @Lparen{}, id, } -@DefescListEnd {\\n, @Lbrack{}, ident, @Rbrack{}} +@DefescItem {\\n, (, id, } +@DefescListEnd {\\n, [, ident, ]} @cindex nested assignments @cindex assignments, nested @cindex indirect assignments @cindex assignments, indirect -Interpolate number register with name @var{ident} (one-character -name@tie{}@var{i}, two-character name @var{id}). This means that the -value of the register is expanded in-place while @code{gtroff} is -parsing the input line. Nested assignments (also called indirect -assignments) are possible. +Interpolate register with name @var{ident} (one-character +name@tie{}@var{i}, two-character name @var{id}). @code{\n} is +interpreted even in copy mode (@pxref{Copy Mode}). If the register is +undefined, it is created and assigned a value of@tie{}@samp{0}, that +value is interpolated, and a warning in category @samp{reg} is emitted. +@xref{Warnings}, for information about the enablement and suppression of +warnings. @Example .nr a 5 @@ -6327,40 +7520,46 @@ assignments) are possible. @c --------------------------------------------------------------------- -@node Auto-increment, Assigning Formats, Interpolating Registers, Registers +@node Auto-increment, Assigning Register Formats, Interpolating Registers, Registers @subsection Auto-increment -@cindex auto-increment -@cindex increment, automatic - -Number registers can also be auto-incremented and auto-decremented. The -increment or decrement value can be specified with a third argument to -the @code{nr} request or @code{\R} escape. +@cindex auto-incrementation of a register +@cindex incrementation, automatic, of a register +@cindex decrementation, automatic, of a register + +Registers can also be incremented or decremented by a configured amount +at the time they are interpolated. The value of the increment is +specified with a third argument to the @code{nr} request, and a special +interpolation syntax is used to alter and then retrieve the register's +value. Together, these features are called +@dfn{auto-increment}.@footnote{A negative auto-increment can be +considered an ``auto-decrement''.} @Defreq {nr, ident value incr} -@cindex @code{\R}, difference to @code{nr} -Set number register @var{ident} to @var{value}; the increment for -auto-incrementing is set to @var{incr}. Note that the @code{\R} escape -doesn't support this notation. +@cindex @code{\R}, difference from @code{nr} +Set register @var{ident} to @var{value} and its auto-incrementation +amount to to @var{incr}. The @code{\R} escape sequence doesn't support +an @var{incr} argument. @endDefreq -To activate auto-incrementing, the escape @code{\n} has a special syntax -form. +Auto-incrementation is not @emph{completely} automatic; the @code{\n} +escape sequence in its basic form never alters the value of a register. +To apply auto-incrementation to a register, interpolate it with +@samp{\n±}. @DefescList {\\n, +, i, } @DefescItem {\\n, -, i, } -@DefescItem {\\n, +@Lparen{}, id, } -@DefescItem {\\n, -@Lparen{}, id, } -@DefescItem {\\n, +@Lbrack{}, ident, @Rbrack{}} -@DefescListEnd {\\n, -@Lbrack{}, ident, @Rbrack{}} -Before interpolating, increment or decrement @var{ident} (one-character -name@tie{}@var{i}, two-character name @var{id}) by the auto-increment -value as specified with the @code{nr} request (or the @code{\R} escape). -If no auto-increment value has been specified, these syntax forms are -identical to @code{\n}. +@DefescItem {\\n, +(, id, } +@DefescItem {\\n, -(, id, } +@DefescItem {\\n, +[, ident, ]} +@DefescListEnd {\\n, -[, ident, ]} +Increment or decrement @var{ident} (one-character +name@tie{}@var{i}, two-character name @var{id}) by the register's +auto-incrementation value and then interpolate the new register value. +If @var{ident} has no auto-incrementation value, interpolate as with +@code{\n}. @endDefesc -For example, - +@need 1000 @Example .nr a 0 1 .nr xx 0 5 @@ -6370,154 +7569,215 @@ For example, \n-(xx, \n-(xx, \n-(xx, \n-(xx, \n-(xx .br \n+[foo], \n+[foo], \n+[foo], \n+[foo], \n+[foo] -@endExample - -@noindent -produces - -@Example -1, 2, 3, 4, 5 --5, -10, -15, -20, -25 --2, -4, -6, -8, -10 + @result{} 1, 2, 3, 4, 5 + @result{} -5, -10, -15, -20, -25 + @result{} -2, -4, -6, -8, -10 @endExample @cindex increment value without changing the register @cindex value, incrementing without changing the register -To change the increment value without changing the value of a register -(@var{a} in the example), the following can be used: - -@Example -.nr a \na 10 -@endExample +To change the increment value without changing the value of a register, +assign the register's value to itself by interpolating it, and specify +the desired increment normally. Apply an increment of @samp{0} to +disable auto-incrementation of the register. @c --------------------------------------------------------------------- -@node Assigning Formats, Built-in Registers, Auto-increment, Registers -@subsection Assigning Formats -@cindex assigning formats (@code{af}) -@cindex formats, assigning (@code{af}) +@node Assigning Register Formats, Built-in Registers, Auto-increment, Registers +@subsection Assigning Register Formats +@cindex assign number format to register (@code{af}) +@cindex number formats, assigning to register (@code{af}) +@cindex register, assigning number format to (@code{af}) -When a register is used, it is always textually replaced (or -interpolated) with a representation of that number. This output format -can be changed to a variety of formats (numbers, Roman numerals, etc.). -This is done using the @code{af} request. +A writable register's value can be interpolated in several number +formats. By default, conventional Arabic numerals are used. +Other formats see use in sectioning and outlining schemes and +alternative page numbering arrangements. -@Defreq {af, ident format} -Change the output format of a number register. The first argument -@var{ident} is the name of the number register to be changed, and the -second argument @var{format} is the output format. The following output -formats are available: +@Defreq {af, reg fmt} +Use number format @var{fmt} when interpolating register @var{reg}. +Valid number formats are as follows. @table @code -@item 1 -Decimal arabic numbers. This is the default format: 0, 1, 2, -3,@tie{}@enddots{} - -@item 0@dots{}0 -Decimal numbers with as many digits as specified. So, @samp{00} would -result in printing numbers as 01, 02, 03,@tie{}@enddots{} - -In fact, any digit instead of zero does work; @code{gtroff} only counts -how many digits are specified. As a consequence, @code{af}'s default -format @samp{1} could be specified as @samp{0} also (and exactly this is -returned by the @code{\g} escape, see below). +@item 0@r{@dots{}} +Arabic numerals 0, 1, 2, and so on. +Any decimal digit is equivalent to @samp{0}; the formatter merely counts +the digits specified. Multiple Arabic numerals in @var{fmt} cause +interpolations to be zero-padded on the left if necessary to at least as +many digits as specified (interpolations never truncate a register +value). A register with format @samp{00} interpolates values 1, 2, 3 as +@samp{01}, @samp{02}, @samp{03}. The default format for all writable +registers is @samp{0}. @item I @cindex Roman numerals @cindex numerals, Roman -Upper-case Roman numerals: 0, I, II, III, IV,@tie{}@enddots{} +Uppercase Roman numerals: 0, I, II, III, IV,@tie{}@enddots{} @item i -Lower-case Roman numerals: 0, i, ii, iii, iv,@tie{}@enddots{} +Lowercase Roman numerals: 0, i, ii, iii, iv,@tie{}@enddots{} @item A -Upper-case letters: 0, A, B, C, @dots{},@tie{}Z, AA, AB,@tie{}@enddots{} +Uppercase letters: 0, A, B, C, @dots{},@tie{}Z, AA, AB,@tie{}@enddots{} @item a -Lower-case letters: 0, a, b, c, @dots{},@tie{}z, aa, ab,@tie{}@enddots{} +Lowercase letters: 0, a, b, c, @dots{},@tie{}z, aa, ab,@tie{}@enddots{} @end table -Omitting the number register format causes a warning of type -@samp{missing}. @xref{Debugging}, for more details. Specifying a -nonexistent format causes an error. +Omitting @var{fmt} causes a warning in category @samp{missing}. +@xref{Warnings}, for information about the enablement and suppression of +warnings. Specifying an unrecognized format is an error. -The following example produces @samp{10, X, j, 010}: +Zero values are interpolated as @samp{0} in non-Arabic formats. +Negative quantities are prefixed with @samp{-} irrespective of format. +In Arabic formats, the sign supplements the field width. If @var{reg} +doesn't exist, it is created with a zero value. @Example .nr a 10 -.af a 1 \" the default format +.af a 0 \" the default format \na, .af a I \na, -.af a a +.af a 321 +.nr a (-\na) \na, -.af a 001 +.af a a \na + @result{} 10, X, -010, -j @endExample -@cindex Roman numerals, maximum and minimum -@cindex maximum values of Roman numerals -@cindex minimum values of Roman numerals -The largest number representable for the @samp{i} and @samp{I} formats -is 39999 (or @minus{}39999); Unix @code{troff} uses @samp{z} and -@samp{w} to represent 10000 and 5000 in Roman numerals, and so does -@code{gtroff}. Currently, the correct glyphs of Roman numeral five -thousand and Roman numeral ten thousand (Unicode code points -@code{U+2182} and @code{U+2181}, respectively) are not available. - -If @var{ident} doesn't exist, it is created. +@cindex Roman numerals, extrema (maximum and minimum) +@cindex extreme values representable with Roman numerals +@cindex maximum value representable with Roman numerals +@cindex minimum value representable with Roman numerals +The representable extrema in the @samp{i} and @samp{I} formats +correspond to Arabic ±39,999. GNU @code{troff} uses @samp{w} and +@samp{z} to represent 5,000 and 10,000 in Roman numerals, respectively, +following the convention of @acronym{AT&T} @code{troff}---currently, the +correct glyphs for Roman numerals five thousand (@code{U+2181}) and ten +thousand (@code{U+2182}) are not used. @cindex read-only register, changing format @cindex changing format, and read-only registers -Changing the output format of a read-only register causes an error. It -is necessary to first copy the register's value to a writeable register, -then apply the @code{af} request to this other register. +Assigning the format of a read-only register is an error. Instead, copy +the read-only register's value to, and assign the format of, a writable +register. @endDefreq -@DefescList {\\g, , i, } -@DefescItem {\\g, @Lparen{}, id, } -@DefescListEnd {\\g, @Lbrack{}, ident, @Rbrack{}} +@DefescList {\\g, , r, } +@DefescItem {\\g, (, rg, } +@DefescListEnd {\\g, [, reg, ]} @cindex format of register (@code{\g}) @cindex register, format (@code{\g}) -Return the current format of the specified register @var{ident} -(one-character name@tie{}@var{i}, two-character name @var{id}). For -example, @samp{\ga} after the previous example would produce the string -@samp{000}. If the register hasn't been defined yet, nothing is -returned. +Interpolate the format of the register @var{reg} (one-character +name@tie{}@var{r}, two-character name @var{rg}). Zeroes represent +Arabic formats. If @var{reg} is not defined, @var{reg} is not created +and nothing is interpolated. @code{\g} is interpreted even in copy mode +(@pxref{Copy Mode}). @endDefesc +@cindex register format, in expressions +@cindex expressions, and register format +GNU @code{troff} interprets only Arabic numerals. The Roman numeral or +alphabetic formats cannot be used as operands to arithmetic operators in +expressions (@pxref{Numeric Expressions}). For instance, it may be +desirable to test the page number independently of its format. + +@Example +.af % i \" front matter +.de header-trap +. \" To test the page number, we need it in Arabic. +. ds saved-page-number-format \\g%\" +. af % 0 +. nr page-number-in-decimal \\n% +. af % \\*[saved-page-number-format] +. ie \\n[page-number-in-decimal]=1 .do-first-page-stuff +. el \@{\ +. ie o .do-odd-numbered-page-stuff +. el .do-even-numbered-page-stuff +. \@} +. rm saved-page-number-format +.. +.wh 0 header-trap +@endExample + @c --------------------------------------------------------------------- -@node Built-in Registers, , Assigning Formats, Registers +@node Built-in Registers, , Assigning Register Formats, Registers @subsection Built-in Registers @cindex built-in registers @cindex registers, built-in -The following lists some built-in registers that are not described -elsewhere in this manual. Any register that begins with a @samp{.} is -read-only. A complete listing of all built-in registers can be found in -@ref{Register Index}. +Predefined registers whose identifiers start with a dot are read-only. +Many are Boolean-valued, interpolating a true or false value testable +with the @code{if}, @code{ie}, or @code{while} requests. Some read-only +registers are string-valued, meaning that they interpolate text. + +@cindex removing a built-in register +@cindex register, built-in, removing +@cindex built-in register, removing +@strong{Caution:@:} Built-in registers are subject to removal like +others; once removed, they can be recreated only as normal writable +registers and will not reflect formatter state. + +A register name (without the dot) is often associated with a request of +the same name. A complete listing of all built-in registers can be +found in @ref{Register Index}. + +We present here a few built-in registers that are not described +elsewhere in this manual; they have to do with invariant properties of +GNU @code{troff}, or obtain information about the formatter's +command-line options, processing progress, or the operating environment. @table @code +@item \n[.A] +@vindex .A +@cindex approximation output register (@code{.A}) +@cindex plain text approximation output register (@code{.A}) +Approximate output is being formatted (Boolean-valued); see +@command{groff} @option{-a} option (@ref{Groff Options}). + +@item \n[.c] +@vindex .c +@itemx \n[c.] +@vindex c. +@cindex input line number register (@code{.c}, @code{c.}) +@cindex line number, input, register (@code{.c}, @code{c.}) +Input line number. @samp{c.} is a writable synonym, +@c introduced in AT&T device-independent troff (CSTR #54, 1981-01) +affecting subsequent interpolations of both @samp{.c} and @samp{c.}. + @item \n[.F] @cindex current input file name register (@code{.F}) @cindex input file name, current, register (@code{.F}) @vindex .F -This string-valued register returns the current input file name. +Name of input file (string-valued). -@item \n[.H] -@cindex horizontal resolution register (@code{.H}) -@cindex resolution, horizontal, register (@code{.H}) -@vindex .H -Number of basic units per horizontal unit of output device resolution. -@xref{Measurements}. +@item \n[.g] +@vindex .g +@cindex GNU @code{troff}, identification register (@code{.g}) +@cindex GNU-specific register (@code{.g}) +Always true in GNU @code{troff} (Boolean-valued). Documents can use +this to ask the formatter if it claims @code{groff} compatibility. + +@item \n[.P] +@vindex .P +Output page selection status (Boolean-valued); see @command{groff} +@option{-o} option (@ref{Groff Options}). @item \n[.R] @cindex number of registers register (@code{.R}) @cindex registers, number of, register (@code{.R}) @vindex .R -The number of number registers available. This is always 10000 in -GNU@tie{}@code{troff}; it exists for backward compatibility. +Count of available unused registers; always 10,000 in GNU +@code{troff}.@footnote{GNU @code{troff} dynamically allocates memory for +as many registers as required.} + +@item \n[.T] +@vindex .T +Indicator of output device selection (Boolean-valued); see +@command{groff} @option{-T} option (@ref{Groff Options}). @item \n[.U] @cindex safer mode @@ -6525,47 +7785,73 @@ GNU@tie{}@code{troff}; it exists for backward compatibility. @cindex unsafe mode @cindex mode, unsafe @vindex .U -If @code{gtroff} is called with the @option{-U} command-line option to -activate unsafe mode, the number register @code{.U} is set to@tie{}1, -and to zero otherwise. @xref{Groff Options}. +Unsafe mode enablement status (Boolean-valued); see @command{groff} +@option{-U} option (@ref{Groff Options}). -@item \n[.V] -@cindex vertical resolution register (@code{.V}) -@cindex resolution, vertical, register (@code{.V}) -@vindex .V -Number of basic units per vertical unit of output device resolution. -@xref{Measurements}. +@item \n[.x] +@vindex .x +@cindex major version number register (@code{.x}) +@cindex version number, major, register (@code{.x}) +Major version number of the running GNU @code{troff} formatter. For +example, if the version number is 1.23.0, then @code{.x} +contains@tie{}@samp{1}. + +@item \n[.y] +@vindex .y +@cindex minor version number register (@code{.y}) +@cindex version number, minor, register (@code{.y}) +Minor version number of the running GNU @code{troff} formatter. For +example, if the version number is 1.23.0, then @code{.y} +contains@tie{}@samp{23}. + +@item \n[.Y] +@vindex .Y +@cindex revision number register (@code{.Y}) +Revision number of the running GNU @code{troff} formatter. For example, +if the version number is 1.23.0, then @code{.Y} contains@tie{}@samp{0}. + +@item \n[$$] +@vindex $$ +@cindex process ID of GNU @code{troff} register (@code{$$}) +@cindex PID of GNU @code{troff} register (@code{$$}) +@cindex GNU @code{troff}, process ID register (@code{$$}) +@cindex GNU @code{troff}, PID register (@code{$$}) +Process identifier (PID) of the GNU @code{troff} program in its +operating environment. +@end table + +Date- and time-related registers are set per the local time as +determined by @cite{localtime@r{(3)}} when the formatter launches. This +initialization can be overridden by @env{SOURCE_DATE_EPOCH} and +@env{TZ}; see @ref{Environment}. +@table @code @item \n[seconds] @cindex seconds, current time (@code{seconds}) @cindex time, current, seconds (@code{seconds}) @cindex current time, seconds (@code{seconds}) @vindex seconds -The number of seconds after the minute, normally in the range@tie{}0 -to@tie{}59, but can be up to@tie{}61 to allow for leap seconds. -Initialized at start-up of @code{gtroff}. +Count of seconds elapsed in the minute (0--60). @c not 59; see POSIX @item \n[minutes] @cindex minutes, current time (@code{minutes}) @cindex time, current, minutes (@code{minutes}) @cindex current time, minutes (@code{minutes}) @vindex minutes -The number of minutes after the hour, in the range@tie{}0 to@tie{}59. -Initialized at start-up of @code{gtroff}. +Count of minutes elapsed in the hour (0--59). @item \n[hours] @cindex hours, current time (@code{hours}) @cindex time, current, hours (@code{hours}) @cindex current time, hours (@code{hours}) @vindex hours -The number of hours past midnight, in the range@tie{}0 to@tie{}23. -Initialized at start-up of @code{gtroff}. +Count of hours elapsed since midnight (0--23). @item \n[dw] @cindex day of the week register (@code{dw}) @cindex date, day of the week register (@code{dw}) @vindex dw -Day of the week (1--7). +Day of the week (1--7; 1 is Sunday). @item \n[dy] @cindex day of the month register (@code{dy}) @@ -6577,517 +7863,719 @@ Day of the month (1--31). @cindex month of the year register (@code{mo}) @cindex date, month of the year register (@code{mo}) @vindex mo -Current month (1--12). +Month of the year (1--12). @item \n[year] @cindex date, year register (@code{year}, @code{yr}) @cindex year, current, register (@code{year}, @code{yr}) @vindex year -The current year. +Gregorian year. +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{yr} register @item \n[yr] @vindex yr -The current year minus@tie{}1900. Unfortunately, the documentation of -Unix Version@tie{}7's @code{troff} had a year@tie{}2000 bug: It -incorrectly claimed that @code{yr} contains the last two digits of the -year. That claim has never been true of either @acronym{AT&T} -@code{troff} or GNU @code{troff}. Old @code{troff} input that looks -like this: +Gregorian year minus@tie{}1900. This register is incorrectly documented +in the @acronym{AT&T} @code{troff} manual as storing the last two digits +of the current year. That claim stopped being true in 2000. Old +@code{troff} input that looks like: @Example -'\" The following line stopped working after 1999 +'\" The year number is a surprise after 1999. This document was formatted in 19\n(yr. @endExample @noindent -can be corrected as follows: +can be corrected to: @Example This document was formatted in \n[year]. @endExample @noindent -or, to be portable to older @code{troff} versions, as follows: +or, for portability across many @code{roff} programs, to the following. @Example .nr y4 1900+\n(yr This document was formatted in \n(y4. @endExample - -@item \n[.c] -@vindex .c -@itemx \n[c.] -@vindex c. -@cindex input line number register (@code{.c}, @code{c.}) -@cindex line number, input, register (@code{.c}, @code{c.}) -The current @emph{input} line number. Register @samp{.c} is read-only, -whereas @samp{c.} (a @code{gtroff} extension) is writable also, -affecting both @samp{.c} and @samp{c.}. - -@item \n[ln] -@vindex ln -@cindex output line number register (@code{ln}) -@cindex line number, output, register (@code{ln}) -The current @emph{output} line number after a call to the @code{nm} -request to activate line numbering. - -@xref{Miscellaneous}, for more information about line numbering. - -@item \n[.x] -@vindex .x -@cindex major version number register (@code{.x}) -@cindex version number, major, register (@code{.x}) -The major version number. For example, if the version number is 1.03 -then @code{.x} contains@tie{}@samp{1}. - -@item \n[.y] -@vindex .y -@cindex minor version number register (@code{.y}) -@cindex version number, minor, register (@code{.y}) -The minor version number. For example, if the version number is 1.03 -then @code{.y} contains@tie{}@samp{03}. - -@item \n[.Y] -@vindex .Y -@cindex revision number register (@code{.Y}) -The revision number of @code{groff}. - -@item \n[$$] -@vindex $$ -@cindex process ID of @code{gtroff} register (@code{$$}) -@cindex @code{gtroff}, process ID register (@code{$$}) -The process ID of @code{gtroff}. - -@item \n[.g] -@vindex .g -@cindex @code{gtroff}, identification register (@code{.g}) -@cindex GNU-specific register (@code{.g}) -Always@tie{}1. Macros should use this to determine whether they are -running under GNU @code{troff}. - -@item \n[.A] -@vindex .A -@cindex @acronym{ASCII} approximation output register (@code{.A}) -If the command-line option @option{-a} is used to produce an -@acronym{ASCII} approximation of the output, this is set to@tie{}1, zero -otherwise. @xref{Groff Options}. - -@item \n[.O] -@vindex .O -This read-only register is set to the suppression nesting level (see -escapes @code{\O}). @xref{Suppressing output}. - -@item \n[.P] -@vindex .P -This register is set to@tie{}1 (and to@tie{}0 otherwise) if the current -page is actually being printed, i.e., if the @option{-o} option is being -used to only print selected pages. @xref{Groff Options}, for more -information. - -@item \n[.T] -@vindex .T -If @code{gtroff} is called with the @option{-T} command-line option, the -number register @code{.T} is set to@tie{}1, and zero otherwise. -@xref{Groff Options}. - -@item \*[.T] -@stindex .T -@cindex output device name string register (@code{.T}) -A single read-write string register that contains the current output -device (for example, @samp{latin1} or @samp{ps}). This is the only -string register defined by @code{gtroff}. @end table @c ===================================================================== -@node Manipulating Filling and Adjusting, Manipulating Hyphenation, Registers, gtroff Reference -@section Manipulating Filling and Adjusting -@cindex manipulating filling and adjusting -@cindex filling and adjusting, manipulating -@cindex adjusting and filling, manipulating +@node Manipulating Filling and Adjustment, Manipulating Hyphenation, Registers, GNU troff Reference +@section Manipulating Filling and Adjustment +@cindex manipulating filling and adjustment +@cindex filling and adjustment, manipulating +@cindex adjustment and filling, manipulating @cindex justifying text @cindex text, justifying @cindex break @cindex line break -@cindex @code{bp} request, causing implicit linebreak -@cindex @code{ce} request, causing implicit linebreak -@cindex @code{cf} request, causing implicit linebreak -@cindex @code{fi} request, causing implicit linebreak -@cindex @code{fl} request, causing implicit linebreak -@cindex @code{in} request, causing implicit linebreak -@cindex @code{nf} request, causing implicit linebreak -@cindex @code{rj} request, causing implicit linebreak -@cindex @code{sp} request, causing implicit linebreak -@cindex @code{ti} request, causing implicit linebreak -@cindex @code{trf} request, causing implicit linebreak -Various ways of causing @dfn{breaks} were given in @ref{Implicit Line -Breaks}. The @code{br} request likewise causes a break. Several other -requests also cause breaks, but implicitly. These are @code{bp}, -@code{ce}, @code{cf}, @code{fi}, @code{fl}, @code{in}, @code{nf}, -@code{rj}, @code{sp}, @code{ti}, and @code{trf}. +@cindex @code{bp} request, causing implicit break +@cindex @code{ce} request, causing implicit break +@cindex @code{cf} request, causing implicit break +@cindex @code{fi} request, causing implicit break +@cindex @code{fl} request, causing implicit break +@cindex @code{in} request, causing implicit break +@cindex @code{nf} request, causing implicit break +@cindex @code{rj} request, causing implicit break +@cindex @code{sp} request, causing implicit break +@cindex @code{ti} request, causing implicit break +@cindex @code{trf} request, causing implicit break +When an output line is pending (see below), a break moves the drawing +position to the beginning of the next text baseline, interrupting +filling. Various ways of causing breaks were shown in @ref{Breaking}. +The @code{br} request likewise causes a break. Several other requests +imply breaks:@: @code{bp}, @code{ce}, @code{cf}, @code{fi}, @code{fl}, +@code{in}, @code{nf}, @code{rj}, @code{sp}, @code{ti}, and @code{trf}. +If the no-break control character is used with any of these requests, +GNU @code{troff} suppresses the break; instead the requested operation +takes effect at the next break. @samp{'br} does nothing. + +@Example +.ll 55n +This line is normally filled and adjusted. +.br +A line's alignment is decided +'ce \" Center the next input line (no break). +when it is output. +This line returns to normal filling and adjustment. + @result{} This line is normally filled and adjusted. + @result{} A line's alignment is decided when it is output. + @result{} This line returns to normal filling and adjustment. +@endExample -@Defreq {br, } -Break the current line, i.e., the input collected so far is emitted -without adjustment. +@noindent +@cindex pending output line +@cindex partially collected line +@cindex output line properties +@cindex properties of output lines +Output line properties like page offset, indentation, adjustment, and +even the location of its text baseline, are not determined until the +line has been broken. An output line is said to be @dfn{pending} if +some input has been collected but an output line corresponding to it has +not yet been written; such an output line is also termed @dfn{partially +collected}. If no output line is pending, it is as if a break has +already happened; additional breaks, whether explicit or implicit, have +no effect. If the vertical drawing position is negative---as it is when +the formatter starts up---a break starts a new page (even if no output +line is pending) unless an end-of-input macro is being interpreted. +@xref{End-of-input Traps}. -If the no-break control character is used, @code{gtroff} suppresses the -break: +@Defreq {br, } +Break the line: emit any pending output line without adjustment. @Example -a +foo bar +.br +baz 'br -b - @result{} a b +qux + @result{} foo bar + @result{} baz qux @endExample @endDefreq -Initially, @code{gtroff} fills and adjusts text to both margins. -Filling can be disabled via the @code{nf} request and re-enabled with -the @code{fi} request. +Sometimes you want to prevent a break within a phrase or between a +quantity and its units. -@DefreqList {fi, } -@DefregListEndx {.u} -@cindex fill mode (@code{fi}) -@cindex mode, fill (@code{fi}) -Activate fill mode (which is the default). This request implicitly -enables adjusting; it also inserts a break in the text currently being -filled. The read-only number register @code{.u} is set to@tie{}1. +@Defesc {\\~, , , } +@cindex unbreakable space (@code{\~}) +@cindex space, unbreakable (@code{\~}) +Insert an unbreakable space that is adjustable like an ordinary space. +It is discarded from the end of an output line if a break is forced. -The fill mode status is associated with the current environment -(@pxref{Environments}). +@Example +Set the output speed to\~1. +There are 1,024\~bytes in 1\~KiB. +J.\~F.\~Ossanna wrote the original CSTR\~#54. +@endExample +@endDefesc + +By default, GNU @code{troff} fills text and adjusts it to reach the +output line length. The @code{nf} request disables filling; the +@code{fi} request reënables it. -See @ref{Line Control}, for interaction with the @code{\c} escape. +@DefreqList {fi, } +@DefregListEndx {.u} +@cindex filling of output, enabling (@code{fi}) +@cindex output, filling, enablement of (@code{fi}) +@cindex fill mode (@code{fi}), enabling +@cindex mode, fill (@code{fi}), enabling +Enable filling of output lines; a pending output line is broken. The +read-only register @code{.u} is set to@tie{}1. The filling enablement +status, sometimes called @dfn{fill mode}, is associated with the +environment (@pxref{Environments}). @xref{Line Continuation}, for +interaction with the @code{\c} escape sequence. @endDefreq @Defreq {nf, } -@cindex no-fill mode (@code{nf}) -@cindex mode, no-fill (@code{nf}) -Activate no-fill mode. Input lines are output as-is, retaining line -breaks and ignoring the current line length. This command implicitly -disables adjusting; it also causes a break. The number register -@code{.u} is set to@tie{}0. - -The fill mode status is associated with the current environment -(@pxref{Environments}). - -See @ref{Line Control}, for interaction with the @code{\c} escape. +@cindex filling of output, disabling (@code{nf}) +@cindex output, filling, disablement of (@code{nf}) +@cindex no-fill mode +@cindex mode, no-fill +@cindex fill mode, disabling +@cindex mode, fill, disabling +Disable filling of output lines: the output line length (@pxref{Line +Layout}) is ignored and output lines are broken where the input lines +are. A pending output line is broken and adjustment is suppressed. The +read-only register @code{.u} is set to@tie{}0. The filling enablement +status is associated with the environment (@pxref{Environments}). See +@ref{Line Continuation}, for interaction with the @code{\c} escape +sequence. @endDefreq @DefreqList {ad, [@Var{mode}]} @DefregListEndx {.j} -Set adjusting mode. +Enable output line adjustment in @var{mode}, taking effect when the +pending (or next) output line is broken. Adjustment is suppressed when +filling is. @var{mode} can have one of the following values. -Activation and deactivation of adjusting is done implicitly with calls -to the @code{fi} or @code{nf} requests. +@table @code +@item b +@itemx n +Adjust ``normally'':@: if the output line does not consume the distance +between the indentation and the configured output line length, GNU +@code{troff} stretches adjustable spaces within the line until that +length is reached. When the indentation is zero, this mode spreads the +line to both the left and right margins. This is the GNU @code{troff} +default. -@var{mode} can have one of the following values: +@item c +@cindex centered text (filled) +Center filled text. Contrast with the @code{ce} request, which centers +text @emph{without} filling it. -@table @code @item l -@cindex ragged-right -Adjust text to the left margin. This produces what is traditionally -called ragged-right text. +@cindex ragged-right text +Align text to the left without adjusting it. @item r -@cindex ragged-left -Adjust text to the right margin, producing ragged-left text. - -@item c -@cindex centered text -@cindex @code{ce} request, difference to @samp{.ad@tie{}c} -Center filled text. This is different to the @code{ce} request, which -only centers text without filling. - -@item b -@itemx n -Justify to both margins. This is the default used by @code{gtroff}. +@cindex ragged-left text +Align text to the right without adjusting it. @end table -Finally, @var{mode} can be the numeric argument returned by the -@code{.j} register. +@var{mode} can also be a value previously stored in the @code{.j} +register. Using @code{ad} without an argument is the same as @samp{.ad +\n[.j]}; unless filling is disabled, GNU @code{troff} resumes adjusting +lines in the same way it did before adjustment was disabled by +invocation of the @code{na} request. + +@cindex adjustment mode register (@code{.j}) +The adjustment mode and enablement status are encoded in the read-only +register @code{.j}. These parameters are associated with the +environment (@pxref{Environments}). -Using @code{ad} without argument is the same as saying -@w{@code{.ad \[.j]}}. In particular, @code{gtroff} adjusts lines -in the same way it did before adjusting was deactivated (with a call -to @code{na}, say). For example, this input code +The value of @code{.j} for any adjustment mode is an implementation +detail and should not be relied upon as a programmer's interface. Do +not write logic to interpret or perform arithmetic on it. @Example +.ll 48n .de AD . br . ad \\$1 .. -. +@c . @c XXX: Restore this line when the page has room for it. .de NA . br . na .. -. -textA +@c . @c XXX: Restore this line when the page has room for it. +left .AD r -.nr ad \n[.j] -textB +.nr ad \n(.j +right .AD c -textC +center .NA -textD -.AD \" back to centering -textE -.AD \n[ad] \" back to right justifying -textF +left +.AD +center +.AD \n(ad +right @endExample - -@noindent -produces the following output: - @Example -textA - textB - textC -textD - textE - textF + @result{} left + @result{} right + @result{} center + @result{} left + @result{} center + @result{} right @endExample - -@cindex adjustment mode register (@code{.j}) -As just demonstrated, the current adjustment mode is available in the -read-only number register @code{.j}; it can be stored and -subsequently used to set adjustment. - -The adjustment mode status is associated with the current environment -(@pxref{Environments}). @endDefreq @Defreq {na, } -Disable adjusting. This request won't change the current adjustment -mode: A subsequent call to @code{ad} uses the previous adjustment -setting. - -The adjustment mode status is associated with the current environment -(@pxref{Environments}). +Disable output line adjustment. This produces the same output as +left-alignment, but the value of the adjustment mode register @code{.j} +is altered differently. The adjustment mode and enablement status are +associated with the environment (@pxref{Environments}). @endDefreq @DefreqList {brp, } @DefescListEndx {\\p, , , } -Break, adjusting the current line per the current adjustment mode. - -With @code{\p}, this break will happen at the next word boundary. The -@code{\p} itself is removed entirely, adding neither a break nor a space -where it appears in input; it can thus be placed in the middle of a word -to cause a break at the end of that word. +Break, adjusting the line per the current adjustment mode. @code{\p} +schedules a break with adjustment at the next word boundary. The escape +sequence is itself neither a break nor a space of any kind; it can thus +be placed in the middle of a word to cause a break at the end of that +word. -In most cases this produces very ugly results since @code{gtroff} -doesn't have a sophisticated paragraph building algorithm (as @TeX{} -has, for example); instead, @code{gtroff} fills and adjusts a paragraph -line by line: +Breaking with immediate adjustment can produce ugly results since GNU +@code{troff} doesn't have a sophisticated paragraph-building algorithm, +as @TeX{} has, for example. Instead, GNU @code{troff} fills and adjusts +a paragraph line by line. @Example +.ll 4.5i This is an uninteresting sentence. This is an uninteresting sentence.\p This is an uninteresting sentence. @endExample @noindent -is formatted as +is formatted as follows. @Example -This is an uninteresting sentence. This is an -uninteresting sentence. +This is an uninteresting sentence. This is +an uninteresting sentence. This is an uninteresting sentence. @endExample @endDefreq -@DefreqList {ss, word_space_size [@Var{sentence_space_size}]} +@cindex productive input line +@cindex input line, productive +@cindex line, productive input +To clearly present the next couple of requests, we must introduce the +concept of ``productive'' input lines. A @dfn{productive input line} is +one that directly produces formatted output. Text lines produce +output,@footnote{unless diverted; see @ref{Diversions}} as do control +lines containing requests like @code{tl} or escape sequences like +@code{\D}. Macro calls are not @emph{directly} productive, and thus not +counted, but their interpolated contents can be. Empty requests, and +requests and escape sequences that define registers or strings or alter +the formatting environment (as with changes to the size, face, height, +slant, or color of the type) are not productive. We will also preview +the output line continuation escape sequence, @code{\c}, which +``connects'' two input lines that would otherwise be counted separately. +@footnote{@xref{Line Continuation}.} + +@Example +@c .ll 56n +.de hello +Hello, world! +.. +.ce \" center output of next productive input line +. +.nr junk-reg 1 +.ft I +Chorus: \c +.ft +.hello +Went the day well? + @result{} @slanted{Chorus:} Hello, world! + @result{} Went the day well? +@endExample + +@DefreqList {ce, [@Var{n}]} +@DefregListEndx {.ce} +@cindex centered text (unfilled) +@cindex centering lines (@code{ce}) +@cindex lines, centering (@code{ce}) +Break (unless the no-break control character is used), center the output +of the next @var{n} productive input lines with respect to the line +length and indentation without filling, then break again regardless of +the invoking control character. +@c Temporary indentation is ignored. +If the argument is not positive, centering is disabled. Omitting the +argument implies an @var{n} of @samp{1}. The count of lines remaining +to be centered is stored in the read-only register @code{.ce} and is +associated with the environment (@pxref{Environments}). + +@cindex @code{ce} request, difference from @w{@samp{.ad c}} +While the @w{@samp{.ad c}} request also centers text, it fills the text +as well. + +@c Wrap example at 56 columns. +@Example +.de FR +This is a small text fragment that shows the differences +between the `.ce' and the `.ad c' requests. +.. +.ll 4i +.ce 1000 +.FR +.ce 0 + +.ad c +.FR + @result{} This is a small text fragment that shows + @result{} the differences + @result{} between the @quoteleft{}.ce@quoteright{} and the @quoteleft{}.ad c@quoteright{} requests. + @result{} + @result{} This is a small text fragment that shows + @result{} the differences between the @quoteleft{}.ce@quoteright{} and + @result{} the @quoteleft{}.ad c@quoteright{} requests. +@endExample + +The previous example illustrates a common idiom of turning centering on +for a quantity of lines far in excess of what is required, and off again +after the text to be centered. This technique relieves humans of +counting lines for requests that take a count of input lines as an +argument. +@endDefreq + +@DefreqList {rj, [@Var{n}]} +@DefregListEndx {.rj} +@cindex justifying text (@code{rj}) +@cindex text, justifying (@code{rj}) +@cindex right-justifying (@code{rj}) +Break (unless the no-break control character is used), align the output +of the next @var{n} productive input lines to the right margin without +filling, then break again regardless of the control character. +@c Temporary indentation is ignored. +If the argument is not positive, right-alignment is disabled. Omitting +the argument implies an @var{n} of @samp{1}. The count of lines +remaining to be right-aligned is stored in the read-only register +@code{.rj} and is associated with the environment +(@pxref{Environments}). + +@Example +.ll 49n +.rj 3 +At first I hoped that such a technically unsound +project would collapse but I soon realized it was +doomed to success. \[em] C. A. R. Hoare + @result{} At first I hoped that such a technically unsound + @result{} project would collapse but I soon realized it was + @result{} doomed to success. -- C. A. R. Hoare +@endExample +@endDefreq + +@need 2000 +@DefreqList {ss, word-space-size [@Var{additional-sentence-space-size}]} @DefregItemx {.ss} @DefregListEndx {.sss} @cindex word space size register (@code{.ss}) @cindex size of word space register (@code{.ss}) @cindex space between words register (@code{.ss}) +@cindex inter-sentence space size register (@code{.sss}) @cindex sentence space size register (@code{.sss}) @cindex size of sentence space register (@code{.sss}) @cindex space between sentences register (@code{.sss}) -Change the size of a space between words. It takes its units as one -twelfth of the space width parameter for the current font. Initially -both the @var{word_space_size} and @var{sentence_space_size} -are@tie{}12. In fill mode, the values specify the minimum distance. - -@cindex fill mode -@cindex mode, fill -If two arguments are given to the @code{ss} request, the second argument -sets the sentence space size. If the second argument is not given, -sentence space size is set to @var{word_space_size}. The sentence space -size is used in two circumstances: If the end of a sentence occurs at -the end of a line in fill mode, then both an inter-word space and a -sentence space are added; if two spaces follow the end of a sentence in -the middle of a line, then the second space is a sentence space. If a -second argument is never given to the @code{ss} request, the behaviour -of Unix @code{troff} is the same as that exhibited by GNU @code{troff}. -In GNU @code{troff}, as in Unix @code{troff}, a sentence should always -be followed by either a newline or two spaces. - -The read-only number registers @code{.ss} and @code{.sss} hold the -values of the parameters set by the first and second arguments of the -@code{ss} request. - -The word space and sentence space values are associated with the current -environment (@pxref{Environments}). - -Contrary to @acronym{AT&T} @code{troff}, this request is @emph{not} -ignored if a TTY output device is used; the given values are then -rounded down to a multiple of@tie{}12 (@pxref{Implementation -Differences}). - -The request is ignored if there is no parameter. +Set the sizes of spaces between words and +sentences@footnote{Recall @ref{Filling} and @ref{Sentences} for the +definitions of word and sentence boundaries, respectively.} in twelfths +of font's space width (typically one-fourth to one-third em for Western +scripts). The default for both parameters is@tie{}12. Negative values +are erroneous. +@cindex inter-word spacing, minimal +@cindex minimal inter-word spacing +@cindex space, between words +The first argument is a minimum; if an output line undergoes adjustment, +such spaces may increase in width. +@cindex inter-sentence space, additional +@cindex additional inter-sentence space +@cindex space, between sentences +The optional second argument sets the amount of additional space +separating sentences on the same output line. If omitted, this amount +is set to @var{word-space-size}. The request is ignored if there are no +parameters. + +@cindex filling, and inter-sentence space +@cindex mode, fill, and inter-sentence space +Additional inter-sentence space is used only if the output line is not +full when the end of a sentence occurs in the input. If a sentence ends +at the end of an input line, then both an inter-word space and an +inter-sentence space are added to the output; if two spaces follow the +end of a sentence in the middle of an input line, then the second space +becomes an inter-sentence space in the output. Additional +inter-sentence space is not adjusted, but the inter-word space that +always precedes it may be. Further input spaces after the second, if +present, are adjusted as normal. + +The read-only registers @code{.ss} and @code{.sss} hold the minimal +inter-word space and additional inter-sentence space amounts, +respectively. These parameters are part of the environment +(@pxref{Environments}), and rounded down to the nearest multiple +of@tie{}12 on terminals. @cindex discardable horizontal space @cindex space, discardable, horizontal @cindex horizontal discardable space -Another useful application of the @code{ss} request is to insert -discardable horizontal space, i.e., space that is discarded at a line -break. For example, paragraph-style footnotes could be separated this -way: +The @code{ss} request can insert discardable horizontal space; that is, +space that is discarded at a break. For example, some footnote styles +collect the notes into a single paragraph with large gaps between +each note. @Example -.ll 4.5i -1.\ This is the first footnote.\c -.ss 48 -.nop -.ss 12 -2.\ This is the second footnote. -@endExample - -@noindent -The result: - -@Example -1. This is the first footnote. 2. This -is the second footnote. +.ll 48n +1.\~J. Fict. Ch. Soc. 6 (2020), 3\[en]14. +.ss 12 48 \" applies to next sentence ending +Reprints no longer available through FCS. +.ss 12 \" go back to normal +2.\~Better known for other work. + @result{} 1. J. Fict. Ch. Soc. 6 (2020), 3-14. Reprints + @result{} no longer available through FCS. 2. Better + @result{} known for other work. @endExample @noindent -Note that the @code{\h} escape produces unbreakable space. +If @emph{undiscardable} space is required, use the @code{\h} escape +sequence. @endDefreq -@DefreqList {ce, [@Var{nnn}]} -@DefregListEndx {.ce} -@cindex centering lines (@code{ce}) -@cindex lines, centering (@code{ce}) -Center text. While the @w{@samp{.ad c}} request also centers text, it -fills the text as well. @code{ce} does not fill the text it affects. -This request causes a break. The number of lines still to be centered -is associated with the current environment (@pxref{Environments}). -The following example demonstrates the differences. Here is the input: +@c ===================================================================== -@Example -.ll 4i -.ce 1000 -This is a small text fragment that shows the differences -between the `.ce' and the `.ad c' request. -.ce 0 +@node Manipulating Hyphenation, Manipulating Spacing, Manipulating Filling and Adjustment, GNU troff Reference +@section Manipulating Hyphenation +@cindex manipulating hyphenation +@cindex hyphenation, manipulating -.ad c -This is a small text fragment that shows the differences -between the `.ce' and the `.ad c' request. -@endExample +@cindex hyphenation, automatic +@cindex automatic hyphenation +When filling, GNU @code{troff} hyphenates words as needed at +user-specified and automatically determined hyphenation points. The +machine-driven determination of hyphenation points in words requires +algorithms and data, and is susceptible to conventions and preferences. +Before tackling such @dfn{automatic hyphenation}, let us consider how +hyphenation points can be set explicitly. + +@cindex hyphenation, explicit +@cindex explicit hyphenation +@cindex hyphenation, manual +@cindex manual hyphenation +Explicitly hyphenated words such as ``mother-in-law'' are eligible for +breaking after each of their hyphens. Relatively few words in a +language offer such obvious break points, however, and automatic +detection of syllabic (or phonetic) boundaries for hyphenation is not +perfect,@footnote{Whether a perfect algorithm for this application is +even possible is an unsolved problem in computer science:@: +@url{https://tug.org/docs/liang/liang-thesis.pdf}.} particularly for +unusual words found in technical literature. We can instruct GNU +@code{troff} how to hyphenate specific words if the need arises. + +@cindex hyphenation exceptions +@Defreq {hw, word @dots{}} +Define each @dfn{hyphenation exception} @var{word} with each hyphen `-' +in the word indicating a hyphenation point. For example, the request + +@Example +.hw in-sa-lub-rious alpha +@endExample + +@c Serendipitously, in PDF output, the "alpha" below gets hyphenated. +@c Try to preserve this felicity in future edits. +marks potential hyphenation points in ``insalubrious'', and prevents +``alpha'' from being hyphenated at all. + +Besides the space character, any character whose hyphenation code is +zero can be used to separate the arguments of @code{hw} (see the +@code{hcode} request below). In addition, this request can be used more +than once. -@noindent -And here the result: +@cindex @code{hw} request, and @code{hy} restrictions +Hyphenation points specified with @code{hw} are not subject to the +within-word placement restrictions imposed by the @code{hy} request (see +below). -@Example - This is a small text fragment that - shows the differences -between the `.ce' and the `.ad c' request. +Hyphenation exceptions specified with the @code{hw} request are +associated with the hyphenation language (see the @code{hla} request +below) and environment (@pxref{Environments}); invoking the @code{hw} +request in the absence of a hyphenation language is an error. - This is a small text fragment that -shows the differences between the `.ce' - and the `.ad c' request. -@endExample +The request is ignored if there are no parameters. +@endDefreq -With no arguments, @code{ce} centers the next line of text. @var{nnn} -specifies the number of lines to be centered. If the argument is zero -or negative, centering is disabled. +These are known as hyphenation @slanted{exceptions} in the expectation +that most users will avail themselves of automatic hyphenation; these +exceptions override any rules that would normally apply to a word +matching a hyphenation exception defined with @code{hw}. -The basic length for centering text is the line length (as set with the -@code{ll} request) minus the indentation (as set with the @code{in} -request). Temporary indentation is ignored. +Situations also arise when only a specific occurrence of a word needs +its hyphenation altered or suppressed, or when a URL or similar string +needs to be breakable in sensible places without hyphenation. -As can be seen in the previous example, it is a common idiom to turn on -centering for a large number of lines, and to turn off centering after -text to be centered. This is useful for any request that takes a -number of lines as an argument. +@DefescList {\\%, , , } +@DefescListEndx {\:, , , } +@cindex hyphenation character (@code{\%}) +@cindex character, hyphenation (@code{\%}) +@cindex disabling hyphenation (@code{\%}) +@cindex hyphenation, disabling (@code{\%}) +To tell GNU @code{troff} how to hyphenate words as they occur in input, +use the @code{\%} escape sequence; it is the default @dfn{hyphenation +character}. Each instance within a word indicates to GNU @code{troff} +that the word may be hyphenated at that point, while prefixing a word +with this escape sequence prevents it from being otherwise hyphenated. +This mechanism affects only that occurrence of the word; to change the +hyphenation of a word for the remainder of input processing, use the +@code{hw} request. -The @code{.ce} read-only number register contains the number of lines -remaining to be centered, as set by the @code{ce} request. -@endDefreq +@cindex @code{\X}, followed by @code{\%} +@cindex @code{\Y}, followed by @code{\%} +@cindex @code{\%}, following @code{\X} or @code{\Y} +GNU @code{troff} regards the escape sequences @code{\X} and @code{\Y} as +starting a word; that is, the @code{\%} escape sequence in, say, +@w{@samp{\X'...'\%foobar}} or @w{@samp{\Y'...'\%foobar}} no longer +prevents hyphenation of @samp{foobar} but inserts a hyphenation point +just prior to it; most likely this isn't what you want. +@xref{Postprocessor Access}. + +@cindex non-printing break point (@code{\:}) +@cindex breaking without hyphens (@code{\:}) +@cindex file names, breaking (@code{\:}) +@cindex breaking file names (@code{\:}) +@cindex URLs, breaking (@code{\:}) +@cindex breaking URLs (@code{\:}) +@code{\:} inserts a non-printing break point; that is, a word can break +there, but the soft hyphen glyph (see below) is not written to the +output if it does. This escape sequence is an input word boundary, so +the remainder of the word is subject to hyphenation as normal. + +You can combine @code{\:} and @code{\%} to control breaking of a file +name or URL, or to permit hyphenation only after certain explicit +hyphens within a word. + +@Example +@c Wrap example at 56 columns. +The \%Lethbridge-Stewart-\:\%Sackville-Baggins divorce +was, in retrospect, inevitable once the contents of +\%/var/log/\:\%httpd/\:\%access_log on the family web +server came to light, revealing visitors from Hogwarts. +@endExample +@endDefesc -@DefreqList {rj, [@Var{nnn}]} -@DefregListEndx {.rj} -@cindex justifying text (@code{rj}) -@cindex text, justifying (@code{rj}) -@cindex right-justifying (@code{rj}) -Justify unfilled text to the right margin. Arguments are identical to -the @code{ce} request. The @code{.rj} read-only number register is the -number of lines to be right-justified as set by the @code{rj} request. -This request causes a break. The number of lines still to be -right-justified is associated with the current environment +@Defreq {hc, [@Var{char}]} +Change the hyphenation character to @var{char}. This character then +works as the @code{\%} escape sequence normally does, and thus no longer +appears in the output.@footnote{@code{\%} itself stops marking +hyphenation points but still produces no output glyph.} Without an +argument, @code{hc} resets the hyphenation character to @code{\%} (the +default). The hyphenation character is associated with the environment (@pxref{Environments}). @endDefreq +@Defreq {shc, [@Var{c}]} +@cindex soft hyphen character, setting (@code{shc}) +@cindex character, soft hyphen, setting (@code{shc}) +@cindex glyph, soft hyphen (@code{hy}) +@cindex soft hyphen glyph (@code{hy}) +@cindex @code{char} request, and soft hyphen character +@cindex @code{tr} request, and soft hyphen character +Set the @dfn{soft hyphen character}, inserted when a word is hyphenated +automatically or at a hyphenation character, to the ordinary or special +character@tie{}@var{c}.@footnote{``Soft'' because it appears in output +only where a hyphenation break is performed; a ``hard'' hyphen, as in +``long-term'', always appears.} If the argument is omitted, the soft +hyphen character is set to the default, @code{\[hy]}. If no glyph for +@var{c} exists in the font in use at a potential hyphenation point, then +the line is not broken there. Neither character definitions (specified +with the @code{char} and similar requests) nor translations (specified +with the @code{tr} request) are applied to @var{c}. +@endDefreq -@c ===================================================================== - -@node Manipulating Hyphenation, Manipulating Spacing, Manipulating Filling and Adjusting, gtroff Reference -@section Manipulating Hyphenation -@cindex manipulating hyphenation -@cindex hyphenation, manipulating - -Here a description of requests that influence hyphenation. - +@cindex hyphenation parameters, automatic +@cindex automatic hyphenation parameters +Several requests influence automatic hyphenation. Because conventions +vary, a variety of hyphenation modes is available to the @code{hy} +request; these determine whether hyphenation will apply to a +word prior to breaking a line at the end of a page (more or less; see +below for details), and at which positions within that word +automatically determined hyphenation points are permissible. The places +within a word that are eligible for hyphenation are determined by +language-specific data and lettercase relationships. Furthermore, +hyphenation of a word might be suppressed due to a limit on +consecutive hyphenated lines (@code{hlm}), a minimum line length +threshold (@code{hym}), or because the line can instead be adjusted with +additional inter-word space (@code{hys}). + +@cindex hyphenation mode register (@code{.hy}) @DefreqList {hy, [@Var{mode}]} @DefregListEndx {.hy} -Enable hyphenation. The request has an optional numeric argument, -@var{mode}, to restrict hyphenation if necessary: +Set automatic hyphenation mode to @var{mode}, an integer encoding +conditions for hyphenation; if omitted, @samp{1} is implied. The +hyphenation mode is available in the read-only register @samp{.hy}; it +is associated with the environment (@pxref{Environments}). The default +hyphenation mode depends on the localization file loaded when GNU +@code{troff} starts up; see the @code{hpf} request below. + +Typesetting practice generally does not avail itself of every +opportunity for hyphenation, but the details differ by language and site +mandates. The hyphenation modes of @acronym{AT&T} @code{troff} were +implemented with English-language publishing practices of the 1970s in +mind, not a scrupulous enumeration of conceivable parameters. GNU +@code{troff} extends those modes such that finer-grained control is +possible, favoring compatibility with older implementations over a more +intuitive arrangement. The means of hyphenation mode control is a set +of numbers that can be added up to encode the behavior +sought.@footnote{The mode is a vector of Booleans encoded as an integer. +To a programmer, this fact is easily deduced from the exclusive use of +powers of two for the configuration parameters; they are computationally +easy to ``mask off'' and compare to zero. To almost everyone else, the +arrangement seems recondite and unfriendly.} The entries in the +following table are termed @dfn{values}; the sum of the desired +values is the @dfn{mode}. @table @code +@item 0 +disables hyphenation. + @item 1 -The default argument if @var{mode} is omitted: hyphenation is enabled, -and the first and the last characters of a word are not hyphenated. -This is also the start-up value of @code{gtroff}. +enables hyphenation except after the first and before the last character +of a word. +@end table + +The remaining values ``imply'' 1; that is, they enable hyphenation +under the same conditions as @samp{.hy 1}, and then apply or lift +restrictions relative to that basis. +@table @code @item 2 -Do not hyphenate the last word on a page or column. +disables hyphenation of the last word on a page,@footnote{Hyphenation is +prevented if the next page location trap is closer to the vertical +drawing position than the next text baseline would be. @xref{Page +Location Traps}.} even for explicitly hyphenated words. @item 4 -Do not hyphenate the last two characters of a word. +disables hyphenation before the last two characters of a word. @item 8 -Do not hyphenate the first two characters of a word. +disables hyphenation after the first two characters of a word. @item 16 -Allow hyphenation before the last character of a word. +enables hyphenation before the last character of a word. @item 32 -Allow hyphenation after the first character of a word. +enables hyphenation after the first character of a word. @end table -The values in the previous table are additive. For example, -value@tie{}12 causes @code{gtroff} to neither hyphenate the last two nor -the first two characters of a word. Note that value@tie{}13 would do -exactly the same; in other words, value@tie{}1 need not be added if the -value is larger than@tie{}1. - -Some values cannot be used together because they contradict; for -instance, values 4 and@tie{}16, and values 8 and@tie{}32. - -The number of characters at the beginning of a word after which the -first hyphenation point should be inserted is determined by the patterns -themselves; it can't be reduced further without introducing additional, -invalid hyphenation points (unfortunately, this information is not part -of a pattern file, you have to know it in advance). The same is true -for the number of characters at the end of word before the last -hyphenation point should be inserted. For example, the code +Apart from value@tie{}2, restrictions imposed by the hyphenation mode +are @emph{not} respected for words whose hyphenations have been +specified with the hyphenation character (@samp{\%} by default) or the +@code{hw} request. + +Nonzero values in the previous table are additive. For example, +mode@tie{}12 causes GNU @code{troff} to hyphenate neither the last two +nor the first two characters of a word. Some values cannot be used +together because they contradict; for instance, values 4 and@tie{}16, +and values 8 and@tie{}32. As noted, it is superfluous to add 1 to any +non-zero even mode. + +@cindex hyphenation pattern files +@cindex pattern files, for hyphenation +The automatic placement of hyphens in words is determined by +@dfn{pattern files}, which are derived from @TeX{} and available for +several languages. The number of characters at the beginning of a word +after which the first hyphenation point should be inserted is determined +by the patterns themselves; it can't be reduced further without +introducing additional, invalid hyphenation points (unfortunately, this +information is not part of a pattern file---you have to know it in +advance). The same is true for the number of characters at the end of +a word before the last hyphenation point should be inserted. For +example, you can supply the following input to @samp{echo $(nroff)}. @Example .ll 1 @@ -7095,257 +8583,156 @@ hyphenation point should be inserted. For example, the code splitting @endExample -returns +@noindent +You will get @Example -s- -plit- -t- -in- -g +s- plit- t- in- g @endExample -instead of the correct `split-ting'. US-English patterns as distributed -with groff need two characters at the beginning and three characters at -the end; this means that value@tie{}4 of @code{hy} is mandatory. -Value@tie{}8 is possible as an additional restriction, but values@tie{}1 -(the default!), 16, and@tie{}32 should be avoided. - -Here is a table of left and right minimum values for hyphenation as needed -by the patterns distributed with groff; see the @cite{groff_tmac(5) man -page} (type @command{man groff_tmac} at the command line) for more -information on groff's language macro files. +@noindent +instead of the correct `split- ting'. English patterns as distributed +with GNU @code{troff} need two characters at the beginning and three +characters at the end; this means that value@tie{}4 of @code{hy} is +mandatory. Value@tie{}8 is possible as an additional restriction, but +values@tie{}16 and@tie{}32 should be avoided, as should mode@tie{}1. +Modes@tie{}4 and@tie{}6 are typical. + +A table of left and right minimum character counts for hyphenation as +needed by the patterns distributed with GNU @code{troff} follows; see +the @cite{groff_tmac@r{(5)}} man page for more information on GNU +@code{troff}'s language macro files. @multitable {German traditional} {pattern name} {left min} {right min} @headitem language @tab pattern name @tab left min @tab right min @item Czech @tab cs @tab 2 @tab 2 -@item US English @tab us @tab 2 @tab 3 +@item English @tab en @tab 2 @tab 3 @item French @tab fr @tab 2 @tab 3 @item German traditional @tab det @tab 2 @tab 2 @item German reformed @tab den @tab 2 @tab 2 +@item Italian @tab it @tab 2 @tab 2 @item Swedish @tab sv @tab 1 @tab 2 @end multitable Hyphenation exceptions within pattern files (i.e., the words within a -@code{\hyphenation} group) also obey the hyphenation restrictions given -by @code{hy}. However, exceptions specified with the @code{hw} do not. - -@cindex hyphenation restrictions register (@code{.hy}) -The current hyphenation restrictions can be found in the read-only -number register @samp{.hy}. - -The hyphenation mode is associated with the current environment -(@pxref{Environments}). +@TeX{} @code{\hyphenation} group) obey the hyphenation restrictions +given by @code{hy}. @endDefreq @Defreq {nh, } -Disable hyphenation (i.e., set the hyphenation mode to zero). Note that -the hyphenation mode of the last call to @code{hy} is not remembered. - -The hyphenation mode is associated with the current environment -(@pxref{Environments}). +Disable automatic hyphenation; i.e., set the hyphenation mode to@tie{}0 +(see above). The hyphenation mode of the last call to @code{hy} is not +remembered. @endDefreq -@DefreqList {hlm, [@Var{nnn}]} -@DefregItemx {.hlm} -@DefregListEndx {.hlc} -@cindex explicit hyphen (@code{\%}) -@cindex hyphen, explicit (@code{\%}) -@cindex consecutive hyphenated lines (@code{hlm}) -@cindex lines, consecutive hyphenated (@code{hlm}) -@cindex hyphenated lines, consecutive (@code{hlm}) -Set the maximum number of consecutive hyphenated lines to @var{nnn}. If -this number is negative, there is no maximum. The default value -is@tie{}@minus{}1 if @var{nnn} is omitted. This value is associated -with the current environment (@pxref{Environments}). Only lines output -from a given environment count towards the maximum associated with that -environment. Hyphens resulting from @code{\%} are counted; explicit -hyphens are not. - -The current setting of @code{hlm} is available in the @code{.hlm} -read-only number register. Also the number of immediately preceding -consecutive hyphenated lines are available in the read-only number -register @samp{.hlc}. -@endDefreq +@need 200 +@DefreqList {hpf, pattern-file} +@DefreqItemx {hpfa, pattern-file} +@DefreqListEndx {hpfcode, a b [c d] @dots{}} +@cindex hyphenation patterns (@code{hpf}) +@cindex patterns for hyphenation (@code{hpf}) +Read hyphenation patterns from @var{pattern-file}, which is sought +in the same way that macro files are with the @code{mso} request or the +@option{-m@var{name}} command-line option to @code{groff}. The +@var{pattern-file} should have the same format as (simple) @TeX{} +pattern files. More specifically, the following scanning rules are +implemented. -@Defreq {hw, word1 word2 @dots{}} -Define how @var{word1}, @var{word2}, etc.@: are to be hyphenated. The -words must be given with hyphens at the hyphenation points. For -example: +@itemize @bullet +@item +A percent sign starts a comment (up to the end of the line) even if +preceded by a backslash. -@Example -.hw in-sa-lub-rious -@endExample +@item +``Digraphs'' like @code{\$} are not supported. -@noindent -Besides the space character, any character whose hyphenation code value -is zero can be used to separate the arguments of @code{hw} (see the -documentation for the @code{hcode} request below for more information). -In addition, this request can be used more than once. +@item +@code{^^@var{xx}} (where each @var{x} is 0--9 or a--f) and +@code{^^@var{c}} (character @var{c} in the code point range 0--127 +decimal) are recognized; other uses of @code{^} cause an error. -@cindex @code{hw} request, and @code{hy} restrictions -Hyphenation points specified with @code{hw} are not subject to the -restrictions given by the @code{hy} request. +@item +No macro expansion is performed. -Hyphenation exceptions specified with the @code{hw} request are -associated with the current hyphenation language; it causes an error if -there is no current hyphenation language. +@item +@code{hpf} checks for the expression @code{\patterns@{@dots{}@}} +(possibly with whitespace before or after the braces). Everything +between the braces is taken as hyphenation patterns. Consequently, +@code{@{} and @code{@}} are not allowed in patterns. -This request is ignored if there is no parameter. +@item +Similarly, @code{\hyphenation@{@dots{}@}} gives a list of hyphenation +exceptions. -In old versions of @code{troff} there was a limited amount of space to -store such information; fortunately, with @code{gtroff}, this is no -longer a restriction. -@endDefreq - -@DefescList {\\%, , , } -@deffnx Escape @t{\:} -@ifnotinfo -@esindex \: -@end ifnotinfo -@ifinfo -@esindex \@r{} -@end ifinfo -@cindex hyphenation character (@code{\%}) -@cindex character, hyphenation (@code{\%}) -@cindex disabling hyphenation (@code{\%}) -@cindex hyphenation, disabling (@code{\%}) -To tell @code{gtroff} how to hyphenate words on the fly, use the -@code{\%} escape, also known as the @dfn{hyphenation character}. -Preceding a word with this character prevents it from being -hyphenated; putting it inside a word indicates to @code{gtroff} that -the word may be hyphenated at that point. Note that this mechanism -only affects that one occurrence of the word; to change the -hyphenation of a word for the entire document, use the @code{hw} -request. - -The @code{\:} escape inserts a zero-width break point (that is, the word -breaks but without adding a hyphen). - -@Example -... check the /var/log/\:httpd/\:access_log file ... -@endExample - -@cindex @code{\X}, followed by @code{\%} -@cindex @code{\Y}, followed by @code{\%} -@cindex @code{\%}, following @code{\X} or @code{\Y} -Note that @code{\X} and @code{\Y} start a word, that is, the @code{\%} -escape in (say) @w{@samp{\X'...'\%foobar}} and -@w{@samp{\Y'...'\%foobar}} no longer prevents hyphenation but inserts a -hyphenation point at the beginning of @samp{foobar}; most likely this -isn't what you want to do. -@endDefesc - -@Defreq {hc, [@Var{char}]} -Change the hyphenation character to @var{char}. This character then -works the same as the @code{\%} escape, and thus, no longer appears in -the output. Without an argument, @code{hc} resets the hyphenation -character to be @code{\%} (the default) only. - -The hyphenation character is associated with the current environment -(@pxref{Environments}). -@endDefreq - -@DefreqList {hpf, pattern_file} -@DefreqItemx {hpfa, pattern_file} -@DefreqListEndx {hpfcode, a b [c d @dots{}]} -@cindex hyphenation patterns (@code{hpf}) -@cindex patterns for hyphenation (@code{hpf}) -Read in a file of hyphenation patterns. This file is searched for in -the same way as @file{@var{name}.tmac} (or @file{tmac.@var{name}}) is -searched for if the @option{-m@var{name}} option is specified. - -It should have the same format as (simple) @TeX{} patterns files. More -specifically, the following scanning rules are implemented. - -@itemize @bullet -@item -A percent sign starts a comment (up to the end of the line) even if -preceded by a backslash. - -@item -No support for `digraphs' like @code{\$}. - -@item -@code{^^@var{xx}} (@var{x} is 0--9 or a--f) and @code{^^@var{x}} -(character code of @var{x} in the range 0--127) are recognized; other use -of @code{^} causes an error. - -@item -No macro expansion. - -@item -@code{hpf} checks for the expression @code{\patterns@{@dots{}@}} -(possibly with whitespace before and after the braces). Everything -between the braces is taken as hyphenation patterns. Consequently, -@code{@{} and @code{@}} are not allowed in patterns. - -@item -Similarly, @code{\hyphenation@{@dots{}@}} gives a list of hyphenation -exceptions. - -@item -@code{\endinput} is recognized also. +@item +@code{\endinput} is recognized also. @item -For backwards compatibility, if @code{\patterns} is missing, the whole -file is treated as a list of hyphenation patterns (only recognizing the -@code{%} character as the start of a comment). +For backward compatibility, if @code{\patterns} is missing, the whole +file is treated as a list of hyphenation patterns (except that the +@code{%} character is recognized as the start of a comment). @end itemize -If no @code{hpf} request is specified (either in the document or in a -macro package), @code{gtroff} won't hyphenate at all. - The @code{hpfa} request appends a file of patterns to the current list. The @code{hpfcode} request defines mapping values for character codes in -hyphenation patterns. @code{hpf} or @code{hpfa} then apply the mapping -(after reading the patterns) before replacing or appending them to the -current list of patterns. Its arguments are pairs of character codes -- -integers from 0 to@tie{}255. The request maps character -code@tie{}@var{a} to code@tie{}@var{b}, code@tie{}@var{c} to -code@tie{}@var{d}, and so on. You can use character codes that would -be invalid otherwise. By default, everything maps to itself except -letters `A' to `Z', which map to `a' to `z'. - - +pattern files. It is an older mechanism no longer used by GNU +@code{troff}'s own macro files; for its successor, see @code{hcode} +below. @code{hpf} or @code{hpfa} apply the mapping after reading the +patterns but before replacing or appending to the active list of +patterns. Its arguments are pairs of character codes---integers from 0 +to@tie{}255. The request maps character code@tie{}@var{a} to +code@tie{}@var{b}, code@tie{}@var{c} to code@tie{}@var{d}, and so on. +Character codes that would otherwise be invalid in GNU @code{troff} can +be used. By default, every code maps to itself except those for letters +`A' to `Z', which map to those for `a' to `z'. + +@cindex localization @pindex troffrc -@pindex troffrc-end -@pindex hyphen.us -@pindex hyphenex.us -The set of hyphenation patterns is associated with the current language -set by the @code{hla} request. The @code{hpf} request is usually -invoked by the @file{troffrc} or @file{troffrc-end} file; by default, -@file{troffrc} loads hyphenation patterns and exceptions for American -English (in files @file{hyphen.us} and @file{hyphenex.us}). +@pindex cs.tmac +@pindex de.tmac +@pindex en.tmac +@pindex fr.tmac +@pindex it.tmac +@pindex ja.tmac +@pindex sv.tmac +@pindex zh.tmac +The set of hyphenation patterns is associated with the language set by +the @code{hla} request (see below). The @code{hpf} request is usually +invoked by a localization file loaded by the @file{troffrc} +file.@footnote{For more on localization, see the +@cite{groff_tmac@r{(5)}} man page.} A second call to @code{hpf} (for the same language) replaces the -hyphenation patterns with the new ones. - -Invoking @code{hpf} causes an error if there is no current hyphenation -language. +hyphenation patterns with the new ones. Invoking @code{hpf} or +@code{hpfa} causes an error if there is no hyphenation language. If no +@code{hpf} request is specified (either in the document, in a file +loaded at startup, or in a macro package), GNU @code{troff} won't +automatically hyphenate at all. @endDefreq -@Defreq {hcode, c1 code1 [c2 code2 @dots{}]} +@Defreq {hcode, c1 code1 [c2 code2] @dots{}} @cindex hyphenation code (@code{hcode}) @cindex code, hyphenation (@code{hcode}) Set the hyphenation code of character @var{c1} to @var{code1}, that of -@var{c2} to @var{code2}, etc. A hyphenation code must be a single input -character (not a special character) other than a digit or a space. - -To make hyphenation work, hyphenation codes must be set up. At -start-up, groff only assigns hyphenation codes to the letters -@samp{a}--@samp{z} (mapped to themselves) and to the letters -@samp{A}--@samp{Z} (mapped to @samp{a}--@samp{z}); all other hyphenation -codes are set to zero. Normally, hyphenation patterns contain only -lowercase letters, which should be applied regardless of case. In -other words, the words `FOO' and `Foo' should be hyphenated exactly the -same way as the word `foo' is hyphenated, and this is what @code{hcode} -is good for. Words that contain other letters won't be hyphenated -properly if the corresponding hyphenation patterns actually do contain -them. For example, the following @code{hcode} requests are necessary to -assign hyphenation codes to the letters @samp{ÄäÖöÜüß} (this is needed -for German): +@var{c2} to @var{code2}, and so on. A hyphenation code must be an +ordinary character (not a special character escape sequence) other than +a digit or a space. The request is ignored if given no arguments. + +For hyphenation to work, hyphenation codes must be set up. At +startup, GNU @code{troff} assigns hyphenation codes to the letters +@samp{a}--@samp{z} (mapped to themselves), to the letters +@samp{A}--@samp{Z} (mapped to @samp{a}--@samp{z}), and zero to all other +characters. Normally, hyphenation patterns contain only lowercase +letters which should be applied regardless of case. In other words, +they assume that the words `FOO' and `Foo' should be hyphenated exactly +as `foo' is. The @code{hcode} request extends this principle to letters +outside the Unicode basic Latin alphabet; without it, words containing +such letters won't be hyphenated properly even if the corresponding +hyphenation patterns contain them. + +For example, the following @code{hcode} requests are necessary to assign +hyphenation codes to the letters @samp{ÄäÖöÜüß}, needed for German. @Example .hcode ä ä Ä ä @@ -7354,14 +8741,55 @@ for German): .hcode ß ß @endExample -Without those assignments, groff treats German words like -@w{`Kindergärten'} (the plural form of `kindergarten') as two substrings +Without these assignments, GNU @code{troff} treats the German word +@w{`Kindergärten'} (the plural form of `kindergarten') as two words @w{`kinderg'} and @w{`rten'} because the hyphenation code of the -umlaut@tie{}a is zero by default. There is a German hyphenation pattern -that covers @w{`kinder'}, so groff finds the hyphenation `kin-der'. -The other two hyphenation points (`kin-der-gär-ten') are missed. +umlaut@tie{}a is zero by default, just like a space. There is a German +hyphenation pattern that covers @w{`kinder'}, so GNU @code{troff} finds +the hyphenation `kin-der'. The other two hyphenation points +(`kin-der-gär-ten') are missed. +@endDefreq + +@DefreqList {hla, lang} +@DefregListEndx {.hla} +@cindex @code{hpf} request, and hyphenation language +@cindex @code{hw} request, and hyphenation language +@pindex troffrc +@pindex troffrc-end +Set the hyphenation language to @var{lang}. Hyphenation exceptions +specified with the @code{hw} request and hyphenation patterns and +exceptions specified with the @code{hpf} and @code{hpfa} requests are +associated with the hyphenation language. The @code{hla} request is +usually invoked by a localization file, which is turn loaded by the +@file{troffrc} or @file{troffrc-end} file; see the @code{hpf} request +above. + +@cindex hyphenation language register (@code{.hla}) +The hyphenation language is available in the read-only string-valued +register @samp{.hla}; it is associated with the environment +(@pxref{Environments}). +@endDefreq -This request is ignored if it has no parameter. +@DefreqList {hlm, [@Var{n}]} +@DefregItemx {.hlm} +@DefregListEndx {.hlc} +@cindex explicit hyphen (@code{\%}) +@cindex hyphen, explicit (@code{\%}) +@cindex consecutive hyphenated lines (@code{hlm}) +@cindex lines, consecutive hyphenated (@code{hlm}) +@cindex hyphenated lines, consecutive (@code{hlm}) +Set the maximum quantity of consecutive hyphenated lines to @var{n}. If +@var{n} is negative, there is no maximum. If omitted, @var{n} +is@tie{}@minus{}1. This value is associated with the environment +(@pxref{Environments}). Only lines output from a given environment +count toward the maximum associated with that environment. Hyphens +resulting from @code{\%} are counted; explicit hyphens are not. + +@cindex hyphenation consecutive line limit register (@code{.hlm}) +@cindex hyphenation consecutive line count register (@code{.hlc}) +The @code{.hlm} read-only register stores this maximum. The count of +immediately preceding consecutive hyphenated lines is available in the +read-only register @code{.hlc}. @endDefreq @DefreqList {hym, [@Var{length}]} @@ -7369,107 +8797,90 @@ This request is ignored if it has no parameter. @cindex hyphenation margin (@code{hym}) @cindex margin for hyphenation (@code{hym}) @cindex @code{ad} request, and hyphenation margin -Set the (right) hyphenation margin to @var{length}. If the current -adjustment mode is not @samp{b} or @samp{n}, the line is not hyphenated -if it is shorter than @var{length}. Without an argument, the -hyphenation margin is reset to its default value, which is@tie{}0. The -default scaling indicator for this request is @samp{m}. The hyphenation -margin is associated with the current environment +Set the (right) hyphenation margin to @var{length}. If the adjustment +mode is not @samp{b} or @samp{n}, the line is not hyphenated if it is +shorter than @var{length}. Without an argument, the hyphenation margin +is reset to its default value, 0. The default scaling unit is @samp{m}. +The hyphenation margin is associated with the environment (@pxref{Environments}). A negative argument resets the hyphenation margin to zero, emitting a -warning of type @samp{range}. +warning in category @samp{range}. @cindex hyphenation margin register (@code{.hym}) -The current hyphenation margin is available in the @code{.hym} read-only -number register. +The hyphenation margin is available in the @code{.hym} read-only +register. @endDefreq -@DefreqList {hys, [@Var{hyphenation_space}]} +@DefreqList {hys, [@Var{hyphenation-space}]} @DefregListEndx {.hys} @cindex hyphenation space (@code{hys}) +@cindex hyphenation space adjustment threshold @cindex @code{ad} request, and hyphenation space -Set the hyphenation space to @var{hyphenation_space}. If the current -adjustment mode is @samp{b} or @samp{n}, don't hyphenate the line if it -can be justified by adding no more than @var{hyphenation_space} extra -space to each word space. Without argument, the hyphenation space is -set to its default value, which is@tie{}0. The default scaling -indicator for this request is @samp{m}. The hyphenation space is -associated with the current environment (@pxref{Environments}). - -A negative argument resets the hyphenation space to zero, emitting a -warning of type @samp{range}. - -@cindex hyphenation space register (@code{.hys}) -The current hyphenation space is available in the @code{.hys} read-only -number register. -@endDefreq - -@Defreq {shc, [@Var{glyph}]} -@cindex soft hyphen character, setting (@code{shc}) -@cindex character, soft hyphen, setting (@code{shc}) -@cindex glyph, soft hyphen (@code{hy}) -@cindex soft hyphen glyph (@code{hy}) -@cindex @code{char} request, and soft hyphen character -@cindex @code{tr} request, and soft hyphen character -Set the @dfn{soft hyphen character} to @var{glyph}.@footnote{@dfn{Soft -hyphen character} is a misnomer since it is an output glyph.} If the -argument is omitted, the soft hyphen character is set to the default -glyph @code{\(hy} (this is the start-up value of @code{gtroff} also). -The soft hyphen character is the glyph that is inserted when a word is -hyphenated at a line break. If the soft hyphen character does not exist -in the font of the character immediately preceding a potential break -point, then the line is not broken at that point. Neither definitions -(specified with the @code{char} request) nor translations (specified -with the @code{tr} request) are considered when finding the soft hyphen -character. -@endDefreq - -@DefreqList {hla, language} -@DefregListEndx {.hla} -@cindex @code{hpf} request, and hyphenation language -@cindex @code{hw} request, and hyphenation language -@pindex troffrc -@pindex troffrc-end -Set the current hyphenation language to the string @var{language}. -Hyphenation exceptions specified with the @code{hw} request and -hyphenation patterns specified with the @code{hpf} and @code{hpfa} -requests are both associated with the current hyphenation language. The -@code{hla} request is usually invoked by the @file{troffrc} or the -@file{troffrc-end} files; @file{troffrc} sets the default language to -@samp{us}. +Suppress hyphenation of the line in adjustment modes @samp{b} or +@samp{n} if it can be justified by adding no more than +@var{hyphenation-space} extra space to each inter-word space. Without +an argument, the hyphenation space adjustment threshold is set to its +default value, 0. The default scaling unit is @samp{m}. The +hyphenation space adjustment threshold is associated with the +environment (@pxref{Environments}). -@cindex hyphenation language register (@code{.hla}) -The current hyphenation language is available as a string in the -read-only number register @samp{.hla}. +A negative argument resets the hyphenation space adjustment threshold to +zero, emitting a warning in category @samp{range}. -@Example -.ds curr_language \n[.hla] -\*[curr_language] - @result{} us -@endExample +@cindex hyphenation space adjustment threshold register (@code{.hys}) +The hyphenation space adjustment threshold is available in the +@code{.hys} read-only register. @endDefreq @c ===================================================================== -@node Manipulating Spacing, Tabs and Fields, Manipulating Hyphenation, gtroff Reference +@node Manipulating Spacing, Tabs and Fields, Manipulating Hyphenation, GNU troff Reference @section Manipulating Spacing @cindex manipulating spacing @cindex spacing, manipulating +A break causes the formatter to update the vertical drawing position at +which the new text baseline is aligned. You can alter this location. + @Defreq {sp, [@Var{distance}]} -Space downwards @var{distance}. With no argument it advances -1@tie{}line. A negative argument causes @code{gtroff} to move up the -page the specified distance. If the argument is preceded by a @samp{|} -then @code{gtroff} moves that distance from the top of the page. This -request causes a line break, and that adds the current line spacing to -the space you have just specified. The default scaling indicator is -@samp{v}. +Break and move the next text baseline down by @var{distance}, or until +springing a page location trap.@footnote{@xref{Page Location Traps}.} +If invoked with the no-break control character, @code{sp} moves the +pending output line's text baseline by @var{distance}. A negative +@var{distance} will not reduce the position of the text baseline below +zero. Inside a diversion, any @var{distance} argument is ignored. The +default scaling unit is @samp{v}. If @var{distance} is not specified, +@samp{1v} is assumed. -For convenience you may wish to use the following macros to set the -height of the next line at a given distance from the top or the bottom -of the page: +@Example +.pl 5v \" Set page length to 5 vees. +.de xx +\-\-\- +. br +.. +.wh 0 xx \" Set a trap at the top of the page. +foo on page \n% +.sp 2v +bar on page \n% +.sp 50v \" This will cause a page break. +baz on page \n% +.pl \n(nlu \" Truncate page to current position. + @result{} --- + @result{} foo on page 1 + @result{} + @result{} + @result{} bar on page 1 + @result{} --- + @result{} baz on page 2 +@endExample + +You might use the following macros to set the baseline of the next +output text at a given distance from the top or the bottom of the page. +We subtract one line height (@code{\n[.v]}) because the @code{|} +operator moves to one vee below the page top (recall @ref{Numeric +Expressions}). @Example .de y-from-top-down @@ -7482,124 +8893,88 @@ of the page: @endExample @noindent -A call to @samp{.y-from-bot-up 10c} means that the bottom of the next -line will be at 10@tie{}cm from the paper edge at the bottom. - -If a vertical trap is sprung during execution of @code{sp}, the amount -of vertical space after the trap is discarded. For example, this - -@Example -.de xxx -.. -. -.wh 0 xxx -. -.pl 5v -foo -.sp 2 -bar -.sp 50 -baz -@endExample - -@noindent -results in - -@Example -foo - - -bar - -baz -@endExample - -@cindex @code{sp} request, and traps -@cindex discarded space in traps -@cindex space, discarded, in traps -@cindex traps, and discarded space -The amount of discarded space is available in the number register -@code{.trunc}. - -To protect @code{sp} against vertical traps, use the @code{vpt} request: - -@Example -.vpt 0 -.sp -3 -.vpt 1 -@endExample +A call to @samp{.y-from-bot-up 10c} means that the next text baseline +will be 10@tie{}cm from the bottom edge of the paper. @endDefreq -@DefreqList {ls, [@Var{nnn}]} +@DefreqList {ls, [@Var{count}]} @DefregListEndx {.L} @cindex double-spacing (@code{ls}) -Output @w{@var{nnn}@minus{}1} blank lines after each line of text. With -no argument, @code{gtroff} uses the previous value before the last -@code{ls} call. - -@Example -.ls 2 \" This causes double-spaced output -.ls 3 \" This causes triple-spaced output -.ls \" Again double-spaced -@endExample - -The line spacing is associated with the current environment -(@pxref{Environments}). +Set the line spacing; add @w{@var{count}@minus{}1} blank lines after each +line of text. With no argument, GNU @code{troff} uses the previous +value before the last @code{ls} call. The default is @code{1}. + +@c This example is fairly obvious, doesn't realistically reflect the +@c fact that formatted text would occur between each of these requests, +@c and doesn't fit well on the (PDF) page as of this writing. +@c @Example +@c .ls 2 \" begin double-spaced output +@c .ls 3 \" begin triple-spaced output +@c .ls \" return to double-spaced output +@c @endExample @cindex line spacing register (@code{.L}) -The read-only number register @code{.L} contains the current line -spacing setting. +The read-only register @code{.L} contains the current line spacing; it +is associated with the environment (@pxref{Environments}). @endDefreq -@xref{Changing Type Sizes}, for the requests @code{vs} and @code{pvs} as -alternatives to @code{ls}. +The @code{ls} request is a coarse mechanism. @xref{Changing the Type +Size}, for the requests @code{vs} and @code{pvs} as alternatives to +@code{ls}. -@DefescList {\\x, ', spacing, '} +@DefescList {\\x, @code{'}, spacing, @code{'}} @DefregListEndx {.a} -Sometimes, extra vertical spacing is only needed occasionally, e.g.@: to -allow space for a tall construct (like an equation). The @code{\x} -escape does this. The escape is given a numerical argument, usually -enclosed in quotes (like @samp{\x'3p'}); the default scaling indicator -is @samp{v}. If this number is positive extra vertical space is -inserted below the current line. A negative number adds space above. -If this escape is used multiple times on the same line, the maximum of -the values is used. - -@xref{Escapes}, for details on parameter delimiting characters. +Sometimes, an output line requires additional vertical spacing, for +instance to allow room for a tall construct like an inline equation with +exponents or subscripts (particularly if they are iterated). The +@code{\x} escape sequence takes a delimited measurement (like +@samp{\x'3p'}) to increase the vertical spacing of the pending output +line. The default scaling unit is @samp{v}. If the measurement is +positive, extra vertical space is inserted below the current line; a +negative measurement adds space above. If @code{\x} is applied to the +pending output line multiple times, the maxima of the positive and +negative adjustments are separately applied. The delimiter need not be +a neutral apostrophe; see @ref{Delimiters}. @cindex extra post-vertical line space register (@code{.a}) -The @code{.a} read-only number register contains the most recent -(non-negative) extra vertical line space. - -Using @code{\x} can be necessary in combination with the @code{\b} -escape, as the following example shows. +The @code{.a} read-only register contains the extra vertical spacing +@emph{after} the text baseline of the most recently emitted output line. +(In other words, it is the largest positive argument to @code{\x} +encountered on that line.) This quantity is exposed via a register +because if an output line requires this ``extra post-vertical line +spacing'', and the subsequent output line requires ``extra pre-vertical +line spacing'' (a negative argument to @code{\x}), then applying both +can lead to excessive spacing between the output lines. Text that is +piling high on line @var{n} might not require (as much) extra +pre-vertical line spacing if line @var{n}@minus{}1 carries extra +post-vertical line spacing. + +Use of @code{\x} can be necessary in combination with the +bracket-building escape sequence @code{\b},@footnote{@xref{Drawing +Geometric Objects}.} as the following example shows. @Example -This is a test with the \[rs]b escape. -.br -This is a test with the \[rs]b escape. -.br -This is a test with \b'xyz'\x'-1m'\x'1m'. -.br -This is a test with the \[rs]b escape. -.br -This is a test with the \[rs]b escape. +.nf +This is a test of \[rs]b (1). +This is a test of \[rs]b (2). +This is a test of \b'xyz'\x'-1m'\x'1m' (3). +This is a test of \[rs]b (4). +This is a test of \[rs]b (5). + @result{} This is a test of \b (1). + @result{} This is a test of \b (2). + @result{} x + @result{} This is a test of y (3). + @result{} z + @result{} This is a test of \b (4). + @result{} This is a test of \b (5). @endExample +@endDefesc @noindent -produces - -@Example -This is a test with the \b escape. -This is a test with the \b escape. - x -This is a test with y. - z -This is a test with the \b escape. -This is a test with the \b escape. -@endExample -@endDefesc +Without @code{\x}, the backslashes on the lines marked @samp{(2)} and +@samp{(4)} would be overprinted. +@need 1000 @DefreqList {ns, } @DefreqItemx {rs, } @DefregListEndx {.ns} @@ -7608,53 +8983,57 @@ This is a test with the \b escape. @cindex mode, no-space (@code{ns}) @cindex blank lines, disabling @cindex lines, blank, disabling -Enable @dfn{no-space mode}. In this mode, spacing (either via @code{sp} -or via blank lines) is disabled. The @code{bp} request to advance to -the next page is also disabled, except if it is accompanied by a page -number (see @ref{Page Control}, for more information). This mode ends -when actual text is output or the @code{rs} request is encountered, which -ends no-space mode. The read-only number register @code{.ns} is set -to@tie{}1 as long as no-space mode is active. - -This request is useful for macros that conditionally insert vertical -space before the text starts (for example, a paragraph macro could -insert some space except when it is the first paragraph after a section -header). +Enable @dfn{no-space mode}. Vertical spacing, whether by @code{sp} +requests or blank input lines, is disabled. The @code{bp} request to +advance to the next page is also disabled, unless it is accompanied by a +page number (@pxref{Page Control}). No-space mode ends automatically +when text@footnote{or geometric objects; see @ref{Drawing Geometric +Objects}} is formatted for output @footnote{to the top-level diversion; +see @ref{Diversions}} or the @code{rs} request is invoked, which ends +no-space mode. The read-only register @code{.ns} interpolates a Boolean +value indicating the enablement of no-space mode. + +A paragraphing macro might ordinarily insert vertical space to separate +paragraphs. A section heading macro could invoke @code{ns} to suppress +this spacing for the first paragraph in a section. @endDefreq @c ===================================================================== -@node Tabs and Fields, Character Translations, Manipulating Spacing, gtroff Reference +@node Tabs and Fields, Character Translations, Manipulating Spacing, GNU troff Reference @section Tabs and Fields @cindex tabs, and fields @cindex fields, and tabs -@cindex @acronym{EBCDIC} encoding of a tab -A tab character (@acronym{ASCII} char@tie{}9, @acronym{EBCDIC} -char@tie{}5) causes a horizontal movement to the next tab stop (much -like it did on a typewriter). +@cindex tab character encoding +A tab character (@acronym{ISO} code point@tie{}9, @acronym{EBCDIC} +code point@tie{}5) causes a horizontal movement to the next tab stop, if +any. @Defesc {\\t, , , } @cindex tab character, non-interpreted (@code{\t}) @cindex character, tab, non-interpreted (@code{\t}) -@cindex @code{\t}, and copy-in mode -@cindex copy-in mode, and @code{\t} -@cindex mode, copy-in, and @code{\t} -This escape is a non-interpreted tab character. In copy mode -(@pxref{Copy-in Mode}), @code{\t} is the same as a real tab character. +@cindex @code{\t}, and copy mode +@cindex copy mode, and @code{\t} +@cindex mode, copy, and @code{\t} +Interpolate a tab in copy mode; see @ref{Copy Mode}. @endDefesc -@DefreqList {ta, [@Var{n1} @Var{n2} @dots{} @Var{nn} @t{T} @Var{r1} @Var{r2} @dots{} @Var{rn}]} +@DefreqList {ta, [[@Var{n1} @Var{n2} @dots{} @Var{nn} ]@t{T} @Var{r1} @ + @Var{r2} @dots{} @Var{rn}]} @DefregListEndx {.tabs} Change tab stop positions. This request takes a series of tab specifiers as arguments (optionally divided into two groups with the -letter @samp{T}) that indicate where each tab stop is to be (overriding -any previous settings). +letter @samp{T}) that indicate where each tab stop is to be, overriding +any previous settings. The default scaling unit is @samp{m}. Invoking +@code{ta} without an argument removes all tab stops. +@cindex default tab stops +@cindex tab stops, default +GNU @code{troff}'s startup value is @w{@samp{T 0.5i}}. -Tab stops can be specified absolutely, i.e., as the distance from the -left margin. For example, the following sets 6@tie{}tab stops every one -inch. +Tab stops can be specified absolutely---as distances from the left +margin. The following example sets six tab stops, one every inch. @Example .ta 1i 2i 3i 4i 5i 6i @@ -7668,77 +9047,83 @@ For example, the following is equivalent to the previous example. .ta 1i +1i +1i +1i +1i +1i @endExample -@code{gtroff} supports an extended syntax to specify repeat values after -the @samp{T} mark (these values are always taken as relative) -- this is -the usual way to specify tabs set at equal intervals. The following is, -yet again, the same as the previous examples. It does even more since -it defines an infinite number of tab stops separated by one inch. +GNU @code{troff} supports an extended syntax to specify repeating tab +stops. These stops appear after a @samp{T} argument. Their values are +always taken as distances relative to the previous tab stop. This is +the idiomatic way to specify tab stops at equal intervals in +@code{groff}. The following is, yet again, the same as the previous +examples. It does more, in fact, since it defines an infinite number of +tab stops at one-inch intervals. @Example .ta T 1i @endExample -Now we are ready to interpret the full syntax given at the beginning: -Set tabs at positions @var{n1}, @var{n2}, @dots{}, @var{nn} and then set -tabs at @var{nn}+@var{r1}, @var{nn}+@var{r2}, @dots{}, @var{nn}+@var{rn} -and then at @var{nn}+@var{rn}+@var{r1}, @var{nn}+@var{rn}+@var{r2}, -@dots{}, @var{nn}+@var{rn}+@var{rn}, and so on. +Now we are ready to interpret the full syntax given above. The +@code{ta} request sets tabs at positions @var{n1}, @var{n2}, @dots{}, +@var{nn}, then at @var{nn}+@var{r1}, @var{nn}+@var{r2}, @dots{}, +@var{nn}+@var{rn}, then at @var{nn}+@var{rn}+@var{r1}, +@var{nn}+@var{rn}+@var{r2}, @dots{}, @var{nn}+@var{rn}+@var{rn}, and so +on. -Example: @samp{4c +6c T 3c 5c 2c} is equivalent to @samp{4c 10c 13c 18c -20c 23c 28c 30c @dots{}}. +For example, @samp{4c +6c T 3c 5c 2c} is equivalent to @samp{4c 10c 13c +18c 20c 23c 28c 30c @dots{}}. -The material in each tab column (i.e., the column between two tab stops) -may be justified to the right or left or centered in the column. This -is specified by appending @samp{R}, @samp{L}, or @samp{C} to the tab -specifier. The default justification is @samp{L}. Example: +Text written to a tab column (i.e., between two tab stops, or between a +tab stop and an output line boundary) may be aligned to the right or +left, or centered in the column. This alignment is determined by +appending @samp{R}, @samp{L}, or @samp{C} to the tab specifier. The +default is @samp{L}. @Example .ta 1i 2iC 3iR @endExample -Some notes: - -@itemize @bullet -@item -The default unit of the @code{ta} request is @samp{m}. +The beginning of an output line is not a tab stop; the text that begins +an output line is placed according to the configured alignment and +indentation; see @ref{Manipulating Filling and Adjustment} and @ref{Line +Layout}. -@item A tab stop is converted into a non-breakable horizontal movement that -can be neither stretched nor squeezed. For example, +cannot be adjusted. @Example +.ll 2i .ds foo a\tb\tc -.ta T 5i +.ta T 1i \*[foo] + @error{} warning: cannot break line + @result{} a b c @endExample @noindent -creates a single line, which is a bit longer than 10@tie{}inches (a -string is used to show exactly where the tab characters are). Now -consider the following: +The above creates a single output line that is a bit longer than two +inches (we use a string to show exactly where the tab stops are). +Now consider the following. @Example -.ds bar a\tb b\tc -.ta T 5i +.ll 2i +.ds bar a\tb c\td +.ta T 1i \*[bar] + @error{} warning: cannot adjust line + @result{} a b + @result{} c d @endExample @noindent -@code{gtroff} first converts the tab stops of the line into unbreakable -horizontal movements, then splits the line after the second @samp{b} -(assuming a sufficiently short line length). Usually, this isn't what -the user wants. +GNU @code{troff} first converts the line's tab stops into unbreakable +horizontal movements, then breaks after @samp{b}. This usually isn't +what you want. -@item -Superfluous tabs (i.e., tab characters that do not correspond to a tab -stop) are ignored except the first one, which delimits the characters -belonging to the last tab stop for right-justifying or centering. -Consider the following example +Superfluous tab characters---those that do not correspond to a tab +stop---are ignored except for the first, which delimits the characters +belonging to the last tab stop for right-alignment or centering. @Example -.ds Z foo\tbar\tfoo -.ds ZZ foo\tbar\tfoobar -.ds ZZZ foo\tbar\tfoo\tbar +.ds Z foo\tbar\tbaz +.ds ZZ foo\tbar\tbazqux +.ds ZZZ foo\tbar\tbaz\tqux .ta 2i 4iR \*[Z] .br @@ -7746,62 +9131,47 @@ Consider the following example .br \*[ZZZ] .br + @result{} foo bar baz + @result{} foo bar bazqux + @result{} foo bar bazqux @endExample @noindent -which produces the following output: - -@Example -foo bar foo -foo bar foobar -foo bar foobar -@endExample - -@noindent -The first line right-justifies the second `foo' relative to the tab -stop. The second line right-justifies `foobar'. The third line finally -right-justifies only `foo' because of the additional tab character, which -marks the end of the string belonging to the last defined tab stop. - -@item -Tab stops are associated with the current environment -(@pxref{Environments}). - -@item -Calling @code{ta} without an argument removes all tab stops. +The first line right-aligns ``baz'' within the second tab stop. The +second line right-aligns ``bazqux'' within it. The third line +right-aligns only ``baz'' because of the additional tab character, which +marks the end of the text occupying the last tab stop defined. -@item -@cindex tab stops, for TTY output devices -The start-up value of @code{gtroff} is @w{@samp{T 0.5i}}. -@end itemize +Tab stops are associated with the environment (@pxref{Environments}). -@cindex tab settings register (@code{.tabs}) -The read-only number register @code{.tabs} contains a string +@cindex tab stop settings register (@code{.tabs}) +@cindex @code{.S} register, Plan@tie{}9 alias for @code{.tabs} +@cindex @code{.tabs} register, Plan@tie{}9 alias (@code{.S}) +The read-only register @code{.tabs} contains a string representation of the current tab settings suitable for use as an -argument to the @code{ta} request. +argument to the @code{ta} request.@footnote{Plan@tie{}9 @code{troff} +uses the register @code{.S} for this purpose.} @Example .ds tab-string \n[.tabs] \*[tab-string] @result{} T120u @endExample - -@cindex @code{.S} register, Plan@tie{}9 alias for @code{.tabs} -@cindex @code{.tabs} register, Plan@tie{}9 alias (@code{.S}) -The @code{troff} version of the Plan@tie{}9 operating system uses -register @code{.S} for the same purpose. @endDefreq -@Defreq {tc, [@Var{fill-glyph}]} +@Defreq {tc, [@Var{c}]} @cindex tab repetition character (@code{tc}) @cindex character, tab repetition (@code{tc}) @cindex glyph, tab repetition (@code{tc}) -Normally @code{gtroff} fills the space to the next tab stop with -whitespace. This can be changed with the @code{tc} request. With no -argument @code{gtroff} reverts to using whitespace, which is the -default. The value of this @dfn{tab repetition character} is associated -with the current environment (@pxref{Environments}).@footnote{@dfn{Tab -repetition character} is a misnomer since it is an output glyph.} +Set the tab repetition character to the ordinary or special character +@var{c}; normally, no glyph is written when moving to a tab stop (and +some output devices may output space characters to achieve this motion). +A @dfn{tab repetition character} causes the formatter to write as many +instances of @var{c} as are necessary to occupy the interval from the +horizontal drawing position to the next tab stop. With no argument, GNU +@code{troff} reverts to the default behavior. The tab repetition +character is associated with the environment (@pxref{Environments}). +Only a single character of @var{c} is recognized; any excess is ignored. @endDefreq @DefreqList {linetabs, n} @@ -7809,40 +9179,32 @@ repetition character} is a misnomer since it is an output glyph.} @cindex tab, line-tabs mode @cindex line-tabs mode @cindex mode, line-tabs -If @var{n} is missing or not zero, enable @dfn{line-tabs} mode, or -disable it otherwise (the default). In line-tabs mode, @code{gtroff} -computes tab distances relative to the (current) output line instead of -the input line. - -For example, the following code: - -@Example -.ds x a\t\c -.ds y b\t\c -.ds z c -.ta 1i 3i -\*x -\*y -\*z -@endExample - -@noindent -in normal mode, results in the output - -@Example -a b c -@endExample - -@noindent -in line-tabs mode, the same code outputs - -@Example -a b c +If @var{n} is missing or non-zero, activate @dfn{line-tabs}; deactivate +it otherwise (the default). Active line-tabs cause GNU @code{troff} +to compute tab distances relative to the start of the output line +instead of the input line. + +@Example +.de Tabs +. ds x a\t\c +. ds y b\t\c +. ds z c +. ta 1i 3i +\\*x +\\*y +\\*z +.. +.Tabs +.br +.linetabs +.Tabs + @result{} a b c + @result{} a b c @endExample -Line-tabs mode is associated with the current environment. The -read-only register @code{.linetabs} is set to@tie{}1 if in line-tabs -mode, and 0 in normal mode. +Line-tabs activation is associated with the environment +(@pxref{Environments}). The read-only register @code{.linetabs} +interpolates@tie{}1 if line-tabs are active, and 0 otherwise. @endDefreq @menu @@ -7856,60 +9218,63 @@ mode, and 0 in normal mode. @subsection Leaders @cindex leaders -Sometimes it may be desirable to use the @code{tc} request to fill a -particular tab stop with a given glyph (for example dots in a table of -contents), but also normal tab stops on the rest of the line. -For this @code{gtroff} provides an alternate tab mechanism, called -@dfn{leaders}, which does just that. +Sometimes it is desirable to fill a tab stop with a given glyph, +but also use tab stops normally on the same output line. An example is +a table of contents entry that uses dots to bridge the entry name with +its page number, which is itself aligned between tab stops. The +@code{roff} language provides @dfn{leaders} for this +purpose.@footnote{This is pronounced to rhyme with ``feeder'', and +refers to how the glyphs ``lead'' the eye across the page to the +corresponding page number or other datum.} @cindex leader character -A leader character (character code@tie{}1) behaves similarly to a tab -character: It moves to the next tab stop. The only difference is that -for this movement, the fill glyph defaults to a period character and not -to space. +A leader character (@acronym{ISO} and @acronym{EBCDIC} code +point@tie{}1, also known as @acronym{SOH} or ``start of heading''), +behaves similarly to a tab character:@: it moves to the next tab stop. +The difference is that for this movement, the default fill character is +a period @samp{.}. @Defesc {\\a, , , } @cindex leader character, non-interpreted (@code{\a}) @cindex character, leader, non-interpreted (@code{\a}) -@cindex @code{\a}, and copy-in mode -@cindex copy-in mode, and @code{\a} -@cindex mode, copy-in, and @code{\a} -This escape is a non-interpreted leader character. In copy mode -(@pxref{Copy-in Mode}), @code{\a} is the same as a real leader -character. +@cindex @code{\a}, and copy mode +@cindex copy mode, and @code{\a} +@cindex mode, copy, and @code{\a} +Interpolate a leader in copy mode; see @ref{Copy Mode}. @endDefesc -@Defreq {lc, [@Var{fill-glyph}]} +@Defreq {lc, [@Var{c}]} @cindex leader repetition character (@code{lc}) @cindex character, leader repetition (@code{lc}) @cindex glyph, leader repetition (@code{lc}) -Declare the @dfn{leader repetition character}.@footnote{@dfn{Leader -repetition character} is a misnomer since it is an output glyph.} -Without an argument, leaders act the same as tabs (i.e., using -whitespace for filling). @code{gtroff}'s start-up value is a dot -(@samp{.}). The value of the leader repetition character is associated -with the current environment (@pxref{Environments}). +Set the leader repetition character to the ordinary or special character +@var{c}. Recall @ref{Tabs and Leaders}:@: when encountering a leader +character in the input, the formatter writes as many dots @samp{.} as +are necessary until +reaching the next tab stop; this is the @dfn{leader definition +character}. Omitting @var{c} unsets the leader +character. With no argument, GNU @code{troff} treats leaders the same +as tabs. The leader repetition character is associated with the +environment (@pxref{Environments}). Only a single @var{c} is +recognized; any excess is ignored. @endDefreq @cindex table of contents @cindex contents, table of -For a table of contents, to name an example, tab stops may be defined so -that the section number is one tab stop, the title is the second with -the remaining space being filled with a line of dots, and then the page -number slightly separated from the dots. - -@Example -.ds entry 1.1\tFoo\a\t12 -.lc . -.ta 1i 5i +.25i -\*[entry] -@endExample - -@noindent -This produces +A table of contents, for example, may define tab stops after a section +number, a title, and a gap to be filled with leader dots. The page +number follows the leader, after a right-aligned final tab stop wide +enough to house the largest page number occurring in the document. @Example -1.1 Foo.......................................... 12 +.ds entry1 19.\tThe Prophet\a\t98 +.ds entry2 20.\tAll Astir\a\t101 +.ta .5i 4.5i +.5iR +.nf +\*[entry1] +\*[entry2] + @result{} 19. The Prophet............................. 98 + @result{} 20. All Astir............................... 101 @endExample @c --------------------------------------------------------------------- @@ -7929,9 +9294,9 @@ is defined as the data between a pair of @dfn{delimiting characters}. It contains substrings that are separated by @dfn{padding characters}. The width of a field is the distance on the @emph{input} line from the position where the field starts to the next tab stop. A padding -character inserts stretchable space similar to @TeX{}'s @code{\hss} +character inserts an adjustable space similar to @TeX{}'s @code{\hss} command (thus it can even be negative) to make the sum of all substring -lengths plus the stretchable space equal to the field width. If more +lengths plus the adjustable space equal to the field width. If more than one padding character is inserted, the available space is evenly distributed among them. @@ -7939,11 +9304,9 @@ distributed among them. Define a delimiting and a padding character for fields. If the latter is missing, the padding character defaults to a space character. If there is no argument at all, the field mechanism is disabled (which is -the default). Note that contrary to e.g.@: the tab repetition -character, delimiting and padding characters are @emph{not} associated -to the current environment (@pxref{Environments}). - -Example: +the default). In contrast to, e.g., the tab repetition character, +delimiting and padding characters are @emph{not} associated with the +environment (@pxref{Environments}). @Example .fc # ^ @@ -7951,227 +9314,57 @@ Example: #foo^bar^smurf# .br #foo^^bar^smurf# -@endExample - -@noindent -and here the result: - -@Example -foo bar smurf -foo bar smurf + @result{} foo bar smurf + @result{} foo bar smurf @endExample @endDefreq @c ===================================================================== -@node Character Translations, Troff and Nroff Mode, Tabs and Fields, gtroff Reference +@node Character Translations, @code{troff} and @code{nroff} Modes, Tabs and Fields, GNU troff Reference @section Character Translations @cindex character translations @cindex translations of characters -@cindex control character, changing (@code{cc}) -@cindex character, control, changing (@code{cc}) -@cindex no-break control character, changing (@code{c2}) -@cindex character, no-break control, changing (@code{c2}) -@cindex control character, no-break, changing (@code{c2}) -The control character (@samp{.}) and the no-break control character -(@samp{'}) can be changed with the @code{cc} and @code{c2} requests, -respectively. - -@Defreq {cc, [@Var{c}]} -Set the control character to@tie{}@var{c}. With no argument the default -control character @samp{.} is restored. The value of the control -character is associated with the current environment -(@pxref{Environments}). -@endDefreq - -@Defreq {c2, [@Var{c}]} -Set the no-break control character to@tie{}@var{c}. With no argument -the default control character @samp{'} is restored. The value of the -no-break control character is associated with the current environment -(@pxref{Environments}). -@endDefreq +A @dfn{translation} is a mapping of an input character to an output +glyph. The mapping occurs at output time, i.e., the input character +gets assigned the metric information of the mapped output character +right before input tokens are converted to nodes (@pxref{Gtroff +Internals}, for more on this process). -@xref{Requests}. +@DefreqList {tr, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}} +@DefreqListEndx {trin, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}} +Translate character @var{a} to glyph@tie{}@var{b}, character @var{c} to +glyph@tie{}@var{d}, and so on. If there is an odd number of characters +in the argument, the last one is translated to a fixed-width space (the +same one obtained by the @code{\@key{SP}} escape sequence). -@Defreq {eo, } -@cindex disabling @code{\} (@code{eo}) -@cindex @code{\}, disabling (@code{eo}) -Disable the escape mechanism completely. After executing this request, -the backslash character @samp{\} no longer starts an escape sequence. +The @code{trin} request is identical to @code{tr}, but when you unformat +a diversion with @code{asciify} it ignores the translation. +@xref{Diversions}, for details about the @code{asciify} request. -This request can be very helpful in writing macros since it is not -necessary then to double the escape character. Here an example: +Some notes: -@Example -.\" This is a simplified version of the -.\" .BR request from the man macro package -.eo -.de BR -. ds result \& -. while (\n[.$] >= 2) \@{\ -. as result \fB\$1\fR\$2 -. shift 2 -. \@} -. if \n[.$] .as result \fB\$1 -\*[result] -. ft R -.. -.ec -@endExample -@endDefreq - -@Defreq {ec, [@Var{c}]} -@cindex escape character, changing (@code{ec}) -@cindex character, escape, changing (@code{ec}) -Set the escape character to@tie{}@var{c}. With no argument the default -escape character @samp{\} is restored. It can be also used to re-enable -the escape mechanism after an @code{eo} request. - -Note that changing the escape character globally likely breaks macro -packages since @code{gtroff} has no mechanism to `intern' macros, i.e., -to convert a macro definition into an internal form that is independent -of its representation (@TeX{} has this mechanism). If a macro is -called, it is executed literally. -@endDefreq - -@DefreqList {ecs, } -@DefreqListEndx {ecr, } -The @code{ecs} request saves the current escape character in an internal -register. Use this request in combination with the @code{ec} request to -temporarily change the escape character. - -The @code{ecr} request restores the escape character saved with -@code{ecs}. Without a previous call to @code{ecs}, this request sets -the escape character to @code{\}. -@endDefreq - -@DefescList {\\\\, , , } -@DefescItemx {\\e, , , } -@DefescListEndx {\\E, , , } -Print the current escape character (which is the backslash character -@samp{\} by default). - -@code{\\} is a `delayed' backslash; more precisely, it is the default -escape character followed by a backslash, which no longer has special -meaning due to the leading escape character. It is @emph{not} an escape -sequence in the usual sense! In any unknown escape sequence -@code{\@var{X}} the escape character is ignored and @var{X} is printed. -But if @var{X} is equal to the current escape character, no warning is -emitted. - -@cindex @code{\E}, and copy-in mode -@cindex copy-in mode, and @code{\E} -@cindex mode, copy-in, and @code{\E} -As a consequence, only at top-level or in a diversion a backslash glyph -is printed; in copy-in mode, it expands to a single backslash, which then -combines with the following character to an escape sequence. - -The @code{\E} escape differs from @code{\e} by printing an escape -character that is not interpreted in copy mode. Use this to define -strings with escapes that work when used in copy mode (for example, as a -macro argument). The following example defines strings to begin and end -a superscript: - -@Example -.ds @{ \v'-.3m'\s'\En[.s]*60/100' -.ds @} \s0\v'.3m' -@endExample - -Another example to demonstrate the differences between the various -escape sequences, using a strange escape character, @samp{-}. - -@Example -.ec - -.de xxx ---A'foo' -.. -.xxx - @result{} -A'foo' -@endExample - -@noindent -The result is surprising for most users, expecting @samp{1} since -@samp{foo} is a valid identifier. What has happened? As mentioned -above, the leading escape character makes the following character -ordinary. Written with the default escape character the sequence -@samp{--} becomes @samp{\-} -- this is the minus sign. - -If the escape character followed by itself is a valid escape sequence, -only @code{\E} yields the expected result: - -@Example -.ec - -.de xxx --EA'foo' -.. -.xxx - @result{} 1 -@endExample -@endDefesc - -@Defesc {\\., , , } -Similar to @code{\\}, the sequence @code{\.} isn't a real escape -sequence. As before, a warning message is suppressed if the escape -character is followed by a dot, and the dot itself is printed. - -@Example -.de foo -. nop foo -. -. de bar -. nop bar -\\.. -. -.. -.foo -.bar - @result{} foo bar -@endExample - -@noindent -The first backslash is consumed while the macro is read, and the second -is swallowed while executing macro @code{foo}. -@endDefesc - -A @dfn{translation} is a mapping of an input character to an output -glyph. The mapping occurs at output time, i.e., the input character -gets assigned the metric information of the mapped output character -right before input tokens are converted to nodes (@pxref{Gtroff -Internals}, for more on this process). - -@DefreqList {tr, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}} -@DefreqListEndx {trin, @Var{a}@Var{b}@Var{c}@Var{d}@dots{}} -Translate character @var{a} to glyph@tie{}@var{b}, character @var{c} to -glyph@tie{}@var{d}, etc. If there is an odd number of arguments, the -last one is translated to an unstretchable space (@w{@samp{\ }}). - -The @code{trin} request is identical to @code{tr}, but when you unformat -a diversion with @code{asciify} it ignores the translation. -@xref{Diversions}, for details about the @code{asciify} request. - -Some notes: - -@itemize @bullet -@item -@cindex @code{\(}, and translations -@cindex @code{\[}, and translations -@cindex @code{\'}, and translations -@cindex @code{\`}, and translations -@cindex @code{\-}, and translations -@cindex @code{\_}, and translations -@cindex @code{\C}, and translations -@cindex @code{\N}, and translations -@cindex @code{char} request, and translations -@cindex special characters -@cindex character, special -@cindex numbered glyph (@code{\N}) -@cindex glyph, numbered (@code{\N}) -Special characters (@code{\(@var{xx}}, @code{\[@var{xxx}]}, -@code{\C'@var{xxx}'}, @code{\'}, @code{\`}, @code{\-}, @code{\_}), -glyphs defined with the @code{char} request, and numbered glyphs -(@code{\N'@var{xxx}'}) can be translated also. +@itemize @bullet +@item +@cindex @code{\(}, and translations +@cindex @code{\[}, and translations +@cindex @code{\'}, and translations +@cindex @code{\`}, and translations +@cindex @code{\-}, and translations +@cindex @code{\_}, and translations +@cindex @code{\C}, and translations +@cindex @code{\N}, and translations +@cindex @code{char} request, and translations +@cindex special characters +@cindex character, special +@cindex numbered glyph (@code{\N}) +@cindex glyph, numbered (@code{\N}) +Special characters (@code{\(@var{xx}}, @code{\[@var{xxx}]}, +@code{\C'@var{xxx}'}, @code{\'}, @code{\`}, @code{\-}, @code{\_}), +glyphs defined with the @code{char} request, and numbered glyphs +(@code{\N'@var{xxx}'}) can be translated also. @item @cindex @code{\e}, and translations @@ -8180,8 +9373,9 @@ The @code{\e} escape can be translated also. @item @cindex @code{\%}, and translations @cindex @code{\~}, and translations -Characters can be mapped onto the @code{\%} and @code{\~} escapes (but -@code{\%} and @code{\~} can't be mapped onto another glyph). +Characters can be mapped onto the @code{\%} and @code{\~} escape +sequences (but @code{\%} and @code{\~} can't be mapped onto another +glyph). @item @cindex backspace character, and translations @@ -8205,9 +9399,8 @@ set with the @code{shc} request. @item @cindex @code{\&}, and translations -The pair @samp{@var{c}\&} (this is an arbitrary character@tie{}@var{c} -followed by the zero width space character) maps this character to -nothing. +The pair @samp{@var{c}\&} (an arbitrary character@tie{}@var{c} followed +by the dummy character) maps this character to ``nothing''. @Example .tr a\& @@ -8216,7 +9409,7 @@ foo bar @endExample @noindent -It is even possible to map the space character to nothing: +Even the space character can be mapped to the dummy character. @Example .tr aa \& @@ -8231,7 +9424,7 @@ not possible to map the space character to any other glyph; requests like @w{@samp{.tr aa x}} undo @w{@samp{.tr aa \&}} instead. If justification is active, lines are justified in spite of the `empty' -space character (but there is no minimal distance, i.e.@: the space +space character (but there is no minimal distance, i.e., the space character, between words). @item @@ -8242,41 +9435,11 @@ affected by @code{tr}. @item Translating character to glyphs where one of them or both are undefined -is possible also; @code{tr} does not check whether the entities in its -argument do exist. +is possible also; @code{tr} does not check whether the elements of its +argument exist. @xref{Gtroff Internals}. -@item -@code{troff} no longer has a hard-coded dependency on @w{Latin-1}; all -@code{char@var{XXX}} entities have been removed from the font -description files. This has a notable consequence that shows up in -warnings like @code{can't find character with input code @var{XXX}} if -the @code{tr} request isn't handled properly. - -Consider the following translation: - -@Example -.tr éÉ -@endExample - -@noindent -This maps input character @code{é} onto glyph @code{É}, which is -identical to glyph @code{char201}. But this glyph intentionally doesn't -exist! Instead, @code{\[char201]} is treated as an input character -entity and is by default mapped onto @code{\['E]}, and @code{gtroff} -doesn't handle translations of translations. - -The right way to write the above translation is - -@Example -.tr é\['E] -@endExample - -@noindent -In other words, the first argument of @code{tr} should be an input -character or entity, and the second one a glyph entity. - @item Without an argument, the @code{tr} request is ignored. @end itemize @@ -8286,7 +9449,7 @@ Without an argument, the @code{tr} request is ignored. @cindex @code{\!}, and @code{trnt} @code{trnt} is the same as the @code{tr} request except that the translations do not apply to text that is transparently throughput into -a diversion with @code{\!}. @xref{Diversions}, for more information. +a diversion with @code{\!}. @xref{Diversions}. For example, @@ -8306,51 +9469,54 @@ instead of @code{tr} it prints @samp{a}. @c ===================================================================== -@node Troff and Nroff Mode, Line Layout, Character Translations, gtroff Reference -@section Troff and Nroff Mode -@cindex troff mode -@cindex mode, troff -@cindex nroff mode -@cindex mode, nroff - -Originally, @code{nroff} and @code{troff} were two separate programs, -the former for TTY output, the latter for everything else. With GNU -@code{troff}, both programs are merged into one executable, sending its -output to a device driver (@code{grotty} for TTY devices, @code{grops} -for @sc{PostScript}, etc.)@: which interprets the intermediate output of -@code{gtroff}. For Unix @code{troff} it makes sense to talk about -@dfn{Nroff mode} and @dfn{Troff mode} since the differences are -hardcoded. For GNU @code{troff}, this distinction is not appropriate -because @code{gtroff} simply takes the information given in the font -files for a particular device without handling requests specially if a -TTY output device is used. +@node @code{troff} and @code{nroff} Modes, Line Layout, Character Translations, GNU troff Reference +@section @code{troff} and @code{nroff} Modes +@cindex @code{troff} mode +@cindex mode, @code{troff} +@cindex @code{nroff} mode +@cindex mode, @code{nroff} + +Historically, @code{nroff} and @code{troff} were two separate programs; +the former for terminal output, the latter for typesetters. GNU +@code{troff} merges both functions into one executable@footnote{A +GNU @command{nroff} program is available for convenience; it calls GNU +@code{troff} to perform the formatting.} that sends its output to a +device driver (@code{grotty} for terminal devices, @code{grops} for +PostScript, and so on) which interprets this intermediate output format. +When discussing @acronym{AT&T} @code{troff}, it makes sense to talk +about @dfn{@code{nroff} mode} and @dfn{@code{troff} mode} since the +differences are hard-coded. GNU @code{troff} takes information from +device and font description files without handling requests specially if +a terminal output device is used, so such a strong distinction is +unnecessary. Usually, a macro package can be used with all output devices. Nevertheless, it is sometimes necessary to make a distinction between -TTY and non-TTY devices: @code{gtroff} provides two built-in conditions -@samp{n} and @samp{t} for the @code{if}, @code{ie}, and @code{while} -requests to decide whether @code{gtroff} shall behave like @code{nroff} -or like @code{troff}. +terminal and non-terminal devices: GNU @code{troff} provides two +built-in conditions @samp{n} and @samp{t} for the @code{if}, @code{ie}, +and @code{while} requests to decide whether GNU @code{troff} shall +behave like @code{nroff} or like @code{troff}. @Defreq {troff, } @pindex troffrc @pindex troffrc-end Make the @samp{t} built-in condition true (and the @samp{n} built-in condition false) for @code{if}, @code{ie}, and @code{while} conditional -requests. This is the default if @code{gtroff} (@emph{not} +requests. This is the default if GNU @code{troff} (@emph{not} @code{groff}) is started with the @option{-R} switch to avoid loading of -the start-up files @file{troffrc} and @file{troffrc-end}. Without -@option{-R}, @code{gtroff} stays in troff mode if the output device is -not a TTY (e.g.@: `ps'). +the startup files @file{troffrc} and @file{troffrc-end}. Without +@option{-R}, GNU @code{troff} stays in @code{troff} mode if the output +device is not a terminal (e.g., `ps'). @endDefreq @Defreq {nroff, } @pindex tty.tmac Make the @samp{n} built-in condition true (and the @samp{t} built-in condition false) for @code{if}, @code{ie}, and @code{while} conditional -requests. This is the default if @code{gtroff} uses a TTY output -device; the code for switching to nroff mode is in the file -@file{tty.tmac}, which is loaded by the start-up file @code{troffrc}. +requests. This is the default if GNU @code{troff} uses a terminal +output device; the code for switching to @code{nroff} mode is in the +file @file{tty.tmac}, which is loaded by the startup file +@code{troffrc}. @endDefreq @xref{Conditionals and Loops}, for more details on built-in conditions. @@ -8358,7 +9524,7 @@ device; the code for switching to nroff mode is in the file @c ===================================================================== -@node Line Layout, Line Control, Troff and Nroff Mode, gtroff Reference +@node Line Layout, Line Continuation, @code{troff} and @code{nroff} Modes, GNU troff Reference @section Line Layout @cindex line layout @cindex layout, line @@ -8388,69 +9554,72 @@ These dimensions are: @cindex margin, left (@code{po}) @cindex page offset (@code{po}) @cindex offset, page (@code{po}) -@dfn{Page offset} -- this is the leftmost position of text on the final +@dfn{Page offset}---this is the leftmost position of text on the final output, defining the @dfn{left margin}. @item in @cindex indentation (@code{in}) @cindex line indentation (@code{in}) -@dfn{Indentation} -- this is the distance from the left margin where +@dfn{Indentation}---this is the distance from the left margin where text is printed. @item ll @cindex line length (@code{ll}) @cindex length of line (@code{ll}) -@dfn{Line length} -- this is the distance from the left margin to right +@dfn{Line length}---this is the distance from the left margin to right margin. @end ftable +@cindex margin, right +@cindex right margin +The right margin is not explicitly configured; the combination of page +offset and line length provides the information necessary to derive it. + A simple demonstration: @Example .ll 3i This is text without indentation. -The line length has been set to 3\~inch. +The line length has been set to 3\~inches. .in +.5i .ll -.5i Now the left and right margins are both increased. .in .ll -Calling .in and .ll without parameters restore +Calling .in and .ll without parameters restores the previous values. @endExample -Result: - @Example -This is text without indenta- -tion. The line length has -been set to 3 inch. - Now the left and - right margins are - both increased. -Calling .in and .ll without -parameters restore the previ- -ous values. + @result{} This is text without indenta- + @result{} tion. The line length has + @result{} been set to 3 inches. + @result{} Now the left and + @result{} right margins are + @result{} both increased. + @result{} Calling .in and .ll without + @result{} parameters restores the previ- + @result{} ous values. @endExample @DefreqList {po, [@Var{offset}]} @DefreqItem {po, @t{+}@Var{offset}} @DefreqItem {po, @t{-}@Var{offset}} @DefregListEndx {.o} -@pindex troffrc -Set horizontal page offset to @var{offset} (or increment or decrement -the current value by @var{offset}). Note that this request does not -cause a break, so changing the page offset in the middle of text being -filled may not yield the expected result. The initial value is -1@dmn{i}. For TTY output devices, it is set to 0 in the startup file -@file{troffrc}; the default scaling indicator is @samp{m} (and not -@samp{v} as incorrectly documented in the original Unix troff manual). - -The current page offset can be found in the read-only number register -@samp{.o}. - -If @code{po} is called without an argument, the page offset is reset to -the previous value before the last call to @code{po}. +@pindex tty.tmac +Set page offset to @var{offset} (or increment or decrement its current +value by @var{offset}). If invoked without an argument, the page offset +is restored to the value before the previous @code{po} request. +This request does not cause a break; the page offset in effect when an +output line is broken prevails (@pxref{Manipulating Filling and +Adjustment}). The initial value is 1@dmn{i} and the default scaling +unit is @samp{m}. On terminal devices, the page offset is set to zero +by a driver-specific macro file, @file{tty.tmac}. The current page +offset can be found in the read-only register @samp{.o}. +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{po} request +This request is incorrectly documented in the @acronym{AT&T} +@code{troff} manual as using a default scaling unit of @samp{v}. @Example .po 3i @@ -8475,13 +9644,10 @@ is no indentation. If @code{in} is called without an argument, the indentation is reset to the previous value before the last call to @code{in}. The default -scaling indicator is @samp{m}. - -The indentation is associated with the current environment -(@pxref{Environments}). +scaling unit is @samp{m}. If a negative indentation value is specified (which is not allowed), -@code{gtroff} emits a warning of type @samp{range} and sets the +@code{gtroff} emits a warning in category @samp{range} and sets the indentation to zero. The effect of @code{in} is delayed until a partially collected line (if @@ -8489,7 +9655,8 @@ it exists) is output. A temporary indentation value is reset to zero also. The current indentation (as set by @code{in}) can be found in the -read-only number register @samp{.i}. +read-only register @samp{.i}. The indentation is associated with the +environment (@pxref{Environments}). @endDefreq @DefreqList {ti, offset} @@ -8500,12 +9667,12 @@ Temporarily indent the next output line by @var{offset}. If an increment or decrement value is specified, adjust the temporary indentation relative to the value set by the @code{in} request. -This request causes a break; its value is associated with the current -environment (@pxref{Environments}). The default scaling indicator is +This request causes a break; its value is associated with the +environment (@pxref{Environments}). The default scaling unit is @samp{m}. A call of @code{ti} without an argument is ignored. If the total indentation value is negative (which is not allowed), -@code{gtroff} emits a warning of type @samp{range} and sets the +@code{gtroff} emits a warning in category @samp{range} and sets the temporary indentation to zero. `Total indentation' is either @var{offset} if specified as an absolute value, or the temporary plus normal indentation, if @var{offset} is given as a relative value. @@ -8513,8 +9680,8 @@ normal indentation, if @var{offset} is given as a relative value. The effect of @code{ti} is delayed until a partially collected line (if it exists) is output. -The read-only number register @code{.in} is the indentation that applies -to the current output line. +The read-only register @code{.in} is the indentation that applies to the +current output line. The difference between @code{.i} and @code{.in} is that the latter takes into account whether a partially collected line still uses the old @@ -8529,21 +9696,19 @@ indentation value or a temporary indentation value is active. Set the line length to @var{length} (or increment or decrement the current value by @var{length}). Initially, the line length is set to 6.5@dmn{i}. The effect of @code{ll} is delayed until a partially -collected line (if it exists) is output. The default scaling indicator -is @samp{m}. +collected line (if it exists) is output. The default scaling unit is +@samp{m}. If @code{ll} is called without an argument, the line length is reset to the previous value before the last call to @code{ll}. If a negative line length is specified (which is not allowed), @code{gtroff} emits a -warning of type @samp{range} and sets the line length to zero. - -The line length is associated with the current environment -(@pxref{Environments}). +warning in category @samp{range} and sets the line length to zero. The +line length is associated with the environment (@pxref{Environments}). @cindex line length register (@code{.l}) The current line length (as set by @code{ll}) can be found in the -read-only number register @samp{.l}. The read-only number register -@code{.ll} is the line length that applies to the current output line. +read-only register @samp{.l}. The read-only register @code{.ll} is the +line length that applies to the current output line. Similar to @code{.i} and @code{.in}, the difference between @code{.l} and @code{.ll} is that the latter takes into account whether a partially @@ -8553,92 +9718,90 @@ collected line still uses the old line length value. @c ===================================================================== -@node Line Control, Page Layout, Line Layout, gtroff Reference -@section Line Control +@node Line Continuation, Page Layout, Line Layout, GNU troff Reference +@section Line Continuation @cindex line control @cindex control, line -It is important to understand how @code{gtroff} handles input and output -lines. - -Many escapes use positioning relative to the input line. For example, -this - -@Example -This is a \h'|1.2i'test. - -This is a -\h'|1.2i'test. -@endExample - -@noindent -produces - -@Example -This is a test. - -This is a test. +When filling is enabled, input and output line breaks generally do not +correspond. The @code{roff} language therefore distinguishes input and +output line continuation. + +@Defesc {\\@key{RET}, , ,} +@cindex input line continuation (@code{\@key{RET}}) +@cindex line, input, continuation (@code{\@key{RET}}) +@cindex continuation, input line (@code{\@key{RET}}) +@c We use the following notation in our man pages; Texinfo is bound to +@c the GNU Emacs dialect. +@esindex \@slanted{newline} +@code{\@key{RET}} (a backslash immediately followed by a newline) +suppresses the effects of that newline in the input. The next input +line thus retains the classification of its predecessor as a control or +text line. @code{\@key{RET}} is useful for managing line lengths in the +input during document maintenance; you can break an input line in the +middle of a request invocation, macro call, or escape sequence. Input +line continuation is invisible to the formatter, with two exceptions: +the @code{|} operator recognizes the new input line +(@pxref{Numeric Expressions}), and the input line counter register +@code{.c} is incremented. + +@c Wrap example at 56 columns (on the _output_). We use 50n in the +@c groff input to avoid line adjustment. +@Example +.ll 50n +.de I +. ft I +. nop \\$* +. ft +.. +Our film class watched +.I The Effect of Gamma Rays on Man-in-the-Moon +Marigolds. \" whoops, the input line wrapped +.br +.I My own opus begins on line \n[.c] \ +and ends on line \n[.c]. @endExample - -The main usage of this feature is to define macros that act exactly at -the place where called. - @Example -.\" A simple macro to underline a word -.de underline -. nop \\$1\l'|0\[ul]' -.. + @result{} Our film class watched @i{The Effect of Gamma Rays on} + @result{} @i{Man-in-the-Moon} Marigolds. + @result{} @i{My own opus begins on line 11 and ends on line 12.} @endExample +@endDefesc -@noindent -In the above example, @samp{|0} specifies a negative distance from the -current position (at the end of the just emitted argument @code{\$1}) -back to the beginning of the input line. Thus, the @samp{\l} escape -draws a line from right to left. - -@cindex input line continuation (@code{\}) -@cindex line, input, continuation (@code{\}) -@cindex continuation, input line (@code{\}) +@DefescList {\\c, , ,} +@DefregListEndx {.int} @cindex output line, continuation (@code{\c}) @cindex line, output, continuation (@code{\c}) @cindex continuation, output line (@code{\c}) @cindex interrupted line @cindex line, interrupted -@code{gtroff} makes a difference between input and output line -continuation; the latter is also called @dfn{interrupting} a line. +@cindex @code{\R}, after @code{\c} +@code{\c} continues an output line. Nothing after it on the input line +is formatted. In contrast to @code{\@key{RET}}, a line after @code{\c} +remains a new input line, so a control character is recognized at its +beginning. The visual results depend on whether filling is enabled; see +@ref{Manipulating Filling and Adjustment}. -@DefescList {\\@key{RET}, , ,} -@DefescItemx {\\c, , ,} -@DefregListEndx {.int} -Continue a line. @code{\@key{RET}} (this is a backslash at the end of a -line immediately followed by a newline) works on the input level, -suppressing the effects of the following newline in the input. +@itemize @bullet +@item +@cindex @code{\c}, when filling enabled +@cindex fill mode, and @code{\c} +@cindex mode, fill, and @code{\c} +If filling is enabled, a word interrupted with @code{\c} is continued +with the text on the next input text line, without an intervening space. @Example -This is a \ -.test - @result{} This is a .test +This is a te\c +st. + @result{} This is a test. @endExample -The @samp{|} operator is also affected. - -@cindex @code{\R}, after @code{\c} -@code{\c} works on the output level. Anything after this escape on the -same line is ignored except @code{\R}, which works as usual. Anything -before @code{\c} on the same line is appended to the current partial -output line. The next non-command line after an interrupted line counts -as a new input line. - -The visual results depend on whether no-fill mode is active. - -@itemize @bullet @item -@cindex @code{\c}, and no-fill mode +@cindex @code{\c}, when filling disabled @cindex no-fill mode, and @code{\c} @cindex mode, no-fill, and @code{\c} -If no-fill mode is active (using the @code{nf} request), the next input -text line after @code{\c} is handled as a continuation of the same input -text line. +If filling is disabled, the next input text line after @code{\c} is +handled as a continuation of the same input text line. @Example .nf @@ -8646,318 +9809,390 @@ This is a \c test. @result{} This is a test. @endExample - -@item -@cindex @code{\c}, and fill mode -@cindex fill mode, and @code{\c} -@cindex mode, fill, and @code{\c} -If fill mode is active (using the @code{fi} request), a word interrupted -with @code{\c} is continued with the text on the next input text line, -without an intervening space. - -@Example -This is a te\c -st. - @result{} This is a test. -@endExample @end itemize -Note that an intervening control line that causes a break is stronger -than @code{\c}, flushing out the current partial line in the usual way. +An intervening control line that causes a break overrides @code{\c}, +flushing out the pending output line in the usual way. @cindex interrupted line register (@code{.int}) +@cindex continued output line register (@code{.int}) The @code{.int} register contains a positive value if the last output -line was interrupted with @code{\c}; this is associated with the current -environment (@pxref{Environments}). +line was continued with @code{\c}; this datum is associated with the +environment (@pxref{Environments}).@footnote{Historically, the @code{\c} +escape sequence has proven challenging to characterize. Some sources +say it ``connects the next input text'' (to the input line on which it +appears); others describe it as ``interrupting'' text, on the grounds +that a text line is interrupted without breaking, perhaps to inject a +request invocation or macro call.} @endDefesc @c ===================================================================== -@node Page Layout, Page Control, Line Control, gtroff Reference +@node Page Layout, Page Control, Line Continuation, GNU troff Reference @section Page Layout @cindex page layout @cindex layout, page -@code{gtroff} provides some very primitive operations for controlling -page layout. +The formatter permits configuration of the page length and page number. @DefreqList {pl, [@Var{length}]} @DefreqItem {pl, @t{+}@Var{length}} @DefreqItem {pl, @t{-}@Var{length}} @DefregListEndx {.p} -@cindex page length (@code{pl}) -@cindex length of page (@code{pl}) -Set the @dfn{page length} to @var{length} (or increment or decrement the -current value by @var{length}). This is the length of the physical -output page. The default scaling indicator is @samp{v}. +@cindex page length, configuring (@code{pl}) +@cindex length of the page, configuring (@code{pl}) +@cindex configuring the page length (@code{pl}) +@cindex setting the page length (@code{pl}) +Change (increase or decrease) the page length per the numeric expression +@var{length}. The default scaling unit is @samp{v}. A negative +@var{length} is valid, but an uncommon application:@: it prevents page +location traps from being sprung,@footnote{@xref{Traps}.} and each +output line is placed on a new page. If @var{length} is invalid, GNU +@code{troff} emits a warning in category @samp{number}. If @var{length} +is absent or invalid, @samp{11i} is assumed. @cindex page length register (@code{.p}) -The current setting can be found in the read-only number register -@samp{.p}. - -@cindex top margin -@cindex margin, top -@cindex bottom margin -@cindex margin, bottom -Note that this only specifies the size of the page, not the top and -bottom margins. Those are not set by @code{gtroff} directly. -@xref{Traps}, for further information on how to do this. - -Negative @code{pl} values are possible also, but not very useful: No -trap is sprung, and each line is output on a single page (thus -suppressing all vertical spacing). +The read-only register @samp{.p} interpolates the current page length. +@endDefreq -If no argument or an invalid argument is given, @code{pl} sets the page -length to 11@dmn{i}. +@DefreqList {pn, num} +@DefreqItem {pn, @t{+}@Var{num}} +@DefreqItem {pn, @t{-}@Var{num}} +@DefregListEndx {.pn} +@cindex page number, configuring next (@code{pn}) +@cindex next page number, configuring (@code{pn}) +@cindex number, page, next, configuring (@code{pn}) +Change (increase or decrease) the page number of the @emph{next} page +per the numeric expression @var{num}. If @var{num} is invalid, GNU +@code{troff} emits a warning in category @samp{number} and ignores the +request. Without an argument, @code{pn} is ignored. + +@cindex next page number register (@code{.pn}) +@cindex page number, next, register (@code{.pn}) +The read-only register @code{.pn} interpolates @var{num} if set by +@code{pn} on the current page, or the current page number plus@tie{}1. @endDefreq @cindex headers @cindex footers @cindex titles -@code{gtroff} provides several operations that help in setting up top -and bottom titles (or headers and footers). +The formatter offers special support for typesetting headers and +footers, collectively termed @dfn{titles}. Titles have an independent +line length, and their placement on the page is not restricted. -@Defreq {tl, @t{'}@Var{left}@t{'}@Var{center}@t{'}@Var{right}@t{'}} -@cindex title line (@code{tl}) +@Defreq {tl, @code{'}@Var{left}@code{'}@Var{center}@code{'}@Var{right}@code{'}} +@cindex title line, formatting (@code{tl}) +@cindex formatting a title line (@code{tl}) @cindex three-part title (@code{tl}) @cindex page number character (@code{%}) -Print a @dfn{title line}. It consists of three parts: a left justified -portion, a centered portion, and a right justified portion. The -argument separator @samp{'} can be replaced with any character not -occurring in the title line. The @samp{%} character is replaced with -the current page number. This character can be changed with the -@code{pc} request (see below). - -Without argument, @code{tl} is ignored. - -Some notes: - -@itemize @bullet -@item -The line length set by the @code{ll} request is not honoured by -@code{tl}; use the @code{lt} request (described below) instead, to -control line length for text set by @code{tl}. - -@item -A title line is not restricted to the top or bottom of a page. - -@item -@code{tl} prints the title line immediately, ignoring a partially filled -line (which stays untouched). - -@item -It is not an error to omit closing delimiters. For example, -@w{@samp{.tl /foo}} is equivalent to @w{@samp{.tl /foo///}}: It prints a -title line with the left justified word @samp{foo}; the centered and -right justified parts are empty. - -@item -@code{tl} accepts the same parameter delimiting characters as the -@code{\A} escape; see @ref{Escapes}. -@end itemize +Format an output line as a title consisting of @var{left}, @var{center}, +and @var{right}, each aligned accordingly. The delimiter need not be a +neutral apostrophe: @code{tl} accepts the same delimiters as most escape +sequences; see @ref{Delimiters}. If not used as the delimiter, any +@dfn{page number character} character is replaced with the current page +number; the default is @samp{%}; see the the @code{pc} request below. +Without an argument, @code{tl} is ignored. @code{tl} writes the title +line immediately, ignoring any partially collected line. + +It is not an error to omit delimiters after the first. For example, +@w{@samp{.tl /Thesis}} is interpreted as @w{@samp{.tl /Thesis///}}:@: it +sets a title line comprising only the left-aligned word @samp{Thesis}. @endDefreq @DefreqList {lt, [@Var{length}]} @DefreqItem {lt, @t{+}@Var{length}} @DefreqItem {lt, @t{-}@Var{length}} @DefregListEndx {.lt} -@cindex length of title line (@code{lt}) -@cindex title line, length (@code{lt}) -@cindex title line length register (@code{.lt}) -The title line is printed using its own line length, which is specified -(or incremented or decremented) with the @code{lt} request. Initially, -the title line length is set to 6.5@dmn{i}. If a negative line length -is specified (which is not allowed), @code{gtroff} emits a warning of -type @samp{range} and sets the title line length to zero. The default -scaling indicator is @samp{m}. If @code{lt} is called without an -argument, the title length is reset to the previous value before the -last call to @code{lt}. - -The current setting of this is available in the @code{.lt} read-only -number register; it is associated with the current environment +@cindex length of title line, configuring (@code{lt}) +@cindex title length, configuring (@code{lt}) +Change (increase or decrease) the line length used by titles per the +numeric expression @var{length}. The default scaling unit is @samp{m}. +If @var{length} is negative, GNU emits a warning in category +@samp{range} and treats @var{length} as @samp{0}. If @var{length} is +invalid, GNU @code{troff} emits a warning in category @samp{number} and +ignores the request. The formatter's default title length is +@samp{6.5i}. With no argument, the title length is restored to the +previous value. The title length is is associated with the environment (@pxref{Environments}). -@endDefreq -@DefreqList {pn, page} -@DefreqItem {pn, @t{+}@Var{page}} -@DefreqItem {pn, @t{-}@Var{page}} -@DefregListEndx {.pn} -@cindex page number (@code{pn}) -@cindex number, page (@code{pn}) -Change (increase or decrease) the page number of the @emph{next} page. -The only argument is the page number; the request is ignored without a -parameter. - -The read-only number register @code{.pn} contains the number of the next -page: either the value set by a @code{pn} request, or the number of the -current page plus@tie{}1. +@cindex title line length register (@code{.lt}) +The read-only register @samp{.lt} interpolates the title line length. @endDefreq @Defreq {pc, [@Var{char}]} @cindex changing the page number character (@code{pc}) @cindex page number character, changing (@code{pc}) @vindex % -Change the page number character (used by the @code{tl} request) to a -different character. With no argument, this mechanism is disabled. -Note that this doesn't affect the number register@tie{}@code{%}. +Set the page number character to @var{char}. With no argument, the page +number character is disabled. @code{pc} does not affect the +register@tie{}@code{%}. @endDefreq -@xref{Traps}. +The following example exercises title features. + +@Example +.lt 50n +This is my partially collected +.tl 'Isomers 2023'%'Dextrose Edition' +line. + @result{} Isomers 2023 1 Dextrose Edition + @result{} This is my partially collected line. +@endExample +We most often see titles used in page header and footer traps. +@xref{Traps}. @c ===================================================================== -@node Page Control, Fonts and Symbols, Page Layout, gtroff Reference +@node Page Control, Using Fonts, Page Layout, GNU troff Reference @section Page Control @cindex page control @cindex control, page -@DefreqList {bp, [@Var{page}]} -@DefreqItem {bp, @t{+}@Var{page}} -@DefreqItem {bp, @t{-}@Var{page}} +@cindex page break +@cindex break, page +@cindex page ejection +@cindex ejection, page +Discretionary page breaks can prevent the unwanted separation of +content. A new page number takes effect during page ejection; see +@ref{The Implicit Page Trap}. + +@DefreqList {bp, [@Var{page-number}]} +@DefreqItem {bp, @t{+}@Var{page-number}} +@DefreqItem {bp, @t{-}@Var{page-number}} @DefregListEndx {%} @cindex new page (@code{bp}) @cindex page, new (@code{bp}) -Stop processing the current page and move to the next page. This -request causes a break. It can also take an argument to set (increase, -decrease) the page number of the next page (which actually becomes the -current page after @code{bp} has finished). The difference between -@code{bp} and @code{pn} is that @code{pn} does not cause a break or -actually eject a page. @xref{Page Layout}. - -@Example -.de newpage \" define macro -'bp \" begin page -'sp .5i \" vertical space -.tl 'left top'center top'right top' \" title -'sp .3i \" vertical space -.. \" end macro -@endExample - +Break the page and change (increase or decrease) the next page number +per the numeric expression @var{page-number}. If @var{page-number} is +invalid, GNU @code{troff} emits a warning in category @samp{number} and +ignores the argument. This request causes a break. A page break +advances the vertical drawing position to the bottom of the page, +springing traps. @xref{Page Location Traps}. @cindex @code{bp} request, and top-level diversion @cindex top-level diversion, and @code{bp} @cindex diversion, top-level, and @code{bp} -@code{bp} has no effect if not called within the top-level diversion -(@pxref{Diversions}). +@code{bp} has effect only if invoked within the top-level +diversion.@footnote{@xref{Diversions}.} +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{bp} request +This request is incorrectly documented in the @acronym{AT&T} +@code{troff} manual as having a default scaling unit of @samp{v}. @cindex page number register (@code{%}) @cindex current page number (@code{%}) -The read-write register@tie{}@code{%} holds the current page number. +The register @code{%} interpolates the current page number. -The number register @code{.pe} is set to@tie{}1 while @code{bp} is -active. @xref{Page Location Traps}. +@Example +.de BP +' bp \" schedule page break once current line is output +.. +@endExample @endDefreq @Defreq {ne, [@Var{space}]} @cindex orphan lines, preventing with @code{ne} @cindex conditional page break (@code{ne}) @cindex page break, conditional (@code{ne}) -It is often necessary to force a certain amount of space before a new -page occurs. This is most useful to make sure that there is not a -single @dfn{orphan} line left at the bottom of a page. The @code{ne} -request ensures that there is a certain distance, specified by the first -argument, before the next page is triggered (see @ref{Traps}, for -further information). The default scaling indicator for @code{ne} is -@samp{v}; the default value of @var{space} is@tie{}1@dmn{v} if no -argument is given. - -For example, to make sure that no fewer than 2@tie{}lines get orphaned, -do the following before each paragraph: - -@Example -.ne 2 -text text text -@endExample - -@code{ne} then automatically causes a page break if there is space for -one line only. +Force a page break if insufficient vertical space is available (assert +``needed'' space). @code{ne} tests the distance to the next page +location trap; see @ref{Page Location Traps}, and breaks the page if +that amount is less than @var{space}. The default scaling unit is +@samp{v}. If @var{space} is invalid, GNU @code{troff} emits a warning +in category @samp{number} and ignores the argument. If @var{space} is +not specified, @samp{1v} is assumed. + +@cindex widow +We can require space for at least the first two output lines of a +paragraph, preventing its first line from being @slanted{widowed} at the +page bottom. + +@Example +.ne 2v +Considering how common illness is, +how tremendous the spiritual change that it brings, +how astonishing, +when the lights of health go down, +the undiscovered countries that are then disclosed, +what wastes and deserts of the soul a slight attack +of influenza brings to view, +@c -- Virgina Woolf, "On Being Ill", 1926 +@endExample + +@c XXX: Some of this might be better placed in a revised Chapter 3. +This method is reliable only if no output line is pending when @code{ne} +is invoked. When macro packages are used, this is often not the case:@: +their paragraphing macros perform the break. You may need to experiment +with placing the @code{ne} after the paragraphing macro, or @code{br} +and @code{ne} before it. + +@cindex orphan +@cindex widow +@code{ne} is also useful to force grouping of section headings with +their subsequent paragraphs, or tables with their captions and/or +explanations. Macro packages often use @code{ne} with diversions to +implement keeps and displays; see @ref{Diversions}. They may also offer +parameters for widow and orphan management. @endDefreq @DefreqList {sv, [@Var{space}]} @DefreqListEndx {os, } @cindex @code{ne} request, comparison with @code{sv} -@code{sv} is similar to the @code{ne} request; it reserves the specified -amount of vertical space. If the desired amount of space exists before -the next trap (or the bottom page boundary if no trap is set), the space -is output immediately (ignoring a partially filled line, which stays -untouched). If there is not enough space, it is stored for later output -via the @code{os} request. The default value is@tie{}1@dmn{v} if no -argument is given; the default scaling indicator is @samp{v}. - +Require vertical space as @code{ne} does, but also @slanted{save} it for +later output by the @code{os} request. If @var{space} is available +before the next page location trap, it is output immediately. Both +requests ignore a partially collected line, taking effect at the next +break. @cindex @code{sv} request, and no-space mode @cindex @code{os} request, and no-space mode -Both @code{sv} and @code{os} ignore no-space mode. While the @code{sv} -request allows negative values for @var{space}, @code{os} ignores them. +@code{sv} and @code{os} ignore no-space mode (recall @ref{Manipulating +Spacing}). While the @code{sv} request allows negative values for +@var{space}, @code{os} ignores them. The default scaling unit is +@samp{v}. If @var{space} is not specified, @samp{1v} is assumed. @endDefreq @Defreg {nl} -@cindex current vertical position (@code{nl}) -@cindex vertical position, current (@code{nl}) -@cindex position, vertical, current (@code{nl}) -This register contains the current vertical position. If the vertical -position is zero and the top of page transition hasn't happened yet, -@code{nl} is set to negative value. @code{gtroff} itself does this at -the very beginning of a document before anything has been printed, but -the main usage is to plant a header trap on a page if this page has -already started. - -Consider the following: - -@Example -.de xxx +@cindex vertical drawing position (@code{nl}) +@cindex vertical position, drawing (@code{nl}) +@cindex drawing position, vertical (@code{nl}) +@c TODO: We should talk somewhere prior to this point about how the +@c formatter doesn't start a page until it has to. +@code{nl} interpolates or sets the vertical drawing position. When the +formatter starts, the first page transition hasn't happened yet, and +@code{nl} is negative. If a header trap has been planted on the page +(typically at vertical position @code{0}), you can assign a negative +value to @code{nl} to spring it if that page has already started +(@pxref{Page Location Traps}). + +@Example +.de HD . sp -. tl ''Header'' +. tl ''Goldbach Solution'' . sp .. . First page. .bp -.wh 0 xxx +.wh 0 HD \" plant header trap at top of page .nr nl (-1) Second page. + @result{} First page. + @result{} + @result{} @r{@i{(blank lines elided)}} + @result{} + @result{} Goldbach Solution + @result{} + @result{} @r{@i{(blank lines elided)}} + @result{} + @result{} Second page. @endExample @noindent -Result: - -@Example -First page. - -... - - Header - -Second page. - -... -@endExample - -@noindent -Without resetting @code{nl} to a negative value, the just planted trap +Without resetting @code{nl} to a negative value, the trap just planted would be active beginning with the @emph{next} page, not the current one. -@xref{Diversions}, for a comparison with the @code{.h} and @code{.d} -registers. +@xref{Diversions}, for a comparison of @code{nl} with the @code{.h} and +@code{.d} registers. @endDefreg @c ===================================================================== -@node Fonts and Symbols, Sizes, Page Control, gtroff Reference -@section Fonts and Symbols -@cindex fonts - -@code{gtroff} can switch fonts at any point in the text. - -The basic set of fonts is @samp{R}, @samp{I}, @samp{B}, and @samp{BI}. -These are Times Roman, Italic, Bold, and Bold Italic. For non-TTY -devices, there is also at least one symbol font that contains various -special symbols (Greek, mathematics). +@c BEGIN Keep (roughly) parallel with section "Using fonts" of groff(7). +@node Using Fonts, Manipulating Type Size and Vertical Spacing, Page Control, GNU troff Reference +@section Using Fonts +@cindex font + +@cindex typeface +@cindex font family +@cindex font style +@cindex style, font +@cindex family, font +@cindex text font +@cindex special font +@cindex unstyled font +@cindex font, text +@cindex font, special +@cindex font, unstyled +In digital typography, a @dfn{font} is a collection of characters in a +specific typeface that a device can render as glyphs at a desired +size.@footnote{Terminals and some output devices have fonts that render +at only one or two sizes. As examples of the latter, take the +@code{groff} @code{lj4} device's Lineprinter, and @code{lbp}'s Courier +and Elite faces.} A @code{roff} formatter can change typefaces at any +point in the text. The basic faces are a set of @dfn{styles} combining +upright and slanted shapes with normal and heavy stroke weights: +@samp{R}, @samp{I}, @samp{B}, and @samp{BI}---these stand for +@slanted{roman}, @slanted{italic}, @slanted{bold}, and +@slanted{bold-italic}. For linguistic text, GNU @code{troff} groups +typefaces into @dfn{families} containing each of these +styles.@footnote{Font designers prepare families such that the styles +share esthetic properties.} A @dfn{text font} is thus often a family +combined with a style, but it need not be:@: consider the @code{ps} and +@code{pdf} devices' @code{ZCMI} (Zapf Chancery Medium italic)---often, +no other style of Zapf Chancery Medium is provided. On typesetting +devices, at least one @dfn{special font} is available, comprising +@dfn{unstyled} glyphs for mathematical operators and other purposes. + +@cindex font description file +@cindex description file, font +@cindex file, font description +@cindex font metrics +@cindex metrics, font +@cindex mounting position +@cindex mounting position +@cindex position, mounting +Like @acronym{AT&T} @code{troff}, GNU @code{troff} does not itself load +or manipulate a digital font file;@footnote{Historically, the fonts +@code{troff}s dealt with were not Free Software or, as with the Graphic +Systems C/A/T, did not even exist in the digital domain.} instead it +works with a @dfn{font description file} that characterizes it, +including its glyph repertoire and the @dfn{metrics} (dimensions) of +each glyph.@footnote{@xref{Font Description File Format}.} This +information permits the formatter to accurately place glyphs with +respect to each other. Before using a font description, the formatter +associates it with a @dfn{mounting position}, a place in an ordered list +of available typefaces. +@cindex abstract font style +@cindex font style, abstract +@cindex style, font, abstract +So that a document need not be strongly coupled to a specific font +family, in GNU @code{troff} an output device can associate a style in +the abstract sense with a mounting position. Thus the default family +can be combined with a style dynamically, producing a @dfn{resolved font +name}. + +Fonts often have trademarked names, and even Free Software fonts can +require renaming upon modification. @code{groff} maintains a +convention that a device's serif font family is given the name @samp{T} +(``Times''), its sans-serif family @samp{H} (``Helvetica''), and its +monospaced family @samp{C} (``Courier''). Historical inertia has driven +@code{groff}'s font identifiers to short uppercase abbreviations of font +names, as with @samp{TR}, @samp{TI}, @samp{TB}, @samp{TBI}, and a +special font @samp{S}. + +The default family used with abstract styles can be changed at any time; +initially, it is @samp{T}. Typically, abstract styles are arranged in +the first four mounting positions in the order shown above. The default +mounting position, and therefore style, is always @samp{1} (@samp{R}). +By issuing appropriate formatter instructions, you can override these +defaults before your document writes its first glyph. + +@cindex graphic renditions +@cindex renditions, graphic +@cindex character cell attributes +@cindex attributes, character cell +@cindex cell, character, attributes +Terminal output devices cannot change font families and lack special +fonts. They support style changes by overstriking, or by altering +ISO@tie{}6429/ECMA-48 @dfn{graphic renditions} (character cell +attributes). +@c END Keep (roughly) parallel with section "Using fonts" of groff(7). @menu -* Changing Fonts:: +* Selecting Fonts:: * Font Families:: * Font Positions:: * Using Symbols:: @@ -8965,19 +10200,25 @@ special symbols (Greek, mathematics). * Special Fonts:: * Artificial Fonts:: * Ligatures and Kerning:: +* Italic Corrections:: +* Dummy Characters:: @end menu @c --------------------------------------------------------------------- -@node Changing Fonts, Font Families, Fonts and Symbols, Fonts and Symbols -@subsection Changing Fonts -@cindex fonts +@node Selecting Fonts, Font Families, Using Fonts, Using Fonts +@subsection Selecting Fonts +@cindex font, selection + +We use @dfn{font} to refer to any of several means of identifying a +font: by mounting position (@samp{3}), by abstract style (@samp{B}), or +by its identifier (@samp{TB}). @DefreqList {ft, [@Var{font}]} @DefescItemx {\\f, , f, } -@DefescItem {\\f, @Lparen{}, fn, } -@DefescItem {\\f, @Lbrack{}, font, @Rbrack{}} -@DefregListEndx {.sty} +@DefescItem {\\f, (, fn, } +@DefescItem {\\f, [, font, ]} +@DefregListEndx {.fn} @cindex changing fonts (@code{ft}, @code{\f}) @cindex fonts, changing (@code{ft}, @code{\f}) @cindex @code{sty} request, and changing fonts @@ -8986,55 +10227,70 @@ special symbols (Greek, mathematics). @kindex styles @kindex family @pindex DESC -The @code{ft} request and the @code{\f} escape change the current font -to @var{font} (one-character name@tie{}@var{f}, two-character name -@var{fn}). - -If @var{font} is a style name (as set with the @code{sty} request or -with the @code{styles} command in the @file{DESC} file), use it within -the current font family (as set with the @code{fam} request, the -@code{\F} escape, or the @code{family} command in the @file{DESC} file). - -It is not possible to switch to a font with the name @samp{DESC} -(whereas this name could be used as a style name; however, this is not -recommended). - -@cindex previous font (@code{ft}, @code{\f[]}, @code{\fP}) -@cindex font, previous (@code{ft}, @code{\f[]}, @code{\fP}) -With no argument or using @samp{P} as an argument, @code{.ft} switches -to the previous font. Use @code{\f[]} to do this with the escape. The -old syntax forms @code{\fP} or @code{\f[P]} are also supported. +@cindex selecting the previous font (@code{ft}) +@cindex previous font, selecting (@code{ft}) +@cindex font, previous, slecting (@code{ft}) +The @code{ft} request selects the typeface @var{font}. If the argument +is absent or @samp{P}, it selects the previously chosen font. If +@var{font} is a non-negative integer, it is interpreted as mounting +position; the font mounted there is selected. If that position refers +to an abstract style, it is combined with the default family (see +@code{fam} and @code{\F} below) to make a resolved font name. If the +mounting position is not a style and no font is mounted there, GNU +@code{troff} emits a warning in category @samp{font} and ignores the +request. -Fonts are generally specified as upper-case strings, which are usually -1@tie{}to 4 characters representing an abbreviation or acronym of the -font name. This is no limitation, just a convention. +If @var{font} matches a style name, it is combined with the current +family to make a resolved font name. Otherwise, @var{font} is assumed +to already be a resolved font name. + +@cindex automatic font mounting +@cindex font mounting, automatic +@cindex mounting, font, automatic +The resolved font name is subject to translation (see request @code{ftr} +below). Next, the (possibly translated) font name's mounting position +is looked up; if not mounted, @var{font} is sought on the file system as +a font description file and, if located, automatically mounted at the +next available position (see register @code{.fp} below). If the font +was mounted using an identifier different from its font description file +name (see request @code{fp} below), that file name is then looked up. +If a font description file for the resolved font name is not found, GNU +@code{troff} emits a warning in category @samp{font} and ignores the +request. -The example below produces two identical lines. +The @code{\f} escape sequence is similar, using one-character name (or +mounting position) @var{f}, two-character name @var{fn}, or a name +@var{font} of arbitrary length. +@cindex previous font, selecting (@code{\f[]}, @code{\fP}) +@cindex font, previous, selecting (@code{\f[]}, @code{\fP}) +@samp{\f[]} selects the previous font. The syntax form @samp{\fP} is +supported for backward compatibility, and @samp{\f[P]} for consistency. @Example eggs, bacon, -.ft B -spam +.ft I +spam, .ft and sausage. - -eggs, bacon, \fBspam\fP and sausage. +.br +eggs, bacon, \fIspam,\fP and sausage. + @result{} eggs, bacon, @slanted{spam,} and sausage + @result{} eggs, bacon, @slanted{spam,} and sausage @endExample -Note that @code{\f} doesn't produce an input token in @code{gtroff}. As -a consequence, it can be used in requests like @code{mc} (which expects -a single character as an argument) to change the font on the fly: +The current and previously selected fonts are properties of the +environment (@pxref{Environments}). + +The read-only string-valued register @code{.fn} contains the resolved +font name of the selected font. + +@code{\f} doesn't produce an input token in GNU @code{troff}; it thus +can be used in requests that expect a single-character argument. We can +assign a font to a margin character as follows (@pxref{Miscellaneous}). @Example .mc \f[I]x\f[] @endExample - -The current style name is available in the read-only number register -@samp{.sty} (this is a string-valued register); if the current font -isn't a style, the empty string is returned. It is associated with the -current environment. - -@xref{Font Positions}, for an alternative syntax. @endDefreq @Defreq {ftr, f [@Var{g}]} @@ -9059,14 +10315,16 @@ named@tie{}@var{f} is referred to in a @code{\f} escape sequence, in the @code{fspecial}, @code{fp}, or @code{sty} requests, font@tie{}@var{g} is used. If @var{g} is missing or equal to@tie{}@var{f} the translation is undone. +@c XXX: Do font translations work on mounting positions? Abstract +@c styles? -Note that it is not possible to chain font translations. Example: +Font translations cannot be chained. @Example .ftr XXX TR .ftr XXX YYY .ft XXX - @result{} warning: can't find font `XXX' + @error{} warning: can't find font 'XXX' @endExample @endDefreq @@ -9094,286 +10352,248 @@ Palatino and \f[CR]Courier\f[] @endExample A missing or zero value of @var{zoom} is the same as a value of 1000, -which means no magnification. @var{f}@tie{}must be a real font name, -not a style. +which means no magnification. @var{f}@tie{}must be a resolved font +name, not an abstract style. +@c XXX: What about a mounting position? It's not rejected... -Note that the magnification of a font is completely transparent to -troff; a change of the zoom factor doesn't cause any effect except that -the dimensions of glyphs, (word) spaces, kerns, etc., of the affected -font are adjusted accordingly. +The magnification of a font is completely transparent to GNU +@code{troff}; a change of the zoom factor doesn't cause any effect +except that the dimensions of glyphs, (word) spaces, kerns, etc., of the +affected font are adjusted accordingly. -The zoom factor of the current font is available in the read-only number +The zoom factor of the current font is available in the read-only register @samp{.zoom}, in multiples of 1/1000th. It returns zero if there is no magnification. @endDefreq @c --------------------------------------------------------------------- -@node Font Families, Font Positions, Changing Fonts, Fonts and Symbols +@node Font Families, Font Positions, Selecting Fonts, Using Fonts @subsection Font Families @cindex font families @cindex families, font @cindex font styles @cindex styles, font -Due to the variety of fonts available, @code{gtroff} has added the -concept of @dfn{font families} and @dfn{font styles}. The fonts are -specified as the concatenation of the font family and style. Specifying -a font without the family part causes @code{gtroff} to use that style of -the current family. +To accommodate the wide variety of fonts available, GNU @code{troff} +distinguishes @dfn{font families} and @dfn{font styles}. A resolved +font name is the catenation of a font family and a style. Selecting an +abstract style causes GNU @code{troff} to combine it with the default +font family. -@cindex PostScript fonts -@cindex fonts, PostScript -Currently, fonts for the devices @option{-Tps}, @option{-Tpdf}, -@option{-Tdvi}, @option{-Tlj4}, @option{-Tlbp}, and the X11 fonts are -set up to this mechanism. By default, @code{gtroff} uses the Times -family with the four styles @samp{R}, @samp{I}, @samp{B}, and @samp{BI}. +You can thus compose a document using abstract styles exclusively for +its body or running text, selecting a specific family only for titles or +examples, for instance, and change the default family on the command +line (recall @ref{Groff Options}). -This way, it is possible to use the basic four fonts and to select a -different font family on the command line (@pxref{Groff Options}). +Fonts for the devices @code{ps}, @code{pdf}, @code{dvi}, @code{lj4}, +@code{lbp}, and the X11 devices support this mechanism. By default, +GNU @code{troff} uses the Times family with the four styles @samp{R}, +@samp{I}, @samp{B}, and @samp{BI}. @DefreqList {fam, [@Var{family}]} @DefregItemx {.fam} @DefescItemx {\\F, , f, } -@DefescItem {\\F, @Lparen{}, fm, } -@DefescItem {\\F, @Lbrack{}, family, @Rbrack{}} -@DefregListEndx {.fn} +@DefescItem {\\F, (, fm, } +@DefescListEnd {\\F, [, family, ]} @cindex changing font family (@code{fam}, @code{\F}) @cindex font family, changing (@code{fam}, @code{\F}) -Switch font family to @var{family} (one-character name@tie{}@var{f}, -two-character name @var{fm}). If no argument is given, switch back to -the previous font family. Use @code{\F[]} to do this with the escape. -Note that @code{\FP} doesn't work; it selects font family @samp{P} -instead. - -The value at start-up is @samp{T}. The current font family is available -in the read-only number register @samp{.fam} (this is a string-valued -register); it is associated with the current environment. - -@Example +Set the default font family, used in combination with abstract styles to +construct a resolved font name, to @var{family} (one-character +name@tie{}@var{f}, two-character name @var{fm}). If no argument is +given, GNU @code{troff} selects the previous font family; if there none, +is it falls back to the device's default@footnote{@xref{DESC File +Format}.} or its own (@samp{T}). + +The @code{\F} escape sequence works similarly. In disanalogy to +@code{\f}, @samp{\FP} makes @samp{P} the default family. Use +@samp{\F[]} to select the previous default family. The default font +family is available in the read-only string-valued register @code{.fam}; +it is associated with the environment (@pxref{Environments}). + +@Example +spam, \" startup defaults are T (Times) R (roman) +.fam H \" make Helvetica the default family +spam, \" family H + style R = HR +.ft B \" family H + style B = HB +spam, +.ft CR \" Courier roman (default family not changed) spam, -.fam H \" helvetica family -spam, \" used font is family H + style R = HR -.ft B \" family H + style B = font HB +.ft \" back to Helvetica bold spam, -.fam T \" times family -spam, \" used font is family T + style B = TB +.fam T \" make Times the default family +spam, \" family T + style B = TB .ft AR \" font AR (not a style) baked beans, -.ft R \" family T + style R = font TR +.ft R \" family T + style R = TR and spam. @endExample -Note that @code{\F} doesn't produce an input token in @code{gtroff}. As -a consequence, it can be used in requests like @code{mc} (which expects -a single character as an argument) to change the font family on the fly: +@code{\F} doesn't produce an input token in GNU @code{troff}. As a +consequence, it can be used in requests like @code{mc} (which expects +a single character as an argument) to change the font family on the fly. @Example .mc \F[P]x\F[] @endExample - -The @samp{.fn} register contains the current @dfn{real font name} of the -current font. This is a string-valued register. If the current font is -a style, the value of @code{\n[.fn]} is the proper concatenation of -family and style name. @endDefreq -@Defreq {sty, n style} -@cindex changing font style (@code{sty}) -@cindex font style, changing (@code{sty}) +@need 1000 +@DefreqList {sty, n style} +@DefregListEndx {.sty} +@cindex setting up an abstract font style (@code{sty}) +@cindex abstract font style, setting up (@code{sty}) +@cindex font style, abstract, setting up (@code{sty}) +@cindex style, font, abstract, setting up (@code{sty}) @cindex @code{cs} request, and font styles @cindex @code{bd} request, and font styles @cindex @code{tkf} request, and font styles @cindex @code{uf} request, and font styles @cindex @code{fspecial} request, and font styles -Associate @var{style} with font position@tie{}@var{n}. A font position -can be associated either with a font or with a style. The current font -is the index of a font position and so is also either a font or a style. -If it is a style, the font that is actually used is the font which name -is the concatenation of the name of the current family and the name of -the current style. For example, if the current font is@tie{}1 and font -position@tie{}1 is associated with style @samp{R} and the current font -family is @samp{T}, then font @samp{TR} is used. If the current font is -not a style, then the current family is ignored. If the requests -@code{cs}, @code{bd}, @code{tkf}, @code{uf}, or @code{fspecial} are -applied to a style, they are instead applied to the member of the -current family corresponding to that style. - -@var{n}@tie{}must be a non-negative integer value. +Associate an abstract style @var{style} with mounting +position@tie{}@var{n}, which must be a non-negative integer. If the +requests @code{cs}, @code{bd}, @code{tkf}, @code{uf}, or @code{fspecial} +are applied to an abstract style, they are instead applied to the member +of the current family corresponding to that style. @pindex DESC @kindex styles The default family can be set with the @option{-f} option (@pxref{Groff Options}). The @code{styles} command in the @file{DESC} file controls -which font positions (if any) are initially associated with styles -rather than fonts. For example, the default setting for @sc{PostScript} -fonts +which font positions (if any) are initially associated with abstract +styles rather than fonts. -@Example -styles R I B BI -@endExample - -@noindent -is equivalent to +@strong{Caution:@:} The @var{style} argument is not validated. +@c XXX: This would be a really good thing to fix. +Errors may occur later, when the formatter attempts to construct a +resolved font name, or format a character for output. @Example -.sty 1 R -.sty 2 I -.sty 3 B -.sty 4 BI -@endExample - -@code{fam} and @code{\F} always check whether the current font position -is valid; this can give surprising results if the current font position -is associated with a style. - -In the following example, we want to access the @sc{PostScript} font -@code{FooBar} from the font family @code{Foo}: - -@Example -.sty \n[.fp] Bar -.fam Foo - @result{} warning: can't find font `FooR' -@endExample - -@noindent -The default font position at start-up is@tie{}1; for the @sc{PostScript} -device, this is associated with style @samp{R}, so @code{gtroff} tries -to open @code{FooR}. - -A solution to this problem is to use a dummy font like the following: - -@Example -.fp 0 dummy TR \" set up dummy font at position 0 -.sty \n[.fp] Bar \" register style `Bar' -.ft 0 \" switch to font at position 0 -.fam Foo \" activate family `Foo' -.ft Bar \" switch to font `FooBar' -@endExample - -@xref{Font Positions}. -@endDefreq +.nr BarPos \n[.fp] +.sty \n[.fp] Bar +.fam Foo +.ft \n[BarPos] +.tm .f=\n[.f] +A + @error{} error: no font family named 'Foo' exists + @error{} .f=41 + @error{} error: cannot format glyph: no current font +@endExample + +When an abstract style has been selected, the read-only string-valued +register @samp{.sty} interpolates its name; this datum is associated +with the environment (@pxref{Environments}). Otherwise, @samp{.sty} +interpolates nothing. +@endDefreq @c --------------------------------------------------------------------- -@node Font Positions, Using Symbols, Font Families, Fonts and Symbols +@node Font Positions, Using Symbols, Font Families, Using Fonts @subsection Font Positions @cindex font positions @cindex positions, font -For the sake of old phototypesetters and compatibility with old versions -of @code{troff}, @code{gtroff} has the concept of font @dfn{positions}, -on which various fonts are mounted. - -@DefreqList {fp, pos font [@Var{external-name}]} +To support typeface indirection through abstract styles, and for +compatibility with @acronym{AT&T} @code{troff}, the formatter maintains +a list of font @dfn{positions} at which fonts required by a document are +@dfn{mounted}. An output device's description file @file{DESC} +typically configures a set of pre-mounted fonts; see @ref{Device and +Font Description Files}. A font need not be explicitly mounted before +it is selected; GNU @code{troff} will search @env{GROFF_FONT_PATH} for +it by name and mount it at the first free mounting position on demand. + +@need 500 +@DefreqList {fp, pos id [@Var{font-description-file-name}]} @DefregItemx {.f} @DefregListEndx {.fp} -@cindex mounting font (@code{fp}) +@cindex mounting a font (@code{fp}) @cindex font, mounting (@code{fp}) -Mount font @var{font} at position @var{pos} (which must be a -non-negative integer). This numeric position can then be referred to -with font changing commands. When @code{gtroff} starts it is using font -position@tie{}1 (which must exist; position@tie{}0 is unused usually at -start-up). +Mount a font under the name @var{id} at mounting position @var{pos}, a +non-negative integer. When the formatter starts up, it reads the output +device's description to mount an initial set of faces, and selects font +position@tie{}1. Position@tie{}0 is unused by default. Unless the +@var{font-description-file-name} argument is given, @var{id} should be +the name of a font description file stored in a directory corresponding +to the selected output device. GNU @code{troff} does not traverse +directories to locate the font description file. + +@c The third argument was a late revision to device-independent troff. +@c It wasn't in the "Unix 4.0" version of CSTR #54 (January 1981), which +@c featured Kernighan's device-independent rewrite, but appeared by the +@c time of its 1992 revision. +@cindex font aliasing with third argument to @code{fp} request +@cindex aliasing fonts with third argument to @code{fp} request +The optional third argument enables font names to be aliased, which can +be necessary in compatibility mode since AT&T @code{troff} syntax +affords no means of identifying fonts with names longer than two +characters, like @samp{TBI} or @samp{ZCMI}, in a font selection escape +sequence. @xref{Compatibility Mode}. You can also alias fonts on +mounting for convenience or abstraction. (See below regarding the +@code{.fp} register.) + +@Example +.fp \n[.fp] SC ZCMI +Send a \f(SChand-written\fP thank-you note. +.fp \n[.fp] Emph TI +.fp \n[.fp] Strong TB +Are \f[Emph]these names\f[] \f[Strong]comfortable\f[]? +@endExample + +@samp{DESC}, @samp{P}, and non-negative integers are not usable as font +identifiers. +@c XXX: TODO: Catch the DESC case earlier and throw an error for it. +@c XXX: This identifier could be used as a style name, but no one's +@c exercised this freedom in 30+ years, and we should consider +@c prohibiting it. --GBR @cindex font position register (@code{.f}) -The current font in use, as a font position, is available in the -read-only number register @samp{.f}. This can be useful to remember the -current font for later recall. It is associated with the current -environment (@pxref{Environments}). +The position of the currently selected font (or abstract style) is +available in the read-only register @samp{.f}. It is associated with +the environment (@pxref{Environments}). + +You can copy the value of @code{.f} to another register to save it for +later use. @Example -.nr save-font \n[.f] -.ft B -... text text text ... -.ft \n[save-font] +.nr saved-font \n[.f] +@r{@dots{} @i{text involving many font changes} @dots{}} +.ft \n[saved-font] @endExample @cindex next free font position register (@code{.fp}) -The number of the next free font position is available in the read-only -number register @samp{.fp}. This is useful when mounting a new font, -like so: - -@Example -.fp \n[.fp] NEATOFONT -@endExample - -@pindex DESC@r{, and font mounting} -Fonts not listed in the @file{DESC} file are automatically mounted on -the next available font position when they are referenced. If a font is -to be mounted explicitly with the @code{fp} request on an unused font -position, it should be mounted on the first unused font position, which -can be found in the @code{.fp} register. Although @code{gtroff} does -not enforce this strictly, it is not allowed to mount a font at a -position whose number is much greater (approx.@: 1000 positions) than -that of any currently used position. - -The @code{fp} request has an optional third argument. This argument -gives the external name of the font, which is used for finding the font -description file. The second argument gives the internal name of the -font, which is used to refer to the font in @code{gtroff} after it has -been mounted. If there is no third argument then the internal name is -used as the external name. This feature makes it possible to use fonts -with long names in compatibility mode. -@endDefreq - -Both the @code{ft} request and the @code{\f} escape have alternative -syntax forms to access font positions. - -@DefreqList {ft, nnn} -@DefescItemx {\\f, , n, } -@DefescItem {\\f, @Lparen{}, nn, } -@DefescListEnd {\\f, @Lbrack{}, nnn, @Rbrack{}} -@cindex changing font position (@code{\f}) -@cindex font position, changing (@code{\f}) -@cindex @code{sty} request, and font positions -@cindex @code{fam} request, and font positions -@cindex @code{\F}, and font positions -@kindex styles -@kindex family -@pindex DESC -Change the current font position to @var{nnn} (one-digit -position@tie{}@var{n}, two-digit position @var{nn}), which must be a -non-negative integer. - -If @var{nnn} is associated with a style (as set with the @code{sty} -request or with the @code{styles} command in the @file{DESC} file), use -it within the current font family (as set with the @code{fam} request, -the @code{\F} escape, or the @code{family} command in the -@file{DESC} file). - -@Example -this is font 1 -.ft 2 -this is font 2 -.ft \" switch back to font 1 -.ft 3 -this is font 3 -.ft -this is font 1 again -@endExample - -@xref{Changing Fonts}, for the standard syntax form. +The index of the next (non-zero) free font position is available in the +read-only register @samp{.fp}. +@cindex @file{DESC} file, and font mounting +Fonts not listed in the @file{DESC} file are automatically mounted at +position @samp{\n[.fp]} when selected with the @code{ft} request or +@code{\f} escape sequence. When mounting a font at a position +explicitly with the @code{fp} request, this same practice should be +followed, although GNU @code{troff} does not enforce this strictly. @endDefreq @c --------------------------------------------------------------------- -@node Using Symbols, Character Classes, Font Positions, Fonts and Symbols +@node Using Symbols, Character Classes, Font Positions, Using Fonts @subsection Using Symbols @cindex using symbols @cindex symbols, using @cindex glyph @cindex character +@cindex glyph, distinguished from character +@cindex character, distinguished from glyph @cindex ligature A @dfn{glyph} is a graphical representation of a @dfn{character}. While -a character is an abstract entity containing semantic information, a -glyph is something that can be actually seen on screen or paper. It is -possible that a character has multiple glyph representation forms (for -example, the character `A' can be either written in a roman or an italic -font, yielding two different glyphs); sometimes more than one character -maps to a single glyph (this is a @dfn{ligature} -- the most common is -`fi'). +a character is an abstraction of semantic information, a glyph is +something that can be seen on screen or paper. A character has many +possible representation forms (for example, the character `A' can be +written in an upright or slanted typeface, producing distinct +glyphs). Sometimes, a sequence of characters map to a single glyph:@: +this is a @dfn{ligature}---the most common is `fi'. + +Space characters never become glyphs in GNU @code{troff}. If not +discarded (as when trailing on text lines), they are represented by +horizontal motions in the output. @cindex symbol @cindex special fonts @@ -9384,13 +10604,13 @@ maps to a single glyph (this is a @dfn{ligature} -- the most common is A @dfn{symbol} is simply a named glyph. Within @code{gtroff}, all glyph names of a particular font are defined in its font file. If the user requests a glyph not available in this font, @code{gtroff} looks up an -ordered list of @dfn{special fonts}. By default, the @sc{PostScript} -output device supports the two special fonts @samp{SS} (slanted symbols) -and @samp{S} (symbols) (the former is looked up before the latter). -Other output devices use different names for special fonts. Fonts -mounted with the @code{fonts} keyword in the @file{DESC} file are -globally available. To install additional special fonts locally (i.e.@: -for a particular font), use the @code{fspecial} request. +ordered list of @dfn{special fonts}. By default, the PostScript output +device supports the two special fonts @samp{SS} (slanted symbols) and +@samp{S} (symbols) (the former is looked up before the latter). Other +output devices use different names for special fonts. Fonts mounted +with the @code{fonts} keyword in the @file{DESC} file are globally +available. To install additional special fonts locally (i.e., for a +particular font), use the @code{fspecial} request. Here are the exact rules how @code{gtroff} searches a given symbol: @@ -9423,8 +10643,8 @@ If the symbol has been defined with the @code{schar} request, use it. @item As a last resort, consult all fonts loaded up to now for special fonts -and check them, starting with the lowest font number. Note that this -can sometimes lead to surprising results since the @code{fonts} line in +and check them, starting with the lowest font number. This can +sometimes lead to surprising results since the @code{fonts} line in the @file{DESC} file often contains empty positions, which are filled later on. For example, consider the following: @@ -9458,24 +10678,28 @@ increasing font positions. Consequently, it finds @code{BAZ} before @code{FOO} even for @code{XXX}, which is not the intended behaviour. @end itemize -@xref{Font Files}, and @ref{Special Fonts}, for more details. +@xref{Device and Font Description Files}, and @ref{Special Fonts}, for +more details. -@cindex list of available glyphs (@cite{groff_char(7)} man page) -@cindex available glyphs, list (@cite{groff_char(7)} man page) -@cindex glyphs, available, list (@cite{groff_char(7)} man page) -The list of available symbols is device dependent; see the -@cite{groff_char(7)} man page for a complete list of all glyphs. For -example, say +@cindex list of special characters (@cite{groff_char@r{(7)}} man page) +@cindex special characters, list of (@cite{groff_char@r{(7)}} man page) +@cindex characters, special, list of (@cite{groff_char@r{(7)}} man page) +@cindex available glyphs, list of (@cite{groff_char@r{(7)}} man page) +@cindex glyphs, available, list of (@cite{groff_char@r{(7)}} man page) +The @cite{groff_char@r{(7)}} man page houses a complete list of +predefined special character names, but the availability of any as a +glyph is device- and font-dependent. For example, say @Example man -Tdvi groff_char > groff_char.dvi @endExample @noindent -for a list using the default DVI fonts (not all versions of the -@code{man} program support the @option{-T} option). If you want to use -an additional macro package to change the used fonts, @code{groff} must -be called directly: +to obtain those available with the DVI device and default font +configuration.@footnote{Not all versions of the @code{man} program +support the @option{-T} option; use the subsequent example for an +alternative.} If you want to use an additional macro package to change +the fonts used, @code{groff} (or @code{gtroff}) must be run directly. @Example groff -Tdvi -mec -man groff_char.7 > groff_char.dvi @@ -9483,15 +10707,15 @@ groff -Tdvi -mec -man groff_char.7 > groff_char.dvi @cindex composite glyph names @cindex glyph names, composite -@cindex groff glyph list (GGL) -@cindex GGL (groff glyph list) -@cindex adobe glyph list (AGL) -@cindex AGL (adobe glyph list) -Glyph names not listed in groff_char(7) are derived algorithmically, -using a simplified version of the Adobe Glyph List (AGL) algorithm, which -is described in @uref{https://github.com@//adobe-type-tools@//agl-aglfn}. -The (frozen) set of glyph names that can't be derived algorithmically -is called @dfn{groff glyph list (GGL)}. +@cindex @code{groff} glyph list (GGL) +@cindex GGL (@code{groff} glyph list) +@cindex Adobe Glyph List (AGL) +Special character names not listed in @cite{groff_char@r{(7)}} are +derived algorithmically, using a simplified version of the Adobe Glyph +List (AGL) algorithm, which is described in +@uref{https://github.com@//adobe-type-tools@//agl-aglfn}. The (frozen) +set of names that can't be derived algorithmically is called the +@dfn{@code{groff} glyph list (GGL)}. @itemize @bullet @item @@ -9504,7 +10728,7 @@ least four @code{X} digits; if necessary, add leading zeroes (after the @samp{u}). No zero padding is allowed for character codes greater than 0xFFFF. Surrogates (i.e., Unicode values greater than 0xFFFF represented with character codes from the surrogate area U+D800-U+DFFF) -are not allowed too. +are not allowed either. @item A glyph representing more than a single input character is named @@ -9517,50 +10741,55 @@ A glyph representing more than a single input character is named Example: @code{u0045_0302_0301}. For simplicity, all Unicode characters that are composites must be -decomposed maximally (this is normalization form@tie{}D in the Unicode -standard); for example, @code{u00CA_0301} is not a valid glyph name -since U+00CA (@sc{latin capital letter e with circumflex}) can be -further decomposed into U+0045 (@sc{latin capital letter e}) and U+0302 -(@sc{combining circumflex accent}). @code{u0045_0302_0301} is thus the -glyph name for U+1EBE, @sc{latin capital letter e with circumflex and -acute}. +maximally decomposed to NFD;@footnote{This is ``Normalization Form D'' +as documented in Unicode Standard Annex #15 +(@uref{https://unicode.org@//reports@//tr15/}).} for example, +@code{u00CA_0301} is not a valid glyph name since U+00CA (@sc{latin +capital letter e with circumflex}) can be further decomposed into U+0045 +(@sc{latin capital letter e}) and U+0302 (@sc{combining circumflex +accent}). @code{u0045_0302_0301} is thus the glyph name for U+1EBE, +@sc{latin capital letter e with circumflex and acute}. @item groff maintains a table to decompose all algorithmically derived glyph names that are composites itself. For example, @code{u0100} (@sc{latin letter a with macron}) is automatically decomposed into @code{u0041_0304}. Additionally, a glyph name of the GGL is preferred -to an algorithmically derived glyph name; groff also automatically does -the mapping. Example: The glyph @code{u0045_0302} is mapped to -@code{^E}. +to an algorithmically derived glyph name; @code{groff} also +automatically does the mapping. Example: The glyph @code{u0045_0302} is +mapped to @code{^E}. @item glyph names of the GGL can't be used in composite glyph names; for example, @code{^E_u0301} is invalid. @end itemize -@DefescList {\\, @Lparen{}, nm, } -@DefescItem {\\, @Lbrack{}, name, @Rbrack{}} -@DefescListEnd {\\, @Lbrack{}, component1 component2 @dots{}, @Rbrack{}} -Insert a symbol @var{name} (two-character name @var{nm}) or a composite -glyph with component glyphs @var{component1}, @var{component2}, -@enddots{} There is no special syntax for one-character names -- the -natural form @samp{\@var{n}} would collide with escapes.@footnote{Note -that a one-character symbol is not the same as an input character, i.e., -the character @code{a} is not the same as @code{\[a]}. By default, -@code{groff} defines only a single one-character symbol, @code{\[-]}; it -is usually accessed as @code{\-}. On the other hand, @code{gtroff} has -the special feature that @code{\[char@var{XXX}]} is the same as the -input character with character code @var{XXX}. For example, -@code{\[char97]} is identical to the letter @code{a} if @acronym{ASCII} -encoding is active.} - -If @var{name} is undefined, a warning of type @samp{char} is generated, -and the escape is ignored. @xref{Debugging}, for information about -warnings. - -groff resolves @code{\[...]} with more than a single component as -follows: +@DefescList {\\, (, nm, } +@DefescItem {\\, [, name, ]} +@DefescListEnd {\\, [, base-glyph combining-component @dots{}, ]} +@esindex \( +@esindex \[ +Typeset a special character @var{name} (two-character name @var{nm}) or +a composite glyph consisting of @var{base-glyph} overlaid with one or +more @var{combining-component}s. For example, @samp{\[A ho]} is a +capital letter ``A'' with a ``hook accent'' (ogonek). + +There is no special syntax for one-character names---the analogous form +@samp{\@var{n}} would collide with other escape sequences. However, the +four escape sequences @code{\'}, @code{\-}, @code{\_}, and @code{\`}, +are translated on input to the special character escape sequences +@code{\[aa]}, @code{\[-]}, @code{\[ul]}, and @code{\[ga]}, respectively. + +A special character name of length one is not the same thing as an +ordinary character: that is, the character @code{a} is not the same as +@code{\[a]}. + +If @var{name} is undefined, a warning in category @samp{char} is +produced and the escape is ignored. @xref{Warnings}, for information +about the enablement and suppression of warnings. + +GNU @code{troff} resolves @code{\[@r{@dots{}}]} with more than a single +component as follows: @itemize @bullet @item @@ -9584,10 +10813,10 @@ Examples: @table @code @item \[A ho] @samp{A} maps to @code{u0041}, @samp{ho} maps to @code{u02DB}, thus the -final glyph name would be @code{u0041_02DB}. Note this is not the -expected result: The ogonek glyph @samp{ho} is a spacing ogonek, but for -a proper composite a non-spacing ogonek (U+0328) is necessary. Looking -into the file @file{composite.tmac} one can find @w{@samp{.composite ho +final glyph name would be @code{u0041_02DB}. This is not the expected +result:@: the ogonek glyph @samp{ho} is a spacing ogonek, but for a +proper composite a non-spacing ogonek (U+0328) is necessary. Looking +into the file @file{composite.tmac}, one can find @w{@samp{.composite ho u0328}}, which changes the mapping of @samp{ho} while a composite glyph name is constructed, causing the final glyph name to be @code{u0041_0328}. @@ -9595,46 +10824,46 @@ name is constructed, causing the final glyph name to be @item \[^E u0301] @itemx \[^E aa] @itemx \[E a^ aa] -@itemx \[E ^ '] +@itemx \[E ^ @code{'}] @samp{^E} maps to @code{u0045_0302}, thus the final glyph name is @code{u0045_0302_0301} in all forms (assuming proper calls of the @code{composite} request). @end table It is not possible to define glyphs with names like @w{@samp{A ho}} -within a groff font file. This is not really a limitation; instead, you -have to define @code{u0041_0328}. +within a @code{groff} font file. This is not really a limitation; +instead, you have to define @code{u0041_0328}. @endDefesc -@Defesc {\\C, ', xxx, '} +@Defesc {\\C, @code{'}, xxx, @code{'}} @cindex named character (@code{\C}) @cindex character, named (@code{\C}) -Typeset the glyph named @var{xxx}.@footnote{@code{\C} is actually a -misnomer since it accesses an output glyph.} Normally it is more -convenient to use @code{\[@var{xxx}]}, but @code{\C} has the advantage -that it is compatible with newer versions of @acronym{AT&T} @code{troff} -and is available in compatibility mode. +Typeset the glyph of the special character @var{xxx}. Normally, it is +more convenient to use @code{\[@var{xxx}]}, but @code{\C} has some +advantages: it is compatible with @acronym{AT&T} device-independent +@code{troff} (and therefore available in compatibility +mode@footnote{@xref{Compatibility Mode}.}) and can interpolate special +characters with @samp{]} in their names. The delimiter need not be +a neutral apostrophe; see @ref{Delimiters}. @endDefesc -@Defreq {composite, from to} +@Defreq {composite, id1 id2} @pindex composite.tmac -Map glyph name @var{from} to glyph name @var{to} if it is used in -@code{\[...]} with more than one component. See above for examples. - -This mapping is based on glyph names only; no check for the existence of -either glyph is done. - -A set of default mappings for many accents can be found in the file -@file{composite.tmac}, which is loaded at start-up. +Map special character name @var{id1} to @var{id2} if @var{id1} is used +in @code{\[...]} with more than one component. See above for examples. +This is a strict rewriting of the special character name; no check is +performed for the existence of a glyph for either. A set of default +mappings for many accents can be found in the file +@file{composite.tmac}, loaded by the default @file{troffrc} at startup. @endDefreq -@Defesc {\\N, ', n, '} +@Defesc {\\N, @code{'}, n, @code{'}} @cindex numbered glyph (@code{\N}) @cindex glyph, numbered (@code{\N}) @cindex @code{char} request, used with @code{\N} @cindex Unicode Typeset the glyph with code@tie{}@var{n} in the current font -(@code{n}@tie{}is @strong{not} the input character code). The number +(@code{n}@tie{}is @emph{not} the input character code). The number @var{n}@tie{}can be any non-negative decimal integer. Most devices only have glyphs with codes between 0 and@tie{}255; the Unicode output device uses codes in the range 0--65535. If the current font does not contain @@ -9655,29 +10884,29 @@ description file after the @code{charset} command. It is possible to include unnamed glyphs in the font description file by using a name of @samp{---}; the @code{\N} escape sequence is the only way to use these. -No kerning is applied to glyphs accessed with @code{\N}. +No kerning is applied to glyphs accessed with @code{\N}. The delimiter +need not be a neutral apostrophe; see @ref{Delimiters}. @endDefesc -Some escape sequences directly map onto special glyphs. +A few escape sequences are also special characters. -@Defesc {\\', , , } -This is a backslash followed by the apostrophe character, -@acronym{ASCII} character @code{0x27} (@acronym{EBCDIC} character -@code{0x7D}). The same as @code{\[aa]}, the acute accent. +@Defesc {\@code{'}, , , } +An escaped neutral apostrophe is a synonym for @code{\[aa]} (acute +accent). @endDefesc -@Defesc {\\`, , , } -This is a backslash followed by @acronym{ASCII} character @code{0x60} -(@acronym{EBCDIC} character @code{0x79} usually). The same as -@code{\[ga]}, the grave accent. +@Defesc {\@code{`}, , , } +An escaped grave accent is a synonym for @code{\[ga]} (grave accent). @endDefesc @Defesc {\\-, , , } -This is the same as @code{\[-]}, the minus sign in the current font. +An escaped hyphen-minus is a synonym for @code{\[-]} (minus sign). @endDefesc @Defesc {\\_, , , } -This is the same as @code{\[ul]}, the underline character. +An escaped underscore (``low line'') is a synonym for @code{\[ul]} +(underrule). On typesetting devices, the underrule is font-invariant +and drawn lower than the underscore @samp{_}. @endDefesc @Defreq {cflags, n c1 c2 @dots{}} @@ -9685,41 +10914,46 @@ This is the same as @code{\[ul]}, the underline character. @cindex character properties (@code{cflags}) @cindex properties of glyphs (@code{cflags}) @cindex properties of characters (@code{cflags}) -Input characters and symbols have certain properties associated with -it.@footnote{Note that the output glyphs themselves don't have such -properties. For @code{gtroff}, a glyph is a numbered box with a given -width, depth, and height, nothing else. All manipulations with the -@code{cflags} request work on the input level.} These properties can be -modified with the @code{cflags} request. The first argument is the sum -of the desired flags and the remaining arguments are the characters or -symbols to have those properties. It is possible to omit the spaces -between the characters or symbols. Instead of single characters or -symbols you can also use character classes (see @ref{Character Classes} -for more details). +Assign properties encoded by the number @var{n} to characters @var{c1}, +@var{c2}, and so on. + +Input characters, including special characters introduced by an escape, +have certain properties associated with them.@footnote{Output glyphs +don't---to GNU @code{troff}, a glyph is simply a box with an index into +a font, a given height above and depth below the baseline, and a width.} +These properties can be modified with this request. The first argument +is the sum of the desired flags and the remaining arguments are the +characters to be assigned those properties. Spaces between the @var{cn} +arguments are optional. Any argument @var{cn} can be a character class +defined with the @code{class} request rather than an individual +character. @xref{Character Classes}. + +The non-negative integer @var{n} is the sum of any of the following. +Some combinations are nonsensical, such as @samp{33} (1 + 32). @table @code @item 1 @cindex end-of-sentence characters @cindex characters, end-of-sentence -The character ends sentences (initially characters @samp{.?!} have this -property). +Recognize the character as ending a sentence if followed by a newline +or two spaces. Initially, characters @samp{.?!} have this property. @item 2 @cindex hyphenating characters @cindex characters, hyphenation -Lines can be broken before the character (initially no characters have -this property). This only works if both the characters before and after -have non-zero hyphenation codes (as set with the @code{hcode} request). -Use value@tie{}64 to override this behaviour. +Enable breaks before the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, no characters have this property. @item 4 +@cindex @code{\-} glyph, and @code{cflags} @cindex @code{hy} glyph, and @code{cflags} @cindex @code{em} glyph, and @code{cflags} -Lines can be broken after the character (initially the character -@samp{-} and the symbols @samp{\[hy]} and @samp{\[em]} have this -property). This only works if both the characters before and after have -non-zero hyphenation codes (as set with the @code{hcode} request). Use -value@tie{}64 to override this behaviour. +Enable breaks after the character. A line is not broken at a character +with this property unless the characters on each side both have non-zero +hyphenation codes. This exception can be overridden by adding 64. +Initially, characters @samp{\-\[hy]\[em]} have this property. @item 8 @cindex overlapping characters @@ -9729,15 +10963,15 @@ value@tie{}64 to override this behaviour. @cindex @code{ru} glyph, and @code{cflags} @cindex @code{radicalex} glyph, and @code{cflags} @cindex @code{sqrtex} glyph, and @code{cflags} -The character overlaps horizontally if used as a horizontal line -building element. Initially the symbols @samp{\[ul]}, @samp{\[rn]}, -@samp{\[ru]}, @samp{\[radicalex]}, and @samp{\[sqrtex]} have this -property. +Mark the glyph associated with this character as overlapping other +instances of itself horizontally. Initially, characters +@samp{\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]} have this property. @item 16 @cindex @code{br} glyph, and @code{cflags} -The character overlaps vertically if used as vertical line building -element. Initially symbol @samp{\[br]} has this property. +Mark the glyph associated with this character as overlapping other +instances of itself vertically. Initially, the character @samp{\[br]} +has this property. @item 32 @cindex transparent characters @@ -9748,59 +10982,69 @@ element. Initially symbol @samp{\[br]} has this property. @cindex @code{]}, at end of sentence @cindex @code{*}, at end of sentence @cindex @code{dg} glyph, at end of sentence +@cindex @code{dd} glyph, at end of sentence @cindex @code{rq} glyph, at end of sentence @cindex @code{cq} glyph, at end of sentence -An end-of-sentence character followed by any number of characters with -this property is treated as the end of a sentence if followed by a -newline or two spaces; in other words the character is @dfn{transparent} -for the purposes of end-of-sentence recognition -- this is the same as -having a zero space factor in @TeX{} (initially characters @samp{"')]*} -and the symbols @samp{\[dg]}, @samp{\[rq]}, and @samp{\[cq]} have this -property). +Mark the character as transparent for the purpose of end-of-sentence +recognition. In other words, an end-of-sentence character followed by +any number of characters with this property is treated as the end of a +sentence if followed by a newline or two spaces. This is the same as +having a zero space factor in @TeX{}. Initially, characters +@samp{"')]*\[dg]\[dd]\[rq]\[cq]} have this property. @item 64 -Ignore hyphenation code values of the surrounding characters. Use this -in combination with values 2 and@tie{}4 (initially no characters have -this property). For example, if you need an automatic break point after -the en-dash in number ranges like `3000--5000', insert +Ignore hyphenation codes of the surrounding characters. Use this in +combination with values 2 and@tie{}4 (initially, no characters have this +property). + +For example, if you need an automatic break point after the en-dash in +numeric ranges like ``3000--5000'', insert @Example -.cflags 68 \(en +.cflags 68 \[en] @endExample @noindent -into your document. Note, however, that this can lead to bad layout if -done without thinking; in most situations, a better solution instead of +into your document. However, this practice can lead to bad layout if +done thoughtlessly; in most situations, a better solution instead of changing the @code{cflags} value is to insert @code{\:} right after the hyphen at the places that really need a break point. +@end table + +The remaining values were implemented for East Asian language support; +those who use alphabetic scripts exclusively can disregard them. +@table @code @item 128 Prohibit a line break before the character, but allow a line break after the character. This works only in combination with flags 256 and 512 -(see below) and has no effect otherwise. +and has no effect otherwise. Initially, no characters have this +property. @item 256 Prohibit a line break after the character, but allow a line break before the character. This works only in combination with flags 128 and 512 -(see below) and has no effect otherwise. +and has no effect otherwise. Initially, no characters have this +property. @item 512 Allow line break before or after the character. This works only in combination with flags 128 and 256 and has no effect otherwise. +Initially, no characters have this property. +@end table -Contrary to flag values 2 and@tie{}4, the flags 128, 256, and 512 work +In contrast to values 2 and@tie{}4, the values 128, 256, and 512 work pairwise. If, for example, the left character has value 512, and the -right character 128, no line break gets inserted. If we use -value@tie{}6 instead for the left character, a line break after the -character can't be suppressed since the right neighbour character -doesn't get examined. -@end table +right character 128, no break will be automatically inserted between +them. If we use value@tie{}6 instead for the left character, a break +after the character can't be suppressed since the neighboring character +on the right doesn't get examined. @endDefreq -@DefreqList {char, g [@Var{string}]} -@DefreqItemx {fchar, g [@Var{string}]} -@DefreqItemx {fschar, f g [@Var{string}]} -@DefreqListEndx {schar, g [@Var{string}]} +@DefreqList {char, c [@Var{contents}]} +@DefreqItemx {fchar, c [@Var{contents}]} +@DefreqItemx {fschar, f c [@Var{contents}]} +@DefreqListEndx {schar, c [@Var{contents}]} @cindex defining character (@code{char}) @cindex defining fallback character (@code{fchar}, @code{fschar}, @code{schar}) @cindex character, defining (@code{char}) @@ -9822,31 +11066,31 @@ doesn't get examined. @cindex @code{\&}, and glyph definitions @cindex @code{\e}, and glyph definitions @cindex @code{hcode} request, and glyph definitions -Define a new glyph@tie{}@var{g} to be @var{string} (which can be -empty).@footnote{@code{char} is a misnomer since an output glyph is -defined.} Every time glyph@tie{}@var{g} needs to be printed, -@var{string} is processed in a temporary environment and the result is -wrapped up into a single object. Compatibility mode is turned off and -the escape character is set to @samp{\} while @var{string} is being -processed. Any emboldening, constant spacing or track kerning is -applied to this object rather than to individual characters in -@var{string}. - -A glyph defined by these requests can be used just like a normal glyph +Define a new character or glyph@tie{}@var{c} to be @var{contents}, which +can be empty. More precisely, @code{char} defines a @code{groff} object +(or redefines an existing one) that is accessed with the +name@tie{}@var{c} on input, and produces @var{contents} on output. +Every time glyph@tie{}@var{c} needs to be printed, @var{contents} is +processed in a temporary environment and the result is wrapped up into a +single object. Compatibility mode is turned off and the escape +character is set to@tie{}@code{\} while @var{contents} is processed. +Any emboldening, constant spacing, or track kerning is applied to this +object rather than to individual glyphs in @var{contents}. + +An object defined by these requests can be used just like a normal glyph provided by the output device. In particular, other characters can be translated to it with the @code{tr} or @code{trin} requests; it can be -made the leader character by the @code{lc} request; repeated patterns -can be drawn with the glyph using the @code{\l} and @code{\L} escape -sequences; words containing the glyph can be hyphenated correctly if the -@code{hcode} request is used to give the glyph's symbol a hyphenation -code. +made the leader character with the @code{lc} request; repeated patterns +can be drawn with it using the @code{\l} and @code{\L} escape sequences; +and words containing@tie{}@var{c} can be hyphenated correctly if the +@code{hcode} request is used to give the object a hyphenation code. -There is a special anti-recursion feature: Use of @code{g} within the -glyph's definition is handled like normal characters and symbols not -defined with @code{char}. +There is a special anti-recursion feature: use of the object within its +own definition is handled like a normal character (not +defined with @code{char}). -Note that the @code{tr} and @code{trin} requests take precedence if -@code{char} accesses the same symbol. +The @code{tr} and @code{trin} requests take precedence if @code{char} +accesses the same symbol. @Example .tr XY @@ -9876,30 +11120,26 @@ Finally, the @code{schar} request defines a global fallback glyph: of fonts declared as global special fonts with the @code{special} request, but before the already mounted special fonts. -@xref{Using Symbols}, for a detailed description of the glyph searching -mechanism in @code{gtroff}. +@xref{Character Classes}. @endDefreq -@DefreqList {rchar, c1 c2 @dots{}} -@DefreqListEndx {rfschar, f c1 c2 @dots{}} +@DefreqList {rchar, c @dots{}} +@DefreqListEndx {rfschar, f c @dots{}} @cindex removing glyph definition (@code{rchar}, @code{rfschar}) @cindex glyph, removing definition (@code{rchar}, @code{rfschar}) @cindex fallback glyph, removing definition (@code{rchar}, @code{rfschar}) -Remove the definitions of glyphs @var{c1}, @var{c2},@tie{}@enddots{} -This undoes the effect of a @code{char}, @code{fchar}, or @code{schar} -request. - -It is possible to omit the whitespace between arguments. +Remove definition of each ordinary or special character @var{c}, +undoing the effect of a @code{char}, @code{fchar}, or @code{schar} +request. Those supplied by font description files cannot be removed. +Spaces and tabs may separate @var{c}@tie{}arguments. The request @code{rfschar} removes glyph definitions defined with -@code{fschar} for glyph@tie{}f. +@code{fschar} for font@tie{}@var{f}. @endDefreq -@xref{Special Characters}. - @c --------------------------------------------------------------------- -@node Character Classes, Special Fonts, Using Symbols, Fonts and Symbols +@node Character Classes, Special Fonts, Using Symbols, Using Fonts @subsection Character Classes @cindex character classes @cindex classes, character @@ -9909,73 +11149,78 @@ Chinese, Japanese, and Korean, where the number of needed characters is much larger than in European languages, and where large sets of characters share the same properties. -@Defreq {class, n c1 c2 @dots{}} +@Defreq {class, name c1 c2 @dots{}} @cindex character class (@code{class}) @cindex defining character class (@code{class}) @cindex class of characters (@code{class}) -In @code{groff}, a @dfn{character class} (or simply ``class'') is a set -of characters, grouped by some user aspect. The @code{class} request -defines such classes so that other requests can refer to all characters -belonging to this set with a single class name. Currently, only the -@code{cflags} request can handle character classes. +Define a character class (or simply ``class'') @var{name} comprising +the characters @var{c1}, @var{c2}, and so on. -A @code{class} request takes a class name followed by a list of -entities. In its simplest form, the entities are characters or symbols: +A class thus defined can then be referred to in lieu of listing all the +characters within it. Currently, only the @code{cflags} request can +handle references to character classes. + +In the request's simplest form, each @var{cn} is a character (or special +character). @Example -.class [prepunct] , : ; > @} +.class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq] @endExample -Since class and glyph names share the same namespace, it is recommended +Since class and glyph names share the same name space, it is recommended to start and end the class name with @code{[} and @code{]}, -respectively, to avoid collisions with normal @code{groff} symbols (and -symbols defined by the user). In particular, the presence of @code{]} -in the symbol name intentionally prevents the usage of @code{\[...]}, -thus you must use the @code{\C} escape to access a class with such a -name. +respectively, to avoid collisions with existing character names defined +by GNU @code{troff} or the user (with @code{char} and related requests). +This practice applies the presence of @code{]} in the class name to +prevent the use of the special character escape form +@code{\[@r{@dots{}}]}, thus you must use the @code{\C} escape to access +a class with such a name. -@cindex GGL (groff glyph list) -@cindex groff glyph list (GGL) -You can also use a special character range notation, consisting of a -start character or symbol, followed by @samp{-}, and an end character or -symbol. Internally, @code{gtroff} converts these two symbol names to -Unicode values (according to the groff glyph gist), which then give the -start and end value of the range. If that fails, the class definition -is skipped. +@cindex GGL (@code{groff} glyph list) +@cindex @code{groff} glyph list (GGL) +You can also use a character range notation consisting of a +start character followed by @samp{-} and then an end character. +Internally, GNU @code{troff} converts these two symbol names to +Unicode code points (according to the @code{groff} glyph list [GGL]), +which then give the start and end value of the range. If that fails, +the class definition is skipped. -Finally, classes can be nested, too. - -Here is a more complex example: +Furthermore, classes can be nested. @Example +.class [prepunct] , : ; > @} .class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016] @endExample -The class @samp{prepunctx} now contains the contents of the class -@code{prepunct} as defined above (the set @samp{, : ; > @}}), and +@noindent +The class @samp{[prepunctx]} thus contains the contents of the class +@code{[prepunct]} as defined above (the set @samp{, : ; > @}}), and characters in the range between @code{U+2013} and @code{U+2016}. -If you want to add @samp{-} to a class, it must be the first character -value in the argument list, otherwise it gets misinterpreted as a range. +If you want to include @samp{-} in a class, it must be the first +character value in the argument list, otherwise it gets misinterpreted +as part of the range syntax. -Note that it is not possible to use class names within range +It is not possible to use class names as end points of range definitions. -Typical use of the @code{class} request is to control line-breaking and -hyphenation rules as defined by the @code{cflags} request. For example, -to inhibit line breaks before the characters belonging to the -@code{prepunctx} class, you can write: +A typical use of the @code{class} request is to control line-breaking +and hyphenation rules as defined by the @code{cflags} request. For +example, to inhibit line breaks before the characters belonging to the +@code{prepunctx} class defined in the previous example, you can write +the following. @Example .cflags 2 \C'[prepunctx]' @endExample +@noindent See the @code{cflags} request in @ref{Using Symbols}, for more details. @endDefreq @c --------------------------------------------------------------------- -@node Special Fonts, Artificial Fonts, Character Classes, Fonts and Symbols +@node Special Fonts, Artificial Fonts, Character Classes, Using Fonts @subsection Special Fonts @cindex special fonts @cindex fonts, special @@ -10012,36 +11257,36 @@ are loaded. @c --------------------------------------------------------------------- -@node Artificial Fonts, Ligatures and Kerning, Special Fonts, Fonts and Symbols +@node Artificial Fonts, Ligatures and Kerning, Special Fonts, Using Fonts @subsection Artificial Fonts @cindex artificial fonts @cindex fonts, artificial -There are a number of requests and escapes for artificially creating -fonts. These are largely vestiges of the days when output devices did -not have a wide variety of fonts, and when @code{nroff} and @code{troff} -were separate programs. Most of them are no longer necessary in GNU -@code{troff}. Nevertheless, they are supported. +There are a number of requests and escape sequences for artificially +creating fonts. These are largely vestiges of the days when output +devices did not have a wide variety of fonts, and when @code{nroff} and +@code{troff} were separate programs. Most of them are no longer +necessary in GNU @code{troff}. Nevertheless, they are supported. -@DefescList {\\H, ', height, '} -@DefescItem {\\H, ', @t{+}height, '} -@DefescItem {\\H, ', @t{-}height, '} +@DefescList {\\H, @code{'}, height, @code{'}} +@DefescItem {\\H, @code{'}, @t{+}height, @code{'}} +@DefescItem {\\H, @code{'}, @t{-}height, @code{'}} @DefregListEndx {.height} @cindex changing the font height (@code{\H}) @cindex font height, changing (@code{\H}) @cindex height, font, changing (@code{\H}) Change (increment, decrement) the height of the current font, but not the width. If @var{height} is zero, restore the original height. -Default scaling indicator is @samp{z}. +Default scaling unit is @samp{z}. -The read-only number register @code{.height} contains the font height as -set by @code{\H}. +The read-only register @code{.height} contains the font height as set by +@code{\H}. Currently, only the @option{-Tps} and @option{-Tpdf} devices support this feature. -Note that @code{\H} doesn't produce an input token in @code{gtroff}. As -a consequence, it can be used in requests like @code{mc} (which expects +@code{\H} doesn't produce an input token in GNU @code{troff}. As a +consequence, it can be used in requests like @code{mc} (which expects a single character as an argument) to change the font on the fly: @Example @@ -10050,7 +11295,7 @@ a single character as an argument) to change the font on the fly: In compatibility mode, @code{gtroff} behaves differently: If an increment or decrement is used, it is always taken relative to the -current point size and not relative to the previously selected font +current type size and not relative to the previously selected font height. Thus, @Example @@ -10063,7 +11308,7 @@ prints the word @samp{test} twice with the same font height (five points larger than the current font size). @endDefesc -@DefescList {\\S, ', slant, '} +@DefescList {\\S, @code{'}, slant, @code{'}} @DefregListEndx {.slant} @cindex changing the font slant (@code{\S}) @cindex font slant, changing (@code{\S}) @@ -10071,22 +11316,24 @@ larger than the current font size). Slant the current font by @var{slant} degrees. Positive values slant to the right. Only integer values are possible. -The read-only number register @code{.slant} contains the font slant as -set by @code{\S}. +The read-only register @code{.slant} contains the font slant as set by +@code{\S}. Currently, only the @option{-Tps} and @option{-Tpdf} devices support this feature. -Note that @code{\S} doesn't produce an input token in @code{gtroff}. As -a consequence, it can be used in requests like @code{mc} (which expects +@code{\S} doesn't produce an input token in GNU @code{troff}. As a +consequence, it can be used in requests like @code{mc} (which expects a single character as an argument) to change the font on the fly: @Example .mc \S'20'x\S'0' @endExample -This request is incorrectly documented in the original Unix troff -manual; the slant is always set to an absolute value. +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{\S} escape +This escape is incorrectly documented in the @acronym{AT&T} +@code{troff} manual; the slant is always set to an absolute value. @endDefesc @Defreq {ul, [@Var{lines}]} @@ -10094,12 +11341,12 @@ manual; the slant is always set to an absolute value. The @code{ul} request normally underlines subsequent lines if a TTY output device is used. Otherwise, the lines are printed in italics (only the term `underlined' is used in the following). The single -argument is the number of input lines to be underlined; with no +argument is the quantity of input lines to be underlined; with no argument, the next line is underlined. If @var{lines} is zero or negative, stop the effects of @code{ul} (if it was active). Requests and empty lines do not count for computing the number of underlined input lines, even if they produce some output like @code{tl}. Lines -inserted by macros (e.g.@: invoked by a trap) do count. +inserted by macros (e.g., invoked by a trap) do count. At the beginning of @code{ul}, the current font is stored and the underline font is activated. Within the span of a @code{ul} request, it @@ -10107,13 +11354,14 @@ is possible to change fonts, but after the last line affected by @code{ul} the saved font is restored. This number of lines still to be underlined is associated with the -current environment (@pxref{Environments}). The underline font can be -changed with the @code{uf} request. +environment (@pxref{Environments}). The underline font can be changed +with the @code{uf} request. @c XXX @xref should be changed to grotty -@c @xref{Troff and Nroff Mode}, for a discussion how underlining is -@c implemented in for TTY output devices, and which problems can arise. +@c @xref{@code{troff} and @code{nroff} Modes}, for a discussion of how +@c underlining is implemented for terminal output devices, and what +@c problems can arise. The @code{ul} request does not underline spaces. @endDefreq @@ -10136,10 +11384,10 @@ a non-negative font position or the name of a font. @DefreqList {bd, font [@Var{offset}]} @DefreqItem {bd, font1 font2 [@Var{offset}]} @DefregListEndx {.b} -@cindex imitating bold face (@code{bd}) -@cindex bold face, imitating (@code{bd}) -Artificially create a bold font by printing each glyph twice, slightly -offset. +@cindex imitating boldface (@code{bd}) +@cindex boldface, imitating (@code{bd}) +Embolden @var{font} by overstriking its glyphs offset by @var{offset} +units minus one. Two syntax forms are available. @@ -10163,7 +11411,7 @@ special font is active; in the @code{bd} request, its default unit is @cindex special fonts, emboldening @item Imitate a bold form conditionally. Embolden @var{font1} by @var{offset} -only if font @var{font2} is the current font. This command can be +only if font @var{font2} is the current font. This request can be issued repeatedly to set up different emboldening values for different current fonts. If the second argument is missing, emboldening is turned off for this particular current font. @@ -10185,13 +11433,13 @@ is taken from the current font size (as set with the @code{ps} request) when the font is effectively in use. Without second and third argument, constant glyph space mode is deactivated. -Default scaling indicator for @var{em-size} is @samp{z}; @var{width} is -an integer. +Default scaling unit for @var{em-size} is @samp{z}; @var{width} is an +integer. @endDefreq @c --------------------------------------------------------------------- -@node Ligatures and Kerning, , Artificial Fonts, Fonts and Symbols +@node Ligatures and Kerning, Dummy Characters, Artificial Fonts, Using Fonts @subsection Ligatures and Kerning @cindex ligatures and kerning @cindex kerning and ligatures @@ -10202,15 +11450,15 @@ ligature `fi' as in the word `file'. This produces a cleaner look (albeit subtle) to the printed output. Usually, ligatures are not available in fonts for TTY output devices. -Most @sc{PostScript} fonts support the fi and fl ligatures. The C/A/T +Most PostScript fonts support the fi and fl ligatures. The C/A/T typesetter that was the target of @acronym{AT&T} @code{troff} also supported `ff', `ffi', and `ffl' ligatures. Advanced typesetters or `expert' fonts may include ligatures for `ft' and `ct', although GNU @code{troff} does not support these (yet). Only the current font is checked for ligatures and kerns; neither -special fonts nor entities defined with the @code{char} request (and its -siblings) are taken into account. +special fonts nor special charcters defined with the @code{char} request +(and its siblings) are taken into account. @DefreqList {lg, [@Var{flag}]} @DefregListEndx {.lg} @@ -10219,9 +11467,8 @@ siblings) are taken into account. @cindex ligatures enabled register (@code{.lg}) Switch the ligature mechanism on or off; if the parameter is non-zero or missing, ligatures are enabled, otherwise disabled. Default is on. The -current ligature mode can be found in the read-only number register -@code{.lg} (set to 1 or@tie{}2 if ligatures are enabled, -0@tie{}otherwise). +current ligature mode can be found in the read-only register @code{.lg} +(set to 1 or@tie{}2 if ligatures are enabled, 0@tie{}otherwise). Setting the ligature mode to@tie{}2 enables the two-character ligatures (fi, fl, and ff) and disables the three-character ligatures (ffi and @@ -10244,18 +11491,17 @@ same width don't use kerning. @cindex kerning, activating (@code{kern}) @cindex kerning enabled register (@code{.kern}) Switch kerning on or off. If the parameter is non-zero or missing, -enable pairwise kerning, otherwise disable it. The read-only number -register @code{.kern} is set to@tie{}1 if pairwise kerning is enabled, +enable pairwise kerning, otherwise disable it. The read-only register +@code{.kern} is set to@tie{}1 if pairwise kerning is enabled, 0@tie{}otherwise. -@cindex zero width space character (@code{\&}) -@cindex character, zero width space (@code{\&}) -@cindex space character, zero width (@code{\&}) +@cindex dummy character (@code{\&}), effect on kerning +@cindex character, dummy (@code{\&}), effect on kerning If the font description file contains pairwise kerning information, glyphs from that font are kerned. Kerning between two glyphs can be inhibited by placing @code{\&} between them: @samp{V\&A}. -@xref{Font File Format}. +@xref{Font Description File Format}. @endDefreq @cindex track kerning @@ -10272,87 +11518,89 @@ the reader notices the effect. Enable track kerning for font@tie{}@var{f}. If the current font is@tie{}@var{f} the width of every glyph is increased by an amount between @var{n1} and @var{n2} (@var{n1}, @var{n2} can be negative); if -the current point size is less than or equal to @var{s1} the width is +the current type size is less than or equal to @var{s1} the width is increased by @var{n1}; if it is greater than or equal to @var{s2} the -width is increased by @var{n2}; if the point size is greater than or +width is increased by @var{n2}; if the type size is greater than or equal to @var{s1} and less than or equal to @var{s2} the increase in -width is a linear function of the point size. +width is a linear function of the type size. -The default scaling indicator is @samp{z} for @var{s1} and @var{s2}, -@samp{p} for @var{n1} and @var{n2}. +The default scaling unit is @samp{z} for @var{s1} and @var{s2}, @samp{p} +for @var{n1} and @var{n2}. -Note that the track kerning amount is added even to the rightmost glyph -in a line; for large values it is thus recommended to increase the line -length by the same amount to compensate it. +The track kerning amount is added even to the rightmost glyph in a line; +for large values it is thus recommended to increase the line length by +the same amount to compensate. @endDefreq -Sometimes, when typesetting letters of different fonts, more or less -space at such boundaries is needed. There are two escapes to help with -this. +@c --------------------------------------------------------------------- + +@node Italic Corrections, Dummy Characters, Ligatures and Kerning, Using Fonts +@subsection Italic Corrections + +When typesetting adjacent glyphs from typefaces of different slants, the +space between them may require adjustment. @Defesc {\\/, , , } @cindex italic correction (@code{\/}) @cindex correction, italic (@code{\/}) -@cindex correction between italic and roman glyph (@code{\/}, @code{\,}) +@cindex correction between oblique and upright glyph (@code{\/}, @code{\,}) @cindex roman glyph, correction after italic glyph (@code{\/}) -@cindex italic glyph, correction before roman glyph (@code{\/}) -@cindex glyph, italic correction (@code{\/}) -Increase the width of the preceding glyph so that the spacing between -that glyph and the following glyph is correct if the following glyph is -a roman glyph. For example, if an italic@tie{}@code{f} is immediately -followed by a roman right parenthesis, then in many fonts the top right -portion of the@tie{}@code{f} overlaps the top left of the right -parenthesis. Use this escape sequence whenever an italic glyph is -immediately followed by a roman glyph without any intervening space. -This small amount of space is also called @dfn{italic correction}. - -@iftex -@c can't use @Example...@endExample here -@example -@group -\f[I]f\f[R]) - @result{} {@it f}@r{)} -\f[I]f\/\f[R]) - @result{} @i{f}@r{)} -@end group -@end example -@end iftex +@cindex upright glyph, correction after oblique glyph (@code{\/}) +Apply an @dfn{italic correction}:@: modify the spacing of the preceding +glyph so that the distance between it and the following glyph is correct +if the latter is of upright shape. For example, if an +italic@tie{}@samp{f} is followed immediately by a roman right +parenthesis, then in many fonts the top right portion of +the@tie{}@samp{f} overlaps the top left of the right parenthesis, which +is ugly. Use this escape sequence whenever an oblique glyph is +immediately followed by an upright glyph without any intervening space. @endDefesc @Defesc {\\\,, , , } @cindex left italic correction (@code{\,}) @cindex correction, left italic (@code{\,}) -@cindex glyph, left italic correction (@code{\,}) +@cindex correction between upright and oblique glyph (@code{\/}, @code{\,}) @cindex roman glyph, correction before italic glyph (@code{\,}) -@cindex italic glyph, correction after roman glyph (@code{\,}) -Modify the spacing of the following glyph so that the spacing between -that glyph and the preceding glyph is correct if the preceding glyph is -a roman glyph. Use this escape sequence whenever a roman glyph is -immediately followed by an italic glyph without any intervening space. -In analogy to above, this space could be called @dfn{left italic -correction}, but this term isn't used widely. - -@iftex -@c can't use @Example...@endExample here -@example -@group -q\f[I]f - @result{} @r{q}@i{f} -q\,\f[I]f - @result{} @r{q}@math{@ptexcomma}@i{f} -@end group -@end example -@end iftex +@cindex upright glyph, correction before oblique glyph (@code{\,}) +Apply a @dfn{left italic correction}:@: modify the spacing of the +following glyph so that the distance between it and the preceding +glyph is correct if the latter is of upright shape. For example, +if a roman left parenthesis is immediately followed by an +italic@tie{}@samp{f}, then in many fonts the bottom left portion of +the@tie{}@samp{f} overlaps the bottom of the left parenthesis, which is +ugly. Use this escape sequence whenever an upright glyph is followed +immediately by an oblique glyph without any intervening space. @endDefesc +@c XXX: Can we move this node earlier in the text? Should it come +@c before some of the dummy character's multifarious effects? +@need 1000 +@node Dummy Characters, , Italic Corrections, Using Fonts +@subsection Dummy Characters + +As discussed in @ref{Requests and Macros}, the first character on an +input line is treated specially. Further, formatting a glyph has many +consequences on formatter state (@pxref{Environments}). Occasionally, +we want to escape this context or embrace some of those consequences +without actually rendering a glyph to the output. + @Defesc {\\&, , , } -Insert a zero-width character, which is invisible. Its intended use is -to stop interaction of a character with its surroundings. +@cindex dummy character (@code{\&}) +@cindex character, dummy (@code{\&}) +Interpolate a dummy character, which is constitutive of output but +invisible.@footnote{Opinions of this escape sequence's name abound. +``Zero-width space'' is a popular misnomer:@: @code{roff} formatters do +not treat it like a space. Ossanna called it a ``non-printing, +zero-width character'', but the character causes @emph{output} even +though it does not ``print''. If no output line is pending, the dummy +character starts one. Contrast an empty input document with one +containing only @code{\&}. The former produces no output; the latter, a +blank page.} Its presence alters the interpretation context of a +subsequent input character, and enjoys several applications. @itemize @bullet @item -It prevents the insertion of extra space after an end-of-sentence -character. +Prevent insertion of extra space after an end-of-sentence character. @Example Test. @@ -10364,18 +11612,17 @@ Test. @endExample @item -It prevents interpretation of a control character at the beginning of an -input line. +Prevent recognition of a control character. @Example .Test - @result{} warning: `Test' not defined + @error{} warning: macro 'Test' not defined \&.Test @result{} .Test @endExample @item -It prevents kerning between two glyphs. +Prevent kerning between two glyphs. @iftex @c can't use @Example...@endExample here @@ -10390,77 +11637,120 @@ V\&A @end iftex @item -It is needed to map an arbitrary character to nothing in the @code{tr} -request (@pxref{Character Translations}). -@end itemize -@endDefesc +Translate a character to ``nothing''. -@Defesc {\\), , , } -This escape is similar to @code{\&} except that it behaves like a -character declared with the @code{cflags} request to be transparent for -the purposes of an end-of-sentence character. +@Example +.tr JIjiK\&k\&UVuv +@c XXX: I might have the wrong noun declension in "university" here. +Post universitum, alea jacta est, OK? + @result{} Post vniversitvm, alea iacta est, O? +@endExample +@end itemize -Its main usage is in macro definitions to protect against arguments -starting with a control character. +The dummy character escape sequence sees use in macro definitions as a +means of ensuring that arguments are treated as text even if they begin +with spaces or control characters. @Example -.de xxx -\)\\$1 +.de HD \" typeset a simple bold heading +. sp +. ft B +\&\\$1 \" exercise: remove the \& +. ft +. sp .. -.de yyy -\&\\$1 +.HD .\|.\|.\|surprised? +@endExample +@endDefesc + +One way to think about the dummy character is to imagine placing the +symbol @samp{&} in the input at a certain location; if doing so has all +the side effects on formatting that you desire except for sticking an +ugly ampersand in the midst of your text, the dummy character is what +you want in its place. + +@c XXX: This feature seems nearly impossible to motivate. The _only_ +@c use of it in the groff source tree is for the mdoc package, for which +@c it seems to be special pleading for that package's unique approach to +@c macro argument reprocessing, which also involves an idiosyncratic +@c approach to punctuation characters in macro argument lists. +@Defesc {\\), , , } +@cindex transparent dummy character (@code{\)}) +@cindex character, transparent dummy (@code{\)}) +@cindex dummy character, transparent (@code{\)}) +Interpolate a @slanted{transparent} dummy character---one that is +transparent to end-of-sentence detection. It behaves as @code{\&}, +except that @code{\&} is treated as letters and numerals normally are +after @samp{.}, @samp{?} and @samp{!}; @code{\&} cancels end-of-sentence +detection, and @code{\)} does not. +@c This feature seems too weak to me; see Savannah #60571. -- GBR + +@Example +.de Suffix-& +. nop \&\\$1 .. -This is a test.\c -.xxx ' -This is a test. - @result{}This is a test.' This is a test. -This is a test.\c -.yyy ' -This is a test. - @result{}This is a test.' This is a test. +. +.de Suffix-) +. nop \)\\$1 +.. +. +Here's a sentence.\c +.Suffix-& ' +Another one.\c +.Suffix-) ' +And a third. + @result{} Here's a sentence.' Another one.' And a third. @endExample @endDefesc @c ===================================================================== -@node Sizes, Strings, Fonts and Symbols, gtroff Reference -@section Sizes -@cindex sizes +@c TODO: Move the troff and nroff mode stuff here. Try to keep stuff +@c that isn't ignored in nroff above this point, and stuff for +@c typesetters below, until we hit the programming/advanced concepts. +@c XXX: Thorny issue: nroff/terminal devices ignore type size but +@c _honor_ vertical spacing (to within their crude vertical motion +@c quanta). -@cindex baseline +@need 2000 +@node Manipulating Type Size and Vertical Spacing, Colors, Using Fonts, GNU troff Reference +@section Manipulating Type Size and Vertical Spacing +@cindex manipulating type size and vertical spacing + +@cindex text baseline +@cindex baseline, text @cindex type size -@cindex size of type +@cindex size, size @cindex vertical spacing @cindex spacing, vertical -@code{gtroff} uses two dimensions with each line of text, type size and -vertical spacing. The @dfn{type size} is approximately the height of -the tallest glyph.@footnote{This is usually the parenthesis. Note that -in most cases the real dimensions of the glyphs in a font are @emph{not} -related to its type size! For example, the standard @sc{PostScript} -font families `Times Roman', `Helvetica', and `Courier' can't be used -together at 10@dmn{pt}; to get acceptable output, the size of -`Helvetica' has to be reduced by one point, and the size of `Courier' -must be increased by one point.} @dfn{Vertical spacing} is the amount -of space @code{gtroff} allows for a line of text; normally, this is -about 20%@tie{}larger than the current type size. Ratios smaller than -this can result in hard-to-read text; larger than this, it spreads the -text out more vertically (useful for term papers). By default, -@code{gtroff} uses 10@tie{}point type on 12@tie{}point spacing. - +These concepts were introduced in @ref{Page Geometry}. The height of a +font's tallest glyph is one em, which is equal to the type size in +points.@footnote{In text fonts, the tallest glyphs are typically +parentheses. Unfortunately, in many cases the actual dimensions of the +glyphs in a font do not closely match its declared type size! For +example, in the standard PostScript font families, 10-point Times sets +better with 9-point Helvetica and 11-point Courier than if all three +were used at 10@tie{}points.} A vertical spacing of less than 120% of +the type size can make a document hard to read. Larger proportions can +be useful to spread the text for annotations or proofreader's marks. By +default, GNU @code{troff} uses 10@tie{}point type on 12@tie{}point +spacing. @cindex leading -The difference between type size and vertical spacing is known, by -typesetters, as @dfn{leading} (this is pronounced `ledding'). +Typographers call the difference between type size and vertical spacing +@dfn{leading}.@footnote{Rhyme with ``sledding''; mechanical typography +used lead metal (Latin @emph{plumbum}).} @menu -* Changing Type Sizes:: -* Fractional Type Sizes:: +* Changing the Type Size:: +* Changing the Vertical Spacing:: +* Using Fractional Type Sizes:: @end menu @c --------------------------------------------------------------------- -@node Changing Type Sizes, Fractional Type Sizes, Sizes, Sizes -@subsection Changing Type Sizes +@node Changing the Type Size, Changing the Vertical Spacing, Manipulating Type Size and Vertical Spacing, Manipulating Type Size and Vertical Spacing +@subsection Changing the Type Size @DefreqList {ps, [@Var{size}]} @DefreqItem {ps, @t{+}@Var{size}} @@ -10470,87 +11760,91 @@ typesetters, as @dfn{leading} (this is pronounced `ledding'). @cindex changing type sizes (@code{ps}, @code{\s}) @cindex type sizes, changing (@code{ps}, @code{\s}) @cindex point sizes, changing (@code{ps}, @code{\s}) -Use the @code{ps} request or the @code{\s} escape to change (increase, -decrease) the type size (in points). Specify @var{size} as either an -absolute point size, or as a relative change from the current size. The -size@tie{}0 (for both @code{.ps} and @code{\s}), or no argument (for -@code{.ps} only), goes back to the previous size. - -Default scaling indicator of @code{size} is @samp{z}. If @code{size} is -negative, it is set to 1@dmn{u}. +Use the @code{ps} request or the @code{\s} escape sequence to change +(increase, decrease) the type size (in scaled points). Specify +@var{size} as either an absolute type size, or as a relative change from +the current size. @code{ps} with no argument restores the previous +size. The @code{ps} request's default scaling unit is @samp{z}. The +requested size is rounded to the nearest valid size (with ties rounding +down) within the limits supported by the device. If the requested size +is non-positive, it is treated as 1@dmn{u}. + +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{ps} request +@cindex CSTR@tie{}#54 erratum, @code{\s} escape sequence +Type size alteration is incorrectly documented in the @acronym{AT&T} +@code{troff} manual, which claims ``if [the requested size] is invalid, +the next larger valid size will result, with a maximum of +36''.@footnote{The claim appears to have been true of Ossanna +@code{troff} for the C/A/T device; Kernighan made device-independent +@code{troff} more flexible.} @cindex type size registers (@code{.s}, @code{.ps}) @cindex point size registers (@code{.s}, @code{.ps}) -The read-only number register @code{.s} returns the point size in points -as a decimal fraction. This is a string. To get the point size in -scaled points, use the @code{.ps} register instead. - -@code{.s} is associated with the current environment -(@pxref{Environments}). - -@Example -snap, snap, -.ps +2 -grin, grin, -.ps +2 -wink, wink, \s+2nudge, nudge,\s+8 say no more! -.ps 10 -@endExample +The read-only string-valued register @code{.s} interpolates the type +size in points as a decimal fraction; it is associated with the +environment (@pxref{Environments}). To obtain the type size in scaled +points, interpolate the @code{.ps} register instead (@pxref{Using +Fractional Type Sizes}). -The @code{\s} escape may be called in a variety of ways. Much like -other escapes there must be a way to determine where the argument ends -and the text begins. Any of the following forms are valid: +The @code{\s} escape sequence supports a variety of syntax forms. @table @code @item \s@var{n} -Set the point size to @var{n}@tie{}points. @var{n}@tie{}must be either -0 or in the range 4 to@tie{}39. +Set the type size to @var{n}@tie{}points. @var{n}@tie{}must be a single +digit. If @var{n}@tie{}is 0, restore the previous size. @item \s+@var{n} @itemx \s-@var{n} -Increase or decrease the point size by @var{n}@tie{}points. +Increase or decrease the type size by @var{n}@tie{}points. @var{n}@tie{}must be exactly one digit. @item \s(@var{nn} -Set the point size to @var{nn}@tie{}points. @var{nn} must be exactly -two digits. +Set the type size to @var{nn}@tie{}points. @var{nn} must be exactly two +digits. @item \s+(@var{nn} @itemx \s-(@var{nn} @itemx \s(+@var{nn} @itemx \s(-@var{nn} -Increase or decrease the point size by @var{nn}@tie{}points. @var{nn} -must be exactly two digits. +Alter the type size in points by the two-digit value @var{nn}. @end table -Note that @code{\s} doesn't produce an input token in @code{gtroff}. As -a consequence, it can be used in requests like @code{mc} (which expects -a single character as an argument) to change the font on the fly: +@xref{Using Fractional Type Sizes}, for further syntactical forms of the +@code{\s} escape sequence that additionally accept decimal fractions. @Example -.mc \s[20]x\s[0] +snap, snap, +.ps +2 +grin, grin, +.ps +2 +wink, wink, \s+2nudge, nudge,\s+8 say no more! +.ps 10 @endExample - -@xref{Fractional Type Sizes}, for yet another syntactical form of using -the @code{\s} escape. @endDefreq -@Defreq {sizes, s1 s2 @dots{} sn [0]} -Some devices may only have certain permissible sizes, in which case -@code{gtroff} rounds to the nearest permissible size. The @file{DESC} -file specifies which sizes are permissible for the device. +The @code{\s} escape sequence affects the environment immediately and +doesn't produce an input token. Consequently, it can be used in +requests like @code{mc}, which expects a single character as an +argument, to change the type size on the fly. -Use the @code{sizes} request to change the permissible sizes for the -current output device. Arguments are in scaled points; the -@code{sizescale} line in the @file{DESC} file for the output device -provides the scaling factor. For example, if the scaling factor is -1000, then the value 12000 is 12@tie{}points. +@Example +.mc \s[20]x\s[0] +@endExample -Each argument can be a single point size (such as @samp{12000}), or a -range of sizes (such as @samp{4000-72000}). You can optionally end the -list with a zero. +@Defreq {sizes, s1 s2 @dots{} sn [@t{0}]} +The @file{DESC} file specifies which type sizes are allowed by the +output device; see @ref{DESC File Format}. Use the @code{sizes} request +to change this set of permissible sizes. Arguments are in scaled +points; see @ref{Using Fractional Type Sizes}. Each can be a single +type size (such as @samp{12000}), or a range of sizes (such as +@samp{4000-72000}). You can optionally end the list with a @samp{0}. @endDefreq +@need 1000 +@node Changing the Vertical Spacing, Using Fractional Type Sizes, Changing the Type Size, Manipulating Type Size and Vertical Spacing +@subsection Changing the Vertical Spacing + @DefreqList {vs, [@Var{space}]} @DefreqItem {vs, @t{+}@Var{space}} @DefreqItem {vs, @t{-}@Var{space}} @@ -10558,67 +11852,62 @@ list with a zero. @cindex changing vertical line spacing (@code{vs}) @cindex vertical line spacing, changing (@code{vs}) @cindex vertical line spacing register (@code{.v}) -Change (increase, decrease) the vertical spacing by @var{space}. The -default scaling indicator is @samp{p}. - -If @code{vs} is called without an argument, the vertical spacing is -reset to the previous value before the last call to @code{vs}. - +Set the vertical spacing to, or alter it by, @var{space}. The default +scaling unit is @samp{p}. If @code{vs} is called without an argument, +the vertical spacing is reset to the previous value before the last call +to @code{vs}. @cindex @code{.V} register, and @code{vs} -@code{gtroff} creates a warning of type @samp{range} if @var{space} is -negative; the vertical spacing is then set to smallest positive value, -the vertical resolution (as given in the @code{.V} register). +GNU @code{troff} emits a warning in category @samp{range} if @var{space} +is negative; the vertical spacing is then set to the smallest possible +positive value, the vertical motion quantum (as found in the @code{.V} +register). -Note that @w{@samp{.vs 0}} isn't saved in a diversion since it doesn't -result in a vertical motion. You explicitly have to repeat this command -before inserting the diversion. +@w{@samp{.vs 0}} isn't saved in a diversion since it doesn't result in +a vertical motion. You must explicitly issue this request before +interpolating the diversion. -The read-only number register @code{.v} contains the current vertical -spacing; it is associated with the current environment -(@pxref{Environments}). +The read-only register @code{.v} contains the vertical spacing; it is +associated with the environment (@pxref{Environments}). @endDefreq @cindex vertical line spacing, effective value -The effective vertical line spacing consists of four components. -Breaking a line causes the following actions (in the given order). +@noindent +When a break occurs, GNU @code{troff} performs the following procedure. @itemize @bullet @item @cindex extra pre-vertical line space (@code{\x}) @cindex line space, extra pre-vertical (@code{\x}) -Move the current point vertically by the @dfn{extra pre-vertical line -space}. This is the minimum value of all @code{\x} escapes with a -negative argument in the current output line. +Move the drawing position vertically by the @dfn{extra pre-vertical line +space}, the minimum of all negative @code{\x} escape sequence arguments +in the pending output line. @item -Move the current point vertically by the vertical line spacing as set -with the @code{vs} request. +Move the drawing position vertically by the vertical line spacing. @item -Output the current line. +Write out the pending output line. @item @cindex extra post-vertical line space (@code{\x}) @cindex line space, extra post-vertical (@code{\x}) -Move the current point vertically by the @dfn{extra post-vertical line -space}. This is the maximum value of all @code{\x} escapes with a -positive argument in the line that has just been output. +Move the drawing position vertically by the @dfn{extra post-vertical line +space}, the maximum of all positive @code{\x} escape sequence arguments +in the line that has just been output. @item @cindex post-vertical line spacing @cindex line spacing, post-vertical (@code{pvs}) -Move the current point vertically by the @dfn{post-vertical line -spacing} as set with the @code{pvs} request. +Move the drawing position vertically by the @dfn{post-vertical line +spacing} (see below). @end itemize @cindex double-spacing (@code{vs}, @code{pvs}) -It is usually better to use @code{vs} or @code{pvs} instead of @code{ls} -to produce double-spaced documents: @code{vs} and @code{pvs} have a -finer granularity for the inserted vertical space compared to @code{ls}; -furthermore, certain preprocessors assume single-spacing. - -@xref{Manipulating Spacing}, for more details on the @code{\x} escape -and the @code{ls} request. +Prefer @code{vs} or @code{pvs} over @code{ls} to produce double-spaced +documents. @code{vs} and @code{pvs} have finer granularity than +@code{ls}; moreover, some preprocessors assume single spacing. +@xref{Manipulating Spacing}, regarding the @code{\x} escape sequence and +the @code{ls} request. @DefreqList {pvs, [@Var{space}]} @DefreqItem {pvs, @t{+}@Var{space}} @@ -10627,105 +11916,116 @@ and the @code{ls} request. @cindex @code{ls} request, alternative to (@code{pvs}) @cindex post-vertical line spacing, changing (@code{pvs}) @cindex post-vertical line spacing register (@code{.pvs}) -Change (increase, decrease) the post-vertical spacing by @var{space}. -The default scaling indicator is @samp{p}. - -If @code{pvs} is called without an argument, the post-vertical spacing -is reset to the previous value before the last call to @code{pvs}. - -@code{gtroff} creates a warning of type @samp{range} if @var{space} is -zero or negative; the vertical spacing is then set to zero. - -The read-only number register @code{.pvs} contains the current -post-vertical spacing; it is associated with the current environment -(@pxref{Environments}). +Set the post-vertical spacing to, or alter it by, @var{space}. The +default scaling unit is @samp{p}. If @code{pvs} is called without an +argument, the post-vertical spacing is reset to the previous value +before the last call to @code{pvs}. GNU @code{troff} emits a warning in +category @samp{range} if @var{space} is negative; the post-vertical +spacing is then set to zero. + +The read-only register @code{.pvs} contains the post-vertical spacing; +it is associated with the environment (@pxref{Environments}). @endDefreq @c --------------------------------------------------------------------- -@node Fractional Type Sizes, , Changing Type Sizes, Sizes -@subsection Fractional Type Sizes +@c BEGIN Keep (roughly) parallel with subsection "Fractional type sizes +@c and new scaling units" of groff_diff(7). +@node Using Fractional Type Sizes, , Changing the Type Size, Manipulating Type Size and Vertical Spacing +@subsection Using Fractional Type Sizes @cindex fractional type sizes @cindex fractional point sizes @cindex type sizes, fractional @cindex point sizes, fractional -@cindex sizes, fractional - -@cindex @code{s} unit -@cindex unit, @code{s} -@cindex @code{z} unit -@cindex unit, @code{z} +@cindex sizes, fractional type + +AT&T @code{troff} interpreted all type size measurements in points. +Combined with integer arithmetic, this design choice made it impossible +to support, for instance, ten and a half-point type. In GNU +@code{troff}, an output device can select a scaling factor that +subdivides a point into ``scaled points''. A type size expressed in +scaled points can thus represent a non-integral type size. + +@cindex @code{s} scaling unit +@cindex unit, scaling, @code{s} +@cindex scaling unit @code{s} +@cindex @code{z} scaling unit +@cindex unit, scaling, @code{z} +@cindex scaling unit @code{z} @cindex @code{ps} request, with fractional type sizes @cindex @code{cs} request, with fractional type sizes @cindex @code{tkf} request, with fractional type sizes @cindex @code{\H}, with fractional type sizes @cindex @code{\s}, with fractional type sizes A @dfn{scaled point} is equal to @math{1/@var{sizescale}} points, where -@var{sizescale} is specified in the @file{DESC} file (1@tie{}by -default). There is a new scale indicator @samp{z}, which has the effect -of multiplying by @var{sizescale}. Requests and escape sequences in -@code{gtroff} interpret arguments that represent a point size as being -in units of scaled points, but they evaluate each such argument using a -default scale indicator of @samp{z}. Arguments treated in this way are -the argument to the @code{ps} request, the third argument to the -@code{cs} request, the second and fourth arguments to the @code{tkf} -request, the argument to the @code{\H} escape sequence, and those -variants of the @code{\s} escape sequence that take a numeric expression -as their argument (see below). - -For example, suppose @var{sizescale} is@tie{}1000; then a scaled point -is equivalent to a millipoint; the request @w{@samp{.ps 10.25}} is -equivalent to @w{@samp{.ps 10.25z}} and thus sets the point size to -10250@tie{}scaled points, which is equal to 10.25@tie{}points. - -@code{gtroff} disallows the use of the @samp{z} scale indicator in -instances where it would make no sense, such as a numeric expression -whose default scale indicator was neither @samp{u} nor @samp{z}. -Similarly it would make no sense to use a scaling indicator other than -@samp{z} or @samp{u} in a numeric expression whose default scale -indicator was @samp{z}, and so @code{gtroff} disallows this as well. - -There is also new scale indicator @samp{s}, which multiplies by the -number of units in a scaled point. So, for example, @samp{\n[.ps]s} is -equal to @samp{1m}. Be sure not to confuse the @samp{s} and @samp{z} -scale indicators. +@var{sizescale} is specified in the device description file @file{DESC}, +and defaults to@tie{}1.@footnote{@xref{Device and Font Description +Files}.} Requests and escape sequences in GNU @code{troff} interpret +arguments that represent a type size in scaled points, which the +formatter multiplies by @var{sizescale} and converts to an integer. +Arguments treated in this way comprise those to the escape sequences +@code{\H} and @code{\s}, to the request @code{ps}, the third argument to +the @code{cs} request, and the second and fourth arguments to the +@code{tkf} request. Scaled points may be specified explicitly with the +@code{z} scaling unit. + +For example, if @var{sizescale} is@tie{}1000, then a scaled point is one +thousandth of a point. The request @samp{.ps 10.5} is synonymous with +@samp{.ps 10.5z} and sets the type size to 10,500@tie{}scaled points, or +10.5@tie{}points. Consequently, in GNU @code{troff}, the register +@code{.s} can interpolate a non-integral type size. @Defreg {.ps} -A read-only number register returning the point size in scaled points. - -@code{.ps} is associated with the current environment -(@pxref{Environments}). +This read-only register interpolates the type size in scaled points; it +is associated with the environment (@pxref{Environments}). @endDefreg +It makes no sense to use the @samp{z} scaling unit in a numeric +expression whose default scaling unit is neither @samp{u} nor @samp{z}, +so GNU @code{troff} disallows this. Similarly, it is nonsensical to use +a scaling unit other than @samp{z} or @samp{u} in a numeric expression +whose default scaling unit is @samp{z}, and so GNU @code{troff} +disallows this as well. + +Another GNU @code{troff} scaling unit, @samp{s}, multiplies by the +number of basic units in a scaled point. Thus, @samp{\n[.ps]s} is equal +to @samp{1m} by definition. Do not confuse the @samp{s} and @samp{z} +scaling units. +@c END Keep (roughly) parallel with subsection "Fractional type sizes +@c and new scaling units" of groff_diff(7). + @DefregList {.psr} @DefregListEndx {.sr} +@cindex last-requested type size registers (@code{.psr}, @code{.sr}) +@cindex type size registers, last-requested (@code{.psr}, @code{.sr}) @cindex last-requested point size registers (@code{.psr}, @code{.sr}) @cindex point size registers, last-requested (@code{.psr}, @code{.sr}) @cindex @code{.ps} register, in comparison with @code{.psr} @cindex @code{.s} register, in comparison with @code{.sr} -The last-requested point size in scaled points is contained in the -@code{.psr} read-only number register. The last requested point size in -points as a decimal fraction can be found in @code{.sr}. This is a -string-valued read-only number register. - -Note that the requested point sizes are device-independent, whereas the -values returned by the @code{.ps} and @code{.s} registers are not. For -example, if a point size of 11@dmn{pt} is requested, and a @code{sizes} -request (or a @code{sizescale} line in a @file{DESC} file) specifies -10.95@dmn{pt} instead, this value is actually used. - -Both registers are associated with the current environment -(@pxref{Environments}). +Output devices may be limited in the type sizes they can employ. The +@code{.s} and @code{.ps} registers represent the type size selected by +the output driver as it understands a device's capability. The last +@emph{requested} type size is interpolated in scaled points by the +read-only register @code{.psr} and in points as a decimal fraction by +the read-only string-valued register @code{.sr}. Both are associated +with the environment (@pxref{Environments}). + +For example, if a type size of 10.95 points is requested, and the +nearest size permitted by a @code{sizes} request (or by the @code{sizes} +or @code{sizescale} directives in the device's @file{DESC} file) is 11 +points, the output driver uses the latter value. @endDefreg -The @code{\s} escape has the following syntax for working with -fractional type sizes: +The @code{\s} escape sequence offers the following syntax forms that +work with fractional type sizes and accept scaling units. You may of +course give them integral arguments. The delimited forms need not use +the neutral apostrophe; see @ref{Delimiters}. @table @code @item \s[@var{n}] @itemx \s'@var{n}' -Set the point size to @var{n}@tie{}scaled points; @var{n}@tie{}is a -numeric expression with a default scale indicator of @samp{z}. +Set the type size to @var{n}@tie{}scaled points; @var{n}@tie{}is a +numeric expression with a default scaling unit of @samp{z}. @item \s[+@var{n}] @itemx \s[-@var{n}] @@ -10735,120 +12035,305 @@ numeric expression with a default scale indicator of @samp{z}. @itemx \s'-@var{n}' @itemx \s+'@var{n}' @itemx \s-'@var{n}' -Increase or decrease the point size by @var{n}@tie{}scaled points; +Increase or decrease the type size by @var{n}@tie{}scaled points; @var{n}@tie{}is a numeric expression (which may start with a minus sign) -with a default scale indicator of @samp{z}. +with a default scaling unit of @samp{z}. @end table -@xref{Font Files}. + +@c ===================================================================== + +@c BEGIN Keep (roughly) parallel with section "Colors" of groff(7). +@node Colors, Strings, Manipulating Type Size and Vertical Spacing, GNU troff Reference +@section Colors +@cindex colors + +@cindex stroke color +@cindex color, stroke +@cindex fill color +@cindex color, fill +GNU @code{troff} supports color output with a variety of color spaces +and up to 16 bits per channel. Some devices, particularly terminals, +may be more limited. When color support is enabled, two colors are +current at any given time: the @dfn{stroke color}, with which glyphs, +rules (lines), and geometric objects like circles and polygons are +drawn, and the @dfn{fill color}, which can be used to paint the interior +of a closed geometric figure. + +@DefreqList {color, [@Var{n}]} +@DefregListEndx {.color} +If @var{n} is missing or non-zero, enable the output of color-related +device-independent output commands (this is the default); otherwise, +disable them. This request sets a global flag; it does not produce an +input token (@pxref{Gtroff Internals}). + +The read-only register @code{.color} is@tie{}1 if colors are enabled, +0@tie{}otherwise. + +Color can also be disabled with the @option{-c} command-line option. +@endDefreq + +@Defreq {defcolor, ident scheme color-component @dots{}} +Define a color named @var{ident}. @var{scheme} selects a color space +and determines the quantity of required @var{color-component}s; it must +be one of @samp{rgb} (three components), @samp{cmy} (three), @samp{cmyk} +(four), or @samp{gray} (one). @samp{grey} is accepted as a synonym of +@samp{gray}. The color components can be encoded as a single +hexadecimal value starting with @samp{#} or @samp{##}. The former +indicates that each component is in the range 0--255 (0--FF), the latter +the range 0--65,535 (0--FFFF). + +@Example +.defcolor half gray #7f +.defcolor pink rgb #FFC0CB +.defcolor magenta rgb ##ffff0000ffff +@endExample + +@cindex @code{f} scaling unit +@cindex unit, scaling, @code{f} +@cindex scaling unit @code{f} +Alternatively, each color component can be specified as a decimal +fraction in the range 0--1, interpreted using a default scaling +unit of@tie{}@code{f}, which multiplies its value by 65,536 (but +clamps it at 65,535). + +@Example +.defcolor gray50 rgb 0.5 0.5 0.5 +.defcolor darkgreen rgb 0.1f 0.5f 0.2f +@endExample +@endDefreq + +@cindex default color +@cindex color, default +Each output device has a color named @samp{default}, which cannot be +redefined. A device's default stroke and fill colors are not +necessarily the same. For the @code{dvi}, @code{html}, @code{pdf}, +@code{ps}, and @code{xhtml} output devices, GNU @code{troff} +automatically loads a macro file defining many color names at startup. +By the same mechanism, the devices supported by @code{grotty} recognize +the eight standard ISO@tie{}6429/EMCA-48 color names.@footnote{also +known vulgarly as ``ANSI colors''} + +@DefreqList {gcolor, [@Var{color}]} +@DefescItemx {\\m, , c, } +@DefescItem {\\m, (, co, } +@DefescItem {\\m, [, color, ]} +@DefregListEndx {.m} +Set the stroke color to @var{color}. + +@Example +.gcolor red +The next words +.gcolor +\m[red]are in red\m[] +and these words are in the previous color. +@endExample + +The escape sequence @code{\m[]} restores the previous stroke color, as +does a @code{gcolor} request without an argument. + +@cindex stroke color name register (@code{.m}) +@cindex name, stroke color, register (@code{.m}) +@cindex color name, stroke, register (@code{.m}) +The name of the current stroke color is available in the read-only +string-valued register @samp{.m}; it is associated with the environment +(@pxref{Environments}). It interpolates nothing when the stroke color +is the default. + +@code{\m} doesn't produce an input token in GNU @code{troff} +(@pxref{Gtroff Internals}). It therefore can be used in requests like +@code{mc} (which expects a single character as an argument) to change +the color on the fly: + +@Example +.mc \m[red]x\m[] +@endExample +@endDefesc + +@DefreqList {fcolor, [@Var{color}]} +@DefescItemx {\\M, , c, } +@DefescItem {\\M, (, co, } +@DefescItem {\\M, [, color, ]} +@DefregListEndx {.M} +Set the fill color for objects drawn with @code{\D'@dots{}'} escape +sequences. The escape sequence @code{\M[]} restores the previous fill +color, as does an @code{fcolor} request without an argument. + +@cindex background color name register (@code{.M}) +@cindex name, background color, register (@code{.M}) +@cindex color name, background, register (@code{.M}) +@cindex fill color name register (@code{.M}) +@cindex name, fill color, register (@code{.M}) +@cindex color name, fill, register (@code{.M}) +The name of the current fill color is available in the read-only +string-valued register @samp{.M}; it is associated with the environment +(@pxref{Environments}). It interpolates nothing when the fill color +is the default. @code{\M} doesn't produce an input token in GNU +@code{troff}. + +Create an ellipse with a red interior as follows. + +@Example +\M[red]\h'0.5i'\D'E 2i 1i'\M[] +@endExample +@endDefesc +@c END Keep (roughly) parallel with section "Colors" of groff(7). @c ===================================================================== -@node Strings, Conditionals and Loops, Sizes, gtroff Reference +@c BEGIN Keep (roughly) parallel with section "Strings" of groff(7). +@node Strings, Conditionals and Loops, Colors, GNU troff Reference @section Strings @cindex strings -@code{gtroff} has string variables, which are entirely for user -convenience (i.e.@: there are no built-in strings except @code{.T}, but -even this is a read-write string variable). +GNU @code{troff} supports strings primarily for user convenience. +Conventionally, if one would define a macro only to interpolate a small +amount of text, without invoking requests or calling any other macros, +one defines a string instead. Only one string is predefined by the +language. -Although the following requests can be used to create strings, -simply using an undefined string will cause it to be defined as empty. -@xref{Identifiers}. +@Defstr {.T} +@stindex .T +@cindex output device name string (@code{.T}) +Contains the name of the output device (for example, @samp{utf8} or +@samp{pdf}). +@endDefmpstr + +The @code{ds} request creates a string with a specified name and +contents and the @code{\*} escape sequence dereferences its name, +interpolating its contents. If the string named by the @code{\*} escape +sequence does not exist, it is defined as empty, nothing is +interpolated, and a warning in category @samp{mac} is emitted. +@xref{Warnings}, for information about the enablement and suppression of +warnings. -@DefreqList {ds, name [@Var{string}]} -@DefreqItemx {ds1, name [@Var{string}]} +@DefreqList {ds, name [@Var{contents}]} +@DefreqItemx {ds1, name [@Var{contents}]} @DefescItemx {\\*, , n, } -@DefescItem {\\*, @Lparen{}, nm, } -@DefescListEnd {\\*, @Lbrack{}, name arg1 arg2 @dots{}, @Rbrack{}} +@DefescItem {\\*, (, nm, } +@c XXX: Can't mark the parameters with @Var because @Var gets called +@c recursively if we do. +@c @DefescListEnd {\\*, [, name [@Var{arg1} @Var{arg2} @dots{}], ]} +@DefescListEnd {\\*, [, name @sansserif{[}arg1 arg2 @dots{}@sansserif{]}, ]} @cindex string interpolation (@code{\*}) @cindex string expansion (@code{\*}) @cindex interpolation of strings (@code{\*}) @cindex expansion of strings (@code{\*}) @cindex string arguments -@cindex arguments, of strings -Define and access a string variable @var{name} (one-character -name@tie{}@var{n}, two-character name @var{nm}). If @var{name} already -exists, @code{ds} overwrites the previous definition. Only the syntax -form using brackets can take arguments that are handled identically to -macro arguments; the single exception is that a closing bracket as an -argument must be enclosed in double quotes. @xref{Request and Macro -Arguments}, and @ref{Parameters}. - -Example: +@cindex arguments, to strings +Define a string called @var{name} with contents @var{contents}. If +@var{name} already exists as an alias, the target of the alias is +redefined; see @code{als} and @code{rm} below. If @code{ds} is called +with only one argument, @var{name} is defined as an empty string. +Otherwise, GNU @code{troff} stores @var{contents} in copy +mode.@footnote{@xref{Copy Mode}.} + +The @code{\*} escape sequence interpolates a previously defined string +variable @var{name} (one-character name@tie{}@var{n}, two-character name +@var{nm}). The bracketed interpolation form accepts arguments that are +handled as macro arguments are; recall @ref{Calling Macros}. In +contrast to macro calls, however, if a closing bracket @samp{]} occurs +in a string argument, that argument must be enclosed in double quotes. +@code{\*} is interpreted even in copy mode. When defining strings, +argument interpolations must be escaped if they are to reference +parameters from the calling context; @xref{Parameters}. + +@Example +.ds cite (\\$1, \\$2) +Gray codes are explored in \*[cite Morgan 1998]. + @result{} Gray codes are explored in (Morgan, 1998). +@endExample + +@c TODO: Consider examples of recursive string calls, particularly where +@c one interpolation is constructed from the argument of an enclosing +@c macro, to illustrate ".ds a \$1 \\$1". +@c +@c @Example +@c .ds a \\$1 wildebeest +@c .ds b big, \*[a hairy] +@c I see a \*[b]. +@c @result{} I see a big, hairy wildebeest. +@c @endExample + +@cindex trailing spaces in string definitions and appendments +@cindex comments, with @code{ds} +@cindex @code{ds} request, and comments +@strong{Caution:@:} Unlike other requests, the second argument to the +@code{ds} request consumes the remainder of the input line, including +trailing spaces. This means that comments on a line with such a request +can introduce unwanted space into a string when they are set off from +the material they annotate, as is conventional. @Example -.ds foo a \\$1 test -. -This is \*[foo nice]. - @result{} This is a nice test. +.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O \" water @endExample -The @code{\*} escape @dfn{interpolates} (expands in-place) a -previously defined string variable. To be more precise, the stored -string is pushed onto the input stack, which is then parsed by -@code{gtroff}. Similar to number registers, it is possible to nest -strings, i.e., string variables can be called within string variables. - -If the string named by the @code{\*} escape does not exist, it is -defined as empty, and a warning of type @samp{mac} is emitted (see -@ref{Debugging}, for more details). - -@cindex comments, with @code{ds} -@cindex @code{ds} request, and comments -@strong{Caution:} Unlike other requests, the second argument to the -@code{ds} request takes up the entire line including trailing spaces. -This means that comments on a line with such a request can introduce -unwanted space into a string. +@noindent +Instead, place the comment on another line or put the comment escape +sequence immediately adjacent to the last character of the string. @Example -.ds TeX T\h'-.2m'\v'.2m'E\v'-.2m'\h'-.1m'X \" Knuth's TeX +.ds H2O H\v'+.3m'\s'-2'2\v'-.3m'\s0O\" water @endExample -@noindent -Instead the comment should be put on another line or have the comment -escape adjacent with the end of the string. +Ending string definitions (and appendments) with a comment, even an +empty one, prevents unwanted space from creeping into them during source +document maintenance. @Example -.ds TeX T\h'-.2m'\v'.2m'E\v'-.2m'\h'-.1m'X\" Knuth's TeX +.ds author Alice Pleasance Liddell\" +.ds empty \" might be appended to later with .as @endExample -@cindex trailing quotes -@cindex quotes, trailing +@cindex trailing double quotes in strings +@cindex double quotes, trailing, in strings +@cindex @code{ds} request, and double quotes @cindex leading spaces with @code{ds} @cindex spaces with @code{ds} @cindex @code{ds} request, and leading spaces -To produce leading space the string can be started with a double quote. -No trailing quote is needed; in fact, any trailing quote is included in -your string. +An initial neutral double quote @code{"} in @var{contents} is stripped +to allow embedding of leading spaces. Any other @code{"} is interpreted +literally, but it is wise to use the special character escape sequence +@code{\[dq]} instead if the string might be interpolated as part of a +macro argument; see @ref{Calling Macros}. +@c Examples should be more accessible than Unix nerd stuff like this, +@c but in general document authors shouldn't want to use "straight" +@c double quotes for ordinary prose anyway. Also, 56 chars is as fat +@c as these examples can get and not overrun the right margin in PDF. @Example -.ds sign " Yours in a white wine sauce, +.ds salutation " Yours in a white wine sauce,\" +.ds c-var-defn " char mydate[]=\[dq]2020-07-29\[dq];\" @endExample @cindex multi-line strings @cindex strings, multi-line @cindex newline character, in strings, escaping @cindex escaping newline characters, in strings -Strings are not limited to a single line of text. A string can span -several lines by escaping the newlines with a backslash. The resulting -string is stored @emph{without} the newlines. +Strings are not limited to a single input line of text. +@code{\@key{RET}} works just as it does elsewhere. The resulting string +is stored @emph{without} the newlines. Care is therefore required when +interpolating strings while filling is disabled. @Example -.ds foo lots and lots \ -of text are on these \ -next several lines +.ds foo This string contains \ +text on multiple lines \ +of input. @endExample -It is not possible to have real newlines in a string. To put a single -double quote character into a string, use two consecutive double quote -characters. +It is not possible to embed a newline in a string that will be +interpreted as such when the string is interpolated. To achieve that +effect, use @code{\*} to interpolate a macro instead; see @ref{Punning +Names}. -The @code{ds1} request turns off compatibility mode while interpreting a -string. To be more precise, a @dfn{compatibility save} input token is -inserted at the beginning of the string, and a @dfn{compatibility -restore} input token at the end. +Because strings are similar to macros, they too can be defined so as to +suppress AT&T @code{troff} compatibility mode when used; see +@ref{Writing Macros} and @ref{Compatibility Mode}. The @code{ds1} +request defines a string such that compatibility mode is off when the +string is later interpolated. To be more precise, a @dfn{compatibility +save} input token is inserted at the beginning of the string, and a +@dfn{compatibility restore} input token at the end. @Example .nr xxx 12345 @@ -10858,153 +12343,75 @@ restore} input token at the end. .cp 1 . \*(aa - @result{} warning: number register `[' not defined + @error{} warning: register '[' not defined @result{} The value of xxx is 0xxx]. \*(bb @result{} The value of xxx is 12345. @endExample +@endDefreq -@cindex name space, common, of macros, diversions, and strings -@cindex common name space of macros, diversions, and strings -@cindex macros, shared name space with strings and diversions -@cindex strings, shared name space with macros and diversions -@cindex diversions, shared name space with macros and strings -Strings, macros, and diversions (and boxes) share the same name space. -Internally, even the same mechanism is used to store them. This has -some interesting consequences. For example, it is possible to call a -macro with string syntax and vice versa. +@DefreqList {as, name [@Var{contents}]} +@DefreqListEndx {as1, name [@Var{contents}]} +@cindex appending to a string (@code{as}) +@cindex string, appending (@code{as}) +The @code{as} request is similar to @code{ds} but appends @var{contents} +to the string stored as @var{name} instead of redefining it. If +@var{name} doesn't exist yet, it is created. If @code{as} is called +with only one argument, no operation is performed (beyond dereferencing +the string). @Example -.de xxx -a funny test. -.. -This is \*[xxx] - @result{} This is a funny test. - -.ds yyy a funny test -This is -.yyy - @result{} This is a funny test. +.as salutation " with shallots, onions and garlic,\" @endExample -In particular, interpolating a string does not hide existing macro -arguments. Thus in a macro, a more efficient way of doing +The @code{as1} request is similar to @code{as}, but compatibility mode +is switched off when the appended portion of the string is later +interpolated. To be more precise, a @dfn{compatibility save} input +token is inserted at the beginning of the appended string, and a +@dfn{compatibility restore} input token at the end. +@endDefreq -@Example -.xx \\$@@ -@endExample +Several requests exist to perform rudimentary string operations. +Strings can be queried (@code{length}) and modified (@code{chop}, +@code{substring}, @code{stringup}, @code{stringdown}), and their names +can be manipulated through renaming, removal, and aliasing (@code{rn}, +@code{rm}, @code{als}). -@noindent -is +@Defreq {length, reg anything} +@cindex length of a string (@code{length}) +@cindex string, length of (@code{length}) +@cindex @code{length} request, and copy mode +@cindex copy mode, and @code{length} request +@cindex mode, copy, and @code{length} request +Compute the number of characters of @var{anything} and store the count +in the register @var{reg}. If @var{reg} doesn't exist, it is created. +@var{anything} is read in copy mode. @Example -\\*[xx]\\ +.ds xxx abcd\h'3i'efgh +.length yyy \*[xxx] +\n[yyy] + @result{} 14 @endExample +@endDefreq -@noindent -Note that the latter calling syntax doesn't change the value of -@code{\$0}, which is then inherited from the calling macro. - -Diversions and boxes can be also called with string syntax. +@Defreq {chop, object} +Remove the last character from the macro, string, or diversion named +@var{object}. This is useful for removing the newline from the end of a +diversion that is to be interpolated as a string. This request can be +used repeatedly on the same @var{object}; see @ref{Gtroff Internals}, +for details on nodes inserted additionally by GNU @code{troff}. +@endDefreq -Another consequence is that you can copy one-line diversions or boxes to -a string. - -@Example -.di xxx -a \fItest\fR -.br -.di -.ds yyy This is \*[xxx]\c -\*[yyy]. - @result{} @r{This is a }@i{test}. -@endExample - -@noindent -As the previous example shows, it is possible to store formatted output -in strings. The @code{\c} escape prevents the insertion of an -additional blank line in the output. - -Copying diversions longer than a single output line produces unexpected -results. - -@Example -.di xxx -a funny -.br -test -.br -.di -.ds yyy This is \*[xxx]\c -\*[yyy]. - @result{} test This is a funny. -@endExample - -Usually, it is not predictable whether a diversion contains one or more -output lines, so this mechanism should be avoided. With Unix -@code{troff}, this was the only solution to strip off a final newline -from a diversion. Another disadvantage is that the spaces in the copied -string are already formatted, making them unstretchable. This can cause -ugly results. - -@cindex stripping final newline in diversions -@cindex diversion, stripping final newline -@cindex final newline, stripping in diversions -@cindex newline, final, stripping in diversions -@cindex horizontal space, unformatting -@cindex space, horizontal, unformatting -@cindex unformatting horizontal space -A clean solution to this problem is available in GNU @code{troff}, using -the requests @code{chop} to remove the final newline of a diversion, and -@code{unformat} to make the horizontal spaces stretchable again. - -@Example -.box xxx -a funny -.br -test -.br -.box -.chop xxx -.unformat xxx -This is \*[xxx]. - @result{} This is a funny test. -@endExample - -@xref{Gtroff Internals}, for more information. -@endDefreq - -@DefreqList {as, name [@Var{string}]} -@DefreqListEndx {as1, name [@Var{string}]} -@cindex appending to a string (@code{as}) -@cindex string, appending (@code{as}) -The @code{as} request is similar to @code{ds} but appends @var{string} -to the string stored as @var{name} instead of redefining it. If -@var{name} doesn't exist yet, it is created. - -@Example -.as sign " with shallots, onions and garlic, -@endExample - -The @code{as1} request is similar to @code{as}, but compatibility mode -is switched off while the appended string is interpreted. To be more -precise, a @dfn{compatibility save} input token is inserted at the -beginning of the appended string, and a @dfn{compatibility restore} -input token at the end. -@endDefreq - -Rudimentary string manipulation routines are given with the next two -requests. - -@Defreq {substring, str n1 [@Var{n2}]} -@cindex substring (@code{substring}) -Replace the string named @var{str} with the substring defined by the -indices @var{n1} and @var{n2}. The first character in the string has -index@tie{}0. If @var{n2} is omitted, it is implicitly set to the -largest valid value (the string length minus one). If the index value -@var{n1} or @var{n2} is negative, it is counted from the end of the -string, going backwards: The last character has index@tie{}@minus{}1, -the character before the last character has index@tie{}@minus{}2, etc. +@Defreq {substring, str start [@Var{end}]} +@cindex substring (@code{substring}) +Replace the string named @var{str} with its substring bounded by the +indices @var{start} and @var{end}, inclusively. The first character in +the string has index@tie{}0. If @var{end} is omitted, it is implicitly +set to the largest valid value (the string length minus one). Negative +indices count backward from the end of the string:@: the last character +has index@tie{}@minus{}1, the character before the last has +index@tie{}@minus{}2, and so on. @Example .ds xxx abcdefgh @@ -11017,25 +12424,35 @@ the character before the last character has index@tie{}@minus{}2, etc. @endExample @endDefreq -@Defreq {length, reg str} -@cindex length of a string (@code{length}) -@cindex string, length of (@code{length}) -@cindex @code{length} request, and copy-in mode -@cindex copy-in mode, and @code{length} request -@cindex mode, copy-in, and @code{length} request -Compute the number of characters of @var{str} and return it in the -number register @var{reg}. If @var{reg} doesn't exist, it is created. -@code{str} is read in copy mode. - -@Example -.ds xxx abcd\h'3i'efgh -.length yyy \*[xxx] -\n[yyy] - @result{} 14 +@DefreqList {stringdown, str} +@DefreqListEndx {stringup, str} +@cindex case-transforming a string (@code{stringdown}, @code{stringup}) +@cindex uppercasing a string (@code{stringup}) +@cindex lowercasing a string (@code{stringdown}) +@cindex up-casing a string (@code{stringup}) +@cindex down-casing a string (@code{stringdown}) +Alter the string named @var{str} by replacing each of its bytes with its +lowercase (@code{stringdown}) or uppercase (@code{stringup}) version (if +one exists). Special characters in the string will often transform in +the expected way due to the regular naming convention for accented +characters. When they do not, use substrings and/or catenation. + +@Example +.ds resume R\['e]sum\['e] +\*[resume] +.stringdown resume +\*[resume] +.stringup resume +\*[resume] + @result{} Résumé résumé RÉSUMÉ @endExample @endDefreq -@Defreq {rn, xx yy} +(In practice, we would end the @code{ds} request with a comment escape +@code{\"} to prevent space from creeping into the definition during +source document maintenance.) + +@Defreq {rn, old new} @cindex renaming request (@code{rn}) @cindex request, renaming (@code{rn}) @cindex renaming macro (@code{rn}) @@ -11044,10 +12461,10 @@ number register @var{reg}. If @var{reg} doesn't exist, it is created. @cindex string, renaming (@code{rn}) @cindex renaming diversion (@code{rn}) @cindex diversion, renaming (@code{rn}) -Rename the request, macro, diversion, or string @var{xx} to @var{yy}. +Rename the request, macro, diversion, or string @var{old} to @var{new}. @endDefreq -@Defreq {rm, xx} +@Defreq {rm, name} @cindex removing request (@code{rm}) @cindex request, removing (@code{rm}) @cindex removing macro (@code{rm}) @@ -11056,8 +12473,9 @@ Rename the request, macro, diversion, or string @var{xx} to @var{yy}. @cindex string, removing (@code{rm}) @cindex removing diversion (@code{rm}) @cindex diversion, removing (@code{rm}) -Remove the request, macro, diversion, or string @var{xx}. @code{gtroff} -treats subsequent invocations as if the object had never been defined. +Remove the request, macro, diversion, or string @var{name}. GNU +@code{troff} treats subsequent invocations as if the name had never +been defined. @endDefreq @anchor{als} @@ -11068,22 +12486,21 @@ treats subsequent invocations as if the object had never been defined. @cindex creating alias, for string (@code{als}) @cindex creating alias, for macro (@code{als}) @cindex creating alias, for diversion (@code{als}) -@cindex string, creating alias (@code{als}) -@cindex macro, creating alias (@code{als}) -@cindex diversion, creating alias (@code{als}) -Create an alias named @var{new} for the request, string, macro, or -diversion object named @var{old}. The new name and the old name are -exactly equivalent (it is similar to a hard rather than a soft link). If -@var{old} is undefined, @code{gtroff} generates a warning of type -@samp{mac} and ignores the request. - -To understand how the @code{als} request works it is probably best to -think of two different pools: one pool for objects (macros, strings, -etc.), and another one for names. As soon as an object is defined, -@code{gtroff} adds it to the object pool, adds its name to the name -pool, and creates a link between them. When @code{als} creates an -alias, it adds a new name to the name pool that gets linked to the same -object as the old name. +@cindex string, creating alias for (@code{als}) +@cindex macro, creating alias for (@code{als}) +@cindex diversion, creating alias for (@code{als}) +Create an alias @var{new} for the existing request, string, macro, or +diversion object named @var{old}, causing the names to refer to the same +stored object. If @var{old} is undefined, a warning in category +@samp{mac} is produced, and the request is ignored. @xref{Warnings}, +for information about the enablement and suppression of warnings. + +To understand how the @code{als} request works, consider two different +storage pools:@: one for objects (macros, strings, etc.), and another +for names. As soon as an object is defined, GNU @code{troff} adds it to +the object pool, adds its name to the name pool, and creates a link +between them. When @code{als} creates an alias, it adds a new name to +the name pool that gets linked to the same object as the old name. Now consider this example. @@ -11098,15 +12515,17 @@ Now consider this example. .. . .bar - @result{} input stack limit exceeded + @error{} input stack limit exceeded (probable infinite + @error{} loop) @endExample @noindent -The definition of macro @code{bar} replaces the old object this name is -linked to. However, the alias to @code{foo} is still active! In -other words, @code{foo} is still linked to the same object as -@code{bar}, and the result of calling @code{bar} is an infinite, -recursive loop that finally leads to an error. +In the above, @code{bar} remains an @emph{alias}---another name +for---the object referred to by @code{foo}, which the second @code{de} +request replaces. Alternatively, imagine that the @code{de} request +@emph{dereferences} its argument before replacing it. Either way, the +result of calling @code{bar} is a recursive loop that finally leads to +an error. @xref{Writing Macros}. @cindex alias, string, removing (@code{rm}) @cindex alias, macro, removing (@code{rm}) @@ -11114,184 +12533,264 @@ recursive loop that finally leads to an error. @cindex removing alias, for string (@code{rm}) @cindex removing alias, for macro (@code{rm}) @cindex removing alias, for diversion (@code{rm}) -@cindex string, removing alias (@code{rm}) -@cindex macro, removing alias (@code{rm}) -@cindex diversion, removing alias (@code{rm}) -To undo an alias, simply call @code{rm} on the aliased name. The object -itself is not destroyed until there are no more aliases. -@endDefreq - -@Defreq {chop, xx} -Remove (chop) the last character from the macro, string, or diversion -named @var{xx}. This is useful for removing the newline from the end of -diversions that are to be interpolated as strings. This command can be -used repeatedly; see @ref{Gtroff Internals}, for details on nodes -inserted additionally by @code{gtroff}. +@cindex string, removing alias for (@code{rm}) +@cindex macro, removing alias for (@code{rm}) +@cindex diversion, removing alias for (@code{rm}) +To remove an alias, call @code{rm} on its name. The object itself is +not destroyed until it has no more names. + +When a request, macro, string, or diversion is aliased, redefinitions +and appendments ``write through'' alias names. To replace an alias with +a separately defined object, you must use the @code{rm} request on its +name first. @endDefreq - -@xref{Identifiers}, and @ref{Comments}. +@c END Keep (roughly) parallel with section "Strings" of groff(7). @c ===================================================================== -@node Conditionals and Loops, Writing Macros, Strings, gtroff Reference +@node Conditionals and Loops, Writing Macros, Strings, GNU troff Reference @section Conditionals and Loops @cindex conditionals and loops @cindex loops and conditionals +@code{groff} has @code{if} and @code{while} control structures like +other languages. However, the syntax for grouping multiple input lines +in the branches or bodies of these structures is unusual. + @menu * Operators in Conditionals:: +* if-then:: * if-else:: +* Conditional Blocks:: * while:: @end menu @c --------------------------------------------------------------------- -@node Operators in Conditionals, if-else, Conditionals and Loops, Conditionals and Loops +@c BEGIN Keep (roughly) parallel with subsection "Conditional +@c expressions" of groff(7). +@node Operators in Conditionals, if-then, Conditionals and Loops, Conditionals and Loops @subsection Operators in Conditionals @cindex @code{if} request, operators to use with @cindex @code{ie} request, operators to use with @cindex @code{while} request, operators to use with -In @code{if}, @code{ie}, and @code{while} requests, in addition to ordinary -@ref{Expressions}, there are several more operators available: +@cindex conditional expressions +@cindex expressions, conditional +In @code{if}, @code{ie}, and @code{while} requests, in addition to the +numeric expressions described in @ref{Numeric Expressions}, several +Boolean operators are available; the members of this expanded class are +termed @dfn{conditional expressions}. @table @code +@item c @var{glyph} +True if @var{glyph} is available, where @var{glyph} is an ordinary +character, a special character @samp{\(@var{xx}} or @samp{\[@var{xxx}]}, +@samp{\N'@var{xxx}'}, or has been defined by any of the @code{char}, +@code{fchar}, @code{fschar}, or @code{schar} requests. + +@item d @var{name} +True if a string, macro, diversion, or request called @var{name} exists. + @item e -@itemx o -True if the current page is even or odd numbered (respectively). +True if the current page is even-numbered. + +@item F @var{font} +True if @var{font} exists. @var{font} is handled as if it were opened +with the @code{ft} request (that is, font translation and styles are +applied), without actually mounting it. + +@item m @var{color} +True if @var{color} is defined. @item n @cindex conditional output for terminal (TTY) @cindex TTY, conditional output for @cindex terminal, conditional output for -True if the document is being processed in nroff mode (i.e., the -@code{.nroff} command has been issued). @xref{Troff and Nroff Mode}. +True if the document is being processed in @code{nroff} mode. +@xref{@code{troff} and @code{nroff} Modes}. + +@item o +True if the current page is odd-numbered. + +@item r @var{register} +True if @var{register} exists. + +@item S @var{style} +True if @var{style} is available for the current font family. Font +translation is applied. @item t -True if the document is being processed in troff mode (i.e., the -@code{.troff} command has been issued). @xref{Troff and Nroff Mode}. +True if the document is being processed in @code{troff} mode. +@xref{@code{troff} and @code{nroff} Modes}. +@pindex vtroff @item v -Always false. This condition is for compatibility with other -@code{troff} versions only (identifying a @code{-Tversatec} device). - -@item '@var{xxx}'@var{yyy}' -True if the output produced by @var{xxx} is equal to the output produced -by @var{yyy}. Other characters can be used in place of the single -quotes; the same set of delimiters as for the @code{\D} escape is used -(@pxref{Escapes}). @code{gtroff} formats @var{xxx} and @var{yyy} in -separate environments; after the comparison the resulting data is -discarded. - -@Example -.ie "|"\fR|\fP" \ -true -.el \ -false +Always false. This condition is recognized only for compatibility with +certain other @code{troff} implementations.@footnote{This refers to +@code{vtroff}, a translator that would convert the C/A/T output from +early-vintage @acronym{AT&T} @code{troff} to a form suitable for +Versatec and Benson-Varian plotters.} +@end table + +If the first argument to an @code{if}, @code{ie}, or @code{while} +request begins with a non-alphanumeric character apart from @code{!} +(see below); it performs an @slanted{output comparison test}. +@footnote{Strictly, letters not otherwise recognized @emph{are} treated +as output comparison delimiters. For portability, it is wise to avoid +using letters not in the list above; for example, Plan@tie{}9 +@code{troff} uses @samp{h} to test a mode it calls @code{htmlroff}, and +GNU @code{troff} may provide additional operators in the future.} + +@cindex output comparison operator +@table @code +@item @code{'}@var{xxx}@code{'}@var{yyy}@code{'} +True if formatting the comparands @var{xxx} and @var{yyy} produces the +same output commands. The delimiter need not be a neutral apostrophe: +the output comparison operator accepts the same delimiters as most +escape sequences; see @ref{Delimiters}. This @dfn{output comparison +operator} formats @var{xxx} and @var{yyy} in separate environments; +after the comparison, the resulting data are discarded. + +@Example +.ie "|"\fR|\fP" true +.el false @result{} true @endExample @noindent -The resulting motions, glyph sizes, and fonts have to -match,@footnote{The created output nodes must be identical. -@xref{Gtroff Internals}.} and not the individual motion, size, and font -requests. In the previous example, @samp{|} and @samp{\fR|\fP} both -result in a roman @samp{|} glyph with the same point size and at the -same location on the page, so the strings are equal. If -@samp{.ft@tie{}I} had been added before the @samp{.ie}, the result would -be ``false'' because (the first) @samp{|} produces an italic @samp{|} -rather than a roman one. +The resulting glyph properties, including font family, style, size, and +slant, must match, but not necessarily the requests and/or escape +sequences used to obtain them. In the previous example, @samp{|} and +@samp{\fR|\fP} result in @samp{|} glyphs in the same typefaces at the +same positions, so the comparands are equal. If @samp{.ft@tie{}I} had +been added before the @samp{.ie}, they would differ: the first @samp{|} +would produce an italic @samp{|}, not a roman one. Motions must match +in orientation and magnitude to within the applicable horizontal and +vertical motion quanta of the device, after rounding. @samp{.if +"\u\d"\v'0'"} is false even though both comparands result in zero net +motion, because motions are not interpreted or optimized but sent as-is +to the output.@footnote{Because formatting of the comparands takes place +in a dummy environment, vertical motions within them cannot spring +traps.} On the other hand, @samp{.if "\d"\v'0.5m'"} is true, because +@code{\d} is defined as a downward motion of one-half em.@footnote{All +of this is to say that the lists of output nodes created by formatting +@var{xxx} and @var{yyy} must be identical. @xref{Gtroff Internals}.} @cindex string comparison @cindex comparison of strings -To compare strings without processing, surround the data with @code{\?}. +Surround the comparands with @code{\?} to avoid formatting them; this +causes them to be compared character by character, as with string +comparisons in other programming languages. @Example -.ie "\?|\?"\?\fR|\fP\?" \ -true -.el \ -false +.ie "\?|\?"\?\fR|\fP\?" true +.el false @result{} false @endExample -@cindex @code{\?}, and copy-in mode -@cindex copy-in mode, and @code{\?} -@cindex mode, copy-in, and @code{\?} +@cindex @code{\?}, and copy mode +@cindex copy mode, and @code{\?} +@cindex mode, copy, and @code{\?} @noindent -Since data protected with @code{\?} is read in copy-in mode it is even -possible to use incomplete input without causing an error. +Since comparands protected with @code{\?} are read in copy mode +(@pxref{Copy Mode}), they need not even be valid @code{groff} syntax. +The escape character is still lexically recognized, however, and +consumes the next character. @Example .ds a \[ .ds b \[ -.ie '\?\*a\?'\?\*b\?' \ -true -.el \ -false - @result{} true +.if '\?\*a\?'\?\*b\?' a and b equivalent +.if '\?\\?'\?\\?' backslashes equivalent + @result{} a and b equivalent +@c slack lines for pagination control +@c @error{} warning: missing closing delimiter in +@c @error{} conditional expression (got newline) @endExample +@end table -@item r @var{xxx} -True if there is a number register named @var{xxx}. - -@item d @var{xxx} -True if there is a string, macro, diversion, or request named @var{xxx}. - -@item m @var{xxx} -True if there is a color named @var{xxx}. +The above operators can't be combined with most others, but a leading +@samp{!}, not followed immediately by spaces or tabs, complements an +expression. -@item c @var{g} -True if there is a glyph @var{g} available@footnote{The name of this -conditional operator is a misnomer since it tests names of output -glyphs.}; @var{g} is either an @acronym{ASCII} character or a special -character (@code{\N'@var{xxx}'}, @code{\(@var{gg}} or -@code{\[@var{ggg}]}); the condition is also true if @var{g} has been -defined by the @code{char} request. +@Example +.nr x 1 +.ie !r x register x is not defined +.el register x is defined + @result{} register x is defined +@endExample -@item F @var{font} -True if a font named @var{font} exists. @var{font} is handled as if it -was opened with the @code{ft} request (that is, font translation and -styles are applied), without actually mounting it. +Spaces and tabs are optional immediately after the @samp{c}, @samp{d}, +@samp{F}, @samp{m}, @samp{r}, and @samp{S} operators, but right after +@samp{!}, they end the predicate and the conditional evaluates +true.@footnote{This bizarre behavior maintains compatibility with +@acronym{AT&T} @code{troff}.} -This test doesn't load the complete font but only its header to verify -its validity. +@Example +.nr x 1 +.ie ! r x register x is not defined +.el register x is defined + @result{} r x register x is not defined +@endExample -@item S @var{style} -True if style @var{style} has been registered. Font translation is -applied. -@end table +@noindent +The unexpected @samp{r x} in the output is a clue that our conditional +was not interpreted as we planned, but matters may not always be so +obvious. +@c END Keep (roughly) parallel with subsection "Conditional expressions" +@c of groff(7). -Note that these operators can't be combined with other operators like -@samp{:} or @samp{&}; only a leading @samp{!} (without whitespace -between the exclamation mark and the operator) can be used to negate the -result. +@c --------------------------------------------------------------------- -@Example -.nr xxx 1 -.ie !r xxx \ -true -.el \ -false - @result{} false +@node if-then, if-else, Operators in Conditionals, Conditionals and Loops +@subsection if-then +@cindex if-then + +@Defreq {if, cond-expr anything} +Evaluate the conditional expression @var{cond-expr}, and if it evaluates +true (or to a positive value), interpret the remainder of the line +@var{anything} as if it were an input line. Recall from @ref{Invoking +Requests} that any quantity of spaces between arguments to requests +serves only to separate them; leading spaces in @var{anything} are thus +not seen. @var{anything} effectively @emph{cannot} be omitted; if +@var{cond-expr} is true and @var{anything} is empty, the newline at the +end of the control line is interpreted as a blank input line (and +therefore a blank text line). + +@Example +super\c +tanker +.nr force-word-break 1 +super\c +.if ((\n[force-word-break] = 1) & \n[.int]) +tanker + @result{} supertanker super tanker @endExample +@endDefreq -A whitespace after @samp{!} always evaluates to zero (this bizarre -behaviour is due to compatibility with Unix @code{troff}). +@Defreq {nop, anything} +Interpret @var{anything} as if it were an input line. This is similar +to @samp{.if@tie{}1}. @code{nop} is not really ``no operation''; its +argument @emph{is} processed---unconditionally. It can be used to cause +text lines to share indentation with surrounding control lines. @Example -.nr xxx 1 -.ie ! r xxx \ -true -.el \ -false - @result{} r xxx true +.als real-MAC MAC +.de wrapped-MAC +. tm MAC: called with arguments \\$@@ +. nop \\*[real-MAC]\\ +.. +.als MAC wrapped-MAC +\# Later... +.als MAC real-MAC @endExample -It is possible to omit the whitespace before the argument to the -@samp{r}, @samp{d}, and @samp{c} operators. - -@xref{Expressions}. +In the above, we've used aliasing, @code{nop}, and the interpolation of +a macro as a string to interpose a wrapper around the macro @samp{MAC} +(perhaps to debug it). +@endDefreq @c --------------------------------------------------------------------- @@ -11299,75 +12798,155 @@ It is possible to omit the whitespace before the argument to the @subsection if-else @cindex if-else -@code{gtroff} has if-then-else constructs like other languages, although -the formatting can be painful. +@DefreqList {ie, cond-expr anything} +@DefreqListEndx {el, anything} +Use the @code{ie} and @code{el} requests to write an if-then-else. The +first request is the ``if'' part and the latter is the ``else'' part. +Unusually among programming languages, any number of non-conditional +requests may be interposed between the @code{ie} branch and the +@code{el} branch. -@Defreq {if, expr anything} +@Example +.nr a 0 +.ie \na a is non-zero. +.nr a +1 +.el a was not positive but is now \na. + @result{} a was not positive but is now 1. +@endExample -Evaluate the expression @var{expr}, and executes @var{anything} (the -remainder of the line) if @var{expr} evaluates to a value greater than -zero (true). @var{anything} is interpreted as though it was on a line -by itself (except that leading spaces are swallowed). -@xref{Operators in Conditionals}, for more info. +Another way in which @code{el} is an ordinary request is that it does +not lexically ``bind'' more tightly to its @code{ie} counterpart than it +does to any other request. This fact can surprise C programmers. @Example -.nr xxx 1 -.nr yyy 2 -.if ((\n[xxx] == 1) & (\n[yyy] == 2)) true - @result{} true +.nr a 1 +.nr z 0 +.ie \nz \ +. ie \na a is true +. el a is false +.el z is false + @error{} warning: unbalanced 'el' request + @result{} a is false @endExample -@endDefreq -@Defreq {nop, anything} -Executes @var{anything}. This is similar to @code{.if@tie{}1}. +@c Turn the following into a proper @{x,}ref if the conditional blocks +@c node is relocated elsewhere--but consider if it is wise to do so. +To conveniently nest conditionals, keep reading. + @endDefreq -@DefreqList {ie, expr anything} -@DefreqListEndx {el, anything} -Use the @code{ie} and @code{el} requests to write an if-then-else. The -first request is the `if' part and the latter is the `else' part. +@c --------------------------------------------------------------------- -@Example -.ie n .ls 2 \" double-spacing in nroff -.el .ls 1 \" single-spacing in troff -@endExample -@endDefreq +@node Conditional Blocks, while, Operators in Conditionals, Conditionals and Loops +@subsection Conditional Blocks +@cindex conditional blocks +@cindex blocks, conditional -@c there is a bug in makeinfo <= 4.1a: you can't have `@{' as an argument -@c to @deffn -@c -@c and in 4.2 you still can't use @{ in macros. +It is frequently desirable for a control structure to govern more than +one request, macro call, text line, or a combination of the foregoing. +The opening and closing brace escape sequences @code{\@{} and @code{\@}} +define such groups. These @dfn{conditional blocks} can furthermore be +nested. -@c @DefescList {\@{, , , } -@c @DefescListEnd {\@}, , , } -@deffn Escape @t{\@{} -@deffnx Escape @t{\@}} +@DefescList {\@\{, , , } +@DefescListEnd {\@\}, , , } @esindex \@{ @esindex \@} -@cindex begin of conditional block (@code{\@{}) +@cindex beginning of conditional block (@code{\@{}) @cindex end of conditional block (@code{\@}}) -@cindex conditional block, begin (@code{\@{}) +@cindex conditional block, beginning (@code{\@{}) @cindex conditional block, end (@code{\@}}) -@cindex block, conditional, begin (@code{\@{}) +@cindex block, conditional, beginning (@code{\@{}) @cindex block, conditional, end (@code{\@}}) -In many cases, an if (or if-else) construct needs to execute more than -one request. This can be done using the escapes @code{\@{} (which must -start the first line) and @code{\@}} (which must end the last line). +@cindex brace escape sequences (@code{\@{}, @code{\@}}) +@cindex escape sequences, brace (@code{\@{}, @code{\@}}) +@cindex opening brace escape sequence (@code{\@}}) +@cindex closing brace escape sequence (@code{\@})} +@cindex brace escape sequence, opening (@code{\@})} +@cindex brace escape sequence, closing (@code{\@})} +@code{\@{} begins a conditional block; it must appear (after optional +spaces and tabs) immediately subsequent to the conditional expression of +an @code{if}, @code{ie}, or @code{while} +request,@footnote{@xref{while}.} or as the argument to an @code{el} +request. + +@code{\@}} ends a condition block and should appear on a line with other +occurrences of itself as necessary to match @code{\@{} sequences. It +can be preceded by a control character, spaces, and tabs. Input after +any quantity of @code{\@}} sequences on the same line is processed only +if all of the preceding conditions to which they correspond are true. +Furthermore, a @code{\@}} closing the body of a @code{while} request +must be the last such escape sequence on an input line. + +Brace escape sequences outside of control structures have no meaning and +produce no output. + +@strong{Caution:@:} Input lines using @code{\@{} often end with +@code{\RET}, especially in macros that consist primarily of control +lines. Forgetting to use @code{\RET} on an input line after @code{\@{} +is a common source of error. +@endDefesc + +@need 1000 +We might write the following in a page header macro. If we delete +@code{\RET}, the header will carry an unwanted extra empty line (except +on page@tie{}1). @Example -.ie t \@{\ -. ds lq `` -. ds rq '' -.\@} -.el \@{\ -. ds lq "" -. ds rq "" +.if (\\n[%] != 1) \@{\ +. ie ((\\n[%] % 2) = 0) .tl \\*[even-numbered-page-title] +. el .tl \\*[odd-numbered-page-title] .\@} @endExample -@c @endDefesc -@end deffn -@xref{Expressions}. +Let us take a closer look at how conditional blocks nest. + +@Example +A +.if 0 \@{ B +C +D +\@}E +F + @result{} A F +@endExample + +@Example +N +.if 1 \@{ O +. if 0 \@{ P +Q +R\@} S\@} T +U + @result{} N O U +@endExample + +The above behavior may challenge the intuition; it was implemented to +retain compatibility with @acronym{AT&T} @code{troff}. For clarity, it +is idiomatic to end input lines with @code{\@{} (followed by +@code{\@key{RET}} if appropriate), and to precede @code{\@}} on an input +line with nothing more than a control character, spaces, tabs, and other +instances of itself. + +We can use @code{ie}, @code{el}, and conditional blocks to simulate the +multi-way ``switch'' or ``case'' control structures of other languages. +The following example is adapted from the @code{groff} @file{man} +package. Indentation is used to clarify the logic. + +@Example +.\" Simulate switch/case in roff. +. ie '\\$2'1' .ds title General Commands\" +.el \@{.ie '\\$2'2' .ds title System Calls\" +.el \@{.ie '\\$2'3' .ds title Library Functions\" +.el \@{.ie '\\$2'4' .ds title Kernel Interfaces\" +.el \@{.ie '\\$2'5' .ds title File Formats\" +.el \@{.ie '\\$2'6' .ds title Games\" +.el \@{.ie '\\$2'7' .ds title Miscellaneous Information\" +.el \@{.ie '\\$2'8' .ds title System Management\" +.el \@{.ie '\\$2'9' .ds title Kernel Development\" +.el .ds title \" empty +.\@}\@}\@}\@}\@}\@}\@}\@} +@endExample @c --------------------------------------------------------------------- @@ -11375,13 +12954,15 @@ start the first line) and @code{\@}} (which must end the last line). @subsection while @cindex while -@code{gtroff} provides a looping construct using the @code{while} -request, which is used much like the @code{if} (and related) requests. +@code{groff} provides a looping construct:@: the @code{while} request. +Its syntax matches the @code{if} request. -@Defreq {while, expr anything} -Evaluate the expression @var{expr}, and repeatedly execute -@var{anything} (the remainder of the line) until @var{expr} evaluates -to@tie{}0. +@cindex body, of a while request +@Defreq {while, cond-expr anything} +Evaluate the conditional expression @var{cond-expr}, and repeatedly +execute @var{anything} unless and until @var{cond-expr} evaluates false. +@var{anything}, which is often a conditional block, is referred to as +the @code{while} request's @dfn{body}. @Example .nr a 0 1 @@ -11392,17 +12973,14 @@ to@tie{}0. @result{} 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 @endExample -Some remarks. - @cindex @code{de} request, and @code{while} -@itemize @bullet -@item -The body of a @code{while} request is treated like the body of a -@code{de} request: @code{gtroff} temporarily stores it in a macro that -is deleted after the loop has been exited. It can considerably slow -down a macro if the body of the @code{while} request (within the macro) -is large. Each time the macro is executed, the @code{while} body is -parsed and stored again as a temporary macro. +GNU @code{troff} treats the body of a @code{while} request similarly to +that of a @code{de} request (albeit one not read in copy +mode@footnote{@xref{Copy Mode}.}), but stores it under an internal name +and deletes it when the loop finishes. The operation of a macro +containing a @code{while} request can slow significantly if the +@code{while} body is large. Each time the macro is executed, the +@code{while} body is parsed and stored again. @Example .de xxx @@ -11417,9 +12995,10 @@ parsed and stored again as a temporary macro. @cindex recursive macros @cindex macros, recursive @noindent -The traditional and often better solution (Unix @code{troff} doesn't -have the @code{while} request) is to use a recursive macro instead that -is parsed only once during its definition. +An often better solution---and one that is more portable, since +@acronym{AT&T} @code{troff} lacked the @code{while} request---is to +instead write a recursive macro. It will be parsed only +once.@footnote{unless you redefine it} @Example .de yyy @@ -11437,11 +13016,14 @@ is parsed only once during its definition. @endExample @noindent -Note that the number of available recursion levels is set to@tie{}1000 -(this is a compile-time constant value of @code{gtroff}). +To prevent infinite loops, the default number of available recursion +levels is 1,000 or somewhat less.@footnote{``somewhat less'' because +things other than macro calls can be on the input stack} You can +disable this protective measure, or raise the limit, by setting the +@code{slimit} register. @xref{Debugging}. -@item -The closing brace of a @code{while} body must end a line. +As noted above, if a @code{while} body begins with a conditional block, +its closing brace must end an input line. @Example .if 1 \@{\ @@ -11449,72 +13031,73 @@ The closing brace of a @code{while} body must end a line. . while (\n[a] < 10) \@{\ . nop \n+[a] .\@}\@} - @result{} unbalanced \@{ \@} + @error{} unbalanced brace escape sequences @endExample -@end itemize @endDefreq @Defreq {break, } @cindex @code{while} request, confusing with @code{br} @cindex @code{break} request, in a @code{while} loop @cindex @code{continue} request, in a @code{while} loop -Break out of a @code{while} loop. Be sure not to confuse this with the -@code{br} request (causing a line break). +Exit a @code{while} loop. Do not confuse this request with a +typographical break or the @code{br} request. @endDefreq @Defreq {continue, } -Finish the current iteration of a @code{while} loop, immediately -restarting the next iteration. +Skip the remainder of a @code{while} loop's body, immediately starting +the next iteration. @endDefreq -@xref{Expressions}. - @c ===================================================================== -@node Writing Macros, Page Motions, Conditionals and Loops, gtroff Reference +@node Writing Macros, Page Motions, Conditionals and Loops, GNU troff Reference @section Writing Macros @cindex writing macros @cindex macros, writing -A @dfn{macro} is a collection of text and embedded commands that can be -invoked multiple times. Use macros to define common operations. -@xref{Strings}, for a (limited) alternative syntax to call macros. - -Although the following requests can be used to create macros, -simply using an undefined macro will cause it to be defined as empty. -@xref{Identifiers}. - -@DefreqList {de, name [@Var{end}]} -@DefreqItemx {de1, name [@Var{end}]} -@DefreqItemx {dei, name [@Var{end}]} -@DefreqListEndx {dei1, name [@Var{end}]} -Define a new macro named @var{name}. @code{gtroff} copies subsequent -lines (starting with the next one) into an internal buffer until it -encounters the line @samp{..} (two dots). If the optional second -argument to @code{de} is present it is used as the macro closure -request instead of @samp{..}. - -There can be whitespace after the first dot in the line containing the -ending token (either @samp{.} or macro @samp{@var{end}}). Don't insert -a tab character immediately after the @samp{..}, otherwise it isn't -recognized as the end-of-macro symbol.@footnote{While it is possible to -define and call a macro @samp{.} with - -@Example -.de . -. tm foo -.. -. -.. \" This calls macro `.'! -@endExample - -@noindent -you can't use this as the end-of-macro macro: during a macro definition, -@samp{..} is never handled as a call to @samp{.}, even if you say -@samp{.de foo .} explicitly.} - -Here a small example macro called @samp{P} that causes a break and +A @dfn{macro} is a stored collection of text and control lines that can +be interpolated multiple times. Use macros to define common operations. +Macros are called in the same way that requests are invoked. While +requests exist for the purpose of creating macros, simply calling an +undefined macro, or interpolating it as a string, will cause it to be +defined as empty. @xref{Identifiers}. + +@Defreq {de, name [@Var{end}]} +Define a macro @var{name}, replacing the definition of any existing +request, macro, string, or diversion called @var{name}. If +@var{name} already exists as an alias, the target of the alias is +redefined; recall @ref{Strings}. GNU @code{troff} enters copy +mode,@footnote{@xref{Copy Mode}.} storing subsequent input lines as the +macro definition. If the optional second argument is not specified, the +definition ends with the control line @samp{..} (two dots). +Alternatively, @var{end} identifies a macro whose call syntax at the +start of a control line ends the definition of @var{name}; @var{end} is +then called normally. A macro definition must end in the same +conditional block (if any) in which it began (@pxref{Conditional +Blocks}). Spaces or tabs are permitted after the control character in +the line containing this ending token (either @samp{.} or +@samp{@var{end}}), but a tab immediately after the token prevents its +recognition as the end of a macro definition. The macro @var{end} can +be called with arguments.@footnote{While it is possible to define and +call a macro @samp{.}, you can't use it as an end macro: during a macro +definition, @samp{..} is never handled as calling @samp{.}, even if +@samp{.de @var{name} .} explicitly precedes it.} +@c +@c @Example +@c .de . +@c (dot macro) +@c .. +@c . +@c .. \" This calls macro '.'! +@c .de m1 . +@c (m1 macro) +@c .. \" This does not. +@c .m1 +@c @result{} (dot macro) (m1 macro) +@c @endExample + +Here is a small example macro called @samp{P} that causes a break and inserts some vertical space. It could be used to separate paragraphs. @Example @@ -11524,59 +13107,90 @@ inserts some vertical space. It could be used to separate paragraphs. .. @endExample -The following example defines a macro within another. Remember that -expansion must be protected twice; once for reading the macro and once -for executing. +We can define one macro within another. Attempting to nest @samp{..} +naïvely will end the outer definition because the inner definition +isn't interpreted as such until the outer macro is later interpolated. +We can use an end macro instead. Each level of nesting should use a +unique end macro. + +An end macro need not be defined until it is called. This fact enables +a nested macro definition to begin inside one macro and end inside +another. Consider the following example.@footnote{Its structure is +adapted from, and isomorphic to, part of a solution by Tadziu Hoffman to +the problem of reflowing text multiple times to find an optimal +configuration for it. +@uref{https://lists.gnu.org/archive/html/groff/2008-12/msg00006.html}} @Example -\# a dummy macro to avoid a warning -.de end +.de m1 +. de m2 m3 +you .. -. -.de foo -. de bar end -. nop \f[B]Hello \\\\$1!\f[] -. end +.de m3 +Hello, +Joe. .. -. -.foo -.bar Joe - @result{} @b{Hello Joe!} +.de m4 +do +.. +.m1 +know? +. m3 +What +.m4 +.m2 + @result{} Hello, Joe. What do you know? @endExample @noindent -Since @code{\f} has no expansion, it isn't necessary to protect its -backslash. Had we defined another macro within @code{bar} that takes a -parameter, eight backslashes would be necessary before @samp{$1}. +A nested macro definition @emph{can} be terminated with @samp{..} and +nested macros @emph{can} reuse end macros, but these control lines must +be escaped multiple times for each level of nesting. The necessity of +this escaping and the utility of nested macro definitions will become +clearer when we employ macro parameters and consider the behavior of +copy mode in detail. +@endDefreq -The @code{de1} request turns off compatibility mode while executing the -macro. On entry, the current compatibility mode is saved and restored -at exit. +@code{de} defines a macro that inherits the compatibility mode +enablement status of its context (@pxref{Implementation Differences}). +Often it is desirable to make a macro that uses @code{groff} features +callable from contexts where compatibility mode is on; for instance, +when writing extensions to a historical macro package. To achieve this, +compatibility mode needs to be switched off while such a macro is +interpreted---without disturbing that state when it is finished. + +@Defreq {de1, name [@Var{end}]} +The @code{de1} request defines a macro to be interpreted with +compatibility mode disabled. When @var{name} is called, compatibility +mode enablement status is saved; it is restored when the call completes. +Observe the extra backlash before the interpolation of register +@samp{xxx}; we'll explore this subject in @ref{Copy Mode}. @Example .nr xxx 12345 -. .de aa The value of xxx is \\n[xxx]. +. br .. .de1 bb The value of xxx is \\n[xxx]. .. -. .cp 1 -. .aa - @result{} warning: number register `[' not defined + @error{} warning: register '[' not defined @result{} The value of xxx is 0xxx]. .bb @result{} The value of xxx is 12345. @endExample +@endDefreq -The @code{dei} request defines a macro indirectly. That is, it expands -strings whose names are @var{name} or @var{end} before performing the -append. +@DefreqList {dei, name [@Var{end}]} +@DefreqListEndx {dei1, name [@Var{end}]} +The @code{dei} request defines a macro with its name and end +macro indirected through strings. That is, it interpolates strings +named @var{name} and @var{end} before performing the definition. -This: +The following examples are equivalent. @Example .ds xx aa @@ -11584,32 +13198,13 @@ This: .dei xx yy @endExample -@noindent -is equivalent to: - @Example .de aa bb @endExample -The @code{dei1} request is similar to @code{dei} but with compatibility -mode switched off during execution of the defined macro. - -If compatibility mode is on, @code{de} (and @code{dei}) behave similar -to @code{de1} (and @code{dei1}): A `compatibility save' token is -inserted at the beginning, and a `compatibility restore' token at the -end, with compatibility mode switched on during execution. @xref{Gtroff -Internals}, for more information on switching compatibility mode on and -off in a single document. - -@pindex trace.tmac -Using @file{trace.tmac}, you can trace calls to @code{de} and -@code{de1}. - -Note that macro identifiers are shared with identifiers for strings and -diversions. - -@xref{als,,the description of the @code{als} request}, for possible -pitfalls if redefining a macro that has been aliased. +The @code{dei1} request bears the same relationship to @code{dei} as +@code{de1} does to @code{de}; it temporarily turns compatibility mode +off when @var{name} is called. @endDefreq @DefreqList {am, name [@Var{end}]} @@ -11617,11 +13212,12 @@ pitfalls if redefining a macro that has been aliased. @DefreqItemx {ami, name [@Var{end}]} @DefreqListEndx {ami1, name [@Var{end}]} @cindex appending to a macro (@code{am}) -@cindex macro, appending (@code{am}) -Works similarly to @code{de} except it appends onto the macro named -@var{name}. So, to make the previously defined @samp{P} macro actually -do indented instead of block paragraphs, add the necessary code to the -existing macro like this: +@cindex macro, appending to (@code{am}) +@code{am} appends subsequent input lines to macro @var{name}, extending +its definition, and otherwise working as @code{de} does. + +To make the previously defined @samp{P} macro set indented instead of +block paragraphs, add the necessary code to the existing macro. @Example .am P @@ -11629,182 +13225,153 @@ existing macro like this: .. @endExample -The @code{am1} request turns off compatibility mode while executing the -appended macro piece. To be more precise, a @dfn{compatibility save} -input token is inserted at the beginning of the appended code, and a -@dfn{compatibility restore} input token at the end. - -The @code{ami} request appends indirectly, meaning that @code{gtroff} -expands strings whose names are @var{name} or @var{end} before -performing the append. - -The @code{ami1} request is similar to @code{ami} but compatibility mode -is switched off during execution of the defined macro. - -@pindex trace.tmac -Using @file{trace.tmac}, you can trace calls to @code{am} and -@code{am1}. +The other requests are analogous to their @samp{de} counterparts. The +@code{am1} request turns off compatibility mode during interpretation of +the appendment. The @code{ami} request appends indirectly, meaning that +strings @var{name} and @var{end} are interpolated with the resulting +names used before appending. The @code{ami1} request is similar to +@code{ami}, disabling compatibility mode during interpretation of the +appended lines. @endDefreq -@xref{Strings}, for the @code{als} and @code{rn} request to create an -alias and rename a macro, respectively. - -The @code{de}, @code{am}, @code{di}, @code{da}, @code{ds}, and @code{as} -requests (together with their variants) only create a new object if the -name of the macro, diversion or string is currently undefined -or if it is defined to be a request; normally they modify the value of -an existing object. +@pindex trace.tmac +Using @file{trace.tmac}, you can trace calls to @code{de}, +@code{de1}, @code{am}, and @code{am1}. You can also use the +@code{backtrace} request at any point desired to troubleshoot tricky +spots (@pxref{Debugging}). + +@xref{Strings}, for the @code{als}, @code{rm}, and @code{rn} requests to +create an alias of, remove, and rename a macro, respectively. + +@cindex object creation +Macro identifiers share their name space with requests, strings, and +diversions; see @ref{Identifiers}. The @code{am}, @code{as}, @code{da}, +@code{de}, @code{di}, and @code{ds} requests (together with their +variants) create a new object only if the name of the macro, diversion, +or string is currently undefined or if it is defined as a request; +normally, they modify the value of an existing object. @xref{als,,the +description of the @code{als} request}, for pitfalls when redefining a +macro that is aliased. @Defreq {return, [@Var{anything}]} -Exit a macro, immediately returning to the caller. - -If called with an argument, exit twice, namely the current macro and the -macro one level higher. This is used to define a wrapper macro for +Exit a macro, immediately returning to the caller. If called with an +argument @var{anything}, exit twice---the current macro and the macro +one level higher. This is used to define a wrapper macro for @code{return} in @file{trace.tmac}. @endDefreq @menu -* Copy-in Mode:: * Parameters:: +* Copy Mode:: @end menu @c --------------------------------------------------------------------- -@node Copy-in Mode, Parameters, Writing Macros, Writing Macros -@subsection Copy-in Mode -@cindex copy mode -@cindex copy-in mode -@cindex mode, copy -@cindex mode, copy-in - -@cindex @code{\n}, when reading text for a macro -@cindex @code{\$}, when reading text for a macro -@cindex @code{\*}, when reading text for a macro -@cindex @code{\\}, when reading text for a macro -@cindex \@key{RET}, when reading text for a macro -When @code{gtroff} reads in the text for a macro, string, or diversion, -it copies the text (including request lines, but excluding escapes) into -an internal buffer. -Escapes are converted into an internal form, except for @code{\n}, -@code{\$}, @code{\*}, @code{\\} and @code{\@key{RET}}, which are evaluated -and inserted into the text where the escape was located. -This is known as @dfn{copy-in} mode or @dfn{copy} mode. - -What this means is that you can specify when these escapes are to be -evaluated (either at copy-in time or at the time of use) by insulating -the escapes with an extra backslash. Compare this to the @code{\def} -and @code{\edef} commands in @TeX{}. - -The following example prints the numbers 20 and@tie{}10: - -@Example -.nr x 20 -.de y -.nr x 10 -\&\nx -\&\\nx -.. -.y -@endExample - -@c --------------------------------------------------------------------- - -@node Parameters, , Copy-in Mode, Writing Macros +@node Parameters, Copy Mode, Writing Macros, Writing Macros @subsection Parameters @cindex parameters -The arguments to a macro or string can be examined using a variety of -escapes. +Macro calls and string interpolations optionally accept a list of +arguments; recall @ref{Calling Macros}. At the time such an +interpolation takes place, these @dfn{parameters} can be examined using +a register and a variety of escape sequences starting with @samp{\$}. +All such escape sequences are interpreted even in copy mode, a fact we +shall motivate and explain below (@pxref{Copy Mode}). @Defreg {.$} -@cindex number of arguments register (@code{.$}) -The number of arguments passed to a macro or string. This is a -read-only number register. - -Note that the @code{shift} request can change its value. +@cindex parameter count register (@code{.$}) +The count of parameters available to a macro or string is kept in this +read-only register. The @code{shift} request can change its value. @endDefreg -Any individual argument can be retrieved with one of the following -escapes: +Any individual parameter can be accessed by its position in the list of +arguments to the macro call, numbered from left to right starting at 1, +with one of the following escape sequences. @DefescList {\\$, , n, } -@DefescItem {\\$, @Lparen{}, nn, } -@DefescListEnd {\\$, @Lbrack{}, nnn, @Rbrack{}} -@cindex copy-in mode, and macro arguments -@cindex mode, copy-in, and macro arguments -@cindex macro, arguments (@code{\$}) -@cindex arguments, macro (@code{\$}) -Retrieve the @var{n}@dmn{th}, @var{nn}@dmn{th} or @var{nnn}@dmn{th} -argument. As usual, the first form only accepts a single number (larger -than zero), the second a two-digit number (larger or equal to@tie{}10), -and the third any positive integer value (larger than zero). Macros and -strings can have an unlimited number of arguments. Note that due to -copy-in mode, use two backslashes on these in actual use to prevent -interpolation until the macro is actually invoked. +@DefescItem {\\$, (, nn, } +@DefescListEnd {\\$, [, nnn, ]} +Interpolate the @var{n}th, @var{nn}th, or @var{nnn}th parameter. The +first form expects only a single digit (1@leq{}@var{n}@leq{}9)), the +second two digits (01@leq{}@var{nn}@leq{}99)), and the third any +positive integer @var{nnn}. Macros and strings accept an unlimited +number of parameters. @endDefesc @Defreq {shift, [@Var{n}]} -Shift the arguments 1@tie{}position, or as many positions as specified -by its argument. After executing this request, argument@tie{}@var{i} -becomes argument @math{@var{i}-@var{n}}; arguments 1 to@tie{}@var{n} are -no longer available. Shifting by negative amounts is currently -undefined. - -The register @code{.$} is adjusted accordingly. +Shift the parameters @var{n} places (1@tie{}by default). This is a +``left shift'': what was parameter@tie{}@var{i} becomes parameter +@math{@var{i}-@var{n}}. The parameters formerly in positions 1 +to@tie{}@var{n} are no longer available. Shifting by a non-positive +amount performs no operation. The register @code{.$} is adjusted +accordingly. @endDefreq -@DefescList {\\$*, , , } -@DefescListEndx {\\$@@, , , } -In some cases it is convenient to use all of the arguments at once (for -example, to pass the arguments along to another macro). The @code{\$*} -escape concatenates all the arguments separated by spaces. A similar -escape is @code{\$@@}, which concatenates all the arguments with each -surrounded by double quotes, and separated by spaces. If not in -compatibility mode, the input level of double quotes is preserved (see -@ref{Request and Macro Arguments}). -@endDefesc +@cindex copy mode, and macro parameters +@cindex mode, copy, and macro parameters +@cindex macro, parameters (@code{\$}) +@cindex parameters, macro (@code{\$}) +In practice, parameter interpolations are usually seen prefixed with an +extra escape character. This is because the @code{\$} family of escape +sequences is interpreted even in copy mode.@footnote{If they were not, +parameter interpolations would be similar to command-line +parameters---fixed for the entire duration of a @code{roff} program's +run. The advantage of interpolating @code{\$} escape sequences even in +copy mode is that they can interpolate different contents from one call +to the next, like function parameters in a procedural language. The +additional escape character is the price of this power.} -@Defesc {\\$^, , , } -Handle the parameters of a macro as if they were an argument to the -@code{ds} or similar requests. +@DefescList {\\$*, , , } +@DefescItemx {\\$@@, , , } +@DefescListEndx {\\$^, , , } +In some cases it is convenient to interpolate all of the parameters at +once (to pass them to a request, for instance). The @code{\$*} escape +concatenates the parameters, separating them with spaces. @code{\$@@} +is similar, concatenating the parameters, surrounding each with double +quotes and separating them with spaces. If not in compatibility mode, +the interpolation depth of double quotes is preserved (@pxref{Calling +Macros}). @code{\$^} interpolates all parameters as if they were +arguments to the @code{ds} request. @Example .de foo -. tm $1=`\\$1' -. tm $2=`\\$2' -. tm $*=`\\$*' -. tm $@@=`\\$@@' -. tm $^=`\\$^' +. tm $1='\\$1' +. tm $2='\\$2' +. tm $*='\\$*' +. tm $@@='\\$@@' +. tm $^='\\$^' .. .foo " This is a "test" - @result{} $1=` This is a ' - @result{} $2=`test"' - @result{} $*=` This is a test"' - @result{} $@@=`" This is a " "test""' - @result{} $^=`" This is a "test"' -@endExample - -This escape is useful mainly for macro packages like @file{trace.tmac}, + @error{} $1=' This is a ' + @error{} $2='test"' + @error{} $*=' This is a test"' + @error{} $@@='" This is a " "test""' + @error{} $^='" This is a "test"' +@endExample + +@code{\$*} is useful when writing a macro that doesn't need to +distinguish its arguments, or even to not interpret them; examples +include macros that produce diagnostic messages by wrapping the +@code{tm} or @code{ab} requests. Use @code{\$@@} when writing a macro +that may need to shift its parameters and/or wrap a macro or request +that finds the count significant. If in doubt, prefer @code{\$@@} to +@code{\$*}. An application of @code{\$^} is seen in @file{trace.tmac}, which redefines some requests and macros for debugging purposes. @endDefesc @Defesc {\\$0, , , } @cindex macro name register (@code{\$0}) @cindex @code{als} request, and @code{\$0} -The name used to invoke the current macro. The @code{als} request can -make a macro have more than one name. - -If a macro is called as a string (within another macro), the value of -@code{\$0} isn't changed. +Interpolate the name by which the macro being interpreted was called. +The @code{als} request can cause a macro to have more than one name. +Applying string interpolation to a macro does not change this name. @Example .de foo . tm \\$0 .. -.als foo bar +.als bar foo . -@endExample -@Example .de aaa . foo .. @@ -11818,31 +13385,222 @@ If a macro is called as a string (within another macro), the value of \\*[bar]\\ .. . -@endExample -@Example .aaa - @result{} foo + @error{} foo .bbb - @result{} bar + @error{} bar .ccc - @result{} ccc + @error{} ccc .ddd - @result{} ddd + @error{} ddd @endExample @endDefesc -@xref{Request and Macro Arguments}. +@c --------------------------------------------------------------------- +@node Copy Mode, , Parameters, Writing Macros +@subsection Copy Mode +@cindex copy mode +@cindex copy mode +@cindex mode, copy +@cindex mode, copy -@c ===================================================================== +@cindex @code{\n}, when reading text for a macro +@cindex @code{\$}, when reading text for a macro +@cindex @code{\*}, when reading text for a macro +@cindex \@key{RET}, when reading text for a macro +When GNU @code{troff} processes certain requests, most importantly those +which define or append to a macro or string, it does so in @dfn{copy +mode}: it copies the characters of the definition into a dedicated +storage region, interpolating the escape sequences @code{\n}, @code{\g}, +@code{\$}, @code{\*}, @code{\V}, and @code{\?} normally; interpreting +@code{\@key{RET}} immediately; discarding comments @code{\"} and +@code{\#}; interpolating the current leader, escape, or tab character +with @code{\a}, @code{\e}, and @code{\t}, respectively; and storing all +other escape sequences in an encoded form. + +@cindex interpretation mode +@cindex mode, interpretation +The complement of copy mode---a @code{roff} formatter's behavior when +not defining or appending to a macro, string, or diversion---where all +macros are interpolated, requests invoked, and valid escape sequences +processed immediately upon recognition, can be termed +@dfn{interpretation mode}. + +@Defesc {\\\\, , , } +The escape character, @code{\} by default, can escape itself. This +enables you to control whether a given @code{\n}, @code{\g}, @code{\$}, +@code{\*}, @code{\V}, or @code{\?} escape sequence is interpreted at the +time the macro containing it is defined, or later when the macro is +called.@footnote{Compare this to the @code{\def} and @code{\edef} +commands in @TeX{}.} -@node Page Motions, Drawing Requests, Writing Macros, gtroff Reference -@section Page Motions -@cindex page motions -@cindex motions, page +@Example +.nr x 20 +.de y +.nr x 10 +\&\nx +\&\\nx +.. +.y + @result{} 20 10 +@endExample -@xref{Manipulating Spacing}, for a discussion of the main request for -vertical motion, @code{sp}. +You can think of @code{\\} as a ``delayed'' backslash; it is the escape +character followed by a backslash from which the escape character has +removed its special meaning. Consequently, @samp{\\} is not an escape +sequence in the usual sense. In any escape sequence @samp{\@var{X}} +that GNU @code{troff} does not recognize, the escape character is +ignored and @var{X} is output. An unrecognized escape sequence causes +a warning in category @samp{escape}, with two exceptions---@samp{\\} is +the first. +@endDefesc + +@cindex @code{\\}, when reading text for a macro +@Defesc {\\., , , } +@code{\.} escapes the control character. It is similar to @code{\\} in +that it isn't a true escape sequence. It is used to permit nested macro +definitions to end without a named macro call to conclude them. Without +a syntax for escaping the control character, this would not be possible. + +@Example +.de m1 +foo +. +. de m2 +bar +\\.. +. +.. +.m1 +.m2 + @result{} foo bar +@endExample + +@noindent +The first backslash is consumed while the macro is read, and the second +is interpreted when macro @code{m1} is called. +@endDefesc + +@code{roff} documents should not use the @code{\\} or @code{\.} +character sequences outside of copy mode; they serve only to obfuscate +the input. Use @code{\e} to represent the escape character, +@code{\[rs]} to obtain a backslash glyph, and @code{\&} before @samp{.} +and @samp{'} where GNU @code{troff} expects them as control characters +if you mean to use them literally (recall @ref{Requests and Macros}). + +Macro definitions can be nested to arbitrary depth. The mechanics of +parsing the escape character have significant consequences for this +practice. + +@Example +.de M1 +\\$1 +. de M2 +\\\\$1 +. de M3 +\\\\\\\\$1 +\\\\.. +. M3 hand. +\\.. +. M2 of +.. +This understeer is getting +.M1 out + @result{} This understeer is getting out of hand. +@endExample + +Each escape character is interpreted twice---once in copy mode, when the +macro is defined, and once in interpretation mode, when the macro is +called. As seen above, this fact leads to exponential growth in the +quantity of escape characters required to delay interpolation of +@code{\n}, @code{\g}, @code{\$}, @code{\*}, @code{\V}, and @code{\?} at +each nesting level, which can be daunting. GNU @code{troff} offers a +solution. + +@Defesc {\\E, , , } +@code{\E} represents an escape character that is not interpreted in copy +mode. You can use it to ease the writing of nested macro definitions. + +@Example +.de M1 +. nop \E$1 +. de M2 +. nop \E$1 +. de M3 +. nop \E$1 +\\\\.. +. M3 better. +\\.. +. M2 bit +.. +This vehicle handles +.M1 a + @result{} This vehicle handles a bit better. +@endExample + +Observe that because @code{\.} is not a true escape sequence, we can't +use @code{\E} to keep @samp{..} from ending a macro definition +prematurely. If the multiplicity of backslashes complicates +maintenance, use end macros. + +@code{\E} is also convenient to define strings containing escape +sequences that need to work when used in copy mode (for example, as +macro arguments), or which will be interpolated at varying macro nesting +depths. We might define strings to begin and end superscripting +as follows.@footnote{These are lightly adapted from the @code{groff} +implementation of the @file{ms} macros.} + +@Example +.ds @{ \v'-.9m\s'\En[.s]*7u/10u'+.7m' +.ds @} \v'-.7m\s0+.9m' +@endExample + +When the @code{ec} request is used to redefine the escape character, +@code{\E} also makes it easier to distinguish the semantics of an escape +character from the other meaning(s) its character might have. Consider +the use of an unusual escape character, @samp{-}. + +@Example +.nr a 1 +.ec - +.de xx +--na +.. +.xx + @result{} -na +@endExample + +@noindent +This result may surprise you; some people expect @samp{1} to be output +since register @samp{a} has clearly been defined with that value. What +has happened? The robotic replacement of @samp{\} with @samp{-} has led +us astray. You might recognize the sequence @samp{--} more readily with +the default escape character as @samp{\-}, the special character escape +sequence for the minus sign glyph. + +@Example +.nr a 1 +.ec - +.de xx +-Ena +.. +.xx + @result{} 1 +@endExample +@endDefesc + + +@c ===================================================================== + +@node Page Motions, Drawing Geometric Objects, Writing Macros, GNU troff Reference +@section Page Motions +@cindex page motions +@cindex motions, page + +@xref{Manipulating Spacing}, for a discussion of the most commonly used +request for vertical motion, @code{sp}, which spaces downward by one +vee. @DefreqList {mk, [@Var{reg}]} @DefreqListEndx {rt, [@Var{dist}]} @@ -11854,31 +13612,28 @@ vertical motion, @code{sp}. @cindex page location, vertical, returning to marked (@code{rt}) @cindex location, vertical, page, returning to marked (@code{rt}) @cindex vertical page location, returning to marked (@code{rt}) -The request @code{mk} can be used to mark a location on a page, for -movement to later. This request takes a register name as an argument in -which to store the current page location. With no argument it stores -the location in an internal register. The results of this can be used -later by the @code{rt} or the @code{sp} request (or the @code{\v} -escape). +You can @dfn{mark} a location on a page for subsequent @dfn{return}. +@code{mk} takes an argument, a register name in which to store the +current page location. If given no argument, it stores the location in +an internal register. This location can be used later by the @code{rt} +or the @code{sp} requests (or the @code{\v} escape). -The @code{rt} request returns @emph{upwards} to the location marked with -the last @code{mk} request. If used with an argument, return to a -position which distance from the top of the page is @var{dist} (no -previous call to @code{mk} is necessary in this case). Default scaling -indicator is @samp{v}. +The @code{rt} request returns @emph{upward} to the location marked with +the last @code{mk} request. If used with an argument, it returns to a +vertical position@tie{}@var{dist} from the top of the page (no previous +call to @code{mk} is necessary in this case). The default scaling +unit is @samp{v}. -If a page break occurs between a @code{mk} request and its -matching @code{rt} request, the @code{rt} is silently ignored. +If a page break occurs between a @code{mk} request and its matching +@code{rt} request, the @code{rt} request is silently ignored. -Here a primitive solution for a two-column macro. +A simple implementation of a macro to set text in two columns follows. @Example .nr column-length 1.5i .nr column-gap 4m .nr bottom-margin 1m . -@endExample -@Example .de 2c . br . mk @@ -11887,8 +13642,6 @@ Here a primitive solution for a two-column macro. . nr right-side 0 .. . -@endExample -@Example .de 2c-trap . ie \\n[right-side] \@{\ . nr right-side 0 @@ -11903,8 +13656,10 @@ Here a primitive solution for a two-column macro. . rt . \@} .. -. @endExample + +Now let us apply our two-column macro. + @Example .pl 1.5i .ll 4i @@ -11916,114 +13671,137 @@ Starting here, text is typeset in two columns. Note that this implementation isn't robust and thus not suited for a real two-column macro. -@endExample - -Result: - -@Example -This is a small test that shows how the -rt request works in combination with mk. - -Starting here, isn't robust -text is typeset and thus not -in two columns. suited for a -Note that this real two-column -implementation macro. + @result{} This is a small test that shows how the + @result{} rt request works in combination with mk. + @result{} + @result{} Starting here, isn't robust + @result{} text is typeset and thus not + @result{} in two columns. suited for a + @result{} Note that this real two-column + @result{} implementation macro. @endExample @endDefreq -The following escapes give fine control of movements about the page. +Several escape sequences enable fine control of movement about the page. -@Defesc {\\v, ', e, '} +@Defesc {\\v, @code{'}, expr, @code{'}} @cindex vertical motion (@code{\v}) @cindex motion, vertical (@code{\v}) -Move vertically, usually from the current location on the page (if no -absolute position operator @samp{|} is used). The argument@tie{}@var{e} -specifies the distance to move; positive is downwards and negative -upwards. The default scaling indicator for this escape is @samp{v}. -Beware, however, that @code{gtroff} continues text processing at the -point where the motion ends, so you should always balance motions to -avoid interference with text processing. - -@code{\v} doesn't trigger a trap. This can be quite useful; for -example, consider a page bottom trap macro that prints a marker in the -margin to indicate continuation of a footnote or something similar. +Vertically move the drawing position. @var{expr} indicates the +magnitude of motion: positive is downward and and negative upward. The +default scaling unit is @samp{v}. The motion is relative to the current +drawing position unless @var{expr} begins with the boundary-relative +motion operator @samp{|}. @xref{Numeric Expressions}. + +Text processing continues at the new drawing position; usually, vertical +motions should be in balanced pairs to avoid a confusing page layout. + +@code{\v} will not spring a vertical position trap. This can be useful; +for example, consider a page bottom trap macro that prints a marker in +the margin to indicate continuation of a footnote. @xref{Traps}. @endDefesc -There are some special-case escapes for vertical motion. - -@Defesc {\\r, , , } -Move upwards@tie{}1@dmn{v}. +A few escape sequences that produce vertical motion are unusual. They +are thought to originate early in AT&T @code{nroff} history to achieve +super- and subscripting by half-line motions on line printers and +teletypewriters before the phototypesetter made more precise positioning +available. They are reckoned in ems---not vees---to maintain continuity +with their original purpose of moving relative to the size of the type +rather than the distance between text baselines (vees).@footnote{At the +@code{grops} defaults of 10-point type on 12-point vertical spacing, the +difference between half a vee and half an em can be subtle:@: large +spacings like @samp{.vs .5i} make it obvious.} + +@DefescList {\\r, , , } +@DefescItemx {\\u, , , } +@DefescListEndx {\\d, , , } +Move upward@tie{}1@dmn{m}, upward@tie{}.5@dmn{m}, and +downward@tie{}.5@dmn{m}, respectively. @endDefesc -@Defesc {\\u, , , } -Move upwards@tie{}.5@dmn{v}. -@endDefesc +@noindent +Let us see these escape sequences in use. -@Defesc {\\d, , , } -Move down@tie{}.5@dmn{v}. -@endDefesc +@Example +Obtain 100 cm\u3\d of \ka\d\092\h'|\nau'\r233\dU. +@endExample + +In the foregoing we have paired @code{\u} and @code{\d} to typeset a +superscript, and later a full em negative (``reverse'') motion to place +a superscript above a subscript. A numeral-width horizontal motion +escape sequence aligns the proton and nucleon numbers, while @code{\k} +marks a horizontal position to which @code{\h} returns so that we could +stack them. (We shall discuss these horizontal motion escape sequences +presently.) In serious applications, we often want to alter the type +size of the -scripts and to fine-tune the vertical motions, as the +@code{groff} @file{ms} package does with its super- and subscripting +string definitions. -@Defesc {\\h, ', e, '} +@Defesc {\\h, @code{'}, expr, @code{'}} @cindex inserting horizontal space (@code{\h}) @cindex horizontal space (@code{\h}) @cindex space, horizontal (@code{\h}) @cindex horizontal motion (@code{\h}) @cindex motion, horizontal (@code{\h}) -Move horizontally, usually from the current location (if no absolute -position operator @samp{|} is used). The expression@tie{}@var{e} -indicates how far to move: positive is rightwards and negative -leftwards. The default scaling indicator for this escape is @samp{m}. - -This horizontal space is not discarded at the end of a line. To insert -discardable space of a certain length use the @code{ss} request. +Horizontally move the drawing position. @var{expr} indicates the +magnitude of motion: positive is rightward and negative leftward. The +default scaling unit is @samp{m}. The motion is relative to the current +drawing position unless @var{expr} begins with the boundary-relative +motion operator @samp{|}. @xref{Numeric Expressions}. @endDefesc -There are a number of special-case escapes for horizontal motion. +The following string definition sets the @TeX{} +logo.@footnote{@xref{Strings}, for an explanation of the trailing +@samp{\"}.} -@Defesc {\\@key{SP}, , , } -@cindex space, unbreakable -@cindex unbreakable space -An unbreakable and unpaddable (i.e.@: not expanded during filling) -space. (Note: This is a backslash followed by a space.) -@endDefesc +@Example +.ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X\" +@endExample -@Defesc {\\~, , , } -An unbreakable space that stretches like a normal inter-word space when -a line is adjusted. +There are a number of special-case escape sequences for horizontal +motion. + +@Defesc {\\@key{SP}, , , } +@cindex space, unbreakable and unadjustable (@code{\@key{SP}}) +@cindex unbreakable and unadjustable space (@code{\@key{SP}}) +@cindex unadjustable and unbreakable space (@code{\@key{SP}}) +@c We use the following notation in our man pages; Texinfo is bound to +@c the GNU Emacs dialect. +@esindex \@slanted{space} +Move right one word space. (The input is a backslash followed by a +space.) This escape sequence can be thought of as a non-adjustable, +unbreakable space. Usually you want @code{\~} instead; see +@ref{Manipulating Filling and Adjustment}. @endDefesc +@cindex thin space (@code{\|}) +@cindex space, thin (@code{\|}) @Defesc {\\|, , , } -A 1/6@dmn{th} em space. Ignored for TTY output devices (rounded to -zero). - -However, if there is a glyph defined in the current font file with name -@code{\|} (note the leading backslash), the width of this glyph is used -instead (even for TTYs). +Move one-sixth @dmn{em} to the right on typesetting output devices. If +a glyph named @samp{\|} is defined in the current font, its width is +used instead, even on terminal output devices. @endDefesc +@cindex hair space (@code{\^}) +@cindex space, hair (@code{\^}) @Defesc {\\^, , , } -A 1/12@dmn{th} em space. Ignored for TTY output devices (rounded to -zero). - -However, if there is a glyph defined in the current font file with name -@code{\^} (note the leading backslash), the width of this glyph is used -instead (even for TTYs). +Move one-twelfth @dmn{em} to the right on typesetting output devices. +If a glyph named @samp{\^} is defined in the current font, its width is +used instead, even on terminal output devices. @endDefesc @Defesc {\\0, , , } -@cindex space, width of a digit (@code{\0}) -@cindex digit width space (@code{\0}) -A space the size of a digit. +@cindex space, width of a digit (numeral) (@code{\0}) +@cindex digit-width space (@code{\0}) +@cindex figure space (@code{\0}) +@cindex numeral-width space (@code{\0}) +Move right by the width of a numeral in the current font. @endDefesc -The following string sets the @TeX{} logo: - -@Example -.ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X -@endExample +Horizontal motions are not discarded at the end of an output line as +word spaces are. @xref{Breaking}. -@DefescList {\\w, ', text, '} +@DefescList {\\w, @code{'}, anything, @code{'}} @DefregItemx {st} @DefregItemx {sb} @DefregItemx {rst} @@ -12032,47 +13810,59 @@ The following string sets the @TeX{} logo: @DefregItemx {ssc} @DefregListEndx {skw} @cindex width escape (@code{\w}) -Return the width of the specified @var{text} in basic units. This -allows horizontal movement based on the width of some arbitrary text -(e.g.@: given as an argument to a macro). +Interpolate the width of @var{anything} in basic units. This escape +sequence allows several properties of formatted output to be measured +without writing it out. @Example -The length of the string `abc' is \w'abc'u. - @result{} The length of the string `abc' is 72u. +The length of the string 'abc' is \w'abc'u. + @result{} The length of the string 'abc' is 72u. @endExample -Font changes may occur in @var{text}, which don't affect current -settings. +@cindex dummy environment, used by @code{\w} escape sequence +@cindex environment, dummy, used by @code{\w} escape sequence +@var{anything} is processed in a dummy environment:@: this means that +font and type size changes, for example, may occur within it without +affecting subsequent output. -After use, @code{\w} sets several registers: +@need 500 +After each use, @code{\w} sets several registers. +@cindex CSTR@tie{}#54 errata +@cindex CSTR@tie{}#54 erratum, @code{sb} register +@cindex CSTR@tie{}#54 erratum, @code{st} register @table @code @item st @itemx sb -The highest and lowest point of the baseline, respectively, in -@var{text}. +The maximum vertical displacements of the text baseline above and below, +respectively. The sign convention is opposite that of relative vertical +motions; that is, depth below the (original) baseline is negative. +These registers are incorrectly documented in the @acronym{AT&T} +@code{troff} manual as ``the highest and lowest extent of [the argument +to @code{\w}] relative to the baseline''. @item rst @itemx rsb -Like the @code{st} and @code{sb} registers, but takes account of the -heights and depths of glyphs. In other words, this gives the highest -and lowest point of @var{text}. Values below the baseline are negative. +Like @code{st} and @code{sb}, but taking account of the heights and +depths of glyphs. In other words, these registers store the highest and +lowest vertical positions attained by @var{anything}, doing what +@acronym{AT&T} @code{troff} documented @code{st} and @code{sb} as doing. @item ct -Defines the kinds of glyphs occurring in @var{text}: +Characterizes the geometry of glyphs occurring in @var{anything}. @table @asis @item 0 -only short glyphs, no descenders or tall glyphs. +only short glyphs, no descenders or tall glyphs @item 1 -at least one descender. +at least one descender @item 2 -at least one tall glyph. +at least one tall glyph @item 3 -at least one each of a descender and a tall glyph. +at least one each of a descender and a tall glyph @end table @item ssc @@ -12087,15 +13877,15 @@ over that glyph. @endDefesc @DefescList {\\k, , p, } -@DefescItem {\\k, @Lparen{}, ps, } -@DefescListEnd {\\k, @Lbrack{}, position, @Rbrack{}} +@DefescItem {\\k, (, ps, } +@DefescListEnd {\\k, [, position, ]} @cindex saving horizontal input line position (@code{\k}) @cindex horizontal input line position, saving (@code{\k}) @cindex input line position, horizontal, saving (@code{\k}) @cindex position, horizontal input line, saving (@code{\k}) @cindex line, input, horizontal position, saving (@code{\k}) -Store the current horizontal position in the @emph{input} line in number -register with name @var{position} (one-character name@tie{}@var{p}, +Store the current horizontal position in the @emph{input} line in a +register with the name @var{position} (one-character name@tie{}@var{p}, two-character name @var{ps}). Use this, for example, to return to the beginning of a string for highlighting or other decoration. @endDefesc @@ -12113,37 +13903,38 @@ The current horizontal position at the input line. @cindex output line, horizontal position, register (@code{.k}) @cindex position, horizontal, in output line, register (@code{.k}) @cindex line, output, horizontal position, register (@code{.k}) -A read-only number register containing the current horizontal output -position (relative to the current indentation). +A read-only register containing the current horizontal output position +(relative to the current indentation). @endDefreg -@Defesc {\\o, ', abc, '} +@Defesc {\\o, @code{'}, abc@dots{}, @code{'}} @cindex overstriking glyphs (@code{\o}) @cindex glyphs, overstriking (@code{\o}) -Overstrike glyphs @var{a}, @var{b}, @var{c}, @dots{}; the glyphs are -centered, and the resulting spacing is the largest width of the affected -glyphs. +Overstrike the glyphs of characters @var{a}, @var{b}, @var{c}, @dots{}; +the glyphs are centered, written, and the drawing position advanced by +the widest of the glyphs. @endDefesc -@Defesc {\\z, , g, } +@Defesc {\\z, , c, } @cindex zero-width printing (@code{\z}, @code{\Z}) @cindex printing, zero-width (@code{\z}, @code{\Z}) -Print glyph @var{g} with zero width, i.e., without spacing. Use this to -overstrike glyphs left-aligned. +Format the character @var{c} with zero width; that is, without advancing +the drawing position. Use @code{\z} to overstrike glyphs aligned to +their left edges, in contrast to @code{\o}'s centering. @endDefesc -@Defesc {\\Z, ', anything, '} +@Defesc {\\Z, @code{'}, anything, @code{'}} @cindex zero-width printing (@code{\z}, @code{\Z}) @cindex printing, zero-width (@code{\z}, @code{\Z}) -Print @var{anything}, then restore the horizontal and vertical position. -The argument may not contain tabs or leaders. +Save the drawing position, format @var{anything}, then restore it. Tabs +and leaders in the argument are ignored with an error diagnostic. -The following is an example of a strike-through macro: +We might implement a strike-through macro thus. @Example .de ST -.nr ww \w'\\$1' -\Z@@\v'-.25m'\l'\\n[ww]u'@@\\$1 +.nr width \w'\\$1' +\Z@@\v'-.25m'\l'\\n[width]u'@@\\$1 .. . This is @@ -12155,69 +13946,62 @@ an actual emergency! @c ===================================================================== -@node Drawing Requests, Traps, Page Motions, gtroff Reference -@section Drawing Requests +@node Drawing Geometric Objects, Traps, Page Motions, GNU troff Reference +@section Drawing Geometric Objects @cindex drawing requests @cindex requests for drawing -@code{gtroff} provides a number of ways to draw lines and other figures -on the page. Used in combination with the page motion commands (see -@ref{Page Motions}, for more info), a wide variety of figures can be -drawn. However, for complex drawings these operations can be quite -cumbersome, and it may be wise to use graphic preprocessors like -@code{gpic} or @code{ggrn}. @xref{gpic}, and @ref{ggrn}, for more -information. +A few of the formatter's escape sequences draw lines and other geometric +objects. Combined with each other and with page motion commands +(@pxref{Page Motions}), a wide variety of figures is possible. For +complex drawings, these operations can be cumbersome; the preprocessors +@code{gpic} or @code{ggrn} are typically used instead. -All drawing is done via escapes. +The @code{\l} and @code{\L} escape sequences draw horizontal and +vertical sequences of glyphs, respectively. Even the simplest of +output devices supports them. -@DefescList {\\l, ', l, '} -@DefescListEnd {\\l, ', lg, '} +@DefescList {\\l, @code{'}, l, @code{'}} +@DefescListEnd {\\l, @code{'}, lc, @code{'}} @cindex drawing horizontal lines (@code{\l}) @cindex horizontal line, drawing (@code{\l}) @cindex line, horizontal, drawing (@code{\l}) -Draw a line horizontally. @var{l} is the length of the line to be -drawn. If it is positive, start the line at the current location and -draw to the right; its end point is the new current location. Negative -values are handled differently: The line starts at the current location -and draws to the left, but the current location doesn't move. +Draw a horizontal line of length @var{l} from the drawing position. +Rightward motion is positive. Afterward, the drawing position is at the +right end of the line. The default scaling unit is @samp{m}. -@var{l} can also be specified absolutely (i.e.@: with a leading -@samp{|}), which draws back to the beginning of the input line. Default -scaling indicator is @samp{m}. - -@cindex underscore glyph (@code{\[ru]}) +@cindex baseline rule special character(@code{\[ru]}) @cindex glyph, underscore (@code{\[ru]}) @cindex line drawing glyph @cindex glyph, for line drawing -The optional second parameter@tie{}@var{g} is a glyph to draw the line -with. If this second argument is not specified, @code{gtroff} uses the -underscore glyph, @code{\[ru]}. - -@cindex zero width space character (@code{\&}) -@cindex character, zero width space (@code{\&}) -@cindex space character, zero width (@code{\&}) -To separate the two arguments (to prevent @code{gtroff} from -interpreting a drawing glyph as a scaling indicator if the glyph is -represented by a single character) use @code{\&}. +The optional second parameter@tie{}@var{c} is a character with which to +draw the line. The default is the baseline rule special character, +@code{\[ru]}. -Here a small useful example: +@cindex dummy character (@code{\&}), effect on @code{\l} escape sequence +@cindex character, dummy (@code{\&}), effect on @code{\l} escape sequence +If @var{c} is a valid scaling unit, put @code{\&} after @var{l} to +disambiguate the input. @Example -.de box +.de textbox \[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]' .. @endExample @noindent -Note that this works by outputting a box rule (a vertical line), then -the text given as an argument and then another box rule. Finally, the -line drawing escapes both draw from the current location to the -beginning of the @emph{input} line -- this works because the line length -is negative, not moving the current point. +The foregoing outputs a box rule (a vertical line), the text +argument(s), and another box rule. We employ the boundary-relative +motion operator @samp{|}. Finally, the line-drawing escape sequences +draw a radical extender (a form of overline) and an underline from the +drawing position to the position coresponding to beginning of the +@emph{input} line. The drawing position returns to just after the +right-hand box rule because the lengths of the drawn lines are negative, +as noted above. @endDefesc -@DefescList {\\L, ', l, '} -@DefescListEnd {\\L, ', lg, '} +@DefescList {\\L, @code{'}, l, @code{'}} +@DefescListEnd {\\L, @code{'}, lc, @code{'}} @cindex drawing vertical lines (@code{\L}) @cindex vertical line drawing (@code{\L}) @cindex line, vertical, drawing (@code{\L}) @@ -12225,54 +14009,132 @@ is negative, not moving the current point. @cindex glyph for line drawing @cindex box rule glyph (@code{\[br]}) @cindex glyph, box rule (@code{\[br]}) -Draw vertical lines. Its parameters are similar to the @code{\l} -escape, except that the default scaling indicator is @samp{v}. The -movement is downwards for positive values, and upwards for negative -values. The default glyph is the box rule glyph, @code{\[br]}. As with -the vertical motion escapes, text processing blindly continues where the -line ends. +Draw a vertical line of length @var{l} from the drawing position. +Downward motion is positive. The default scaling unit is @samp{v}. The +default character is the box rule, @code{\[br]}. As with vertical +motion escape sequences, text processing continues where the line ends. +@code{\L} is otherwise similar to @code{\l}. @Example +$ nroff <retrieve_para_space() || seen_space; if (header.header_level > 7) @@ -2496,7 +2557,7 @@ void html_printer::write_header (void) // firstly we must terminate any font and type faces current_paragraph->done_para(); - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; if (cutoff_heading+2 > header.header_level) { // now we save the header so we can issue a list of links @@ -2505,7 +2566,8 @@ void html_printer::write_header (void) a = new text_glob(); a->text_glob_html(&st, - header.headings.add_string(header.header_buffer), + header.headings + .add_string(header.header_buffer), header.header_buffer.length(), header.no_of_headings, header.header_level, header.no_of_headings, header.header_level); @@ -2523,7 +2585,8 @@ void html_printer::write_header (void) // line break before a header if (!current_paragraph->emitted_text()) current_paragraph->do_space(); - // user wants manufactured headings which look better than + // user wants manufactured headings which look better than + // if (header.header_level<4) { html.put_string(""); html.put_string(header.header_buffer); @@ -2564,10 +2627,13 @@ void html_printer::write_header (void) header.header_filename.add(h, header.no_of_headings, - header.no_of_headings, header.no_of_headings, - header.no_of_headings, header.no_of_headings); + header.no_of_headings, + header.no_of_headings, + header.no_of_headings, + header.no_of_headings); - current_paragraph->do_para(&html, "", get_troff_indent(), pageoffset, linelength, space); + current_paragraph->do_para(&html, "", get_troff_indent(), + pageoffset, linelength, space); } } @@ -2576,8 +2642,8 @@ void html_printer::determine_header_level (int level) if (level == 0) { int i; - for (i=0; ((itext_string + 20)); if (! img.empty()) { - simple_anchors = TRUE; // we cannot use full heading anchors with images + // we cannot use full heading anchors with images + simple_anchors = TRUE; if (horiz < g->minh) header.header_buffer += " "; - + header.header_buffer += img; } } - else if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce() || g->is_ll()) + else if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce() + || g->is_ll()) troff_tag(g); else if (g->is_fi()) fill_on = 1; @@ -2648,13 +2717,14 @@ void html_printer::do_heading (char *arg) * the new paragraph to start a new font block. */ - output_style.f = NULL; + output_style.f = 0; g = page_contents->glyphs.get_data(); - page_contents->glyphs.move_left(); // so that next time we use old g + page_contents->glyphs.move_left(); // so that next time we use old g } /* - * is_courier_until_eol - returns TRUE if we can see a whole line which is courier + * is_courier_until_eol - returns TRUE if we can see a whole line which + * is courier */ int html_printer::is_courier_until_eol (void) @@ -2673,7 +2743,7 @@ int html_printer::is_courier_until_eol (void) } while (result && (! page_contents->glyphs.is_equal_to_head()) && (! g->is_fi()) && (! g->is_eol())); - + /* * now restore our previous position. */ @@ -2750,11 +2820,12 @@ void html_printer::do_tempindent (char *arg) void html_printer::shutdown_table (void) { - if (table != NULL) { + if (table != 0) { current_paragraph->done_para(); table->emit_finish_table(); - // dont delete this table as it will be deleted when we destroy the text_glob - table = NULL; + // don't delete this table as it will be deleted when we destroy the + // text_glob + table = 0; } } @@ -2769,9 +2840,9 @@ void html_printer::do_indent (int in, int pageoff, int linelen) if ((device_indent != -1) && (pageoffset+device_indent != in+pageoff)) { - int space = current_paragraph->retrieve_para_space() || seen_space; + int space = current_paragraph->retrieve_para_space() || seen_space; current_paragraph->done_para(); - + device_indent = in; pageoffset = pageoff; if (linelen <= max_linelength) @@ -2798,14 +2869,16 @@ void html_printer::do_verticalspacing (char *arg) void html_printer::do_pointsize (char *arg) { /* - * firstly check to see whether this point size is really associated with a .tl tag + * firstly check to see whether this point size is really associated + * with a .tl tag */ if (! page_contents->glyphs.is_empty()) { text_glob *g = page_contents->glyphs.get_data(); text_glob *t = page_contents->glyphs.get_data(); - while (t->is_a_tag() && (! page_contents->glyphs.is_equal_to_head())) { + while (t->is_a_tag() && (!page_contents->glyphs.is_equal_to_head())) + { if (t->is_tl()) { /* * found title therefore ignore this .ps tag @@ -2840,9 +2913,9 @@ void html_printer::do_pointsize (char *arg) void html_printer::do_fill (char *arg) { int on = atoi(arg); - + output_hpos = get_troff_indent()+pageoffset; - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; if (fill_on != on) { if (on) @@ -2877,9 +2950,10 @@ void html_printer::do_check_center(void) seen_center = FALSE; if (next_center > 0) { if (end_center == 0) { - int space = current_paragraph->retrieve_para_space() || seen_space; + int space = current_paragraph->retrieve_para_space() + || seen_space; current_paragraph->done_para(); - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; if (dialect == html4) current_paragraph->do_para("align=\"center\"", space); else @@ -2893,17 +2967,16 @@ void html_printer::do_check_center(void) * different alignment, so shutdown paragraph and open * a new one. */ - int space = current_paragraph->retrieve_para_space() || seen_space; + int space = current_paragraph->retrieve_para_space() + || seen_space; current_paragraph->done_para(); - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; if (dialect == html4) current_paragraph->do_para("align=\"center\"", space); else current_paragraph->do_para("class=\"center\"", space); } else - /* - * same alignment, if we have emitted text then issue a break. - */ + // same alignment; if we have emitted text, issue a break. if (current_paragraph->emitted_text()) current_paragraph->do_break(); } else @@ -2911,9 +2984,10 @@ void html_printer::do_check_center(void) * next_center == 0 */ if (end_center > 0) { - seen_space = seen_space || current_paragraph->retrieve_para_space(); + seen_space = seen_space + || current_paragraph->retrieve_para_space(); current_paragraph->done_para(); - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; current_paragraph->do_para("", seen_space); } end_center = next_center; @@ -2930,11 +3004,11 @@ void html_printer::do_eol_ce (void) if (end_center > 1) if (current_paragraph->emitted_text()) current_paragraph->do_break(); - + end_center--; if (end_center == 0) { current_paragraph->done_para(); - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; } } } @@ -2949,20 +3023,21 @@ void html_printer::do_flush (void) } /* - * do_links - moves onto a new temporary file and sets auto_links to FALSE. + * do_links - moves onto a new temporary file and sets auto_links to + * false. */ void html_printer::do_links (void) { - html.end_line(); // flush line - auto_links = FALSE; /* from now on only emit under user request */ + html.end_line(); // flush line + auto_links = FALSE; // from now on only emit under user request file_list.add_new_file(xtmpfile()); file_list.set_links_required(); html.set_file(file_list.get_file()); } /* - * insert_split_file - + * insert_split_file - */ void html_printer::insert_split_file (void) @@ -2995,7 +3070,7 @@ void html_printer::do_job_name (char *name) { if (! multiple_files) { multiple_files = TRUE; - while (name != NULL && (*name != (char)0) && (*name == ' ')) + while (name != 0 && (*name != (char)0) && (*name == ' ')) name++; job_name = name; } @@ -3013,10 +3088,9 @@ void html_printer::do_head (char *name) } /* - * do_break - handles the ".br" request and also - * undoes an outstanding ".ti" command - * and calls indent if the indentation - * related registers have changed. + * do_break - handles the ".br" request and also undoes an outstanding + * ".ti" command and calls indent if the indentation related + * registers have changed. */ void html_printer::do_break (void) @@ -3029,7 +3103,8 @@ void html_printer::do_break (void) if (end_tempindent > 0) seen_temp_indent = TRUE; } - if (seen_indent || seen_pageoffset || seen_linelength || seen_temp_indent) { + if (seen_indent || seen_pageoffset || seen_linelength + || seen_temp_indent) { if (seen_indent && (! seen_temp_indent)) troff_indent = next_indent; if (! seen_pageoffset) @@ -3043,7 +3118,7 @@ void html_printer::do_break (void) seen_pageoffset = FALSE; do_check_center(); output_hpos = get_troff_indent()+pageoffset; - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; } void html_printer::do_space (char *arg) @@ -3061,7 +3136,7 @@ void html_printer::do_space (char *arg) current_paragraph->do_space(); n--; } - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; } /* @@ -3072,7 +3147,7 @@ void html_printer::do_tab_ts (text_glob *g) { html_table *t = g->get_table(); - if (t != NULL) { + if (t != 0) { current_column = 0; current_paragraph->done_pre(); current_paragraph->done_para(); @@ -3108,7 +3183,7 @@ void html_printer::do_tab_te (void) table->emit_finish_table(); } - table = NULL; + table = 0; restore_troff_indent(); } @@ -3122,7 +3197,8 @@ void html_printer::do_tab (char *s) while (isspace(*s)) s++; s++; - int col = table->find_column(atoi(s) + pageoffset + get_troff_indent()); + int col = table->find_column(atoi(s) + pageoffset + + get_troff_indent()); if (col > 0) { current_paragraph->done_para(); table->emit_col(col); @@ -3175,12 +3251,14 @@ void html_printer::troff_tag (text_glob *g) char *t=(char *)g->text_string+strlen("devtag:"); if (strncmp(g->text_string, "html

    :", strlen("html

    :")) == 0) { do_end_para(g); - } else if (strncmp(g->text_string, "html:", strlen("html:")) == 0) { + } else if (strncmp(g->text_string, "html:", strlen("html:")) + == 0) { if (current_paragraph->emitted_text()) html.put_string(g->text_string+9); else do_end_para(g); - } else if (strncmp(g->text_string, "math:", strlen("math:")) == 0) { + } else if (strncmp(g->text_string, "math:", strlen("math:")) + == 0) { do_math(g); } else if (g->is_eol()) { do_eol(); @@ -3204,20 +3282,21 @@ void html_printer::troff_tag (text_glob *g) do_auto_image(g, a); } else if (strncmp(t, ".ce", 3) == 0) { char *a = (char *)t+3; - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; do_center(a); } else if (g->is_tl()) { - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; title.with_h1 = TRUE; do_title(); } else if (strncmp(t, ".html-tl", 8) == 0) { - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; title.with_h1 = FALSE; do_title(); } else if (strncmp(t, ".fi", 3) == 0) { char *a = (char *)t+3; do_fill(a); - } else if ((strncmp(t, ".SH", 3) == 0) || (strncmp(t, ".NH", 3) == 0)) { + } else if ((strncmp(t, ".SH", 3) == 0) + || (strncmp(t, ".NH", 3) == 0)) { char *a = (char *)t+3; do_heading(a); } else if (strncmp(t, ".ll", 3) == 0) { @@ -3277,7 +3356,8 @@ void html_printer::do_math (text_glob *g) } /* - * is_in_middle - returns TRUE if the positions left..right are in the center of the page. + * is_in_middle - returns TRUE if the positions left..right are in the + * center of the page. */ int html_printer::is_in_middle (int left, int right) @@ -3324,7 +3404,8 @@ void html_printer::flush_globs (void) as.check_fi(fill_on); as.check_ce(end_center); /* - * after processing the title (and removing it) the glyph list might be empty + * after processing the title (and removing it) the glyph list + * might be empty */ if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.move_right(); @@ -3340,7 +3421,7 @@ void html_printer::flush_globs (void) int html_printer::calc_nf (text_glob *g, int nf) { - if (g != NULL) { + if (g != 0) { if (g->is_fi()) { as.check_fi(TRUE); return FALSE; @@ -3382,10 +3463,10 @@ int html_printer::next_horiz_pos (text_glob *g, int nf) { int next = -1; - if ((g != NULL) && (g->is_br() || (nf && g->is_eol()))) + if ((g != 0) && (g->is_br() || (nf && g->is_eol()))) if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.move_right_get_data(); - if (g == NULL) { + if (0 /* nullptr */ == g) { page_contents->glyphs.start_from_head(); as.reset(); } @@ -3405,10 +3486,10 @@ text_glob *html_printer::insert_tab_ts (text_glob *where) { text_glob *start_of_table; text_glob *old_pos = page_contents->glyphs.get_data(); - page_contents->glyphs.move_to(where); page_contents->glyphs.move_left(); - page_contents->insert_tag(string("devtag:.tab-ts")); // tab table start + // tab table start + page_contents->insert_tag(string("devtag:.tab-ts")); page_contents->glyphs.move_right(); start_of_table = page_contents->glyphs.get_data(); page_contents->glyphs.move_to(old_pos); @@ -3424,11 +3505,10 @@ void html_printer::insert_tab_te (void) { text_glob *g = page_contents->glyphs.get_data(); page_contents->dump_page(); - while (page_contents->glyphs.get_data()->is_a_tag()) page_contents->glyphs.move_left(); - - page_contents->insert_tag(string("devtag:.tab-te")); // tab table end + // tab table end + page_contents->insert_tag(string("devtag:.tab-te")); while (g != page_contents->glyphs.get_data()) page_contents->glyphs.move_right(); page_contents->dump_page(); @@ -3444,7 +3524,8 @@ void html_printer::insert_tab_0 (text_glob *where) page_contents->glyphs.move_to(where); page_contents->glyphs.move_left(); - page_contents->insert_tag(string("devtag:tab0")); // tab0 start of line + // tab0 start of line + page_contents->insert_tag(string("devtag:tab0")); page_contents->glyphs.move_right(); page_contents->glyphs.move_to(old_pos); } @@ -3469,7 +3550,7 @@ void html_printer::remove_tabs (void) page_contents->glyphs.move_right(); } while ((! page_contents->glyphs.is_equal_to_head()) && (! g->is_eol())); - + /* * now restore our previous position. */ @@ -3500,7 +3581,8 @@ void html_printer::remove_courier_tabs (void) } } - // line_start = g->is_br() || g->is_nf() || g->is_fi() || (nf && g->is_eol()); + // line_start = g->is_br() || g->is_nf() || g->is_fi() + // || (nf && g->is_eol()); line_start = g->is_br() || (nf && g->is_eol()); page_contents->glyphs.move_right(); } while (! page_contents->glyphs.is_equal_to_head()); @@ -3509,8 +3591,8 @@ void html_printer::remove_courier_tabs (void) void html_printer::insert_tab0_foreach_tab (void) { - text_glob *start_of_line = NULL; - text_glob *g = NULL; + text_glob *start_of_line = 0; + text_glob *g = 0; int seen_tab = FALSE; int seen_col = FALSE; int nf = FALSE; @@ -3526,7 +3608,7 @@ void html_printer::insert_tab0_foreach_tab (void) if (g->is_tab()) seen_tab = TRUE; - + if (g->is_col()) seen_col = TRUE; @@ -3561,14 +3643,16 @@ void html_printer::insert_tab0_foreach_tab (void) } /* - * update_min_max - updates the extent of a column, given the left and right - * extents of a glyph, g. + * update_min_max - updates the extent of a column, given the left and + * right extents of a glyph, g. */ -void html_printer::update_min_max (colType type_of_col, int *minimum, int *maximum, text_glob *g) +void html_printer::update_min_max (colType type_of_col, + int *minimum, int *maximum, + text_glob *g) { switch (type_of_col) { - + case tab_tag: break; case tab0_tag: @@ -3584,8 +3668,8 @@ void html_printer::update_min_max (colType type_of_col, int *minimum, int *maxim } /* - * add_table_end - moves left one glyph, adds a table end tag and adds a - * debugging string. + * add_table_end - moves left one glyph, adds a table end tag and adds + * a debugging string. */ void html_printer::add_table_end (const char * @@ -3609,16 +3693,16 @@ void html_printer::add_table_end (const char * void html_printer::lookahead_for_tables (void) { text_glob *g; - text_glob *start_of_line = NULL; - text_glob *start_of_table = NULL; - text_glob *last = NULL; + text_glob *start_of_line = 0; + text_glob *start_of_table = 0; + text_glob *last = 0; colType type_of_col = none; int found_col = FALSE; int ncol = 0; int colmin = 0; // pacify compiler int colmax = 0; // pacify compiler html_table *tbl = new html_table(&html, -1); - const char *tab_defs = NULL; + const char *tab_defs = 0; char align = 'L'; int nf = FALSE; int old_pageoffset = pageoffset; @@ -3635,9 +3719,9 @@ void html_printer::lookahead_for_tables (void) g = page_contents->glyphs.move_right_get_data(); handle_state_assertion(g); if (page_contents->glyphs.is_equal_to_head()) { - if (tbl != NULL) { + if (tbl != 0) { delete tbl; - tbl = NULL; + tbl = 0; } return; } @@ -3648,7 +3732,7 @@ void html_printer::lookahead_for_tables (void) last = g; found_col = FALSE; } - + do { #if defined(DEBUG_TABLES) fprintf(stderr, " [") ; @@ -3662,16 +3746,16 @@ void html_printer::lookahead_for_tables (void) nf = calc_nf(g, nf); calc_po_in(g, nf); if (g->is_col()) { - if (type_of_col == tab_tag && start_of_table != NULL) { + if (type_of_col == tab_tag && start_of_table != 0) { page_contents->glyphs.move_left(); insert_tab_te(); start_of_table->remember_table(tbl); tbl = new html_table(&html, -1); page_contents->insert_tag(string("*** TAB -> COL ***")); - if (tab_defs != NULL) + if (tab_defs != 0) tbl->tab_stops->init(tab_defs); - start_of_table = NULL; - last = NULL; + start_of_table = 0; + last = 0; } type_of_col = col_tag; found_col = TRUE; @@ -3689,57 +3773,54 @@ void html_printer::lookahead_for_tables (void) if (colmax > 0) colmax += pageoffset + get_troff_indent(); } else if (g->is_tab0()) { - if (type_of_col == col_tag && start_of_table != NULL) { + if (type_of_col == col_tag && start_of_table != 0) { page_contents->glyphs.move_left(); insert_tab_te(); start_of_table->remember_table(tbl); tbl = new html_table(&html, -1); page_contents->insert_tag(string("*** COL -> TAB ***")); - start_of_table = NULL; - last = NULL; + start_of_table = 0; + last = 0; } - if (tab_defs != NULL) + if (tab_defs != 0) tbl->tab_stops->init(tab_defs); - type_of_col = tab0_tag; ncol = 1; colmin = 0; colmax = tbl->get_tab_pos(2) + pageoffset + get_troff_indent(); } else if (! g->is_a_tag()) update_min_max(type_of_col, &colmin, &colmax, g); - if ((g->is_col() || g->is_tab() || g->is_tab0()) - && (start_of_line != NULL) && (start_of_table == NULL)) { + && (start_of_line != 0) + && (0 /* nullptr */ == start_of_table)) { start_of_table = insert_tab_ts(start_of_line); - start_of_line = NULL; - } else if (g->is_ce() && (start_of_table != NULL)) { + start_of_line = 0; + } else if (g->is_ce() && (start_of_table != 0)) { add_table_end("*** CE ***"); start_of_table->remember_table(tbl); - tbl = new html_table(&html, -1); - start_of_table = NULL; - last = NULL; + tbl = new html_table(&html, -1); + start_of_table = 0; + last = 0; } else if (g->is_ta()) { tab_defs = g->text_string; - if (type_of_col == col_tag) tbl->tab_stops->check_init(tab_defs); - if (!tbl->tab_stops->compatible(tab_defs)) { - if (start_of_table != NULL) { + if (start_of_table != 0) { add_table_end("*** TABS ***"); start_of_table->remember_table(tbl); tbl = new html_table(&html, -1); - start_of_table = NULL; + start_of_table = 0; type_of_col = none; - last = NULL; + last = 0; } tbl->tab_stops->init(tab_defs); } } - - if (((! g->is_a_tag()) || g->is_tab()) && (start_of_table != NULL)) { + if (((! g->is_a_tag()) || g->is_tab()) && (start_of_table != 0)) { // we are in a table and have a glyph - if ((ncol == 0) || (! tbl->add_column(ncol, colmin, colmax, align))) { + if ((ncol == 0) + || (! tbl->add_column(ncol, colmin, colmax, align))) { if (ncol == 0) add_table_end("*** NCOL == 0 ***"); else @@ -3747,19 +3828,17 @@ void html_printer::lookahead_for_tables (void) start_of_table->remember_table(tbl); tbl = new html_table(&html, -1); - start_of_table = NULL; + start_of_table = 0; type_of_col = none; - last = NULL; + last = 0; } } - /* * move onto next glob, check whether we are starting a new line */ g = page_contents->glyphs.move_right_get_data(); handle_state_assertion(g); - - if (g == NULL) { + if (0 /* nullptr */ == g) { if (found_col) { page_contents->glyphs.start_from_head(); as.reset(); @@ -3771,34 +3850,34 @@ void html_printer::lookahead_for_tables (void) g = page_contents->glyphs.move_right_get_data(); handle_state_assertion(g); nf = calc_nf(g, nf); - } while ((g != NULL) && (g->is_br() || (nf && g->is_eol()))); + } while ((g != 0) && (g->is_br() || (nf && g->is_eol()))); start_of_line = g; ncol = 0; if (found_col) last = g; found_col = FALSE; } - } while ((g != NULL) && (! page_contents->glyphs.is_equal_to_head())); + } while ((g != 0) && (! page_contents->glyphs.is_equal_to_head())); #if defined(DEBUG_TABLES) fprintf(stderr, "finished scanning for tables\n"); #endif page_contents->glyphs.start_from_head(); - if (start_of_table != NULL) { - if (last != NULL) + if (start_of_table != 0) { + if (last != 0) while (last != page_contents->glyphs.get_data()) page_contents->glyphs.move_left(); insert_tab_te(); start_of_table->remember_table(tbl); - tbl = NULL; - page_contents->insert_tag(string("*** LAST ***")); + tbl = 0; + page_contents->insert_tag(string("*** LAST ***")); } } - if (tbl != NULL) { + if (tbl != 0) { delete tbl; - tbl = NULL; + tbl = 0; } // and reset the registers @@ -3810,21 +3889,18 @@ void html_printer::lookahead_for_tables (void) void html_printer::flush_page (void) { - supress_sub_sup = TRUE; + suppress_sub_sup = TRUE; flush_sbuf(); page_contents->dump_page(); lookahead_for_tables(); page_contents->dump_page(); - flush_globs(); current_paragraph->done_para(); current_paragraph->flush_text(); - // move onto a new page delete page_contents; #if defined(DEBUG_TABLES) fprintf(stderr, "\n\n*** flushed page ***\n\n"); - html.simple_comment("new page called"); #endif page_contents = new page; @@ -3832,7 +3908,7 @@ void html_printer::flush_page (void) /* * determine_space - works out whether we need to write a space. - * If last glyph is ajoining then no space emitted. + * If last glyph is adjoining, then emit no space. */ void html_printer::determine_space (text_glob *g) @@ -3975,8 +4051,9 @@ void html_printer::start_font (const char *fontname) /* * start_size - from is old font size, to is the new font size. - * The html increase and decrease alters the - * font size by 20%. We try and map these onto glyph sizes. + * The HTML elements and respectively + * increase and decrease the font size by 20%. We try and + * map these onto glyph sizes. */ void html_printer::start_size (int from, int to) @@ -4044,14 +4121,15 @@ int html_printer::start_subscript (text_glob *g) int r = font::res; int height = output_style.point_size*r/72; - return( (output_style.point_size != 0) && + return ((output_style.point_size != 0) && (output_vpos < g->minv) && (output_vpos-height > g->maxv) && - (output_style.point_size > g->text_style.point_size) ); + (output_style.point_size > g->text_style.point_size)); } /* - * start_superscript - returns TRUE if, g, looks like a superscript start. + * start_superscript - returns TRUE if, g, looks like a superscript + * start. */ int html_printer::start_superscript (text_glob *g) @@ -4059,14 +4137,15 @@ int html_printer::start_superscript (text_glob *g) int r = font::res; int height = output_style.point_size*r/72; - return( (output_style.point_size != 0) && + return ((output_style.point_size != 0) && (output_vpos > g->minv) && (output_vpos-height < g->maxv) && - (output_style.point_size > g->text_style.point_size) ); + (output_style.point_size > g->text_style.point_size)); } /* - * end_subscript - returns TRUE if, g, looks like the end of a subscript. + * end_subscript - returns TRUE if, g, looks like the end of a + * subscript. */ int html_printer::end_subscript (text_glob *g) @@ -4074,14 +4153,15 @@ int html_printer::end_subscript (text_glob *g) int r = font::res; int height = output_style.point_size*r/72; - return( (output_style.point_size != 0) && + return ((output_style.point_size != 0) && (g->minv < output_vpos) && (output_vpos-height > g->maxv) && - (output_style.point_size < g->text_style.point_size) ); + (output_style.point_size < g->text_style.point_size)); } /* - * end_superscript - returns TRUE if, g, looks like the end of a superscript. + * end_superscript - returns TRUE if, g, looks like the end of a + * superscript. */ int html_printer::end_superscript (text_glob *g) @@ -4089,21 +4169,21 @@ int html_printer::end_superscript (text_glob *g) int r = font::res; int height = output_style.point_size*r/72; - return( (output_style.point_size != 0) && + return ((output_style.point_size != 0) && (g->minv > output_vpos) && (output_vpos-height < g->maxv) && - (output_style.point_size < g->text_style.point_size) ); + (output_style.point_size < g->text_style.point_size)); } /* - * do_sup_or_sub - checks to see whether the next glyph is a subscript/superscript - * start/end and it calls the services of html-text to issue the - * appropriate tags. + * do_sup_or_sub - checks to see whether the next glyph is a + * subscript/superscript start/end and it calls the + * services of html-text to issue the appropriate tags. */ void html_printer::do_sup_or_sub (text_glob *g) { - if (! supress_sub_sup) { + if (! suppress_sub_sup) { if (start_subscript(g)) { current_paragraph->do_sub(); } else if (start_superscript(g)) { @@ -4130,7 +4210,7 @@ void html_printer::do_end_para (text_glob *g) output_vpos = g->minv; output_hpos = g->maxh; output_vpos_max = g->maxv; - supress_sub_sup = FALSE; + suppress_sub_sup = FALSE; } /* @@ -4145,7 +4225,7 @@ void html_printer::emit_html (text_glob *g) output_vpos = g->minv; output_hpos = g->maxh; output_vpos_max = g->maxv; - supress_sub_sup = FALSE; + suppress_sub_sup = FALSE; } /* @@ -4160,15 +4240,13 @@ void html_printer::flush_sbuf() if (overstrike_detected && (! is_bold(sbuf_style.f))) { font *bold_font = make_bold(sbuf_style.f); - if (bold_font != NULL) + if (bold_font != 0) sbuf_style.f = bold_font; } - page_contents->add(&sbuf_style, sbuf, - line_number, - sbuf_vpos-sbuf_style.point_size*r/72, sbuf_start_hpos, - sbuf_vpos , sbuf_end_hpos); - + page_contents->add(&sbuf_style, sbuf, line_number, + (sbuf_vpos - (sbuf_style.point_size * r / 72)), + sbuf_start_hpos, sbuf_vpos, sbuf_end_hpos); output_hpos = sbuf_end_hpos; output_vpos = sbuf_vpos; last_sbuf_length = 0; @@ -4183,7 +4261,8 @@ void html_printer::set_line_thickness(const environment *env) line_thickness = env->size; } -void html_printer::draw(int code, int *p, int np, const environment *env) +void html_printer::draw(int code, int *p, int np, + const environment *env) { switch (code) { @@ -4192,7 +4271,9 @@ void html_printer::draw(int code, int *p, int np, const environment *env) if (np == 2) { page_contents->add_line(&sbuf_style, line_number, - env->hpos, env->vpos, env->hpos+p[0], env->vpos+p[1], line_thickness); + env->hpos, env->vpos, + (env->hpos + p[0]), (env->vpos + p[1]), + line_thickness); } else { error("2 arguments required for line"); } @@ -4233,7 +4314,7 @@ void html_printer::draw(int code, int *p, int np, const environment *env) break; case 'F': // fill with color env->fill - if (background != NULL) + if (background != 0) delete background; background = new color; *background = *env->fill; @@ -4257,10 +4338,10 @@ html_printer::html_printer() inside_font_style(0), page_number(0), header_indent(-1), - supress_sub_sup(TRUE), + suppress_sub_sup(TRUE), cutoff_heading(100), - indent(NULL), - table(NULL), + indent(0), + table(0), end_center(0), end_tempindent(0), next_tag(INLINE), @@ -4290,9 +4371,9 @@ html_printer::html_printer() file_list.add_new_file(xtmpfile()); html.set_file(file_list.get_file()); if (font::hor != 24) - fatal("horizontal resolution must be 24"); + fatal("horizontal motion quantum must be 24"); if (font::vert != 40) - fatal("vertical resolution must be 40"); + fatal("vertical motion quantum must be 40"); #if 0 // should be sorted html.. if (font::res % (font::sizescale*72) != 0) @@ -4322,25 +4403,25 @@ html_printer::html_printer() void html_printer::add_to_sbuf (glyph *g, const string &s) { - if (sbuf_style.f == NULL) + if (0 /* nullptr */ == sbuf_style.f) return; - const char *html_glyph = NULL; + const char *html_glyph = 0; unsigned int code = sbuf_style.f->get_code(g); if (s.empty()) { if (sbuf_style.f->contains(g)) html_glyph = get_html_entity(sbuf_style.f->get_code(g)); else - html_glyph = NULL; - - if ((html_glyph == NULL) && (code >= UNICODE_DESC_START)) + html_glyph = 0; + + if ((0 /* nullptr */ == html_glyph) && (code >= UNICODE_DESC_START)) html_glyph = to_unicode(code); - } else + } else html_glyph = get_html_translation(sbuf_style.f, s); last_sbuf_length = sbuf.length(); - if (html_glyph == NULL) + if (0 /* nullptr */ == html_glyph) sbuf += ((char)code); else sbuf += html_glyph; @@ -4361,8 +4442,9 @@ int html_printer::sbuf_continuation (glyph *g, const char *name, sbuf_end_hpos += w + sbuf_kern; return TRUE; } else { - if ((env->hpos >= sbuf_end_hpos) && - ((sbuf_kern == 0) || (sbuf_end_hpos - sbuf_kern != env->hpos))) { + if ((env->hpos >= sbuf_end_hpos) + && ((sbuf_kern == 0) + || (sbuf_end_hpos - sbuf_kern != env->hpos))) { /* * lets see whether a space is needed or not */ @@ -4375,33 +4457,35 @@ int html_printer::sbuf_continuation (glyph *g, const char *name, } } } - return FALSE ; + return FALSE; } /* - * get_html_translation - given the position of the character and its name - * return the device encoding for such character. + * get_html_translation - given the position of the character and its + * name return the device encoding for such + * character. */ const char *get_html_translation (font *f, const string &name) { - if ((f == 0) || name.empty()) - return NULL; + if ((0 /* nullptr */ == f) || name.empty()) + return 0; else { glyph *g = name_to_glyph((char *)(name + '\0').contents()); if (f->contains(g)) return get_html_entity(f->get_code(g)); else - return NULL; + return 0; } } /* - * get_html_entity - given a Unicode character's code point, return a + * get_html_entity - given a Unicode character's code point, return an * HTML entity that represents the character, if the * character cannot represent itself in all contexts. - * The return value, if non-NULL, is allocated in a static buffer and is - * only valid until the next call of this function. + * the return value, if not a null pointer, is + * allocated in a static buffer and is only valid + * until the next call of this function. */ static const char *get_html_entity (unsigned int code) { @@ -4411,7 +4495,7 @@ static const char *get_html_entity (unsigned int code) case 0x0026: return "&"; case 0x003C: return "<"; case 0x003E: return ">"; - default: return NULL; + default: return 0; } } else { switch (code) { @@ -4656,18 +4740,19 @@ static const char *get_html_entity (unsigned int code) } } } - + /* - * overstrike - returns TRUE if the glyph (i, name) is going to overstrike - * a previous glyph in sbuf. - * If TRUE the font is changed to bold and the previous sbuf - * is flushed. + * overstrike - returns TRUE if the glyph (i, name) is going to + * overstrike a previous glyph in sbuf. If TRUE the font + * is changed to bold and the previous sbuf is flushed. */ -int html_printer::overstrike(glyph *g, const char *name, const environment *env, int w) +int html_printer::overstrike(glyph *g, const char *name, + const environment *env, int w) { if ((env->hpos < sbuf_end_hpos) - || ((sbuf_kern != 0) && (sbuf_end_hpos - sbuf_kern < env->hpos))) { + || ((sbuf_kern != 0) && (sbuf_end_hpos - sbuf_kern < env->hpos))) + { /* * at this point we have detected an overlap */ @@ -4688,7 +4773,7 @@ int html_printer::overstrike(glyph *g, const char *name, const environment *env, return TRUE; } } - return FALSE ; + return FALSE; } /* @@ -4700,20 +4785,23 @@ int html_printer::overstrike(glyph *g, const char *name, const environment *env, void html_printer::set_char(glyph *g, font *f, const environment *env, int w, const char *name) { - style sty(f, env->size, env->height, env->slant, env->fontno, *env->col); + style sty(f, env->size, env->height, env->slant, env->fontno, + *env->col); if (sty.slant != 0) { if (sty.slant > 80 || sty.slant < -80) { - error("silly slant '%1' degrees", sty.slant); + error("slant of %1 degrees out of range", sty.slant); sty.slant = 0; } } - if (((! sbuf.empty()) && (sty == sbuf_style) && (sbuf_vpos == env->vpos)) + if (((!sbuf.empty()) + && (sty == sbuf_style) + && (sbuf_vpos == env->vpos)) && (sbuf_continuation(g, name, env, w) || overstrike(g, name, env, w))) return; - + flush_sbuf(); - if (sbuf_style.f == NULL) + if (0 /* nullptr */ == sbuf_style.f) sbuf_style = sty; add_to_sbuf(g, name); sbuf_end_hpos = env->hpos + w; @@ -4725,9 +4813,9 @@ void html_printer::set_char(glyph *g, font *f, const environment *env, } /* - * set_numbered_char - handle numbered characters. - * Negative values are interpreted as unbreakable spaces; - * the value (taken positive) gives the width. + * set_numbered_char - handle numbered characters. Negative values are + * interpreted as unbreakable spaces; the value + * (taken positive) gives the width. */ void html_printer::set_numbered_char(int num, const environment *env, @@ -4741,12 +4829,12 @@ void html_printer::set_numbered_char(int num, const environment *env, glyph *g = number_to_glyph(num); int fn = env->fontno; if (fn < 0 || fn >= nfonts) { - error("bad font position '%1'", fn); + error("invalid font position '%1'", fn); return; } font *f = font_table[fn]; if (f == 0) { - error("no font mounted at '%1'", fn); + error("no font mounted at position %1", fn); return; } if (!f->contains(g)) { @@ -4766,29 +4854,28 @@ void html_printer::set_numbered_char(int num, const environment *env, set_char(g, f, env, w, 0); } -glyph *html_printer::set_char_and_width(const char *nm, const environment *env, +glyph *html_printer::set_char_and_width(const char *nm, + const environment *env, int *widthp, font **f) { glyph *g = name_to_glyph(nm); int fn = env->fontno; if (fn < 0 || fn >= nfonts) { - error("bad font position '%1'", fn); + error("invalid font position '%1'", fn); return UNDEFINED_GLYPH; } *f = font_table[fn]; if (*f == 0) { - error("no font mounted at '%1'", fn); + error("no font mounted at position %1", fn); return UNDEFINED_GLYPH; } if (!(*f)->contains(g)) { if (nm[0] != '\0' && nm[1] == '\0') - error("font '%1' does not contain ascii character '%2'", - (*f)->get_name(), - nm[0]); + error("font '%1' does not contain ordinary character '%2'", + (*f)->get_name(), nm[0]); else error("font '%1' does not contain special character '%2'", - (*f)->get_name(), - nm); + (*f)->get_name(), nm); return UNDEFINED_GLYPH; } int w = (*f)->get_width(g, env->size); @@ -4827,7 +4914,7 @@ void html_printer::write_title (int in_head) } /* - * write_rule - emits a html rule tag, if the auto_rule boolean is true. + * write_rule - emits HTML rule element if the auto_rule is TRUE. */ static void write_rule (void) @@ -4844,7 +4931,8 @@ void html_printer::begin_page(int n) { page_number = n; #if defined(DEBUGGING) - html.begin_comment("Page: ").put_string(i_to_a(page_number)).end_comment();; + html.begin_comment("Page: ") + .put_string(i_to_a(page_number)).end_comment();; #endif no_of_printed_pages++; @@ -4874,11 +4962,11 @@ font *html_printer::make_font(const char *nm) void html_printer::do_body (void) { - if (background == NULL) + if (0 /* nullptr */ == background) fputs("\n\n", stdout); else { + char buf[(INT_HEXDIGITS * 3) + 1]; unsigned int r, g, b; - char buf[6+1]; background->get_rgb(&r, &g, &b); // we have to scale 0..0xFFFF to 0..0xFF @@ -4908,8 +4996,10 @@ void html_printer::emit_link (const string &to, const char *name) * file fragments. */ -void html_printer::write_navigation (const string &top, const string &prev, - const string &next, const string ¤t) +void html_printer::write_navigation (const string &top, + const string &prev, + const string &next, + const string ¤t) { int need_bar = FALSE; @@ -4919,27 +5009,33 @@ void html_printer::write_navigation (const string &top, const string &prev, if (groff_sig) fputs("\n\n\n" - "\n" + "" + "\n" "
    ", stdout); handle_valid_flag(FALSE); fputs("[ ", stdout); - if ((strcmp(prev.contents(), "") != 0) && prev != top && prev != current) { + if ((strcmp(prev.contents(), "") != 0) + && prev != top + && prev != current) { emit_link(prev, "prev"); need_bar = TRUE; } - if ((strcmp(next.contents(), "") != 0) && next != top && next != current) { + if ((strcmp(next.contents(), "") != 0) + && next != top + && next != current) { if (need_bar) fputs(" | ", stdout); emit_link(next, "next"); need_bar = TRUE; } - if (top != "" && (strcmp(top.contents(), "") != 0) && top != current) { + if (top != "" + && (strcmp(top.contents(), "") != 0) + && top != current) { if (need_bar) fputs(" | ", stdout); emit_link(top, "top"); } fputs(" ]\n", stdout); - if (groff_sig) { fputs("" "This document was produced using " @@ -4953,13 +5049,11 @@ void html_printer::write_navigation (const string &top, const string &prev, } /* - * do_file_components - scan the file list copying each temporary - * file in turn. This is used twofold: - * - * firstly to emit section heading links, - * between file fragments if required and - * secondly to generate jobname file fragments - * if required. + * do_file_components - scan the file list copying each temporary file + * in turn. This has twofold use: firstly to emit + * section heading links, between file fragments + * if required and secondly to generate jobname + * file fragments if required. */ void html_printer::do_file_components (void) @@ -4985,7 +5079,6 @@ void html_printer::do_file_components (void) fatal("fseek on temporary file failed"); html.copy_file(file_list.get_file()); fclose(file_list.get_file()); - file_list.move_next(); if (file_list.is_new_output_file()) { #ifdef LONG_FOR_TIME_T @@ -5003,21 +5096,28 @@ void html_printer::do_file_components (void) string split_file = file_list.file_name(); split_file += '\0'; fflush(stdout); - freopen(split_file.contents(), "w", stdout); + if (!freopen(split_file.contents(), "w", stdout)) { + fatal("unable to reopen standard output stream: %1", + strerror(errno)); + } fragment_no++; if (dialect == xhtml) writeHeadMetaStyle(); - html.begin_comment("Creator : ") - .put_string("groff ") - .put_string("version ") - .put_string(Version_string) - .end_comment(); + if (do_write_creator_comment) { + html.begin_comment("Creator : ") + .put_string("groff ") + .put_string("version ") + .put_string(Version_string) + .end_comment(); + } - t = current_time(); - html.begin_comment("CreationDate: ") - .put_string(ctime(&t), strlen(ctime(&t))-1) - .end_comment(); + if (do_write_date_comment) { + t = current_time(); + html.begin_comment("CreationDate: ") + .put_string(ctime(&t), strlen(ctime(&t))-1) + .end_comment(); + } if (dialect == html4) writeHeadMetaStyle(); @@ -5036,13 +5136,15 @@ void html_printer::do_file_components (void) if (fragment_no > 1) write_navigation(top, prev, next, current); else { + assert(current_paragraph != 0); current_paragraph->done_para(); write_rule(); if (valid_flag) { if (groff_sig) fputs("\n\n\n" - "\n" + "" + "\n" "
    ", stdout); handle_valid_flag(TRUE); if (groff_sig) { @@ -5066,7 +5168,8 @@ void html_printer::do_file_components (void) void html_printer::writeHeadMetaStyle (void) { if (dialect == html4) { - fputs("\n", stdout); fputs("\n", stdout); fputs("\n", stdout); @@ -5074,23 +5177,28 @@ void html_printer::writeHeadMetaStyle (void) "content=\"groff -Thtml, see www.gnu.org\">\n", stdout); fputs("\n", stdout); - fputs("\n", stdout); + fputs("\n", + stdout); fputs("