19

I've used TeX quite a bit before but am getting back into it at the moment.

I want to print a document details page with info such as:

Compiled on:
Compiled by:
OS version:
LaTeX version:

Obviously the first two are easy (\today and \author). Are there similar commands for the others? Or is there a package available which could manage this?

doncherry
  • 54,637
  • Welcome to TeX.SX. Note that you don't have to sign with your name since it automatically appears in the lower right corner of your post. A tip: If you indent lines by 4 spaces, then they're marked as a code sample. You can also highlight the code and click the "code" button ({}). – Claudio Fiandrino Oct 19 '12 at 15:04
  • 7
    LaTeX has no notion about what operating system it runs on; however you can use the ifplatform package to set different phrases depending on the operating system. The version of LaTeX is just a date that you can get with \fmtversion, for instance \LaTeX{} version: \LaTeXe~\fmtversion – egreg Oct 19 '12 at 15:12

3 Answers3

16

A starting point. The following example extracts information that is available at TeX macro level (code parts are taken from hyperref):

\documentclass{article}

\usepackage{hologo}
\usepackage{ifluatex}
\usepackage{ifxetex}
\usepackage{ifvtex}

\makeatletter
\newcommand*{\InfoLaTeX}{%
  \hologo{\fmtname} \textless\fmtversion\textgreater
}
\newcommand*{\InfoTeX}{%
  \ifxetex
    \hologo{XeTeX}-%
    \the\XeTeXversion\XeTeXrevision
  \else
    \ifluatex
      \hologo{LuaTeX}-%
      \begingroup
       \count@=\luatexversion
        \divide\count@ by 100 %
        \edef\x{\the\count@}%
        \count@=-\x\relax
        \multiply\count@ by 100 %
        \advance\count@ by \luatexversion
        \x.\the\count@.\luatexrevision
      \endgroup
    \else
      \@ifundefined{pdftexversion}{%
        \ifvtex
          \hologo{VTeX}%
          \@ifundefined{VTeXversion}{%
          }{%
            \begingroup
              \count@\VTeXversion
              \divide\count@ 100 %
              \space v\the\count@
              \multiply\count@ -100 %
              \advance\count@\VTeXversion
              .\two@digits\count@
            \endgroup
          }%
        \else
          \hologo{TeX}%
        \fi
      }{%
        \hologo{pdfTeX}-%
        \ifnum\pdftexversion<100 %
          \the\pdftexversion.\pdftexrevision
        \else
          \ifnum\pdftexversion<130 %
            \expandafter\@car\the\pdftexversion\@empty\@nil.%
            \expandafter\@cdr\the\pdftexversion\@empty\@nil  
            \pdftexrevision
          \else
            \expandafter\@car\the\pdftexversion\@empty\@nil.%
            \expandafter\@cdr\the\pdftexversion\@empty\@nil.%
            \pdftexrevision
          \fi
        \fi  
      }%     
    \fi      
  \fi        
}
\makeatother

\begin{document}

\begin{tabular}{@{}ll@{}}
  Compiled by: & \InfoTeX \\
  \hologo{LaTeX} version: & \InfoLaTeX \\
\end{tabular}

\end{document}

A script could gather the other data (OS, ...) and write definitions in a .tex file that can be read by the TeX run.

Result

Moriambar
  • 11,466
Heiko Oberdiek
  • 271,626
  • Works nicely. I put it into a sty file: https://github.com/ypid/typesetting/blob/master/MyPackages/TeXinfoRS.sty for easier usage. – ypid Sep 01 '15 at 13:23
10

If you are willing to use a shell-escape (i.e. compile with 'latex --shell-escape'), you can probably use 'uname' on Unix-like platforms and on Cygwin...

\documentclass{article}

\makeatletter

% redefine \author as \maketitle clears \@author...
\let\oldAuthor=\author
\renewcommand{\author}[1]{\oldAuthor{#1}\gdef\ShowAuthor{#1}}

\newcommand{\ShowOsVersion}{%
    \immediate\write18{\unexpanded{foo=`uname -a` && echo "\\verb+${foo}+" > tmp.tex}}%
    \input{tmp}\immediate\write18{rm tmp.tex}%
}
\makeatother

\title{This is a Document}
\author{John Smith}
\begin{document}

\maketitle

Compiled on: \today

Compiled by: \ShowAuthor

OS version: \ShowOsVersion

\LaTeX{} version: \LaTeXe~\fmtversion

\end{document}

If you want something similar on Windows, I think you could use something along the lines of...

\immediate\write18{systeminfo | findstr /B /C:"OS Name" /C:"OS Version" > tmp.tex}

and maybe restructure slightly - for instance, you'll need to remove the "OS Version:" from the main text because this 'systeminfo' command outputs more than just the version number - for me it outputs

OS Name:                   Microsoft Windows 7 Professional
OS Version:                6.1.7601 Service Pack 1 Build 7601
  • I'm getting this error: line 1: Text line contains an invalid character line 1: You can't use `macro parameter character #' in horizontal mode erb+Linux vaio 3.0.0-16-generic-pae # – Sigur Oct 19 '12 at 23:21
1

A workable approach (at least once your document has grown in scale beyond a single source file) is to use a shell script or batch file to discover and write the information you desire into a file named something like sysinfo.tex. You then reference that in your main document.

I've used this technique mostly for documents that are already heavily machine generated where I also include revision information for the generating program as well as information from the version control system, but there's no reason it can't be done for more ordinary documents.

RBerteig
  • 405