% \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 .
%
% Development is taking place as part of `scrhack' at
% . 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|package>
%\ProvidesPackage{lscapeenhanced}
[2024-04-16 v1.0
% sources and unpack driver of
improved lscape 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}
%
%\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
%
% \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
%
% \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: