texlive[69147] Master: responsive (16dec23)

commits+karl at tug.org commits+karl at tug.org
Sat Dec 16 21:49:07 CET 2023


Revision: 69147
          https://tug.org/svn/texlive?view=revision&revision=69147
Author:   karl
Date:     2023-12-16 21:49:07 +0100 (Sat, 16 Dec 2023)
Log Message:
-----------
responsive (16dec23)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/responsive/
    trunk/Master/texmf-dist/doc/latex/responsive/README
    trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.bib
    trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf
    trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.tex
    trunk/Master/texmf-dist/tex/latex/responsive/
    trunk/Master/texmf-dist/tex/latex/responsive/responsive.sty
    trunk/Master/tlpkg/tlpsrc/responsive.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/responsive/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/responsive/README	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/responsive/README	2023-12-16 20:49:07 UTC (rev 69147)
@@ -0,0 +1,37 @@
+The Responsive Package
+
+Version 0.1
+
+Change font sizes and other typographic details in LaTeX documents depending on
+the page dimensions.
+
+The Responsive package for LaTeX enables dynamic adjustment of document
+elements for various output formats and devices. Key features include:
+
+- Font Size Adjustment: Set the font size to achieve an average number of
+  characters per line, enabling suitable font size selection for various sizes
+  of page formats or devices such as tablets and e-book readers.
+
+- Typographic Scales: Choose from predefined or define custom typographic
+  scales using options such as number and ratio.
+
+- Media Queries: Test document properties using media queries, allowing
+  conditional execution of code based on test results.
+
+- Line Spacing Control: adjust line spacing determining the x-height percentage
+  for enhanced readability.
+
+Copyright: 2023-2023 Michal Hoftich
+
+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 Michal Hoftich.
+


