% \iffalse meta-comment % %% File: menukeys.dtx Copyright (c) Tobias Weh %% %% This file may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this %% license or (at your option) any later version. The latest version %% of this license is in the file %% %% https://www.latex-project.org/lppl.txt %% %\NeedsTeXFormat{LaTeX2e}[2009/01/01] %\providecommand\DeclareRelease[3]{} %\providecommand\DeclareCurrentRelease[2]{} %\DeclareRelease{v1.6.1}{2020-12-19}{menukeys-2020-12-19.sty} %\DeclareCurrentRelease{v1.6.2}{2022-07-01} %\ProvidesPackage{menukeys} % [2022/07/01 v1.6.2 -- A package to format menus, paths and shortcuts] %<161> [2020/12/19 v1.6.1 -- A package to format menus, paths and shortcuts] % %<*driver> \documentclass{ltxdoc} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \usepackage{lmodern} \usepackage[english]{babel} \usepackage{menukeys} \usepackage{xspace} \usepackage[hang]{footmisc} \usepackage{dblfnote} \setlength{\footnotemargin}{1em} \usepackage{listings} \usepackage{xcolor} \definecolor{darkred}{HTML}{770011} \definecolor{darkblue}{HTML}{003b8b} \PassOptionsToPackage{% linkcolor=darkblue, urlcolor=darkred, bookmarksopen=true, bookmarksdepth=10, pdftitle={The menukeys package}, pdfsubject={% Format menu sequences, paths and keystrokes from lists.% }, pdfauthor={% Tobias Weh (mail@tobiw.de), Jonathan P. Spratte (jspratte@yahoo.de)% }, pdfkeywords={The menukeys package, LaTeX} }{hyperref} \PassOptionsToPackage{hyphens}{url} \usepackage{hypdoc} \renewcommand{\usage}[1]{\textbf{\hyperpage{#1}}} \renewcommand{\main}[1]{\textit{#1}} \newcommand{\menukeys}{\texttt{menukeys}\xspace} \newcommand{\TikZ}{Ti\textit{k}Z\xspace} \newcommand*{\pkg}[1]{\texttt{#1}} \newcommand*{\env}[1]{\texttt{#1}} \newcommand*{\fnt}[1]{\texttt{#1}} \newcommand*{\opt}[1]{\texttt{#1}} \newcommand{\DO}[1]{% \marginpar{\raggedleft\texttt{#1} \footnotesize(opt.)}% \index{#1=\texttt{#1} (option)|usage}% \index{Options:>\texttt{#1}|usage}% \ignorespaces } \newcommand{\DM}[1]{\DescribeMacro{#1}\ignorespaces} \newcommand{\DE}[1]{\DescribeEnv{#1}\ignorespaces} \newcommand{\AST}{\meta{\texttt{*}}} \newcommand{\minisec}[1]{\par\medskip\noindent{\sffamily\bfseries#1}\quad} \newcommand{\example}{\minisec{Example}\xspace} \providemenumacro{\test}{roundedmenus} \NewDocumentCommand{\teststyle}{ o m m m }{{% \renewmenumacro{\test}{#2}% \par\vspace{1.5\baselineskip plus 0.5\baselineskip minus 0.25\baselineskip} \noindent \fbox{\begin{minipage}{0.97\textwidth} Name: \texttt{#2} \index{#2=\texttt{#2} (style)|usage}% \index{Styles:>\texttt{#2}|usage} \par\vspace{0.5\baselineskip}% \test{#3} \par\vspace{0.5\baselineskip}% \test{#4}% \par\vspace{0.5\baselineskip}% This is some more or less blind text, to demonstrate how the sequence looks in text. This \test{#3} is the result of a style which name is \texttt{#2}. And again some blind text without any sense.% \IfValueT{#1}{{% \par\vspace{0.5\baselineskip}% \itshape\footnotesize#1\par }}% \end{minipage}}% }} \makeatletter \newcommand{\colortest}[1]{{% \par\vspace{\baselineskip}% \setlength{\fboxsep}{0pt}% \noindent Name: \texttt{#1}\index{#1=\texttt{#1} (theme)|usage}% \index{Color themes:>\texttt{#1}|usage} \\[0.5\baselineskip] Background: \fbox{\textcolor{tw@color@theme@#1@bg}{\rule[-0.4ex]{2.2ex}{2.2ex}}} \quad Border: \fbox{\textcolor{tw@color@theme@#1@br}{\rule[-0.4ex]{2.2ex}{2.2ex}}} \quad Text: \fbox{\textcolor{tw@color@theme@#1@txt}{\rule[-0.4ex]{2.2ex}{2.2ex}}} \quad (A: \fbox{\textcolor{tw@color@theme@#1@a}{\rule[-0.4ex]{2.2ex}{2.2ex}}} \quad B: \fbox{\textcolor{tw@color@theme@#1@b}{\rule[-0.4ex]{2.2ex}{2.2ex}}} \quad C: \fbox{\textcolor{tw@color@theme@#1@c}{\rule[-0.4ex]{2.2ex}{2.2ex}}}\kern2pt) }} \makeatother \MakeShortVerb{\|} \setcounter{tocdepth}{3} \makeatletter \def\SpecialMainEnvIndex#1{\@bsphack\special@index{% #1\actualchar {\string\ttfamily\space#1} (env)% \encapchar main}% \special@index{Environments:\levelchar#1\actualchar{% \string\ttfamily\space#1}\encapchar main}\@esphack} \def\SpecialUsageIndex#1{\@bsphack {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}% \@esphack} \def\SpecialEnvIndex#1{\@bsphack \index{#1\actualchar{\protect\ttfamily#1} (env)\encapchar usage}% \index{Environments:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar usage}\@esphack} \makeatother \addto\captionsenglish{% \def\indexname{Macro index} \def\glossaryname{Change history} } \IndexPrologue{ \section{Macro index} Numbers written in bold face refer to the page where the corresponding entry is described; italic numbers refer to the code line of the definition; numbers in roman refer to the code lines where the entry is used. } \GlossaryPrologue{ \section{Change history}\label{version}% } \setcounter{IndexColumns}{2} \makeatletter \tikzset{tw@menusbig@base/.style={% tw@set@tikz@colors, rounded corners=0.15ex, inner sep=0pt, inner xsep=2pt, text height=2.1ex, text depth=0.6ex, minimum width=1.5em, font=\Huge\bfseries\sffamily, signal, signal to=nowhere, signal pointer angle=110, ultra thick, }} \tw@declare@style*{menusbig}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menusbig@base,signal to=east]% {\strut\CurrentMenuElement};}% }[\hspace{-0.2em}\hspace{0em plus 0.1em minus 0.05em}]% {% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menusbig@base,signal from=west,signal to=east]% {\strut\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menusbig@base,signal from=west,]% {\strut\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menusbig@base]{\strut\CurrentMenuElement};}% }{blacknwhite} \newmenumacro{\filefolder}[/]{pathswithblackfolder} \newmenumacro{\MENU}[,]{menusbig} \newcommand\email[1]{\href{mailto:#1}{\texttt{#1}}} \makeatother \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{menukeys.dtx} \end{document} % % \fi % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \changes{v1.0}{2012/02/23}{Initial version} % \changes{v1.1}{2012/02/26}{Improved manual} % \changes{v1.2}{2013/07/23}{Tidy up version and date} % \changes{v1.2}{2013/07/23}{Fixed GitHub issues \#9, \#10, \#11, \#13, \#17, \#24 and \#26} % \changes{v1.2}{2013/07/23}{Added \cs{SPACE} and \cs{spacename}} % \changes{v1.2}{2013/07/23}{Added \cs{normalsize} before symbol definitions to make % the \texttt{ex} unit available} % \changes{v1.2a}{2013/09/10}{Replaced obsolete \cs{tikzstyle}} % \changes{v1.2a}{2013/09/10}{Added braces to the \cs{tikz} macro since the parser % seems to crash with \pkg{babel}'s french option otherwise.} % \changes{v1.3}{2014/03/10}{Improved key symbols.} % \changes{v1.3}{2014/03/10}{Added \TikZ-styles for the key symbols.} % \changes{v1.4}{2016/04/17}{The \texttt{path...} styles now use the text color % of the selected color theme (fix issue \#16).} % \changes{v1.4}{2016/04/18}{Extended color theme features.} % % \GetFileInfo{menukeys.sty} % % \DoNotIndex{\?,\_,\.,\@M,\@@input,\@Alph,\@alph,\@addtoreset,\@arabic} % \DoNotIndex{\@badmath,\@centercr,\@cite} % \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue} % \DoNotIndex{\@input,\@ixpt,\@m,\@minus,\@mkboth} % \DoNotIndex{\@ne,\@nil,\@nomath,\@plus,\roman,\@set@topoint} % \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb} % \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt} % \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt} % \DoNotIndex{\@xxpt,\@xxvpt,\\,\,,\addpenalty,\addtolength,\addvspace} % \DoNotIndex{\advance,\ast,\begin,\begingroup,\bfseries,\bgroup,\box} % \DoNotIndex{\bullet} % \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption} % \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass} % \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist} % \DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup} % \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter} % \DoNotIndex{\fbox} % \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef} % \DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule} % \DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi} % \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi} % \DoNotIndex{\input} % \DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark} % \DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright} % \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment} % \DoNotIndex{\NeedsTeXFormat,\newdimen} % \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number} % \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@} % \DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip} % \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions} % \DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright} % \DoNotIndex{\refstepcounter,\relax,\renewcommand} % \DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily} % \DoNotIndex{\secdef,\selectfont,\setbox,\setcounter,\setlength} % \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space} % \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase} % \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt} % \DoNotIndex{\viipt,\vipt,\vskip,\vspace} % \DoNotIndex{\wd,\xiipt,\year,\z@} % \expandafter\DoNotIndex{\,} % \DoNotIndex{\next,\unexpanded,\@backslashchar, % \@ifundefinedcolor,\@nameuse,\detokenize, % \cslet,\csname,\edef,\endcsname, % \NewDocumentCommand} % \DoNotIndex{\@afterheading,\@afterindentfalse,\@ifpackageloaded,\ , % \appto,\AtBeginDocument,\AtEndPreamble,\baselineskip,\BODY, % \centering,\contentspage,\CurrentOption,\dots,\endquote,\fill,\filright, % \tiny,\footnotesize,\Huge,\ifstrempty,\ifstrequal,\itshape,\Large,\large,\LARGE, % \makebox,\MessageBreak,\NewEnviron,\newif,\normalfont,\normalsize, % \pbox,\preto,\quote,\RequirePackage,\rule,\setstretch, % \SetupKeyvalOptions,\sffamily,\singlespacing,\textbf,\textit,\textwidth, % \thecontentslabel,\thecontentspage,\titlecontents,\xspace} % \DoNotIndex{\0,\1,\2,\3,\4,\5,\6,\7,\8,\9,0,1,2,3,4,5,6,7,8,9} % \DoNotIndex{\lccode,\listof,\lowercase,\PackageWarningNoLine,\PackageError, % \PackageWarning,\renewenvironment,\romannumeral,\string,\strut} % \DoNotIndex{\csdef,\cslet\csletcs,\letcs,\DeclareDocumentCommand,\ifcsundef, % \RenewDocumentCommand,\ProvideDocumentCommand,\NewDocumentCommand,\hspace, % \IfBooleanTF,\IfSubStr} % \DoNotIndex{\tikz,\node,\draw,\definecolor,\colorlet,\usetikzlibrary, % \texttt,\textcolor,\raisebox,\maxsizebox,\small,\ttfamily,\DeclareBoolOption} % \DoNotIndex{\value,\usebox,\sbox,\providecommand,\ProcessKeyvalOptions,\newbox, % \IfStrEq,\hyphenchar,\expandonce,\encodingdefault,\DeclareStringOption} % % \title{\Huge\MENU[,]{M,E,N,U,K,E,Y,S}} % \author{^^A % Tobias Weh\\ % {\normalsize\email{mail@tobiw.de}}\\ % {\normalsize\url{https://tobiw.de/en}}\\[\medskipamount] % ^^A % Jonathan P.\@ Spratte\\ % {\normalsize\email{jspratte@yahoo.de}}\\[\medskipamount] % ^^A % \normalsize\url{https://github.com/tweh/menukeys}\\ % \normalsize\url{https://www.ctan.org/pkg/menukeys}\\ % \normalsize\filefolder{macros/latex/contrib/menukeys}} % \date{\filedate{} --- \fileversion} % \thispagestyle{empty} % \maketitle % % \begin{abstract} % \noindent % This package is build to format menu sequences, paths and keystrokes. % \par\medskip\noindent % You're welcome to send me feedback, questions, bug reports and feature requests. % If you like to support this package -- especially improving or proofreading the % manual -- send me an e-mail, please. % \par\bigskip\noindent % \emph{Many thanks to Ahmed Musa, who provided the original list parsing % code at \url{https://tex.stackexchange.com/a/44989/4918}.} % \par % \end{abstract} % % \newpage\tableofcontents\newpage % % \section{Introduction}\label{intro} % The \menukeys package is mainly designed to parse and print % sequences of software menus, folders and files, or keystrokes. % Most predefined styles use the power of \TikZ\footnote{See % \url{https://www.ctan.org/pkg/pgf}.} to format the output. % % For example if you want to tell the reader of a manual how to set the ruler % unit you may type % \begin{verbatim} % To set the unit of the rulers go to \menu{Extras > Settings > Rulers} % and choose between millimeters, inches and pixels. The shortcut % to view the rulers is \keys{cmd + R}. Pressing these keys again % will hide the rulers. % % The standard path for saving your document is \directory{Macintosh HD/ % Users/Your Name/Documents} but you can change it at \menu{Extras > % Settings > Saving} by clicking \menu{Change save path}. % \end{verbatim} % and get this: % % \medskip % To set the unit of the rulers go to \menu{Extras > Settings > Rulers} % and choose between millimeters, inches and pixels. The shortcut % to view the rulers is \keys{cmd + R}. Pressing these keys again % will hide the rulers. % % The standard path for saving your document is \directory{Macintosh HD/ % Users/Your Name/Documents} but you can change it at \menu{Extras > % Settings > Saving} by clicking \menu{Change save path}. % % \bigskip\noindent % The package is loaded as usual via % \begin{verbatim} % \usepackage{menukeys} % \end{verbatim} % % \section{Installation} % To install \menukeys manually run % \begin{verbatim} % latex menukeys.ins % \end{verbatim} % and copy |menukeys.sty| to a path where \LaTeX{} can find it. % % To typeset this manual run % \begin{verbatim} % pdflatex menukeys.dtx % makeindex -s gglo.ist -o menukeys.gls menukeys.glo % makeindex -s gind.ist -o menukeys.ind menukeys.idx % pdflatex menukeys.dtx % pdflatex menukeys.dtx % \end{verbatim} % % \section{Package loading and options}\label{options} % \changes{v1.6}{2020/10/27}{Load order no longer important} % Since \menukeys used to use \pkg{catoptions}, which does some heavy changes on key-value % options, it \textbf{was} recommended to load \menukeys as the last package % (even after \pkg{hyperref}\footnote{See \url{https://tex.stackexchange.com/q/237683/4918} % and \url{https://github.com/tweh/menukeys/issues/41}.}). % \textbf{This is no longer the case!} % % These are the possible options: % \begin{description} % \item [definemenumacros:] Most of \menukeys' macros should not % conflict with other packages\footnote{If you find a conflict send an e-mail.} % but the predefined menu macros should be short and easy-to-read % commands, which means that |\menu{A,B,C}| is preferred against % |\printmenusequence{A,B,C}|. For that it's not unlikely that they % conflict with other packages. To prevent this you can tell % \menukeys to not define them by calling the option \DO{definemenumacros} % |definemenumacros=false|. The default value is |true|. % % If you do so you have to define your own menu macros, see section~\ref{menumacros} % for details. % \item [definekeys:] Equal to |definemenumacros| \DO{definekeys} for the key macros. % The default value is |true|. % \item [mackeys:] This option \DO{mackeys} allows you to decide whether the mac keys % are shown as text (|mackeys=text|) or symbols (|mackeys=symbols|). The default % value is |symbols|. % \item [os:] You can specify the OS \DO{os} by saying |os=mac| or |os=win|. This will cause % some key macros to be rendered differently. The default value is |mac|. % \item [hyperrefcolorlinks:] \emph{Obsolete} % (see sec.~\ref{sec:issues} and~\ref{sec:hyperref-colorlinks}). % \end{description} % % \section{Usage} % \subsection{Basics}\label{basics} % \menukeys comes with three ``menu macros'' that parse and print lists. We have % \DM{\menu}|\menu|\marg{menu sequence}, with |>| as default input list separator, % \DM{\directory}|\directory|\marg{path and files} with |/| as default separator and % \DM{\keys}|\keys|\marg{keystrokes} with |+| as default separator. You've seen % examples for all of them in section~\ref{intro}. % % These macros have also an optional argument to set the input list separator. % E.g. if you want to put in your menus with |,| instead of |>| you can say % |\menu[,]|\marg{menu sequence}.\footnote{If you want to change the input separator % globally it's recommended to renew the menu macro as described in section~\ref{menumacros}.} % % The possible input separators are |/|, |=|, |*|, |+|, |,|, |;|, |:|, |-|, |>|, % |<| and |bslash| (to use |\| as separator). You can hide a separator from the % parser by putting a part of the sequence in braces. Spaces around the separator % will be ignored, i.e. |\keys{\ctrl+C}| equals |\keys{\ctrl + C}|. % \example |\menu[,]{Extras,Settings,{Units, rulers and origin}}| gives % \menu[,]{Extras,Settings,{Units, rulers and origin}} % % \subsection{Styles} % \menukeys defines several ``styles'' that determine the output format % of a menu macro. There are some predefined styles and others can be % created by the user. % \subsubsection{Predefined styles} % % \teststyle{menus}{File,Extras,Preferences}{Menu} % \teststyle{roundedmenus}{File,Extras,Preferences}{Menu} % \teststyle{angularmenus}{File,Extras,Preferences}{Menu} % \teststyle[The color of + is taken from optional color B.] % {roundedkeys}{Ctrl,Alt,Q}{S} % \teststyle[The color of + is taken from optional color B.\\ % The shadow color is taken from optional color C.] % {shadowedroundedkeys}{Ctrl,Alt,Q}{S} % \teststyle[The color of + is taken from optional color B.] % {angularkeys}{Ctrl,Alt,Q}{S} % \teststyle[The color of + is taken from optional color B.\\ % The shadow color is taken from optional color C.] % {shadowedangularkeys}{Ctrl,Alt,Q}{S} % \teststyle[The color of + is taken from optional color B.] % {typewriterkeys}{Alt,Q}{S} % \teststyle[The sep color is taken from optional color C.] % {paths}{C:,User,Folder,MyFile.tex}{MyFile.tex} % \teststyle[% % The folder draw color is taken from optional color B.\\ % The folder fill color is taken from optional color A.\\ % The sep color is taken from optional color C.% % ] % {pathswithfolder}{C:,User,Folder,MyFile.tex}{MyFile.tex} % \teststyle[% % The folder draw color is taken from optional color B.\\ % The folder fill color is taken from optional color C.\\ % The sep color is taken from optional color C.% % ] % {pathswithblackfolder}{C:,User,Folder,MyFile.tex}{MyFile.tex} % % \bigskip\noindent % The following three styles allow paths elements to be hyphenated, but % they insert only a line break without a hyphen dash. Note that they only % work with |T1| and |OT1| encoding (at least I tested only these ones) % and that this in some cases doesn't work very well. % \teststyle[The sep color is taken from optional color C.] % {hyphenatepaths}{C:,Database,User,ALongUserNameHere,% % ALongerFolderNameAtThisPlace,MyFile.tex}{MyFile.tex} % \teststyle[% % The folder draw color is taken from optional color B.\\ % The folder fill color is taken from optional color A.\\ % The sep color is taken from optional color C.% % ] % {hyphenatepathswithfolder}{C:,Database,User,ALongUserNameHere,% % ALongerFolderNameAtThisPlace,MyFile.tex}{MyFile.tex} % \teststyle[% % The folder draw color is taken from optional color B.\\ % The folder fill color is taken from optional color C.\\ % The sep color is taken from optional color C.% % ] % {hyphenatepathswithblackfolder}{C:,Database,User,ALongUserNameHere,% % ALongerFolderNameAtThisPlace,MyFile.tex}{MyFile.tex} % % \bigskip\pagebreak % \minisec{Hint} The folder is drawn with the command \DM{\drawtikzfolder} % |\drawtikzfolder| which is part of \menukeys and has two optional arguments % to change the color of the lines and the fill color of the front:\\ % |\drawtikzfolder|\oarg{front fill}\oarg{draw} % % \subsubsection{Declaring styles} % The simplest way to define a new style is to use \DM{\newmenustylesimple} % |\newmenustylesimple|. It has six arguments: |\newmenustylesimple|\AST% % \marg{name}\oarg{pre}\marg{style}\oarg{sep}\oarg{post}\linebreak \marg{theme} % \begin{description} % \item [name] is the name of the new style. It must follow the % specifications of \TeX{} control sequences, which means it must % contain only letters and no numbers. % \item [pre] is the code which is executed before a menu macro. % \item [style] is the style for the first list element. It has to be % a \TikZ-style which is applied to a |node|, e.g. |draw,blue|. % \item [sep] is the code executed between the lists elements, e.g. some % space or a symbol. % \item [post] is the code which is executed after a menu macro. % \item [theme] is a color theme (see section~\ref{colors}). % \end{description} % \example Let us consider we want a list that prints a frame around its % elements and separates them by a star. We can use % \begin{verbatim} % \newmenustylesimple{mystyle}{draw}[$\ast$]{mycolors} % \end{verbatim} % % The more advanced command is \DM{\newmenustyle}|\newmenustyle|. It has % nine arguments: |\newmenustyle|\AST\marg{name}\oarg{pre}\marg{first}% % \oarg{sep}\marg{mid}\marg{last}\marg{single}\newline\oarg{post}\marg{theme} % \begin{description} % \item [name] is the name of the new style. It must follow the % specifications of \TeX{} control sequences, which means it must % contain only letters and no numbers. % \item [pre] is the code which is executed before a menu macro. % \item [first] is the style for the first list element. It has to be % a \TikZ-style which is applied to a |node|, e.g. |draw,blue|. % \item [sep] is the code executed between the lists elements, e.g. some % space or a symbol. % \item [mid] is the style for all elements between the first and the % last one. It has to be a \TikZ style. % \item [last] is the style for the last list element. % It has to be a \TikZ style. % \item [single] this style is used if the list contains only one element. % It has to be a \TikZ style. % \item [post] is the code which is executed after a menu macro. % \item [theme] is a color theme (see section~\ref{colors}). % \end{description} % \example We can extend the previous example and desire that the first and % the last element became red, and a single element should have a dashed frame. Furthermore % the menu sequence should be preceded and followed by a bullet point: % \begin{verbatim} % \newmenustyle{mystyle}[$\bullet$]{draw,red}[$\ast$]% % {draw}{draw,red}{draw,dashed}[$\bullet$] % \end{verbatim} % % If the \TikZ |node| system doesn't fit your needs there are the \textbf{starred versions}: % Use them and the arguments \meta{first}, % \meta{mid}, \meta{last}, \meta{single} can be any \LaTeX{} code. To access the % current list element use \DM{\CurrentMenuElement}|\CurrentMenuElement|. % \example consider that we want all menu elements simple be fat and not % drawn with a \TikZ |node|. The separator should be the star again: % \begin{verbatim} % \newmenustylesimple*{mystyle}{\textbf{\CurrentMenuElement}}[$\ast$] % \end{verbatim} % % If you want to make your own style you must take care of using the color % theme. \DM{\usemenucolor} To access a color of the currently applied % theme while defining a style use |\usemenucolor|\marg{element} (See % section~\ref{colors} for details about possible elements). % % \subsubsection{Copying styles} % To copy an existing style to a new style use \DM{\copymenustyle}|\copymenustyle|% % \marg{copy}\marg{original}. % \example To copy the definition of |mystyle| to |mycopy| use % \begin{verbatim} % \copymenustyle{mycopy}{mystyle} % \end{verbatim} % % \subsubsection{Changing styles} % The simplest change we can imagine is to change a single element or the color theme of % an existing style. For the first case there is \DM{\changemenuelement} % |\changemenuelement|\AST\marg{name} \marg{element}\marg{definition}, where the starred % version works like the one of |\newmenustyle| does. % \example To change the single element of |mystyle| from dashed to solid use the % following code. You may save the original style by copying it as described above. % \begin{verbatim} % \changemenuelement{mystyle}{single}{draw} % \end{verbatim} % \DM{\changemenucolortheme}To satisfy the second case use |\changemenucolortheme|% % \marg{name}\marg{color theme}. % \example To change the color theme of |mystyle| to |myothercolors| call % \begin{verbatim} % \changemenucolortheme{mystyle}{myothercolors} % \end{verbatim} % % \DM{\renewmenustylesimple}\DM{\providemenustylesimple}\DM{\renewmenustyle}% % \DM{\providemenustyle} The next level is redefining a style. This package provides % the following macros the work like their \LaTeX-paragons and have the same % arguments as the above described macros: |\renewmenustylesimple|, % |\providemenustylesimple|, |\renewmenustyle| and |\providemenustyle|. % % \subsection{Color themes}\label{colors}% % To make the colors of a style become changeable without % touching the style itself, \menukeys uses ``color themes''. Every color theme % must contain three color definitions that can be used to draw a |node| % background, a |node| frame and a text color, and additionally two optional % colors used by some themes. % \subsubsection{Predefined themes} % There are two predefined color themes % \colortest{gray}\colortest{blacknwhite} % \subsubsection{Create a theme} % \DM{\newmenucolortheme}To create a new theme use |\newmenucolortheme|. It uses the % following arguments:\\ % |\newmenucolortheme|\marg{name}\marg{model}\marg{bg}\marg{br}\marg{txt}\oarg{a}\oarg{b}\oarg{c} % \begin{description} % \item [name] is the name of the theme and must contain only letters. % \item [model] is the \pkg{xcolor} color model which is used to define a color, e.g. % |named|, |rgb|, |cmyk|, \dots % \item [bg] is the color definition for the |node| background. % \item [br] is the color definition for the |node| border. % \item [txt] is the color definition for the |node|'s text. % \item [a] is an optional additional color (by default same as bg). % \item [b] is an optional additional color (by default same as br). % \item [c] is an optional additional color (by default same as txt). % \end{description} % \example To create a theme called |mycolors| we can say % \begin{verbatim} % \newmenucolortheme{mycolors}{named}{red}{green}{blue} % \end{verbatim} % \subsubsection{Copy a theme} % \DM{\copymenucolortheme}To copy the definitions of one theme to another, % use |\copymenucolortheme| \marg{copy}\marg{original}. % \example To copy the colors of |mycolors| to |copycolors| type % \begin{verbatim} % \copymenucolortheme{copycolors}{mycolors} % \end{verbatim} % \subsubsection{Change a theme} % \DM{\changemenucolor} If you want to change the color of a theme's element % use |\changemenucolor|\marg{name} \marg{element}\marg{model}\marg{color definition}, % where name is the theme's name and \meta{element} is |bg|, |br|, or |txt|. % \example Let's change the text color of |mycolors|: % \begin{verbatim} % \changemenucolor{mycolors}{txt}{named}{gray} % \end{verbatim} % % \DM{\renewmenucolortheme}To redefine a complete theme use |\renewmenucolortheme|. % It works with the same arguments as |\newmenucolortheme|. % % \subsection{Menu macros}\label{menumacros}% % The ``menu marcos'' take a list separated by a special symbol to % print it with a menu style. % \subsubsection{Predefined menu macros} % See section~\ref{basics}. % \subsubsection{Defining or changing menu macros} % \DM{\newmenumacro}To define a new menu macro call |\newmenumacro|\marg{macro}% % \oarg{input sep}\marg{style}. % \begin{description} % \item [name] is a \LaTeX{} control sequence name. % \item [input sep] is the default separator used in the input list % (see section~\ref{basics} for a list of valid separators). % % If you don't give it the package's default (|,|) is used. % \item [style] is a menu style. % \end{description} % This wil give you a macro like |\|\meta{macro}\oarg{input sep}\marg{list} % \example Assuming you need a command to format Windows paths, you can % define it with % \begin{verbatim} % \newmenumacro{\winpath}[bslash]{mystyle} % \end{verbatim} % and then use it as e.g. |\winpath{C:\System\Deep\Deeper\YourFile.txt}|. % Note that |mystyle| must be defined before you call |\newmenumacro|. % % \DM{\providemenumacro}\DM{\renewmenumacro}There are also the two commands % |\providemenumacro| and |\renewmenumacro| which take the same arguments as % |\newmenumacro| and work like the \LaTeX{} macros |\renewcommand| and |\providecommand|. % \example To change the default input separator of |\menu| you must know % the default style (which is |menus|) and then you can say % \begin{verbatim} % \renewmenumacro{\menu}[,]{menus} % \end{verbatim} % % \subsection{Keys} % The \menukeys package comes with some macros to print % special keys in the sequences set with |\keys|. Depending on % the given OS (see section~\ref{options}) some macros behave % differently to be able to use a key even if it's undefined % via the \opt{os} option macros like |\|\meta{key}|mac| and % |\|\meta{key}|win| that will always give the right symbol. % % The full ist of key macros is shown in table~\ref{tab:keys}. % % \begin{table}[ht] % \caption{Overview of all key macros.}\label{tab:keys} % \small % \renewcommand{\arraystretch}{1.25} % \begin{minipage}[t]{0.45\textwidth} % \begin{tabular}[t]{lll} % \hline % \textbf{Macro} & \textbf{Mac} & \textbf{Win.} \\ % \hline % |\shift| & \shift & \shift\\ % |\capslock| & \capslockmac & \capslockwin\\ % |\tab| & \tabmac & \tabwin\\ % |\esc| & esc / \escmac & \escwin\\ % |\oldesc| & esc / \oldescmac & \oldescwin\\ % |\ctrl| & \ctrlmac & \ctrlwin{}\\ % |\Alt| & alt / \Altmac & \Altwin \\ % |\AltGr| & & \AltGr \\ % |\cmd| & cmd / \cmdmac & \\ % |\Space| & [empty sp.] & [empty sp.] \\ % |\SPACE| & \spacename & \spacename \\ % |\return| & \returnmac & \returnwin \\ % |\enter| & \entermac & \enterwin \\ % \hline % \end{tabular} % \end{minipage}\hfill % \begin{minipage}[t]{0.45\textwidth} % \begin{tabular}[t]{lll} % \hline % \textbf{Macro} & \textbf{Mac} & \textbf{Win.} \\ % \hline % |\winmenu| & & \winmenuwin \\ % |\backspace| & \backspace & \backspace\\ % |\del| & Del. / \delmac & \delwin{}\\ % |\backdel| & Del. / \backdelmac & \backdelwin{}\\ % |\arrowkey{^}| & \arrowkey{^} & \arrowkey{^} \\ % |\arrowkeyup| & \arrowkeyup & \arrowkeyup\\ % |\arrowkey{v}| & \arrowkey{v} & \arrowkey{v} \\ % |\arrowkeydown| & \arrowkeydown & \arrowkeydown\\ % |\arrowkey{>}| & \arrowkey{>} & \arrowkey{>} \\ % |\arrowkeyright| & \arrowkeyright & \arrowkeyright\\ % |\arrowkey{<}| & \arrowkey{<} & \arrowkey{<} \\ % |\arrowkeyleft| & \arrowkeyleft & \arrowkeyleft\\ % \hline % \end{tabular} % \end{minipage} % \end{table} % % \DM{\arrowkey} % The macro |\arrowkey|\marg{direction} is a little special % since it takes the direction as a singe character |^|, |v| % (lower case v), |>| or |<|. % % \DM{\ctrlname}\DM{\delname}\DM{\spacename}The texts for |\ctrl|, % |\del| and |\SPACE| are saved in |\ctrlname|, |\delname|, |\spacename| respectively. % So you can change them with |\renewcommand|. % % The rendering of some Mac macros depend on the option \DO{mackeys}\opt{mackeys} % The different versions are shown in the table (left: |text|, right: |symbols|). % % \bigskip\noindent % I apologize that there are no commands for the windows key % and the apple logo, but that would be a copyright infringement. % % \section{Known issues and bugs}\label{sec:issues} % \begin{itemize} % \item If you use the \pkg{inputenc} package \menukeys must be % loaded after it. Otherwise some key macros get corrupted. % \item \changes{v1.1}{2012/02/26}{Load \pkg{xcolor} before \menukeys.} % \menukeys must be loaded after \pkg{xcolor}, if you load % the latter with options. Otherwise you'll get an option clash. % Since \menukeys loads \pkg{xcolor} internally you may pass % options as global options via |\documentclass| or directly to it via % |\PassOptionsToPackage|. % \example Set \pkg{xcolor} to |cmyk| model: % \begin{verbatim} % \documentclass{article} % \PassOptionsToPackage{cmyk}{xcolor} % \usepackage{menukeys} % \begin{document} % Hello World! % \end{document} % \end{verbatim} % \end{itemize} % % If you find something to add to this list please send me an e-mail or report a % bug on GitHub (\url{https://github.com/tweh/menukeys}). % % \StopEventually{\clearpage\PrintChanges\clearpage\PrintIndex} % % \section{Implementation} % \begin{macrocode} %<*pkg> % \end{macrocode} % \subsection{Required packages} % \changes{v1.6}{2020/10/27}{Don't load \pkg{catoptions}} % Load the required packages % \begin{macrocode} \RequirePackage{xparse} \RequirePackage{xstring} \RequirePackage{etoolbox} % \end{macrocode} % Furthermore we need \TikZ and some of its libraries, % \begin{macrocode} \RequirePackage{tikz} \usetikzlibrary{calc,shapes.symbols,shadows} % \end{macrocode} % the color package \pkg{xcolor} and \pkg{adjustbox} for the % |typewriterkeys| style. % \begin{macrocode} \RequirePackage{xcolor} \RequirePackage{adjustbox} % \end{macrocode} % Load \pkg{relsize} to be able to change the font size % relative to the surrounding text. % \begin{macrocode} \RequirePackage{relsize} % \end{macrocode} % To define the list parsing commands and allow |\| as % a separator we used to load \pkg{catoptions}. Instead we now use some % \pkg{expl3} functions to replace the macros we required from \pkg{catoptions}. % % The first few of these functions are more or less direct equivalents. A bit of % attention has to be paid for |\tw@mk@xifinsetTF| as it requires the arguments % to get swapped. % \begin{macrocode} \ExplSyntaxOn \cs_new_eq:NN \tw@mk@trimspaces \tl_trim_spaces:n \cs_new_eq:NN \tw@mk@exp@Nnno \exp_args:Nnno \cs_new_eq:NN \tw@mk@string \cs_to_str:N \prg_generate_conditional_variant:Nnn \tl_if_in:nn { xx } { TF } \cs_new:Npn \tw@mk@xifinsetTF #1 #2 { \tl_if_in:xxTF {#2} {#1} } % \end{macrocode} % The replacement for |\indrisloop| will not set the conditional % |\iflastindris|, instead we can check whether the sequence is empty to see % whether this is the last element. This test will not use a TeX-like % |\iflastindris...\else...\fi| construct but instead two branches. % \begin{macrocode} \cs_new:Npn \tw@mk@iflastindris { \seq_if_empty:NTF \l__twmk_indris_seq } % \end{macrocode} % Replacing |\indrisloop| is a bit more work as it requires us to push some % values to a stack (to allow nested usage, this may not be necessary for % \pkg{menukeys}, but it is part of the original |\indrisloop| so we should % play nice here). First we'll need a few variables. % \begin{macrocode} \seq_new:N \l__twmk_indris_seq \int_new:N \l__twmk_indris_int \tl_new:N \l__twmk_indris_tl \cs_new_eq:NN \tw@mk@indrisnr \l__twmk_indris_int \seq_new:N \l__twmk_indris_seqstack_seq \seq_new:N \l__twmk_indris_intstack_seq % \end{macrocode} % Our stack will use another sequence in which the definitions of the parent % call will be stored for the sequence and the integer. The other variables put % on a stack by |\indrisloop| aren't required. The synopsis of % |\tw@mk@indrisloop| will be different to the one provided by \pkg{catoptions}. % The delimiter will be a mandatory argument (not in brackets), and there is no % starred version. % \begin{macrocode} \cs_new_protected:Npn \__twmk_pushseq: { \seq_push:No \l__twmk_indris_seqstack_seq \l__twmk_indris_seq } \cs_new_protected:Npn \__twmk_pushint: { \seq_push:NV \l__twmk_indris_intstack_seq \l__twmk_indris_int } \cs_new_protected:Npn \__twmk_popseq: { \seq_if_empty:NTF \l__twmk_indris_seqstack_seq { \seq_clear:N \l__twmk_indris_seq } { \seq_pop:NN \l__twmk_indris_seqstack_seq \l__twmk_indris_seq } } \cs_new_protected:Npn \__twmk_popint: { \seq_if_empty:NTF \l__twmk_indris_intstack_seq { \int_zero:N \l__twmk_indris_int } { \group_begin: \seq_pop:NN \l__twmk_indris_intstack_seq \l__twmk_indris_tl \exp_args:NNNo \group_end: \int_set:Nn \l__twmk_indris_int \l__twmk_indris_tl } } % \end{macrocode} % The real loop works by first splitting the input into a sequence according to % the delimiter in |#1|. Then this sequence is stepped through, but instead of % using |\seq_map:NN| we'll have to pop the sequence into a local variable so % that our test for the last element works. The parameter |#2| has to be % expanded once as it is handed in as a token storing the real argument in later % use. % \begin{macrocode} \cs_generate_variant:Nn \seq_set_split:Nnn { Noo } \cs_new_protected:Npn \tw@mk@indrisloop #1 #2 #3 { \__twmk_pushseq: \__twmk_pushint: \seq_set_split:Noo \l__twmk_indris_seq {#1} {#2} \int_zero:N \l__twmk_indris_int \bool_do_while:nn { \bool_not_p:n { \seq_if_empty_p:N \l__twmk_indris_seq } } { \int_incr:N \l__twmk_indris_int \seq_pop_left:NN \l__twmk_indris_seq \l__twmk_indris_tl \exp_args:No #3 \l__twmk_indris_tl } \__twmk_popseq: \__twmk_popint: } \ExplSyntaxOff % \end{macrocode} % % \subsection{Helper macros} % \begin{macro}{\tw@mk@error}\begin{macro}{\tw@mk@warning} % \begin{macro}{\tw@mk@warning@noline} % Define macros to call |\PackageError| and warnings % \begin{macrocode} \newcommand*{\tw@mk@error}[2][Please consult the manual for more information.]{% \PackageError{menukeys}{#2}{#1}% } \newcommand*{\tw@mk@warning}[1]{% \PackageWarning{menukeys}{#1}% } \newcommand*{\tw@mk@warning@noline}[1]{% \PackageWarningNoLine{menukeys}{#1}% } % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\tw@mk@tempa}\begin{macro}{\tw@mk@tempb} % Some commands for temporary use: % \begin{macrocode} \def\tw@mk@tempa{} \def\tw@mk@tempb{} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\tw@mk@gobble@args} % Define a command to gobble arguments. % \begin{macrocode} \DeclareDocumentCommand{\tw@mk@gobble@args}{m}{% \RenewDocumentCommand{\tw@mk@tempa}{#1}{}% \tw@mk@tempa% } % \end{macrocode} % \end{macro} % % \subsection{Options} % First we declare and process the package options % \begin{macrocode} \RequirePackage{kvoptions} \SetupKeyvalOptions{ family=tw@mk, prefix=tw@mk@ } \DeclareBoolOption[true]{definemenumacros} \DeclareBoolOption[true]{definekeys} \DeclareBoolOption[false]{hyperrefcolorlinks} \DeclareStringOption[mac]{os} \DeclareStringOption[symbols]{mackeys} \ProcessKeyvalOptions{tw@mk}\relax % \end{macrocode} % Now we have to do some error treatment: % \begin{macrocode} \IfSubStr{.mac.win.}{.\tw@mk@os.}{}{% \tw@mk@error{Unknown value for option 'os'\MessageBreak Possible values are 'mac' or 'win'.}% } \IfSubStr{.symbols.text.}{.\tw@mk@mackeys.}{}{% \tw@mk@error{Unknown value for option 'mackeys'\MessageBreak Possible values are 'symbols' or 'text'.}% } % \end{macrocode} % % \subsection{Workarounds} % Some workarounds to ``solve'' some incompatibilities: % \subsubsection{\pkg{hyperref}'s \opt{colorlinks} option}\label{sec:hyperref-colorlinks} % \changes{v1.6}{2020/10/27}{\opt{hyperrefcolorlinks} obsolete} % \changes{v1.5}{2016/08/08}{New option \opt{hyperrefcolorlinks}} % There used to be an issue with using the \opt{colorlinks} option of % \pkg{hyperref} due to \pkg{catoptions} being loaded. Since \pkg{catoptions} % isn't required any more, this workaround isn't necessary. For backwards % compatibility the \opt{hyperrefcolorlinks} option is still evaluated and just % uses |\hypersetup| or |\PassOptionsToPackage| depending on whether % \pkg{hyperref} is already loaded. % \begin{macrocode} \iftw@mk@hyperrefcolorlinks \tw@mk@warning{The option `hyperrefcolorlinks' is obsolete} \@ifpackageloaded{hyperref} {\hypersetup{colorlinks}} {\PassOptionsToPackage{colorlinks}{hyperref}} \fi % \end{macrocode} % % \subsection{Color themes} % \subsubsection{Internal commands} % \begin{macro}{\tw@make@color@theme} % First we define an internal command to make a color theme % \begin{macrocode} \newcommand*{\tw@make@color@theme}[8]{% \definecolor{tw@color@theme@#1@bg}{#2}{#3}% \definecolor{tw@color@theme@#1@br}{#2}{#4}% \definecolor{tw@color@theme@#1@txt}{#2}{#5}% \definecolor{tw@color@theme@#1@a}{#2}{#6}% \definecolor{tw@color@theme@#1@b}{#2}{#7}% \definecolor{tw@color@theme@#1@c}{#2}{#8}% } % \end{macrocode} % \end{macro} % \subsubsection{User-level commands} % \begin{macro}{\newmenucolortheme}\begin{macro}{\renewmenucolortheme} % After that we define the user-level commands: % \begin{macrocode} \NewDocumentCommand{\newmenucolortheme}{ m m m m m O{#3} O{#4} O{#5} }{% \@ifundefinedcolor{tw@color@theme@#1@bg}{% \tw@make@color@theme{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}% }{% \tw@mk@error{Color theme '#1' already defined!\MessageBreak Use \string\renewmenucolortheme\space instead.}% } } \NewDocumentCommand{\renewmenucolortheme}{ m m m m m O{#3} O{#4} O{#5} }{% \tw@make@color@theme{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}% } % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\changemenucolor}\begin{macro}{\copymenucolortheme} % Lastly we define the changing and copying commands % \begin{macrocode} \newcommand*{\changemenucolor}[4]{% \IfSubStr{ bg br txt }{ #2 }{% \definecolor{tw@color@theme@#1@#2}{#3}{#4}% }{% \tw@mk@error{No such color element ('#2')!\MessageBreak Possible values are bg, br and txt.} }% } \newcommand*{\copymenucolortheme}[2]{% \@ifundefinedcolor{tw@color@theme@#1@bg}{% \colorlet{tw@color@theme@#1@bg}{tw@color@theme@#2@bg}% \colorlet{tw@color@theme@#1@br}{tw@color@theme@#2@br}% \colorlet{tw@color@theme@#1@txt}{tw@color@theme@#2@txt}% \colorlet{tw@color@theme@#1@a}{tw@color@theme@#2@a}% \colorlet{tw@color@theme@#1@b}{tw@color@theme@#2@b}% \colorlet{tw@color@theme@#1@c}{tw@color@theme@#2@c}% }{% \tw@mk@error{Color theme '#1' already defined!\MessageBreak Use \string\renewmenucolortheme\space instead.} } } % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\changemenucolortheme} % To be able to change the color theme of a style we must define this: % \begin{macrocode} \newcommand{\changemenucolortheme}[2]{% \ifcsundef{tw@style@#1@pre}{% \tw@mk@error{Style '#1' undefined!\MessageBreak Maybe you misspelled it?}% }{% \@ifundefinedcolor{tw@color@theme@#2@bg}{% \tw@mk@error{Color theme '#2' is not defined!}% }{% \csdef{tw@style@#1@color@theme}{#2}% }% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\usemenucolor} % To use a color of a theme we define |\usemenucolor| as following. % \begin{macrocode} \newcommand{\usemenucolor}[1]{% tw@color@theme@\tw@current@color@theme @#1% } % \end{macrocode} % \end{macro} % \subsubsection{Predefined themes} % There are two predefined color themes % \begin{macrocode} \newmenucolortheme{gray}{gray}{0.95}{0.3}{0}[0.95][0][0] \newmenucolortheme{blacknwhite}{gray}{1}{0}{0}[1][0][0] % \end{macrocode} % \subsection{Styles} % The style generating commands will set some commands that are named % like |\tw@style@|\meta{name}|@|\meta{element}. % \begin{macro}{\tw@default@sep} % \begin{macro}{\tw@default@pre} % \begin{macro}{\tw@default@post} % Before we can define the internal % declaring macro to use it later in the user level commands, we have to set % some defaults for the optional arguments % \begin{macrocode} \newcommand{\tw@default@sep}{% \hspace{0.2em plus 0.1em minus 0.5em}% } \newcommand{\tw@default@pre}{} \newcommand{\tw@default@post}{} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \subsubsection{Internal commands} % Now we can define the internal commands. % \begin{macro}{\tw@declare@style@simple} % Our first step is to define the simple command. % \begin{macrocode} \DeclareDocumentCommand{\tw@declare@style@simple}{% s m O{\tw@default@pre} m O{\tw@default@sep} O{\tw@default@post} m }{% \csdef{tw@style@#2@color@theme}{#7}% \csdef{tw@style@#2@pre}{#3}% \csdef{tw@style@#2@sep}{#5}% \csdef{tw@style@#2@post}{#6}% \IfBooleanTF{#1}{% \csdef{tw@style@#2@single}{#4}% \csdef{tw@style@#2@first}{#4}% \csdef{tw@style@#2@mid}{#4}% \csdef{tw@style@#2@last}{#4}% }{% \csdef{tw@style@#2@single}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@first}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@mid}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@last}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\CurrentMenuElement};}}% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\tw@declare@style}\begin{macro}{\tw@declare@style@extra@args} % The next step is to create the extended command. This command must have % ten arguments (including the star) so we have to define a helping macro % to grab the last two macros. % \begin{macrocode} \DeclareDocumentCommand{\tw@declare@style@extra@args}{% O{\tw@default@post} m }{% \csdef{tw@style@\tw@current@style @post}{#1}% \csdef{tw@style@\tw@current@style @color@theme}{#2}% } % \end{macrocode} % Now we can define |\tw@declare@style|: % \begin{macrocode} \DeclareDocumentCommand{\tw@declare@style}{% s m O{\tw@default@pre} m O{\tw@default@sep} m m m }{% \def\tw@current@style{#2} \csdef{tw@style@#2@pre}{#3}% \csdef{tw@style@#2@sep}{#5}% \IfBooleanTF{#1}{% \csdef{tw@style@#2@single}{#8}% \csdef{tw@style@#2@first}{#4}% \csdef{tw@style@#2@mid}{#6}% \csdef{tw@style@#2@last}{#7}% }{% \csdef{tw@style@#2@single}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#8]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@first}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@mid}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#6]{\strut\CurrentMenuElement};}}% \csdef{tw@style@#2@last}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#7]{\strut\CurrentMenuElement};}}% }% \tw@declare@style@extra@args% } % \end{macrocode} % \end{macro}\end{macro} % \subsubsection{User-level commands} % \begin{macro}{newmenustylesimple}\begin{macro}{renewmenustylesimple}% % \begin{macro}{providemenustylesimple}\begin{macro}{newmenustyle}\begin{macro}% % {renewmenustyle}\begin{macro}{providemenustyle} % It's time to define the user-level commands now: % \begin{macrocode} \NewDocumentCommand{\newmenustylesimple}{s m}{% \ifcsundef{tw@style@#2@pre}{% \IfBooleanTF{#1}{% \tw@declare@style@simple*{#2}% }{% \tw@declare@style@simple{#2}% }% }{% \tw@mk@error{Style '#2' already defined!\MessageBreak Use \string\renewmenustylesimple\space instead.}% \tw@mk@gobble@args{o m o o m}% }% } \NewDocumentCommand{\renewmenustylesimple}{s m}{% \IfBooleanTF{#1}{% \tw@declare@style@simple*{#2}% }{% \tw@declare@style@simple{#2}% }% } \NewDocumentCommand{\providemenustylesimple}{s m}{% \ifcsundef{tw@style@#2@pre}{% \IfBooleanTF{#1}{% \tw@declare@style@simple*{#2}% }{% \tw@declare@style@simple{#2}% }% }{% \tw@mk@warning{Trying to provide style '#2' failed,\MessageBreak because it's already defined.\MessageBreak You may use \string\renewmenustylesimple\space instead.}% \tw@mk@gobble@args{o m o o m}% }% } \NewDocumentCommand{\newmenustyle}{s m}{% \ifcsundef{tw@style@#2@pre}{% \IfBooleanTF{#1}{% \tw@declare@style*{#2}% }{% \tw@declare@style{#2}% }% }{% \tw@mk@error{Style '#2' already defined!\MessageBreak Use \string\renewmenustyle\space instead.}% \tw@mk@gobble@args{o m o m m m o m}% }% } \NewDocumentCommand{\renewmenustyle}{s m}{% \IfBooleanTF{#1}{% \tw@declare@style*{#2}% }{% \tw@declare@style{#2}% }% } \NewDocumentCommand{\providemenustyle}{s m}{% \ifcsundef{tw@style@#2@pre}{% \IfBooleanTF{#1}{% \tw@declare@style*{#2}% }{% \tw@declare@style{#2}% }% }{% \tw@mk@warning{Trying to provide style #2 failed,\MessageBreak because it's already defined.\MessageBreak You may use \string\renewmenustyle\space instead.}% \tw@mk@gobble@args{o m o m m m o m}% }% } % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \subsubsection{Copying and changing} % \begin{macro}{\copymenustyle} % The last two steps in this part are to define a command to copy % styles % \begin{macrocode} \newcommand*{\copymenustyle}[2]{% \ifcsundef{tw@style@#1@pre}{% \ifcsundef{tw@style@#2@pre}{% \tw@mk@error{Can't copy not existing style ('#2')!}% }{% \csletcs{tw@style@#1@pre}{tw@style@#2@pre}% \csletcs{tw@style@#1@post}{tw@style@#2@post}% \csletcs{tw@style@#1@sep}{tw@style@#2@sep}% \csletcs{tw@style@#1@single}{tw@style@#2@single}% \csletcs{tw@style@#1@first}{tw@style@#2@first}% \csletcs{tw@style@#1@mid}{tw@style@#2@mid}% \csletcs{tw@style@#1@last}{tw@style@#2@last}% \csletcs{tw@style@#1@color@theme}{tw@style@#2@color@theme} }% }{% \tw@mk@error{Style '#1' already exists!}% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\changemenuelement} % and one to change a single element of a style. % \begin{macrocode} \NewDocumentCommand{\changemenuelement}{s m m m}{% \ifcsundef{tw@style@#2@pre}{% \tw@mk@error{Style '#2' undefined.}% }{% \IfSubStr{ single first middle last pre post sep }{ #3 }{% \IfBooleanTF{#1}{% \csdef{tw@style@#2@#3}{#4}% }{% \IfSubStr{ pre post sep }{ #3 }{% \csdef{tw@style@#2@#3}{#4}% }{% \csdef{tw@style@#2@#3}{% \tikz[baseline=(tw@node.base)]{% \node(tw@node)[#4]{\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}}% }% }% }{\tw@mk@error{No element '#3'. Possible values are\MessageBreak single, first, middle, last, pre, post or sep.}}% }% } % \end{macrocode} % \end{macro} % \subsubsection{Predefined styles} % We define several styles for menu sequences, paths and keystrokes. % \begin{macro}{tw@set@tikz@colors} % First we define a \TikZ-style to apply the color theme to a node % easily % \begin{macrocode} \tikzset{tw@set@tikz@colors/.style={% draw=\usemenucolor{br}, fill=\usemenucolor{bg}, text=\usemenucolor{txt}, }} % \end{macrocode} % \end{macro} % Now we can define the styles. To keep the most settings of % a style together we make additional \TikZ-styles instead of setting % everything directly to the |node|s. % \begin{macrocode} \tikzset{tw@menus@base/.style={% tw@set@tikz@colors, rounded corners=0.15ex, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, signal, signal to=nowhere, signal pointer angle=110, }} \tw@declare@style*{menus}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menus@base,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[\hspace{-0.2em}\hspace{0em plus 0.1em minus 0.05em}]% {% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menus@base,signal from=west,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menus@base,signal from=west,]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@menus@base]{\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{gray} \tikzset{tw@roundedmenus@base/.style={% tw@set@tikz@colors, rounded corners=0.3ex, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, signal, signal to=nowhere, signal pointer angle=110, }} \tw@declare@style*{roundedmenus}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@roundedmenus@base,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[\hspace{-0.2em}\hspace{0em plus 0.1em minus 0.05em}]% {% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@roundedmenus@base,signal from=west,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@roundedmenus@base,signal from=west,]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@roundedmenus@base]{\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{gray} \tikzset{tw@angularmenus@base/.style={% tw@set@tikz@colors, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, signal, signal to=nowhere, signal pointer angle=110, }} \tw@declare@style*{angularmenus}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@angularmenus@base,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[\hspace{-0.2em}\hspace{0em plus 0.1em minus 0.05em}]% {% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@angularmenus@base,signal from=west,signal to=east]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@angularmenus@base,signal from=west,]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@angularmenus@base]{\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }{gray} \tikzset{tw@roundedkeys@base/.style={% tw@set@tikz@colors, rounded corners=0.3ex, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, }} \tw@declare@style@simple*{roundedkeys}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@roundedkeys@base]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[% \hspace{0.1em plus 0.1em minus 0.05em}% \textcolor{\usemenucolor{b}}{\raisebox{0.25ex}{\sffamily\relsize{-2}+}}% \hspace{0.1em plus 0.1em minus 0.05em}% ]{gray} \tikzset{tw@shadowedroundedkeys@base/.style={% tw@set@tikz@colors, rounded corners=0.3ex, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, general shadow={% shadow xshift=.2ex, shadow yshift=-.15ex, fill=\usemenucolor{c}, }, }} \tw@declare@style@simple*{shadowedroundedkeys}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@shadowedroundedkeys@base]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};% }% }[% \hspace{0.2ex}\hspace{0.1em plus 0.1em minus 0.05em}% \textcolor{\usemenucolor{b}}{\raisebox{0.25ex}{\sffamily\relsize{-2}+}}% \hspace{0.1em plus 0.1em minus 0.05em}% % \end{macrocode} % \changes{v1.6.2}{2022/07/01}{changed \cs{hspace} to \cs{kern}} % \begin{macrocode} % %][\kern0.2ex\relax]{gray} %<161>][\hspace{0.2ex}]{gray} %<*pkg> % \end{macrocode} % \begin{macrocode} \tikzset{tw@angularkeys@base/.style={% tw@set@tikz@colors, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, }} \tw@declare@style@simple*{angularkeys}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@angularkeys@base]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[% \hspace{0.1em plus 0.1em minus 0.05em}% \textcolor{\usemenucolor{b}}{\raisebox{0.25ex}{\sffamily\relsize{-2}+}}% \hspace{0.1em plus 0.1em minus 0.05em}% ]{gray} \tikzset{tw@shadowedangularkeys@base/.style={% tw@set@tikz@colors, inner sep=0pt, inner xsep=2pt, text height=1.825ex, text depth=0.7ex, minimum width=1.5em, font=\relsize{-1}\sffamily, general shadow={% shadow xshift=.2ex, shadow yshift=-.15ex, fill=\usemenucolor{c}, }, }} \tw@declare@style@simple*{shadowedangularkeys}{% \tikz[baseline={($(tw@node.base)+(0,-0.2ex)$)}]{% \node(tw@node)[tw@shadowedangularkeys@base]% {\strut\color{\usemenucolor{txt}}\CurrentMenuElement};}% }[% \hspace{0.2ex}\hspace{0.1em plus 0.1em minus 0.05em}% \textcolor{\usemenucolor{b}}{\raisebox{0.25ex}{\sffamily\relsize{-2}+}}% \hspace{0.1em plus 0.1em minus 0.05em}% % \end{macrocode} % \changes{v1.6.2}{2022/07/01}{changed \cs{hspace} to \cs{kern}} % \begin{macrocode} % %][\kern0.2ex\relax]{gray} %<161>][\hspace{0.2ex}]{gray} %<*pkg> % \end{macrocode} % \begin{macrocode} \tikzset{tw@typewriterkeys@base/.style={% tw@set@tikz@colors, shape=circle, minimum size=2ex, inner sep=0.5pt, outer sep=1pt, font=\ttfamily\relsize{-1}, }} \tw@declare@style@simple*{typewriterkeys}{% \def\tw@typewriterkeys@curr@elem{% \maxsizebox*{2ex}{2ex}{\CurrentMenuElement}% }% \begin{tikzpicture}[baseline={($(tw@node.south)+(0,0.8ex)$)}]% \node(tw@node)[% tw@typewriterkeys@base, inner sep=1.25pt, line width=0.6pt% ]{\color{\usemenucolor{txt}}\tw@typewriterkeys@curr@elem}; \node[tw@typewriterkeys@base]% {\color{\usemenucolor{txt}}\tw@typewriterkeys@curr@elem}; \end{tikzpicture}% }[% \hspace{0.2ex}\hspace{0.1em plus 0.1em minus 0.05em}% \textcolor{\usemenucolor{b}}{\raisebox{0.25ex}{\sffamily\relsize{-2}+}}% \hspace{0.1em plus 0.1em minus 0.05em}% ]{blacknwhite} \tw@declare@style@simple*{paths}{% {\ttfamily\color{\usemenucolor{txt}}\CurrentMenuElement}% }[% \hspace{0.2em plus 0.1em}% \raisebox{0.08ex}{% \tikz{\fill[\usemenucolor{c}] (0,0) -- (0.5ex,0.5ex)% -- (0,1ex) -- cycle;}% }% \hspace{0.2em plus 0.1em}% ]{blacknwhite} \newcounter{tw@hyphen@char@num} \newif\if@tw@hyphenatepaths@warnig \@tw@hyphenatepaths@warnigtrue \tw@declare@style@simple*{hyphenatepaths}{% {\ttfamily \IfStrEq{T1}{\encodingdefault}{% \setcounter{tw@hyphen@char@num}{23}% }{% \IfStrEq{OT1}{\encodingdefault}{% \setcounter{tw@hyphen@char@num}{255}% }{% \if@tw@hyphenatepaths@warnig% \tw@mk@warning{The hyphenatepaths styles will probably only\MessageBreak work with T1 or OT1 encoding.}% \fi\global\@tw@hyphenatepaths@warnigfalse% }% }% \hyphenchar\font=\value{tw@hyphen@char@num}\relax \color{\usemenucolor{txt}}% \CurrentMenuElement}% }[% \hspace{0.2em plus 0.1em}% \raisebox{0.08ex}{% \tikz{\fill[\usemenucolor{c}] (0,0) -- (0.5ex,0.5ex)% -- (0,1ex) -- cycle;}% }% \hspace{0.2em plus 0.1em}% ]{blacknwhite} \NewDocumentCommand{\drawtikzfolder}{O{white} O{black}}{% \begin{tikzpicture}[rounded corners=0.02ex,scale=0.7] \draw [#2] (0,0) -- (1em,0) -- (1em,1.5ex) -- (0.5em,1.5ex) -- % (0.4em,1.7ex) -- (0.1em,1.7ex) -- (0,1.5ex) -- cycle; \draw [#2,fill=#1] (0,0) -- (1em,0) -- (0.85em,1.15ex) -- % ++(-1em,0) -- cycle; \end{tikzpicture}% } \copymenustyle{pathswithfolder}{paths} \changemenuelement{pathswithfolder}{pre}{% \drawtikzfolder[\usemenucolor{a}][\usemenucolor{b}]% \hspace{0.2em plus 0.1em}% } \copymenustyle{pathswithblackfolder}{paths} \changemenuelement{pathswithblackfolder}{pre}{% \drawtikzfolder[\usemenucolor{c}][\usemenucolor{b}]% \hspace{0.2em plus 0.1em}% } \copymenustyle{hyphenatepathswithfolder}{hyphenatepaths} \changemenuelement{hyphenatepathswithfolder}{pre}{% \drawtikzfolder[\usemenucolor{a}][\usemenucolor{b}]% \hspace{0.2em plus 0.1em}% } \copymenustyle{hyphenatepathswithblackfolder}{hyphenatepaths} \changemenuelement{hyphenatepathswithblackfolder}{pre}{% \drawtikzfolder[\usemenucolor{c}][\usemenucolor{b}]% \hspace{0.2em plus 0.1em}% } % \end{macrocode} % % \subsection{Menu macros} % \subsubsection{Internal commands} % \begin{macro}{\tw@default@input@sep} % First we define our default input separator % \begin{macrocode} \def\tw@default@input@sep{,} % \end{macrocode} % \end{macro} % \begin{macro}{\CurrentMenuElement} and the |\CurrentMenuElement| dummy % \begin{macrocode} \def\CurrentMenuElement{} % \end{macrocode} % \end{macro} % \begin{macro}{\tw@define@menu@macro} % \changes{v1.6.1}{2020/12/19}{Handles default input separator.} % \begin{macro}{\tw@define@menu@macro@} % \changes{v1.1a}{2013/05/28}{Fixed minor bug, that causes a warning about robustifying (issue \#23), % by deleting the line to make the command robust.} % \changes{v1.2}{2013/07/23}{Replaced \cs{edef} by \cs{protected@edef}} % \changes{v1.2c}{2013/07/23}{Replaced \cs{protected@edef} by \cs{def}} % \changes{v1.2}{2013/07/23}{Added \cs{leavevmode}} % \changes{v1.6}{2020/10/27}{Don't use \cs{NewDocumentCommand}} % \changes{v1.6.1}{2020/12/19}{Renamed from \cs{tw@define@menu@macro}} % \changes{v1.6.1}{2020/12/19}{No x-type expansion on the separator to call the % loop} % Then we set up the internal command to create new menu macros. % The list parsing code was essentially provided by Ahmed Musa at % \url{https://tex.stackexchange.com/a/44989/4918}. Jonathan P.\@ Spratte % made some major changes to make \pkg{menukeys} work without \pkg{catoptions} % and reimplemented the parsing code using \LaTeX3. Thank you both very much! % \begin{macrocode} \begingroup \lccode`\,=1 \lowercase{\endgroup \@ifdefinable\tw@mk@test@input@sep {% \protected\def\tw@mk@test@input@sep#1{% \tw@mk@xifinsetTF {,\tw@mk@trimspaces{#1},}{,bslash,backslash,directory,location,}% }% }% } \newcommand\tw@define@menu@macro[3] {% \IfNoValueTF{#3} {\tw@mk@exp@Nnno\tw@define@menu@macro@{#1}{#2}\tw@default@input@sep} {\tw@define@menu@macro@{#1}{#2}{#3}}% } \newcommand\tw@define@menu@macro@[4] {% \ifcsundef{tw@style@#4@sep} {% \tw@mk@error {% Can't define menu macro \string#2\space,\MessageBreak because the style '#4' is not available!% }% } {% \csdef{tw@parse@menu@list@\tw@mk@string#2}##1% {% \def\CurrentMenuElement{##1}% \tw@mk@iflastindris {% \ifnum\tw@mk@indrisnr=\@ne \@nameuse{tw@style@#4@single}% \else \@nameuse{tw@style@#4@sep}% \@nameuse{tw@style@#4@last}% \fi } {% \ifnum\tw@mk@indrisnr=\@ne \@nameuse{tw@style@#4@first}% \else \@nameuse{tw@style@#4@sep}% \@nameuse{tw@style@#4@mid}% \fi }% }% #1#2{+O{#3}+m}% {% \leavevmode \begingroup \def\tw@current@color@theme {\csname tw@style@#4@color@theme\endcsname}% \@nameuse{tw@style@#4@pre}% \tw@mk@test@input@sep{##1} {% \edef\tw@menu@list{\detokenize{##2}}% \edef\tw@mk@tempa{\@backslashchar}% } {% \edef\tw@menu@list{\unexpanded{##2}}% \edef\tw@mk@tempa{\tw@mk@trimspaces{##1}}% }% \begingroup \letcs{\tw@mk@tempb}{tw@parse@menu@list@\tw@mk@string#2}% \tw@mk@indrisloop\tw@mk@tempa\tw@menu@list\tw@mk@tempb \endgroup \@nameuse{tw@style@#4@post}% \endgroup }% }% } % \end{macrocode} % \end{macro} % \end{macro} % \subsubsection{User-level commands} % \begin{macro}{\newmenumacro} % \changes{v1.1a}{2013/05/28}{Added a line to make a new macro robust.} % \changes{v1.6}{2020/10/27}{use \cs{NewDocumentCommand}} % \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}} % \begin{macro}{\renewmenumacro} % \changes{v1.6}{2020/10/27}{use \cs{RenewDocumentCommand}} % \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}} % \begin{macro}{\providemenumacro} % \changes{v1.6}{2020/10/27}{use \cs{ProvideDocumentCommand}} % \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}} % Now it's time to build the user-level commands % \begin{macrocode} \NewDocumentCommand{\newmenumacro}{m o m}{% \ifcsundef{\tw@mk@string#1}{% \tw@define@menu@macro\NewDocumentCommand{#1}{#2}{#3}% }{% \tw@mk@error{Menu macro '\string#1' already defined!\MessageBreak Use \string\renewmenustyle\space instead.}% }% } \NewDocumentCommand{\renewmenumacro}{m o m}{% \tw@define@menu@macro\RenewDocumentCommand{#1}{#2}{#3}% } \NewDocumentCommand{\providemenumacro}{m o m}{% \ifcsundef{\tw@mk@string#1}{% \tw@define@menu@macro\ProvideDocumentCommand{#1}{#2}{#3}% }{% \tw@mk@warning{Menu macro '\string#1' already defined!\MessageBreak Use \string\renewmenustyle\space to redefine it.}% }% } % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \subsubsection{Predefined menu macros} % Now we got all tools to predefine some menu macros. To be sure that % these commands won't conflict with other packages we introduced the % option |definemacros|. Here we have to check it: % \begin{macrocode} \iftw@mk@definemenumacros % \end{macrocode} % \begin{macro}{\menu}\begin{macro}{\directory}% % \changes{v1.1}{2012/02/27}{Renamed \cmd{\path} to \cmd{\directory} because it % crashes with \pkg{biblatex}} % \begin{macro}{\keys} % And then we define three basic macros. % \begin{macrocode} \newmenumacro{\menu}[>]{menus} \newmenumacro{\directory}[/]{paths} \newmenumacro{\keys}[+]{roundedkeys} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % Lastly we close the |definemacros| if statement: % \begin{macrocode} \fi % \end{macrocode} % % \subsection{Keys} % Before we define anything we check if the user allows it: % \begin{macrocode} \iftw@mk@definekeys % \end{macrocode} % % Before define the key macros we create some macros that save some typing by % condensing the similarities between the key macros. % \begin{macro}{\tw@make@key@box} % The first of these macros helps us building save boxes % to store the |{tikzpicture}|, that will draw the key later. % This is necessary because otherwise the picture will inherit % the style of the key sequence |node|. % \begin{macrocode} \NewDocumentCommand{\tw@make@key@box}{m m}{% % \expandafter\newbox\csname tw@mk@box@#1\endcsname % \expandafter\sbox\csname tw@mk@box@#1\endcsname{% % #2% % }% \csdef{tw@mk@#1}{% % \expandafter\usebox\csname tw@mk@box@#1\endcsname% #2% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\tw@make@key@macro} % The next macro defines the user level command by accessing a % macro like |tw@mk@|\meta{key} or |tw@mk@|\meta{key}|@|\meta{os}, % if the appearance differs between Mac and Windows. % To use this macro we assume that the |tw@mk@|\meta{key} commands % are defined. % \begin{macrocode} \NewDocumentCommand{\tw@make@key@macro}{s m}{% \IfBooleanTF{#1}{% \expandafter\providecommand\csname\tw@mk@string#2\endcsname{% \expandonce{\maxsizebox{!}{1.8ex}{% \@nameuse{tw@mk@\tw@mk@string#2@\tw@mk@os}}% }% }% \expandafter\providecommand\csname\tw@mk@string#2mac\endcsname{% \expandonce{\maxsizebox{!}{1.8ex}{% \@nameuse{tw@mk@\tw@mk@string#2@mac}}% }% }% \expandafter\providecommand\csname\tw@mk@string#2win\endcsname{% \expandonce{\maxsizebox{!}{1.8ex}{% \@nameuse{tw@mk@\tw@mk@string#2@win}}% }% }% }{% \expandafter\providecommand\csname\tw@mk@string#2\endcsname{% \expandonce{\maxsizebox{!}{1.8ex}{% \@nameuse{tw@mk@\tw@mk@string#2}}% }% }% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\tw@define@mackey} % The last helping macro is |\tw@define@mackey|. We use it to execute % code depending on the |mackeys| option. % \begin{macrocode} \newcommand*{\tw@define@mackey}[2]{% \IfStrEq{text}{\tw@mk@mackeys}{#1}{% \IfStrEq{symbols}{\tw@mk@mackeys}{#2}{}% }% } % \end{macrocode} % \end{macro} % % Next thing to do is to set up some \TikZ-styles. % \begin{macrocode} \tikzset{ menukeys key symbol/.style={ rounded corners=0pt, line width=0.1ex, baseline={(0,0)}, }, menukeys thick/.style={line width=0.25ex}, } % \end{macrocode} % % Now we ar prepared to generate the key macros. I will be nearly the same % way for all keys. Step one is to build a |tw@mk@|\meta{key} macro % and then we define the user-level command |\|\meta{key} % \begin{macro}{\shift} % \begin{macrocode} \normalsize \tw@make@key@box{shift}{% \begin{tikzpicture}[yshift=-0.1ex,menukeys key symbol] \draw (0.3ex,0) -- (1.1ex,0) -- (1.1ex,1.2ex) -- % (1.5ex,1.2ex) -- (0.7ex,1.9ex) -- (-0.1ex,1.2ex) -- % (0.3ex,1.2ex) -- cycle; \end{tikzpicture}% } \tw@make@key@macro{\shift} % \end{macrocode} % \end{macro} % It's a little more complicated if the appearance should differ depending on the % OS: The first step again is to define |tw@mk@|\meta{key}|@mac| and % |tw@mk@|\meta{key}|@win|. And then use the starred version % |\tw@make@key@macro*| which creates |\|\meta{key} that depends on the |os| % option, |\|\meta{key}|mac| and |\|\meta{key}|win|, that are not affected by % |os|. % \begin{macro}{\capslock} % \begin{macrocode} \tw@make@key@box{capslock@mac}{% \begin{tikzpicture}[yshift=-0.1ex,menukeys key symbol] \draw (0.3ex,0.7ex) -- (1.1ex,0.7ex) -- (1.1ex,1.2ex) -- % (1.5ex,1.2ex) -- (0.7ex,1.9ex) -- (-0.1ex,1.2ex) -- % (0.3ex,1.2ex) -- cycle; \draw (0.3ex,0) rectangle (1.1ex,0.4ex); \end{tikzpicture}% } \tw@make@key@box{capslock@win}{% \begin{tikzpicture}[yscale=-1,yshift=-1.8ex,menukeys key symbol] \draw (0.3ex,0) -- (1.1ex,0) -- (1.1ex,1.2ex) -- % (1.5ex,1.2ex) -- (0.7ex,1.9ex) -- (-0.1ex,1.2ex) -- % (0.3ex,1.2ex) -- cycle; \end{tikzpicture}% } \tw@make@key@macro*{\capslock} % \end{macrocode} % \end{macro} % Here are the other macros: % \begin{macro}{\tab} % \begin{macrocode} \tw@make@key@box{tab@mac}{% \begin{tikzpicture}[yshift=0.6ex,menukeys key symbol] \draw [->] (0,0) -- (1em,0); \draw (1em,-0.35ex) -- (1em,0.35ex); \end{tikzpicture}% } \tw@make@key@box{tab@win}{% \begin{tikzpicture}[yshift=0.1ex,menukeys key symbol] \draw [->] (0.2em,0) -- (1.2em,0); \draw (1.2em,-0.35ex) -- (1.2em,0.35ex); \draw [<-] (0,1ex) -- (1em,1ex); \draw (0,0.65ex) -- (0,1.35ex); \end{tikzpicture}% } \tw@make@key@macro*{\tab} % \end{macrocode} % \end{macro} % \begin{macro}{\esc}\begin{macro}{\oldesc} % \changes{v1.4}{2016/04/17}{Fixed direction of \cs{escmac}; added \cs{oldesc}} % \begin{macrocode} \def\tw@mk@esc@win{Esc} \tw@define@mackey{% \def\tw@mk@esc@mac{esc} }{% \tw@make@key@box{esc@mac}{% \begin{tikzpicture}[yshift=-0.1ex,menukeys key symbol] \draw [->] (0.5ex,0.5ex) -- ++(135:1.1ex); \draw (0.5ex,0.5ex) ++(105:0.6ex) arc (105:-195:0.6ex); \end{tikzpicture}% }% } \tw@make@key@macro*{\esc} \def\tw@mk@oldesc@win{Esc} \tw@define@mackey{% \def\tw@mk@oldesc@mac{esc} }{% \tw@make@key@box{oldesc@mac}{% \begin{tikzpicture}[yshift=-0.1ex,menukeys key symbol] \draw [->] (0.5ex,0.5ex) -- ++(45:1.1ex); \draw (0.5ex,0.5ex) ++(15:0.6ex) arc (15:-285:0.6ex); \end{tikzpicture}% }% } \tw@make@key@macro*{\oldesc} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\ctrl} % \begin{macrocode} \providecommand\ctrlname{Ctrl} \def\tw@mk@ctrl@win{\ctrlname} \def\tw@mk@ctrl@mac{ctrl} \tw@make@key@macro*{\ctrl} % \end{macrocode} % \end{macro} % \begin{macro}{\Alt} % \begin{macro}{\AltGr} % \begin{macrocode} \def\tw@mk@Alt@win{Alt} \tw@define@mackey{% \def\tw@mk@Alt@mac{alt}% }{% \tw@make@key@box{Alt@mac}{% \begin{tikzpicture}[yshift=-0.1ex,menukeys key symbol] \draw (0,1ex) -- (0.5ex,1ex) -- (1ex,0.3ex) -- (1.8ex,0.3ex); \draw (0.8ex,1ex) -- (1.8ex,1ex); \end{tikzpicture}% }% } \tw@make@key@macro*{\Alt} \providecommand*{\AltGr}{Alt\,Gr} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\cmd} % \begin{macrocode} \def\tw@mk@cmd@win{% \tw@mk@warning{'\string\cmd' only for Mac!}% } \tw@define@mackey{% \def\tw@mk@cmd@mac{cmd}% }{% \tw@make@key@box{cmd@mac}{% \begin{tikzpicture}[yshift=-0.15ex,menukeys key symbol] \draw (0.5ex,0.7ex) -- (0.5ex,1.25ex) arc (0:270:0.25ex) -- % (1.25ex,1ex) arc (-90:180:0.25ex) -- (1ex,0.25ex) % arc (-180:90:0.25ex) -- (0.25ex,0.5ex) arc (90:360:0.25ex) % -- cycle; \end{tikzpicture}% }% } \tw@make@key@macro*{\cmd} % \end{macrocode} % \end{macro} % \begin{macro}{\Space}\begin{macro}{\SPACE} % \begin{macrocode} \providecommand*{\Space}{\expandonce{\rule{3em}{0pt}}} \newcommand{\spacename}{Space} \providecommand*{\SPACE}{\expandonce{\rule{2em}{0pt}\spacename\rule{2em}{0pt}}} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\return} % \begin{macrocode} \tw@make@key@box{return@mac}{% \begin{tikzpicture}[yshift=0.25ex,menukeys key symbol] \draw [->, rounded corners=0.2ex] (1.25ex,1ex) -| % (2ex,0) -- (0,0); \end{tikzpicture}% } \tw@make@key@box{return@win}{% \begin{tikzpicture}[menukeys key symbol] \draw [->] (1ex,1.25ex) |- (0,0); \end{tikzpicture}% } \tw@make@key@macro*{\return} % \end{macrocode} % \end{macro} % \begin{macro}{\enter} % \begin{macrocode} \def\tw@mk@enter@win{Enter} \tw@make@key@box{enter@mac}{% \begin{tikzpicture}[menukeys key symbol] \draw (0,0) -- (0.5ex,0.5ex) -- (1ex,0); \draw (0,0.55ex) -- (1ex,0.55ex); \end{tikzpicture}% } \tw@make@key@macro*{\enter} % \end{macrocode} % \end{macro} % \begin{macro}{\winmenu} % \begin{macrocode} \def\tw@mk@winmenu@mac{% \tw@mk@warning{'\string\winmenu' only for Windows!}% } \tw@make@key@box{winmenu@win}{% \begin{tikzpicture}[yshift=-0.2ex,menukeys key symbol] \draw (0,0) rectangle (1.5ex,1.8ex); \draw (0.25ex,1.4ex) -- ++(1ex,0); \draw (0.25ex,1ex) -- ++(1ex,0); \draw (0.25ex,0.6ex) -- ++(1ex,0); \end{tikzpicture}% } \tw@make@key@macro*{\winmenu} % \end{macrocode} % \end{macro} % \begin{macro}{\backspace} % \begin{macrocode} \tw@make@key@box{backspace}{% \begin{tikzpicture}[yshift=0.65ex,menukeys key symbol] \draw [<-,menukeys thick] (0,0) -- (1.35em,0); \end{tikzpicture}% } \tw@make@key@macro{\backspace} % \end{macrocode} % \end{macro} % \begin{macro}{\del}\begin{macro}{\backdel} % \changes{v1.4}{2016/04/17}{Added \cs{backdel}} % \begin{macrocode} \providecommand{\delname}{Del.} \def\tw@mk@del@win{\delname} \tw@define@mackey{% \def\tw@mk@del@mac{\delname}% }{% \tw@make@key@box{del@mac}{% \begin{tikzpicture}[yshift=0.2ex,menukeys key symbol] \draw (0,0) -- (1.5ex,0) -- (2ex,0.5ex) --% (1.5ex,1ex) -- (0,1ex) -- cycle; \draw (0.5ex,0.2ex) -- (1.1ex,0.8ex); \draw (0.5ex,0.8ex) -- (1.1ex,0.2ex); \end{tikzpicture}% }% } \tw@make@key@macro*{\del} \def\tw@mk@backdel@win{\delname} \tw@define@mackey{% \def\tw@mk@backdel@mac{\delname}% }{% \tw@make@key@box{backdel@mac}{% \begin{tikzpicture}[yshift=0.2ex,menukeys key symbol] \draw (2ex,0) -- (0.5ex,0) -- (0,0.5ex) --% (0.5ex,1ex) -- (2ex,1ex) -- cycle; \draw (1ex,0.2ex) -- (1.6ex,0.8ex); \draw (1ex,0.8ex) -- (1.6ex,0.2ex); \end{tikzpicture}% }% } \tw@make@key@macro*{\backdel} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\arrowkeyup}\begin{macro}{\arrowkeydown} % \begin{macro}{\arrowkeyleft}\begin{macro}{\arrowkeyright} % Lastly we define the arrow macros: % \begin{macrocode} \tw@make@key@box{arrowkeyup}{% \begin{tikzpicture}[yshift=-0.2ex,menukeys key symbol] \draw [->] (0,0) -- (0,0.8em); \end{tikzpicture}% } \tw@make@key@macro{\arrowkeyup} \tw@make@key@box{arrowkeydown}{% \begin{tikzpicture}[yshift=0.7em,menukeys key symbol] \draw [->] (0,0) -- (0,-0.8em); \end{tikzpicture}% } \tw@make@key@macro{\arrowkeydown} \tw@make@key@box{arrowkeyright}{% \begin{tikzpicture}[yshift=0.5ex,menukeys key symbol] \draw [->] (0,0) -- (0.8em,0); \end{tikzpicture}% } \tw@make@key@macro{\arrowkeyright} \tw@make@key@box{arrowkeyleft}{% \begin{tikzpicture}[yshift=0.5ex,menukeys key symbol] \draw [->] (0,0) -- (-0.8em,0); \end{tikzpicture}% } \tw@make@key@macro{\arrowkeyleft} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\arrowkey} % And the |\arrowkey| macro that get's it's direction as argument. % \begin{macrocode} \newcommand{\arrowkey}[1]{% \IfStrEq{^}{#1}{\arrowkeyup}{% \IfStrEq{v}{#1}{\arrowkeydown}{% \IfStrEq{<}{#1}{\arrowkeyleft}{% \IfStrEq{>}{#1}{\arrowkeyright}{% \tw@mk@error{Wrong value '#1' for \string\arrowkey\MessageBreak Possible values are '^', 'v', '<' or '>'}% }% }% }% }% } % \end{macrocode} % \end{macro} % Close the |\iftw@mk@definekeys| % \begin{macrocode} \fi % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \Finale \endinput