% \iffalse meta-comment % File: picture.dtx % Version: 2026-03-07 v2.0 % Info: Dimens for picture macros % % Copyright (C) % 2006-2009 Heiko Oberdiek % 2016-2026 Oberdiek Package Support Group % https://github.com/ho-tex/picture/issues % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either % version 1.3c of this license or (at your option) any later % version. This version of this license is in % https://www.latex-project.org/lppl/lppl-1-3c.txt % and the latest version of this license is in % https://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 Maintainers of this work are % Heiko Oberdiek and the Oberdiek Package Support Group % https://github.com/ho-tex/picture/issues % % This file is part of the "bookmark bundle" (The Work in LPPL) % and all files in that bundle must be distributed together. % % This work consists of the main source file picture.dtx and picture.ins % and the derived files picture.sty, picture-2024-01-11.sty, picture.pdf % and picture-example.tex. % % Distribution: % CTAN:macros/latex/contrib/picture/picture.dtx % CTAN:macros/latex/contrib/picture/picture.pdf % % Unpacking: % tex picture.ins % % Documentation: % The class ltxdoc loads the configuration file ltxdoc.cfg % if available. Here you can specify further options, e.g. % use A4 as paper format: % \PassOptionsToClass{a4paper}{article} % % Programm calls to get the documentation (example): % pdflatex picture.dtx % makeindex -s gind.ist picture.idx % pdflatex picture.dtx % makeindex -s gind.ist picture.idx % pdflatex picture.dtx % % Installation: % TDS:tex/latex/picture/picture.sty % TDS:tex/latex/picture/picture-2024-01-11.sty % TDS:doc/latex/picture/picture.pdf % TDS:doc/latex/picture/picture-example.tex % TDS:source/latex/picture/picture.dtx % \fi % % \iffalse %<*driver> \NeedsTeXFormat{LaTeX2e}[2020/10/01] \documentclass{ltxdoc} \usepackage{holtxdoc}[2011/11/22] \begin{document} \DocInput{picture.dtx}% \end{document} % % \fi % % \title{The \xpackage{picture} package} % \date{2026-03-07 v2.0} % \author{Heiko Oberdiek\thanks % {Please report any issues at \url{https://github.com/ho-tex/picture/issues}}} % % \maketitle % % \begin{abstract} % There are macro and environment arguments that expect numbers % that will internally be multiplicated with \cs{unitlength}. % This package extends the syntax of these arguments that % dimens with calculation support can be added for these arguments. % \end{abstract} % % \tableofcontents % \section{Change in version 2.0} % % Most of the functionality of this package is no longer needed, as % the \LaTeX~definitions provides support for dimensions in the arguments % of |picture| and macros such as \cs{put}, \cs{line}, \cs{vector} out of % the box. The exception is the support for the syntax of the \xpackage{calc} % package. Input like |\put(0,\widthof{text})| will \emph{not} work with % the kernel commands. % % Starting with version 2 this package is disabled by default and does nothing. % If support for the \xpackage{calc} is wanted, the loading of the previous % version of the \xpackage{picture} can be forced with any of the following % variants: % % \begin{verbatim} % \usepackage{picture}[=v1] % \usepackage[calc]{picture}[=v1] % \usepackage[calc]{picture} % \end{verbatim} % % The last option can also be used if the \xpackage{picture} has % already been loaded without or without some other option. % There will be no option clash error and the package will revert to the old % behaviour. % % \section{User interface of version 1.7} % % \subsection{Introduction} % % The environment |picture| and macros such as \cs{put}, \cs{line}, % \cs{vector} and other macros have arguments that expect numbers % that are used as factor for \cs{unitlength}. % This package redefines such macros and adds code that detects % whether such an argument is given as number or as length. % In the latter case, the length is used directly without multiplying % with \cs{unitlength}. % % \subsection{Options} % % Depending on the available features, also length expressions % can be given. Option \xoption{calc} loads package \xpackage{calc}. % Then expressions of these package may be used. % Otherwise \xoption{etex} wraps the length argument inside % \cs{dimexpr}\dots\cs{relax}, if \eTeX\ is available. Otherwise % option \xoption{plain} uses plain assignments without calculation % support. % % The default is \xoption{calc} if package \xpackage{calc} % is loaded before package \xoption{picture}. If you specify % option \xoption{calc} the loading of \xpackage{calc} is ensured. % Otherwise package \xpackage{picture} looks whether \cs{dimexpr} % is available and uses then option \xoption{etex} as default. % If \eTeX\ also could not be found, then \xoption{plain} is used. % % \subsection{Example} % % \begin{macrocode} %<*example> \documentclass{article} \usepackage[calc]{picture} \begin{document} \setlength{\unitlength}{1pt} \begin{picture}(\widthof{Hello World}, 10mm) \put(0, 0){\makebox(0,0)[lb]{Hello World}}% \put(0, \heightof{Hello World} + \fboxsep){% \line(1, 0){\widthof{Hello World}}% }% \put(\widthof{Hello World}, 10mm){% \line(0, -1){10mm}% }% \end{picture} \end{document} % % \end{macrocode} % % \subsection{Supported packages} % % Packages \xpackage{pspicture} and \xpackage{pict2e} are supported, % but they must be loaded before package \xpackage{picture}. % % New macros can be supported by \cs{picture@redefine}. % The first argument is the macro which contains the arguments % in its parameter text that you want to support by package \xpackage{picture}. % The second argument contains the parameter text. Change \# to \& for % the arguments in question. % Examples (already used by package \xpackage{picture}): % \begin{quote} % |\picture@redefine\put{(&1,&2)}|\\ % |\picture@redefine\line{(#1,#2)&3}| % \end{quote} % % \StopEventually{ % } % % \section{Implementation} % \subsection{Identification} % \begin{macrocode} %<*package> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{picture}% [2026-03-07 v2 Dimens for picture macros (HO)]% % \end{macrocode} % % \subsection{Release handling} % \begin{macrocode} \providecommand\DeclareRelease[3]{} \providecommand\DeclareCurrentRelease[2]{} \DeclareRelease{v1}{0000-00-00}{picture-2024-01-11.sty} \DeclareCurrentRelease{}{2024-01-11} % \end{macrocode} % % \subsection{Option} % \begin{macrocode} \def\Pc@calcname{calc} \def\Pc@load@frozen@version { \RequirePackage{calc}% \RequirePackage[calc]{picture-2024-01-11}% } \DeclareKeys { calc .code:n = \Pc@load@frozen@version, calc .usage:n= preamble, plain.code:n={}, etex .code:n={} } \ProcessKeyOptions \AtBeginDocument{ \ifx\Pc@method\Pc@calcname \else { \PackageWarning{picture} {The picture package has been disabled as most\MessageBreak of its functionality is now provided by LaTeX directly.\MessageBreak To force the loading of the previous version use\MessageBreak `\string\usepackage\string{picture\string}[=v1]`\MessageBreak or `\string\usepackage[calc]\string{picture\string}` } {} } \fi} % \end{macrocode} % % % \subsection{Identification of version 1} % \begin{macrocode} %<*packagev1> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{picture-2024-01-11}% [2024/01/11 version1.7 Dimens for picture macros (HO)]% % \end{macrocode} % % \subsection{Options} % % \begin{macrocode} \def\Pc@calcname{calc} \def\Pc@etexname{etex} \def\Pc@plainname{plain} % \end{macrocode} % \begin{macro}{\Pc@method} % Macro \cs{Pc@method} stores the method to use for calculations. % Check which features are available and set the default for \cs{Pc@method}. % \begin{macrocode} \@ifpackageloaded{calc}{% \let\Pc@method\Pc@calcname }{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname dimexpr\endcsname\relax \let\Pc@method\Pc@plainname \else \let\Pc@method\Pc@etexname \fi } % \end{macrocode} % \end{macro} % \begin{macrocode} \DeclareOption{plain}{% \let\Pc@method\Pc@plainname } \DeclareOption{etex}{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname dimexpr\endcsname\relax \PackageError{picture}{% e-TeX is not available% }\@ehc \else \let\Pc@method\Pc@etexname \fi } \DeclareOption{calc}{% \let\Pc@method\Pc@calcname } \ProcessOptions* \begingroup \let\on@line\@empty \PackageInfo{picture}{Calculation method: \Pc@method}% \endgroup % \end{macrocode} % % \subsection{Calculation method} % % \begin{macrocode} \ifx\Pc@method\Pc@calcname \RequirePackage{calc}% \fi % \end{macrocode} % % \subsubsection{Method \xoption{calc}} % % \begin{macrocode} \ifx\Pc@method\Pc@calcname \def\Pc@tokslength#1{% \begingroup \let\calc@error\Pc@calc@error \setlength\dimen@{#1\unitlength}\Pc@next\Pc@nil{#1}% }% \let\PcOrg@calc@error\calc@error \@ifpackagelater{calc}{2007/08/22}{% v4.3 \def\Pc@calc@error#1{% \expandafter\ifx\expandafter\unitlength\noexpand#1\relax \def\calc@next##1!{% \endgroup \aftergroup\afterassignment \aftergroup\Pc@next }% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi {% \calc@next{#1}% }{% \PcOrg@calc@error{#1}% }% }% }{% \def\Pc@calc@error#1{% \expandafter\ifx\expandafter\unitlength\noexpand#1\relax \def\calc@next##1!{% \endgroup \aftergroup\afterassignment \aftergroup\Pc@next }% \expandafter\@gobble \else \expandafter\@firstofone \fi {% \PcOrg@calc@error{#1}% }% }% }% \fi % \end{macrocode} % % \subsubsection{Method \xoption{etex}} % % \begin{macrocode} \ifx\Pc@method\Pc@etexname \def\Pc@tokslength#1{% \begingroup \afterassignment\Pc@next \dimen@=\dimexpr#1\unitlength\Pc@nil{#1}% }% \fi % \end{macrocode} % % \subsubsection{Method \xoption{plain}} % % \begin{macrocode} \ifx\Pc@method\Pc@plainname \def\Pc@tokslength#1{% \begingroup \afterassignment\Pc@next \dimen@=#1\unitlength\Pc@nil{#1}% }% \fi % \end{macrocode} % % \subsubsection{Help macros} % % \begin{macrocode} \def\Pc@next#1\Pc@nil#2{% \ifx\\#1\\% \endgroup \Pc@addtoks{{#2}}% \else \expandafter\endgroup \expandafter\Pc@addtoks\expandafter{% \expandafter{\the\dimen@}% }% \fi } % \end{macrocode} % \begin{macro}{\Pc@nil} % \cs{Pc@nil} must not have the meaning of \cs{relax} because of % \cs{dimexpr}. % \begin{macrocode} \let\Pc@nil\message % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@addtoks} % \begin{macrocode} \def\Pc@addtoks#1{% \toks@=\expandafter{\the\toks@#1}% } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@init} % \begin{macrocode} \def\Pc@init#1{% \begingroup \toks@={#1}% } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@finish} % \begin{macrocode} \def\Pc@finish#1{% \expandafter\endgroup \expandafter#1\the\toks@ } % \end{macrocode} % \end{macro} % % \subsection{Redefinitions} % % \begin{macro}{\picture@redefine} % \begin{tabular}[t]{@{}l@{ }l@{}} % |#1|:& command name\\ % |#2|:& parameter text, length parameter with \& instead of \# % \end{tabular} % \begin{macrocode} \def\picture@redefine#1#2{% \begingroup \edef\reserved@a{% \noexpand\noexpand \expandafter\noexpand \csname PcOrg@\expandafter\@gobble\string#1\endcsname }% \toks0{#1}% \Pc@first#2&0% } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@first} % \begin{macrocode} \def\Pc@first#1&{% \toks1={#1}% \toks2={\Pc@init{#1}}% \Pc@scanlength } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@scanlength} % |#1|: number of length parameter or zero % \begin{macrocode} \def\Pc@scanlength#1{% \ifcase#1 % \expandafter\Pc@last \else \toks1=\expandafter{\the\toks1 ###1}% \toks2=\expandafter{\the\toks2 \Pc@tokslength{###1}}% \expandafter\Pc@scannext \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@scannext} % \begin{macrocode} \def\Pc@scannext#1&{% \ifx\\#1\\% \else \toks1=\expandafter{\the\toks1 #1}% \toks2=\expandafter{\the\toks2 \Pc@addtoks{#1}}% \fi \Pc@scanlength } % \end{macrocode} % \end{macro} % \begin{macro}{\Pc@last} % \begin{macrocode} \def\Pc@last{% \edef\x{% \endgroup \let\reserved@a\the\toks0 % \def\the\toks0 \the\toks1 {% \the\toks2 % \noexpand\Pc@finish\reserved@a }% }% \x } % \end{macrocode} % \end{macro} % % \subsubsection{\LaTeX\ base macros} % % \begin{macrocode} \picture@redefine\@picture{(&1,&2)(&3,&4)} \picture@redefine\put{(&1,&2)} \picture@redefine\multiput{(&1,&2)} \picture@redefine\@multiput{(&1,&2)} \picture@redefine\line{(#1,#2)&3} \picture@redefine\vector{(#1,#2)&3} \picture@redefine\dashbox{&1(&2,&3)} \picture@redefine\@circle{&1} \picture@redefine\@dot{&1} \picture@redefine\@bezier{#1(&2,&3)(&4,&5)(&6,&7)} \picture@redefine\@imakepicbox{(&1,&2)} % \end{macrocode} % % \subsubsection{Package \xpackage{pspicture}} % % Package \xpackage{pspicture} changes the signature of \cs{@oval} % by adding an optional argument. % \begin{macrocode} \@ifpackageloaded{pspicture}{% \picture@redefine\@oval{[&1](&2,&3)}% \picture@redefine\Line{(&1,&2)}% \picture@redefine\Curve{(&1,&2)}% \picture@redefine\Vector{(&1,&2)}% }{% \picture@redefine\@oval{(&1,&2)}% } % \end{macrocode} % % \subsubsection{Package \xpackage{pict2e}} % Additions suggested in https://github.com/ho-tex/picture/issues/1 % \begin{macrocode} \@ifpackageloaded{pict2e}{% \AtBeginDocument{% \picture@redefine\@cbezier{[#1](&2,&3)(&4,&5)(&6,&7)(&8,&9)}% } \picture@redefine\pIIe@arc@@{(#1,#2)&3} \picture@redefine\polyline{(&1,&2)} \picture@redefine\@polyline{(&1,&2)} \picture@redefine\@polygon{(&1,&2)} \picture@redefine\@@polygon{(&1,&2)} \picture@redefine\moveto{(&1,&2)} \picture@redefine\lineto{(&1,&2)} \picture@redefine\curveto{(&1,&2)(&3,&4)(&5,&6)} }{} % \end{macrocode} % \subsection{Check package loading order} % % \begin{macro}{\PC@checkpackage} % \begin{macrocode} \def\Pc@checkpackage#1{% \@ifpackageloaded{#1}{% }{% \AtBeginDocument{% \@ifpackageloaded{#1}{% \PackageWarningNoLine{picture}{% Package `#1' is loaded after `picture'.\MessageBreak Load package `picture' afterwards to get full support% \MessageBreak of its additional syntax with length specifications% }% }{}% }% }% } % \end{macrocode} % \end{macro} % \begin{macrocode} \Pc@checkpackage{pict2e} \Pc@checkpackage{pspicture} % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \section{Installation} % % \subsection{Download} % % \paragraph{Package.} This package is available on % CTAN\footnote{\CTANpkg{picture}}: % \begin{description} % \item[\CTAN{macros/latex/contrib/picture/picture.dtx}] The source file. % \item[\CTAN{macros/latex/contrib/picture/picture.pdf}] Documentation. % \end{description} % % \subsection{Package installation} % % \paragraph{Unpacking.} Run tex or latex on the \xfile{.ins} % \begin{quote} % \verb|tex picture.dtx| % \end{quote} % % \paragraph{TDS.} Now the different files must be moved into % the different directories in your installation TDS tree % (also known as \xfile{texmf} tree): % \begin{quote} % \def\t{^^A % \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}} % picture.sty & tex/latex/picture/picture.sty\\ % picture-2024-01-11.sty & tex/latex/picture/picture-2024-01-11.sty\\ % picture.pdf & doc/latex/picture/picture.pdf\\ % picture-example.tex & doc/latex/picture/picture-example.tex\\ % picture.dtx & source/latex/picture/picture.dtx\\ % \end{tabular}^^A % }^^A % \sbox0{\t}^^A % \ifdim\wd0>\linewidth % \begingroup % \advance\linewidth by\leftmargin % \advance\linewidth by\rightmargin % \edef\x{\endgroup % \def\noexpand\lw{\the\linewidth}^^A % }\x % \def\lwbox{^^A % \leavevmode % \hbox to \linewidth{^^A % \kern-\leftmargin\relax % \hss % \usebox0 % \hss % \kern-\rightmargin\relax % }^^A % }^^A % \ifdim\wd0>\lw % \sbox0{\small\t}^^A % \ifdim\wd0>\linewidth % \ifdim\wd0>\lw % \sbox0{\footnotesize\t}^^A % \ifdim\wd0>\linewidth % \ifdim\wd0>\lw % \sbox0{\scriptsize\t}^^A % \ifdim\wd0>\linewidth % \ifdim\wd0>\lw % \sbox0{\tiny\t}^^A % \ifdim\wd0>\linewidth % \lwbox % \else % \usebox0 % \fi % \else % \lwbox % \fi % \else % \usebox0 % \fi % \else % \lwbox % \fi % \else % \usebox0 % \fi % \else % \lwbox % \fi % \else % \usebox0 % \fi % \else % \lwbox % \fi % \else % \usebox0 % \fi % \end{quote} % If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's % TDS installing feature, then some files can already be in the right % place, see the documentation of \docstrip. % % \subsection{Refresh file name databases} % % If your \TeX~distribution % (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh % these. For example, \TeX\,Live\ users run \verb|texhash| or % \verb|mktexlsr|. % % \paragraph{Generating the documentation.} % You can use the \xfile{.dtx}. The process can be configured by the % configuration file \xfile{ltxdoc.cfg}. For instance, put this % line into this file, if you want to have A4 as paper format: % \begin{quote} % \verb|\PassOptionsToClass{a4paper}{article}| % \end{quote} % An example follows how to generate the % documentation with pdf\LaTeX: % \begin{quote} %\begin{verbatim} %pdflatex picture.dtx %makeindex -s gind.ist picture.idx %pdflatex picture.dtx %makeindex -s gind.ist picture.idx %pdflatex picture.dtx %\end{verbatim} % \end{quote} % % \begin{History} % \begin{Version}{2006/08/26 v1.0} % \item % First released version. (First start of the project was June/July 2002.) % \end{Version} % \begin{Version}{2007/04/11 v1.1} % \item % Line ends sanitized. % \end{Version} % \begin{Version}{2008/11/26 v1.2} % \item % Package \xpackage{pict2e} added to documentation section ``Supported % packages''. % \item % Package order of supported packages is checked. % \end{Version} % \begin{Version}{2009/10/11 v1.3} % \item % Fix because of new version v4.3 of package \xpackage{calc}. % \end{Version} % \begin{Version}{2016/05/16 v1.4} % \item % Documentation updates. % \end{Version} % \begin{Version}{2019/12/09 v1.5} % \item % Documentation updates. % \end{Version} % \begin{Version}{2020-04-22 v1.6} % \item Added definitions for pict2e (https://github.com/ho-tex/picture/issues/1) % \end{Version} % \begin{Version}{2024-01-11 v1.7} % \item Remove a now unneeded \verb|\@gobble|, requires LaTex 2020-10-01 (https://github.com/ho-tex/picture/issues/2) % \end{Version} % \begin{Version}{2026-03-07 v2.0} % \item Package is disabled unless the calc option is required. % \end{Version} % \end{History} % % \PrintIndex % % \Finale \endinput