diff options
author | Manuel Pégourié-Gonnard <mpg@elzevir.fr> | 2009-04-08 22:28:28 +0000 |
---|---|---|
committer | Manuel Pégourié-Gonnard <mpg@elzevir.fr> | 2009-04-08 22:28:28 +0000 |
commit | 1b797180357c6ea612d9552c864074cdc3fa6f00 (patch) | |
tree | 8e67e45d6c5a068860d8af852042b0d44bf8b123 /Master/texmf | |
parent | 6ab0ac0df20a714049b1846058a9210682e19d89 (diff) |
Texdoc version 0.42.
git-svn-id: svn://tug.org/texlive/trunk@12669 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf')
-rw-r--r-- | Master/texmf/doc/man/man1/texdoc.1 | 25 | ||||
-rw-r--r-- | Master/texmf/doc/man/man1/texdoc.pdf | bin | 4493 -> 5275 bytes | |||
-rw-r--r-- | Master/texmf/doc/texdoc/texdoc.pdf | bin | 357772 -> 189970 bytes | |||
-rw-r--r-- | Master/texmf/doc/texdoc/texdoc.tex | 173 | ||||
-rwxr-xr-x | Master/texmf/scripts/texdoc/texdoc.tlu | 672 | ||||
-rw-r--r-- | Master/texmf/texdoc/texdoc.cnf | 13 |
6 files changed, 530 insertions, 353 deletions
diff --git a/Master/texmf/doc/man/man1/texdoc.1 b/Master/texmf/doc/man/man1/texdoc.1 index e814337e00c..96ab325f496 100644 --- a/Master/texmf/doc/man/man1/texdoc.1 +++ b/Master/texmf/doc/man/man1/texdoc.1 @@ -1,17 +1,14 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. -.TH TEXDOC "1" "September 2008" "texdoc version: 0.4" "User Commands" +.TH TEXDOC "1" "April 2009" "texdoc 0.42" "User Commands" .SH NAME -texdoc \- manual page for texdoc version: 0.4 +texdoc \- finding & viewing TeX documentation .SH SYNOPSIS .B texdoc -\fI-h, --help | -v, --version | -f, --files | \fR[\fIoption(s)\fR] \fIname(s)\fR +[\fIOPTIONS\fR]... [\fINAME\fR]... .SH DESCRIPTION -.TP -\fB\-h\fR, \fB\-\-help\fR -Show this short help. -.TP -\fB\-v\fR, \fB\-\-version\fR -Print the version of the program. +texdoc tries to find appropriate TeX documentation for the specified NAME(s). +With no NAME, it can print configuration information (\fB\-f\fR, \fB\-\-files\fR); +the usual \fB\-\-help\fR and \fB\-\-version\fR options are also accepted. .TP \fB\-f\fR, \fB\-\-files\fR Print the name of the config files being used. @@ -46,8 +43,11 @@ Use interactive menus. \fB\-I\fR, \fB\-\-nointeract\fR Use plain lists, no interaction required. .TP -\fB\-n\fR, \fB\-\-noise\-level\fR=\fIN\fR +\fB\-v\fR, \fB\-\-verbosity\fR=\fIN\fR Set verbosity level to N. +.TP +\fB\-d\fR, \fB\-\-debug\fR +Set verbosity level to maximum. .SS "Environment:" .IP PAGER, BROWSER, PDFVIEWER, PSVIEWER, DVIVIEWER. @@ -57,5 +57,6 @@ PAGER, BROWSER, PDFVIEWER, PSVIEWER, DVIVIEWER. .SS "Homepage:" .IP http://tug.org/texdoc/ -.PP -The full manual is accessed via `texdoc texdoc'. +.SS "Manual:" +.IP +displayed by `texdoc texdoc'. diff --git a/Master/texmf/doc/man/man1/texdoc.pdf b/Master/texmf/doc/man/man1/texdoc.pdf Binary files differindex 92222ab40c4..996ff813ef8 100644 --- a/Master/texmf/doc/man/man1/texdoc.pdf +++ b/Master/texmf/doc/man/man1/texdoc.pdf diff --git a/Master/texmf/doc/texdoc/texdoc.pdf b/Master/texmf/doc/texdoc/texdoc.pdf Binary files differindex 101d08f5ac9..60543cbda06 100644 --- a/Master/texmf/doc/texdoc/texdoc.pdf +++ b/Master/texmf/doc/texdoc/texdoc.pdf diff --git a/Master/texmf/doc/texdoc/texdoc.tex b/Master/texmf/doc/texdoc/texdoc.tex index c83ed8bebc3..ed521cf88ba 100644 --- a/Master/texmf/doc/texdoc/texdoc.tex +++ b/Master/texmf/doc/texdoc/texdoc.tex @@ -1,19 +1,27 @@ % this is texdoc's user manual -% written by Manuel Pégourié-Gonnard in 2008 -% licensed under the WTFPL version 2 +% written by Manuel Pégourié-Gonnard in 2008, 2009 +% distributed under the terms of GPL v3 or later \documentclass[a4paper, oneside]{scrartcl} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage{textcomp} \usepackage{fixltx2e} -\usepackage{lmodern} + +\usepackage{lmodern} \edef\ttmodern{\ttdefault} +\usepackage[osf]{mathpazo} +\renewcommand\sfdefault{uop} % optima +\renewcommand\ttdefault{lmvtt} % lm tt proportional +\renewcommand\familydefault{\sfdefault} +\newcommand\otherfamily{\rmfamily} +\newcommand\mylangle{\textlangle} +\newcommand\myrangle{\textrangle} \usepackage{xargs, xspace, fancyvrb, xcolor, pifont, calc, ifmtarg, mathstyle} \usepackage[rm, bf]{titlesec} \titlelabel{\makebox[0pt][r]{\thetitle\kern1pc}} -\titleformat{\subsubsection}[runin]{\itshape}{% +\titleformat{\subsubsection}[runin]{\otherfamily\itshape}{% \makebox[0pt][r]{\thetitle\kern1pc}}{% 0pt}{}[\maybedot\space --- ] @@ -55,7 +63,7 @@ \newcommand\inputcolorname{red} \hypersetup{colorlinks=true, linkcolor=links, urlcolor=links, citecolor=links} \newcommand\textpa[1]{% % noms d'extensions (package) - {\normalfont\color{special}\sffamily #1}} + {\normalfont\color{special}\otherfamily #1}} \newcommand\cofont{% % code \color{code}\normalfont\ttfamily} \newcommand\textco[1]{{\cofont#1}} @@ -73,7 +81,7 @@ \catcode`\ 10\relax \newcommand\meta[1]{% % variantes à remplacer - {\color{special}\textlangle\textme{#1}\textrangle}} + {\color{special}\mylangle\textme{#1}\myrangle}} \newcommand\commandline[1]{% \prompt\space \textcolor{input}{#1}} \newcommand\prompt{\ding{229}} @@ -105,10 +113,10 @@ \xdef\sectioncmd{\noexpand\nodotthistime \thecmd[\bmtext]{% \ifframed - \unexpanded{\normalsize + \unexpanded{\normalsize\normalfont \fbox{\raisebox{\dec}{\BUseVerbatim[baseline=t]{verbmat}}}}% \else - \unexpanded{\normalsize + \unexpanded{\normalsize\normalfont \BUseVerbatim{verbmat}}% \fi \noexpand\label{\thelabel}}}% @@ -149,13 +157,8 @@ \subtitle{Finding \& viewing \TeX documentation } \author{\url{http://tug.org/texdoc/}\\ - Manuel Pégourié-Gonnard\thanks{% - for the documentation. The script itself was last updated and revised by - Manuel Pégourié-Gonnard with contributions from Reinhard Kotucha, based on - the previous texlua versions by Frank Küster. Original (bash) shell - script by Thomas Esser, David Aspinall, and Simon Wilkinson.} - } -\date{v0.4---2008/08/01} + Manuel Pégourié-Gonnard} +\date{v0.42---2009/04/09} \begin{document} \VerbatimFootnotes @@ -197,8 +200,13 @@ In this case, what you actually type is in \textcolor{input}{\inputcolorname}, and the funny symbol \textco{\prompt} represents your shell's prompt, which can actually be something like ©C:\>© or ©name@host:~%© or funnier. -Now, let's talk about this ©-s© option you've just seen in the previous -example. +\bigskip + +\texdoc's normal mode of operation is to find the more appropriate document +for your request and open it. But sometimes it has a weird notion of +``appropriate'', and you'd better look at the list of all results and choose +to see oen or more of them. For this, \texdoc offers various modes, like the +``search mode'' illustrated above. \begin{cmdsubsec}{Search mode}{ss-search} texdoc -s «name» @@ -228,7 +236,7 @@ which you might want to read, whereas in normal mode \texdoc offers you no choice and just displays the user manual ©babelbib.pdf©. On the other hand, the view mode is much faster when you know exactly what you want to read. -To try and make you happy, \texdoc offers three other modes, introduced below. +To try and make you happy, \texdoc offers two other modes, introduced below. \begin{cmdsubsec}{List mode}{ss-list} texdoc -l «name» @@ -259,7 +267,7 @@ documented source code\dots As the name says, \emph{mixed mode} is an attempt to provide you the best of the normal (view) and list modes, by mixing them in the following way: If -only one file is found, the \texdoc opens it, and if many are found, it +only one file is found, then \texdoc opens it, and if many are found, it displays a menu to let you choose. You may want to make this mode the default, see~\ref{cf-mode}. @@ -315,8 +323,8 @@ The concept of alias is very\footnote{See~\ref{ss-alias-rem} for why it is when you type and ©geometry© is aliased to ©geometry/manual.pdf©, then everything happens as if you actually typed ©texdoc geometry/manual.pdf© (without any further alias substitution), and \texdoc informs you that -something happened so you can understand the results (see~\ref{cf-noise_level} -to get rid of this message): +something happened so you can understand the results +(see~\ref{cf-verbosity_level} to get rid of this message): \begin{cmdsubsec}{Command line options}{ss-alias-cl} texdoc -a «options» «name» @@ -328,8 +336,9 @@ to get rid of this message): By default, aliased are used in view, list and mixed modes, and disabled in search mode. But you may want to disable it, because the default alias doesn't do what you want\footnote{In this case, please report it to - \mailto{texlive@tug.org}.} or for another reason. In this case, you just -have to add ©-A© or ©--noalias© to the options, like: + \mailto{texdoc@tug.org}, so that the faulty alias can be updated.} or for +another reason. In this case, you just have to add ©-A© or ©--noalias© to the +options, like: \begin{htcode} þ texdoc -A -l geometry þ @@ -385,10 +394,11 @@ If you want to use another viewer, you have two ways of telling this to \texdoc: in your configuration file or using environment variables. If you hesitate, the configuration file is the recommended way. -To find you configuration file, type ©texdoc -f© and pick the file mark with a -star (unless you are a system administrator or your home is shred between many -machines, see~\ref{ss-prec}); you may need to create the file and a few -directories. Then you can add lines like: +To find your configuration file, type ©texdoc -f© and pick the file marked +with a star (unless you are a system administrator or your home is shared +between many machines whith different architectures, see~\ref{ss-prec}); you +may need to create the file and a few directories. Then you can add lines +like: \begin{htcode} viewer_pdf = (xpdf %s) & @@ -408,8 +418,8 @@ See~\ref{cf-ext_list} for how to allow for more extensions. The corresponding environment variables are ©PDFVIEWER©, ©BROWSER©, ©PAGER©, ©DVIVIEWER©, ©PSVIEWER©. They follow the same convention as values from the configuration files, and override them if they are set. Since some of those -variable are shared by other programs, you can override them by adding -©_texdoc© at the end, like in ©BROWSER_texdoc©. +variable are shared by other programs, you can override them just for \texdoc +by adding ©_texdoc© at the end, like in ©BROWSER_texdoc©. \section{Full reference}\label{s-ref} @@ -427,22 +437,26 @@ in the following order, where first value found is always used: \item Other environment variables. \item Values from configuration files, read in the following order: \begin{enumerate} - \item ©$TEXMFHOME/texdoc/texdoc-«platform».cnf© - \item ©$TEXMFHOME/texdoc/texdoc.cnf© - \item ©$TEXMFLOCAL/texdoc/texdoc-«platform».cnf© - \item ©$TEXMFLOCAL/texdoc/texdoc.cnf© - \item ©$TEXMFMAIN/texdoc/texdoc.cnf© %stopzone + \item ©TEXMFHOME/texdoc/texdoc-«platform».cnf© + \item ©TEXMFHOME/texdoc/texdoc.cnf© + \item ©TEXMFHOME/texdoc/texdoc-dist.cnf© + \item ©TEXMFLOCAL/texdoc/texdoc-«platform».cnf© + \item ©TEXMFLOCAL/texdoc/texdoc.cnf© + \item ©TEXMFMAIN/texdoc/texdoc.cnf© \end{enumerate} \item Hard-coded defaults that may depend on the current platform or the current value of another setting. \end{enumerate} -For the configuration files, ©«platform»© stand for the name of the current +For the configuration files, ©«platform»© stands for the name of the current platform, with names matching those of the directories in ©TEXLIVEROOT/bin©, and ©TEXMFHOME© and others are the kpse's values, see the kpathsea and web2c manuals. The name with ©«platform»© can be used on installation shared between many machines where, for example, not the same viewers are available. However, -their use is not recommended in other situations. +their use is not recommended in other situations. Finally, the special file +©texdoc-dist.cnf© allows you to install a newer version of \texdoc (including +its default config file) in your home: see \href{http://tug.org/texdoc/}{the + web page} for instructions on running \texdoc from the SVN. \subsection{Command-line options}\label{ss-cl} @@ -457,8 +471,8 @@ corresponding configuration option. Shows a quick help message (namely a list of command-line options) and exits successfully. -\begin{cmdsubsub}{-v, --version}{cl-v} - -v, --version +\begin{cmdsubsub}{-V, --version}{cl-v} + -V, --version \end{cmdsubsub} Show the current version of the program and exits successfully. @@ -476,7 +490,7 @@ recommended file for user settings. -w, --view, -l, --list, -m, --mixed, -s, --search, -r, --regex \end{cmdsubsub} -\leavevmode\par\noindent See \ref{cf-mode}. +See~\ref{cf-mode}. \begin{cmdsubsub}{-a, -A, --alias, --noalias}{cl-a} -a, --alias, -A, --noalias @@ -500,27 +514,30 @@ shell's convention) not between the ©-e© or ©--extension© option, the equal sign, and the list. Also take care to quote the special value ©*© if necessary. The equal sign is optional. -\begin{cmdsubsub}{-n, --noise-level}{cl-n} - -n=«n», --noise-level=«n» +\begin{cmdsubsub}{-v, --verbosity, -d, --debug}{cl-n} + -v=«n», --verbosity=«n», -d, --debug \end{cmdsubsub} -See~\ref{cf-noise_level} and be aware that you must avoid spaces on the command -line, and the ©=© sign is optional. +See~\ref{cf-verbosity_level} and be aware that you must avoid spaces on the +command line, and the ©=© sign is optional. The ©--debug© option sets +verbosity at the maximum level. \subsection{Environment variables}\label{ss-envvar} They all correspond to some ©viewer_«ext»© setting, and the reader is referred -to~\ref{s-viewer} and~\ref{cf-viewer_*} for details. Here is the (obvious) -correspondence: +to~\ref{s-viewer} and~\ref{cf-viewer_*} for details. Also, environment +variables used by older versions of \texdoc are accepted. You can append +©_texdoc© to every name in the first column: this wins over every other name. \begin{center} -\begin{tabular}{lll} - ©PAGER_texdoc© & ©PAGER© & ©viewer_html© \\ - ©BROWSER_texdoc© & ©BROWSER© & ©viewer_txt© \\ - ©DVIVIEWER_texdoc© & ©DVIVIEWER© & ©viewer_dvi© \\ - ©PSVIEWER_texdoc© & ©PSVIEWER© & ©viewer_ps© \\ - ©PDFVIEWER_texdoc© & ©PDFVIEWER© & ©viewer_pdf© \\ -\end{tabular} + \begin{tabular}{@{}l*3{@{ }l}@{}} + New name & Old name 1 & Old name 2 & Config. param.\\ + ©PAGER© & ©TEXDOCVIEW_txt© & ©TEXDOC_VIEWER_TXT© & ©viewer_txt© \\ + ©BROWSER© & ©TEXDOCVIEW_html© & ©TEXDOC_VIEWER_HTML© & ©viewer_html© \\ + ©DVIVIEWER© & ©TEXDOCVIEW_dvi© & ©TEXDOC_VIEWER_DVI© & ©viewer_dvi© \\ + ©PSVIEWER© & ©TEXDOCVIEW_ps© & ©TEXDOC_VIEWER_PS© & ©viewer_ps© \\ + ©PDFVIEWER© & ©TEXDOCVIEW_pdf© & ©TEXDOC_VIEWER_PDF© & ©viewer_pdf© \\ + \end{tabular} \end{center} \subsection{Configuration files}\label{ss-conf} @@ -583,7 +600,7 @@ use\footnote{The quotes in the example are just to make the shell happy.} interact_switch = «true, false» \end{cmdsubsub} -Turn on or of interaction. Default is on. Turning interaction off prevents +Turn on or off interaction. Default is on. Turning interaction off prevents \texdoc to ask you to choose a file to view when there are multiple choices, and merely just print the list of files found. @@ -641,8 +658,8 @@ shell construct. Everything has already been said in section~\ref{s-alias}. -\begin{cmdsubsub}{noise_level}{cf-noise_level} - noise_level = «n» +\begin{cmdsubsub}{verbosity_level}{cf-verbosity_level} + verbosity_level = «n» \end{cmdsubsub} Set the verbosity level to ©«n»©. This determines whether \texdoc will print @@ -653,12 +670,20 @@ numeric codes are as follow: \item Print only error messages. \item Also print warnings. \item Also print information messages. - \item Also print debug1 information messages. + \item[n] Also print debug(n-3) information messages. \end{enumerate} -Currently, the levels 5 and greater are not used, and the only ``debug'' -information at level 4 is to print the command used to view a file just before -executing it. +Currently, debug goes from 1 to 3 : ©debug1© prints the command used to view a +file just before executing it, ©debug2© prints information about setting +configuration paramters, and ©debug3© about the search paths used. + +\begin{cmdsubsub}{lastfile_switch}{cf-lastfile_switch} + lastfile_switch = «true, false» +\end{cmdsubsub} + +Prevents \texdoc from reading any other configuration file after this one. +Mainly useful for installing a newer version of \texdoc in your home (see the +\href{http://tug.org/texdoc/}{web site} for instructions on how to do so). \subsection{Exit codes}\label{ss-exit} @@ -699,8 +724,36 @@ GUI version of \texdoc, and is unmaintained and probably unmaintainable anyway). This is on the list, but the time line is rather unclear at the moment. +\section{Licence}\label{s-licence} + +The current \texdoc program and its documentation are copyright 2008, 2009 +Manuel Pégourié-Gonnard. + +They are free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but +\emph{without any warranty}; without even the implied warranty of +\emph{merchantability} or \emph{fitness for a particular purpose}. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see \url{http://www.gnu.org/licenses/}. + +\bigskip + +Previous work (texdoc program) in the public domain: +\begin{itemize} + \item Contributions from Reinhard Kotucha (2008). + \item First texlua versions by Frank Küster (2007). + \item Original shell script by Thomas Esser, David Aspinall, and Simon + Wilkinson. +\end{itemize} + \bigskip -\begin{center}\Large +\begin{center}\Large\rmfamily Happy \TeX{}ing! \end{center} diff --git a/Master/texmf/scripts/texdoc/texdoc.tlu b/Master/texmf/scripts/texdoc/texdoc.tlu index defad83abb8..2f5969af8ed 100755 --- a/Master/texmf/scripts/texdoc/texdoc.tlu +++ b/Master/texmf/scripts/texdoc/texdoc.tlu @@ -1,89 +1,109 @@ #!/usr/bin/env texlua -- $Id$ -*-Lua-*- ---[[Revised 2008 by Manuel Pégourié-Gonnard - with contributions from Reinhard Kotucha. - First texlua versions by Frank Küster (2007). - Origial shell script by Thomas Esser, David Aspinall, and Simon Wilkinson. - Public domain.]] ---[[ Changelog - 0.4 2008-07 - - moved configuration from texmf.cnf to texdoc.cnf - - added an 'alias' feature - - new modes 'mixed' and 'regex' - - file lists are now menus (select number to view results) - - changed the search modes to get only the more relevant results (hopefully) - - /!\ zip support disabled by default (not portable) (see comments below) - - 0.3 2007-06-28 - - added changelog - - better OS detection for default viewer settings - - removed some debugging code - - -s now works in dirs without ls-R, too - - 0.2 2007-06-28 - - implemented reading of configuration from texmf.cnf - - fixed "-s" option - - 0.1 - - initial public release -]] - --- some constants +--[[ +Copyright 2008, 2009 Manuel Pégourié-Gonnard. + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see <http://www.gnu.org/licenses/>. + +Previous work in the public domain: +- Contributions from Reinhard Kotucha (2008). +- First texlua versions by Frank Küster (2007). +- Original shell script by Thomas Esser, David Aspinall, and Simon Wilkinson. +--]] + +-------------------------------------------------------------------------------- +------------------ global constants and general functions ------------------ +-------------------------------------------------------------------------------- + +----------------------------- global constants ----------------------------- + +-- progname and version progname = 'texdoc' -version = '0.4' --- make sure to update setup_config_from_cl() accordingly +version = '0.42' +if string.sub(version, -1) == '+' then + local svnrev = string.match('$Rev: 44 $', '%$Rev:%s*(%d*)%s*%$'); + version = version..' svn r'..svnrev +end + +-- make sure to update setup_config_from_cl() accordingly -- and set a default value in setup_config_from_defaults() if relevant usage_msg = [[ -Usage: texdoc -h, --help | -v, --version | -f, --files | [option(s)] name(s) - -h, --help Show this short help. - -v, --version Print the version of the program. - -f, --files Print the name of the config files being used. - -e, --extensions=L Require file extensions to be in the list L. - -w, --view Use view mode: start a viewer. - -m, --mixed Use mixed mode (view or list). - -l, --list Use list mode: don't start a viewer. - -s, --search Search for name as a substring. - -r, --regex Search for name as a lua regex. - -a, --alias Use the alias table. - -A, --noalias Don't use the alias table. - -i, --interact Use interactive menus. - -I, --nointeract Use plain lists, no interaction required. - -n, --noise-level=N Set verbosity level to N. -Environment: - PAGER, BROWSER, PDFVIEWER, PSVIEWER, DVIVIEWER. -Files: - <texmf>/texdoc/texdoc.cnf files, see the -f option. -Homepage: - http://tug.org/texdoc/ -The full manual is accessed via `texdoc texdoc'.]] +texdoc tries to find appropriate TeX documentation for the specified NAME(s). +With no NAME, it can print configuration information (-f, --files); +the usual --help and --version options are also accepted. +Usage: texdoc [OPTIONS]... [NAME]... + -f, --files Print the name of the config files being used. + -e, --extensions=L Require file extensions to be in the list L. + -w, --view Use view mode: start a viewer. + -m, --mixed Use mixed mode (view or list). + -l, --list Use list mode: don't start a viewer. + -s, --search Search for name as a substring. + -r, --regex Search for name as a lua regex. + -a, --alias Use the alias table. + -A, --noalias Don't use the alias table. + -i, --interact Use interactive menus. + -I, --nointeract Use plain lists, no interaction required. + -v, --verbosity=N Set verbosity level to N. + -d, --debug Set verbosity level to maximum. +Environment: PAGER, BROWSER, PDFVIEWER, PSVIEWER, DVIVIEWER. +Files: <texmf>/texdoc/texdoc.cnf files, see the -f option. +Homepage: http://tug.org/texdoc/ +Manual: displayed by `texdoc texdoc'.]] + +error_msg = [[ +Try `texdoc --help' for a short help, `texdoc texdoc' for the user manual.]] notfound_msg = [[ Sorry, no documentation found for PKGNAME. If you are unsure about the name, try searching CTAN's TeX catalogue at http://ctan.org/search.html#byDescription.]] -place_holder = '%%s' -- used for viewer commands + +known_options = { + 'viewer_.*', + 'mode', + 'interact_switch', 'alias_switch', + 'ext_list', + 'verbosity_level', + 'lastfile_switch', +} + err_priority = { error = 1, warning = 2, info = 3, debug1 = 4, + debug2 = 5, + debug3 = 6, } +err_max = 6 + +place_holder = '%%s' -- used for viewer commands -- zip/gz support -- -- optionally, texdoc can support compressed documentation, but this is -- system-dependant (commands for unzipping, temporary files, etc). -- Since TeX Live doesn't ship compressed doc, downstream distributors who --- want to ship zipped should change support_zipped to true *and* make sure +-- want to ship zipped doc should change support_zipped to true *and* make sure -- everything works for them (look for support_zipped in the code). -- If you use this feature, please let us know: if nobody uses it, -- we'll drop it at some point. support_zipped = false +-------------------------- general-use functions --------------------------- --- BEGIN function definitions (till the 'END' mark) ----=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - --- a general-use function +-- Remark: we always assume our tables have no hole (that is, no nil value +-- followed by a non-nil value). So we use the simple iterator below, and +-- the # operator sometimes (a bit faster than table.getn). function list (t) local i = 0 return function () @@ -92,66 +112,81 @@ function list (t) end end --- Remark: we always assume our tables have no hole (that is, no nil value --- followed by a non-nil value). So we use the simple iterator above, and --- the # operator sometimes (bit faster than table.getn). +-- remove the 'abc/../' components in a path +function simplify_path (path) + local res = string.gsub (path, '/[^/]+/%.%./', '/') + return res -- get rid of gsub's 2nd return value +end --- functions for the search options ------------------------------------ +-- change '/' to '\' on windows, removine 'abc/../' components first +if os.type == "windows" then + function win32_hook (path) + local res = string.gsub (simplify_path(path), '/', '\\') + return res -- get rid of gsub's 2nd return value + end +else + function win32_hook (path) + return simplify_path(path) + end +end + +-------------------------------------------------------------------------------- +-------------------------- functions for searching ------------------------- +-------------------------------------------------------------------------------- + +------------------ exploring trees (kpse-style functions) ------------------ --- BEGIN kpse-like +-- global variables: +-- texdocs: a Lua table version of $TEXDOCS +-- do_recurse: do_recurse[i] = 1 iff texdocs[i] ends with // in $TEXDOCS +-- must_have_lsr: must_have_lsr[i] = 1 iff texdocs[i] starts with !! in $TEXDOCS +-- exact_docfiles: list of "exact matches" +-- rel_docfiles: list of "non-exact matches" --- get global texdocs, do_recurse and must_have_lsr lists from kpse's $TEXDOCS +-- set texdocs, do_recurse and must_have_lsr lists from kpse's $TEXDOCS function get_texdocs () local sep = (os.type == 'windows') and ';' or ':' texdocs = kpse.expand_var ("$TEXDOCS") -- expand the path and turn it into a lua list texdocs = string.explode (kpse.expand_braces (texdocs), sep) do_recurse, must_have_lsr = {}, {} -- global + err_print('Search paths:', 'debug3') for i, dir in ipairs (texdocs) do local n dir, n = string.gsub (dir, '//$', '') do_recurse[i] = (n == 1) texdocs[i], n = string.gsub (dir, '^!!', '') must_have_lsr[i] = (n == 1) + err_print(string.format('%s (do_recurse=%s, must_have_lsr=%s)', + texdocs[i], + do_recurse[i] and 'true' or 'false', + must_have_lsr[i] and 'true' or 'false'), 'debug3') end end --- says if ext is 'good' according to ext_list -function is_good_ext (ext) - for e in list (config.ext_list) do - if e == '*' then - return true - elseif (e == '') and (not ext) then - return true - elseif ext == e then - return true - end - end - return false -end +-- once get_texdocs() is done, roots are represented by their index in texdocs +-- usefull to avoid fake matches and also for the sort routine +-- the next two functions do the conversions --- include a file in the lists if it should be -function process_file (file, pathfile, code, pattern) - local base, ext = string.match(file, '^(.*)%.(.*)$') - if string.find(pathfile, pattern, 1, no_regex) and is_good_ext (ext) - then - if (base == pattern) or (file == pattern) then - table.insert(exact_docfiles, code_path (code, pathfile)) - else - table.insert(rel_docfiles, code_path (code, pathfile)) - end - end -end - --- encodes the base path on two digits and concatenate with filename --- see real_path() for decoding +-- encode the base path on two digits and concatenate with filename function code_path (code, file) local padding = (code > 9) and '' or '0' return padding..code..':'..file end --- scan a tree +-- decode a path as given in *_docfiles into a real path +function real_path (fake) + local code, file = string.match (fake, '^(.-):(.*)$') + code = tonumber (code) + return win32_hook (texdocs[code]..'/'..file) +end + +-- merge two components of a path, taking care of empty components +function merge_path (a, b) + return ((a == '') or (b == '')) and a..b or a..'/'..b +end + +-- scan a tree without ls-R file function scan_tree (code, path, pattern, recurse) for file in lfs.dir(path) do if file ~= '.' and file ~= '..' then @@ -165,7 +200,7 @@ function scan_tree (code, path, pattern, recurse) end end --- finds a root with ls-R above path and return it or nil +-- finds a ls-R file in a parent directory an return it or nil function lsr_root (path) if not lfs.isdir (path) then return end local root, shift = path, '' @@ -181,11 +216,6 @@ function lsr_root (path) end end --- merge two components of a path, taking care of empty components -function merge_path (a, b) - return ((a == '') or (b == '')) and a..b or a..'/'..b -end - -- scan a ls-R file function scan_lsr (code, shift, pattern) local isdoc = false @@ -215,8 +245,18 @@ function scan_lsr (code, shift, pattern) lsr:close() end --- find dirfiles according to pattern +-- remove directories from a list +function rmdirs (files) + local res = {} + for f in list (files) do + if not is_dir[f] then table.insert(res, f) end + end + return res +end + +-- find docfiles "matching" pattern function populate_docfiles (pattern) + pattern = normalize_pattern(pattern) if not texdocs then get_texdocs() end rel_docfiles, exact_docfiles = {}, {} -- global is_dir = {} -- global; is_dir[path] = true iff path is a dir, see scan_lsr @@ -236,8 +276,6 @@ function populate_docfiles (pattern) rel_docfiles = rmdirs (rel_docfiles) end --- END kpse-like - -- like populate_docfiles, but rel replaces exact if exact is empty function mixed_populate_docfiles (pattern) populate_docfiles (pattern) @@ -249,99 +287,149 @@ function mixed_populate_docfiles (pattern) end end --- translate a path as given by populate_docfiles into a real path --- should never be called before get_texdocs() -function real_path (fake) - local code, file = string.match (fake, '^(.-):(.*)$') - code = tonumber (code) - return win32_hook (texdocs[code]..'/'..file) +-- for sty files, we obviously don't want to look in TEXDOCS... +-- and we don't need a list since those are not duplicated (ahem...) +function populate_docfiles_sty (styname) + exact_docfiles = { kpse.find_file (styname) } + rel_docfiles = {} end --- now a special function that does nothing on Unix -if os.type == "windows" then - function win32_hook (path) - local res = string.gsub (path, '/', '\\') - return res -- get rid of gsub's 2nd arg - end -else - function win32_hook (path) - return path +---------------------------- selecting results ----------------------------- + +-- says if ext is 'good' according to ext_list +function is_good_ext (ext) + for e in list (config.ext_list) do + if e == '*' then + return true + elseif (e == '') and (not ext) then + return true + elseif ext == e then + return true + end end + return false end --- remove directories from the files list -function rmdirs (files) - local res = {} - for f in list (files) do - if not is_dir[f] then table.insert(res, f) end +-- include a file in the *_docfiles lists if it "matches" +function process_file (file, pathfile, code, pattern) + local base, ext = string.match(string.lower(file), '^(.*)%.(.*)$') + if string.find(string.lower(pathfile), pattern, 1, no_regex) + and is_good_ext (ext) then + if (base == pattern) or (file == pattern) then + table.insert(exact_docfiles, code_path (code, pathfile)) + else + table.insert(rel_docfiles, code_path (code, pathfile)) + end end - return res end --- for sty files, we obviously don't want to look in TEXDOCS... --- and we don't need a list since those are not duplicated (ahem...) -function populate_docfiles_sty (styname) - exact_docfiles = { kpse.find_file (styname) } - rel_docfiles = {} +-- for now, just make lowercase, but may do more later +function normalize_pattern (pattern) + return string.lower(pattern) +end + +----------------------------- sorting results ------------------------------ + +-- compare two filenames with the following rule: +-- 1. extensions are ordered as in ext_list first, +-- 2. then filenames lexicographically. +function file_order (a, b) + local ext_a = string.match (a, '^.*%.(.*)$') + local ext_b = string.match (b, '^.*%.(.*)$') + ext_pos_a = config.ext_list_inv[ext_a] or (config.ext_list_max+1) + ext_pos_b = config.ext_list_inv[ext_b] or (config.ext_list_max+1) + if ext_pos_a < ext_pos_b then + return true + elseif ext_pos_a > ext_pos_b then + return false + else + return (a < b) + end end +-------------------------------------------------------------------------------- +---------------- functions to set config values and aliases ---------------- +-------------------------------------------------------------------------------- --- functions to set config values and aliases ---------------------------------------------- +---------------------------- general functions ----------------------------- --- set a value without overwriting if already set and --- using to special types: *_list and *_switch -function set_config_element (key, value, file, line) - if config[key] == nil then -- must explicitly test for nil, not false - if string.match(key, '_list$') then - -- this is actually a coma-separated list of values - local values = string.explode(value, ',') - local inverse = {} - for i, j in ipairs(values) do - values[i] = string.gsub(j, '%s*$', '') - values[i] = string.gsub(j, '^%s*', '') - inverse[j] = i - end - config[key] = values - config[key..'_inv'] = inverse - config[key..'_max'] = #values - elseif string.find (key, '_switch$') then - if value == 'true' then - config[key] = true - elseif value == 'false' then - config[key] = false - else - config_warn (key, value, file, line) - end - elseif string.find (key, '_level$') then - local val = tonumber (value) - if val then - config[key] = val - else - config_warn (key, value, file, line) - end +-- set a config parameter, but don't overwrite it if already set +-- three special types: *_list (list), *_switch (boolean), *_level (number) +function set_config_element (key, value, context) + local is_known = false -- is key a valid option? + for option in list(known_options) do + if string.match(key, option) then is_known = true break end + end + -- warn and exit if key is not a known option + if not is_known then config_warn(key, nil, context) return end + -- exit if key is already set (/!\ must test for nil, not false) + if not (config[key] == nil) then return nil end + if string.match(key, '_list$') then -- coma-separated list + local values = string.explode(value, ',') + local inverse = {} + for i, j in ipairs(values) do -- sanitize values... + values[i] = string.gsub(j, '%s*$', '') + values[i] = string.gsub(j, '^%s*', '') + inverse[j] = i -- ... and build inverse mapping on the way + end + config[key] = values + config[key..'_inv'] = inverse + config[key..'_max'] = #values + elseif string.find (key, '_switch$') then -- boolean + if value == 'true' then + config[key] = true + elseif value == 'false' then + config[key] = false + else + config_warn (key, value, context) + end + elseif string.find (key, '_level$') then -- integer + local val = tonumber (value) + if val then + config[key] = val else - config[key] = value + config_warn (key, value, context) end + else -- string + config[key] = value + end + -- special case: if we just set verbosity_level, print version info now + if key == 'verbosity_level' then + err_print(arg[0]..' version '..version, 'debug1') end + -- now tell what we have just done, for debugging + err_print('Setting "'..key..'='..value..'" ' + ..context_to_string(context)..'.', 'debug2') end -- a helper function for warning messages in the above -function config_warn (key, value, file, line) - local begin = 'illegal value '..value..' for key '..key +function config_warn (key, value, context) + local begin = value and 'Illegal value "'..value..'" for option "'..key..'"' + or 'Unkown option "'..key..'"' local ending = '. Skipping.' - if file and line then - err_print (begin..'\nin '..file..' line '..line..ending, 'warning') + err_print (begin..'\n '..context_to_string(context)..ending, 'warning') +end + +-- interpreting 'context' for the previous functions +function context_to_string(context) + if not context then return '(no context)' end + if context.src == 'cl' then + return 'from command line option "'..context.name..'"' + elseif context.src == 'env' then + return 'from environment variable "'..context.name..'"' + elseif context.src == 'file' then + return 'in file "'..context.file..'" on line '..context.line + elseif context.src == 'def' then + return 'from built-in defaults' else - err_print (begin..ending, 'warning') + return 'from unkown source (should not happen, please report)' end end - -- set a whole list, also whithout overwriting -function set_config_list (conf) +function set_config_list (conf, context) for key, value in pairs(conf) do - set_config_element (key, value) + set_config_element (key, value, context) end end @@ -352,89 +440,96 @@ function set_alias (key, value) end end +------------------------ options from command line ------------------------- + -- set config from the command line -- Please make sure to update usage_msg accordingly -- and set a default value in setup_config_from_defaults() if relevant. +-- TODO: should use some getopt_long()-like mechanism some day function setup_config_from_cl () + local curr_arg + local function set_config_elt(key, val) + set_config_element(key, val, {src='cl', name=curr_arg}) + end while arg[1] and string.match(arg[1],'^%-') do curr_arg = table.remove(arg,1) if (curr_arg == '-h') or (curr_arg == '--help') then print (usage_msg) os.exit(0) - elseif (curr_arg == '-v') or (curr_arg == '--version') then - print (progname .. ' version: ' .. version ) + elseif (curr_arg == '-V') or (curr_arg == '--version') then + print (progname .. ' ' .. version ) os.exit(0) elseif (curr_arg == '-f') or (curr_arg == '--files') then - print_config_files () + print (progname .. ' ' .. version ) + setup_config_from_files () + show_config_files (print, true) os.exit(0) elseif (curr_arg == '-w') or (curr_arg == '--view') then - set_config_element('mode', 'view') + set_config_elt('mode', 'view') elseif (curr_arg == '-m') or (curr_arg == '--mixed') then - set_config_element('mode', 'mixed') + set_config_elt('mode', 'mixed') elseif (curr_arg == '-l') or (curr_arg == '--list') then - set_config_element('mode', 'list') + set_config_elt('mode', 'list') elseif (curr_arg == '-s') or (curr_arg == '--search') then - set_config_element ('mode', 'search') + set_config_element ('mode', 'search', {src='cl', name=curr_arg}) elseif (curr_arg == '-r') or (curr_arg == '--regex') then - set_config_element ('mode', 'regex') + set_config_element ('mode', 'regex', {src='cl', name=curr_arg}) elseif (curr_arg == '-I') or (curr_arg == '--nointeract') then - set_config_element('interact_switch', 'false') + set_config_elt('interact_switch', 'false') elseif (curr_arg == '-i') or (curr_arg == '--interact') then - set_config_element('interact_switch', 'true') + set_config_elt('interact_switch', 'true') elseif (curr_arg == '-A') or (curr_arg == '--noalias') then - set_config_element('alias_switch', 'false') + set_config_elt('alias_switch', 'false') elseif (curr_arg == '-a') or (curr_arg == '--alias') then - set_config_element('alias_switch', 'true') - elseif string.match(curr_arg, '^%-n') then - set_config_element('noise_level', - string.gsub(curr_arg, '^%-n=?', '')) - elseif string.match(curr_arg, '^%-%-noise%-level') then - set_config_element('noise_level', - string.gsub(curr_arg, '^%-%-noise%-level=?', '')) + set_config_elt('alias_switch', 'true') + elseif (curr_arg == '-d') or (curr_arg == '--debug') then + set_config_elt('verbosity_level', err_max) + elseif string.match(curr_arg, '^%-v') then + local value = string.gsub(curr_arg, '^%-v=?', '') + set_config_elt('verbosity_level', value) + elseif string.match(curr_arg, '^%-%-verbosity') then + local value = string.gsub(curr_arg, '^%-%-verbosity=?', '') + set_config_elt('verbosity_level', value) elseif string.match(curr_arg, '^%-e') then - set_config_element('ext_list', - string.gsub(curr_arg, '^%-e=?', '')) + local value = string.gsub(curr_arg, '^%-e=?', '') + set_config_elt('ext_list', value) elseif string.match(curr_arg, '^%-%-extensions') then - set_config_element('ext_list', - string.gsub(curr_arg, '^%-%-extensions=?', '')) + local value = string.gsub(curr_arg, '^%-%-extensions=?', '') + set_config_elt('ext_list', value) else - err_print ("unknow option: "..curr_arg, "error") - print (usage_msg) + err_print ("unknown option: "..curr_arg, "error") + print (error_msg) os.exit(1) end end end --- the default value af config.alias_switch depends on the mode as follows -function alias_from_mode (mode) - if (mode == 'view') or (mode == 'mixed') or (mode == 'list') then - return 'true' - else - return 'false' - end -end +------------------------- config from environment -------------------------- -- set config from environment if available function setup_config_from_env () - set_config_list { - viewer_pdf = os.getenv ("PDFVIEWER_texdoc") - or os.getenv ("TEXDOCVIEW_pdf") or os.getenv ("TEXDOC_VIEWER_PDF") - or os.getenv ("PDFVIEWER"), - viewer_ps = os.getenv ("PSVIEWER_texdoc") - or os.getenv ("TEXDOCVIEW_ps") or os.getenv ("TEXDOC_VIEWER_PS") - or os.getenv ("PSVIEWER"), - viewer_dvi = os.getenv ("DVIVIEWER_texdoc") - or os.getenv ("TEXDOCVIEW_dvi") or os.getenv ("TEXDOC_VIEWER_DVI") - or os.getenv ("DVIVIEWER"), - viewer_html = os.getenv ("BROWSER_texdoc") - or os.getenv ("TEXDOCVIEW_html") or os.getenv ("TEXDOC_VIEWER_HTML") - or os.getenv ("BROWSER"), - viewer_txt = os.getenv ("PAGER_texdoc") - or os.getenv ("TEXDOCVIEW_txt") or os.getenv ("TEXDOC_VIEWER_TXT") - or os.getenv ("PAGER"), - } + local function set_config_elt_from_vars(key, vars) + for var in list(vars) do + local value = os.getenv(var) + if value then + set_config_element(key, value, {src='env', name=var}) + end + end + end + set_config_elt_from_vars('viewer_pdf', + {"PDFVIEWER_texdoc", "TEXDOCVIEW_pdf", "TEXDOC_VIEWER_PDF", "PDFVIEWER"}) + set_config_elt_from_vars('viewer_ps', + {"PSVIEWER_texdoc", "TEXDOCVIEW_ps", "TEXDOC_VIEWER_PS", "PSVIEWER"}) + set_config_elt_from_vars('viewer_dvi', + {"DVIVIEWER_texdoc", "TEXDOCVIEW_dvi", "TEXDOC_VIEWER_DVI", "DVIVIEWER"}) + set_config_elt_from_vars('viewer_html', + {"BROWSER_texdoc", "TEXDOCVIEW_html", "TEXDOC_VIEWER_HTML", "BROWSER"}) + set_config_elt_from_vars('viewer_txt', + {"PAGER_texdoc", "TEXDOCVIEW_txt", "TEXDOC_VIEWER_TXT", "PAGER"}) end +---------------------- options and aliases from files ---------------------- + -- set config+aliases from a particular config file assumed to exist function read_config_file(configfile) local cnf = assert(io.open(configfile, 'r')) @@ -449,7 +544,8 @@ function read_config_file(configfile) line = string.gsub(line, '^%s*', '') -- remove leading spaces key, val = string.match(line, '^([%a%d_]+)%s*=%s*(.+)') if key and val then - set_config_element(key, val, configfile, lineno) + set_config_element(key, val, { + src='file', file=configfile, line=lineno}) else key, val = string.match(line, '^alias%s+([%a%d_-]+)%s*=%s*(.+)') if key and val then @@ -471,33 +567,54 @@ function get_config_files () local TEXMFHOME = kpse.var_value ('TEXMFHOME') local TEXMFLOCAL = kpse.var_value ('TEXMFLOCAL') local TEXMFMAIN = kpse.var_value ('TEXMFMAIN') - local config_files = {} return { TEXMFHOME .. '/texdoc/texdoc-'..platform..'.cnf', TEXMFHOME .. '/texdoc/texdoc.cnf', + TEXMFHOME .. '/texdoc/texdoc-dist.cnf', TEXMFLOCAL .. '/texdoc/texdoc-'..platform..'.cnf', TEXMFLOCAL .. '/texdoc/texdoc.cnf', TEXMFMAIN .. '/texdoc/texdoc.cnf' } end +-- the config_files table is shared by the next two functions +do +local config_files = {} + -- set config/aliases from all config files function setup_config_from_files () - for file in list (get_config_files ()) do - if lfs.isfile(file) then read_config_file (file) end + for i, file in ipairs (get_config_files ()) do + local found = lfs.isfile(file) + config_files[i] = { + path = file, + status = found and (config.lastfile_switch + and 'disabled' or 'active') or 'absent', + } + if config_files[i].status == 'active' then + read_config_file (file) + end end end -- now a special information function (see -f,--file option) -function print_config_files () - print "Configuration files are:" - for i, file in ipairs (get_config_files ()) do - local found = lfs.isfile(file) and "(active)" or "(not found)" - local home = (i==2) and "* " or "" -- home conffile is the 2nd - print (home..found, win32_hook(file)) +function show_config_files (print_fun, prefix) + print_fun("Configuration files are:") + for i, file in ipairs (config_files) do + local home = prefix and + ((i==2) and "(*) " or " ") -- home conffile is the 2nd + or '' + print_fun (home..file.status..'\t'..win32_hook(file.path)) + end + if prefix then + print("(*) This is the recommended configuration file " + .. "for your personal preferences.") end end +end -- scope of config_files + +---------------------- options from built-in defaults ---------------------- + -- for default viewer on general Unix, we have a list; the following two -- functions are used to check in the path which program is available @@ -521,19 +638,23 @@ end -- set some fall-back default values if no previous value is set function setup_config_from_defaults() + local function set_config_ls(ls) set_config_list(ls, {src='def'}) end + local function set_config_elt(key, val) + set_config_element(key, val, {src='def'}) + end if (os.type == "windows") then -- probably Windows (or OS/2) -- which commands should we use for unzipping? - set_config_list { + set_config_ls { viewer_dvi = 'start ""', viewer_html = 'start ""', viewer_pdf = 'start ""', viewer_ps = 'start ""', - viewer_txt = 'start ""', + viewer_txt = 'start cmd /k more', } else -- since we don't support msdos, if os.type is not windows, it's unix if (os.name == 'macosx') then - set_config_list { + set_config_ls { viewer_dvi = 'open', viewer_html = 'open', viewer_pdf = 'open', @@ -541,7 +662,7 @@ function setup_config_from_defaults() viewer_txt = 'less', } else - set_config_list { + set_config_ls { viewer_dvi = first_in_path { {'evince', '(evince %s) &'}, {'okular', '(okular %s) &'}, @@ -583,33 +704,45 @@ function setup_config_from_defaults() end end -- then various stuff - set_config_list { + set_config_ls { mode = 'view', - interact_switch = 'true', - noise_level = '3', + interact_switch = 'true', + verbosity_level = '3', } -- must be set after mode! - set_config_element ('alias_switch', alias_from_mode(config.mode)) + set_config_elt ('alias_switch', alias_from_mode(config.mode)) -- now a particular case for config.ext_list and zip-related stuff -- Note: removed texdoc_formats/zip_formats, gives simpler & generic code if support_zipped then - set_config_element('ext_list', + set_config_elt('ext_list', 'pdf,pdf.gz,pdf.bz2, html,html.gz,html.bz2, txt,txt.gz,txt.bz2,'.. 'dvi,dvi.gz,dvi.bz2, ps,ps.gz,ps.bz2, ,gz,bz2') - set_config_list { + set_config_ls { unzip_gz = 'gzip -d -c ', unzip_bz2 = 'bzip -d -c ', rm_file = 'rm -f', rm_dir = 'rmdir' } else - set_config_element('ext_list', 'pdf, html, txt, dvi, ps, ') + set_config_elt('ext_list', 'pdf, html, txt, dvi, ps, ') + end +end + +-- the default value of config.alias_switch depends on the mode as follows +function alias_from_mode (mode) -- /!\ returns a string! + if (mode == 'view') or (mode == 'mixed') or (mode == 'list') then + return 'true' + else + return 'false' end + end +-------------------------------------------------------------------------------- +--------------- functions for viewing/displaying the results --------------- +-------------------------------------------------------------------------------- --- functions for viewing/displaying the results ------------------------------------------------ +--------------------------------- viewing ---------------------------------- -- prepare for viewing: set viewer_replacement and viewer_ext -- may uncompress if support_zipped is set (giving the complete filename on the @@ -640,7 +773,7 @@ function how_to_view (filename) -- files without extension are assumed to be text viewext = string.match(filename,'.*%.(.*)$') or 'txt' if not config['viewer_'..viewext] then - err_print (": cannot determine type of file\n\t" + err_print ("cannot determine type of file\n\t" ..filename.."Assuming text. Set the `viewer_"..viewext.. "' variable in texdoc.cnf to avoid this.", "warning") viewext = 'txt' @@ -674,22 +807,7 @@ function try_viewing (view_command, viewer_replacement) return view_result end --- compare two filenames with the following rule: --- 1. extensions are ordered as in ext_list first, --- 2. then filenames lexicograhpicaly. -function file_order (a, b) - local ext_a = string.match (a, '^.*%.(.*)$') - local ext_b = string.match (b, '^.*%.(.*)$') - ext_pos_a = config.ext_list_inv[ext_a] or (config.ext_list_max+1) - ext_pos_b = config.ext_list_inv[ext_b] or (config.ext_list_max+1) - if ext_pos_a < ext_pos_b then - return true - elseif ext_pos_a > ext_pos_b then - return false - else - return (a < b) - end -end +-------------------------------- displaying -------------------------------- -- display a table, sorted, numbered with given offset (0 by default), -- with real path @@ -697,11 +815,7 @@ function display_table (t, offset) offset = offset or 0 table.sort(t, file_order) for i, val in ipairs (t) do - if config.interact_switch then - print (i+offset, real_path(val)) - else - print (real_path(val)) - end + print(string.format('%2d %s', i+offset, real_path(val))) end end @@ -732,8 +846,9 @@ function print_menu (files, comp) end end --- error handling ------------------ +-------------------------------------------------------------------------------- +----------------------- functions for error handling ----------------------- +-------------------------------------------------------------------------------- -- exit codes (probably make sense only with a single argument) -- 0 OK @@ -764,19 +879,18 @@ end -- generic error display function (see the error_priority constant) function err_print (msg, lvl) - -- be careful: maybe config.noise_level is not set yet - local noise_level = config.noise_level or 10000 - if err_priority[lvl] <= noise_level then + -- be careful: maybe config.verbosity_level is not set yet + local verbosity_level = config.verbosity_level or 2 + if err_priority[lvl] <= verbosity_level then io.stderr:write ("texdoc "..lvl..": "..msg.."\n") end end +-------------------------------------------------------------------------------- +--------------------------- main code execution ---------------------------- +-------------------------------------------------------------------------------- --- END of function definitions: here starts the execution ---=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - --- initialisations ------------------- +----------------------------- initialisations ------------------------------ -- initialize kpathsea kpse.set_program_name(arg[-1], "texdoc") @@ -791,8 +905,10 @@ setup_config_from_env () setup_config_from_files () setup_config_from_defaults () --- the main loop over the args ------------------------------- +-- now that verbosity_level is known... +show_config_files(function(s) err_print(s, 'debug1') end) + +------------------------ looping over the arguments ------------------------ -- initialising and saving a few values exit_code = 0 diff --git a/Master/texmf/texdoc/texdoc.cnf b/Master/texmf/texdoc/texdoc.cnf index b121e1e7318..a0ec73aae51 100644 --- a/Master/texmf/texdoc/texdoc.cnf +++ b/Master/texmf/texdoc/texdoc.cnf @@ -37,7 +37,7 @@ # interact_switch = true # alias_switch = true # but false if mode is 'regex' # ext_list = pdf, html, txt, ps , # note the empty string at end -# noise_level = 3 +# verbosity_level = 3 ### Aliases ### @@ -51,8 +51,6 @@ alias latex = latex-doc-ptr ## various stuff # a few useful general documents -alias mathmode = Mathmode -alias visualfaq = visualFAQ alias symbols = symbols-a4 alias faq-en = newfaq alias faq = newfaq @@ -82,6 +80,7 @@ alias lshort-vi = lshort-vi # vietnamese # *TeX engines reference manuals, man pages and related +alias e-tex-ref = etex_man alias etex-ref = etex_man alias pdftex-ref = pdftex-a alias xetex-ref = XeTeX-reference @@ -92,6 +91,7 @@ alias pdftex-man = man1/pdftex alias luatex-pkg = oberdiek/luatex.pdf # by default, <engine> = <engine>-ref (duplicated: no alias cascading) +alias e-tex = etex_man alias etex = etex_man alias pdftex = pdftex-a alias xetex = XeTeX-reference @@ -145,6 +145,7 @@ alias metapost = mpman alias iso = isoman alias pstricks = pstricks-doc alias extramarks = fancyhdr +alias fonttable = fonttable/fonttable ## a few easy patterns @@ -454,4 +455,10 @@ alias vrbexin = vrbexin.sty alias vruler = vruler.sty alias wrapfig = wrapfig.sty +# the next line has no effect when this file is installed as +# TEXMFMAIN/texdoc/texdoc.cnf but is useful when it is installed as +# TEXMFHOME/texdoc/texdoc-dist.cnf for the purpose of installing a newer +# version of texdoc in one's home (eg, running texdoc from SVN) +lastfile_switch = true + # vim: ts=8 noexpandtab: |