Property changes on: trunk/Master/texmf-dist/doc/latex/responsive/README
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.bib
===================================================================
--- trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.bib	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.bib	2023-12-16 20:49:07 UTC (rev 69147)
@@ -0,0 +1,91 @@
+ at manual{responsive,
+  title = {The Responsive package},
+  author = {Hoftich, Michal},
+  url = {https://github.com/michal-h21/responsive-latex},
+  urldate = {2023-03-30}, 
+  date = {2023-03-28},
+}
+
+ at manual{rmodepdf,
+  title = {Rmodepdf},
+  author = {Hoftich, Michal},
+  url = {https://github.com/michal-h21/rmodepdf},
+  urldate = {2023-03-30}, 
+  date = {2023-03-28},
+}
+ at manual{rdrview,
+  title = {Rdrview},
+  author = {Ernesto Fernández},
+  url = {https://github.com/eafer/rdrview},
+  urldate = {2023-03-30}, 
+  date = {2023-03-28},
+}
+ at manual{luavlna,
+  title = {The Luavlna package},
+  subtitle = {Prevent line breaks after single letter words, units, or academic titles},
+  author = {Hoftich, Michal},
+  url = {https://ctan.org/pkg/luavlna},
+  urldate = {2023-03-30}, 
+  date = {2023-03-28},
+  version = {0.1k},
+}
+
+ at manual{linebreaker,
+  title = {The Linebreaker package},
+  subtitle = {Prevent overflow boxes with LuaLaTeX},
+  author = {Hoftich, Michal},
+  url = {https://ctan.org/pkg/linebreaker},
+  urldate = {2023-03-30}, 
+  date = {2023-03-21},
+  version = {0.1c},
+}
+
+ at manual{lua-widow-control,
+  title = {The Lua-widow-control package},
+  subtitle = {Automatically remove widows and orphans from any document},
+  author = {Chernoff, Max},
+  url = {https://ctan.org/pkg/lua-widow-control},
+  urldate = {2023-03-30}, 
+  date = {2022-11-22},
+  version = {3.0.0},
+}
+
+ at article{chernoff,
+  doi = {10.5300/2022-1-4/49},
+  author = {Chernoff, Max},
+  title = {Automatically Removing Widows and Orphans with lua-widow-control},
+  journal = {Zpravodaj Československého sdružení uživatelů TeXu},
+  volume = {32},
+  number = {1},
+  pages = {49-76},
+  issn = {1211-6661},
+  year = {2022},
+  url = {https://dml.cz/handle/10338.dmlcz/151108}
+}
+
+ at manual{luaxml,
+  title = {The Luaxml package},
+  subtitle = {Lua library for reading and serialising XML files},
+  author = {Hoftich, Michal},
+  url = {https://ctan.org/pkg/luaxml},
+  urldate = {2023-03-30}, 
+  date = {2021-10-06},
+  version = {0.1q},
+}
+
+ at online{mortensen,
+  title = {The Typographic Scale},
+  author = {Spencer Mortensen},
+  year = {2011},
+  url = {https://spencermortensen.com/articles/typographic-scale/},
+  urldate = {2023-03-30}, 
+}
+
+ at article{cavazza,
+  title = {Modern CSS Techniques To Improve Legibility},
+  author = {Edoardo Cavazza},
+  journal = {Smashing Magazine},
+  date = {2020-07-22},
+  url = {https://www.smashingmagazine.com/2020/07/css-techniques-legibility/},
+  urldate = {2023-03-30}, 
+}


Property changes on: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.bib
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf	2023-12-16 20:48:11 UTC (rev 69146)
+++ trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf	2023-12-16 20:49:07 UTC (rev 69147)

Property changes on: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.tex	2023-12-16 20:49:07 UTC (rev 69147)
@@ -0,0 +1,543 @@
+\documentclass{ltxdoc}
+\newcommand\authormail[1]{\footnote{\textless\url{#1}\textgreater}}
+\ifdefined\HCode
+  \renewcommand\authormail[1]{\space\textless\Link[#1]{}{}#1\EndLink\textgreater}
+\fi
+
+\ifdefined\gitdate\else
+  \def\gitdate{\today}
+  \def\version{devel}
+\fi
+
+
+
+% \usepackage[noautomatic]{responsive}
+\usepackage[]{responsive}
+\usepackage{linebreaker}
+\usepackage{caption}
+\usepackage{subcaption}
+\usepackage{graphicx}
+\usepackage{microtype}
+\usepackage{longtable}
+\usepackage{booktabs}
+\usepackage[style=iso-authoryear]{biblatex}
+\addbibresource{responsive-doc.bib}
+\newenvironment{changelog}{\longtable{@{} l p{30em}}}{\endlongtable}
+\newcommand\change[2]{#1 & #2\\}
+\ifdefined\HCode
+  % I want to convert parts of the document to images,
+  % so I need to use Type 1 fonts for the correct conversion with Dvisvgm
+  \usepackage{ebgaramond}
+\else
+\usepackage{fontspec}
+\setmainfont{EB Garamond}[Numbers=OldStyle]
+\setmonofont{Inconsolatazi4-Regular.otf}[Scale=MatchLowercase]
+\fi
+
+\newcommand\StartDescribe[1]{%
+  \par\medskip\noindent\DescribeMacro#1
+}
+\usepackage{lipsum}
+\title{The Responsive Package}
+\author{Michal Hoftich\authormail{michal.h21 at gmail.com}}
+\date{Version \version, \gitdate} 
+\NewDocElement[macrolike = false ,
+toplevel = false,
+idxtype
+= key,
+idxgroup = Package keys,
+% printtype = \textit{key}
+]{Key}{key}
+
+\newcommand\printsize[1]{\csname #1\endcsname\par\noindent Sample\par}
+\newcommand\showscale[2][.5\textwidth]{%
+  \noindent\fbox{%
+    \begin{minipage}{#1}
+      \ResponsiveSetup{#2}
+      \setsizes[34]{25}
+      \printsize{huge}
+      \printsize{LARGE}
+      \printsize{Large}
+      \printsize{large}
+      \hrule
+      \printsize{normalsize}
+      \hrule
+      \printsize{small}
+      \printsize{footnotesize}
+    \end{minipage}
+  }
+    \ifx\relax#2\relax Default parameters\else\texttt{#2}\fi\hfill\null
+}
+\makeindex
+
+\begin{document}
+\maketitle
+\begin{abstract}
+Responsive design aims to display text and other design elements well on
+variety of outputs, including electronic devices or various paper sizes.
+It originated on the Web, where it uses Cascading Style Sheets to change 
+design elements. 
+
+This package tries to achieve similar result with \LaTeX. The main aim is to 
+support output of multiple editions of one document with 
+readable font sizes regardless of the physical size of the produced PDF,
+from smartphones or e-ink readers to printed A4 pages.
+\end{abstract}
+
+\clearpage
+
+\tableofcontents
+
+\section{Introduction}
+
+This package aims to facilitate the creation of documents for multiple output
+formats, such as various page sizes, e-book readers, or even mobile phones.
+
+One of the issues that needs to be addressed is setting the correct font size
+for readability. The default font size in LaTeX is 10 points, regardless of the
+page size. This is an appropriate font size for A5 format pages. For A4 format,
+the font size should be larger, while it may be smaller for smaller displays of
+e-readers and mobile phones. Similarly, we can adjust the line spacing, which
+also affects text readability depending on the font size and page size.
+
+Web browsers face a similar problem as they must display text on both large PC
+monitors and smaller displays of laptops, tablets, and mobile phones. The
+solution they use is called \textit{responsive design}.
+
+Responsive design is a method of web design that allows flexible and dynamic
+adaptation of the appearance and layout of page content to different display
+devices. One of the key elements of responsive design is a flexible structure
+that enables adjusting the size of elements on the page to the display device.
+
+Another important element is media queries. These allow defining rules based on
+the properties of the display device, such as screen width and height or output
+type (paper, display). Thanks to these rules, the same page code can be
+well-displayed on both large monitors and mobile devices or when printing. 
+
+The Responsive package is inspired by these principles. Its main function
+is to set the font size based on the page size and the approximate number of
+characters that should fit on the page (see figure~\ref{fig:example}). It also adjusts the typographic scale
+(influencing font size, for example, in headings or footnotes), line height,
+and supports a simple version of media queries.
+
+
+\section{Features}
+
+
+\subsection{Fitting Font Size to the Page Size}
+
+Regardless of the width of the page, there is a certain range of the number of
+characters that should be displayed on average per line of text to ensure good
+readability. With a larger number of characters, the reader may have difficulty
+quickly moving to the next line, while shorter lines may lead to skipping
+lines. 
+
+The Responsive package automatically sets the width of the text to a chosen number of characters.
+Figure~\ref{fig:example} shows a difference in the font size in two
+different text widths.
+
+
+\begin{figure}[htbp]
+  \caption{Example of changing font size based on the width of the text block:}\label{fig:example}
+\begin{subfigure}[t]{0.45\textwidth}
+  \centering
+\fbox{%
+\begin{minipage}{4cm}
+\ResponsiveSetup{}
+\setsizes{}
+
+\lipsum[1]
+
+\end{minipage}}
+\caption{Text width 4\,cm}
+\end{subfigure}
+% \hfill
+\begin{subfigure}[t]{0.45\textwidth}
+  \centering
+\fbox{%
+\begin{minipage}{6cm}
+\ResponsiveSetup{}
+\setsizes{}
+
+% \lipsum[1]
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
+vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida
+mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a,
+magna. Donec vehicula augue eu neque. Pellentesque habitant morbi
+tristique senectus et netus et malesuada fames ac turpis egestas. Mauris
+ut leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
+fringilla ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer
+sapien est, iaculis in, pretium quis, viverra ac, nunc.
+
+\end{minipage}}
+\caption{Text width 6\,cm}
+\end{subfigure}
+\end{figure}
+
+
+\subsection{Typographic Scale}
+
+The typographic scale is a set of predetermined font sizes used to establish a
+consistent visual style for a document or website. These sizes are typically
+expressed in point units and progressively increase or decrease by a specific
+interval along the scale.
+
+A typographic scale may include sizes for headings, footnotes, and body text.
+Proper use of a typographic scale helps create a visual hierarchy that enhances
+the readability and aesthetic appeal of the text. 
+
+In \LaTeX, the typographic scale is accessible through commands such as \verb|\large|,
+\verb|\huge|, or \verb|\scriptsize|. Each of these commands is one interval
+away from the previous size. 
+
+I drew inspiration from Spencer Mortensen's article (\citeyear{mortensen}), which defines several
+different typographic scales and provides a method for easily creating
+additional scales.
+The default scale in the Responsive package,
+which closely aligns with the scale used in \LaTeX, is referred to as \verb|tetratonic|.
+The package also offers additional scales described in the
+article, such as the golden scale based on the golden ratio. 
+See Figure~\ref{fig:scale} for differences between the default scale and scale based on the 
+golden ratio.
+
+The Responsive package includes several predefined typographic scales, but you
+can also define your own. All scales are defined using the options
+\verb|number| and \verb|ratio|, specifying how many steps (\verb|number|) the
+font size increases by the size of \verb|ratio|. For example scale with \verb|number| of 2
+and \verb|ratio| of 5, will double the font size over 5 steps.
+Table~\ref{tbl:scales} lists all predefined scales.
+
+\begin{table}[htbp]
+  \centering
+  \begin{tabular}{l l l}
+    \toprule
+    name & number & ratio\\
+    \midrule
+    heptatonic & 7 & 2\\
+    pentatonic & 5 & 2\\
+    tetratonic & 4 & 2\\
+    tritonic & 3 & 2\\
+    golden & 2 & 1.618\\\bottomrule
+  \end{tabular}
+  \caption{Predefined typographic scales}\label{tbl:scales}
+\end{table}
+
+
+\begin{figure}[htbp]
+  \caption{Sample of Typographic Scales (the default font size is highlighted with lines)}\label{fig:scale}
+  \begin{subfigure}[b]{0.45\textwidth}
+\fbox{%
+\begin{minipage}{5cm}
+\setsizes{45}
+
+\showscale{}
+
+\end{minipage}}
+\caption{Default scale}
+\end{subfigure}
+\begin{subfigure}[b]{0.45\textwidth}
+% \begin{verbatim}
+% \ResponsiveSetup{scale=golden}
+% \end{verbatim}
+\fbox{%
+\begin{minipage}{5cm}
+% \ResponsiveSetup{scale=golden}
+\setsizes{45}
+
+\showscale{scale=golden}
+
+\end{minipage}}
+\caption{Golden ratio scale}
+\end{subfigure}
+\end{figure}
+% % https://spencermortensen.com/articles/typographic-scale/
+
+
+
+% \showscale{}
+% \showscale{scale=heptatonic}
+% \showscale{scale=tritonic}
+% \showscale{scale=golden}
+% \showscale{scale=none,ratio=1.3,number=2}
+
+\subsection{Line height}
+
+In the default settings of \LaTeX, the line spacing is set to the font size
+multiplied by a factor of 1.2. For different fonts and page sizes, a different
+line spacing may be appropriate. Similarly, distinct values may be suitable for
+the printed and electronic versions of the document. 
+
+The Responsive package provides two options which allows you to change the line spacing
+(Figure~\ref{fig:lineratio}). 
+
+First is the  \verb|lineratio| option, which bases the line height 
+on the ratio between x-height of the current font and the desired height. 
+I've found this method in article by Edoardo Cavazza in the \textit{Smashing Magazine}~(\citeyear{cavazza}).
+The value of the \verb|lineratio| option determines what percentage of the total line
+height is the \verb|x-height|. The higher this value, the lower the line will be. For
+different fonts, the same ratio may lead to different line heights because each
+font has a different \verb|x-height| value. The appropriate lineratio size needs to be
+determined experimentally. The default value should roughly correspond to a
+line height of 1.2, the default in \LaTeX.
+
+Another option is \verb|lineheight|, which
+is similar to the CSS property \verb|line-height|. Using it, we can choose the
+line height as a multiple of the font size.
+
+
+
+
+\begin{figure}[htbp]
+  \caption{Changing the line spacing by adjusting the value of \texttt{lineratio}.}\label{fig:lineratio}
+  \begin{subfigure}[b]{0.45\textwidth}
+\fbox{%
+\begin{minipage}{5cm}
+\ResponsiveSetup{lineratio=38}
+\setsizes{65}
+
+\lipsum[1]
+
+\end{minipage}}
+\caption{lineratio=38}
+\end{subfigure}
+\begin{subfigure}[b]{0.45\textwidth}
+\fbox{%
+\begin{minipage}{5cm}
+\ResponsiveSetup{lineratio=34}
+\setsizes{65}
+
+\lipsum[1]
+
+\end{minipage}}
+\caption{lineratio=34}
+\end{subfigure}
+\end{figure}
+
+% https://www.smashingmagazine.com/2020/07/css-techniques-legibility/
+
+\subsection{Media Queries}
+
+Media queries are a technique that allows web developers to dynamically adapt
+the appearance and behavior of websites based on various device properties,
+such as screen width and height, device orientation, color support, and more.
+Thanks to these conditions, responsive and flexible websites can be created
+that automatically adjust to different types and sizes of devices on which they
+are displayed.
+
+How can this technique be useful for \LaTeX\ package authors? They could, for
+example, set the font size, line spacing, and other elements for specific page
+dimensions. Once the user chooses the page size based on the device size for
+which they want to compile the document, these elements are automatically
+adjusted. For instance, a package author could define that if the width of the
+text block is smaller than a certain dimension, fewer characters will be
+displayed on each line compared to longer lines (Figure~\ref{fig:mediaquery}). 
+
+The media query used for this figure looks like this:
+
+\begin{verbatim}
+\mediaquery{max-textwidth=4cm}
+{\ResponsiveSetup{lineratio=38}\setsizes{45}}
+\ResponsiveSetup{lineratio=34}\setsizes{60}}
+\end{verbatim}
+
+This media query defines that if the width of the text is smaller than or equal to 4 cm, a
+smaller number of characters will be displayed per line to prevent the font
+from being too small and difficult to read. Additionally, a smaller line
+spacing will be applied.
+
+
+
+\newcommand\mdtest{%
+  \mediaquery{max-textwidth=4cm}
+  {\ResponsiveSetup{lineratio=38}\setsizes{45}}
+  {\ResponsiveSetup{lineratio=34}\setsizes{60}}
+  \lipsum[1]
+}
+
+\begin{figure}[htbp]
+  % \centering
+  % \begin{subcaptionblock}{0.25\textwidth}
+  \caption{Change number of characters and line spacing depending on the text width using Media queries}\label{fig:mediaquery}
+  % \begin{subcaptiongroup}
+  \begin{subfigure}[t]{0.40\textwidth}
+    \centering
+    \begin{minipage}{4cm}
+      { \mdtest
+        
+      }
+    \end{minipage}
+    \caption{Text width of 4\,cm with 45 characters}
+  \end{subfigure}
+  \hfill
+    % \hspace{2em}
+  \begin{subfigure}[t]{0.55\textwidth}
+    \centering
+    \begin{minipage}{6cm}
+      { \mdtest 
+
+      }
+    \end{minipage}
+  \caption{Text width of 6\,cm with 60 characters}
+  \end{subfigure}
+  
+\end{figure}
+
+The tests available in media queries are listed in Table~\ref{tbl:mediaqueries}.
+Those expecting dimensional units also have variants using \texttt{min-} and \texttt{max-}, which
+do not test exact values but rather whether the provided value is less than, 
+greater than, or equal to the tested parameter. Tests without these variants evaluate for an exact match.
+The test for a two-column layout is special in that it does not expect any
+testing values. It evaluates to true if the document uses the \texttt{twocolumn} option.
+
+
+
+\begin{table}[htbp]
+  \centering
+  \begin{tabular}{ll}
+    \toprule
+    test & possible values \\
+    \midrule
+    textwidth & dimensional unit \\
+    textheight & dimensional unit \\
+    paperwidth & dimensional unit\\
+    paperheight & dimensional unit\\
+    orientation & landscape, portrait\\
+    twocolumn & none \\
+    \bottomrule
+  \end{tabular}
+  \caption{Tests available in media queries}\label{tbl:mediaqueries}
+\end{table}
+
+
+
+
+\section{Package Options}
+
+The following options can be passed as package options used in \cmd{\usepackage}, 
+or later in the document using the \cmd{\ResponsiveSetup} command.
+
+\medskip
+
+\noindent \DescribeKey{characters} Approximate number of characters that should fit to a text line. Default value is 66.
+
+\noindent \DescribeKey{noautomatic}  Disable automatic setting of font sizes, line spacing and typographic scale in the document. You can set them 
+later using the \cmd{\setsizes} and \cmd{\ResponsiveSetup} commands.
+
+\noindent \DescribeKey{scale} Select named typographic scale. Default scale is
+\texttt{tetratonic}, which is the most similar to the default scale used by
+\LaTeX.
+
+\noindent \DescribeKey{number} The number of steps during which the text size is multiplied by the amount specified in the \texttt{ratio} option.
+
+\noindent \DescribeKey{ratio} The amount by which the font size will increase over a given number of steps.
+
+\noindent \DescribeKey{lineratio} The ratio used in calculating the line spacing. Default value is 33.3333, which should produce similar line spacing as the default \LaTeX\ setting.
+
+\noindent \DescribeKey{lineheight} Calculate line spacing by a fixed ratio, similarly to the CSS \texttt{lineheight} property.
+
+\noindent \DescribeKey{boxwidth} Width of line that is used for font size calculations in the \cmd{\setsizes} command. Default value is \cmd{\textwidth}.
+
+
+
+
+\section{Commands}
+
+\StartDescribe\ResponsiveSetup
+\cmd\ResponsiveSetup\marg{options}
+
+\noindent It allows you to reset the package options later in the document. You
+need to call the \cmd{\setsizes} command to reset font sizes explicitly if you use this command
+outside of the document preamble, or when using the \texttt{noautomatic} option.
+
+\StartDescribe\setsizes
+\cmd\setsizes\oarg{line height ratio}\marg{number of characters per line}
+
+\noindent It sets the text size so that the specified average number of
+characters fit on a line. If you do not provide the number of characters, the
+package option \texttt{characters} will be used.
+
+
+\StartDescribe\fonttobox
+\cmd\fonttobox\oarg{line height ratio}\marg{text width}\marg{text}
+
+\noindent Set the text size so that the specified text in the second parameter has
+the specified size in the first parameter. Optionally, you can set the line
+height ratio.
+
+\StartDescribe\mediaquery
+\cmd\mediaquery\marg{media query test}\marg{true code}\marg{false code}
+
+\noindent
+It tests the document's properties using media queries and executes code based on the test results.
+The code can typically use \cmd\ResponsiveSetup, but you can also execute any other commands.
+
+\StartDescribe\DeclareMediaQueryMatcher
+\cmd\DeclareMediaQueryMatcher\marg{test name}\marg{\LaTeX\ 3 boolean query test}
+
+\noindent Declares a new test for a media query. The tests can use LaTeX 3 boolean tests,
+and in case of a positive result, it must execute the command 
+\cmd\mediaquerytrue.
+
+\StartDescribe\fixtextheight
+\cmd\fixtextheight
+
+\noindent It adjusts the page height, header, and footer to prevent underflow
+\cmd{\vbox} warnings in the output routine.
+
+
+
+\section{Troubleshooting}
+
+Occasionally, you can run into issues caused by the change of font sizes. \LaTeX\ sets lot of parameters 
+depending on the base font size. We try to recalculate them according to the new font size, but you can still
+experience some issues, described in following subsections.
+
+\subsection{Underfull \texttt{\textbackslash vbox} warning}
+
+Occasionally, you can get the following warning:
+
+\begin{verbatim}
+Underfull \vbox (badness 6412) has occurred while \output is active []
+\end{verbatim}
+
+We calculate the page height that suits  for the font size, but often,
+we would get error when a bigger font is used on the page,
+for example in chapters. When you set font sizes in the document preamble,
+text height should be changed automatically. If you reset font sizes later in the
+document, you need to use the \cmd{\fixtextheight} command. It should help in
+most cases. If not, you can try the following hack.
+This trick should fix \cmd{\vbox} errors in the output routine, but it can lead 
+to an irregular number of lines on pages.
+
+
+\begin{verbatim}
+\ExplSyntaxOn
+\def\@textbottom{\vskip \z@ \@plus \resp_font_size \@minus \resp_font_size}
+\ExplSyntaxOff
+\end{verbatim}
+
+\section{License}
+
+Permission is granted to copy, distribute and/or modify this software
+under the terms of the \LaTeX\ Project Public License, version 1.3.
+
+
+\section{Changes}
+
+\begin{changelog}
+  \change{2023-12-13}{Version 0.1 released.}
+  \change{}{Finished documentation.}
+  \change{2023-12-07}{Added the \texttt{lineheight} property.}
+  \change{}{Use floating point numbers for the lineratio.}
+  \change{2023-12-06}{ChangeLog started.}
+\end{changelog}
+% \section{Examples}
+% \PrintIndex
+
+\printbibliography[heading=bibintoc]
+
+
+
+
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/responsive/responsive-doc.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/responsive/responsive.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/responsive/responsive.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/responsive/responsive.sty	2023-12-16 20:49:07 UTC (rev 69147)
@@ -0,0 +1,368 @@
+% support for responsive font size, based on the document dimensions
+\ProvidesPackage{responsive}
+\RequirePackage{expl3,l3keys2e}
+\RequirePackage{kvoptions}
+\ProvidesExplPackage{responsive}
+{2023-12-15}{0.1}{Responsive design for LaTeX}
+
+%%%%%%%%%%%%%%%%%%%%%%
+% keyval  processing %
+%%%%%%%%%%%%%%%%%%%%%%
+
+% numbers of characters that should fit on the line
+\int_new:N\l_resp_charlines_int
+\l_resp_charlines_int = 66
+
+% line height ratio
+% see https://www.smashingmagazine.com/2020/07/css-techniques-legibility/
+% for more details
+\fp_new:N\l_resp_lineheight_ratio
+% this value corresponds to lineheight with  1.2
+\fp_set:Nn\l_resp_lineheight_ratio{33.33333}
+
+% alternatively, we can use lineheight
+\fp_new:N\l_resp_lineheight
+
+% this is used in line spacing, the idea is to make larger spacing
+% for larger font sizes, but I need to find a better calculation method,
+% as it doesn't work well for now
+\fp_new:N\l_resp_lineheight_multiplier
+\fp_set:Nn\l_resp_lineheight_multiplier{1}
+
+
+% type of typograhic scale
+\tl_new:N\l_resp_scaletype_str
+\tl_set:Nn\l_resp_scaletype_str {tetratonic}
+
+% these numbers are used in the typo scale calculation
+\fp_new:N\l_resp_scalen_fp 
+\fp_new:N\l_resp_scaler_fp
+
+\bool_new:N\l_resp_no_execute
+\bool_set_false:N\l_resp_no_execute  
+
+\tl_new:N\l_resp_boxwidth
+\tl_set:Nn \l_resp_boxwidth \textwidth
+
+\keys_define:nn {responsive} {
+  characters .int_set:N = \l_resp_charlines_int,
+  noautomatic .bool_set:N = \l_resp_no_execute,
+  number .fp_set:N = \l_resp_scalen_fp,
+  ratio .fp_set:N =\l_resp_scaler_fp,
+  scale .tl_set:N = \l_resp_scaletype_str,
+  lineratio .fp_set:N = \l_resp_lineheight_ratio,
+  lineheight .fp_set:N = \l_resp_lineheight,
+  lineheight .default:n = 0,
+  boxwidth .tl_set:N = \l_resp_boxwidth,
+}
+
+
+\ProcessKeysOptions{responsive}
+
+% the \l_resp_charlist_tl is used to construct string used for line length measurement
+\str_new:N\l_resp_alphabet_tl
+\str_new:N\l_resp_charlist_tl
+% construct really long string that will enable to measure wide number of characters 
+% on a text line
+\str_set:Nn\l_resp_alphabet_tl{abcdefghijklmnopqrstuvwxyz}
+\str_set:NV\l_resp_charlist_tl{
+  \l_resp_alphabet_tl\l_resp_alphabet_tl\l_resp_alphabet_tl
+  \l_resp_alphabet_tl\l_resp_alphabet_tl\l_resp_alphabet_tl
+  \l_resp_alphabet_tl\l_resp_alphabet_tl\l_resp_alphabet_tl
+  \l_resp_alphabet_tl\l_resp_alphabet_tl\l_resp_alphabet_tl
+}
+
+
+
+
+\NewDocumentCommand\ResponsiveScale{O{\l_resp_scaletype_str}}{
+  % decide which typographic scale should be used in \setfontsize
+  \str_case_e:nn{\l_resp_scaletype_str}{
+    {heptatonic}{
+      \fp_set:Nn\l_resp_scaler_fp{2}
+      \fp_set:Nn\l_resp_scalen_fp{7}
+    }
+    {pentatonic}{
+      \fp_set:Nn\l_resp_scaler_fp{2}
+      \fp_set:Nn\l_resp_scalen_fp{5}
+    }
+    {tetratonic}{
+      \fp_set:Nn\l_resp_scaler_fp{2}
+      \fp_set:Nn\l_resp_scalen_fp{4}
+    }
+    {tritonic}{
+      \fp_set:Nn\l_resp_scaler_fp{2}
+      \fp_set:Nn\l_resp_scalen_fp{3}
+    }
+    {golden}{
+      \fp_set:Nn\l_resp_scaler_fp{1.618}
+      \fp_set:Nn\l_resp_scalen_fp{2}
+    }
+    {none}{}
+  }
+}
+
+% set default scale
+\ResponsiveScale
+
+% enable setting of the keys also in the document
+\NewDocumentCommand\ResponsiveSetup{m}{%
+  \keys_set:nn {responsive} {#1}
+  \ResponsiveScale
+}
+
+\dim_new:N\resp_font_size
+\dim_new:N\resp_line_skip
+
+% change font size to fix text to a given width
+% usage \fonttobox{\textwidth}{hello world}
+% optional parameter changes line spacing, smaller the value, bigger the spacing
+% details about the value are in the following article:
+% https://www.smashingmagazine.com/2020/07/css-techniques-legibility/
+\NewDocumentCommand\fonttobox{O{\l_resp_lineheight_ratio} m m}{
+  % set initial fontsize and typeset text in a box
+  \dimen1=#2\relax%
+  \fontsize{10}{12}\selectfont%
+  \setbox0=\hbox{#3}%
+  % calculate ratio betwen the typeset box and desired width
+  \resp_font_size=\fp_to_dim:n {\f at size * (\dim_to_fp:n{\dimen1} / \dim_to_fp:n{\wd0})}%
+  % calculate line height. inspired by https://www.smashingmagazine.com/2020/07/css-techniques-legibility/
+  \resp_line_skip=\fp_to_dim:n {\dim_to_fp:n{1ex} * (\dim_to_fp:n{\dimen1} / \dim_to_fp:n{\wd0}) / (#1/100)}
+  \fontsize{\resp_font_size}{\resp_line_skip}\selectfont%
+  \typeout{calculated~font~size: \fp_to_dim:n {\dim_to_fp:n{\dimen1} / \dim_to_fp:n{\wd0}}, \f at size, \the\baselineskip}%
+}
+
+
+% calculate typographic scale 
+% based on formula from https://spencermortensen.com/articles/typographic-scale/
+% #1 - base size, #2, number of note, #3 r, #4 n
+\NewDocumentCommand\typoscale{m m m m}{%
+  \fp_to_dim:n{\dim_to_fp:n{#1} * (#3 ^ (#2/#4)) }
+}
+
+
+% calculate font size for the given note and multiply it
+% #1 base font size #2 number of note, #3 multiplication factor
+\cs_set:Npn\resp_multiply_note:nnn #1#2#3{
+  \fp_to_dim:n{\dim_to_fp:n{#1} * (\l_resp_scaler_fp ^ (#2/\l_resp_scalen_fp)) * #3 }
+}
+
+% calculate font size for the given note and multiply it
+% #1 number of note, #2 multiplication factor
+\cs_set:Npn\resp_multiply_font_size:nn #1#2{
+  % \fp_to_dim:n{\dim_to_fp:n{\resp_font_size} * (\l_resp_scaler_fp ^ (#1/\l_resp_scalen_fp)) * #2 }
+  \resp_multiply_note:nnn\resp_font_size{#1}{#2}
+}
+
+% Copy of skip setting commands from size10.clo
+% Instead of hardcoded values, we use calculations based on the font size
+\cs_set:Npn\resp_skips:n #1{
+  \abovedisplayskip \resp_multiply_font_size:nn{#1}{1} \@plus\resp_multiply_font_size:nn{#1}{0.2} \@minus\resp_multiply_font_size:nn{#1}{0.5}
+  \abovedisplayshortskip \z@ \@plus\resp_multiply_font_size:nn{#1}{0.3}
+  \belowdisplayshortskip \resp_multiply_font_size:nn{#1}{0.6} \@plus\resp_multiply_font_size:nn{#1}{0.3} \@minus\resp_multiply_font_size:nn{#1}{0.3}
+  \belowdisplayskip \abovedisplayskip
+}
+
+% #1 font command, #2 note number
+\cs_set:Npn\resp_set_font_size:Nn #1#2{%
+  \@setfontsize#1{\resp_multiply_note:nnn\resp_font_size{#2}{1}}{\resp_multiply_note:nnn\resp_line_skip{#2}{\l_resp_lineheight_multiplier}}
+}
+
+% recalculate \textheight and \headheight with the changed font size
+% this is necessary to prevent the underfull \vbox messages from the output rutine
+\cs_set:Npn\resp_textheight:n {
+  % divide original textheight by the current baseline size - this gives us the number of lines that will fit
+  % then multipy it by the baseline again, to get the new \textheight
+  \setlength\textheight{\fp_to_dim:n{floor(\textheight/\resp_line_skip) * \resp_line_skip }}
+  \setlength\topskip{\resp_line_skip}
+  % \setlength\topskip{\resp_font_size}
+  \addtolength\textheight{\topskip}
+  \setlength\maxdepth{0.5\topskip}
+  \setlength\@maxdepth{0.5\topskip}
+  \setlength\headheight{\resp_font_size}
+  \setlength\headsep   {1.5\resp_font_size}
+  \setlength\footskip{\fp_to_dim:n{2*\resp_font_size+1}}
+}
+
+% the functionality to fix the textheight should be available as a document command
+\NewDocumentCommand\fixtextheight{}{%
+  \resp_textheight:n%
+}
+
+\cs_set:Npn\resp_declare_font_sizes{%
+  \DeclareRobustCommand\normalsize{\resp_set_font_size:Nn\normalsize{0}\resp_skips:n{1}}%
+  \DeclareRobustCommand\tiny{\resp_set_font_size:Nn\tiny{-3}}
+  \DeclareRobustCommand\scriptsize{\resp_set_font_size:Nn\scriptsize{-2}}
+  \DeclareRobustCommand\small{\resp_set_font_size:Nn\small{-1}\resp_skips:n{-1}}
+  \DeclareRobustCommand\footnotesize{\resp_set_font_size:Nn\footnotesize{-2}\resp_skips:n{-2}}
+  \DeclareRobustCommand\large{\resp_set_font_size:Nn\large{1}}
+  \DeclareRobustCommand\Large{\resp_set_font_size:Nn\Large{2}}
+  \DeclareRobustCommand\LARGE{\resp_set_font_size:Nn\LARGE{3}}
+  \DeclareRobustCommand\huge{\resp_set_font_size:Nn\huge{4}}
+  \DeclareRobustCommand\Huge{\resp_set_font_size:Nn\Huge{5}}
+}
+
+
+% #1 line spacing ratio 
+% #2 number or characters that should fit to a text line
+\NewDocumentCommand\setsizes{O{\l_resp_lineheight_ratio} m}{%
+  \ifx\relax#2\relax
+    \int_set_eq:NN\l_tmpa_int\l_resp_charlines_int
+  \else
+    \int_set:Nn\l_tmpa_int{#2}
+  \fi
+  % if lineheight is set directly, we need to calculate lineheight_ratio,
+  % because it is used on a lot of places
+  \fp_compare:nTF{\l_resp_lineheight=0}{}{
+    % divide "x" size by desired line spacing (font size * lineheight)
+    % lineheight should be ratio, for example 1.2, which is used by default in LaTeX
+    \fp_set:Nn\l_resp_lineheight_ratio{\fp_eval:n{(\dim_to_fp:n{1ex} / (\f at size * \l_resp_lineheight))*100}}
+  }
+  \fonttobox[#1]{\l_resp_boxwidth}{\tl_range:Nnn\l_resp_charlist_tl{1}{\l_tmpa_int}}%
+  \resp_declare_font_sizes%
+  \normalsize%
+  \if at twocolumn
+    \parindent=\resp_font_size
+  \else
+    \parindent=\fp_to_dim:n{\resp_font_size * 1.5}
+  \fi
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Media query support %%
+%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\prop_new:N \l_responsive_media_query
+\bool_new:N \l_responsive_media_query_matched
+
+
+% define new test for a media query
+% #1 name of test
+% #2 test that can be used in LaTeX 3 boolean query
+\NewDocumentCommand\DeclareMediaQueryMatcher{m m}{
+  \cs_set:cpn{responsive_query_test:#1}##1{#2}
+}
+
+% this command should be used by media query tests to symbolize that they were successful
+\NewDocumentCommand\mediaquerytrue{}{\bool_set_true:N\l_responsive_media_query_matched}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%
+%% media query tests %%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%  tests if the passed dimension is larger than paperwidth
+\DeclareMediaQueryMatcher{max-paperwidth}{
+  \dim_compare:nT{\paperwidth<=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is smaller than paperwidth
+\DeclareMediaQueryMatcher{min-paperwidth}{
+  \dim_compare:nT{\paperwidth>=#1}{\mediaquerytrue}
+}
+
+% match exaxt paperwidth
+\DeclareMediaQueryMatcher{paperwidth}{
+  \dim_compare:nT{\paperwidth=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is larger than paperheight
+\DeclareMediaQueryMatcher{max-paperheight}{
+  \dim_compare:nT{\paperheight<=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is smaller than paperheight
+\DeclareMediaQueryMatcher{min-papeheight}{
+  \dim_compare:nT{\paperheight>=#1}{\mediaquerytrue}
+}
+
+% match exaxt paperheight
+\DeclareMediaQueryMatcher{paperheight}{
+  \dim_compare:nT{\paperheight=#1}{\mediaquerytrue}
+}
+
+
+%  tests if the passed dimension is smaller than textwidth
+\DeclareMediaQueryMatcher{max-textwidth}{
+  \dim_compare:nT{\textwidth<=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is larger than textwidth
+\DeclareMediaQueryMatcher{min-textwidth}{
+  \dim_compare:nT{\textwidth>=#1}{\mediaquerytrue}
+}
+
+% match exaxt textwidth
+\DeclareMediaQueryMatcher{textwidth}{
+  \dim_compare:nT{\textwidth=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is larger than textheight
+\DeclareMediaQueryMatcher{max-textheight}{
+  \dim_compare:nT{\textheight<=#1}{\mediaquerytrue}
+}
+
+%  tests if the passed dimension is smaller than textheight
+\DeclareMediaQueryMatcher{min-textheight}{
+  \dim_compare:nT{\textheight>=#1}{\mediaquerytrue}
+}
+
+% match exaxt textheight
+\DeclareMediaQueryMatcher{textheight}{
+  \dim_compare:nT{\textheight=#1}{\mediaquerytrue}
+}
+
+% test if the current page is in landscape mode
+% we assume that if \paperwidth / \paperheight > 1 then we are in the landscape mode
+\DeclareMediaQueryMatcher{orientation}{
+  \str_if_eq:nnTF{#1}{landscape}{
+    \fp_compare:nT{\dim_ratio:nn{\paperwidth}{\paperheight} > 1}{\mediaquerytrue}
+  }{
+    \fp_compare:nT{\dim_ratio:nn{\paperwidth}{\paperheight} < 1}{\mediaquerytrue}
+  }
+}
+
+\DeclareMediaQueryMatcher{twocolumn}{%
+  \if at twocolumn\mediaquerytrue\fi
+}
+
+
+% find if handler exists for the passed media query type and execute it
+\cs_set:Npn \l_responsive_handle_media_query#1#2{
+  \cs_if_exist_use:cTF{responsive_query_test:#1}{{#2}}{\PackageWarning{responsive}{Unknown~media~query~test:~#1=#2}}
+}
+
+% #1 - media query
+% #2 - code executed when query matches
+% #3 - code executed when query fails
+\NewDocumentCommand\mediaquery{m m m}{
+  % change the list of media queries to a property list, which we can loop over
+  \prop_set_from_keyval:Nn\l_responsive_media_query{#1}
+  % loop over all media queries
+  \prop_map_inline:Nn\l_responsive_media_query{
+    % initialize boolean condition for media queries
+    \bool_set_false:N\l_responsive_media_query_matched
+    % the media query handler must use \mediaquerytrue if the query matches
+    \l_responsive_handle_media_query{##1}{##2}
+    % escape the loop immediately if the query doesn't run \mediaquerytrue
+    \bool_if:NF\l_responsive_media_query_matched{\prop_map_break:}
+  }
+  %
+  \bool_if:NTF\l_responsive_media_query_matched{#2}{#3}
+
+}
+
+
+
+% setup font sizes at the begin document, in order to support Geometry etc.
+\AtBeginDocument{
+  % set the default font size, based on numbers of characters we want to show on a line of text
+  % \fonttobox[32]\textwidth{\tl_range:Nnn\l_resp_charlist_tl{1}{\l_resp_charlines_int}}%
+  \bool_if:NTF\l_resp_no_execute {}{
+    \setsizes{\l_resp_charlines_int}
+    \fixtextheight
+  }
+}
+
+
+
+\endinput


Property changes on: trunk/Master/texmf-dist/tex/latex/responsive/responsive.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-12-16 20:48:11 UTC (rev 69146)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-12-16 20:49:07 UTC (rev 69147)
@@ -723,7 +723,8 @@
     refcheck refcount refenums reflectgraphics refman refstyle
     regcount regexpatch register regstats
     reledmac relenc relsize reotex repeatindex repere repltext
-    rerunfilecheck rescansync resmes resolsysteme resphilosophica rest-api
+    rerunfilecheck rescansync resmes resolsysteme
+    resphilosophica responsive rest-api
     resumecls resumemac returntogrid reverxii revquantum revtex revtex4-1
     rgltxdoc ribbonproofs rit-fonts rjlparshap rlepsf rmathbr rmpage
     robotarm roboto robust-externalize robustcommand robustindex rojud

Modified: trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2023-12-16 20:48:11 UTC (rev 69146)
+++ trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2023-12-16 20:49:07 UTC (rev 69147)
@@ -1160,6 +1160,7 @@
 depend repltext
 depend rescansync
 depend resmes
+depend responsive
 depend returntogrid
 depend rgltxdoc
 depend rjlparshap

Added: trunk/Master/tlpkg/tlpsrc/responsive.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.