\documentclass{beerydoc} \RequirePackage { fontspec } \newfontfamily \newfontfamilystixtwo { STIX Two Text } \newfontfamily \newfontfamilysourceseriffour { Source Serif 4 } \begin{document} \section*{\stepfontsize{1}The \pkg{scaletextbullet} package} Resize the \cs{textbullet} without changing its vertical center Oliver Beery Version 2.0.5\quad 18 February 2026 \section{Introduction} \label{sec:intro} \subsection{About} \label{subsec:about} 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 \cs{textbullet} factor to the correct value to display the resized \cs{textbullet} at the correct height. The \cs{textbullet} factor 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 \cs{textbullet} factor is by using \cs{scaletextbulletdebug}. This package provides a solution that works only 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}} \subsection{Loading the package} \label{subsec:loading} \listheading{Requirements:} \begin{itemize} \item \LaTeXe{} version 2023-11-01 or newer \item \pkg{l3kernel} version 2023-11-01 or newer \end{itemize} \subsection{Syntax} \label{subsec:syntax} This documentation uses the syntaxes \meta{number} and \meta{integer}. These syntaxes have the same meaning as the arguments to \cs{fpeval} and \cs{inteval}, respectively, which are documented in \pkg{usrguide}. \section{Commands} \label{sec:commands} \begin{code}{\settextbulletfactor} \begin{syntax} \cs{settextbulletfactor} \marg{number} \end{syntax} Sets the \cs{textbullet} factor to \meta{number}. This assignment is local to the current group. The \cs{textbullet} factor is the ratio of the width of the \cs{textbullet}, excluding its empty space, to its width, including its empty space. The initial \cs{textbullet} factor is \num{0.4}---this matches the dimensions of the \cs{textbullet} of the Latin Modern font at size \qty{10}{pt}. \end{code} \begin{code}{\scaletextbullet} \begin{syntax} \cs{scaletextbullet} \marg{number} \end{syntax} Prints a \cs{textbullet} with its size scaled by factor \meta{number}. The new \cs{textbullet} will be printed with the same vertical center only if the \cs{textbullet} factor is set to the correct value. \listheading{Some exceptions:} \begin{itemize} \item Issues an error if $\meta{number}<\num{0}$. \item Issues a warning if the new \cs{textbullet} would have zero dimensions. \item Cannot be used in math mode. \end{itemize} \end{code} \begin{code}{\scaletextbullets} \begin{syntax} \cs{scaletextbullets} \oarg{number} \marg{integer} \end{syntax} Prints an \meta{integer} number of \cs{textbullet}s. The size of each \cs{textbullet} is scaled by factor \meta{number} or, if the optional argument is omitted, by a factor set such that the new \cs{textbullet}s have 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.% } The new \cs{textbullet} will be printed with the same vertical center only if the \cs{textbullet} factor is set to the correct value. \listheading{Some exceptions:} \begin{itemize} \item Issues an error if $\meta{integer}<\num{0}$ or $\meta{number}<\num{0}$. \item Issues a warning if $\meta{integer}=\num{0}$. \item Issues a warning if the new \cs{textbullet} would have zero dimensions. \item Cannot be used in math mode. \end{itemize} \end{code} \begin{code}{\scaletextbulletdebug} This command is provided only to help the user estimate the \cs{textbullet} factor. 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 \cs{textbullet} factor \texttimes{} the total width of the \cs{textbullet} (this includes its empty space). The \cs{textbullet} factor is set to the correct value when the \num{15} consecutive \cs{textbullet}s have the same vertical center and the \cs{textbullet} fits nicely inside the framed box. Cannot be used in math mode. \end{code} \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} where the number of scaled \cs{textbullet}s in the list label indicates the list level: \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} The visual effect may be more clear with different fonts. This example uses STIX Two Text (top) and Source Serif 4 (bottom). \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 \cs{textbullet} factor, 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 \cs{textbullet} factor 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}} This package uses the same procedure for resizing the \cs{textbullet} without changing its vertical center. \end{document}