diff options
author | Norbert Preining <norbert@preining.info> | 2022-06-08 03:00:49 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-06-08 03:00:49 +0000 |
commit | b3aac3ae7b628835121d1f485fd49998308170e7 (patch) | |
tree | 79e4d65e7d316acfca2ec1adf00c35b8c6e69a4f /macros | |
parent | 76cfdb3c84a9a4d5d06a9f785b2bed2b44098806 (diff) |
CTAN sync 202206080300
Diffstat (limited to 'macros')
41 files changed, 3824 insertions, 107 deletions
diff --git a/macros/latex/contrib/csassignments/README.md b/macros/latex/contrib/csassignments/README.md new file mode 100644 index 0000000000..413c0ea74b --- /dev/null +++ b/macros/latex/contrib/csassignments/README.md @@ -0,0 +1,42 @@ +# csassignments + +This class file is designed for assignments of university courses, specifically +in the field of computer science, but can easily be adapted to other fields. It +provides macros for counting exercise points, adding a grading table, a helpful +document title block including several non-standard information, and page +headers with compressed author details. + +It supports German and English language by default, by requirement of the +author's university. + +Additional to the layout utilities, the class provides several commonly used +macros for computer science topics, namely several mathematical operators, +mathmode utilities and special environments for proofs and theorem. Those are a +condensed version of macros defined in <https://github.com/zoomoid/AlphabetClasses>. + +## User Guide + +Use the class like any default document class: + +```latex + \documentclass[<option>]{csassignments} + + \course{} + \group{} + \due{} + + \member{}{}{} + % ... + + \begin{document} + \maketitle + \gradingtable + + \exercise[<Exercise Points>]{<Exercise Title>} + \subexercise{} + \end{document} +\end{verbatim} +``` + +Because it inherits from `article`, you can pass down any options that +`article` understands. diff --git a/macros/latex/contrib/csassignments/csassignments.dtx b/macros/latex/contrib/csassignments/csassignments.dtx new file mode 100644 index 0000000000..1be6fcaf47 --- /dev/null +++ b/macros/latex/contrib/csassignments/csassignments.dtx @@ -0,0 +1,686 @@ +% \iffalse meta-comment +% +% Copyright (C) 2022 by Alexander Bartolomey +% ------------------------------------------- +% MIT License +% +% Copyright (c) 2022 +% +% Permission is hereby granted, free of charge, to any person obtaining a copy +% of this software and associated documentation files (the "Software"), to deal +% in the Software without restriction, including without limitation the rights +% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +% copies of the Software, and to permit persons to whom the Software is +% furnished to do so, subject to the following conditions: +% +% The above copyright notice and this permission notice shall be included in all +% copies or substantial portions of the Software. +% +% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +% SOFTWARE. +% \fi +% \iffalse +%<*driver> +\ProvidesFile{csassignments.dtx} +%</driver> +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{csassignments}[2022/06/01 v1.0.0 Assignments Class for CS] +% \end{macrocode} +% +%<*driver> +\documentclass[a4paper]{ltxdoc} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{mathtools} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{url} +\usepackage{helvet} +\renewcommand{\familydefault}{\sfdefault} +\begin{document} + \DocInput{csassignments.dtx} +\end{document} +%</driver> +% \end{macrocode} +% \fi +% +% \CheckSum{574} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \changes{v1.0.0}{2022/06/01}{Publish class with documentation} +% \changes{v1.0.1}{2022/06/07}{Rename class to not collide with existing assignments class} +% +% \GetFileInfo{csassignments.cls} +% +% \title{The \texttt{csassignments} class} +% \date{} +% \author{Alexander Bartolomey} +% \maketitle +% \tableofcontents +% +% \StopEventually{} ^^A +% +% \section{Introduction} +% +% This class file is designed for assignments of university courses, specifically +% in the field of computer science, but can easily be adapted to other fields. It +% provides macros for counting exercise points, adding a grading table, a helpful +% document title block including several non-standard information, and page +% headers with compressed author details. +% +% It supports German and English language by default, by requirement of the +% author's university. +% +% Additional to the layout utilities, the class provides several commonly used +% macros for computer science topics, namely several mathematical operators, +% mathmode utilities and special environments for proofs and theorem. Those are a +% condensed version of macros defined in +% \url{https://github.com/zoomoid/AlphabetClasses}. +% +% \section{Getting Started} +% +% Use the class like any default document class +% +% \begin{verbatim} +% \documentclass[<option>]{csassignments} +% +% \course{} +% \group{} +% \due{} +% +% \member{}{}{} +% % ... +% +% \begin{document} +% \maketitle +% \gradingtable +% +% \exercise[<Exercise Points>]{<Exercise Title>} +% \subexercise{} +% \end{document} +% \end{verbatim} +% +% Because it inherits from \texttt{article}, you can pass down any options that +% \texttt{article} understands. +% +% \section{Initial Code} +% First, we define the document class and set some initial lengths. +% \begin{macrocode} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +\ProcessOptions\relax +\LoadClass[a4paper,11pt]{article} +\makeatletter +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.6em} +% \end{macrocode} +% +% \section{Required Packages} +% +% Notably, the class introduces several dependencies. Here's a list of the +% packages required by \texttt{csassignments}: +% +% \begin{description} +% \item[geometry] \texttt{CTAN:macros/latex/contrib/geometry} +% \item[inputenc] \texttt{CTAN:macros/latex/base} +% \item[babel] \texttt{CTAN:macros/latex/required/babel/base} +% \item[titlesec] \texttt{CTAN:macros/latex/contrib/titlesec} +% \item[enumitem] \texttt{CTAN:macros/latex/contrib/enumitem} +% \item[tocloft] \texttt{CTAN:macros/latex/contrib/tocloft} +% \item[float] \texttt{CTAN:macros/latex/contrib/float} +% \item[ifthen] \texttt{CTAN:macros/latex/base} +% \item[translations] \texttt{CTAN:macros/latex/contrib/translations} +% \item[csquotes] \texttt{CTAN:macros/latex/contrib/csquotes} +% \item[fancyhdr] \texttt{CTAN:macros/latex/contrib/fancyhdr} +% \item[microtype] \texttt{CTAN:macros/latex/contrib/microtype} +% \item[stmaryrd] \texttt{CTAN:fonts/stmaryrd} +% \item[graphicx] \texttt{CTAN:macros/latex/required/graphics} +% \item[pdfpages] \texttt{CTAN:macros/latex/contrib/pdfpages} +% \item[hyperref] \texttt{CTAN:macros/latex/contrib/hyperref} +% \item[tikz] \texttt{CTAN:graphics/pgf/base} +% \item[microtype] \texttt{CTAN:macros/latex/contrib/microtype} +% \item[amsmath] \texttt{CTAN:macros/latex/required/amsmath} +% \item[amsthm] \texttt{CTAN:macros/latex/required/amscls} +% \item[amssymb] \texttt{CTAN:macros/latex/required/amscls} +% \item[mathtools] \texttt{CTAN:macros/latex/contrib/mathtools} +% \item[totcount] \texttt{CTAN:macros/latex/contrib/totcount} +% \item[changepage] \texttt{CTAN:macros/latex/contrib/changepage} +% \item[etoolbox] \texttt{CTAN:macros/latex/contrib/etoolbox} +% \item[environ] \texttt{CTAN:macros/latex/contrib/environ} +% \item[multicol] \texttt{CTAN:macros/latex/required/tools} +% \item[tgpagella] \texttt{CTAN:fonts/tex-gyre} +% \item[suffix] \texttt{CTAN:macros/latex/contrib/bigfoot} +% \end{description} +% +% \begin{macrocode} +\RequirePackage[left=2.5cm,right=2.5cm,top=2cm,bottom=2cm, + includeheadfoot]{geometry} +\RequirePackage[utf8]{inputenc} +\RequirePackage[english]{babel} +\RequirePackage{titlesec} +\RequirePackage{enumitem} +\RequirePackage{graphicx} +\RequirePackage{tocloft} +\RequirePackage{float} +\RequirePackage{ifthen} +\RequirePackage{translations} +\RequirePackage{csquotes} +\RequirePackage{fancyhdr} +\RequirePackage{microtype} +\RequirePackage{stmaryrd} +\RequirePackage{pdfpages} +\RequirePackage[hidelinks, unicode]{hyperref} +\RequirePackage{tikz} +\RequirePackage{microtype} +\RequirePackage[fleqn]{amsmath} +\RequirePackage{amsthm} +\RequirePackage{amssymb} +\RequirePackage{mathtools} +\RequirePackage{totcount} +\RequirePackage{changepage} +\RequirePackage{etoolbox} +\RequirePackage{environ} +\RequirePackage{multicol} +\RequirePackage{tgpagella} +\RequirePackage{suffix} +\usetikzlibrary{arrows,calc} +% \end{macrocode} +% +% \section{Translations} +% \texttt{csassignments} comes with several predefined prefixes that are localized in both +% English and German: +% \begin{macrocode} +\DeclareLanguage{english} +\DeclareLanguage{german} +\select@language{english} +\ProvideTranslation{german}{prefixAuthor}{Eingereicht von} +\ProvideTranslation{english}{prefixAuthor}{Handed in by} +\ProvideTranslationFallback{prefixAuthor}{Handed in by} +\ProvideTranslation{german}{prefixDate}{am} +\ProvideTranslation{english}{prefixDate}{on} +\ProvideTranslationFallback{prefixDate}{on} +\ProvideTranslation{ngerman}{exercise}{Aufgabe} +\ProvideTranslation{english}{exercise}{Exercise} +\ProvideTranslationFallback{exercise}{Exercise} +\ProvideTranslation{ngerman}{exerciseAbbrev}{Aufg.} +\ProvideTranslation{english}{exerciseAbbrev}{Ex.} +\ProvideTranslationFallback{exerciseAbbrev}{Ex.} +\ProvideTranslation{ngerman}{subexercise}{Teilaufgabe} +\ProvideTranslation{english}{subexercise}{Subexercise} +\ProvideTranslationFallback{subexercise}{Subexercise} +\ProvideTranslation{ngerman}{points}{Punkte} +\ProvideTranslation{english}{points}{Points} +\ProvideTranslationFallback{points}{Points} +\ProvideTranslation{ngerman}{sheet}{Abgabe} +\ProvideTranslation{english}{sheet}{Exercise Sheet} +\ProvideTranslationFallback{sheet}{Exercise Sheet} +\ProvideTranslation{ngerman}{studentId}{Matr.Nr.} +\ProvideTranslation{english}{studentId}{Student ID} +\ProvideTranslationFallback{studentId}{Student ID} +% \end{macrocode} +% +% \section{Grouping Exercises} +% To support the grading table, we need to initialize several counters for both counting up +% the awarded points of exercises but also for labels of exercises and subexercises. +% \begin{macrocode} +\newtotcounter{exercisenumber} +\newtotcounter{subexercisenumber} +\newtotcounter{totalpoints} +\edef\exerciseLabelGradingTable{} +\edef\gradingTableExercisePoints{} +\edef\PTableA{} +\edef\PTableB{} +\edef\PTHead{} +\newcommand{\@addPT}[2]{ + \edef\gradingTableExerciseLabel{\GetTranslation{exerciseAbbrev} #1 &} + \edef\gradingTableExercisePoints{\qquad / $#2$ &} + \xappto\PTableA{\gradingTableExerciseLabel} + \xappto\PTableB{\gradingTableExercisePoints} + \xappto\PTHead{c | } +} +% \end{macrocode} +% \begin{macro}{\gradingtable} +% You can toggle the displaying of the grading table by adding \cmd{\gradingtable} at some point +% in your document before the first exercise. It requires the compiler to run twice, in order +% expand the control sequence created on the first run, where exercise labels and points were +% appended in order to be combined in a subsequent run. +% \begin{macrocode} +\newcommand{\gradingtable}{% + \ifdef{\PTHeadSaved}{% + {\Large\bfseries Grading Table}\\% + \begin{table}[h!] + \renewcommand\arraystretch{2}% + \begin{tabular}{\expandonce{\PTHeadSaved} c} + \PTableASaved {\Large$\Sigma$}\\ \hline + \PTableBSaved \qquad / $\totalpointsSaved$ + \end{tabular} + \renewcommand{\arraystretch}{1}% + \end{table} + }{\texttt{Compile again}\ClassWarning{Compile again to properly + display grading table}} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\exercise} +% \begin{macro}{\exercise*} +% On top-level, assignments consist of one or more exercise. The +% \cmd{\exercise}\oarg{exercise points}\marg{exercise title} macro provides a +% numbered section title for your assignment. The mandatory argument should +% contain the exercise's title which is then included in the section title, or +% be left blank, in which case nothing is appended to the exercise title. The +% optional argument contains the points rewarded for the exercise in total. +% +% Exercise points are added up in the first run of pdflatex (or your TeX +% backend of choice) and written to the auxilliary file. On the second run, +% the grading table is added to the top of the document, by inclusion of the +% points stored in the first run. \textbf{This is the reason csassignments +% requires two or more runs when used with the grading table}. +% +% If you do not specify points, that is, leave the optional argument field +% empty, the awarded points for the exercise will be set to zero, but the +% exercise will not be included in the grading table. +% +% If you do not specify a title, no empty parentheses are printed. +% +% Using the starred version of the exercise command will allow you to +% explicitly exclude exercise from the grading table (similar to +% \cmd{section*}\marg{section title} not being included in the table of +% contents). Note that you can set points on explicitly excluded exercises. +% The exercise will not count towards the total number of points, but the +% points for the exercise will still be included in the right column of the +% exercise's title line. This might be particularly helpful for modelling +% bonus exercises. +% \begin{macrocode} +\newcommand{\@pointsPerExercise}[1]{ + \ifstrempty{#1}{}{{\quad\large\bfseries/#1 \GetTranslation{points}}} +} +\newcommand{\@exerciseLabel}[1]{ + \quad\ifstrempty{#1}{}{\bfseries(#1)} +} +\newcommand\exercise[2][]{ + \penalty150 + \ifblank{#1}{\def\points{0}}{\def\points{#1}} + \stepcounter{exercisenumber} + \setcounter{subexercisenumber}{0} + \par + \vspace{1.5\baselineskip} + { + {\Large\bfseries\GetTranslation{exercise}\ \arabic{exercisenumber}} + \@exerciseLabel{#2} + \@exerciseRules + \notblank{#1}{\@pointsPerExercise{#1}}{} + } + \par + \notblank{#1}{ + \addtocounter{totalpoints}{\points} + \@addPT{\arabic{exercisenumber}}{\points} + }{} +} +\WithSuffix\newcommand\exercise*[2][]{ + \penalty150 + \ifblank{#1}{\def\points{0}}{\def\points{#1}} + \stepcounter{exercisenumber} + \setcounter{subexercisenumber}{0} + \par + \vspace{1.5\baselineskip} + { + {\Large\bfseries\GetTranslation{exercise}\ \arabic{exercisenumber}} + \@exerciseLabel{#2} + \@exerciseRules + \notblank{#1}{\@pointsPerExercise{#1}}{} + } + \par + \addtocounter{totalpoints}{\points} +} +\AtEndDocument{ + \makeatletter + \immediate\write\@mainaux{\string\gdef\string\PTableASaved{\PTableA}} + \immediate\write\@mainaux{\string\gdef\string\PTableBSaved{\PTableB}} + \immediate\write\@mainaux{\string\gdef\string\PTHeadSaved{\PTHead}} + \immediate\write\@mainaux{\string\gdef\string\totalpointsSaved% + {\arabic{totalpoints}}} + \makeatother +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\subexercise} +% Subexercises are the subsection to section equivalent for exercises. In fact, +% their counters behave the same way as subsection counters do. +% \cmd{\subexercise}\oarg{Subexercise title} will make a new subexercise under the +% current exercise. Note that point counting for subexercises is not supported. +% Rather, points are only awarded on the exercise level. Therefore, subexercises +% are rather semantical for the exercise's reading flow. +% \begin{macrocode} +\newcommand{\subexercise}[1][]{ + \penalty150 + \stepcounter{subexercisenumber} + \par + \vspace{0.5\baselineskip} + { + {\bfseries\GetTranslation{subexercise}\ (\alph{subexercisenumber})} + \quad\ifstrempty{#1}{}{(#1)} + \@subexerciseRules + } + \par +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\Vhrulefill{\leavevmode\leaders\hrule height 0.7ex depth +\dimexpr0.4pt-0.7ex\hfill\kern0pt} +% \end{macrocode} +% \begin{macro}{\exerciseRules} +% \begin{macro}{\subexerciseRules} +% To add line-spanning horizontal rules between exercises and subexercises, +% respectively, for better visual separation, add \cmd{\exerciseRules} add some +% point in the document before the first exercise. +% \begin{macrocode} +\newcommand{\exerciseRules}{ + \renewcommand{\@exerciseRules}{\hspace{1em}\Vhrulefill} } + \newcommand{\subexerciseRules}{ + \renewcommand{\@subexerciseRules}{\hspace{0em}\Vhrulefill} } +\newcommand{\@exerciseRules}{} +\newcommand{\@subexerciseRules}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\noPoints} +% To remove points and grading entirely from the +% document, add \cmd{\noPoints} at some point in the document before the first +% exercise. This overwrites the grading table macro and defines the exercise +% command to not count points. +% \begin{macrocode} +\newcommand{\nopoints}{ + \renewcommand{\@pointsPerExercise}{} + \renewcommand{\gradingtable}{} + \renewcommand{\exercise}{\@exerciseNoPoints} +} +\newcommand{\@exerciseNoPoints}[1]{ + \def\points{0} + \stepcounter{exercisenumber} + \setcounter{subexercisenumber}{0} + \par + \vspace{1.5\baselineskip} + { {\Large\bfseries\GetTranslation{exercise}\ \arabic{exercisenumber}} + \@exerciseLabel{#1} \@exerciseRules } + \par +} +% \end{macrocode} +% \end{macro} +% \section{Document Title} +% The \texttt{csassignments} class offers several customizations to the default title of article. +% Namely, we can omit the default fields \cmd{\title}, \cmd{\author}, and \cmd{\date}, and +% replace them with something more fitting to an assignment: +% \begin{macrocode} +\newcommand{\@course}{Assignment} +\newcommand{\@sheet}{} +\newcommand{\@group}{} +\newcommand{\@prefixId}{\GetTranslation{studentId} } +\newcommand{\@members}{} +\newcommand{\@member}[2][]% + {\notblank{#1}{#2, \notblank{#1}{\@prefixId{#1}}{} \\}{#2}} +\newcommand{\@due}{} +\newcommand{\@prefixAuthor}{\GetTranslation{prefixAuthor}} +\newcommand{\@prefixDate}{\GetTranslation{prefixDate}} +% \end{macrocode} +% \begin{macro}{\course} +% \begin{macro}{\sheet} +% \begin{macro}{\group} +% \begin{macro}{\due} +% \begin{macro}{\member} +% Course name with \cmd{\course}\marg{Course}, sheet number with \cmd{\sheet}\marg{sheet number}, +% group name with \cmd{\group}\marg{group name}, due date with \cmd{\due}\marg{due date}, +% and all members of the group with repeated \cmd{\member}\oarg{student id}\marg{name}. +% \begin{macrocode} +\newcommand{\course}[1]{\expandafter\notblank\expandafter{#1}% + {\def\@course{#1}}{}} +\newcommand{\sheet}[1]{\def\@sheet{\GetTranslation{sheet} #1}} +\newcommand{\group}[1]{\renewcommand{\@group}{#1}} +\newcommand{\due}[1]{\renewcommand{\@due}{#1}} +\newcommand{\member}[2][]{ + \expandafter\renewcommand\expandafter\@members\expandafter + {\@members\@member[#1]{#2}} + \expandafter\renewcommand\expandafter\pdfmembers\expandafter + {\pdfmembers\pdfmember[#1]{#2}} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\PrefixId} +% \begin{macro}{\PrefixAuthor} +% \begin{macro}{\PrefixDate} +% Additionally, you can redefine the prefixes prepended to the individual parts of the title, for example, +% the default (english) prefix for the members line in the title block is ``Handed in by'', which you can +% replace by using \cmd{\PrefixDate}\marg{custom due date prefix}. +% \begin{macrocode} +\newcommand{\PrefixId}[1]{\renewcommand{\@prefixId}{#1}} +\newcommand{\PrefixAuthor}[1]{\renewcommand{\@prefixAuthor}{#1}} +\newcommand{\PrefixDate}[1]{\renewcommand{\@prefixDate}{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\renewcommand{\and}{\\} +\renewcommand{\maketitle}{ + \thispagestyle{empty} + {\bfseries\Huge\@course} + \par + \expandafter\notblank\expandafter\@sheet{{\LARGE\@sheet\\}}{} + \par + \expandafter\notblank\expandafter\@members{ + {\footnotesize\bfseries\@prefixAuthor}\\ + \hspace*{4pt}{\large{\vspace*{4pt}\begin{tabular}[t]{@{}l} + \@members + \end{tabular}}}\\ + }{} + \expandafter\notblank\expandafter\@due{ + {\footnotesize\bfseries\@prefixDate}\\ + \vspace*{4pt}{\hspace*{4pt}{\large\@due}}\\ + }{} + \vskip \baselineskip + \pagestyle{fancy} +} +\renewcommand{\headrulewidth}{1pt} +\setlength\headheight{4\baselineskip} +\rhead{ + \begin{tabular}{r} + \textbf{\@course} \\ + \@sheet \\ + {\small\@due} + \end{tabular} +} +\lhead{ + \small{% + \begin{tabular}{l} + \@members + \end{tabular}% + } + } +% \end{macrocode} +% +% Lastly, the class handles PDF metadata creation using \texttt{hyperref} from the provided +% macros, i.e., \cmd{\course}, \cmd{\group} etc. +% \begin{macrocode} +\newcommand{\@pdfauthorprefix}{\expandafter\notblank\expandafter% + {\@group}{Group \@group: }{}\relax} +\newcommand{\pdfmembers}{} +\newcommand{\pdfmember}[2][]{\expandafter\notblank\expandafter% + {#1}{#2, {#1};}{#2}} +\AtBeginDocument{\hypersetup{ + pdftitle = {\texorpdfstring{Assignment \@sheet}{}}, + pdfauthor = {\texorpdfstring{\@pdfauthorprefix\pdfmembers}{}}, + pdfsubject = {\texorpdfstring{\@course}{}} +}} +% \end{macrocode} +% +% \section{Math Helpers} +% +% \texttt{csassignments} includes several frequently used macros for mathmode, that were, +% and still are, helpful with assignment work during several computer science courses. +% Most of them were originally created in one of the \textsc{AlphabetClasses} packages, +% which featured a lot more definitions. +% +% This class only contains a condensed version of them: +% +% \begin{macro}{\N} +% \begin{macro}{\Z} +% \begin{macro}{\R} +% \begin{macro}{\Q} +% \begin{macro}{\C} +% \begin{macro}{\F} +% \begin{macro}{\primefield} +% These macros define common number spaces and fields as double font in mathmode. Notably, +% \cmd{\primefield} makes a double-printed P, as notation for an arbitrary prime field. +% \begin{macrocode} +\newcommand{\N}{\ensuremath{\mathbf{N}}} +\newcommand{\Z}{\ensuremath{\mathbf{Z}}} +\newcommand{\R}{\ensuremath{\mathbf{R}}} +\newcommand{\Q}{\ensuremath{\mathbf{Q}}} +\newcommand{\C}{\ensuremath{\mathbf{C}}} +\newcommand{\F}{\ensuremath{\mathbb{F}}} +\newcommand{\primefield}{\ensuremath{\mathbb{P}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\modring} +% Denoting a ring of integers modulo \(n\) is easily done in short notation with \cmd{\modring}, +% see \(\mathbb{Z}/\!n\:\), which even works in regular text due to custom trailing spacing. +% \begin{macrocode} +\newcommand{\modring}[2]{#1/\!#2\:} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\derivative} +% The \cmd{\derivative}\marg{variable} prints a typical \(\frac{d}{dx}\) as a shorthand macro. +% Notably it is not even shorter than the explicit fracture, it is just a convenience macro created +% at a time when writing \LaTeX for assignments was supported by semantic macros (a thing \LaTeX +% clearly lacks). +% \begin{macrocode} +\newcommand{\derivative}[1]{\ensuremath{\frac{d}{d#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\matadd} +% \begin{macro}{\matmul} +% \begin{macro}{\matswap} +% These macros are helpful when visualizing matrix operations, namely addition of rows, +% scalar multiplication of a row, and swapping of rows. Arguments of the macros are identical +% to the group operation's parameter. +% \begin{macrocode} +\newcommand{\matadd}[3]{\ensuremath{\xmapsto{\mathrm{add}_{#1,#2,#3}}}} +\newcommand{\matmul}[2]{\ensuremath{\xmapsto{\mathrm{mul}_{#1,#2}}}} +\newcommand{\matswap}[2]{\ensuremath{\xmapsto{\mathrm{sw}_{#1,#2}}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\forall} +% \begin{macro}{\exists} +% To make logic quantors look a bit better, we redefine the ``for all'' and ``exists'' quantors with +% a bit more horizontal space left and right +% \begin{macrocode} +\renewcommand{\forall}{\ensuremath{\hskip 2pt \oforall \hskip 2pt}} +\renewcommand{\exists}{\ensuremath{\hskip 2pt \oexists \hskip 2pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\floor} +% \begin{macro}{\ceil} +% \begin{macro}{\abs} +% These are some commonly used mathematical functions, that is, rounding up or down, +% and the absolute function of a value. +% \begin{macrocode} +\newcommand{\ceil}[1]{\ensuremath{\left\lceil #1 \right \rceil}} +\newcommand{\floor}[1]{\ensuremath{\left\lfloor #1 \right \rfloor}} +\newcommand{\abs}[1]{\ensuremath{\left\vert#1\right\vert}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\rfrac} +% For inline math, regular fractions tend to either stretch the line height, +% resulting in optical heterogeneity of multiple lines, or setting the letters +% in the fraction so small that they become unreadable. For small, inline fractions, +% \cmd{\rfrac}\marg{numerator}\marg{denominator} offers a less optically noisy option, +% by setting the numerator and denominator in a diagonal arrangement, rahter than purely +% vertical. Here are some examples: \({}^{1}\!/_{n}\), \({}^{2n}\!/_{k}\), \({}^{100}\!/_{4}\). +% \begin{macrocode} +\newcommand{\rfrac}[2]{{}^{#1}\!/_{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mod} +% The macro defines the usual modulus function with a bit of extra space to the left and right. +% \begin{macrocode} +\renewcommand{\mod}{\ \mathrm{mod}\ } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rel} +% To make a new, arbitrary relation, that is, a symbol for with \texttt{amsmath} ensures horizontal +% space left and right using \cmd{\mathrel} +% \begin{macrocode} +\newcommand{\rel}[1]{\ensuremath{\mathrel{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\QED} +% Ending a proof the way tought at RWTH Aachen University, with a square flushed to the right of +% the line, can be done by simply adding \cmd{\QED}. +% Note however that it is semantically more elegant to use \texttt{amsthm} with either predefined +% \texttt{proof} environment, or any custom environment, as these usually also handle adding a label +% to the block, e.g., ``\textbf{Proof}.'' or ``\textbf{Lemma}''. +% \begin{macrocode} +\newcommand{\QED}{\hfill\(\square\)} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\newtheoremstyle{it}{3pt}{3pt}{}{}{\itshape}{:}{.5em}{} +\theoremstyle{it} +% \end{macrocode} +% \begin{macrocode} +\makeatother +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/macros/latex/contrib/csassignments/csassignments.ins b/macros/latex/contrib/csassignments/csassignments.ins new file mode 100644 index 0000000000..32146a108d --- /dev/null +++ b/macros/latex/contrib/csassignments/csassignments.ins @@ -0,0 +1,49 @@ +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble + +------------------------------------------------------------------- + LICENCE +------------------------------------------------------------------- + +This is a generated file. + +MIT License + +Copyright (C) 2022 by Alexander Bartolomey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE + +This work consists of the source files: + - csassignments.dtx (documented LaTeX file) + - csassignments.ins (installer) + +\endpreamble +\generate{\file{csassignments.cls}{\from{csassignments.dtx}{cls}}} +\Msg{*********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* following file into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space csassignments.cls} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*********************************************************} +\endbatchfile diff --git a/macros/latex/contrib/csassignments/csassignments.pdf b/macros/latex/contrib/csassignments/csassignments.pdf Binary files differnew file mode 100644 index 0000000000..43b113f3b8 --- /dev/null +++ b/macros/latex/contrib/csassignments/csassignments.pdf diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md index 0205576bb5..60b6838010 100644 --- a/macros/latex/contrib/l3packages/CHANGELOG.md +++ b/macros/latex/contrib/l3packages/CHANGELOG.md @@ -7,6 +7,12 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2022-06-07] + +### Fixed +- Space stripping from `xtemplate` key types +- Fix `log-declarations=true` (gh/1095) + ## [2022-05-30] ## Added @@ -181,7 +187,8 @@ this project uses date-based 'snapshot' version identifiers. - Switch to ISO date format - Improve cross-module use of internal functions -[Unreleased]: https://github.com/latex3/latex3/compare/2022-05-30...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2022-06-07...HEAD +[2022-06-07]: https://github.com/latex3/latex3/compare/2022-05-30...2022-06-07 [2022-05-30]: https://github.com/latex3/latex3/compare/2022-01-12...2022-05-30 [2022-01-12]: https://github.com/latex3/latex3/compare/2021-11-12...2022-01-12 [2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12 diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md index d683ea95ec..1d9dd586cc 100644 --- a/macros/latex/contrib/l3packages/README.md +++ b/macros/latex/contrib/l3packages/README.md @@ -1,7 +1,7 @@ LaTeX3 High-Level Concepts ========================== -Release 2022-05-30 +Release 2022-06-07 Overview -------- diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx index 8ff82d96bf..c1c56bb803 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.dtx +++ b/macros/latex/contrib/l3packages/l3keys2e.dtx @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2022-05-30} +% \date{Released 2022-06-07} % % \maketitle % @@ -139,7 +139,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2022-05-30}{} +\ProvidesExplPackage{l3keys2e}{2022-06-07}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf Binary files differindex 9d92531a64..9645d3d9ad 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.pdf +++ b/macros/latex/contrib/l3packages/l3keys2e.pdf diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx index 631c3976b5..fb1de34039 100644 --- a/macros/latex/contrib/l3packages/xfp.dtx +++ b/macros/latex/contrib/l3packages/xfp.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2022-05-30} +% \date{Released 2022-06-07} % % \maketitle % @@ -171,7 +171,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2022-05-30}{} +\ProvidesExplPackage{xfp}{2022-06-07}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf Binary files differindex 80bc16fe6c..b0cc8eef6f 100644 --- a/macros/latex/contrib/l3packages/xfp.pdf +++ b/macros/latex/contrib/l3packages/xfp.pdf diff --git a/macros/latex/contrib/l3packages/xfrac.dtx b/macros/latex/contrib/l3packages/xfrac.dtx index 9694a1abb4..6646a0718c 100644 --- a/macros/latex/contrib/l3packages/xfrac.dtx +++ b/macros/latex/contrib/l3packages/xfrac.dtx @@ -65,7 +65,7 @@ % }^^A % } % -% \date{Released 2022-05-30} +% \date{Released 2022-06-07} % % \maketitle % @@ -535,7 +535,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfrac}{2022-05-30}{} +\ProvidesExplPackage{xfrac}{2022-06-07}{} {L3 Experimental split-level fractions} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xfrac.pdf b/macros/latex/contrib/l3packages/xfrac.pdf Binary files differindex 11d1d7d44e..e4434eea51 100644 --- a/macros/latex/contrib/l3packages/xfrac.pdf +++ b/macros/latex/contrib/l3packages/xfrac.pdf diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx index d1a8872fd7..ee75f37f4d 100644 --- a/macros/latex/contrib/l3packages/xparse.dtx +++ b/macros/latex/contrib/l3packages/xparse.dtx @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2022-05-30} +% \date{Released 2022-06-07} % % \maketitle % @@ -1064,7 +1064,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2022-05-30}{} +\ProvidesExplPackage{xparse}{2022-06-07}{} {L3 Experimental document command parser} % \end{macrocode} % @@ -1086,7 +1086,8 @@ log-declarations .initial:n = false } \keys_set:nV {#1} \l_@@_options_clist - \bool_if:NF \l_@@_log_bool + \bool_if:NTF \l_@@_log_bool + { \msg_redirect_module:nnn {#1} { info } { } } { \msg_redirect_module:nnn {#1} { info } { none } } \cs_new_protected:Npn \@@_unknown_argument_type_error:n ##1 { diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf Binary files differindex f2a4e2c48d..bac6d5b747 100644 --- a/macros/latex/contrib/l3packages/xparse.pdf +++ b/macros/latex/contrib/l3packages/xparse.pdf diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx index 6dd4e2edfd..e329169bb3 100644 --- a/macros/latex/contrib/l3packages/xtemplate.dtx +++ b/macros/latex/contrib/l3packages/xtemplate.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2022-05-30} +% \date{Released 2022-06-07} % % \maketitle % @@ -706,7 +706,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xtemplate}{2022-05-30}{} +\ProvidesExplPackage{xtemplate}{2022-06-07}{} {L3 Experimental prototype document functions} % \end{macrocode} % @@ -1390,7 +1390,7 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_split_keytype_arg:n #1 { - \tl_set:Nn \l_@@_keytype_tl {#1} + \tl_set:Nx \l_@@_keytype_tl { \tl_trim_spaces:n {#1} } \tl_clear:N \l_@@_keytype_arg_tl \cs_set_protected:Npn \@@_split_keytype_arg_aux:n ##1 { @@ -1399,10 +1399,15 @@ \cs_set:Npn \@@_split_keytype_arg_aux:w ####1 ##1 ####2 \s_@@_stop { - \tl_if_empty:nT {####1} + \tl_if_blank:nT {####1} { - \tl_set:Nn \l_@@_keytype_tl {##1} - \tl_set:Nn \l_@@_keytype_arg_tl {####2} + \tl_set:Nx \l_@@_keytype_tl + { \tl_trim_spaces:n {##1} } + \tl_if_blank:nF {####2} + { + \tl_set:Nx \l_@@_keytype_arg_tl + { \use:n ####2 } + } \seq_map_break: } } diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf Binary files differindex 94192df344..a00ca496f9 100644 --- a/macros/latex/contrib/l3packages/xtemplate.pdf +++ b/macros/latex/contrib/l3packages/xtemplate.pdf diff --git a/macros/latex/contrib/pax/README b/macros/latex/contrib/pax/README index 30ba2dba1e..2143f73fa9 100644 --- a/macros/latex/contrib/pax/README +++ b/macros/latex/contrib/pax/README @@ -1,5 +1,4 @@ -README for project pax (PDFAnnotExtractor), 2012/04/23 v0.1l - +README for project pax (PDFAnnotExtractor) TABLE OF CONTENTS ================= @@ -245,3 +244,6 @@ I. History problems with incompatible `xkeyval'. 2012/04/18 v0.1l * Option --version added to pdfannotextractor.pl. +2022/06/07 v2022/06/07 + * Port to recent pdfanotator + * New developper Bastien Roucariès <rouca !at! debian.org> diff --git a/macros/latex/contrib/pax/scripts/pdfannotextractor.pl b/macros/latex/contrib/pax/scripts/pdfannotextractor.pl new file mode 100755 index 0000000000..c5d5cf2a38 --- /dev/null +++ b/macros/latex/contrib/pax/scripts/pdfannotextractor.pl @@ -0,0 +1,196 @@ +#!/usr/bin/env perl +use strict; +$^W=1; + +# Copyright (C) 2008, 2011, 2012 Heiko Oberdiek +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA +# +# This file is part of PDFAnnotExtractor. See README. + +my $name = 'PDFAnnotExtractor'; +my $program = "\L$name\E"; +my $file = "$program.pl"; +my $version = "0.1l"; +my $date = "2012/04/18"; +my $author = "Heiko Oberdiek"; +my $copyright = "Copyright (c) 2008, 2011, 2012 by $author."; + +# History: +# 2008/10/01 v0.1i: First version of the wrapper script. +# 2012/04/18 v0.1l: Option --version added. + +my $title = "$name $version, $date - $copyright\n"; +my $usage = <<"END_OF_USAGE"; +${title}Syntax: $program [options] <PDF files[.pdf]> +Options: + --help print usage + --version print version number + --debug debug informations +END_OF_USAGE + +my $help = 0; +my $debug = 0; +my $opt_version = 0; +use Getopt::Long; +GetOptions( + 'debug!' => \$debug, + 'help!' => \$help, + 'version!' => \$opt_version, +) or die $usage; +!$help or die $usage; +if ($opt_version) { + print "$name $date v$version\n"; + exit(0); +} +(@ARGV >= 1 or die $usage); + +print $title; + +my $error = '!!! Error:'; +my $pdfbox = 'PDFBox'; +my $prg_kpsewhich = 'kpsewhich'; +my $prg_java = 'java'; +my %prg; + +my $jar_pax = 'pax.jar'; +my $main_class = 'pax.PDFAnnotExtractor'; +my $jar_pdfbox = 'pdfbox.jar'; +my @jar_pdfbox = qw[ + pdfbox.jar + PDFBox.jar + pdfbox-0.7.3.jar + PDFBox-0.7.3.jar + pdfbox-0.7.2.jar + PDFBox-0.7.2.jar +]; +my @dir_jar = qw[ + /usr/share/java + /usr/local/share/java +]; +my $path_jar_pax = ''; +my $path_jar_pdfbox = ''; +my $classpath = defined $ENV{'CLASSPATH'} ? $ENV{'CLASSPATH'} : ''; +debug('CLASSPATH', $classpath); +my $pdfbox_in_classpath = $classpath =~ /PDFBox/ ? 1 : 0; + +my $is_win = 0; +$is_win = 1 if $^O =~ /^MSWin(32|64)/i + or $^O =~ /^dos/i + or $^O =~ /^os2/i; +debug('is_win', $is_win); + +use File::Which; + +sub debug ($$) { + my $key = shift; + my $value = shift; + print "* $key: [$value]\n" if $debug; +} + +sub check_prg ($$) { + my $prg = shift; + my $die = shift; + return 1 if $prg{$prg}; + my $path = which($prg); + if ($path) { + $prg{$prg} = $path; + debug "Which $prg", $path; + return 1; + } + debug "Which $prg", '<not found>'; + if ($die) { + die "$error Cannot find program `$prg'!\n"; + } + return 0; +} + +sub find_jar ($) { + my $jar_name = shift; + + check_prg $prg_kpsewhich, 1; + my $cmd = "kpsewhich" + . " --progname $program" + . " --format texmfscripts" + . " $jar_name"; + debug 'Backticks', $cmd; + my $path = `$cmd`; + if ($? == 0) { + chomp $path; + debug 'Exit code', '0/success'; + debug $jar_name, $path; + return $path; + } + if ($? == -1) { + die "!!! Error: Cannot execute `$prg_kpsewhich' ($!)!\n"; + } + if ($? & 127) { + die "!!! Error: `$prg_kpsewhich' died with signal " . ($? & 127) + . (($? & 128) ? ' with coredump' : '') . "!\n"; + } + debug 'Exit code', ($? >> 8); + return ''; +} + +sub find_jar_pax () { + return if $path_jar_pax; + foreach my $dir (@dir_jar) { + my $path = "$dir/$jar_pax"; + if (-f $path) { + $path_jar_pax = $path; + debug $jar_pax, $path_jar_pax; + return; + } + } + $path_jar_pax = find_jar $jar_pax; + if (!$path_jar_pax) { + die "$error Cannot find `$jar_pax'!\n"; + } +} + + +sub launch_pax () { + check_prg $prg_java, 1; + my @cmd = ($prg_java); + push @cmd, '-cp'; + push @cmd, $path_jar_pax; + push @cmd, 'pax.PDFAnnotExtractor'; + push @cmd, @ARGV; + debug 'System', "@cmd"; + system @cmd; + if ($? == 0) { + debug 'Result', 'ok'; + return 0; + } + if ($? == -1) { + die "$error Cannot execute `$prg_java' ($!)!\n"; + } + if ($? & 127) { + die "$error `$prg_java' died with signal " . ($? & 127) + . (($? & 128) ? ' with coredump' : '') . "!\n"; + } + my $exit_code = $? >> 8; + debug 'Exit code', $exit_code; + return $exit_code; +} + +# main program + +my $ret = 0; +find_jar_pax; +exit launch_pax; + +__END__ diff --git a/macros/latex/contrib/pax/source/Makefile b/macros/latex/contrib/pax/source/Makefile new file mode 100644 index 0000000000..944ee43ded --- /dev/null +++ b/macros/latex/contrib/pax/source/Makefile @@ -0,0 +1,10 @@ +distctan: + cd .. && mkdir pax + cd .. && rsync -rL `pwd`/* --exclude '.git/' --exclude 'build/' --exclude '*.zip' -L pax/ + cd ../pax/source && ant distctan + rm -rf ../pax/source/build + rm -rf ../pax/pax + cd .. && zip -r pax-`date +"%Y%m%d"`.zip pax/ + +clean: + cd .. && rm -rf pax diff --git a/macros/latex/contrib/pax/source/build.xml b/macros/latex/contrib/pax/source/build.xml new file mode 100644 index 0000000000..0a7eae3ddf --- /dev/null +++ b/macros/latex/contrib/pax/source/build.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="us-ascii"?> +<project name="pax" default="dist" basedir="."> + <description> + Build file for PDFAnnotExtractor + </description> + + <property name="src" location="src"/> + <property name="build" location="build"/> + <property name="dist" location="../scripts/"/> + <property name="pdfbox.home" location="${basedir}"/> <!-- or somewhere else --> + + <target name="init"> + <mkdir dir="${build}"/> + </target> + + <target name="compile" + depends="init" + description="compile the source" + > + <javac srcdir="${src}" destdir="${build}"> + <classpath> + <pathelement location="${basedir}/lib/pdfbox.jar"/> + <pathelement location="${basedir}/lib/commons-logging.jar"/> + </classpath> + </javac> + </target> + + <path id="build.classpath"> + <fileset dir="${basedir}"> + <include name="lib/*.jar"/> + </fileset> + </path> + + <pathconvert property="manifest.classpath" pathsep=" "> + <path refid="build.classpath"/> + <mapper> + <chainedmapper> + <flattenmapper/> + <globmapper from="*.jar" to="lib/*.jar"/> + </chainedmapper> + </mapper> + </pathconvert> + + <target name="distctan" + depends="compile" + description="generate the distribution ctan" + > + <mkdir dir="${dist}"/> + <jar jarfile="${dist}/${ant.project.name}.jar" + manifest="${src}/MANIFEST.MF" + basedir="${build}" + includes="pax/**" > + <zipgroupfileset dir="lib" includes="*.jar"/> + </jar> + </target> + + <target name="dist" + depends="compile" + description="generate the distribution" + > + <mkdir dir="${dist}"/> + <mkdir dir="${dist}/lib"/> + <copy todir="${dist}/lib" flatten="true"> + <fileset dir="lib"> + <include name="*.jar" /> + </fileset> + </copy> + <jar jarfile="${dist}/${ant.project.name}.jar" + manifest="${src}/MANIFEST.MF" + basedir="${build}" + includes="pax/**" > + <manifest> + <attribute name="Class-Path" value="${manifest.classpath}" /> + </manifest> + </jar> + </target> + + + <target name="clean" + description="clean up" + > + <delete dir="${build}"/> + <delete dir="${dist}/lib"/> + <delete file="${dist}/pax.jar" /> + </target> + +</project> diff --git a/macros/latex/contrib/pax/source/license/LaTeX/lppl.txt b/macros/latex/contrib/pax/source/license/LaTeX/lppl.txt new file mode 100644 index 0000000000..90e5e3ab79 --- /dev/null +++ b/macros/latex/contrib/pax/source/license/LaTeX/lppl.txt @@ -0,0 +1,416 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2006-05-20 + +Copyright 1999 2002-2006 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 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.3 + % 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 + % 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/macros/latex/contrib/pax/source/license/PDFAnnotExtractor/gpl.txt b/macros/latex/contrib/pax/source/license/PDFAnnotExtractor/gpl.txt new file mode 100644 index 0000000000..f90922eea3 --- /dev/null +++ b/macros/latex/contrib/pax/source/license/PDFAnnotExtractor/gpl.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/macros/latex/contrib/pax/source/src/Constants.java b/macros/latex/contrib/pax/source/src/Constants.java new file mode 100644 index 0000000000..7fd8a6d0b6 --- /dev/null +++ b/macros/latex/contrib/pax/source/src/Constants.java @@ -0,0 +1,132 @@ +/* Constants.java +Copyright (C) 2006-2008, 2011, 2012 Heiko Oberdiek + +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 2 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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA + +This file is part of PDFAnnotExtractor. See README. +*/ +package pax; + +public interface Constants { + + public String PAX_VERSION = "0.1l"; + + public String ENTRY_BEG = "\\["; + public String ENTRY_END = "\\\\\n"; + public String CMD_BEG = "{"; + public String CMD_END = "}"; + public String ARG_BEG = "{"; + public String ARG_END = "}"; + public String KVS_BEG = "{"; + public String KVS_END = "\n}"; + public String KVS_EMPTY = "{}"; + public String KV_BEG = "\n "; + public String KV_END = ","; + public String KEY_BEG = ""; + public String KEY_END = ""; + public String VALUE_BEG = "={"; + public String VALUE_END = "}"; + public String HEX_STR_BEG = "\\<"; + public String HEX_STR_END = "\\>"; + + public String CMD_ANNOT = "annot"; + public String CMD_BASEURL = "baseurl"; + public String CMD_DEST = "dest"; + public String CMD_FILE = "file"; + public String CMD_INFO = "info"; + public String CMD_PAGENUM = "pagenum"; + public String CMD_PAGE = "page"; + public String CMD_PAX = "pax"; + + // cmd file + public String KEY_SIZE = "Size"; + public String KEY_DATE = "Date"; + + // cmd info + public String KEY_AUTHOR = "Author"; + public String KEY_CREATOR = "Creator"; + public String KEY_KEYWORDS = "Keywords"; + public String KEY_PRODUCER = "Producer"; + public String KEY_SUBJECT = "Subject"; + public String KEY_TITLE = "Title"; + + // cmd page + public String KEY_ROTATE = "Rotate"; + public String KEY_MEDIA_BOX = "MediaBox"; + public String KEY_CROP_BOX = "CropBox"; + public String KEY_BLEED_BOX = "BleedBox"; + public String KEY_TRIM_BOX = "TrimBox"; + public String KEY_ART_BOX = "ArtBox"; + + // cmd annot attributes + public String KEY_C = "C"; + public String KEY_BORDER = "Border"; + public String KEY_BS = "BS"; + public String KEY_H = "H"; + + // cmd annot/link/URI + public String KEY_URI = "URI"; + public String KEY_IS_MAP = "IsMap"; + + + // cmd annot/link/GoToR + public String KEY_FILE = "File"; + public String KEY_DEST_NAME = "DestName"; + public String KEY_DEST_PAGE = "DestPage"; + public String KEY_DEST_VIEW = "DestView"; + + // cmd annot/link/GoTo + public String KEY_DEST_RECT = "Rect"; + public String KEY_DEST_X = "DestX"; + public String KEY_DEST_Y = "DestY"; + public String KEY_DEST_ZOOM = "DestZoom"; + public String KEY_DEST_LABEL = "DestLabel"; + + // cmd annot/link/Named + public String KEY_NAME = "Name"; + + // baseurl + public String PDF_URI = "URI"; + public String PDF_BASE = "Base"; + + // annotations + public String PDF_ANNOT = "Annot"; + public String PDF_RECT = "Rect"; + public String PDF_LINK = "Link"; + public String PDF_A = "A"; + public String PDF_C = "C"; + public String PDF_BORDER = "Border"; + public String PDF_BS = "BS"; + public String PDF_H = "H"; + public String PDF_GOTO = "GoTo"; + public String PDF_DEST = "Dest"; + + // destination views + public String PDF_XYZ = "XYZ"; + public String PDF_FIT = "Fit"; + public String PDF_FITH = "FitH"; + public String PDF_FITV = "FitV"; + public String PDF_FITR = "FitR"; + public String PDF_FITB = "FitB"; + public String PDF_FITBH = "FitBH"; + public String PDF_FITBV = "FitBV"; + + public String PDF_NULL = "null"; + + public String PDF_S = "S"; + public String PDF_NAMED = "Named"; + public String PDF_N = "N"; +} diff --git a/macros/latex/contrib/pax/source/src/Entry.java b/macros/latex/contrib/pax/source/src/Entry.java new file mode 100644 index 0000000000..7140750d27 --- /dev/null +++ b/macros/latex/contrib/pax/source/src/Entry.java @@ -0,0 +1,174 @@ +/* Entry.java +Copyright (C) 2006-2008, 2011, 2012 Heiko Oberdiek + +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 2 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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA + +This file is part of PDFAnnotExtractor. See README. +*/ +package pax; + +import java.io.*; +import java.util.*; + +public class Entry implements Constants { + + protected Writer out; + + protected String cmd; + protected List args; + protected Map kvs; + protected boolean withKV; + protected List delayedList; + + public Entry(Writer out) { + this.out = out; + cmd = null; + args = new Vector(); + kvs = null; + withKV = false; + delayedList = new Vector(); + } + + public void clear() { + cmd = null; + args.clear(); + kvs = null; + withKV = false; + } + + public void setCmd(String cmd) { + clear(); + this.cmd = cmd; + } + + public String getCmd() { + return cmd; + } + + public void withKV() { + this.withKV = true; + if (kvs == null) { + kvs = new HashMap(); + } + } + + public void addArg(String arg) { + args.add(arg); + } + + public void putKV(String key, String value) { + withKV(); + if (value == null) { + return; + } + kvs.put(key, value); + } + + public boolean isEmptyKV() { + return !withKV || kvs.isEmpty(); + } + + public void writeDelayed() throws EntryWriteException { + Writer saved = out; + try { + out = new StringWriter(); + write(); + delayedList.add(out.toString()); + } + catch (Exception e) { throw new EntryWriteException(e); } + finally { + out = saved; + } + } + + public void write() throws EntryWriteException { + try { + out.write(ENTRY_BEG); + + // write command + out.write(CMD_BEG); + out.write(cmd); + out.write(CMD_END); + + // write arguments + Iterator it = args.iterator(); + while (it.hasNext()) { + String arg = (String)it.next(); + out.write(ARG_BEG); + out.write(arg); + out.write(ARG_END); + } + + // write key value pairs + if (withKV) { + if (kvs.isEmpty()) { + out.write(KVS_EMPTY); + } + else { + out.write(KVS_BEG); + it = kvs.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry kv = (Map.Entry)it.next(); + String key = (String)kv.getKey(); + String value = (String)kv.getValue(); + out.write(KV_BEG); + out.write(KEY_BEG); + out.write(key); + out.write(KEY_END); + if (value != null) { + out.write(VALUE_BEG); + out.write(value); + out.write(VALUE_END); + } + out.write(KV_END); + } + out.write(KVS_END); + } + } + + out.write(ENTRY_END); + out.flush(); + } + catch (IOException e) { + throw new EntryWriteException(e); + } + finally { + clear(); + } + } + + public void flushDelayed() throws EntryWriteException { + try { + Iterator it = delayedList.iterator(); + while (it.hasNext()) { + out.write((String)it.next()); + } + out.flush(); + } + catch (IOException e) { + throw new EntryWriteException(e); + } + } + + public void close() throws EntryWriteException { + try { + out.close(); + } + catch (IOException e) { + throw new EntryWriteException(e); + } + } +} diff --git a/macros/latex/contrib/pax/source/src/EntryWriteException.java b/macros/latex/contrib/pax/source/src/EntryWriteException.java new file mode 100644 index 0000000000..a1010ce121 --- /dev/null +++ b/macros/latex/contrib/pax/source/src/EntryWriteException.java @@ -0,0 +1,27 @@ +/* EntryWriteException.java +Copyright (C) 2006-2008, 2011, 2012 Heiko Oberdiek + +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 2 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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA + +This file is part of PDFAnnotExtractor. See README. +*/ +package pax; + +public class EntryWriteException extends Exception { + public EntryWriteException(Throwable cause) { + super(cause); + } +} diff --git a/macros/latex/contrib/pax/source/src/MANIFEST.MF b/macros/latex/contrib/pax/source/src/MANIFEST.MF new file mode 100644 index 0000000000..2a141c6cfb --- /dev/null +++ b/macros/latex/contrib/pax/source/src/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: Heiko Oberdiek +Main-Class: pax.PDFAnnotExtractor diff --git a/macros/latex/contrib/pax/source/src/PDFAnnotExtractor.java b/macros/latex/contrib/pax/source/src/PDFAnnotExtractor.java new file mode 100644 index 0000000000..d135057467 --- /dev/null +++ b/macros/latex/contrib/pax/source/src/PDFAnnotExtractor.java @@ -0,0 +1,733 @@ +/* PDFAnnotExtractor.java +Copyright (C) 2006-2008, 2011, 2012 Heiko Oberdiek + +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 2 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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA + +This file is part of PDFAnnotExtractor. See README. +*/ +package pax; + +import java.io.*; +import java.text.*; +import java.util.*; + +import org.apache.pdfbox.cos.*; +import org.apache.pdfbox.pdfparser.*; +import org.apache.pdfbox.pdmodel.*; +import org.apache.pdfbox.pdmodel.common.*; +import org.apache.pdfbox.pdmodel.interactive.action.*; +import org.apache.pdfbox.pdmodel.interactive.action.type.*; +import org.apache.pdfbox.pdmodel.interactive.annotation.*; +import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.*; + +public class PDFAnnotExtractor implements Constants { + + protected File inputFile; + protected File outputFile; + protected PDDocument doc; + protected PDDocumentCatalog catalog; + protected Entry entry; + protected int destCount; + + protected static final String USAGE = + "Syntax: java PDFAnnotExtractor <pdffiles[.pdf]>"; + protected static final String EXT_PDF = ".pdf"; + protected static final String EXT_PAX = ".pax"; + + public static void main(String[] argv) { + if (argv.length < 1) { + System.err.println(USAGE); + System.exit(1); + } + for(int i = 0; i < argv.length; i++) { + processFile(argv[i]); + } + } + + public static void processFile(String fileName) { + File file = new File(fileName); + if (file.isFile()) { + fileName = stripFromEnd(fileName, EXT_PDF); + } + else { + File testFile = new File(fileName + EXT_PDF); + if (testFile.isFile()) { + file = testFile; + } + else { + System.err.println(USAGE); + error("PDF file not found: " + fileName, null); + } + } + System.out.println("* Processing file `" + file.toString() + "' ..."); + PDFAnnotExtractor p = + new PDFAnnotExtractor(file, new File(fileName + EXT_PAX)); + p.parse(); + p.close(); + } + + public PDFAnnotExtractor(File inputFile, File outputFile) { + this.inputFile = inputFile; + this.outputFile = outputFile; + destCount = 0; + try { + doc = PDDocument.load(inputFile); + catalog = doc.getDocumentCatalog(); + } + catch (IOException e) { + error("Loading failed: " + inputFile, e); + } + try { + entry = new Entry(new BufferedWriter(new FileWriter(outputFile))); + } + catch (IOException e) { + error("Cannot open output: " + outputFile, e); + } + } + + public void close() { + try { + doc.close(); + } + catch (IOException e) { + error("Closing failed: " + inputFile, e); + } + try { + entry.close(); + } + catch (EntryWriteException e) { + error("Closing failed: " + outputFile, e); + } + } + + public void parse() { + cmd_pax(); + cmd_file(); + cmd_pagenum(); + cmd_baseurl(); + parse_pages(); + } + + public void cmd_pax() { + try { + // PAX version info + entry.setCmd(CMD_PAX); + entry.addArg(PAX_VERSION); + entry.write(); + } + catch (Exception e) { handleCmdException(e); } + } + + public void cmd_file() { + try { + entry.setCmd(CMD_FILE); + entry.addArg(formatString(inputFile.toString())); + long size = inputFile.length(); + if (size > 0) { + entry.putKV(KEY_SIZE, "" + size); + } + long time = inputFile.lastModified(); + if (time != 0) { + Date d = new Date(time); + DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + String date = "D:" + df.format(d); + df = new SimpleDateFormat("Z"); + String zone = df.format(d); + if (zone.equals("+0000")) { + zone = "Z"; + } + else { + // ISO format: SIGN DIGIT DIGIT DIGIT DIGIT + zone = zone.substring(0, 3) + + "'" + + zone.substring(3, 5) + + "'"; + } + entry.putKV(KEY_DATE, date + zone); + } + entry.write(); + } + catch (Exception e) { handleCmdException(e); } + } + + public void cmd_pagenum() { + try { + // pagenum + int pagenum = doc.getNumberOfPages(); + entry.setCmd(CMD_PAGENUM); + entry.addArg("" + pagenum); + entry.write(); + } + catch (Exception e) { handleCmdException(e); } + } + + public void cmd_info() { + try { + // info + entry.setCmd(CMD_INFO); + PDDocumentInformation info = doc.getDocumentInformation(); + entry.putKV(KEY_AUTHOR, formatString(info.getAuthor())); + entry.putKV(KEY_CREATOR, formatString(info.getCreator())); + entry.putKV(KEY_KEYWORDS, formatString(info.getKeywords())); + entry.putKV(KEY_PRODUCER, formatString(info.getProducer())); + entry.putKV(KEY_SUBJECT, formatString(info.getSubject())); + entry.putKV(KEY_TITLE, formatString(info.getTitle())); + if (!entry.isEmptyKV()) { + entry.write(); + } + } + catch (Exception e) { handleCmdException(e); } + } + + public void cmd_baseurl() { + try { + // baseurl + entry.setCmd(CMD_BASEURL); + COSDictionary dict = catalog.getCOSDictionary(); + dict = (COSDictionary) + dict.getItem(COSName.getPDFName(PDF_URI)); + String baseurl = dict.getString(PDF_BASE); + if (baseurl.length() > 0) { + entry.addArg(formatString(baseurl)); + entry.write(); + } + } + catch (EntryWriteException e) { handleCmdException(e); } + catch (Exception e) {} + } + + public void parse_pages() { + ListIterator iter = catalog.getAllPages().listIterator(); + while (iter.hasNext()) { + // page + PDPage page = (PDPage)iter.next(); + int num = iter.nextIndex(); + parse_page(num, page); + } + try { + entry.flushDelayed(); + } + catch (EntryWriteException e) { + System.err.println("Write error: " + outputFile); + System.err.println(e.getCause().toString()); + } + } + + public void parse_page(int num, PDPage page) { + cmd_page(num, page); + parse_annots(num, page); + } + + public void cmd_page(int num, PDPage page) { + try { + entry.setCmd(CMD_PAGE); + entry.addArg("" + num); + entry.withKV(); + + // rotate entry + int rot = page.findRotation(); + if (rot != 0) { + entry.putKV(KEY_ROTATE, "" + rot); + } + + // box entries + PDRectangle mediaBox = page.findMediaBox(); + PDRectangle cropBox = page.findCropBox(); + PDRectangle bleedBox = page.getBleedBox(); + PDRectangle trimBox = page.getTrimBox(); + PDRectangle artBox = page.getArtBox(); + entry.addArg(formatBox(mediaBox)); + if (!equals(cropBox, mediaBox)) { + entry.putKV(KEY_CROP_BOX, formatBox(cropBox)); + } + if (!equals(bleedBox, cropBox)) { + entry.putKV(KEY_BLEED_BOX, formatBox(bleedBox)); + } + if (!equals(trimBox, cropBox)) { + entry.putKV(KEY_TRIM_BOX, formatBox(trimBox)); + } + if (!equals(artBox, cropBox)) { + entry.putKV(KEY_ART_BOX, formatBox(artBox)); + } + entry.write(); + } + catch (Exception e) { handleCmdException(e); } + } + + public void parse_annots(int num, PDPage page) { + // get annotations + COSArray annots = null; + try { + COSDictionary page_dict = page.getCOSDictionary(); + annots = (COSArray)page_dict.getDictionaryObject(COSName.ANNOTS); + } + catch (Exception e) {} + if (annots == null) { + return; + } + + for (int i = 0; i < annots.size(); i++) { + try { + COSDictionary annot = (COSDictionary)annots.getObject(i); + cmd_annot(num, annot); + } + catch (Exception e) {} + } + } + + public void cmd_annot(int num, COSDictionary annot) { + try { + entry.setCmd(CMD_ANNOT); + entry.addArg("" + num); + + // Type + String type = annot.getNameAsString(COSName.TYPE, PDF_ANNOT); + if (!type.equals(PDF_ANNOT)) { + throw new Exception("Wrong annotation type: " + type); + } + // Subtype + String subtype = annot.getNameAsString(COSName.SUBTYPE); + if (subtype == null) { + throw new Exception("Missing annotation subtype."); + } + if (!subtype.equals(PDF_LINK)) { + throw new Exception("Unsupported annotation subtype: " + + subtype); + } + entry.addArg(subtype); + entry.withKV(); + // Rect + COSArray array = (COSArray) + annot.getDictionaryObject(PDF_RECT); + PDRectangle rect = new PDRectangle(array); + entry.addArg(formatBox(rect)); + // A + COSDictionary a = (COSDictionary) + annot.getDictionaryObject(PDF_A); + if (a == null) { + COSBase cos = annot.getDictionaryObject(PDF_DEST); + if (cos == null) { + throw new Exception("Unsupported link annotation " + + "without action."); + } + entry.addArg(PDF_GOTO); + destCount++; + entry.putKV(KEY_DEST_LABEL, "" + destCount); + annot_attrs(annot); + entry.write(); + add_dest(PDDestination.create(cos)); + entry.writeDelayed(); + return; + } + PDAction action = PDActionFactory.createAction(a); + if (action == null) { + // try named action, unsupported by PDFBox + if (a.getNameAsString(PDF_S).equals(PDF_NAMED)) { + entry.addArg(PDF_NAMED); + String name = a.getNameAsString(PDF_N); + if (name != null) { + entry.putKV(KEY_NAME, name); + annot_attrs(annot); + entry.write(); + return; + } + } + throw new Exception("Unsupported link annotation."); + } + String actionSubtype = action.getSubType(); + entry.addArg(actionSubtype); + if (action instanceof PDActionURI) { + PDActionURI uri = (PDActionURI)action; + entry.putKV(KEY_URI, formatString(uri.getURI())); + if (uri.shouldTrackMousePosition()) { + entry.putKV(KEY_IS_MAP, null); + } + } + else if (action instanceof PDActionGoTo) { + destCount++; + entry.putKV(KEY_DEST_LABEL, "" + destCount); + annot_attrs(annot); + entry.write(); + add_dest(((PDActionGoTo)action).getDestination()); + entry.writeDelayed(); + return; + } + else if (action instanceof PDActionRemoteGoTo) { + PDActionRemoteGoTo gotor = (PDActionRemoteGoTo)action; + String file = gotor.getFile().getFile(); + if (file == null || file.length() == 0) { + throw new Exception("GoToR: missing file"); + } + entry.putKV(KEY_FILE, formatString(gotor.getFile().getFile())); + + /* + PDDestination d = PDDestination.create(gotor.getD()); + String view = "/"; + if (d instanceof PDNamedDestination) { + entry.putKV(KEY_DEST_NAME, + ((PDNamedDestination)d) + .getNamedDestination()); + } + else { + if (d instanceof PDPageFitDestination) { + PDPageFitDestination p = + (PDPageFitDestination)d; + view += (p.fitBoundingBox()) ? PDF_FITB : PDF_FIT; + } + else if (d instanceof PDPageFitHeightDestination) { + PDPageFitHeightDestination p = + (PDPageFitHeightDestination)d; + view += (p.fitBoundingBox()) ? PDF_FITBV : PDF_FITV; + view += " "; + view += (p.getLeft() == -1) ? PDF_NULL : "" + p.getLeft(); + } + else if (d instanceof PDPageFitWidthDestination) { + PDPageFitWidthDestination p = + (PDPageFitWidthDestination)d; + view += (p.fitBoundingBox()) ? PDF_FITBH : PDF_FITH; + view += " "; + view += (p.getTop() == -1) ? PDF_NULL : "" + p.getTop(); + } + else if (d instanceof PDPageXYZDestination) { + PDPageXYZDestination p = + (PDPageXYZDestination)d; + view += PDF_XYZ; + view += " "; + view += (p.getLeft() == -1) ? PDF_NULL : "" + p.getLeft(); + view += " "; + view += (p.getTop() == -1) ? PDF_NULL : "" + p.getTop(); + view += " "; + view += (p.getZoom() == -1) ? PDF_NULL : "" + p.getZoom(); + } + else if (d instanceof PDPageFitRectangleDestination) { + PDPageFitRectangleDestination p = + (PDPageFitRectangleDestination)d; + view += PDF_FITR; + view += " " + p.getLeft() + " " + p.getBottom(); + view += " " + p.getRight() + " " + p.getTop(); + } + else { + throw new Exception("Unknown destination type"); + } + entry.putKV(KEY_DEST_VIEW, view); + } + */ + + COSBase d = gotor.getD(); + if (d instanceof COSString) { + entry.putKV(KEY_DEST_NAME, + formatString(((COSString)d).getString())); + } + else if (d instanceof COSName) { + entry.putKV(KEY_DEST_NAME, + formatString(((COSName)d).getName())); + } + else if (d instanceof COSArray) { + COSArray dest = (COSArray)d; + int page_num = dest.getInt(0); + entry.putKV(KEY_DEST_PAGE, "" + page_num); + String view = dest.getName(1); + int size = dest.size(); + if (view.equals(PDF_FIT) || view.equals(PDF_FITB)) { + } + else if (view.equals(PDF_FITH) || view.equals(PDF_FITBH) + || view.equals(PDF_FITV) || view.equals(PDF_FITBV)) { + if (size >= 3) { + try { + String args = formatNumber( + ((COSNumber)dest.getObject(2)).floatValue()); + view += " " + args; + } + catch (Exception e) { + size = 0; + } + } + if (size < 3) { + if (view.equals(PDF_FITH) || view.equals(PDF_FITV)) { + view = PDF_FIT; + } + else { + view = PDF_FITB; + } + } + } + else if (view.equals(PDF_XYZ)) { + COSBase obj; + view += " "; + if (size >= 3) { + obj = dest.getObject(2); + if (obj instanceof COSNumber) { + view += formatNumber(((COSNumber)obj).floatValue()); + } + else { + view += PDF_NULL; + } + } + else { + view += PDF_NULL; + } + view += " "; + if (size >= 4) { + obj = dest.getObject(3); + if (obj instanceof COSNumber) { + view += formatNumber(((COSNumber)obj).floatValue()); + } + else { + view += PDF_NULL; + } + } + else { + view += PDF_NULL; + } + view += " "; + if (size >= 5) { + obj = dest.getObject(4); + if (obj instanceof COSNumber) { + view += formatNumber(((COSNumber)obj).floatValue()); + } + else { + view += PDF_NULL; + } + } + else { + view += PDF_NULL; + } + } + else if (view.equals(PDF_FITR)) { + view += " " + + formatNumber(((COSNumber)dest.getObject(2)).floatValue()) + + " " + + formatNumber(((COSNumber)dest.getObject(3)).floatValue()) + + " " + + formatNumber(((COSNumber)dest.getObject(4)).floatValue()) + + " " + + formatNumber(((COSNumber)dest.getObject(5)).floatValue()); + } + else { + throw new Exception("Unknown destination view type"); + } + entry.putKV(KEY_DEST_VIEW, "/" + view); + } + else { + throw new Exception("GoToR: unknown dest type"); + } + } + else { + throw new Exception("Unsupported link annotation type: " + + actionSubtype); + } + annot_attrs(annot); + entry.write(); + } + catch (EntryWriteException e) { handleCmdException(e); } + catch (Exception e) { + System.err.println("!!! Warning: Annotation on page " + num + + " not recognized!"); + System.err.println(" " + e.toString()); + String msg = e.getMessage(); + Throwable cause = e.getCause(); + if (cause != null) { + System.err.println(" " + cause.toString()); + } + if (e instanceof ClassCastException) { + e.printStackTrace(); + } + } + } + + private void add_dest(PDDestination dest) throws Exception { + entry.setCmd(CMD_DEST); + entry.withKV(); + if (dest instanceof PDNamedDestination) { + String name = ((PDNamedDestination)dest).getNamedDestination(); + Object obj = catalog.getNames().getDests().getValue(name); + if (obj instanceof PDDestination) { + dest = (PDDestination)obj; + } + } + if (dest instanceof PDPageDestination) { + PDPageDestination pd = (PDPageDestination)dest; + PDPage page = pd.getPage(); + int pagenum = catalog.getAllPages().indexOf(page); + if (pagenum < 0) { + throw new Exception("Link to unknown page"); + } + entry.addArg("" + (pagenum + 1)); + entry.addArg("" + destCount); + if (pd instanceof PDPageFitDestination) { + PDPageFitDestination d = (PDPageFitDestination)pd; + entry.addArg(d.fitBoundingBox() ? PDF_FITB : PDF_FIT); + return; + } + if (pd instanceof PDPageFitHeightDestination) { + PDPageFitHeightDestination d = (PDPageFitHeightDestination)pd; + entry.addArg(d.fitBoundingBox() ? PDF_FITBV : PDF_FITV); + COSArray a = d.getCOSArray(); + if (a.size() > 2) { + COSNumber n = (COSNumber)a.getObject(2); + if (n != null) { + entry.putKV(KEY_DEST_X, formatNumber(n)); + } + } + return; + } + if (pd instanceof PDPageFitWidthDestination) { + PDPageFitWidthDestination d = (PDPageFitWidthDestination)pd; + entry.addArg(d.fitBoundingBox() ? PDF_FITBH : PDF_FITH); + COSArray a = d.getCOSArray(); + if (a.size() > 2) { + COSNumber n = (COSNumber)a.getObject(2); + if (n != null) { + entry.putKV(KEY_DEST_Y, formatNumber(n)); + } + } + return; + } + if (pd instanceof PDPageFitRectangleDestination) { + PDPageFitRectangleDestination d = (PDPageFitRectangleDestination)pd; + entry.addArg(PDF_FITR); + COSArray a = d.getCOSArray(); + int size = a.size(); + if (size != 6) { + throw new Exception("Rectangle destination without" + + " correct number of parameters"); + } + entry.putKV(KEY_DEST_RECT, + formatNumber((COSNumber)a.getObject(2)) + " " + + formatNumber((COSNumber)a.getObject(3)) + " " + + formatNumber((COSNumber)a.getObject(4)) + " " + + formatNumber((COSNumber)a.getObject(5))); + return; + } + if (pd instanceof PDPageXYZDestination) { + PDPageXYZDestination d = (PDPageXYZDestination)pd; + entry.addArg(PDF_XYZ); + COSArray a = d.getCOSArray(); + int size = a.size(); + COSNumber n; + if (size > 2) { + n = (COSNumber)a.getObject(2); + if (n != null) { + entry.putKV(KEY_DEST_X, formatNumber(n)); + } + } + if (size > 3) { + n = (COSNumber)a.getObject(3); + if (n != null) { + entry.putKV(KEY_DEST_Y, formatNumber(n)); + } + } + if (size > 4) { + n = (COSNumber)a.getObject(4); + if (n != null) { + entry.putKV(KEY_DEST_ZOOM, formatNumber(n)); + } + } + return; + } + } + throw new Exception("Unknown destination type"); + } + + protected void annot_attrs(COSDictionary annot) { + put_attr(annot, PDF_C, KEY_C); + put_attr(annot, PDF_BORDER, KEY_BORDER); + put_attr(annot, PDF_BS, KEY_BS); + put_attr(annot, PDF_H, KEY_H); + } + + protected void put_attr(COSDictionary annot, + String pdfKey, String entryKey) { + try { + COSBase value = annot.getDictionaryObject(pdfKey); + if (value == null) { + return; + } + String str = value.accept(new StringVisitor()).toString(); + if (str == null || str.length() == 0) { + return; + } + entry.putKV(entryKey, str); + } + catch (Exception e) {} + } + + protected boolean equals(PDRectangle a, PDRectangle b) { + return a.getLowerLeftX() == b.getLowerLeftX() + && a.getLowerLeftY() == b.getLowerLeftY() + && a.getUpperRightX() == b.getUpperRightX() + && a.getUpperRightY() == b.getUpperRightY(); + } + + protected String formatBox(PDRectangle r) { + return formatNumber(r.getLowerLeftX()) + ' ' + + formatNumber(r.getLowerLeftY()) + ' ' + + formatNumber(r.getUpperRightX()) + ' ' + + formatNumber(r.getUpperRightY()); + } + + protected String formatString(String s) { + if (s == null || s.length() == 0) { + return s; + } + return HEX_STR_BEG + + (new COSString(s)).getHexString() + + HEX_STR_END; + } + + protected String formatNumber(float f) { + String s = "" + f; + return stripFromEnd(s, ".0"); + } + protected String formatNumber(COSNumber obj) { + return formatNumber(obj.floatValue()); + } + + protected static String stripFromEnd(String str, String ext) { + if (str.endsWith(ext)) { + return str.substring(0, str.length() - ext.length()); + } + return str; + } + + protected static void error(String msg, Exception e, boolean stackTrace) { + System.err.println("!!! Error: " + msg); + if (e != null) { + if (stackTrace) { + e.printStackTrace(); + } + else { + System.err.println(e.toString()); + } + } + System.exit(1); + } + protected static void error(String msg, Exception e) { + error(msg, e, false); + } + + protected void handleCmdException(Exception e) { + System.err.println("!!! Error during write of entry `" + + entry.getCmd() + "'!\n"); + if (e instanceof EntryWriteException) { + System.err.println("Write error: " + outputFile); + System.err.println(((EntryWriteException)e).getCause().toString()); + } + else { + e.printStackTrace(); + } + } +} diff --git a/macros/latex/contrib/pax/source/src/StringVisitor.java b/macros/latex/contrib/pax/source/src/StringVisitor.java new file mode 100644 index 0000000000..1460ade25c --- /dev/null +++ b/macros/latex/contrib/pax/source/src/StringVisitor.java @@ -0,0 +1,131 @@ +/* StringVisitor.java +Copyright (C) 2006-2008, 2011, 2012 Heiko Oberdiek + +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 2 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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA + +This file is part of PDFAnnotExtractor. See README. +*/ +package pax; + +import java.io.*; +import java.util.*; +import org.apache.pdfbox.cos.*; +import org.apache.pdfbox.exceptions.*; + +public class StringVisitor implements ICOSVisitor { + + protected StringBuffer buf; + boolean nodelim; + + public StringVisitor() { + buf = new StringBuffer(); + nodelim = false; + } + + public Object visitFromNull(COSNull obj) { + if (nodelim) { + buf.append(' '); + } + buf.append("null"); + nodelim = true; + return buf; + } + + public Object visitFromBoolean(COSBoolean obj) { + if (nodelim) { + buf.append(' '); + } + buf.append(obj.getValue()); + nodelim = true; + return buf; + } + + public Object visitFromInt(COSInteger obj) { + if (nodelim) { + buf.append(' '); + } + buf.append(obj.intValue()); + nodelim = true; + return buf; + } + + public Object visitFromFloat(COSFloat obj) { + if (nodelim) { + buf.append(' '); + } + String s = "" + obj.floatValue(); + if (s.endsWith(".0")) { + buf.append(s.substring(0, s.length() - ".0".length())); + } + else { + buf.append(s); + } + nodelim = true; + return buf; + } + + public Object visitFromName(COSName obj) { + ByteArrayOutputStream a = new ByteArrayOutputStream(); + try { + obj.writePDF(a); + } + catch (IOException e) {} + buf.append(a.toString()); + nodelim = true; + return buf; + } + + public Object visitFromString(COSString obj) { + buf.append("\\<"); + buf.append(obj.getHexString()); + buf.append("\\>"); + nodelim = false; + return buf; + } + + public Object visitFromArray(COSArray obj) throws COSVisitorException { + buf.append('['); + nodelim = false; + for (int i = 0; i < obj.size(); i++) { + obj.getObject(i).accept(this); + } + buf.append(']'); + nodelim = false; + return buf; + } + + public Object visitFromDictionary(COSDictionary obj) throws COSVisitorException { + buf.append("<<"); + nodelim = false; + Iterator iter = obj.keyList().iterator(); + while (iter.hasNext()) { + COSName key = (COSName)iter.next(); + COSBase value = obj.getDictionaryObject(key); + key.accept(this); + value.accept(this); + } + buf.append(">>"); + nodelim = false; + return buf; + } + + public Object visitFromStream(COSStream obj) throws COSVisitorException { + throw new COSVisitorException(new Exception("Unsupported stream object")); + } + public Object visitFromDocument(COSDocument obj) throws COSVisitorException { + throw new COSVisitorException(new Exception("Unsupported documetn object")); + } +} diff --git a/macros/latex/contrib/pax/tex/pax.sty b/macros/latex/contrib/pax/tex/pax.sty new file mode 100644 index 0000000000..1ea11b7fdd --- /dev/null +++ b/macros/latex/contrib/pax/tex/pax.sty @@ -0,0 +1,594 @@ +%% pax.sty +%% Copyright 2006-2008, 2011, 2012 Heiko Oberdiek +%% Copyright 2020 Bastien Roucariès +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% 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 +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Bastien Roucariès +% +% This work consists of the file pax.sty. +% See README for more details and documentation. +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pax}% + [2020/04/06 v0.2 Annotation support for PDF graphics (HO)]% + +\RequirePackage{ifpdf} +\ifpdf +\else + \PackageError{pax}{Missing pdfTeX in PDF mode}{% + Other drivers are not supported.% + }% + \expandafter\endinput +\fi + +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname pdfstrcmp\endcsname\relax + \PackageError{pax}{pdfTeX is too old}{% + The package uses features of pdfTeX 1.30.% + }% + \expandafter\endinput +\fi + +\RequirePackage{graphicx} +\RequirePackage{ltxcmds}[2011/04/18] +\RequirePackage{kvsetkeys}[2011/04/07] +\RequirePackage{kvoptions}[2010/12/23] +\RequirePackage{auxhook}[2011/03/04] +\RequirePackage{etexcmds}[2011/02/16] + +% Hook into \includegraphics of graphicx with one optional +% star, one optional argument with key value pairs and +% the graphics name +\let\PAX@ORG@includegraphics\includegraphics +\def\includegraphics{% + \@ifstar{% + \@ifnextchar[{% + \begingroup + \def\x{\endgroup + \PAX@includegraphics[clip,% + }% + \expandafter\x\@gobble + }{% + \PAX@includegraphics[clip]% + }% + }{% + \@ifnextchar[{% + \PAX@includegraphics + }{% + \PAX@includegraphics[]% + }% + }% +} +\def\PAX@includegraphics[#1]#2{% + \begingroup + \sbox0{\PAX@ORG@includegraphics[{#1}]{#2}}% + \edef\PAX@inc@width{\the\wd0}% + \edef\PAX@inc@height{\the\dimexpr\dp0+\ht0}% + \leavevmode + \hbox to \wd0{% + \rlap{\copy0}% + \raise-\dp0\hbox{% + \PAX@AddAnnots{#1}{#2}% + }% + \hfill + }% + \endgroup +} + +\SetupKeyvalOptions{family=PAX@Gin,prefix=PAX@Gin@} +\DeclareStringOption[1]{page} +\DeclareStringOption[0]{angle} +\DeclareBoolOption{clip} +\define@key{PAX@Gin}{viewport}{% + \ltx@LocalAppendToMacro\PAX@Gin@box@opts{% + \PAX@viewport#1\\% + }% +} +\define@key{PAX@Gin}{trim}{% + \ltx@LocalAppendToMacro\PAX@Gin@box@opts{% + \PAX@trim#1\\% + }% +} +\let\PAX@Gin@box@opts\@empty + +\def\PAX@viewport#1 #2 #3 #4\\{% + \PAX@defaultbp\PAX@vllx{#1}% + \PAX@defaultbp\PAX@vlly{#2}% + \PAX@defaultbp\PAX@vurx{#3}% + \PAX@defaultbp\PAX@vury{#4}% + \edef\PAX@page@llx{\dimexpr\PAX@page@llx+\PAX@vllx\relax}% + \edef\PAX@page@lly{\dimexpr\PAX@page@lly+\PAX@vlly\relax}% + \edef\PAX@page@urx{\dimexpr\PAX@page@llx+\PAX@vurx\relax}% + \edef\PAX@page@ury{\dimexpr\PAX@page@lly+\PAX@vury\relax}% +} +\def\PAX@trim#1 #2 #3 #4\\{% + \PAX@defaultbp\PAX@tllx{#1}% + \PAX@defaultbp\PAX@tlly{#2}% + \PAX@defaultbp\PAX@turx{#3}% + \PAX@defaultbp\PAX@tury{#4}% + \edef\PAX@page@llx{\dimexpr\PAX@page@llx+\PAX@tllx\relax}% + \edef\PAX@page@lly{\dimexpr\PAX@page@lly+\PAX@tlly\relax}% + \edef\PAX@page@urx{\dimexpr\PAX@page@urx-\PAX@turx\relax}% + \edef\PAX@page@ury{\dimexpr\PAX@page@ury-\PAX@tury\relax}% +} + +\def\PAX@defaultbp#1#2{% + \afterassignment\PAX@def@bp\dimen@#2bp\relax{#1}{#2}% +} +\def\PAX@def@bp#1\relax#2#3{% + \if!#1!% + \edef#2{#3bp}% + \else + \edef#2{#3}% + \fi +} + +% ignore unknown options in family `PAX@Gin' +\kv@set@family@handler{PAX@Gin}{} + +\def\PAX@AddAnnots#1#2{% + \kvsetkeys{PAX@Gin}{#1}% + \Grot@setangle{\PAX@Gin@angle}% + % a little careful, is type of angle int or real? + \loop + \ifdim\PAX@Gin@angle\p@<360\p@ + \else + \edef\PAX@Gin@angle{\the\numexpr-360+\number\PAX@Gin@angle}% + \repeat + \loop + \ifdim\PAX@Gin@angle\p@<\z@ + \edef\PAX@Gin@angle{\strip@pt\dimexpr\PAX@Gin@angle\p@+360\p@}% + \repeat + \ifcase0\ifnum\PAX@Gin@angle=0 1\fi + \ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 1\fi + \ifnum\PAX@Gin@angle=270 1\fi + \PackageWarning{pax}{Unsupported value for option angle}% + \fi + \filename@parse{#2}% + \def\PAX@file{\filename@area\filename@base.pax}% + \let\[\PAX@parser + \def\<{<}% + \def\>{>}% + \endlinechar=-1 % + \InputIfFileExists\PAX@file{% + }{% + \typeout{* Missing: \PAX@file}% + }% +} +\def\PAX@parser#1{\PAX@call{cmd}{#1}{}}% +\def\PAX@call#1#2#3{% + \@ifundefined{PAX@#1@#2}\PAX@skip{#3\csname PAX@#1@#2\endcsname}% +} +\def\PAX@skip#1\\{} +\def\PAX@stop#1\\{} + +\def\PAX@cmd@page#1#2{% + \PAX@filter@page{#1}{% + \PAX@getrect{page}#2\@nil + \PAX@Gin@box@opts + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi + \else + \let\PAX@temp\PAX@inc@width + \let\PAX@inc@width\PAX@inc@height + \let\PAX@inc@height\PAX@temp + \fi + \Gscale@div\PAX@scale@x\PAX@inc@width{% + \dimexpr\PAX@page@urx-\PAX@page@llx\relax + }% + \Gscale@div\PAX@scale@y\PAX@inc@height{% + \dimexpr\PAX@page@ury-\PAX@page@lly\relax + }% + \PAX@skip + }% +} +\def\PAX@filter@page#1{% + \ifnum\PAX@Gin@page=#1 % + \expandafter\@firstofone + \else + \ifnum\PAX@Gin@page<#1 % + \csname fi\endcsname + \csname fi\endcsname + \expandafter\PAX@stop\@gobblefour + \fi + \expandafter\PAX@skip + \fi +} +\def\PAX@getrect#1#2 #3 #4 #5\@nil{% + \@namedef{PAX@#1@llx}{#2bp}% + \@namedef{PAX@#1@lly}{#3bp}% + \@namedef{PAX@#1@urx}{#4bp}% + \@namedef{PAX@#1@ury}{#5bp}% +} + +\def\PAX@cmd@annot#1#2{% + \PAX@filter@page{#1}{% + \PAX@call{annot}{#2}{}% + }% +} +\def\PAX@annot@Link#1#2#3{% + \def\PAX@link@type{#2}% + \PAX@call{link}{#2}{% + \begingroup + \PAX@getrect{annot}#1\@nil + \kvsetkeys{PAX}{#3}% + }% + \PAX@skip +} +\newif\ifPAX@ok +\PAX@oktrue + +\newif\ifPAX@GoTo + +\def\PAX@pdf@annot#1{% + \ifPAX@Gin@clip + \ifdim\PAX@annot@llx<\PAX@page@llx + \let\PAX@annot@llx\PAX@pagellx + \fi + \ifdim\PAX@annot@lly<\PAX@page@lly + \let\PAX@annot@lly\PAX@page@lly + \fi + \ifdim\PAX@annot@urx>\PAX@page@urx + \let\PAX@annot@urx\PAX@page@urx + \fi + \ifdim\PAX@annot@ury>\PAX@page@ury + \let\PAX@annot@ury\PAX@page@ury + \fi + \PAX@okfalse + \ifdim\PAX@annot@llx<\PAX@annot@urx + \ifdim\PAX@annot@lly<\PAX@annot@ury + \PAX@oktrue + \fi + \fi + \else + \PAX@oktrue + \fi + \ifPAX@ok + \ifcase 0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 2\fi + \ifnum\PAX@Gin@angle=270 3\fi\space + % angle = 0 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@annot@lly-\PAX@page@lly\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@annot@llx-\PAX@page@llx\relax + }% + \or % angle = 90 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@annot@llx-\PAX@page@llx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@annot@ury\relax + }% + \or % angle = 180 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@annot@ury\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@annot@urx\relax + }% + \or % angle = 270 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@annot@urx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@annot@lly-\PAX@page@lly\relax + }% + \fi + \@namedef{% + PAX@% + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi\space + width% + \else + height% + \fi + }{% + \PAX@scale@x\dimexpr\PAX@annot@urx-\PAX@annot@llx\relax + }% + \@namedef{% + PAX@% + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi\space + height% + \else + width% + \fi + }{% + \PAX@scale@y\dimexpr\PAX@annot@ury-\PAX@annot@lly\relax + }% + \raise\PAX@raise\hb@xt@\z@{% + \kern\PAX@right + \ifPAX@GoTo + \pdfstartlink\@width\PAX@width\@height\PAX@height\@depth\z@ + attr{\PAX@set@attrs}% + goto name{PAX@\PAX@file @\PAX@key@DestLabel}\relax + \pdfendlink + \else + \pdfannot\@width\PAX@width\@height\PAX@height{% + /Subtype/Link% + \PAX@set@attrs + /A<<% + /Type/Action% + /S/\PAX@link@type + #1% + >>% + }% + \fi + \hss + }% + \fi + \endgroup +} + +\def\PAX@set@attrs{% + \PAX@attrs\PAX@link@type{% + \PAX@set@attr{C}\PAX@key@C + \PAX@set@attr{Border}\PAX@key@Border + \PAX@set@attr{BS}\PAX@key@BS + \PAX@set@attr{H}\PAX@key@H + }% +} + +\def\PAX@set@attr#1#2{% + \ifx#2\@empty + \else + /#1 #2% + \fi +} + +\def\PAX@attrs#1{% + \@ifundefined{PAX@attrs@#1}{% + \@ifundefined{hyperref}{% + \@firstofone + }{% + \Hy@setpdfborder + /H\@pdfhighlight + \@ifundefined{PAX@htype@#1}\@firstofone{% + \@ifundefined{@\@nameuse{PAX@htype@#1}bordercolor}\@firstofone{% + /C[\@nameuse{@\@nameuse{PAX@htype@#1}bordercolor}]% + \@gobble + }% + }{% + \PAX@set@attr{C}\PAX@key@C + }% + \@gobble + }% + }{% + \@nameuse{PAX@attrs@#1}% + }% +} +\def\PAX@htype@GoToR{file} +\def\PAX@htype@GoTo{link} +\def\PAX@htype@Named{link} +\def\PAX@htype@URI{url} + +\def\PAX@link@URI{% + \PAX@pdf@annot{% + /URI\PAX@key@URI + }% +} +\def\PAX@link@Named{% + \PAX@pdf@annot{% + /N/\pdfescapename{\PAX@key@Name}% + }% +} +\def\PAX@link@GoToR{% + \PAX@pdf@annot{% + /F\PAX@key@File + /D% + \ifx\PAX@key@DestName\@empty + [\PAX@key@DestPage\space\PAX@key@DestView]% + \else + \PAX@key@DestName + \fi + }% +} + +% GoTo + +\AddLineBeginAux{% + \string\providecommand{\string\PAX@DestReq}[2]{}% +} +\AddLineBeginAux{% + \string\providecommand{\string\PAX@DestProv}[2]{}% +} +\AtBeginDocument{% + \let\PAX@DestReq\@gobbletwo + \let\PAX@DestProv\@gobbletwo +} +\def\PAX@DestReq#1#2{% + \expandafter\gdef\csname PAX@REQ@#1@#2\endcsname{}% +} +\def\PAX@DestProv#1#2{% + \expandafter\gdef\csname PAX@PROV@#1@#2\endcsname{}% +} + +\def\PAX@link@GoTo{% + \ifnum0<0\PAX@key@DestLabel\relax + \expandafter\@firstofone + \else + \endgroup + \expandafter\@gobble + \fi + {% + \if@filesw + \protected@write\@auxout{}{% + \string\PAX@DestReq{\PAX@file}{\PAX@key@DestLabel}% + }% + \fi + % Generate link, if destination exists + \@ifundefined{PAX@PROV@\PAX@file @\PAX@key@DestLabel}{% + \endgroup + }{% + \PAX@GoTotrue + \PAX@pdf@annot{}% + }% + }% +} + +% Read destinations +\def\PAX@cmd@dest#1#2#3#4{% + \PAX@filter@page{#1}{% + \if@filesw + \protected@write\@auxout{}{% + \string\PAX@DestProv{\PAX@file}{#2}% + }% + \fi + \@ifundefined{PAX@REQ@\PAX@file @#2}{% + }{% + \begingroup + \let\PAX@key@DestY\PAX@page@ury + \let\PAX@key@DestX\PAX@page@llx + \kvsetkeys{PAX}{#4}% + \let\PAX@dest@llx\PAX@key@DestX + \let\PAX@dest@urx\PAX@key@DestX + \let\PAX@dest@lly\PAX@key@DestY + \let\PAX@dest@ury\PAX@key@DestY + \ifx\PAX@key@DestRect\@empty + \else + \def\PAX@temp{dest}% + \expandafter\PAX@getrect\expandafter\PAX@temp + \PAX@key@DestRect\@nil + \fi + \ifPAX@Gin@clip + \ifx\PAX@dest@llx<\PAX@page@llx + \let\PAX@dest@llx\PAX@page@llx + \fi + \ifx\PAX@dest@lly<\PAX@page@lly + \let\PAX@dest@lly\PAX@page@lly + \fi + \ifx\PAX@dest@urx>\PAX@page@urx + \let\PAX@dest@urx\PAX@page@urx + \fi + \ifx\PAX@dest@ury>\PAX@page@ury + \let\PAX@dest@ury\PAX@page@ury + \fi + % at least prevent destinations outside the window + \ifx\PAX@dest@llx>\PAX@page@urx + \PAX@dest@llx\PAX@page@urx + \fi + \ifx\PAX@dest@lly>\PAX@page@ury + \PAX@dest@lly\PAX@page@ury + \fi + \ifx\PAX@dest@urx<\PAX@page@llx + \PAX@dest@urx\PAX@page@llx + \fi + \ifx\PAX@dest@ury<\PAX@page@lly + \PAX@dest@ury\PAX@page@lly + \fi + \fi + % I don't know, what is the best idea for rotated stuff, + % perhaps using the corner llx/ury + \ifcase 0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 2\fi + \ifnum\PAX@Gin@angle=270 3\fi\space + % angle = 0 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@dest@lly-\PAX@page@lly\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@dest@llx-\PAX@page@llx\relax + }% + \or % angle = 90 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@dest@llx-\PAX@page@llx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@dest@ury\relax + }% + \or % angle = 180 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@dest@ury\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@dest@urx\relax + }% + \or % angle = 270 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@dest@urx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@dest@lly-\PAX@page@lly\relax + }% + \fi + \edef\PAX@name{name{PAX@\PAX@file @#2}}% + \let\PAX@type\@empty + \ifcase\pdfstrcmp{#3}{FITR}\relax + \def\PAX@type{xyz}% too lazy for now + \fi + \ifcase\pdfstrcmp{#3}{XYZ}\relax + \def\PAX@type{xyz}% + \ifx\PAX@key@DestZoom\@empty + \else + \edef\PAX@type{% + \PAX@type + zoom\numexpr1000*\number\dimexpr\PAX@key@DestZoom pt\relax + /\number\p@\relax + }% + \fi + \fi + \ifcase\pdfstrcmp{#3}{FIT}\relax + \def\PAX@type{fit}% + \fi + \ifcase\pdfstrcmp{#3}{FITB}\relax + \def\PAX@type{fitb}% + \fi + \ifcase\pdfstrcmp{#3}{FITH}\relax + \def\PAX@type{fith}% + \fi + \ifcase\pdfstrcmp{#3}{FITBH}\relax + \def\PAX@type{fitbh}% + \fi + \ifcase\pdfstrcmp{#3}{FITV}\relax + \def\PAX@type{fitv}% + \fi + \ifcase\pdfstrcmp{#3}{FITBV}\relax + \def\PAX@type{fitbv}% + \fi + \ifx\PAX@type\@empty + \def\PAX@type{xyz}% + \fi + \raise\PAX@raise\hb@xt@\z@{% + \kern\PAX@right + \pdfdest\PAX@name\PAX@type\relax + \hss + }% + \endgroup + }% + \PAX@skip + }% +} + +\SetupKeyvalOptions{family=PAX,prefix=PAX@key@} +\DeclareStringOption{URI} +\DeclareStringOption{Name} +\DeclareStringOption{DestName} +\DeclareStringOption{DestPage} +\DeclareStringOption{DestView} +\DeclareStringOption{File} +\DeclareStringOption{C} +\DeclareStringOption{Border} +\DeclareStringOption{BS} +\DeclareStringOption{H} +\DeclareStringOption{DestLabel} +\DeclareStringOption{DestRect} +\DeclareStringOption{DestZoom} +\define@key{PAX}{DestX}{% + \PAX@defaultbp\PAX@key@DestX{#1}% +} +\define@key{PAX}{DestY}{% + \PAX@defaultbp\PAX@key@DestY{#1}% +} +\endinput diff --git a/macros/latex/contrib/siunitx/CHANGELOG.md b/macros/latex/contrib/siunitx/CHANGELOG.md index 810f2805ae..7248d9ac77 100644 --- a/macros/latex/contrib/siunitx/CHANGELOG.md +++ b/macros/latex/contrib/siunitx/CHANGELOG.md @@ -7,6 +7,12 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to ## [Unreleased] +## [v3.1.3] - 2022-06-07 + +### Fixed +- Behavior of `print-integer-zero` in tables (see issue + [\#604](https://github.com/josephwright/siunitx/issues/604)) + ## [v3.1.2] - 2022-05-31 ### Fixed @@ -1780,7 +1786,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to ### Added - First public testing release (as `si`) -[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.1.2...HEAD +[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.1.3...HEAD +[v3.1.3]: https://github.com/josephwright/siunitx/compare/v3.1.2...v3.1.3 [v3.1.2]: https://github.com/josephwright/siunitx/compare/v3.1.1...v3.1.2 [v3.1.1]: https://github.com/josephwright/siunitx/compare/v3.1.0...v3.1.1 [v3.1.0]: https://github.com/josephwright/siunitx/compare/v3.0.50...v3.1.0 diff --git a/macros/latex/contrib/siunitx/siunitx-code.pdf b/macros/latex/contrib/siunitx/siunitx-code.pdf Binary files differindex 94538d4f93..08b863b8b4 100644 --- a/macros/latex/contrib/siunitx/siunitx-code.pdf +++ b/macros/latex/contrib/siunitx/siunitx-code.pdf diff --git a/macros/latex/contrib/siunitx/siunitx-table.dtx b/macros/latex/contrib/siunitx/siunitx-table.dtx index 20683fb63e..35dd2161b1 100644 --- a/macros/latex/contrib/siunitx/siunitx-table.dtx +++ b/macros/latex/contrib/siunitx/siunitx-table.dtx @@ -883,7 +883,11 @@ \tl_set:Nx \l_@@_model_tl { \exp_not:n { {#1} {#2} } - { \prg_replicate:nn {#3} { 8 } } + { + \int_compare:nNnTF {#3} = 0 + { 0 } + { \prg_replicate:nn {#3} { 8 } } + } { \prg_replicate:nn { 0 #4 } { 8 } } { \tl_if_blank:nF {#5} diff --git a/macros/latex/contrib/siunitx/siunitx.dtx b/macros/latex/contrib/siunitx/siunitx.dtx index 9e03d6c4bf..d24b1ce6fa 100644 --- a/macros/latex/contrib/siunitx/siunitx.dtx +++ b/macros/latex/contrib/siunitx/siunitx.dtx @@ -121,7 +121,7 @@ % % Identify the package and give the over all version information. % \begin{macrocode} -\ProvidesExplPackage {siunitx} {2022-05-31} {3.1.2} +\ProvidesExplPackage {siunitx} {2022-06-07} {3.1.3} {A comprehensive (SI) units package} % \end{macrocode} % diff --git a/macros/latex/contrib/siunitx/siunitx.pdf b/macros/latex/contrib/siunitx/siunitx.pdf Binary files differindex df22c1b862..98c7607d19 100644 --- a/macros/latex/contrib/siunitx/siunitx.pdf +++ b/macros/latex/contrib/siunitx/siunitx.pdf diff --git a/macros/xetex/latex/bidi/README b/macros/xetex/latex/bidi/README index bbc783aaf4..e19092605c 100644 --- a/macros/xetex/latex/bidi/README +++ b/macros/xetex/latex/bidi/README @@ -1,6 +1,6 @@ ___________________ The bidi package -v37.3 +v37.6 This package provides a convenient interface for typesetting bidirectional texts in Plain TeX and LaTeX, using XeTeX engine. @@ -25,7 +25,7 @@ The announcements for the new releases of the package will also appear in the Discussions space under the Announcements category. -Current version release date: 2022/06/06 +Current version release date: 2022/06/07 ___________________________________________ Vafa Khalighi diff --git a/macros/xetex/latex/bidi/bidi-doc-intro.ltx b/macros/xetex/latex/bidi/bidi-doc-intro.ltx index 335ad458ae..6d943f3a34 100644 --- a/macros/xetex/latex/bidi/bidi-doc-intro.ltx +++ b/macros/xetex/latex/bidi/bidi-doc-intro.ltx @@ -20,7 +20,7 @@ If you use \textsf{bidi} package to write any input \TeX\ document, and then run * Copyright (c) 2007--2022 Vafa Khalighi * Copyright (c) 2018--2020 bidi-tex GitHub Organization * -* v37.3, 2022/06/06 +* v37.6, 2022/06/07 * * License: LaTeX Project Public License, version * 1.3c or higher (your choice) diff --git a/macros/xetex/latex/bidi/bidi-doc-title.ltx b/macros/xetex/latex/bidi/bidi-doc-title.ltx index 79b32a3632..d94f8a8f1f 100644 --- a/macros/xetex/latex/bidi/bidi-doc-title.ltx +++ b/macros/xetex/latex/bidi/bidi-doc-title.ltx @@ -3,7 +3,7 @@ \begin{document} \title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\ \LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt] -\large User documentation for \textcolor{blue!65!black}{version 37.3}} +\large User documentation for \textcolor{blue!65!black}{version 37.6}} \author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}} \setcounter{page}{0} \thispagestyle{empty} @@ -13,7 +13,7 @@ \textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}} \Large -User documentation for \textcolor{blue!65!black}{version 37.3}} +User documentation for \textcolor{blue!65!black}{version 37.6}} \vskip 0pt plus 3fill \textit{\large to my Master, \textbf{Ferdowsi The Great}} diff --git a/macros/xetex/latex/bidi/bidi-doc.ltx b/macros/xetex/latex/bidi/bidi-doc.ltx index ec875cdc06..e4ff1d7287 100644 --- a/macros/xetex/latex/bidi/bidi-doc.ltx +++ b/macros/xetex/latex/bidi/bidi-doc.ltx @@ -1,7 +1,7 @@ \documentclass{ltxdoc} \input{bidi-doc-preamble.ltx} \hypersetup{% - pdftitle={User documentation for version 37.3 of the bidi + pdftitle={User documentation for version 37.6 of the bidi package}% } \begin{document} diff --git a/macros/xetex/latex/bidi/bidi-doc.pdf b/macros/xetex/latex/bidi/bidi-doc.pdf Binary files differindex 0956e77412..59b1f457bd 100644 --- a/macros/xetex/latex/bidi/bidi-doc.pdf +++ b/macros/xetex/latex/bidi/bidi-doc.pdf diff --git a/macros/xetex/latex/bidi/bidi.dtx b/macros/xetex/latex/bidi/bidi.dtx index d457153482..a0f01925bb 100644 --- a/macros/xetex/latex/bidi/bidi.dtx +++ b/macros/xetex/latex/bidi/bidi.dtx @@ -5,7 +5,7 @@ %<*readme> ___________________ The bidi package -v37.3 +v37.6 This package provides a convenient interface for typesetting bidirectional texts in Plain TeX and LaTeX, using XeTeX engine. @@ -30,7 +30,7 @@ The announcements for the new releases of the package will also appear in the Discussions space under the Announcements category. -Current version release date: 2022/06/06 +Current version release date: 2022/06/07 ___________________________________________ Vafa Khalighi @@ -93,10 +93,13 @@ by Vafa Khalighi. \generate{\file{beamerinnerthemecircles-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemecircles-xetex-bidi.def}}} \generate{\file{beamerinnerthemerectangles-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemerectangles-xetex-bidi.def}}} \generate{\file{beamerinnerthemerounded-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemerounded-xetex-bidi.def}}} +\generate{\file{beamerouterthemedefault-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemedefault-xetex-bidi.def}}} \generate{\file{beamerouterthemeinfolines-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemeinfolines-xetex-bidi.def}}} +\generate{\file{beamerouterthemeshadow-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemeshadow-xetex-bidi.def}}} \generate{\file{beamerouterthemesidebar-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemesidebar-xetex-bidi.def}}} \generate{\file{beamerouterthemesplit-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemesplit-xetex-bidi.def}}} \generate{\file{beamerouterthemeshadow-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemeshadow-xetex-bidi.def}}} +\generate{\file{beamerthemeHannover-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerthemeHannover-xetex-bidi.def}}} \generate{\file{bidi.sty}{\from{\jobname.dtx}{table,bidi.sty}}} \generate{\file{bidi.tex}{\from{\jobname.dtx}{table,bidi.tex}}} \generate{\file{bidi2in1.sty}{\from{\jobname.dtx}{table,bidi2in1.sty}}} @@ -161,7 +164,6 @@ by Vafa Khalighi. \generate{\file{lettrine-xetex-bidi.def}{\from{\jobname.dtx}{table,lettrine-xetex-bidi.def}}} \generate{\file{lineno-xetex-bidi.def}{\from{\jobname.dtx}{table,lineno-xetex-bidi.def}}} \generate{\file{listings-xetex-bidi.def}{\from{\jobname.dtx}{table,listings-xetex-bidi.def}}} -\generate{\file{lstmisc-xetex-bidi.def}{\from{\jobname.dtx}{table,lstmisc-xetex-bidi.def}}} \generate{\file{loadingorder-xetex-bidi.def}{\from{\jobname.dtx}{table,loadingorder-xetex-bidi.def}}} \generate{\file{longtable-xetex-bidi.def}{\from{\jobname.dtx}{table,longtable-xetex-bidi.def}}} \generate{\file{lscape-xetex-bidi.def}{\from{\jobname.dtx}{table,lscape-xetex-bidi.def}}} @@ -250,7 +252,7 @@ by Vafa Khalighi. \documentclass{ltxdoc} \input{bidi-doc-preamble.ltx} \hypersetup{% - pdftitle={Source documentation for version 37.3 of the bidi + pdftitle={Source documentation for version 37.6 of the bidi package}% } \EnableCrossrefs @@ -269,7 +271,7 @@ by Vafa Khalighi. % \GetFileInfo{\jobname.dtx} % \title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\ %\LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt] -%\large Source documentation for \textcolor{blue!65!black}{version 37.3}} +%\large Source documentation for \textcolor{blue!65!black}{version 37.6}} % \author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}} %\setcounter{page}{0} %\thispagestyle{empty} @@ -279,7 +281,7 @@ by Vafa Khalighi. %\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}} % %\Large -%Source documentation for \textcolor{blue!65!black}{version 37.3}} +%Source documentation for \textcolor{blue!65!black}{version 37.6}} % %\vskip 0pt plus 3fill %\textit{\large to my Master, \textbf{Ferdowsi The Great}} @@ -328,7 +330,7 @@ by Vafa Khalighi. %\iffalse %<*table> %\fi -%% \CheckSum{53104} +%% \CheckSum{53191} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z @@ -1947,12 +1949,7 @@ by Vafa Khalighi. %\fi % \section{File \texttt{beamer-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{beamer-xetex-bidi.def}[2022/06/06 v0.2 bidi adaptations for beamer class for XeTeX engine] -\bidi@patchcmd{\mathdisplay}{\else}{% - \else - \rightskip\z@ -}{}{} - +\ProvidesFile{beamer-xetex-bidi.def}[2022/06/07 v0.3 bidi adaptations for beamer class for XeTeX engine] \AtBeginDocument{% \if@RTLmain \raggedleft @@ -2316,23 +2313,23 @@ by Vafa Khalighi. %\fi % \section{File \texttt{beamerbasecolor-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{beamerbasecolor-xetex-bidi.def}[2022/05/24 v0.1 bidi adaptations for beamerbasecolor package for XeTeX engine] +\ProvidesFile{beamerbasecolor-xetex-bidi.def}[2022/06/07 v0.2 bidi adaptations for beamerbasecolor package for XeTeX engine] \renewenvironment{beamercolorbox}[2][]{% \def\beamer@vmode{\leavevmode}% \setkeys{beamercolbox}{wd=\textwidth,ht={},dp={},% leftskip=0pt,rightskip=0pt plus1fil,% sep=0pt,colsep=0pt,colsep*=0pt,% shadow=false,rounded=false,ignorebg=false}% + \if@RTL + \setkeys{beamercolbox}{rightskip=0pt,leftskip=0pt plus1fil}% + \else + \setkeys{beamercolbox}{leftskip=0pt,rightskip=0pt plus1fil}% + \fi \setkeys{beamercolbox}{#1}% \ifbeamercolorempty[bg]{#2}{\@tempswafalse}{\@tempswatrue}% \ifbeamer@colbox@ignorebg\@tempswafalse\fi% \def\beamer@colbox@color{#2}% \setbox\beamer@tempbox=\hbox\bgroup\color@begingroup - \if@RTL - \@hboxRconstructtrue - \else - \@hboxRconstructfalse - \fi \ifbeamer@colbox@ignorebg% \colorlet{beamer@temp@color}{bg}% \usebeamercolor[fg]{#2}% @@ -2340,6 +2337,7 @@ by Vafa Khalighi. \else% \usebeamercolor[fg]{#2}% \fi% + \beginL \vbox\bgroup% \hsize=\beamer@colbox@wd% \@arrayparboxrestore% @@ -2361,7 +2359,7 @@ by Vafa Khalighi. \ifdim\beamer@colbox@colsep>\z@\vskip\beamer@colbox@colsep\fi% \ifdim\beamer@colbox@colseps>\z@\vskip\beamer@colbox@colseps\fi% \fi% - \egroup\color@endgroup\egroup% + \egroup\endL\color@endgroup\egroup% \wd\beamer@tempbox=\beamer@colbox@wd% \ifx\beamer@colbox@ht\@empty\else\ht\beamer@tempbox=\beamer@colbox@ht\fi% \ifx\beamer@colbox@dp\@empty\else\dp\beamer@tempbox=\beamer@colbox@dp\fi% @@ -2881,7 +2879,7 @@ by Vafa Khalighi. %\fi % \section{File \texttt{beamerinnerthemedefault-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{beamerinnerthemedefault-xetex-bidi.def}[2022/06/06 v0.2 bidi adaptations for beamerinnerthemedefault package for XeTeX engine] +\ProvidesFile{beamerinnerthemedefault-xetex-bidi.def}[2022/06/07 v0.4 bidi adaptations for beamerinnerthemedefault package for XeTeX engine] \newcommand*{\bidi@beamer@leftskip}{% \if@RTL \rightskip @@ -2929,48 +2927,24 @@ by Vafa Khalighi. \bidi@undef\beamer@@tmpop@footnote@default -\newcommand*{\bidi@beamer@@footnote@ragged}{% - \if@RTL - \bidi@beamer@@footnote@raggedleft - \else - \bidi@beamer@@footnote@raggedright - \fi -} - -\newcommand*{\bidi@beamer@@footnote@raggedright}{% - \if@hboxRconstruct - \raggedleft - \else - \raggedright - \fi -} - -\newcommand*{\bidi@beamer@@footnote@raggedleft}{% - \if@hboxRconstruct - \raggedright - \else - \raggedleft - \fi -} - \defbeamertemplate*{footnote}{default} { \parindent 1em\noindent% - \bidi@beamer@@footnote@ragged + \bidi@beamer@ragged \hbox to 1.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% } \defbeamertemplate*{RTLfootnote}{default} { \parindent 1em\noindent% - \bidi@beamer@@footnote@raggedleft + \raggedleft \hbox to 1.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% } \defbeamertemplate*{LTRfootnote}{default} { \parindent 1em\noindent% - \bidi@beamer@@footnote@raggedright + \raggedright \hbox to 1.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% } @@ -2989,6 +2963,57 @@ by Vafa Khalighi. \insertcaption\par } +\bidi@csundef{beamer@@tmpop@block begin@default} + +\bidi@csundef{beamer@@tmpop@block alerted begin@default} + +\bidi@csundef{beamer@@tmpop@block example begin@default} + +\defbeamertemplate*{block begin}{default} +{ + \par\vskip\medskipamount% + \begin{beamercolorbox}[colsep*=.75ex]{block title} + \usebeamerfont*{block title}\insertblocktitle% + \end{beamercolorbox}% + {\parskip0pt\par}% + \ifbeamercolorempty[bg]{block title} + {} + {\ifbeamercolorempty[bg]{block body}{}{\nointerlineskip\vskip-0.5pt}}% + \usebeamerfont{block body}% + \begin{beamercolorbox}[colsep*=.75ex,vmode]{block body}% + \ifbeamercolorempty[bg]{block body}{\vskip-.25ex}{\leavevmode\vskip-\dimexpr.75ex+\baselineskip\relax}\vbox{}% +} + +\defbeamertemplate*{block alerted begin}{default} +{ + \par\vskip\medskipamount% + \begin{beamercolorbox}[colsep*=.75ex]{block title alerted} + \usebeamerfont*{block title alerted}\insertblocktitle% + \end{beamercolorbox}% + {\parskip0pt\par}% + \ifbeamercolorempty[bg]{block title alerted} + {} + {\ifbeamercolorempty[bg]{block body alerted}{}{\nointerlineskip\vskip-0.5pt}}% + \usebeamerfont{block body alerted}% + \begin{beamercolorbox}[colsep*=.75ex,vmode]{block body alerted}% + \ifbeamercolorempty[bg]{block body alerted}{\vskip-.25ex}{\leavevmode\vskip-\dimexpr.75ex+\baselineskip\relax}\vbox{}% +} + +\defbeamertemplate*{block example begin}{default} +{ + \par\vskip\medskipamount% + \begin{beamercolorbox}[colsep*=.75ex]{block title example} + \usebeamerfont*{block title example}\insertblocktitle% + \end{beamercolorbox}% + {\parskip0pt\par}% + \ifbeamercolorempty[bg]{block title example} + {} + {\ifbeamercolorempty[bg]{block body example}{}{\nointerlineskip\vskip-0.5pt}}% + \usebeamerfont{block body example}% + \begin{beamercolorbox}[colsep*=.75ex,vmode]{block body example}% + \ifbeamercolorempty[bg]{block body example}{\vskip-.25ex}{\leavevmode\vskip-\dimexpr.75ex+\baselineskip\relax}\vbox{}% +} + % \end{macrocode} % \iffalse @@ -3026,6 +3051,25 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerinnerthemerounded-xetex-bidi.def> +%<*beamerouterthemedefault-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerouterthemedefault-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerouterthemedefault-xetex-bidi.def}[2022/06/07 v0.1 bidi adaptations for beamerouterthemedefault package for XeTeX engine] +\def\beamer@fteleft{\if@RTLmain\vskip0.35cm\advance\leftskip by 1.7cm\advance\rightskip by1.7cm\else\fi} + +\def\beamer@fteright{\if@RTLmain\else\vskip0.35cm\advance\leftskip by 1.7cm\advance\rightskip by1.7cm\fi} + +\AtBeginDocument{% + \if@RTLmain + \setbeamertemplate{frametitle}[default][right] + \fi +} + + +% \end{macrocode} +% \iffalse +%</beamerouterthemedefault-xetex-bidi.def> %<*beamerouterthemeinfolines-xetex-bidi.def> %\fi % \section{File \texttt{beamerouterthemeinfolines-xetex-bidi.def}} @@ -3061,11 +3105,24 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerouterthemeinfolines-xetex-bidi.def> +%<*beamerouterthemeshadow-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerouterthemeshadow-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerouterthemeshadow-xetex-bidi.def}[2022/06/07 v0.1 bidi adaptations for beamerouterthemeshadow package for XeTeX engine] +\AtBeginDocument{% + \setbeamertemplate{frametitle}[shadow theme]% +} + + +% \end{macrocode} +% \iffalse +%</beamerouterthemeshadow-xetex-bidi.def> %<*beamerouterthemesidebar-xetex-bidi.def> %\fi % \section{File \texttt{beamerouterthemesidebar-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{beamerouterthemesidebar-xetex-bidi.def}[2022/06/06 v0.1 bidi adaptations for beamerouterthemesidebar package for XeTeX engine] +\ProvidesFile{beamerouterthemesidebar-xetex-bidi.def}[2022/06/07 v0.2 bidi adaptations for beamerouterthemesidebar package for XeTeX engine] \bidi@csundef{beamer@@tmpop@frametitle@sidebar theme} \bidi@csundef{beamer@@tmpop@headline@sidebar theme} @@ -3101,6 +3158,10 @@ by Vafa Khalighi. \vfil }% } + +\AtBeginDocument{% + \setbeamertemplate{frametitle}[sidebar theme]% +} \defbeamertemplate*{headline}{sidebar theme} {% @@ -3131,6 +3192,19 @@ by Vafa Khalighi. } \fi +\def\beamer@sidebarformat#1#2#3{% +\if@RTL + \begin{beamercolorbox}[wd=\beamer@sidebarwidth,rightskip=#1,leftskip=1ex plus1fil,vmode]{#2} +\else + \begin{beamercolorbox}[wd=\beamer@sidebarwidth,leftskip=#1,rightskip=1ex plus1fil,vmode]{#2} + \fi + \vbox{}% + #3\par% + \vbox{}% + \vskip-1.5ex% + \end{beamercolorbox} +} + \ifdim\beamer@sidebarwidth>0pt \AtBeginDocument{% @@ -3251,13 +3325,30 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerouterthemeshadow-xetex-bidi.def> +%<*beamerthemeHannover-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerthemeHannover-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerthemeHannover-xetex-bidi.def}[2022/06/07 v0.1 bidi adaptations for beamerthemeHannover package for XeTeX engine] +\AtBeginDocument{% + \if@RTLmain + \setbeamertemplate{frametitle}[default][left]% + \else + \setbeamertemplate{frametitle}[default][right]% + \fi +} + + +% \end{macrocode} +% \iffalse +%</beamerthemeHannover-xetex-bidi.def> %<*bidi.sty> %\fi % \section{File \texttt{bidi.sty}} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\def\bididate{2022/06/06} -\def\bidi@version{37.3} +\def\bididate{2022/06/07} +\def\bidi@version{37.6} \ProvidesPackage{bidi}[\bididate\space v\bidi@version\space Bidirectional typesetting in plain TeX and LaTeX] \edef\@bidi@info{****************************************************^^J% @@ -3345,7 +3436,7 @@ Bidirectional typesetting in plain TeX and LaTeX] } \newcommand*{\@bidi@pdfcustomproperties}{% This is the bidi package, Version \bidi@version, - Released June 6, 2022. + Released June 7, 2022. } \newcommand*{\bidi@beamer@ragged}{} \@RTLmainfalse @@ -3589,9 +3680,9 @@ Bidirectional typesetting in plain TeX and LaTeX] %\fi % \section{File \texttt{bidi.tex}} % \begin{macrocode} -\def\bididate{2022/06/06} +\def\bididate{2022/06/07} \catcode`@=11 -\def\bidi@version{37.3} +\def\bidi@version{37.6} \let \protect \relax \newlinechar`\^^J \edef\@bidi@info{****************************************************^^J% @@ -3693,7 +3784,7 @@ Bidirectional typesetting in plain TeX and LaTeX] } \def\@bidi@pdfcustomproperties{% This is the bidi package, Version \bidi@version, - Released June 6, 2022. + Released June 7, 2022. } \def\bidi@pdfm@mark{% \special{pdf:% @@ -15846,28 +15937,6 @@ bidi implementation of tufte title] % \end{macrocode} % \iffalse %</listings-xetex-bidi.def> -%<*lstmisc-xetex-bidi.def> -%\fi -% \section{File \texttt{lstmisc-xetex-bidi.def}} -% \begin{macrocode} -\ProvidesFile{lstmisc-xetex-bidi.def}[2022/06/06 v0.1 bidi adaptations for lstmisc package for XeTeX engine] -\bidi@patchcmd{\lsthk@Init}{% - \rightskip\@rightskip - \leftskip\z@skip -}{% - \if@hboxRconstruct - \leftskip\@flushglue - \rightskip\z@skip - \else - \rightskip\@rightskip - \leftskip\z@skip - \fi -}{}{} - - -% \end{macrocode} -% \iffalse -%</lstmisc-xetex-bidi.def> %<*loadingorder-xetex-bidi.def> %\fi % \section{File \texttt{loadingorder-xetex-bidi.def}} @@ -24146,7 +24215,7 @@ to\rtside{\box\bslice\hfil}} %\fi % \section{File \texttt{latex-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{latex-xetex-bidi.def}[2022/06/06 v1.4.3 bidi adaptations for `latex.ltx' for XeTeX engine] +\ProvidesFile{latex-xetex-bidi.def}[2022/06/07 v1.4.4 bidi adaptations for `latex.ltx' for XeTeX engine] \newcommand{\TeXXeTOn}{\TeXXeTstate\@ne} \newcommand{\TeXXeTOff}{\TeXXeTstate\z@} \TeXXeTOn @@ -25046,7 +25115,6 @@ $\@@underline{\hbox{#1}}\m@th$\relax\fi\fi} \@ifpackageloaded{lettrine}{\input{lettrine-xetex-bidi.def}}{} \@ifpackageloaded{lineno}{\input{lineno-xetex-bidi.def}}{} \@ifpackageloaded{listings}{\input{listings-xetex-bidi.def}}{} -\@ifpackageloaded{lstmisc}{\input{lstmisc-xetex-bidi.def}}{} \@ifpackageloaded{media9}{\RequirePackage{bidi-media9}}{} \@iftexfileloaded{pstricks}{\input{pstricks-xetex-bidi.def}}{} \@iftexfileloaded{pgfcorescopes.code}{\input{pgfcorescopes.code-xetex-bidi.def}}{} @@ -25109,10 +25177,13 @@ $\@@underline{\hbox{#1}}\m@th$\relax\fi\fi} \@ifpackageloaded{beamerinnerthemecircles}{\input{beamerinnerthemecircles-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemerectangles}{\input{beamerinnerthemerectangles-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemerounded}{\input{beamerinnerthemerounded-xetex-bidi.def}}{} +\@ifpackageloaded{beamerouterthemedefault}{\input{beamerouterthemedefault-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemeinfolines}{\input{beamerouterthemeinfolines-xetex-bidi.def}}{} +\@ifpackageloaded{beamerouterthemeshadow}{\input{beamerouterthemeshadow-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemesidebar}{\input{beamerouterthemesidebar-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemesplit}{\input{beamerouterthemesplit-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemeshadow}{\input{beamerouterthemeshadow-xetex-bidi.def}}{} +\@ifpackageloaded{beamerthemeHannover}{\input{beamerthemeHannover-xetex-bidi.def}}{} % \end{macrocode} % \iffalse %</latex-xetex-bidi.def> diff --git a/macros/xetex/latex/bidi/bidi.pdf b/macros/xetex/latex/bidi/bidi.pdf Binary files differindex d5d6120f82..28d4d2d664 100644 --- a/macros/xetex/latex/bidi/bidi.pdf +++ b/macros/xetex/latex/bidi/bidi.pdf |