% \iffalse meta-comment % ====================================================================== % lscapeenhanced.dtx % Copyright © 2008–2024 Markus Kohm % % This work is a KOMA-Script spin-off. For the original sources of % KOMA-Script's `float.hak' see file `scrhack.dtx' in the KOMA-Script % sources at <https://sourceforge.net/p/koma-script/code/>. % % Development is taking place as part of `scrhack' at % <https://github.com/komascript/third-party-enhancements>. New issues % should be reported there as well as known issues can be found. % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, version 1.3c of the license. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.<3c or later is part of all distributions of LaTeX % version 2005/12/01 or later and of this work. % % This work has the LPPL maintenance status "author-maintained". % % The Current Maintainer and author of this work is Markus Kohm. % % This work consists of the file `lscapeenhanced.dtx' and `README.md'. % % The recommended way to install `lscapeenhanced' is to use % the package manager of your TeX distribution. % ====================================================================== % %<*dtx> \ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi \ProvidesFile{lscapeenhanced.dtx} %</dtx> %<*dtx|package> %<package>\ProvidesPackage{lscapeenhanced} [2024-04-16 v1.0 %<dtx> sources and unpack driver of improved lscape package] %</dtx|package> %<*dtx> \ifx\documentclass\undefined \input docstrip.tex \generate{% \file{lscapeenhanced.sty}{% \from{lscapeenhanced.dtx}{package}% }% }% \else \let\endbatchfile\relax \fi \endbatchfile \documentclass[ngerman,USenglish]{koma-script-source-doc} \usepackage{babel} \usepackage{csquotes} \usepackage[style=alphabetic]{biblatex} \begin{filecontents}[force]{\jobname.bib} @article{latexnews35, author={{The {\LaTeX} Project Team}}, shortauthor={TLT}, year={2022}, month={6}, title={Issue 35}, journal={{\LaTeX} News}, url={http://mirrors.ctan.org/macros/latex/base/ltnews35.pdf}, urldate={2023-07-14}, } @online{pkg:lscape, author = {David Carlisle and {The \LaTeX{} Project Team}}, version = {3.02}, date = {2020-05-28}, title = {\pkg*{lscape} – Place selected parts of a document in landscape}, url = {https://ctan.org/pkg/lscape}, urldate = {2023-07-19}, note = {Modifies the margins and rotates the page contents but not the page number. Useful, for example, with large multipage tables, as it is compatible with \pkg{longtable} and \pkg{supertabular}.}, } @manual{pkg:lscape:manual, author = {David Carlisle}, version = {3.02}, date = {2020-05-08}, title = {The \pkg*{lscape} package}, url = {http://mirrors.ctan.org/macros/latex/required/graphics/lscape.pdf}, urldate = {2023-07-19}, abstract = {All text, within the \env{landscape} environment is rotate through 90 degrees. The environment may span several pages. It works well with, and was originally created for, use with \pkg{longtable} to produce long wide tables.}, } @online{pkg:pdflscape, author = {Heiko Oberdiek}, version = {0.13}, date = {2022-10-28}, title = {\pkg*{pdflscape} – Make landscape pages display as landscape}, url = {https://ctan.org/pkg/pdflscape}, urldate = {2023-07-19}, note = {The package adds PDF support to the \env{landscape} environment of package \pkg{lscape}, by setting the PDF \texttt{/Rotate} page attribute. Pages with this attribute will be displayed in landscape orientation by conforming PDF viewers.}, } @manual{pkg:pdflscape:manual, author = {Heiko Oberdiek}, version = {0.13}, date = {2022-10-28}, title = {The \pkg*{pdflscape} package}, url = {http://mirrors.ctan.org/macros/latex/contrib/pdflscape/pdflscape.pdf}, urldate = {2023-07-19}, abstract = {Package \pkg*{pdflscape} adds PDF support to the environment \env{landscape} of package \pkg{lscape} by setting the PDF page attribute \texttt{/Rotate}.}, } @online{pkg:xpatch, author = {Enrico Gregorio}, version = {0.3}, date = {2020-03-25}, title = {\pkg*{xpatch} – Extending \pkg{etoolbox} patching commands}, url = {https://ctan.org/pkg/xpatch}, urldate = {2023-07-19}, note = {The package generalises the macro patching commands provided by Philipp Lehmann's \pkg{etoolbox}.}, } @manual{pkg:xpatch:manual, author = {Enrico Gregorio}, version = {0.3}, date = {2020-03-25}, title = {The \pkg*{xpatch} package extending \pkg{etoolbox} patching commands}, url = {http://mirrors.ctan.org/macros/latex/contrib/xpatch/xpatch.pdf}, urldate = {2023-07-19}, abstract = {}, } @online{pkg:scrlfile, author = {Markus Kohm}, version = {3.41}, date = {2023-07-07}, title = {\pkg*{scrlfile} – Installation control (not only) for \KOMAScript{} packages}, url = {https://ctan.org/pkg/scrlfile}, urldate = {2023-07-19}, note = {The package provides hooks for the execution of commands before or after loading files, classes or packages independent from the \LaTeX{} kernel version.}, } @online{pkg:koma-script, author={Markus Kohm}, version={3.41}, date={2023-07-07}, title={{\KOMAScript} --- A bundle of versatile classes and packages}, url={https://ctan.org/pkg/koma-script}, urldate={2023-07-14}, note={The \KOMAScript{} bundle provides replacements for the \pkg*{article}, \pkg*{report}, and \pkg*{book} classes with emphasis on typography and versatility. There is also a letter class.}, } @manual{pkg:koma-script:manual:de, author={Markus Kohm}, date={2023-06-16}, title={{\KOMAScript}}, subtitle={Die Anleitung}, url={http://mirrors.ctan.org/macros/latex/contrib/koma-script/scrguide-de.pdf}, urldate={2023-07-04}, } @manual{pkg:koma-script:manual:en, author={Markus Kohm}, date={2023-06-16}, title={{\KOMAScript}}, subtitle={The Guide}, url={http://mirrors.ctan.org/macros/latex/contrib/koma-script/scrguide-en.pdf}, urldate={2023-07-14}, } \end{filecontents} \addbibresource{\jobname.bib} \setcounter{StandardModuleDepth}{2} \begin{document} \nocite{pkg:lscape,pkg:pdflscape,pkg:koma-script} \DocInput{lscapeenhanced.dtx} \end{document} %</dtx> %\fi % % \changes{v0.1}{2023/06/01}{start of \KOMAScript{} spin-off} % \changes{v1.0}{2024/04/16}{first release as standalone package} % % \GetFileInfo{lscapeenhanced.dtx} % \title{Improving ``\pkg{lscape}'' and ``\pkg{pdflscape}''} % \author{\href{mailto:komascript@gmx.info}{Markus Kohm}^^A % \thanks{Repository and bug reports: % \url{https://github.com/komascript/third-party-enhancements}^^A % }% % } % \date{Version \filedate{} \fileversion} % \maketitle % \begin{abstract} % Package \pkg*{lscapeenhanced} has started as hack module of the % \KOMAScript{} package \pkg*{scrhack} years ago to fix an issue when using % package \pkg{lscape} with \KOMAScript{} packages \pkg{scrlayer} or % \pkg{scrlayer-scrpage}. This became necessary because package % \pkg{lscape} has a somehow strange handling of \len{textheight} % resp. \len{textwidth} at landscape pages. This is not only an issue with % \KOMAScript{} but also other packages, e.g., \pkg{showframe}. Package % \pkg*{lscapeenhanced} solved this issue. This is a really small change and % best would be, if the \pkg*{lscape} author would at least include this % change optionally. % \end{abstract} % % \tableofcontents % %\iffalse %<*doc> %\fi \section{What is the Potential Issue With \texorpdfstring{\pkg{lscape}}{lscape}?} \label{sec:why} The \pkg{lscape} package defines a \env{landscape} environment to set the page contents, but not the header or footer in landscape mode. Inside this environment, \len{textheight} is set to the value of \len{textwidth}, but \len{textwidth} is not set to the former value of \len{textheight}. This is inconsistent. As far as I know, \len{textwidth} is left unchanged because setting it to \len{textheight} could interfere with other packages or user commands. But changing \len{textheight} also has this potential, and indeed it breaks, for example, \pkg{showframe} and \pkg{scrlayer} and in consequence also \pkg{scrlayer-scrpage}. Thus it would be best if \len{textheight} too remained unchanged. \pkg*{lscapeenhanced} uses the \pkg{xpatch} package (see \autocite{pkg:xpatch}) to modify the \env{landscape} environment's start macro \cs{landscape} appropriately. Incidentally, the \pkg{pdflscape} package also uses \pkg{lscape}, so \pkg*{lscapeenhanced} affects the functioning of this package too. \section{How to use \texorpdfstring{\pkg*{lscapeenhanced}}{lscapeenhanced}} \label{sec:howtouse} In the document preamble of your document you just can replace \begin{verbatim} \usepackage{lscape} \end{verbatim} by \begin{verbatim} \usepackage{lscapeenhanced} \end{verbatim} to load package \pkg*{lscapeenhanced}. This does still also load package \pkg{lscape} but additionally patches one command of \pkg{lscape} to avoid the issues shown in \autoref{sec:why}. If you want you can alternatively also load both packages explicitly, either \pkg{lscape} before \pkg*{lscapeenhanced} or---if you want---\pkg*{lscapeenhanced} before \pkg{lscape}. This is also useful, if you use a package, that uses \pkg{lscape} itself, i.e., \pkg{pdflscape}. \DescribeOption{pdflscape}% In case of \pkg{pdflscape} you can alternatively replace \begin{verbatim} \usepackage{pdflscape} \end{verbatim} by \begin{verbatim} \usepackage[pdflscape]{lscapeenhanced} \end{verbatim} in which case \pkg*{lscapeenhanced} would load \pkg{pdflscape}. When using a class that uses \pkg{lscape}, the correct operation can be ensured with \begin{verbatim} \AddToHook{package/lscape/after}{\RequirePackage{lscapeenhanced}} \end{verbatim} even before \cs{documentclass}. This requires at least \LaTeX{} 2020/10/01. For older versions of \LaTeX{} you can use \begin{verbatim} \RequirePackage{scrlfile} \AfterPackage{lscape}{\RequirePackage{lscapeenhanced}} \end{verbatim} also before \cs{documentclass}. This would require the \KOMAScript{} package \pkg{scrlfile}\nocite{pkg:scrlfile}. The user interface of \pkg*{lscapeenhanced} is the same as of \pkg{lscape} resp. \pkg{pdflscape}, see \autocite{pkg:lscape:manual}. The only difference is, that the issue explained in \autoref{sec:why} has been fixed. \DescribeOption{lscape} To deactivate the changes of \pkg*{lscapeenhanced} you can use option \opt{lscape=false}. This option can also be changed using \begin{verbatim} \SetKeys[lscapeenhanced]{lscape=false} \end{verbatim} or \begin{verbatim} \SetKeys[lscapeenhanced]{lscape=true} \end{verbatim} after loading the package. % % \iffalse %</doc> % \fi % % \MaybeStop{\printbibliography[heading=bibintoc]\PrintIndex} % % \iffalse %<*package> % \fi % \section{Implementation} % % \pkg*{lscapeenhanced} uses the new \LaTeX{} kernel feature of % key-value-options introduced in \autocite{latexnews35}. So we need at least % \LaTeX{} 2022-06-01: % \begin{macrocode} \ifnum 0=\ifcsname IfFormatAtLeastTF\endcsname \IfFormatAtLeastTF{2022-06-01}{1}{0}% \else 0% \fi\relax \PackageError{lscapeenhanced}{LaTeX kernel too old}{% The package needs at least LaTeX 2022-06-01.\MessageBreak This error is fatal. Loading will be aborted.% }% \endinput \fi \ExplSyntaxOn % \end{macrocode} % % \begin{option}{pdflscape} % \begin{macro}{\@lscapeenhanced@req@packages} % If the option is used (without value!) it just changes the macro % indicating the package that should also be loaded. Package authors % could also define the internal macro \cs{@lscapeenhanced@req@packages}. % \begin{macrocode} \providecommand*{\@lscapeenhanced@req@packages}{lscape} \DeclareKeys{% pdflscape .code = { \renewcommand*{\@lscapeenhanced@req@packages}{lscape,pdflscape} }, pdflscape .usage = load, pdflscape .value_forbidden:n = true } % \end{macrocode} % \end{macro} % \end{option} % % \begin{option}{lscape} % \begin{macro}{\if@lscapeenhanced@lscape} % A switch to allow to activate and deactivate usage of the change. % \begin{macrocode} \newif\if@lscapeenhanced@lscape \@lscapeenhanced@lscapetrue \DeclareKeys{% lscape .if = @lscapeenhanced@lscape, lscape.usage = general, } % \end{macrocode} % \end{macro} % \end{option} % % Processing the options: % \begin{macrocode} \ExplSyntaxOff \ProcessKeyOptions\relax % \end{macrocode} % % Now we can request the base package(s): % \begin{macrocode} \expandafter\RequirePackage\expandafter{\@lscapeenhanced@req@packages} % \end{macrocode} % % As often as possible, we do not redefine macros of \pkg{lscape}, but patch % them using \pkg{xpatch}: % \begin{macrocode} \RequirePackage{xpatch} % \end{macrocode} % % \begin{command}{\landscape} % This command is the beginning of environment \env{landscape}. This has to be % patched using \pkg{xpatch}. % \begin{macrocode} \xpatchcmd{\landscape}{\textheight=\vsize}{% \if@lscapeenhanced@lscape % \end{macrocode} % \begin{macro}{\@outputpage,\@lscapeenhanced@outputpage} % \begin{ilength}{\@lscapeenhanced@textheight} % Here the changed value of \len{textheight} is needed for initialization of % \cs{@colht}. So we patch it to use the new internal % \len{@lscapeenhanced@textheight} instead of \len{textheight}. % \begin{macrocode} \@lscapeenhanced@textheight=\vsize \let\@lscapeenhanced@outputpage\@outputpage \def\@outputpage{% \@lscapeenhanced@outputpage\global\@colht\@lscapeenhanced@textheight }% \else \textheight=\vsize \fi }{% \PackageInfo{lscapeenhanced}{\string\landscape\space patched to make \string\textheight\space change optional}% }{% \PackageWarning{lscapeenhanced}{Cannot patch \string\landscape!\MessageBreak Maybe you are using a unsupported lscape version}% \@lscapeenhanced@lscapefalse } \newlength{\@lscapeenhanced@textheight} % \end{macrocode} % \end{ilength} % \end{macro} % \end{command} % % \iffalse %</package> % \fi % % \Finale % \PrintChanges % % \endinput % Local Variables: % mode: doctex % ispell-local-dictionary: "en_US" % eval: (flyspell-mode 1) % TeX-master: t % eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx")) % End: