% \iffalse meta-comment -*- mode: doctex -*- % % ullrcorners: draw corners on the upper left and lower right sides of % a word % % Copyright (C) 2025 Vincent Goulet % % This file may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.3c 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 % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Vincent Goulet % . % % This work consists of ullrcorners.dtx and the derived files. % \fi % % \iffalse %<*dtx> \ProvidesFile{ullrcorners.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{ullrcorners} %<*package> [2025/05/16 v1.0 ullrcorners] % %<*driver> \documentclass[11pt,x11names]{ltxdoc} \usepackage{natbib} \usepackage{ullrcorners} \usepackage{enumitem} \usepackage{pict2e} \usepackage{metalogo} \def\changes#1#2#3{\glossary{#1>#3}} % simplified \DisableCrossrefs \CodelineNumbered \RecordChanges %% Configuration of the glossary \def\glossaryname{Version history} \GlossaryPrologue{\section*{\glossaryname}% \addcontentsline{toc}{section}{\glossaryname}} %% Fonts \iftutex \RequirePackage{microtype} \RequirePackage{fontspec} \RequirePackage{unicode-math} \setmainfont{STIXTwoText} [ Extension = .otf, UprightFont = *-Regular, BoldFont = *-SemiBold, ItalicFont = *-Italic, BoldItalicFont = *-SemiBoldItalic, Ligatures = TeX, ] \setmathfont{STIXTwoMath-Regular} [ Extension = .otf, bold-style = TeX ] \else \RequirePackage{microtype} \RequirePackage[utf8]{inputenc} \RequirePackage[T1]{fontenc} \RequirePackage{stix2} \fi \RequirePackage[medium,lining,scale=0.90]{FiraMono} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \colorlet{codebg}{LightYellow1} % code background \colorlet{ullrcornerscolor}{Snow4} % corners %% New \DescribeMacro type environment for colors \NewDocElement[envlike,notoplevel]{Colors}{colors} %% Hyperlinks \usepackage{hypdoc} \hypersetup{% pdftitle={Guide to the package ullrcorners}, pdfauthor={Vincent Goulet}, colorlinks = true, linktocpage = true, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}} %% Source code \usepackage{listings} \lstset{% basicstyle=\ttfamily, showstringspaces=false, backgroundcolor=\color{codebg}, frame=leftline, framerule=2pt, framesep=5pt, xleftmargin=7.4pt } %% Package name \newcommand*\pkgname{ullrcorners} \newcommand*\ullrpkg{\pkg{\pkgname}} %% Redefine \year and define \isodate using information from %% \filedate instead of using compilation time \def\parsedate#1/#2/#3\relax{\def\year{#1}\def\isodate{#1-#2-#3}} \def\parseversion v#1.#2\relax{\def\version{#1.#2}} %% Utility macro \let\pkg\textbf \begin{document} \DocInput{ullrcorners.dtx} \end{document} % % \fi % ^^A NOTE: The first three "versions" are in the project % ^^A https://gitlab.com/vigou3/programmer-avec-r % \changes{0.1}{2019-11-28}{First private version.} % \changes{0.2}{2019-12-09}{Fix usage of the main macro at the % beginning of a paragraph.} % \changes{0.3}{2024-12-13}{Fix underfull horizontal boxes caused by % the upper left corner.} % \changes{1.0}{2025-05-16}{First public release.} % % \GetFileInfo{ullrcorners.dtx} % \expandafter\parsedate\filedate\relax % \expandafter\parseversion\fileversion\relax % % \title{{% % \setlength\ullrcornerslinewidth{1.02pt} % \setlength\ullrcornershlength{0.6ex} % \setlength\ullrcornersvlength{1.5\ullrcornershlength} % \setlength\ullrcornersvgap{\ullrcornerslinewidth} % \setlength\ullrcornershgap{\ullrcornersvgap} % \ullrcorners{ullrcorners}}} % \author{Vincent Goulet \\ % \href{mailto:vincent.goulet@act.ulaval.ca}{\url{vincent.goulet@act.ulaval.ca}}} % \date{Version~\version, \isodate} % \maketitle % % \section{Package features} % \label{sec:features} % % {\ullrpkg} provides a command to surround a word or a sequence or % words by small corners on the upper left and lower right sides, like % \ullrcorners{this}. The typographical convention is inspired by % \citet{Friedl:regex:2006}, where it is used to delimit regular % expressions. % % \begin{DescribeMacro}{\ullrcorners} % The command |\ullrcorners| surrounds the word or sequence of words % in argument by corners. The example above is typeset using: % \iffalse %<*example> % \fi \begin{lstlisting} \ullrcorners{this} \end{lstlisting} % \iffalse % % \fi % \end{DescribeMacro} % % \begin{DescribeColors}{ullrcornerscolor} % If, and only if, a color |ullrcornerscolor| is defined in the % preamble, the package will use this color instead of the default % text color to draw the corners. Therefore, the example above is % really obtained by loading \pkg{xcolor} with the option % |x11names|, and by defining the color in the preamble: % \iffalse %<*example> % \fi \begin{lstlisting} \colorlet{ullrcornerscolor}{Snow4} \end{lstlisting} % \iffalse % % \fi % \end{DescribeColors} % % That is pretty much all there is in terms of package features. % % \section{Customization} % \label{sec:customization} % % You may customize the appearance of the corners by redefining the % following lengths using |\setlength| (see \autoref{fig:parameters} % for a visual summary): % \begin{description}[font=\normalfont\ttfamily,noitemsep] % \item[\ttfamily\string\ullrcornerslinewidth] % (default $0.8$~pt) \\ % rule thickness of the corners; % \item[\ttfamily\string\ullrcornershlength] % (default $0.6$~ex) \\ % length of the horizontal rules; % \item[\ttfamily\string\ullrcornersvlength] % (default $1.5$ times |\ullrcornershlength|) \\ % length of the vertical rules; % \item[\ttfamily\string\ullrcornersvgap] % (default |\ullrcornerslinewidth|) \\ % space between the horizontal rules and the text; % \item[\ttfamily\string\ullrcornershgap] % (default |\ullrcornersvgap|) \\ % space between the vertical rules and the text. % \end{description} % % The package does not provide support for asymetrical upper left and % lower right corners. % % \begin{figure} % \centering % \setlength{\unitlength}{20mm} % ^^A picture pretty much to scale using 1mm = 2.84526pt and % ^^A 1ex = 4.71945pt = 1,65871mm in 11pt font size % ^^A (https://tex.stackexchange.com/a/8337) % \begin{picture}(5.25,2.5)(-2.5,0.5) % \small % ^^A text outline % \put(0,2){\line(1,0){2.5}} % \put(0,2){\line(0,-1){1.5}} % % ^^A top and left rules % \put(-0.56234,2.28117){\rule{0.99523\unitlength}{0.28117\unitlength}} % \put(-0.56234,2.28117){\rule[-1.21168\unitlength]{0.28117\unitlength}{1.49285\unitlength}} % % ^^A length of top rule % \multiput(-0.56234,2.61234)(0.99523,0){2}{\line(0,1){0.2}} % \Vector(-0.06473,2.71234)(-0.56234,2.71234) % \Vector(-0.06473,2.71234)(0.43289,2.71234) % \put(-0.06473,3.01234){\makebox(0,0){\texttt{\string\ullrcornershlength}}} % \Vector(-0.06473,2.91234)(-0.06473,2.71234) % % ^^A width of top rule % \multiput(0.48289,2.28117)(0,0.28117){2}{\line(1,0){0.2}} % \put(0.58289,2.421755){\vector(0,-1){0.140585}} % \put(0.58289,2.421755){\vector(0,1){0.140585}} % \put(0.68289,2.421755){\makebox(0,0)[l]{\texttt{\string\ullrcornerslinewidth}}} % % ^^A vertical gap % \put(0.58289,2.140585){\vector(0,-1){0.140585}} % \put(0.58289,2.140585){\vector(0,1){0.140585}} % \put(0.68289,2.140585){\makebox(0,0)[l]{\texttt{\string\ullrcornersvgap}}} % % ^^A length of left rule % \multiput(-0.81234,2.28117)(0,-1.21168){2}{\line(1,0){0.2}} % \put(-0.71234,1.67533){\vector(0,-1){0.60584}} % \put(-0.71234,1.67533){\vector(0,1){0.60584}} % \put(-0.81234,1.67533){\makebox(0,0)[r]{\texttt{\string\ullrcornersvlength}}} % % ^^A horizontal gap % \put(-0.28117,1,01949){\line(0,-1){0.2}} % \put(-0.140585,0.91949){\vector(1,0){ 0.140585}} % \put(-0.140585,0.91949){\vector(-1,0){0.140585}} % \put(-0.5321755,0.71949){\makebox(0,0)[r]{\texttt{\string\ullrcornershgap}}} % \Vector(-0.140585,0.81949)(-0.140585,0.91949) % \qbezier(-0.140585,0.81949)(-0.140585,0.71949)(-0.240585,0.71949) % \Line(-0.4321755,0.71949)(-0.240585,0.71949) % \end{picture} % \caption{Parameters of the corners (shown here for the upper left % corner)} % \label{fig:parameters} % \end{figure} % % \MaybeStop{% % \begin{thebibliography}{1} % \bibitem[{Friedl(2006)}]{Friedl:regex:2006} % Friedl, J. E.~F. (2006). % \newblock \emph{Mastering Regular Expressions}. % \newblock 3rd ed. O'Reilly {M}edia. % \newblock ISBN 0-59652812-4. % \end{thebibliography} % \PrintChanges % } % % \appendix % % ^^A >>>>> Start of the code of the package %% \section{Implementation} % \label{sec:implementation} % % First, we define the lengths needed by the package and set their % default values. % %\iffalse %<*package> %\fi % \begin{macrocode} \newlength\ullrcornerslinewidth \newlength\ullrcornershlength \newlength\ullrcornersvlength \newlength\ullrcornersvgap \newlength\ullrcornershgap \setlength\ullrcornerslinewidth{0.8pt} \setlength\ullrcornershlength{0.6ex} \setlength\ullrcornersvlength{1.5\ullrcornershlength} \setlength\ullrcornersvgap{\ullrcornerslinewidth} \setlength\ullrcornershgap{\ullrcornersvgap} % \end{macrocode} % % Second, we will need a command to set the color of the corners. By % default, this command does nothing. However, if a color % |ullrcornerscolor| is defined at the beginning of the document, then % the command is redefined as a call to |\color| (this assumes that a % color package is loaded). % \changes{1.0}{2025-05-16}{Implementation: the main macro now has % only one argument and uses the color \texttt{ullrcornerscolor} if it % is defined in the preamble.} % \begin{macrocode} \newcommand*\ullrc@color{\relax} \AtBeginDocument{% \@ifundefined{\string\color@ullrcornerscolor}{}{% \renewcommand\ullrc@color{\color{ullrcornerscolor}}}} % \end{macrocode} % % Finally, we define the robust user command |\ullrcorners|. It draws % the corners using {\TeX} rules and boxes. % \changes{1.0}{2025-05-16}{Implementation: fix boxes such that the % horizontal space between the text and the corners really is % \cs{ullrcornershgap} without hacks.} % \changes{1.0}{2025-05-16}{Implementation: declare the main macro as % a robust command.} % \begin{macrocode} \DeclareRobustCommand{\ullrcorners}[1]{% \setbox\z@\hbox{\kern\ullrcornershgap #1\kern\ullrcornershgap}% \dimen\z@=\dimexpr\ullrcornerslinewidth+\ullrcornersvgap+\dp\z@ \setbox\tw@\hbox to\dimexpr\wd\z@+2\ullrcornerslinewidth{% \hfil% \vbox{% \ullrc@color% \hbox to\ullrcornershlength{% \hfil\vrule \@height\ullrcornersvlength \@width\ullrcornerslinewidth% }% \hrule \@height\ullrcornerslinewidth }% }% \dimen\tw@=\dimexpr\ullrcornersvgap-\ullrcornersvlength \leavevmode% \vbox{% \offinterlineskip \vbox{% \ullrc@color% \hrule \@height\ullrcornerslinewidth \hbox to\ullrcornershlength{% \vrule \@height\ullrcornersvlength \@width\ullrcornerslinewidth\hfil }% } \kern\dimen\tw@ \hbox{\kern\ullrcornerslinewidth\box\z@}% \kern\dimen\tw@ \hbox{\raise -\dimen\z@\box\tw@}% }% } % \end{macrocode} % \iffalse % %\fi % % \Finale \endinput