diff options
author | Karl Berry <karl@freefriends.org> | 2024-07-09 20:17:49 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-07-09 20:17:49 +0000 |
commit | d79ba8ae2d18f466586fdaf01f9926502b31e1a3 (patch) | |
tree | ca4af747db7de4ab8f043803968ba0d78ec5f321 /Master/texmf-dist/doc | |
parent | 04b79c3d51cb074a178a9c1f58cde952d79d3b65 (diff) |
typog (9jul24)
git-svn-id: svn://tug.org/texlive/trunk@71756 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
22 files changed, 1954 insertions, 375 deletions
diff --git a/Master/texmf-dist/doc/latex/typog/LICENSE b/Master/texmf-dist/doc/latex/typog/LICENSE new file mode 100644 index 00000000000..888d9e68e7a --- /dev/null +++ b/Master/texmf-dist/doc/latex/typog/LICENSE @@ -0,0 +1,415 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3c + % of this license or (at your option) any later version. + % The latest version of this license is in + % https://www.latex-project.org/lppl.txt + % and version 1.3c or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. diff --git a/Master/texmf-dist/doc/latex/typog/README.md b/Master/texmf-dist/doc/latex/typog/README.md index fb55ccb1e12..c67519bffc6 100644 --- a/Master/texmf-dist/doc/latex/typog/README.md +++ b/Master/texmf-dist/doc/latex/typog/README.md @@ -1,3 +1,6 @@ +![distcheck status](https://github.com/cspiel/typog/actions/workflows/distcheck.yml/badge.svg) + + # TypoG – Typographic Fine-Tuning for LaTeX LaTeX package `typog` provides macros for (micro-)typographic enhancements; @@ -8,6 +11,7 @@ it covers a variety of topics: * Manual italic correction * Extra kerning for slash and hyphen * Raising selected characters (e.g. hyphen, en-dash, and em-dash) +* Adjusting the vertical position of `itemize`'s labels * Aligning of the last line of a paragraph * Filling of the last line last line of a paragraph * Word spacing control diff --git a/Master/texmf-dist/doc/latex/typog/RELEASE-HOWTO.md b/Master/texmf-dist/doc/latex/typog/RELEASE-HOWTO.md deleted file mode 100644 index 13435ef66d5..00000000000 --- a/Master/texmf-dist/doc/latex/typog/RELEASE-HOWTO.md +++ /dev/null @@ -1,51 +0,0 @@ -# How to prepare a new release - -... and not make too many mistakes. - - -1. Check that the work-area is clean with respect to **git**-tracked - files. - - ``` git status ``` - -1. Update the date stamp of `\ProvidesPackage`. - -1. (Temporarily) Zero the `\overfullrule`s of the documentation and - the example files. - -1. Thoroughly clean the work-area: - - ```make maintainer-clean``` - -1. Rebuild: - - ```make``` - -1. Check that all _*.sty_ and _*.pdf_ files are in good shape. - -1. Push the documentation files created in the previous step down into - the *docs* directory: - - ```make update-docs``` - -1. Undo the `\overfullrule` change. - -1. Commit the changes: - - ``` - git add . - ``` - - and finally - - ``` - git commit - ``` - -1. Tag the commit with the version string of `\ProvidesPackage`: - - ```git tag v1.23``` - -1. Push the changes to the public repository: - - ```git push origin master --tags``` diff --git a/Master/texmf-dist/doc/latex/typog/crooked-paragraphs.mp b/Master/texmf-dist/doc/latex/typog/crooked-paragraphs.mp index 778a3bc3846..7667b66b1d6 100644 --- a/Master/texmf-dist/doc/latex/typog/crooked-paragraphs.mp +++ b/Master/texmf-dist/doc/latex/typog/crooked-paragraphs.mp @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% diff --git a/Master/texmf-dist/doc/latex/typog/index.md b/Master/texmf-dist/doc/latex/typog/index.md deleted file mode 100644 index f4dc2e8bd9a..00000000000 --- a/Master/texmf-dist/doc/latex/typog/index.md +++ /dev/null @@ -1,5 +0,0 @@ -### Package Documentation - -- Comprehensive `typog` documentation: [typog.pdf](https://cspiel.github.io/typog/typog.pdf) -- `typog` examples and tests: [typog-example.pdf](https://cspiel.github.io/typog/typog-example.pdf) -- **typog-grep** manual page: [typog-grep.1](https://cspiel.github.io/typog/typog-grep.1) and as PDF: [typog-grep.1.pdf](https://cspiel.github.io/typog/typog-grep.1.pdf) diff --git a/Master/texmf-dist/doc/latex/typog/slant-angle.mp b/Master/texmf-dist/doc/latex/typog/slant-angle.mp index f25f790ea6f..61f2d248e22 100644 --- a/Master/texmf-dist/doc/latex/typog/slant-angle.mp +++ b/Master/texmf-dist/doc/latex/typog/slant-angle.mp @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% diff --git a/Master/texmf-dist/doc/latex/typog/smooth-parshapes.mp b/Master/texmf-dist/doc/latex/typog/smooth-parshapes.mp index ce47135a56e..dcf66fd0527 100644 --- a/Master/texmf-dist/doc/latex/typog/smooth-parshapes.mp +++ b/Master/texmf-dist/doc/latex/typog/smooth-parshapes.mp @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% diff --git a/Master/texmf-dist/doc/latex/typog/teximan2latex.sed b/Master/texmf-dist/doc/latex/typog/teximan2latex.sed index b329ac3845f..ff0a7e65328 100644 --- a/Master/texmf-dist/doc/latex/typog/teximan2latex.sed +++ b/Master/texmf-dist/doc/latex/typog/teximan2latex.sed @@ -10,35 +10,49 @@ /@menu/,/@end menu/d ## Convert sectioning macros to our own hierarchy. -s/^@chapter \(.*\)$/\\subsection*{\\textls[40]{\1}}/ -s/^@section \(.*\)$/\\subsubsection*{\1}/ +s/^@chapter \(.*\)$/\\subsection{\\titlecase{\1}\\label{\1}}/ +s/^@section \(.*\)$/\\subsubsection{\\titlecase{\1}}\\label{\1}/ ## Make `@asis' list resemble the Texinfo format. s/@table @asis/\\begin{list}{}{\\itemindent=-20pt\\leftmargin=20pt}/ s/@end table/\\end{list}/ +## We substitute our maxipage environment for @display. +s/@display/\\begin{maxipage}/ +s/@end display/\\end{maxipage}/ + +## Translate `@example' environments. +s/@example/\\begin{quote}\\tt\\obeylines/ +s/@end example/\\end{quote}\n\n/ + ## Indenting by four spaces generates a `verbatim' environment. s/@verbatim/\\begin{verbatim}/ s/@end verbatim/\\end{verbatim}/ -## We substitute @display for our maxipage environment. -s/@display/\\begin{maxipage}/ -s/@end display/\\end{maxipage}/ - ## The argument format of the URL macro is different. s/@url{\([^,]*\), \([^}]*\)}/\\href{\1}{\2}/g ## Use our own markup. s/\.\.\./\\dots{}/g s/LaTeX/\\LaTeX{}/g -s/@file/\\textit/g +s/@file/\\emph/g s/@strong/\\textbf/g +s/@var/\\emph/g s/[w]{/mbox{/g +## Translate some Texinfo macros. +s/@backslashchar/\\char`\\\\/g +s/@lbracechar/\\{/g +s/@noindent/\\noindent/g +s/@rbracechar/\\}/g + ## Quote some special characters. s/%/\\%/g s/_/\\_/g +## Add space around alternative-indicators. +s/[|]/\\,|\\,/g + ## Adapt to how a man-page is typeset. ## En-dashes in front of long options really suck! s/--/-\\nolig*-/g @@ -52,4 +66,4 @@ s/@@/@/g s/\\jobname/\\textbackslash jobname/g ## Make qualified Perl names breakable. -s/::/::\\discretionary{}{}{}/g +s/::/::\\breakpoint*/g diff --git a/Master/texmf-dist/doc/latex/typog/title.mp b/Master/texmf-dist/doc/latex/typog/title.mp index 2fd74e91f9d..21e47883ee5 100644 --- a/Master/texmf-dist/doc/latex/typog/title.mp +++ b/Master/texmf-dist/doc/latex/typog/title.mp @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% diff --git a/Master/texmf-dist/doc/latex/typog/typog-example.pdf b/Master/texmf-dist/doc/latex/typog/typog-example.pdf Binary files differindex 621ac319d20..48a8a506e14 100644 --- a/Master/texmf-dist/doc/latex/typog/typog-example.pdf +++ b/Master/texmf-dist/doc/latex/typog/typog-example.pdf diff --git a/Master/texmf-dist/doc/latex/typog/typog-example.tex b/Master/texmf-dist/doc/latex/typog/typog-example.tex index af04d490094..470bd830723 100644 --- a/Master/texmf-dist/doc/latex/typog/typog-example.tex +++ b/Master/texmf-dist/doc/latex/typog/typog-example.tex @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% @@ -42,10 +44,14 @@ \usepackage{fullwidth} \usepackage{hyphenat} \usepackage{mathtools} -\usepackage[activate=true, verbose=true]{microtype} +\usepackage[activate=true, verbose=false]{microtype} \usepackage{ragged2e} \usepackage[nobottomtitles*]{titlesec}\renewcommand*{\bottomtitlespace}{.2\textheight} -\usepackage[debug, trackingttspacing]{typog} +\usepackage{trace} +\usepackage[debug, + trackingttspacing, + uppercaselabelitemadjustments={0pt, .1em, .15em, .1em}, + lowercaselabelitemadjustments={-.0667em, 0pt, .1em, 0pt}]{typog} \usepackage{xcolor} \usepackage[loosest, proportional, scaled=1.064]{erewhon} @@ -55,49 +61,42 @@ \usepackage{setspace}\setstretch{1.08333} \def\xsfdefault{\relax} -{ - \def\examplefont{6} - - \ifcase\examplefont % 0 -- document's default sans-serif font (e.g., ecrm1000) - \gdef\examplefontname{default} - \global\let\xsf=\sf - \global\let\xsfdefault=\sfdefault - \or % 1 -- Nunito - \gdef\examplefontname{Nunito} - \usepackage{nunito} - \xdef\xsfdefault{\rmdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \or % 2 -- OpenSans - \gdef\examplefontname{OpenSans} - \usepackage[defaultsans]{opensans} - \xdef\xsfdefault{\sfdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \or % 3 -- Noto Sans - \gdef\examplefontname{OpenSans} - \usepackage[sfdefault]{noto} - \xdef\xsfdefault{\sfdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \or % 4 -- Roboto - \gdef\examplefontname{Roboto} - \usepackage[sfdefault]{roboto} - \xdef\xsfdefault{\sfdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \or % 5 -- Montserrat - \gdef\examplefontname{Montserrat Alternate} - \usepackage[alternates]{montserrat} - \xdef\xsfdefault{\sfdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \or % 6 -- Inter - \gdef\examplefontname{Inter} - \usepackage[sfdefault]{inter} - \xdef\xsfdefault{\sfdefault} - \gdef\xsf{\let\sfdefault=\xsfdefault\sf} - \else - \SelectedUnknownExampleFont - \fi - \typeout{typog-example: font for examples: `\xsfdefault'}% -} +\def\examplefont{6} + +\ifcase\examplefont % 0 -- document's default sans-serif font (e.g., ecrm1000) + \def\examplefontname{default} + \let\xsf=\sf + \let\xsfdefault=\sfdefault +\or % 1 -- Nunito + \def\examplefontname{Nunito} + \def\xsfdefault{Nunito-TOsF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\or % 2 -- OpenSans + \def\examplefontname{OpenSans} + \def\xsfdefault{opensans-TLF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\or % 3 -- Noto Sans + \def\examplefontname{Noto Sans} + \def\xsfdefault{NotoSans-TLF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\or % 4 -- Roboto + \def\examplefontname{Roboto} + \def\xsfdefault{Roboto-LF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\or % 5 -- Montserrat + \def\examplefontname{Montserrat Alternates} + \def\xsfdefault{MontserratAlternates-LF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\or % 6 -- Inter + \def\examplefontname{Inter} + \def\xsfdefault{Inter-LF} + \def\xsf{\let\sfdefault=\xsfdefault\sf} +\else + \SelectedUnknownExampleFont +\fi + +\typeout{typog-example: font for examples: `\xsfdefault'}% \usepackage{hyperref} \usepackage{cleveref} @@ -204,7 +203,6 @@ concentrate all the badness in one place, making one truly unsightly line instead of two moderately bad ones, because a single ``write-off'' produces fewest total demerits according to the rules.} - %There is a much better way to get the desired effect:~[\dots] \newcommand*{\texbooktolerancesamplecredits} {\medskip\noindent \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~107]{knuth:1986}.}} @@ -212,7 +210,7 @@ \newcommand*{\texbookparfillskipsample} {We still haven't discussed the special trick that allows the final line of a paragraph to be shorter than the others. Just before \TeX{} begins to choose breakpoints, - it does two important things: [\dots]} + it does two important things: [\dots\itcorr{-4}]} \newcommand*{\texbooklongparfillskipsample} {We still haven't discussed the special trick that allows the final line of a paragraph to be shorter than the others. Just before \TeX{} begins to choose breakpoints, @@ -220,7 +218,7 @@ that glue is discarded. (The reason is that a blank space often gets into a token list just before \code{\char92par} or just before \code{\char36\char36}, and this blank space should not be part of the paragraph.) (2)~Three or more items are put at the end of the - current horizontal list~[\dots]} + current horizontal list~[\dots\itcorr{-4}]} \newcommand*{\texbookparfillskipsamplecredits} {\medskip\noindent \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~99n]{knuth:1986}.}} @@ -271,7 +269,7 @@ The font used in this example is \exfontnameinfo, \exfontsizeinfo*.} \setcounter{tocdepth}{1} -\setlength{\overfullrule}{3pt} +\setlength{\overfullrule}{0pt} \hbadness=-1 \input{ushyphex} @@ -383,7 +381,74 @@ in the official documentation of package~\packagename{typog}. \noindent Unless otherwise noted the font used in the examples is \singlequotes{\examplefontname}. -\bigskip +\section{Setup and Reconfiguration} + +\noindent +\code{\char`\\ typogget} + +\begin{list}{}{} + \newcommand*{\expandsto}{$\mathbin{\mapsto}$} +\item \code{breakpenalty} \expandsto{} \the\typogget{breakpenalty} +\item \code{ligaturekern} \expandsto{} \milliem{\typogget{ligaturekern}} +\item \code{lowercaselabelitemadjustments} \expandsto{} \typogget{lowercaselabelitemadjustments} +\item \code{mathitalicscorrection} \expandsto{} \the\typogget{mathitalicscorrection} +\item \code{raisecapitaldash} \expandsto{} \the\typogget{raisecapitaldash} +\item \code{raisecapitalguillemets} \expandsto{} \the\typogget{raisecapitalguillemets} +\item \code{raisecapitalhyphen} \expandsto{} \the\typogget{raisecapitalhyphen} +\item \code{raisecapitaltimes} \expandsto{} \the\typogget{raisecapitaltimes} +\item \code{raisefiguredash} \expandsto{} \the\typogget{raisefiguredash} +\item \code{raiseguillemets} \expandsto{} \the\typogget{raiseguillemets} +\item \code{shrinklimits} \expandsto{} \typogget{shrinklimits} +\item \code{slashkern} \expandsto{} \the\typogget{slashkern} +\item \code{stretchlimits} \expandsto{} \typogget{stretchlimits} +\item \code{textitalicscorrection} \expandsto{} \the\typogget{textitalicscorrection} +\item \code{trackingttspacing} \expandsto{} \typogget{trackingttspacing} +\item \code{uppercaselabelitemadjustments} \expandsto{} \typogget{uppercaselabelitemadjustments} +\end{list} + +\begingroup + \dimen0=\typogget{raisecapitaldash}% + \setbox0=\hbox to \typogget{ligaturekern} {}% +\endgroup + +\noindent +\code{\char`\\ typoggetnth} + +\begin{list}{}{} +\item + Elements of \code{lowercaselabelitemadjustments}: + (1)~\typoggetnth{\dimen0}{lowercaselabelitemadjustments}{1}\the\dimen0, + (2)~\typoggetnth{\dimen0}{lowercaselabelitemadjustments}{2}\the\dimen0, + (3)~\typoggetnth{\dimen0}{lowercaselabelitemadjustments}{3}\the\dimen0, and + (4)~\typoggetnth{\dimen0}{lowercaselabelitemadjustments}{4}\the\dimen0. + + Same elements now accessed from the right-hand-side, i.\,e.~with negative indices: + (\textminus4)~\typoggetnth{nth}{lowercaselabelitemadjustments}{-4}\nth, + (\textminus3)~\typoggetnth{nth}{lowercaselabelitemadjustments}{-3}\nth, + (\textminus2)~\typoggetnth{nth}{lowercaselabelitemadjustments}{-2}\nth, and + (\textminus1)~\typoggetnth{nth}{lowercaselabelitemadjustments}{-1}\nth. + +\item Elements of \code{shrinklimits}: + (1)~\typoggetnth{nth}{shrinklimits}{1}\nth, + (2)~\typoggetnth{nth}{shrinklimits}{2}\nth, and + (3)~\typoggetnth{nth}{shrinklimits}{3}\nth. + +\item Elements of \code{stretchlimits}: + (1)~\typoggetnth{nth}{stretchlimits}{1}\nth, + (2)~\typoggetnth{nth}{stretchlimits}{2}\nth, and + (3)~\typoggetnth{nth}{stretchlimits}{3}\nth. + +\item Elements of \code{trackingttspacing}: + (1)~\typoggetnth{nth}{trackingttspacing}{1}\nth, + (2)~\typoggetnth{nth}{trackingttspacing}{2}\nth, and + (3)~\typoggetnth{nth}{trackingttspacing}{3}\nth. + +\item Elements of \code{uppercaselabelitemadjustments}: + (1)~\typoggetnth{\dimen0}{uppercaselabelitemadjustments}{1}\the\dimen0, + (2)~\typoggetnth{\dimen0}{uppercaselabelitemadjustments}{2}\the\dimen0, + (3)~\typoggetnth{\dimen0}{uppercaselabelitemadjustments}{3}\the\dimen0, and + (4)~\typoggetnth{\dimen0}{uppercaselabelitemadjustments}{4}\the\dimen0. +\end{list} \section{Information} @@ -864,6 +929,81 @@ We again compare the default implementation with the adjusted one. \parbox[t]{0pt}{\FrenchdoublequotesFR{\samplestring}} \end{quote} +\section{Label Items} + +The current configurations for the uppercase and lowercase adjustments are +\{\typogget{uppercaselabelitemadjustments}\} and \{\typogget{lowercaselabelitemadjustments}\}, +respectively. + +\begin{center} + \makeatletter + \noindent + A\raisebox{\typog@adjust@uppercase@labelitemi}{\labelitemi}% + B\raisebox{\typog@adjust@uppercase@labelitemii}{\labelitemii}% + E\raisebox{\typog@adjust@uppercase@labelitemiii}{\labelitemiii}% + G\raisebox{\typog@adjust@uppercase@labelitemiv}{\labelitemiv}H \\ + a\raisebox{\typog@adjust@lowercase@labelitemi}{\labelitemi}% + b\raisebox{\typog@adjust@lowercase@labelitemii}{\labelitemii}% + c\raisebox{\typog@adjust@lowercase@labelitemiii}{\labelitemiii}% + e\raisebox{\typog@adjust@lowercase@labelitemiv}{\labelitemiv}g + \makeatother +\end{center} + +For the following nested lists we adjust levels one and three for uppercase and levels two and +four for lowercase. + +\begingroup + \uppercaseadjustlabelitems{1,3} + \lowercaseadjustlabelitems{2,4} + \setlength{\itemsep}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \begin{itemize} + \item A + \item B + \item C + \begin{itemize} + \item d + \item e + \item f + \begin{itemize} + \item G + \item H + \item I + \begin{itemize} + \item j + \item k + \item l + \end{itemize} + \end{itemize} + \end{itemize} + \end{itemize} +\endgroup +\noadjustlabelitems{*}% not necessary, but we want to exercise the macro + +The left example shows the result of \code{\string\typogadjuststairs\{.25pt\}\{11\}\{ABC\}} and +the one on the right hand side just uses the same parameters except for the sample~\sample{ace}, +this is, only lowercase letters. + +\begin{center} + \begin{minipage}[t]{12em} + \centering + \typogadjuststairs{.25pt}{11}{ABC} + \end{minipage} + \begin{minipage}[t]{12em} + \centering + \typogadjuststairs{.25pt}{11}{ace} + \end{minipage} +\end{center} + +For this document the calls +\code{\string\typoguppercaseadjustcheck\{ABC\-DEF\-GHI\-JKL\-MNO\-PQR\-STU\-VWX\-YZ\}} and +\code{\string\typoglowercaseadjustcheck\{ace\-gmn\-opq\-rsu\-vwx\-yz\}} yield +\sample{\typoguppercaseadjustcheck{ABCDEFGHIJKLMNOPQRSTUVWXYZ}} and +\sample{\typoglowercaseadjustcheck{acegmnopqrsuvwxyz}}, where the adjustments in effect are +\code{\{\typogget{uppercaselabelitemadjustments}\}} and +\code{\{\typogget{lowercaselabelitemadjustments}\}}, respectively. + \clearpage \section{Align Last Line} @@ -1085,7 +1225,7 @@ consult \propername{David Carlisle's} excellent post on \propername{StackExchang \begin{center} \setlength{\overfullrule}{0pt} - \newcommand*{\spacesampletext}[1]{some#1text#1with#1spaces\rule{0.1pt}{1em}} + \newcommand*{\spacesampletext}[1]{some#1text#1with#1spaces\rule{.1pt}{1em}} \newsavebox{\narrowspacesample} \sbox{\narrowspacesample}{\spacesampletext{\narrowspace}} \newsavebox{\widespacesample} @@ -1488,7 +1628,7 @@ New settings: \baselinesetsize. \newcommand*{\relbls}{130} \paragraph{\code{\string\setbaselineskippercentage\{\relbls\}}} -\setbaselineskippercentage{1 + 2 + .3333 * 100 + 100 * 0.6667}% float expression +\setbaselineskippercentage{1 + 2 + .3333 * 100 + 100 * .6667}% float expression \setbaselineskippercentage{\relbls} \fontsizeinfo{baselinesetsize} New settings: \baselinesetsize. diff --git a/Master/texmf-dist/doc/latex/typog/typog-grep.1.pdf b/Master/texmf-dist/doc/latex/typog/typog-grep.1.pdf Binary files differindex 09647860d5d..9a430085081 100644 --- a/Master/texmf-dist/doc/latex/typog/typog-grep.1.pdf +++ b/Master/texmf-dist/doc/latex/typog/typog-grep.1.pdf diff --git a/Master/texmf-dist/doc/latex/typog/typog-grep.pl.in b/Master/texmf-dist/doc/latex/typog/typog-grep.pl.in new file mode 100644 index 00000000000..39d64aec1ae --- /dev/null +++ b/Master/texmf-dist/doc/latex/typog/typog-grep.pl.in @@ -0,0 +1,682 @@ +#! /usr/bin/env perl + +use autodie qw(:all); +use strict; +use warnings; + +use Data::Dumper (); +use Encode (); +use English; +use File::Basename (); +use Getopt::Long; +use IO::File; +use IO::Handle; +use Term::ANSIColor (); + +use constant COMMAND_NAME => File::Basename::basename($PROGRAM_NAME); + +my $DEBUG = 0; +my $MATCH_COUNT = 0; +my $OUTPUT_IS_REDIRECTED; + +sub fail_with_error { + print STDERR join('', COMMAND_NAME, ': ', @_, "\n"); + exit 2; +} + +sub issue_warning { + print STDERR join('', COMMAND_NAME, ': warning: ', @_, "\n"); +} + +sub debug_print { + return unless $DEBUG; + print STDERR "+ @_\n"; +} + +sub quote_filesystem {qq("$_[0]")} +sub quote_literal {qq(`$_[0]')} + +sub limit_string_length { + my ($a_string, $a_maximum_length) = @_; + + if (length $a_string <= $a_maximum_length) { + $a_string; + } else { + substr($a_string, 0, $a_maximum_length - 3) . '...'; + } +} + +## We set all colors to `undef' and fill them later with the values +## of the actual configuration. +my $highlight_patterns = { + PARTIAL_LINE => { + FONT_SPEC => [qr# + \\ + (?: OMS | OMX | OT1 | T1 | TS1 | U ) + (?: /[^/]+ ){5} / \S+ \s + (?: \([+-]\d+\) )? + #x, undef], + MATH => [qr# + \$ + \\ + (?: LMS | OML ) + (?: /[^/]+ ){5} / \S+ \s + (?: \([+-]\d+\) )? + .*? + \$ + #x, undef] + }, + WHOLE_LINE => { + FILL_STATE => [qr#^(?:Under|Over)full \\hbox .*$#, undef], + FIRST_VBOX => [qr#^%%#, undef], + HORIZONTAL_BREAKPOINT => [qr#^@@\d+:.*$#, undef], + HORIZONTAL_BREAK_CANDIDATE => [qr#^@[\\ ].*$#, undef], + LINE_BREAK_PASS => [qr#^@[a-z]+?pass#, undef], + TIGHTNESS => [qr#^(?:Loose|Tight) \\hbox .*$#, undef], + VERTICAL_BREAKPOINT => [qr#^% t=\d+.*$#, undef] + } +}; + +sub colorize_line { + my ($configuration, $line) = @_; + + foreach my $pattern_color_pair (values %{$highlight_patterns->{WHOLE_LINE}}) { + next unless $pattern_color_pair->[1]; + return Term::ANSIColor::colored($line, $pattern_color_pair->[1]) + if $line =~ $pattern_color_pair->[0]; + } + return $line if $line =~ m#^\.#; # we do not paint box contents yet + + $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{MATH}->[0] + #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{MATH}->[1]) + #egx; + + $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[0] + #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[1]) + #egx; + + return $line; +} + +my $open_or_close_tag_regexp = qr#^</?typog-inspect[ >]#; # somewhat sloppy definition +my $close_tag_regexp = qr#^</typog-inspect>#; +my $open_tag_regexp = + qr#^ + <typog-inspect \s+ + id="(?<id_match> .*?)" \s+ + job="(?<job_match> .*?)" \s+ + line="(?<line_match> .*?)" \s+ + page="(?<page_match> .*?)" + >#x; + +sub find_encoder { + my $encoding = shift; + + my $encoder; + + if ($encoding) { + $encoder = Encode::find_encoding($encoding); + if (!$encoder) { + issue_warning("encoding @{[quote_literal($encoding)]} unknown; proceeding without decoder"); + } + } + + return $encoder; +} + +sub grep_log_file { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + my $encoder = find_encoder($options->{ENCODING}); + my $job_name; + my $line_number = 0; # line number in the log file we are inspecting, i.e., $filename + my $match_count = 0; + my $source_line_number; # line number in TeX file the log refers to, i.e., "$job_name.tex" + my $page_number; + my $regexp_modifier = $options->{IGNORE_CASE} ? 'i' : ''; + my $id_value; + my @nesting_levels; + + if ($options->{WORD_REGEXP}) { + $id_regexp = "\\b$id_regexp\\b"; + } + + while (my $line = readline $file) { + chomp $line; + $line_number++; + + $line = Encode::encode_utf8($encoder->decode($line, Encode::FB_CROAK)) if $encoder; + + if ($line =~ $close_tag_regexp) { + fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels; + pop @nesting_levels; + } + + if (@nesting_levels and $nesting_levels[-1] and $line !~ $open_or_close_tag_regexp) { + if ($options->{LOG_LINE_NUMBER}) { + my $formatted_log_line_number = + sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_log_line_number = + Term::ANSIColor::colored($formatted_log_line_number, + $configuration->{COLORS}->{LOG_LINE_NUMBER}); + } + print $formatted_log_line_number, ' '; + } + + print "$job_name: " if $options->{JOB_NAME}; + + if ($options->{LINE_NUMBER}) { + my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_line_number = + Term::ANSIColor::colored($formatted_line_number, + $configuration->{COLORS}->{LINE_NUMBER}); + } + print $formatted_line_number, ' '; + } + + if ($options->{PAGE_NUMBER}) { + my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_page_number = + Term::ANSIColor::colored($formatted_page_number, + $configuration->{COLORS}->{PAGE_NUMBER}); + } + print $formatted_page_number, ' '; + } + + if ($options->{ID} and not $configuration->{PRINT_ID_AS_HEADING}) { + my $formatted_id = sprintf $configuration->{ID_INLINE_FORMAT}, $id_value; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_id = Term::ANSIColor::colored($formatted_id , + $configuration->{COLORS}->{ID_COLOR}); + } + print $formatted_id, ' '; + } + + if ($options->{COLORIZE_OUTPUT}) { + print colorize_line($configuration, $line); + } else { + print $line; + } + print "\n"; + } + + if ($line =~ $open_tag_regexp) { + $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH}); + $job_name = $+{job_match}; + $source_line_number = $+{line_match}; + $page_number = $+{page_match}; + + my $found_matching_id = ($id_value =~ m/(?$regexp_modifier)$id_regexp/) ? 1 : 0; + push @nesting_levels, $found_matching_id; + if ($found_matching_id) { + ++$MATCH_COUNT; # global count -- needed for return code of program + ++$match_count; # per file count -- needed to be able to separate the hunks + + print "\n" if $match_count >= 2; + if ($options->{ID} and $configuration->{PRINT_ID_AS_HEADING}) { + my $formatted_id = sprintf $configuration->{ID_HEADING_FORMAT}, $id_value; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_id = + Term::ANSIColor::colored($formatted_id, + $configuration->{COLORS}->{ID_HEADING_COLOR}); + } + print $formatted_id, "\n"; + } + } + } + } + + return $match_count; +} + +sub show_ids_in_file { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + my $encoder = find_encoder($options->{ENCODING}); + my $line_number = 0; + my $match_count = 0; + my @nesting_levels; + + while (my $line = readline $file) { + chomp $line; + $line_number++; + + $line = Encode::encode_utf8($encoder->decode($line, Encode::FB_CROAK)) if $encoder; + + if ($line =~ $close_tag_regexp) { + fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels; + pop @nesting_levels; + } + + if ($line =~ $open_tag_regexp) { + my $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH}); + my $job_name = $+{job_match}; + my $source_line_number = $+{line_match}; + my $page_number = $+{page_match}; + + ++$MATCH_COUNT; + ++$match_count; + push @nesting_levels, 1; + + if ($options->{LOG_LINE_NUMBER}) { + my $formatted_log_line_number = + sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_log_line_number = + Term::ANSIColor::colored($formatted_log_line_number, + $configuration->{COLORS}->{LOG_LINE_NUMBER}); + } + print $formatted_log_line_number, ' '; + } + + print "$job_name: " if $options->{JOB_NAME}; + + if ($options->{LINE_NUMBER}) { + my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_line_number = + Term::ANSIColor::colored($formatted_line_number, + $configuration->{COLORS}->{LINE_NUMBER}); + } + print $formatted_line_number, ' '; + } + + if ($options->{PAGE_NUMBER}) { + my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_page_number = + Term::ANSIColor::colored($formatted_page_number, + $configuration->{COLORS}->{PAGE_NUMBER}); + } + print $formatted_page_number, ' '; + } + + my $indent = $configuration->{ID_INDENT} * (@nesting_levels - 1); + print ' ' x $indent, $id_value, "\n"; + } + } + + return $match_count; +} + +sub open_file_for_reading { + my $filename = shift; + + my $file; + + if ($filename eq 'stdin') { + $file = IO::Handle->new(); + $file->fdopen(fileno(STDIN), 'r') or + fail_with_error("cannot open stdin: $OS_ERROR"); + } else { + $file = IO::File->new($filename, 'r') or + fail_with_error("cannot open @{[quote_filesystem($filename)]}: $OS_ERROR"); + } + + return $file; +} + +sub close_file { + my ($file, $filename) = shift; + + $file->close or + issue_warning("problems while closing @{[quote_filesystem($filename)]}: $OS_ERROR"); +} + +sub grep_or_show { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + if ($options->{SHOW_ALL_IDS}) { + return show_ids_in_file($options, $configuration, $file, $filename, $id_regexp); + } else { + return grep_log_file($options, $configuration, $file, $filename, $id_regexp); + } +} + +sub scan_files { + my ($options, $configuration, $id_regexp, $log_filenames) = @_; + + my $match_count = 0; + + if (@$log_filenames) { + foreach my $log_filename (@$log_filenames) { + $log_filename = 'stdin' if $log_filename eq '-'; + if (@$log_filenames >= 2) { + print "\n" unless $log_filename eq $log_filenames->[0]; + my $filename_header = "==> $log_filename <==\n"; + $filename_header = Term::ANSIColor::colored($filename_header, + $configuration->{COLORS}->{FILE_HEADER}) + if $options->{COLORIZE_OUTPUT}; + print $filename_header; + } + my $file = open_file_for_reading($log_filename); + $match_count += grep_or_show($options, $configuration, $file, $log_filename, $id_regexp); + close_file($file, $log_filename); + } + } else { + my $log_filename = 'stdin'; + my $file = open_file_for_reading($log_filename); + $match_count = grep_or_show($options, $configuration, $file, $log_filename, $id_regexp); + close_file($file, $log_filename); + } + + return $match_count; +} + +sub redirect_and_scan_files { + my ($options, $configuration, $id_regexp, $log_filenames) = @_; + + my $pager; + + my $pid = open($pager, '|-', $configuration->{PAGER}, $configuration->{PAGER_FLAGS}); + fail_with_error('failed to redirect to pager ', quote_literal($configuration->{PAGER}), + ' with flags ', quote_literal($configuration->{PAGER_FLAGS}), + ": $OS_ERROR") + unless defined $pid; + my $stdout = select $pager; + + $pager->autoflush; + my $match_count = scan_files($options, $configuration, $id_regexp, $log_filenames); + + close $pager or issue_warning "error occurred while closing the pager (pid: $pid) pipe: $OS_ERROR"; + select $stdout; + + return $match_count; +} + +######################################################################## + +my $configuration_key_map = { + 'id-format' => 'ID_INLINE_FORMAT', + 'id-indent' => 'ID_INDENT', + 'id-heading' => 'PRINT_ID_AS_HEADING', + 'id-heading-format' => 'ID_HEADING_FORMAT', + 'id-max-length' => 'ID_MAX_LENGTH', + 'line-number-format' => 'LINE_NUMBER_FORMAT', + 'log-line-number-format' => 'LOG_LINE_NUMBER_FORMAT', + 'page-number-format' => 'PAGE_NUMBER_FORMAT', + + 'file-header-color' => 'FILE_HEADER', + 'fill-state-color' => 'FILL_STATE', + 'first-vbox-color' => 'FIRST_VBOX', + 'font-spec-color' => 'FONT_SPEC', + 'horizontal-break-candidate-color' => 'HORIZONTAL_BREAK_CANDIDATE', + 'horizontal-breakpoint-color' => 'HORIZONTAL_BREAKPOINT', + 'id-color' => 'ID_COLOR', + 'id-heading-color' => 'ID_HEADING_COLOR', + 'line-break-pass-color' => 'LINE_BREAK_PASS', + 'line-number-color' => 'LINE_NUMBER', + 'log-line-number-color' => 'LOG_LINE_NUMBER', + 'math-color' => 'MATH', + 'page-number-color' => 'PAGE_NUMBER', + 'pager' => 'PAGER', + 'pager-flags' => 'PAGER_FLAGS', + 'tightness-color' => 'TIGHTNESS', + 'vertical-breakpoint-color' => 'VERTICAL_BREAKPOINT' +}; + +my $default_configuration = { + COLORS => { + FILE_HEADER => 'bold black', + FILL_STATE => 'bold magenta', + FIRST_VBOX => 'bold red', + FONT_SPEC => 'grey12', + HORIZONTAL_BREAKPOINT => 'bold green', + HORIZONTAL_BREAK_CANDIDATE => 'blue', + ID_COLOR => 'white on_black', + ID_HEADING_COLOR => 'white on_black', + LINE_BREAK_PASS => 'bold green', + LINE_NUMBER => 'bold black', + LOG_LINE_NUMBER => 'italic black', + MATH => 'yellow', + PAGE_NUMBER => 'bold white on_red', + TIGHTNESS => 'bold cyan', + VERTICAL_BREAKPOINT => 'red' + }, + ID_INLINE_FORMAT => '%s:', + ID_HEADING_FORMAT => '--> %s <--', + ID_INDENT => 8, + ID_MAX_LENGTH => 40, + LINE_NUMBER_FORMAT => '%5d', + LOG_LINE_NUMBER_FORMAT => '%6d', + PAGE_NUMBER_FORMAT => '[%3d]', + PAGER => 'less', + PAGER_FLAGS => '--quit-if-one-screen', + PRINT_ID_AS_HEADING => 0 +}; + +sub initialize_highlighting_from_configuration { + my $configuration = shift; + + while (my (undef, $assoc) = each %$highlight_patterns) { + while (my ($name, $pattern_color_pair) = each %$assoc) { + $pattern_color_pair->[1] = $configuration->{COLORS}->{$name}; + } + } +} + +sub modify_configuration { + my ($configuration, $key, $value) = @_; + + fail_with_error('malformed KEY=VALUE pair -- missing key') unless $key; + + if (defined $configuration_key_map->{$key}) { + if ($key =~ m/-color$/) { + $configuration->{COLORS}->{$configuration_key_map->{$key}} = $value; + } else { + $configuration->{$configuration_key_map->{$key}} = $value; + } + } else { + fail_with_error("@{[quote_literal($key)]} is not a valid configuration KEY"); + } +} + +sub setup_configuation { + my ($config_spec, $configuration) = @_; + + foreach my $spec (split ':', $config_spec) { + my ($key, $value) = split '=', $spec; + modify_configuration($configuration, $key, $value); + } +} + +my $default_options = { + COLORIZE_MODE => 'auto', + DEBUG => 0, + ENCODING => undef, + ID => 0, + IGNORE_CASE => 0, + JOB_NAME => 0, + LINE_NUMBER => 0, + LOG_LINE_NUMBER => 0, + PAGE_NUMBER => 0, + REQUEST_PAGER => 1, + WORD_REGEXP => 0 +}; + +sub show_help { + print <<HELP_TEXT; +Usage: @{[COMMAND_NAME]} [OPTION] ID-REGEXP LOG-FILE... +Structured grep for typog-inspect elements that match ID-REGEXP in LOG-FILE. + +Options + --color [WHEN], + --colour [WHEN] use color to highlight specific log contents + WHEN is 'always', 'never', or 'auto' + -C, --config KEY=VALUE set configuration KEY to VALUE + -E, --encoding ENCODING set character ENCODING of LOG-FILE + -i, --[no-]id print matching id with output lines + -y, --[no-]ignore-case ignore case distinctions in patterns and data + -j, --[no-]job-name print \\jobname with output lines + -n, --[no-]line-number print TeX-source line number with output lines + -N, --[no-]log-line-number print log-file line number with output lines + -p, --[no-]page-number print page number with output lines + -P, --[no-]pager redirect output to pager + -w, --[no-]word-regexp match only whole words + + -a, --all, --any discover all IDs in LOG-FILE + + --debug turn on debug output + -h, --help display this help and exit + --show-config show default configuration and exit + --show-encodings show all known encodings and exit + -V, --version show version information and exit + +HELP_TEXT + + exit 0; +} + +sub show_encodings { + my @all_encodings = Encode->encodings(':all'); + + foreach my $encoding (@all_encodings) { + print "$encoding\n"; + } + + exit 0; +} + +sub show_configuration { + my $format_string_value = sub {quote_literal($default_configuration->{$_[0]})}; + + print <<FIXED_CONFIGURATION_TEXT; +Configuration +Key Default Value +------------------------------------ ------------- +id-format @{[$format_string_value->('ID_INLINE_FORMAT')]} +id-heading $default_configuration->{PRINT_ID_AS_HEADING} +id-heading-format @{[$format_string_value->('ID_HEADING_FORMAT')]} +id-indent $default_configuration->{ID_INDENT} +id-max-length $default_configuration->{ID_MAX_LENGTH} +line-number-format @{[$format_string_value->('LINE_NUMBER_FORMAT')]} +log-line-number-format @{[$format_string_value->('LOG_LINE_NUMBER_FORMAT')]} +page-number-format @{[$format_string_value->('PAGE_NUMBER_FORMAT')]} +pager @{[$format_string_value->('PAGER')]} +pager-flags @{[$format_string_value->('PAGER_FLAGS')]} + +FIXED_CONFIGURATION_TEXT + + foreach my $configuration_key (sort keys %$configuration_key_map) { + next unless $configuration_key =~ m/-color$/; + printf("%-36s %s\n", + $configuration_key, + quote_literal($default_configuration-> + {COLORS}-> + {$configuration_key_map->{$configuration_key}})); + } + + exit 0; +} + +sub show_version { + print <<VERSION_TEXT; +typog-grep @RELEASE@ + +Copyright (C) 2024 by Ch. L. Spiel +License LPPL: LaTeX Project Public License version 1.3c or later +VERSION_TEXT + + exit 0; +} + +sub get_options { + my ($options, $configuration) = @_; + + Getopt::Long::Configure('gnu_getopt', 'no_ignore_case'); + + Getopt::Long::GetOptions('a|all|any' => \$options->{SHOW_ALL_IDS}, + 'color|colour=s' => \$options->{COLORIZE_MODE}, + 'C|configuration=s' => sub{setup_configuation($_[1], $configuration)}, + 'debug+' => \$DEBUG, + 'E|encoding=s' => \$options->{ENCODING}, + 'h|help' => \&show_help, + 'i|id!' => \$options->{ID}, + 'y|ignore-case!' => \$options->{IGNORE_CASE}, + 'j|job-name!' => \$options->{JOB_NAME}, + 'n|line-number!' => \$options->{LINE_NUMBER}, + 'N|log-line-number!' => \$options->{LOG_LINE_NUMBER}, + 'p|page-number!' => \$options->{PAGE_NUMBER}, + 'P|pager!' => \$options->{REQUEST_PAGER}, + 'show-encodings' => \&show_encodings, + 'show-config' => \&show_configuration, + 'V|version' => \&show_version, + 'w|word-regexp!' => \$options->{WORD_REGEXP}) or + fail_with_error('problems while parsing options'); + + if ($options->{COLORIZE_MODE}) { + fail_with_error("unknown colorize mode @{[quote_literal($options->{COLORIZE_MODE})]}") + unless $options->{COLORIZE_MODE} =~ m/^(?:always|auto|never)$/i; + } else { + $options->{COLORIZE_MODE} = 'auto'; + } +} + +sub do_colorize { + my $colorize_mode = shift; + + if ($colorize_mode =~ m/never/i) { + 0; + } elsif ($colorize_mode =~ m/always/i) { + 1; + } elsif ($colorize_mode =~ m/auto/i) { + not $OUTPUT_IS_REDIRECTED; + } +} + +## For the comparison with the POSIX spec of grep(1) consult +## https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html + +sub main { + $OUTPUT_IS_REDIRECTED = -t STDOUT ? 0 : 1; + + my $configuration = {%$default_configuration}; + my $options = {%$default_options}; + debug_print(Data::Dumper::Dumper(['Default Configuration', $configuration])); + debug_print(Data::Dumper::Dumper(['Default Options', $options])); + + my $user_options = {}; + my $user_configuration = {}; + get_options($user_options, $user_configuration); + debug_print(Data::Dumper::Dumper(['User Configuration', $user_configuration])); + debug_print(Data::Dumper::Dumper(['User Options', $user_options])); + while (my ($key, $value) = each %$user_options) { + $options->{$key} = $value if $value; + } + while (my ($key, $value) = each %$user_configuration) { + $configuration->{$key} = $value if $value; + } + debug_print(Data::Dumper::Dumper(['Final Configuration', $configuration])); + debug_print(Data::Dumper::Dumper(['Final Options', $options])); + + $options->{COLORIZE_OUTPUT} = do_colorize($options->{COLORIZE_MODE}); + initialize_highlighting_from_configuration($configuration); + + my $id_regexp; + if ($options->{SHOW_ALL_IDS}) { + $id_regexp = '^'; + issue_warning("option @{[quote_literal('--id')]} ignored in @{[quote_literal('--all')]} mode") + if $options->{ID}; + } else { + fail_with_error('missing ID-REGEXP') unless @ARGV >= 1; + $id_regexp = shift @ARGV; + } + + if ($user_options->{REQUEST_PAGER} && $OUTPUT_IS_REDIRECTED) { + issue_warning("option @{[quote_literal('--pager')]} ignored because output is redirected"); + } + my $use_pager = $options->{REQUEST_PAGER} && !$OUTPUT_IS_REDIRECTED; + my $match_count; + if ($use_pager) { + $match_count = redirect_and_scan_files($options, $configuration, $id_regexp, \@ARGV); + } else { + $match_count = scan_files($options, $configuration, $id_regexp, \@ARGV); + } + + exit ($match_count == 0); +} + +main(); diff --git a/Master/texmf-dist/doc/latex/typog/typog-grep.pod b/Master/texmf-dist/doc/latex/typog/typog-grep.pod index 83f4f11f474..eba8297f807 100644 --- a/Master/texmf-dist/doc/latex/typog/typog-grep.pod +++ b/Master/texmf-dist/doc/latex/typog/typog-grep.pod @@ -7,7 +7,7 @@ =head1 NAME -typog-grep - grep for typog-inspect elements in LaTeX log files +typog-grep - specialized grep for typog-inspect elements in LaTeX log files =head1 SYNOPSIS @@ -19,9 +19,70 @@ typog-grep - grep for typog-inspect elements in LaTeX log files =back -The first form shows all C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements in F<LOG-FILE>. +The first form, ``discovery mode'', shows all I<ID>s of -The second form shows the contents of C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements +=begin text + +<typog-inspect id="ID" ...> + +=end text + +=begin man + +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" ...> +.EE +.RE + +=end man + +=begin texinfo + +@example +<typog-inspect id="@var{ID}" ...> +@end example +@noindent + +=end texinfo + +Z<> +elements in F<LOG-FILE>. + +The second form shows the contents, I<LOG-DATA>, of the elements + +=begin text + +<typog-inspect id="ID" ...> +LOG-DATA +</typog-inspect> + +=end text + +=begin man + +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" ...> +\fILOG-DATA\fP +</typog-inspect> +.EE +.RE + +=end man + +=begin texinfo + +@example +<typog-inspect id="@var{ID}" ...> +@var{LOG-DATA} +</typog-inspect> +@end example +@noindent + +=end texinfo + +Z<> whose I<ID>s match I<REGEXP> in F<LOG-FILE>. If no F<LOG-FILE> is given read from F<stdin>. @@ -29,57 +90,101 @@ The S<filename C<->> is synonymous to F<stdin>. =head1 DESCRIPTION -B<typog-grep> is a tailored post-processor for LaTeX log files -and the C<typoginspect> environment as provided by S<package typog>. +B<typog-grep> is a tailored post-processor for LaTeX S<F<log> files> +and the C<typoginspect> environment as provided by the S<LaTeX package typog>. It shares more with the venerable L<B<sgrep>|https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html> than with S<POSIX L<B<grep>|https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>>. -The LaTeX user brackets her text in +In the LaTeX source file the user brackets her text or code +in a C<typoginspect> environment: + +=begin text - \begin{typoginspect}{ID} - Text and code to investigate - \end{typoginspect} +\begin{typoginspect}{ID} + TEXT-OR-CODE-TO-INVESTIGATE +\end{typoginspect} + +=end text + +=begin man + +.RS +.EX +\ebegin{typoginspect}{\fI\,ID\/\fP} +\fITEXT-OR-CODE-TO-INVESTIGATE\fP +\eend{typoginspect} +.EE +.RE + +=end man +=begin texinfo + +@example +@backslashchar{}begin@lbracechar{}typoginspect@rbracechar{}@lbracechar{}@var{ID}@rbracechar{} +@var{TEXT-OR-CODE-TO-INVESTIGATE} +@backslashchar{}end@lbracechar{}typoginspect@rbracechar{} +@end example +@noindent + +=end texinfo + +Z<> where I<ID> is used to identify one or more bracketed snippets. I<ID> does not have to be unique. The I<REGEXP> mechanism makes it easy to select groups of related I<ID>s if they are named accordingly. -In F<LOG-FILE> the environment shows up, packed with tracing information, as +In F<LOG-FILE> the result of the environment shows up, +packed with tracing information, as -=begin texinfo +=begin text -@display -@relax +<typog-inspect id="ID" job="JOB-NAME" line="LINE-NUMBER" page="PAGE-NUMBER"> + LOG-DATA +</typog-inspect> -=end texinfo +=end text + +=begin man - <typog-inspect id="ID" job="JOB-NAME" line="LINE-NUMBER" page="PAGE-NUMBER"> - Trace Data - </typog-inspect> +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" job="\fI\,JOB-NAME\/\fP" line="\fI\,LINE-NUMBER\/\fP" page="\fI\,PAGE-NUMBER\/\fP"> +\fILOG-DATA\fP +</typog-inspect> +.EE +.RE + +=end man =begin texinfo -@end display -@relax +@example +<typog-inspect id="@var{ID}" job="@var{JOB-NAME}" line="@var{LINE-NUMBER}" page="@var{PAGE-NUMBER}"> +@var{LOG-DATA} +</typog-inspect> +@end example +@noindent =end texinfo +Z<> where all the capital-letter sequences are meta-variables and in particular I<JOB-NAME> is the expansion of C<\jobname>, I<LINE-NUMBER> is the LaTeX source file line number of the beginning of the C<typoginspect> environment, and I<PAGE-NUMBER> is the page where -the output of S<C<Text and code to investigate>> occurs. +the output of S<C<TEXT-OR-CODE-TO-INVESTIGATE>> occurs. B<typog-grep> reveals the contents of F<LOG-FILE> between C<E<lt>typog-inspect id="I<ID>" ...E<gt>> -and C<E<lt>/typog-inspectE<gt>> excluding the XML-tags. +and C<E<lt>/typog-inspectE<gt>> excluding the XML-tags themselves. Access the I<JOB-NAME>, I<LINE-NUMBER>, and I<PAGE-NUMBER> with the commandline options -B<--job-name>, B<--line-number>, and B<--page-number>, respectively. +B<--job-name>, B<--line-number>, and B<--page-number>, respectively. Use B<--id> to show the name of the IDs that matched I<REGEXP>. C<typoginspect> environments can be nested. @@ -96,11 +201,18 @@ The list of options is sorted by the names of the long options. =item B<-a>, B<--all>, B<--any> ID-discovery mode: -Show all C<typog-inspect> elements independent of any matching patterns. +Discover all C<typog-inspect> elements independent of any matching patterns +and print their I<ID>s. +The results are printed in their order of occurrence in the respective F<LOG-FILE>s. +Pipe the output into B<sort> to get alphabetically ordered I<ID>s. + +Augment with options +B<--job-name>, B<--line-number>, B<--log-line-number>, or S<B<--page-number>> +for more information. =item B<--color>, B<colour> I<WHEN> -Colorize specific log contents for the matching ids. +Colorize specific log contents for the matching I<ID>s. The S<argument I<WHEN>> determines when to apply color: C<always>, C<never>, S<or C<auto>>. The setting C<auto> checks whether standard output has been redirected. @@ -109,29 +221,45 @@ This is the default. =item B<-C>, B<--config> I<KEY>=I<VALUE>[:I<KEY>=I<VALUE>[:...]] Set one or more configuration I<KEY> to I<VALUE> pairs. -See S<Sec. CONFIGURATION> below for a description of all available configuration items. -Use option B<--show-config> to display the default configuration. +See section L</CONFIGURATION> for a description +of all available configuration items. +Use S<option B<--show-config>> to display the default configuration. =item B<--debug> Turn on debug output on F<stderr>. +=item B<-E>, B<--encoding> I<ENCODING> + +Set the I<ENCODING> of F<LOG-FILE> for the translation to UTF-8. +The default is unset. + +Use this option to get rid of pesky +S<"E<lt>I<HEX-DIGITS>E<gt>" escapes> on UTF-8 terminals. +See S<option B<--show-encodings>> for the known encodings and +Encode::Supported for a summary of all encodings. +See also S<section L</Some Common Encodings>>. + +Apply L<B<iconv>|https://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html> +(POSIX) or L<B<recode>|https://github.com/rrthomas/recode/> (GNU) on F<LOG-FILE> +before this tool to avoid having to use S<option B<--encoding>>. + =item B<-h>, B<--help> Display brief help then exit. =item B<-i>, B<--[no-]id> -Print the actual id name that matched I<REGEXP>. -Control the appearance of the matching id with configuration S<item C<id-heading>>. +Print the actual ID-name that matched I<REGEXP>. +Control the appearance of the matching I<ID> with configuration S<item C<id-heading>>. =item B<-y>, B<--[no-]ignore-case> -Match ids while ignoring case distinctions in patterns and data. +Match I<ID>s while ignoring case distinctions in patterns and data. =item B<-j>, B<--[no-]job-name> -Print the C<\jobname> that B<tex> associated with the input file. +Print the C<\jobname> that B<latex> associated with the input file. =item B<-n>, B<--[no-]line-number> @@ -155,6 +283,10 @@ Redirect output from F<stdout> to the configured pager. Show the default configuration and exit. +=item B<--show-encodings> + +Show all known encodings and exit. + =item B<-V>, B<--version> Show version information and exit. @@ -177,26 +309,26 @@ S<Default: C<%s:>.> =item C<id-heading>=C<0>E<verbar>C<1> -Choose between printing the matching ids with S<option B<--id>>: +Choose between printing the matching I<ID>s with S<option B<--id>>: S<Inline (C<0>)> or heading before the matching data (C<1>). S<Default: C<0>.> =item C<id-heading-format>=I<FORMAT> -Control the I<FORMAT> for printing matching ids in heading-mode, +Control the I<FORMAT> for printing matching I<ID>s in heading-mode, where I<FORMAT> is passed to Perl's C<printf>. S<Default: C<--E<gt> %s E<lt>-->.> =item C<id-indent>=I<INDENT> Indentation of nested typog-inspect tags. -Only used in ``discovery'' mode (first form), i.e., if B<--all> is active. +Only used in ``discovery mode'' (first form), i.e., if S<B<--all>> is active. S<Default: 8.> =item C<id-max-length>=I<MAXIMUM-LENGTH> -Set the maximum length of a matching id for printing. -It a matching id exceeds this length it will be truncated +Set the maximum length of a matching I<ID> for printing. +It a matching I<ID> exceeds this length it will be truncated and the last three characters (short of I<MAXIMUM-LENGTH>) will be replaced by dots. S<Default: 40.> @@ -262,11 +394,11 @@ Color of lines with horizontal S<breakpoints C<@@>>. =item C<id-color> -Color of matching ids when printed inline. +Color of matching I<ID>s when printed inline. =item C<id-heading-color> -Color of matching ids when printed in heading form. +Color of matching I<ID>s when printed in heading form. =item C<line-break-pass-color> @@ -333,13 +465,89 @@ C<bold>, C<dark>, C<italic>, C<underline>, C<reverse> =back +=head2 Some Common Encodings + +The following list shows some encodings +that are suitable for S<option B<--encoding>>. + +=over 4 + +=item Latin-1, Western European + +C<iso-8859-1>, C<cp850>, C<cp860>, C<cp1252> + +=item Latin-2, Central European + +C<iso-8859-2>, C<cp852>, C<cp1250> + +=item Latin-3, South European (Esperanto, Maltese) + +C<iso-8859-3> + +=item Latin-4, North European (Baltics) + +C<iso-8859-4> + +=item Cyrillics + +C<iso-8859-5>, C<cp855>, C<cp866> (Ukrainian), C<cp1251> + +=item Arabic + +C<iso-8859-6>, C<cp864>, C<cp1006> (Farsi), C<cp1256> + +=item Greek + +C<iso-8859-7>, C<cp737>, C<cp1253> + +=item Hebrew + +C<iso-8859-8>, C<cp862>, C<cp1255> + +=item Turkish + +C<iso-8859-9>, C<cp857>, C<cp1254> + +=item Nordic + +C<iso-8859-10>, C<cp865>, C<cp861> (Icelandic) + +=item Thai + +C<iso-8859-11>, C<cp874> + +=item Baltic + +C<iso-8859-13>, C<cp775>, C<cp1257> + +=item Celtic + +C<iso-8859-14> + +=item Latin-9 (sometimes called Latin0) + +C<iso-8859-15> + +=item Latin-10 + +C<iso-8859-16> + +=back + =head1 EXIT STATUS The exit status is 0 if at least one I<ID> matched I<REGEXP>, 1 if no I<ID> matched I<REGEXP>, and 2 if an error occurred. +=head1 CAVEATS + +The end tag C<< </typog-inspect> >> sometimes gets placed too early in the output and the trace +I<seems> truncated. However, LaTeX reliably logs the requested the trace information, but the +write operations for trace data and the code which is used to print the S<end tag> are not +synchronized. + =head1 SEE ALSO -B<grep>(1), B<printf>(3), B<Term::ANSIColor>(pm) +B<grep>(1), B<printf>(3), B<Encode::Supported>(pm), B<Term::ANSIColor>(pm) =cut diff --git a/Master/texmf-dist/doc/latex/typog/typog-grep.version.sed b/Master/texmf-dist/doc/latex/typog/typog-grep.version.sed new file mode 100644 index 00000000000..2596bda8663 --- /dev/null +++ b/Master/texmf-dist/doc/latex/typog/typog-grep.version.sed @@ -0,0 +1,3 @@ +s#@DATE@#2024/07/08#g +s#@RELEASE@#0.4#g +s#@TITLE@#TypoGraphic extensions#g diff --git a/Master/texmf-dist/doc/latex/typog/typog-minimal-test.tex b/Master/texmf-dist/doc/latex/typog/typog-minimal-test.tex new file mode 100644 index 00000000000..495dd55146a --- /dev/null +++ b/Master/texmf-dist/doc/latex/typog/typog-minimal-test.tex @@ -0,0 +1,50 @@ +%% +%% This is file `typog-minimal-test.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% typog.dtx (with options: `minimal-test') +%% +%% This is a generated file. +%% +%% Copyright (C) 2024 by Ch. L. Spiel +%% +%% This work may be distributed and/or modified under the conditions +%% of the LaTeX Project Public License, either version 1.3c of this +%% license or (at your option) any later version. The latest version +%% of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Ch. L. Spiel. +%% +%% This work consists of the files typog.dtx and typog.ins +%% and the derived files typog.sty, slant-angle.mp, +%% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, +%% typog-grep.pod, and teximan2latex.sed. +%% +%% +\documentclass{minimal} + +\usepackage{typog} + +\newcommand*{\raiseamount}{0.5pt} + +\begin{document} +\begin{typogsetup}{raise*=\raiseamount} + Em-dash raised by \the\typogget{raisecapitaldash} (expected: \raiseamount). +\end{typogsetup} + +\fontsizeinfo{typoinfo} +Document class ``minimal'' sets up font size and line spacing as~\typoinfo. +\end{document} +\endinput +%% +%% End of file `typog-minimal-test.tex'. diff --git a/Master/texmf-dist/doc/latex/typog/typog-nomt.tex b/Master/texmf-dist/doc/latex/typog/typog-without-microtype-test.tex index ebac4efd1f7..aa7fc79cdaa 100644 --- a/Master/texmf-dist/doc/latex/typog/typog-nomt.tex +++ b/Master/texmf-dist/doc/latex/typog/typog-without-microtype-test.tex @@ -1,21 +1,21 @@ %% -%% This is file `typog-nomt.tex', +%% This is file `typog-without-microtype-test.tex', %% generated with the docstrip utility. %% %% The original source files were: %% -%% typog.dtx (with options: `nomicrotype') +%% typog.dtx (with options: `without-microtype') %% %% This is a generated file. %% %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,7 +25,9 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% @@ -40,7 +42,9 @@ {\singleguillemetright} {\singleguillemetleft} -\usepackage[]{typog} +\usepackage[uppercaselabelitemadjustments={.1em, .075em, .1em, .1em}, + lowercaselabelitemadjustments={-.025em, -.05em, -.025em, -.025em}] + {typog} \newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} @@ -53,7 +57,8 @@ \bigskip -\noindent +\section*{No Microtype} + This example \LaTeX-document uses package~\packagename{typog} \emph{without} package~\packagename{microtype}. @@ -61,6 +66,36 @@ We want \packagename{typog} to be as usable as possible even without the nice features that \packagename{microtype} offers. After all \packagename{typog} is just a front-end for it. +\section*{No EnumItem} + +We intentionally do not load package~\packagename{enumitem}, either. +So, we can test whether \packagename{typog} correctly patches the +plain \LaTeX{} definition if environment~\texttt{itemize}. + +The vertical alignment of the label items was setup for +uppercase (ABC\typoguppercaseadjustcheck{ABCXYZ}XYZ) and for +lowercase (ace\typoglowercaseadjustcheck{acexyz}xyz), though +this is not necessary for the test. + +\uppercaseadjustlabelitems{*} +\begin{itemize} +\item Level i +\item Sublist \dots + \begin{itemize} + \item Level ii + \item Sublist \dots + \begin{itemize} + \item Level iii + \item Sublist \dots + \begin{itemize} + \item Level iv + \end{itemize} + \end{itemize} + \end{itemize} +\end{itemize} + +\section*{CSQuotes} + As we are testing a special configuration here anyhow, we hook up our quotes with package~csquotes to check whether they interact ok. @@ -70,4 +105,4 @@ to check whether they interact ok. \end{document} \endinput %% -%% End of file `typog-nomt.tex'. +%% End of file `typog-without-microtype-test.tex'. diff --git a/Master/texmf-dist/doc/latex/typog/typog.gst b/Master/texmf-dist/doc/latex/typog/typog.gst new file mode 100644 index 00000000000..f108fdc19eb --- /dev/null +++ b/Master/texmf-dist/doc/latex/typog/typog.gst @@ -0,0 +1,48 @@ +%% +%% This is file `typog.gst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% typog.dtx (with options: `changes-style') +%% +%% This is a generated file. +%% +%% Copyright (C) 2024 by Ch. L. Spiel +%% +%% This work may be distributed and/or modified under the conditions +%% of the LaTeX Project Public License, either version 1.3c of this +%% license or (at your option) any later version. The latest version +%% of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Ch. L. Spiel. +%% +%% This work consists of the files typog.dtx and typog.ins +%% and the derived files typog.sty, slant-angle.mp, +%% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, +%% typog-grep.pod, and teximan2latex.sed. +%% +%% +actual '=' +delim_0 "\\nobreak\\enspace" +delim_1 "\\nobreak\\enspace" +delim_2 "\\nobreak\\enspace" +heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large " +heading_suffix "}\\nopagebreak\n" +headings_flag 0 +item_x1 "\\efill\n\\subitem " +item_x2 "\\ " +keyword "\\glossaryentry" +level '>' +line_max 65536 +postamble "\n\\end{theglossary}\n" +preamble "\\begin{theglossary}\n \\makeatletter\\scan@allowedfalse" +quote '!' diff --git a/Master/texmf-dist/doc/latex/typog/typog.ist b/Master/texmf-dist/doc/latex/typog/typog.ist index 9b8104b16c0..8ff11c7ac70 100644 --- a/Master/texmf-dist/doc/latex/typog/typog.ist +++ b/Master/texmf-dist/doc/latex/typog/typog.ist @@ -11,11 +11,11 @@ %% Copyright (C) 2024 by Ch. L. Spiel %% %% This work may be distributed and/or modified under the conditions -%% of the LaTeX Project Public License, either version 1.3 of this +%% of the LaTeX Project Public License, either version 1.3c 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.3 or later is part of all distributions of LaTeX +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. @@ -25,17 +25,20 @@ %% This work consists of the files typog.dtx and typog.ins %% and the derived files typog.sty, slant-angle.mp, %% crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, -%% typog-example.tex, typog-nomt.tex, typog-grep.pl, +%% typog-example.tex, typog-minimal-test.tex, +%% typog-without-microtype-test.tex +%% typog-grep.pl.in, typog-grep.pl, %% typog-grep.pod, and teximan2latex.sed. %% %% actual '=' +delim_0 "\\nobreak\\enspace" +delim_1 "\\nobreak\\enspace" +delim_2 "\\nobreak\\enspace" delim_r "\\figuredash*" heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large " heading_suffix "}\\nopagebreak\n" headings_flag 1 level '>' +line_max 65536 quote '!' -\endinput -%% -%% End of file `typog.ist'. diff --git a/Master/texmf-dist/doc/latex/typog/typog.pdf b/Master/texmf-dist/doc/latex/typog/typog.pdf Binary files differindex 9d00685045a..fa0fe74e4c3 100644 --- a/Master/texmf-dist/doc/latex/typog/typog.pdf +++ b/Master/texmf-dist/doc/latex/typog/typog.pdf diff --git a/Master/texmf-dist/doc/man/man1/typog-grep.1 b/Master/texmf-dist/doc/man/man1/typog-grep.1 index 372c87bc5ff..7506156a012 100644 --- a/Master/texmf-dist/doc/man/man1/typog-grep.1 +++ b/Master/texmf-dist/doc/man/man1/typog-grep.1 @@ -1,4 +1,5 @@ -.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.0102 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== @@ -15,29 +16,12 @@ .ft R .fi .. -.\" Set up some character translations and predefined strings. \*(-- will -.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. \*(C+ will -.\" give a nicer C++. Capital omega is used to do unbreakable dashes and -.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, -.\" nothing in troff, for use with C<>. -.tr \(*W- -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' . ds C` . ds C' 'br\} @@ -68,180 +52,163 @@ . \} .\} .rr rF -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. -. \" fudge factors for nroff and troff -.if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP -.\} -.if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& -.\} -. \" simple accents for nroff and troff -.if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / -.\} -.if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' -.\} -. \" troff and (daisy-wheel) nroff accents -.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' -.ds 8 \h'\*(#H'\(*b\h'-\*(#H' -.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] -.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' -.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' -.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] -.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] -.ds ae a\h'-(\w'a'u*4/10)'e -.ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff -.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' -.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) -.if \n(.H>23 .if \n(.V>19 \ -\{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE -.\} -.rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "TYPOG-GREP 1" -.TH TYPOG-GREP 1 "2024-05-07" "perl v5.36.0" "User Contributed Perl Documentation" +.TH TYPOG-GREP 1 2024/07/08 0.4 "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .\" Turn off justification. .na -.SH "NAME" -typog\-grep \- grep for typog\-inspect elements in LaTeX log files -.SH "SYNOPSIS" +.SH NAME +typog\-grep \- specialized grep for typog\-inspect elements in LaTeX log files +.SH SYNOPSIS .IX Header "SYNOPSIS" -.IP "\fBtypog-grep\fR \-a|\-\-all|\-\-any [\fI\s-1OPTION\s0\fR...] \fILOG-FILE\fR..." 4 +.IP "\fBtypog-grep\fR \-a|\-\-all|\-\-any [\fIOPTION\fR...] \fILOG-FILE\fR..." 4 .IX Item "typog-grep -a|--all|--any [OPTION...] LOG-FILE..." .PD 0 -.IP "\fBtypog-grep\fR [\fI\s-1OPTION\s0\fR...] \fI\s-1REGEXP\s0\fR \fILOG-FILE\fR..." 4 +.IP "\fBtypog-grep\fR [\fIOPTION\fR...] \fIREGEXP\fR \fILOG-FILE\fR..." 4 .IX Item "typog-grep [OPTION...] REGEXP LOG-FILE..." .PD .PP -The first form shows all \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements in \fILOG-FILE\fR. +The first form, ``discovery mode'', shows all \fIID\fRs of +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" ...> +.EE +.RE +.PP + +elements in \fILOG-FILE\fR. .PP -The second form shows the contents of \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements -whose \fI\s-1ID\s0\fRs match \fI\s-1REGEXP\s0\fR in \fILOG-FILE\fR. +The second form shows the contents, \fILOG-DATA\fR, of the elements +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" ...> +\fILOG-DATA\fP +</typog-inspect> +.EE +.RE +.PP + +whose \fIID\fRs match \fIREGEXP\fR in \fILOG-FILE\fR. .PP If no \fILOG-FILE\fR is given read from \fIstdin\fR. The filename\ \f(CW\*(C`\-\*(C'\fR is synonymous to \fIstdin\fR. -.SH "DESCRIPTION" +.SH DESCRIPTION .IX Header "DESCRIPTION" -\&\fBtypog-grep\fR is a tailored post-processor for LaTeX log files -and the \f(CW\*(C`typoginspect\*(C'\fR environment as provided by package\ typog. +\&\fBtypog-grep\fR is a tailored post-processor for LaTeX \fIlog\fR\ files +and the \f(CW\*(C`typoginspect\*(C'\fR environment as provided by the LaTeX\ package\ typog. It shares more with the venerable \&\fBsgrep\fR <https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html> -than with \s-1POSIX\s0\ \fBgrep\fR <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>. -.PP -The LaTeX user brackets her text in +than with POSIX\ \fBgrep\fR\ <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>. .PP -.Vb 3 -\& \ebegin{typoginspect}{ID} -\& Text and code to investigate -\& \eend{typoginspect} -.Ve +In the LaTeX source file the user brackets her text or code +in a \f(CW\*(C`typoginspect\*(C'\fR environment: +.RS +.EX +\ebegin{typoginspect}{\fI\,ID\/\fP} +\fITEXT-OR-CODE-TO-INVESTIGATE\fP +\eend{typoginspect} +.EE +.RE .PP -where \fI\s-1ID\s0\fR is used to identify one or more bracketed snippets. -\&\fI\s-1ID\s0\fR does not have to be unique. -The \fI\s-1REGEXP\s0\fR mechanism makes it easy to select groups of related \fI\s-1ID\s0\fRs + +where \fIID\fR is used to identify one or more bracketed snippets. +\&\fIID\fR does not have to be unique. +The \fIREGEXP\fR mechanism makes it easy to select groups of related \fIID\fRs if they are named accordingly. .PP -In \fILOG-FILE\fR the environment shows up, packed with tracing information, as -.PP -.Vb 3 -\& <typog\-inspect id="ID" job="JOB\-NAME" line="LINE\-NUMBER" page="PAGE\-NUMBER"> -\& Trace Data -\& </typog\-inspect> -.Ve +In \fILOG-FILE\fR the result of the environment shows up, +packed with tracing information, as +.RS +.EX +<typog-inspect id="\fI\,ID\/\fP" job="\fI\,JOB-NAME\/\fP" line="\fI\,LINE-NUMBER\/\fP" page="\fI\,PAGE-NUMBER\/\fP"> +\fILOG-DATA\fP +</typog-inspect> +.EE +.RE .PP + where all the capital-letter sequences are meta-variables and in particular \&\fIJOB-NAME\fR is the expansion of \f(CW\*(C`\ejobname\*(C'\fR, \&\fILINE-NUMBER\fR is the LaTeX source file line number of the beginning of the \f(CW\*(C`typoginspect\*(C'\fR environment, and \fIPAGE-NUMBER\fR is the page where -the output of \f(CW\*(C`Text\ and\ code\ to\ investigate\*(C'\fR occurs. +the output of \f(CW\*(C`TEXT\-OR\-CODE\-TO\-INVESTIGATE\*(C'\fR occurs. .PP \&\fBtypog-grep\fR reveals the contents of \fILOG-FILE\fR -between \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR -and \f(CW\*(C`</typog\-inspect>\*(C'\fR excluding the XML-tags. +between \f(CW\*(C`<typog\-inspect id="\fR\f(CIID\fR\f(CW" ...>\*(C'\fR +and \f(CW\*(C`</typog\-inspect>\*(C'\fR excluding the XML-tags themselves. Access the \fIJOB-NAME\fR, \fILINE-NUMBER\fR, and \fIPAGE-NUMBER\fR with the commandline options -\&\fB\-\-job\-name\fR, \fB\-\-line\-number\fR, and \fB\-\-page\-number\fR, respectively. -Use \fB\-\-id\fR to show the name of the IDs that matched \fI\s-1REGEXP\s0\fR. +\&\fB\-\-job\-name\fR, \fB\-\-line\-number\fR, and \fB\-\-page\-number\fR, respectively. +Use \fB\-\-id\fR to show the name of the IDs that matched \fIREGEXP\fR. .PP \&\f(CW\*(C`typoginspect\*(C'\fR environments can be nested. \&\fBtypog-grep\fR respects the nesting, -i.e., if the \fI\s-1ID\s0\fR of the nested environment does not match \fI\s-1REGEXP\s0\fR +i.e., if the \fIID\fR of the nested environment does not match \fIREGEXP\fR it will not be included in the program's output. -.SH "OPTIONS" +.SH OPTIONS .IX Header "OPTIONS" The list of options is sorted by the names of the long options. .IP "\fB\-a\fR, \fB\-\-all\fR, \fB\-\-any\fR" 4 .IX Item "-a, --all, --any" ID-discovery mode: -Show all \f(CW\*(C`typog\-inspect\*(C'\fR elements independent of any matching patterns. -.IP "\fB\-\-color\fR, \fBcolour\fR \fI\s-1WHEN\s0\fR" 4 +Discover all \f(CW\*(C`typog\-inspect\*(C'\fR elements independent of any matching patterns +and print their \fIID\fRs. +The results are printed in their order of occurrence in the respective \fILOG-FILE\fRs. +Pipe the output into \fBsort\fR to get alphabetically ordered \fIID\fRs. +.Sp +Augment with options +\&\fB\-\-job\-name\fR, \fB\-\-line\-number\fR, \fB\-\-log\-line\-number\fR, or \fB\-\-page\-number\fR +for more information. +.IP "\fB\-\-color\fR, \fBcolour\fR \fIWHEN\fR" 4 .IX Item "--color, colour WHEN" -Colorize specific log contents for the matching ids. -The argument\ \fI\s-1WHEN\s0\fR determines when to apply color: +Colorize specific log contents for the matching \fIID\fRs. +The argument\ \fIWHEN\fR determines when to apply color: \&\f(CW\*(C`always\*(C'\fR, \f(CW\*(C`never\*(C'\fR, or\ \f(CW\*(C`auto\*(C'\fR. The setting \f(CW\*(C`auto\*(C'\fR checks whether standard output has been redirected. This is the default. -.IP "\fB\-C\fR, \fB\-\-config\fR \fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:\fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:...]]" 4 +.IP "\fB\-C\fR, \fB\-\-config\fR \fIKEY\fR=\fIVALUE\fR[:\fIKEY\fR=\fIVALUE\fR[:...]]" 4 .IX Item "-C, --config KEY=VALUE[:KEY=VALUE[:...]]" -Set one or more configuration \fI\s-1KEY\s0\fR to \fI\s-1VALUE\s0\fR pairs. -See Sec.\ \s-1CONFIGURATION\s0 below for a description of all available configuration items. -Use option \fB\-\-show\-config\fR to display the default configuration. -.IP "\fB\-\-debug\fR" 4 +Set one or more configuration \fIKEY\fR to \fIVALUE\fR pairs. +See section "CONFIGURATION" for a description +of all available configuration items. +Use option\ \fB\-\-show\-config\fR to display the default configuration. +.IP \fB\-\-debug\fR 4 .IX Item "--debug" Turn on debug output on \fIstderr\fR. +.IP "\fB\-E\fR, \fB\-\-encoding\fR \fIENCODING\fR" 4 +.IX Item "-E, --encoding ENCODING" +Set the \fIENCODING\fR of \fILOG-FILE\fR for the translation to UTF\-8. +The default is unset. +.Sp +Use this option to get rid of pesky +"<\fIHEX-DIGITS\fR>"\ escapes on UTF\-8 terminals. +See option\ \fB\-\-show\-encodings\fR for the known encodings and +Encode::Supported for a summary of all encodings. +See also section\ "Some\ Common\ Encodings". +.Sp +Apply \fBiconv\fR <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html> +(POSIX) or \fBrecode\fR <https://github.com/rrthomas/recode/> (GNU) on \fILOG-FILE\fR +before this tool to avoid having to use option\ \fB\-\-encoding\fR. .IP "\fB\-h\fR, \fB\-\-help\fR" 4 .IX Item "-h, --help" Display brief help then exit. .IP "\fB\-i\fR, \fB\-\-[no\-]id\fR" 4 .IX Item "-i, --[no-]id" -Print the actual id name that matched \fI\s-1REGEXP\s0\fR. -Control the appearance of the matching id with configuration item\ \f(CW\*(C`id\-heading\*(C'\fR. +Print the actual ID-name that matched \fIREGEXP\fR. +Control the appearance of the matching \fIID\fR with configuration item\ \f(CW\*(C`id\-heading\*(C'\fR. .IP "\fB\-y\fR, \fB\-\-[no\-]ignore\-case\fR" 4 .IX Item "-y, --[no-]ignore-case" -Match ids while ignoring case distinctions in patterns and data. +Match \fIID\fRs while ignoring case distinctions in patterns and data. .IP "\fB\-j\fR, \fB\-\-[no\-]job\-name\fR" 4 .IX Item "-j, --[no-]job-name" -Print the \f(CW\*(C`\ejobname\*(C'\fR that \fBtex\fR associated with the input file. +Print the \f(CW\*(C`\ejobname\*(C'\fR that \fBlatex\fR associated with the input file. .IP "\fB\-n\fR, \fB\-\-[no\-]line\-number\fR" 4 .IX Item "-n, --[no-]line-number" Print the line number where the \f(CW\*(C`typoginspect\*(C'\fR\ environment @@ -256,76 +223,79 @@ starts in the typeset document. .IP "\fB\-P\fR, \fB\-\-[no\-]pager\fR" 4 .IX Item "-P, --[no-]pager" Redirect output from \fIstdout\fR to the configured pager. -.IP "\fB\-\-show\-config\fR" 4 +.IP \fB\-\-show\-config\fR 4 .IX Item "--show-config" Show the default configuration and exit. +.IP \fB\-\-show\-encodings\fR 4 +.IX Item "--show-encodings" +Show all known encodings and exit. .IP "\fB\-V\fR, \fB\-\-version\fR" 4 .IX Item "-V, --version" Show version information and exit. .IP "\fB\-w\fR, \fB\-\-[no\-]word\-regexp\fR" 4 .IX Item "-w, --[no-]word-regexp" Match only whole words. -.SH "CONFIGURATION" +.SH CONFIGURATION .IX Header "CONFIGURATION" -.ie n .IP """id\-format""=\fI\s-1FORMAT\s0\fR" 4 -.el .IP "\f(CWid\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.ie n .IP """id\-format""=\fIFORMAT\fR" 4 +.el .IP \f(CWid\-format\fR=\fIFORMAT\fR 4 .IX Item "id-format=FORMAT" -Control the \fI\s-1FORMAT\s0\fR for printing matching ids in inline-mode, -where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Control the \fIFORMAT\fR for printing matching ids in inline-mode, +where \fIFORMAT\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. Default:\ \f(CW%s:\fR. .ie n .IP """id\-heading""=0|1" 4 -.el .IP "\f(CWid\-heading\fR=\f(CW0\fR|\f(CW1\fR" 4 +.el .IP \f(CWid\-heading\fR=\f(CW0\fR|\f(CW1\fR 4 .IX Item "id-heading=0|1" -Choose between printing the matching ids with option\ \fB\-\-id\fR: +Choose between printing the matching \fIID\fRs with option\ \fB\-\-id\fR: Inline\ (\f(CW0\fR) or heading before the matching data (\f(CW1\fR). Default:\ \f(CW0\fR. -.ie n .IP """id\-heading\-format""=\fI\s-1FORMAT\s0\fR" 4 -.el .IP "\f(CWid\-heading\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.ie n .IP """id\-heading\-format""=\fIFORMAT\fR" 4 +.el .IP \f(CWid\-heading\-format\fR=\fIFORMAT\fR 4 .IX Item "id-heading-format=FORMAT" -Control the \fI\s-1FORMAT\s0\fR for printing matching ids in heading-mode, -where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Control the \fIFORMAT\fR for printing matching \fIID\fRs in heading-mode, +where \fIFORMAT\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. Default:\ \f(CW\*(C`\-\->\ %s\ <\-\-\*(C'\fR. -.ie n .IP """id\-indent""=\fI\s-1INDENT\s0\fR" 4 -.el .IP "\f(CWid\-indent\fR=\fI\s-1INDENT\s0\fR" 4 +.ie n .IP """id\-indent""=\fIINDENT\fR" 4 +.el .IP \f(CWid\-indent\fR=\fIINDENT\fR 4 .IX Item "id-indent=INDENT" Indentation of nested typog-inspect tags. -Only used in ``discovery'' mode (first form), i.e., if \fB\-\-all\fR is active. +Only used in ``discovery mode'' (first form), i.e., if \fB\-\-all\fR is active. Default:\ 8. .ie n .IP """id\-max\-length""=\fIMAXIMUM-LENGTH\fR" 4 -.el .IP "\f(CWid\-max\-length\fR=\fIMAXIMUM-LENGTH\fR" 4 +.el .IP \f(CWid\-max\-length\fR=\fIMAXIMUM-LENGTH\fR 4 .IX Item "id-max-length=MAXIMUM-LENGTH" -Set the maximum length of a matching id for printing. -It a matching id exceeds this length it will be truncated +Set the maximum length of a matching \fIID\fR for printing. +It a matching \fIID\fR exceeds this length it will be truncated and the last three characters (short of \fIMAXIMUM-LENGTH\fR) will be replaced by dots. Default:\ 40. -.ie n .IP """line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 -.el .IP "\f(CWline\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.ie n .IP """line\-number\-format""=\fIFORMAT\fR" 4 +.el .IP \f(CWline\-number\-format\fR=\fIFORMAT\fR 4 .IX Item "line-number-format=FORMAT" -Control the \fI\s-1FORMAT\s0\fR for printing TeX source line numbers, -where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Control the \fIFORMAT\fR for printing TeX source line numbers, +where \fIFORMAT\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. Default:\ \f(CW%5d\fR. -.ie n .IP """log\-line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 -.el .IP "\f(CWlog\-line\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.ie n .IP """log\-line\-number\-format""=\fIFORMAT\fR" 4 +.el .IP \f(CWlog\-line\-number\-format\fR=\fIFORMAT\fR 4 .IX Item "log-line-number-format=FORMAT" -Control the \fI\s-1FORMAT\s0\fR for printing log line numbers, -where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Control the \fIFORMAT\fR for printing log line numbers, +where \fIFORMAT\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. Default:\ \f(CW%6d\fR. -.ie n .IP """page\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 -.el .IP "\f(CWpage\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.ie n .IP """page\-number\-format""=\fIFORMAT\fR" 4 +.el .IP \f(CWpage\-number\-format\fR=\fIFORMAT\fR 4 .IX Item "page-number-format=FORMAT" -Control the \fI\s-1FORMAT\s0\fR for printing page numbers, -where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Control the \fIFORMAT\fR for printing page numbers, +where \fIFORMAT\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. Default:\ \f(CW\*(C`[%3d]\*(C'\fR. -.ie n .IP """pager""=\fI\s-1PAGER\s0\fR" 4 -.el .IP "\f(CWpager\fR=\fI\s-1PAGER\s0\fR" 4 +.ie n .IP """pager""=\fIPAGER\fR" 4 +.el .IP \f(CWpager\fR=\fIPAGER\fR 4 .IX Item "pager=PAGER" Name of pager application to pipe output into if run with option\ \fB\-\-pager\fR. Default:\ \f(CW\*(C`less\*(C'\fR. -.ie n .IP """pager\-flags""=\fI\s-1FLAGS\s0\fR" 4 -.el .IP "\f(CWpager\-flags\fR=\fI\s-1FLAGS\s0\fR" 4 +.ie n .IP """pager\-flags""=\fIFLAGS\fR" 4 +.el .IP \f(CWpager\-flags\fR=\fIFLAGS\fR 4 .IX Item "pager-flags=FLAGS" -Pass \fI\s-1FLAGS\s0\fR to \fI\s-1PAGER\s0\fR. +Pass \fIFLAGS\fR to \fIPAGER\fR. Default:\ \f(CW\*(C`\-\-quit\-if\-one\-screen\*(C'\fR. .IP "Color Configuration" 4 .IX Item "Color Configuration" @@ -333,64 +303,64 @@ For the syntax of the color specifications consult the manual page of Term::ANSIColor(pm). .RS 4 .ie n .IP """file\-header\-color""" 4 -.el .IP "\f(CWfile\-header\-color\fR" 4 +.el .IP \f(CWfile\-header\-color\fR 4 .IX Item "file-header-color" Color of the filename header. .ie n .IP """fill\-state\-color""" 4 -.el .IP "\f(CWfill\-state\-color\fR" 4 +.el .IP \f(CWfill\-state\-color\fR 4 .IX Item "fill-state-color" Color of the messages that report ``Underfull hbox'' or ``Overfull hbox''. .ie n .IP """first\-vbox\-color""" 4 -.el .IP "\f(CWfirst\-vbox\-color\fR" 4 +.el .IP \f(CWfirst\-vbox\-color\fR 4 .IX Item "first-vbox-color" Color of the first vbox on a page. .ie n .IP """font\-spec\-color""" 4 -.el .IP "\f(CWfont\-spec\-color\fR" 4 +.el .IP \f(CWfont\-spec\-color\fR 4 .IX Item "font-spec-color" Color of font specifications. .ie n .IP """horizontal\-break\-candidate\-color""" 4 -.el .IP "\f(CWhorizontal\-break\-candidate\-color\fR" 4 +.el .IP \f(CWhorizontal\-break\-candidate\-color\fR 4 .IX Item "horizontal-break-candidate-color" Color of lines with horizontal-breakpoint candidates\ \f(CW\*(C`@\*(C'\fR. .ie n .IP """horizontal\-breakpoint\-color""" 4 -.el .IP "\f(CWhorizontal\-breakpoint\-color\fR" 4 +.el .IP \f(CWhorizontal\-breakpoint\-color\fR 4 .IX Item "horizontal-breakpoint-color" Color of lines with horizontal breakpoints\ \f(CW\*(C`@@\*(C'\fR. .ie n .IP """id\-color""" 4 -.el .IP "\f(CWid\-color\fR" 4 +.el .IP \f(CWid\-color\fR 4 .IX Item "id-color" -Color of matching ids when printed inline. +Color of matching \fIID\fRs when printed inline. .ie n .IP """id\-heading\-color""" 4 -.el .IP "\f(CWid\-heading\-color\fR" 4 +.el .IP \f(CWid\-heading\-color\fR 4 .IX Item "id-heading-color" -Color of matching ids when printed in heading form. +Color of matching \fIID\fRs when printed in heading form. .ie n .IP """line\-break\-pass\-color""" 4 -.el .IP "\f(CWline\-break\-pass\-color\fR" 4 +.el .IP \f(CWline\-break\-pass\-color\fR 4 .IX Item "line-break-pass-color" Color of the lines showing which pass (e.g., \f(CW@firstpass\fR) of the line-breaking algorithm is active. .ie n .IP """line\-number\-color""" 4 -.el .IP "\f(CWline\-number\-color\fR" 4 +.el .IP \f(CWline\-number\-color\fR 4 .IX Item "line-number-color" Color of TeX-source-file line numbers. .ie n .IP """log\-line\-number\-color""" 4 -.el .IP "\f(CWlog\-line\-number\-color\fR" 4 +.el .IP \f(CWlog\-line\-number\-color\fR 4 .IX Item "log-line-number-color" Color of log-file line numbers. .ie n .IP """math\-color""" 4 -.el .IP "\f(CWmath\-color\fR" 4 +.el .IP \f(CWmath\-color\fR 4 .IX Item "math-color" Color used for math expressions including their font specs. .ie n .IP """page\-number\-color""" 4 -.el .IP "\f(CWpage\-number\-color\fR" 4 +.el .IP \f(CWpage\-number\-color\fR 4 .IX Item "page-number-color" Color of page numbers of the final output. .ie n .IP """tightness\-color""" 4 -.el .IP "\f(CWtightness\-color\fR" 4 +.el .IP \f(CWtightness\-color\fR 4 .IX Item "tightness-color" Color of lines with Tight/Loose hbox reports. .ie n .IP """vertical\-breakpoint\-color""" 4 -.el .IP "\f(CWvertical\-breakpoint\-color\fR" 4 +.el .IP \f(CWvertical\-breakpoint\-color\fR 4 .IX Item "vertical-breakpoint-color" Color of possible vertical breakpoints. .RE @@ -419,10 +389,65 @@ Replace \f(CW\*(C`on_\*(C'\fR with \f(CW\*(C`on_bright_\*(C'\fR for high-intensi .IP "Text Attribute" 4 .IX Item "Text Attribute" \&\f(CW\*(C`bold\*(C'\fR, \f(CW\*(C`dark\*(C'\fR, \f(CW\*(C`italic\*(C'\fR, \f(CW\*(C`underline\*(C'\fR, \f(CW\*(C`reverse\*(C'\fR +.SS "Some Common Encodings" +.IX Subsection "Some Common Encodings" +The following list shows some encodings +that are suitable for option\ \fB\-\-encoding\fR. +.IP "Latin\-1, Western European" 4 +.IX Item "Latin-1, Western European" +\&\f(CW\*(C`iso\-8859\-1\*(C'\fR, \f(CW\*(C`cp850\*(C'\fR, \f(CW\*(C`cp860\*(C'\fR, \f(CW\*(C`cp1252\*(C'\fR +.IP "Latin\-2, Central European" 4 +.IX Item "Latin-2, Central European" +\&\f(CW\*(C`iso\-8859\-2\*(C'\fR, \f(CW\*(C`cp852\*(C'\fR, \f(CW\*(C`cp1250\*(C'\fR +.IP "Latin\-3, South European (Esperanto, Maltese)" 4 +.IX Item "Latin-3, South European (Esperanto, Maltese)" +\&\f(CW\*(C`iso\-8859\-3\*(C'\fR +.IP "Latin\-4, North European (Baltics)" 4 +.IX Item "Latin-4, North European (Baltics)" +\&\f(CW\*(C`iso\-8859\-4\*(C'\fR +.IP Cyrillics 4 +.IX Item "Cyrillics" +\&\f(CW\*(C`iso\-8859\-5\*(C'\fR, \f(CW\*(C`cp855\*(C'\fR, \f(CW\*(C`cp866\*(C'\fR (Ukrainian), \f(CW\*(C`cp1251\*(C'\fR +.IP Arabic 4 +.IX Item "Arabic" +\&\f(CW\*(C`iso\-8859\-6\*(C'\fR, \f(CW\*(C`cp864\*(C'\fR, \f(CW\*(C`cp1006\*(C'\fR (Farsi), \f(CW\*(C`cp1256\*(C'\fR +.IP Greek 4 +.IX Item "Greek" +\&\f(CW\*(C`iso\-8859\-7\*(C'\fR, \f(CW\*(C`cp737\*(C'\fR, \f(CW\*(C`cp1253\*(C'\fR +.IP Hebrew 4 +.IX Item "Hebrew" +\&\f(CW\*(C`iso\-8859\-8\*(C'\fR, \f(CW\*(C`cp862\*(C'\fR, \f(CW\*(C`cp1255\*(C'\fR +.IP Turkish 4 +.IX Item "Turkish" +\&\f(CW\*(C`iso\-8859\-9\*(C'\fR, \f(CW\*(C`cp857\*(C'\fR, \f(CW\*(C`cp1254\*(C'\fR +.IP Nordic 4 +.IX Item "Nordic" +\&\f(CW\*(C`iso\-8859\-10\*(C'\fR, \f(CW\*(C`cp865\*(C'\fR, \f(CW\*(C`cp861\*(C'\fR (Icelandic) +.IP Thai 4 +.IX Item "Thai" +\&\f(CW\*(C`iso\-8859\-11\*(C'\fR, \f(CW\*(C`cp874\*(C'\fR +.IP Baltic 4 +.IX Item "Baltic" +\&\f(CW\*(C`iso\-8859\-13\*(C'\fR, \f(CW\*(C`cp775\*(C'\fR, \f(CW\*(C`cp1257\*(C'\fR +.IP Celtic 4 +.IX Item "Celtic" +\&\f(CW\*(C`iso\-8859\-14\*(C'\fR +.IP "Latin\-9 (sometimes called Latin0)" 4 +.IX Item "Latin-9 (sometimes called Latin0)" +\&\f(CW\*(C`iso\-8859\-15\*(C'\fR +.IP Latin\-10 4 +.IX Item "Latin-10" +\&\f(CW\*(C`iso\-8859\-16\*(C'\fR .SH "EXIT STATUS" .IX Header "EXIT STATUS" -The exit status is 0 if at least one \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR, -1 if no \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR, and 2 if an error occurred. +The exit status is 0 if at least one \fIID\fR matched \fIREGEXP\fR, +1 if no \fIID\fR matched \fIREGEXP\fR, and 2 if an error occurred. +.SH CAVEATS +.IX Header "CAVEATS" +The end tag \f(CW\*(C`</typog\-inspect>\*(C'\fR sometimes gets placed too early in the output and the trace +\&\fIseems\fR truncated. However, LaTeX reliably logs the requested the trace information, but the +write operations for trace data and the code which is used to print the end\ tag are not +synchronized. .SH "SEE ALSO" .IX Header "SEE ALSO" -\&\fBgrep\fR(1), \fBprintf\fR(3), \fBTerm::ANSIColor\fR(pm) +\&\fBgrep\fR(1), \fBprintf\fR(3), \fBEncode::Supported\fR(pm), \fBTerm::ANSIColor\fR(pm) diff --git a/Master/texmf-dist/doc/man/man1/typog-grep.man1.pdf b/Master/texmf-dist/doc/man/man1/typog-grep.man1.pdf Binary files differindex ca0157d129b..6444f8038b1 100644 --- a/Master/texmf-dist/doc/man/man1/typog-grep.man1.pdf +++ b/Master/texmf-dist/doc/man/man1/typog-grep.man1.pdf |