diff options
author | Karl Berry <karl@freefriends.org> | 2024-11-11 16:55:06 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-11-11 16:55:06 +0000 |
commit | c7523a416aa442151e80be3a262491b057179f46 (patch) | |
tree | 2fc13ac3845ae40dc4c9ee40c6e89ecf285459aa /Master/texmf-dist/doc | |
parent | fbaa4104576af33a9409d962f93f8747b7e8daed (diff) |
scaletextbullet (10nov24)
git-svn-id: svn://tug.org/texlive/trunk@72818 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
-rw-r--r-- | Master/texmf-dist/doc/latex/scaletextbullet/README.txt | 6 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/scaletextbullet/beery.cls | 290 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.pdf | bin | 0 -> 62498 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.tex | 224 |
4 files changed, 520 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/scaletextbullet/README.txt b/Master/texmf-dist/doc/latex/scaletextbullet/README.txt new file mode 100644 index 00000000000..935ecf74089 --- /dev/null +++ b/Master/texmf-dist/doc/latex/scaletextbullet/README.txt @@ -0,0 +1,6 @@ +Package: scaletextbullet -- Resize the \textbullet without changing its +vertical center +Copyright: 2024 (c) Oliver Beery <beeryoliver@gmail.com> +CTAN: <ADD CTAN LINK HERE> +Repository: https://github.com/beeryoliver/scaletextbullet +License: The LaTeX Project Public License 1.3c diff --git a/Master/texmf-dist/doc/latex/scaletextbullet/beery.cls b/Master/texmf-dist/doc/latex/scaletextbullet/beery.cls new file mode 100644 index 00000000000..33feda99eff --- /dev/null +++ b/Master/texmf-dist/doc/latex/scaletextbullet/beery.cls @@ -0,0 +1,290 @@ +% Note: This class is designed ONLY for 'scaletextbullet.tex'. Compiled with LuaTeX. + +% LaTeX2e version 2023-11-01 added \IfExplAtLeastTF. +\NeedsTeXFormat{LaTeX2e}[2023-11-01] +\ProvidesExplClass + {beery} + {2024-11-10} + {} + {} + +\LoadClass { article } + +\box_new:N \l__beery_tmp_box + +\RequirePackage { fontscale } +\fontscalesetup { musical } +\RequirePackage { siunitx } +\sisetup { list-final-separator = { ,~ and~ } , mode = match } +\RequirePackage { mathtools } +\RequirePackage [ shortcuts , allowbreakbefore ] { extdash } +\RequirePackage { csquotes } +\RequirePackage { lmodern } +\RequirePackage { fontspec } +\newfontfamily \newfontfamilystixtwo { STIX Two Text } +\newfontfamily \newfontfamilysourceseriffour { Source Serif 4 } + +\RequirePackage { multicol } +\RequirePackage { scaletextbullet } + +% CUSTOM MACROS + +\tl_const:Nn \c_beery_alphabet_tl { abcdefghijklmnopqrstuvwxyz } +\NewExpandableDocumentCommand \alphabet { } { \c_beery_alphabet_tl } +\NewDocumentCommand \Key { m o o } + { + \mode_leave_vertical: + \group_begin: + \ttfamily + \IfNoValueTF {#3} + { + \IfNoValueTF {#2} + {#1} + { #1 $\,=\,$ \allowbreak #2 } + } + { #1 $\,=\,$ #2 \hspace* { \fill } \hbox:n { initial $\,=\,$ #3 } } + \group_end: + } +\NewDocumentCommand \Value { m } { \texttt {#1} } +\NewDocumentCommand \cmd { m } { \texttt { \token_to_str:N #1 } \@ } +\NewDocumentCommand \cs { m } { \texttt { \token_to_str:c {#1} } \@ } +\NewDocumentCommand \marg { m } + { + \allowbreak + \texttt { \c_left_brace_str } + $\langle$ + { \normalfont \itshape #1 } + $\rangle$ + \texttt { \c_right_brace_str } + } +\NewDocumentCommand \oarg { m } + { + \allowbreak + \texttt { [ } + $\langle$ + { \normalfont \itshape #1 } + $\rangle$ + \texttt { ] } + } +\NewDocumentCommand \sarg { } { $\langle$ \texttt {*} $\rangle$ } +\NewDocumentCommand \meta { m } + { + $\langle$ + { \normalfont \itshape #1 } + $\rangle$ + } +\NewDocumentCommand \cls { m } { \textsf {#1} } +\NewDocumentCommand \env { m } { \texttt {#1} } +\NewDocumentCommand \pkg { m } { \textsf {#1} } +\NewDocumentCommand \latin { m } { \textit {#1} } + +% PAGE STYLE + +\hbox_set:Nn \l__beery_tmp_box { \c_beery_alphabet_tl } +\dim_const:Nn \c_beery_alphabet_dim { \box_wd:N \l__beery_tmp_box } +\dim_log:N \c_beery_alphabet_dim + +\dim_const:Nn \c_beery_big_dim { \l_fontscale_normalsize_baselineskip_skip } +\dim_const:Nn \c_beery_medium_dim { \c_beery_big_dim / 2 } +\dim_const:Nn \c_beery_small_dim { \c_beery_big_dim / 4 } +\skip_const:Nn \c_beery_big_skip + { + \c_beery_big_dim + plus \dim_eval:n { \c_beery_big_dim / 2 } + minus \dim_eval:n { \c_beery_big_dim / 3 } + } +\skip_const:Nn \c_beery_medium_skip { \c_beery_big_skip / 2 } +\skip_const:Nn \c_beery_small_skip { \c_beery_big_skip / 4 } +\skip_set_eq:NN \bigskipamount \c_beery_big_skip +\skip_set_eq:NN \medskipamount \c_beery_medium_skip +\skip_set_eq:NN \smallskipamount \c_beery_small_skip + +\raggedbottom +\int_set:Nn \vbadness { 100 } + +\skip_set:Nn \topskip { \l_fontscale_normalsize_size_dim } +\skip_set_eq:NN \splittopskip \topskip +\RequirePackage { geometry } +\geometry + { + a4paper + , textwidth = + \dim_eval:n { \fp_to_dim:n { \c_e_fp * \c_beery_alphabet_dim } } + , textheight = + \dim_eval:n + { \fp_to_dim:n { 1.6180 * \c_e_fp * \c_beery_alphabet_dim } } + , heightrounded + , centering + , headheight = \l_fontscale_footnotesize_baselineskip_skip + , headsep = \c_beery_big_dim + , footskip = + \dim_eval:n + { \c_beery_big_dim + \l_fontscale_footnotesize_baselineskip_skip } + } + +\RequirePackage { fancyhdr } +\pagestyle { fancy } +\fancyhf { } +\cs_set:Npn \headrulewidth { 0pt } +\fancyfoot [ C ] + { \footnotesize \thepage \c_space_tl of~ \pageref { LastPage } } + +% PARAGRAPH STYLE + +\nonfrenchspacing +\linespread { 1 } +\skip_set_eq:NN \parskip \c_beery_medium_skip +\dim_zero:N \parindent +\RequirePackage [ raggedrightboxes ] { ragged2e } +\skip_set:Nn \RaggedRightRightskip { 0pt plus 0.5 \linewidth } +\dim_zero:N \RaggedRightParindent +\dim_set_eq:NN \JustifyingParindent \RaggedRightParindent +\RaggedRight +\int_set:Nn \pretolerance { -1 } +\int_set:Nn \tolerance { 200 } +\dim_zero:N \emergencystretch +\int_set:Nn \widowpenalty { 10000 } +\int_set_eq:NN \clubpenalty \widowpenalty +\int_set_eq:NN \displaywidowpenalty \widowpenalty +\int_set:Nn \hyphenpenalty { 99 } +\int_set_eq:NN \exhyphenpenalty \hyphenpenalty + +% HEADINGS, TABLE OF CONTENTS + +\RequirePackage { titlesec , titletoc } +\setcounter { secnumdepth } { 2 } +\setcounter { tocdepth } { 2 } + +\titlespacing* \section % section + { 0pt } % indent + { + - \parskip + + \c_beery_big_dim + plus \fp_eval:n { 1 / 2 * 4 } \c_beery_big_dim + minus \fp_eval:n { 1 / 3 / 4 } \c_beery_big_dim + } % before + { - \parskip + \c_beery_medium_skip } % after +\titlespacing* \subsection + { 0pt } + { + - \parskip + + \fp_eval:n { 4 / 3 } \c_beery_medium_dim + plus \fp_eval:n { 1 / 2 * 4 } \c_beery_medium_dim + minus \fp_eval:n { 1 / 3 / 4 } \c_beery_medium_dim + } + { - \parskip + \c_beery_medium_skip } + +\titleformat \section % section + [ block ] % shape + { \raggedright \large \bfseries } % format + { \thesection } % label + { 1em } % the horizontal separation between label and title body + { } % before code + { } % after code +\titleformat \subsection + [ block ] + { \raggedright \normalsize \bfseries } + { \thesubsection } + { 1em } + { } + { } + +% LISTS, LIST HEADINGS + +\RequirePackage { enumitem } +\setlist + { + % horizontal spacing + leftmargin = * + , labelsep = 0.5em + % vertical spacing + , topsep = 0pt + , partopsep = 0pt + , parsep = \c_beery_small_skip + , itemsep = 0pt + } +\setlist [ itemize , 1 ] { label = \textbullet } +\setlist [ itemize , 2 ] { label = \ScaleTextBullets { 2 } } +\setlist [ itemize , 3 ] { label = \ScaleTextBullets { 3 } } +\setlist [ enumerate , 1 ] { label = \arabic* . } +\setlist [ enumerate , 2 ] { label = \theenumi \arabic* . } +\setlist [ enumerate , 3 ] { label = \theenumii \arabic* . } + +% list headings +% https://tex.stackexchange.com/questions/2644/how-to-prevent-a-page-break-before-an-itemize-list +\NewDocumentCommand \KeepNextPar { s } + { + \par + \IfBooleanTF #1 + { + \int_compare:nNnT { \prevgraf } = { 1 } + { \nobreak \@afterheading } + } + { \nobreak \@afterheading } + } +\NewDocumentCommand \listheading { m } + { + \par + #1 + \par + \int_compare:nNnT { \prevgraf } = { 1 } + { \nobreak \@afterheading } + \vspace { \skip_eval:n { \c_beery_small_skip - \parskip } } + } + +% TABLES + +\renewcommand \bottomfraction { 1 } +\renewcommand \topfraction { 1 } +\skip_set:Nn \textfloatsep + { + \c_beery_big_dim plus \c_beery_big_dim minus + \dim_eval:n { \c_beery_big_dim / 3 } + } + +\RequirePackage { tabularray } +\UseTblrLibrary { booktabs , siunitx } + +% FOOTNOTES + +\RequirePackage [ bottom ] { footmisc } +\renewcommand \footnoterule { } +% \setlength { \skip \footins } { \c_beery_big_skip } +\dim_set:Nn \footnotesep { \f@linespread \footnotesep } +\coffin_new:N \l__beery_footnote_coffin +% 1.2 = baselineskip-size-ratio +\dim_const:Nn \c_beery_footnote_baselineheight_dim + { + \fp_to_dim:n + { ( 1.2 * \f@linespread - 1 ) * \l_fontscale_footnotesize_size_dim } + } +\RenewDocumentCommand \@makefntext { +m } + { + \vcoffin_set:Nnn \l__beery_footnote_coffin { \textwidth } + { + \list { \@thefnmark . } + { + \dim_set:Nn \leftmargin + { + \fp_to_dim:n + { + ( 1 - \l_fontscale_footnotesize_scale_fp ) / 2 * \textwidth + } + } + \dim_set_eq:NN \rightmargin \leftmargin + \dim_set:Nn \labelsep { 0.5em } + \skip_zero:N \topsep + \skip_zero:N \partopsep + } + \item #1 \endlist + } + \coffin_typeset:Nnnnn \l__beery_footnote_coffin { l } { b } + { 0pt } { - \c_beery_footnote_baselineheight_dim } + } + +% REFERENCES + +\AddToHook { shipout / lastpage } { \label { LastPage } } +\RequirePackage { xurl } +\RequirePackage { hyperref } +\hypersetup { bookmarksnumbered , hidelinks , linktoc = page }
\ No newline at end of file diff --git a/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.pdf b/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.pdf Binary files differnew file mode 100644 index 00000000000..d1aa36d2383 --- /dev/null +++ b/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.pdf diff --git a/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.tex b/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.tex new file mode 100644 index 00000000000..95cfd592739 --- /dev/null +++ b/Master/texmf-dist/doc/latex/scaletextbullet/scaletextbullet.tex @@ -0,0 +1,224 @@ +\documentclass{beery} + +\NewDocumentCommand\textbulletfactor{}{\cs{textbullet} factor} + + +\begin{document} + + +\section* + {% + \SetFontStep*{1}% + The \pkg{scaletextbullet} package% + } + +Resize the \cs{textbullet} without changing its vertical center + +Oliver Beery + +Version 1.0.0\quad{}10 November 2024 + + +\section{Introduction} +\label{sec:intro} + +The \pkg{scaletextbullet} package enables the user to resize the \cs{textbullet} without moving its vertical center, unlike direct usage of the \LaTeXe{} and \pkg{expl3} commands \cs{scalebox} and \cs{box_scale:}. +This process is not fully automated\---the user must use \cs{SetTextBulletFactor} to set the \textbulletfactor{} to the correct value to display the resized \cs{textbullet} at the correct height. +The \textbulletfactor{} is the ratio of the width of the \cs{textbullet}, excluding its empty space, to its width, including its empty space. +One way of estimating the \textbulletfactor{} is by using \cs{scaletextbulletdebug}. + +This package provides a solution that works in text mode. +For a solution that works only in math mode, see the linked \TeX{} Stack Exchange thread.% +\footnote{\url{https://tex.stackexchange.com/questions/119319/how-to-correctly-shrink-the-bullets-of-itemize}} + + +\section{Commands} +\label{sec:commands} + +This package defines some commands whose argument takes a \meta{floating point expression} or \meta{integer expression}. +This syntax has the same representation as the arguments to \cs{fpeval} and \cs{inteval}, documented in \pkg{usrguide}.% +\footnote{\url{https://ctan.org/pkg/usrguide}} + +\cs{SetTextBulletFactor} \marg{floating point expression} +\KeepNextPar* + +Sets the \textbulletfactor{} to the result of computing the \meta{floating point expression}. +The \textbulletfactor{} is the ratio of the width of the \cs{textbullet}, excluding its empty space, to its width, including its empty space. +This change is local to the current group. +The initial \textbulletfactor{} is \num{0.4}\---this matches the dimensions of the \cs{textbullet} of the Latin Modern font at size \qty{10}{pt}. + +\cs{ScaleTextBullet} \marg{floating point expression} +\KeepNextPar* + +Prints a \cs{textbullet} with its size scaled by the result of computing the \meta{floating point expression}. +The new \cs{textbullet} will be printed with the same vertical center only if the \textbulletfactor{} is set to the correct value. + +\cs{ScaleTextBullets} \oarg{floating point expression} \marg{integer expression} +\KeepNextPar* + +Prints a number of \cs{textbullet}s equal to the value of \meta{integer expression} with about the same total area as the original \cs{textbullet}.% +\footnote + {% + In calculating the total area, I have approximated each \cs{textbullet} as a perfect circle, but, of course, the actual shape depends on the font used.% + } +If the optional argument is used, the size of each \cs{textbullet} is instead scaled by the result of computing the \meta{floating point expression}. +The new \cs{textbullet} will be printed with the same vertical center only if the \textbulletfactor{} is set to the correct value. + +\cs{scaletextbulletdebug} +\KeepNextPar* + +This command is provided only to help the user estimate the \textbulletfactor{}. +Prints \num{15} consecutive \cs{textbullet}s with decreasing sizes. +The \cs{textbullet}s are followed by the original \cs{textbullet} inside a framed box. +The framed box has width equal to the \textbulletfactor{} \texttimes{} the total width of the \cs{textbullet} (this includes its empty space). + +The \textbulletfactor{} is set to the correct value when the 15 consecutive \cs{textbullet}s have the same vertical center and the \cs{textbullet} fits nicely inside the framed box. + + +\section{Application} +\label{sec:application} + +I wrote this package primarily to create nicer\-/looking itemized lists. +The default list labels in \LaTeX{} (and other programs) fail to communicate the list level within the list hierarchy: + +\begin{multicols}{2} + \begin{itemize}[label=\textbullet] + \item List level 1 + \begin{itemize}[label=\textbf{--}] + \item List level 2 + \item List level 2 + \begin{itemize}[label=\textasteriskcentered] + \item List level 3 + \end{itemize} + \end{itemize} + \item List level 1 + \begin{itemize}[label=\textbf{--}] + \item List level 2 + \begin{itemize}[label=\textasteriskcentered] + \item List level 3 + \item List level 3 + \end{itemize} + \end{itemize} + \end{itemize} +\end{multicols} + +This contrasts with traditional enumerated list structures where the list level is obvious from the numbering of the list label: + +\begin{multicols}{2} + \begin{enumerate} + \item List level 1 + \begin{enumerate} + \item List level 2 + \item List level 2 + \begin{enumerate} + \item List level 3 + \end{enumerate} + \end{enumerate} + \item List level 1 + \begin{enumerate} + \item List level 2 + \begin{enumerate} + \item List level 3 + \item List level 3 + \end{enumerate} + \end{enumerate} + \end{enumerate} +\end{multicols} + +This package allows the user to create nice\-/looking itemized lists using \cs{ScaleTextBullets}: + +\begin{multicols}{2} + \begin{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \item List level 2 + \begin{itemize} + \item List level 3 + \end{itemize} + \end{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \begin{itemize} + \item List level 3 + \item List level 3 + \end{itemize} + \end{itemize} + \end{itemize} +\end{multicols} + +Maybe the visual effect is more clear with different fonts. +This example uses STIX Two Text and Source Serif 4, respectively. + +\begingroup + \SetTextBulletFactor{0.54} + \newfontfamilystixtwo + \begin{multicols}{2} + \begin{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \item List level 2 + \begin{itemize} + \item List level 3 + \end{itemize} + \end{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \begin{itemize} + \item List level 3 + \item List level 3 + \end{itemize} + \end{itemize} + \end{itemize} + \end{multicols} +\endgroup + +\begingroup + \SetTextBulletFactor{0.75} + \newfontfamilysourceseriffour + \begin{multicols}{2} + \begin{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \item List level 2 + \begin{itemize} + \item List level 3 + \end{itemize} + \end{itemize} + \item List level 1 + \begin{itemize} + \item List level 2 + \begin{itemize} + \item List level 3 + \item List level 3 + \end{itemize} + \end{itemize} + \end{itemize} + \end{multicols} +\endgroup + + +\section{Implementation notes} +\label{sec:implementation} + +The procedure of resizing the \cs{textbullet} without changing its vertical center, including the definition of the \textbulletfactor{}, makes an important assumption: +That the \cs{textbullet} is a perfect circle. +Of course, this is not completely accurate and the actual shape depends on the font used. +This means that the \textbulletfactor{} may not be exactly the ratio of the width of the \cs{textbullet}, excluding its empty space, to its width, including its empty space. + +In writing this package, I have referenced a comment on the \TeX{} Stack Exchange by the user egreg.% +\footnote{\url{https://tex.stackexchange.com/questions/620507/how-to-resize-textbullet-without-the-bullet-moving-down/638599\#638599}} +This package uses the same procedure for resizing the \cs{textbullet} without changing its vertical center. + + +\section{Programming} +\label{sec:programming} + +This package is written in \pkg{expl3}, but does not provide any public functions or variables. + + +\end{document}
\ No newline at end of file |