% \iffalse meta-comment % % Copyright (C) 2016 by Philippe Faist, philippe.faist@bluewin.ch % ------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % \fi % % \iffalse %<*driver> \ProvidesFile{phfqit.dtx} % %\NeedsTeXFormat{LaTeX2e}[2005/12/01] %\ProvidesPackage{phfqit} %<*package> [2021/10/08 v4.1 phfqit package] % % %<*driver> \documentclass{ltxdoc} \usepackage{xcolor} \makeatletter \providecommand\phfnote@pkgdoc@setupmainfont{ \renewcommand{\rmdefault}{futs}% only rm font, not math }\makeatother \usepackage[preset=xpkgdoc]{phfnote} \usepackage{phfqit} \usepackage{needspace} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{phfqit.dtx} \end{document} % % \fi % % \CheckSum{0} % % \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}{2016/04/20}{Initial version} % % \GetFileInfo{phfqit.dtx} % % \DoNotIndex{\newcommand,\newenvironment,\let,\def,\gdef,\edef,\xdef,\if,\else,\fi,\ifx,\cslet,\csdef,\begingroup,\endgroup,\expandafter,\csname,\endcsname,\appto,\hspace,\mathrm,\notblank,\the,\RequirePackage} % % \title{\phfqitltxPkgTitle{phfqit}} % \author{Philippe Faist\quad\email{philippe.faist@bluewin.ch}} % \date{\pkgfmtdate\filedate} % \maketitle % % \begin{abstract} % \pkgname{phfqit}---Utilities to typeset stuff in Quantum Information Theory, % in particular general mathematical symbols, operators, and shorthands for % entropy measures. % \end{abstract} % % \inlinetoc % % \section{Introduction} % % This package provides some useful definitions, mainly for notation of % mathematical expressions which are used in quantum information theory (at % least by me). % % Are included utilities for: % \begin{itemize} % \item General symbols and mathematical expressions (identity operator, % trace, rank, diagonal, \ldots) (\autoref{sec:symbols}) % \item Formatting of bits and bit strings (\autoref{sec:bits}) % \item Formatting of names of logical gates (\autoref{sec:gates}) % \item Typesetting the names of Lie groups and algebras, for example $\su(N)$ % (\autoref{sec:Lie-groups-algebras}) % \item Bra-ket notation, and delimited expressions such as average, norm, % \ldots (\autoref{sec:delimited}) % \item Double bra-ket notation for operators (\autoref{sec:delimited}) % \item Typesetting entropy measures, including the Shannon/von Neumann entropy, % the smooth entropies, relative entropies, as well as my coherent relative % entropy % \end{itemize} % % % \section{Basic Usage} % % \label{sec:pkg-options} % % This package is straightforward to use: % \begin{verbatim} % \usepackage{phfqit} % \end{verbatim} % % A single package option controls which entropy measures are defined for you. % % \begin{pkgoptions} % \item[qitobjdef=\meta{\phfverb{stdset} $\mid$ \phfverb{none}}] Load % the predefined set of ``qit objects, '' i.e., entropy measures. The entropy % measures documented below (and specified as such) will be loaded unless you % set \pkgoptionfmt{qitobjdef=none}. % \item[newReIm=\metatruefalsearg] Do not override \LaTeX{}'s default % {\makeatletter $\phfqit@Re$ and $\phfqit@Im$} symbols by $\Re$ and $\Im$. % See \autoref{sec:description-newReIm}. % \item[llanglefrommnsymbolfonts=\metatruefalsearg] In order to define the % operator-kets and operator-bra symbols, we need to have double-angle bracket % symbol delimiters loaded as |\llangle| and |\rrangle|. Unlike |\langle| and % |\rangle|, they are not provided by default by \pkgname{latex}, % \pkgname{amsmath} or \pkgname{amssymb}. What we do is that we load the % |\llangle| and |\rrangle| symbols from the MnSymbol fonts in order to define % |\oket| and friends. If you would like to provide your own definitions for % |\llangle| and |\rrangle|, or if you have problems loading the MnSymbol % fonts and don't need the operator-ket symbols, then you can specify % |llanglefrommnsymbolfonts=false| and we won't bother loading the MnSymbol % fonts. (Note that if you provide your own definitions for |\llangle| and % |\rrangle|, they have to be valid delimiters, such that for example the % syntax |\left\llangle| is valid.) % \end{pkgoptions} % % \changed[v2.0-pkg-opt-qitobjdef]{v2.0}{2017/08/16}{Added the % \phfverb{qitobjdef} package option} % \changed[v2.0-pkg-opt-newReIm]{v2.0}{2017/08/16}{Added the \phfverb{newReIm} % package option} % % \subsection{Semantic vs. Syntactic Notation} % % The macros in this package are meant to represent a \emph{mathematical % quantity}, independently of its final \emph{notation}. For example, |\Hmaxf| % indicates corresponds to the ``new-style'' max-entropy defined with the % fidelity,\footnote{see Marco Tomamichel, Ph. D., ETH Zurich (2012) % \href{https://arxiv.org/abs/1203.2142}{arXiv:1203.2142}} independently of the % notation. Then, if the default notation ``$\Hmaxf{}$'' doesn't suit your % taste, you may then simply redefine this command to display whatever you like % (see for example instructions in \autoref{sec:entropy-measures}). This allows % to keep better distinction between different measures which may share the same % notation in different works of literature. It also allows to switch notation % easily, even in documents which use several quantities whose notation may be % potentially conflicting. % % % \subsection{Size Specification} % \label{topic:size-specification-backtick} % % Many of the macros in this package allow their delimiters to be sized % according to your taste. For example, if there is a large symbol in an % entropy measure, say % \begin{align} % \Hmin{\displaystyle\bigotimes_i A_i}[B]\ , % \end{align} % then it may be necessary to tune the size of the parenthesis delimiters. % % This is done with the optional size specification \meta{size-spec}. The % \meta{size-spec}, whenever it is accepted, is always optional. % % The \meta{size-spec} starts with the backtick character ``|`|'', and is % followed by a single token which may be a star |*| or a size modifier macro % such as |\big|, |\Big|, |\bigg| and |\Bigg|. If the star is specified, then % the delimiters are sized with |\left| and |\right|; otherwise the % corresponding size modifier is used. When no size specification is present, % then the normal character size is used. % % For example: % \begin{center} % \begin{tabular}{ll} % |\Hmin{\bigotimes_i A_i}[B]| & gives\quad $\Hmin{\displaystyle\bigotimes_i A_i}[B]$, \\[1.5em] % |\Hmin`\Big{\bigotimes_i A_i}[B]| & gives\quad $\Hmin`\Big{\displaystyle\bigotimes_i A_i}[B]$,~~and \\[1.5em] % |\Hmin`*{\bigotimes_i A_i}[B]| & gives\quad $\Hmin`*{\displaystyle\bigotimes_i A_i}[B]$. \\ % \end{tabular} % \end{center} % % % % \section{General Symbols and Math Operators} % \label{sec:symbols} % % \DescribeMacro{\Hs} % Hilbert space = $\Hs$. % % \DescribeMacro{\Ident} % Identity operator = $\Ident$. % % \DescribeMacro{\IdentProc} % Identity process. Possible usage syntax is: % \begin{center} % \begin{tabular}{lc} % |\IdentProc[A][A']{\rho}| & $\IdentProc[A][A']{\rho}$ \\ % |\IdentProc[A]{\rho}| & $\IdentProc[A]{\rho}$ \\ % |\IdentProc[A][A']{}| & $\IdentProc[A][A']{}$ \\ % |\IdentProc[A]{}| & $\IdentProc[A]{}$ \\ % |\IdentProc{}| & $\IdentProc{}$ \\ % |\IdentProc{\rho}| & $\IdentProc{\rho}$ \\ % |\IdentProc`\big[A]{\rho}| & $\IdentProc`\big[A]{\rho}$ \\ % \end{tabular} % \end{center} % This macro accepts a size specification with the backtick (`|`|'), see % \autoref{topic:size-specification-backtick}. % % \begingroup\catcode`\^=12\relax % \DescribeMacro{\ee^X}\endgroup A macro for the exponential. Type the \LaTeX{} % code as if |\ee| were just the symbol, i.e.\@ as |\ee^{}|. The % ideas is that this macro may be redefined to change the appearance of the $e$ % symbol, or even to change the notation to |\exp{}| if needed for % inline math. % % \DescribeMacro{\phfqitExpPowerExpression} % To change the appearance of whatever you typed as |\ee^{XYZ}|, you can % redefine |\phfqitExpPowerExpression|; for instance, to use an upright % ``$\mathrm{e}$'' symbol, you could type: % \begin{verbatim} % \renewcommand\phfqitExpPowerExpression[1]{\mathrm{e}^{#1}} % \end{verbatim} % % % \subsection{Math/Linear Algebra Operators} % \label{sec:math-operators} % \label{sec:description-newReIm} % % \needspace{6\baselineskip} % \DescribeMacro{\tr} \DescribeMacro{\supp} \DescribeMacro{\rank} % \DescribeMacro{\linspan} \DescribeMacro{\spec} \DescribeMacro{\diag} Provide % some common math operators. The trace $\tr$, the support $\supp$, the rank % $\rank$, the linear span $\linspan$, the spectrum $\spec$ and the diagonal % matrix $\diag$. (Note that |\span| is already defined by \LaTeX{}, so that we % resort to |\linspan|.) \vspace{1.5cm} % % \DescribeMacro{\Re} \DescribeMacro{\Im} Also, redefine |\Re| and |\Im| (real % and imaginary parts of a complex number), to the more readable $\Re(z)$ and % $\Im(z)$. (The original symbols were {\makeatletter $\phfqit@Re(z)$ and % $\phfqit@Im(z)$}.) Keep the old definitions using the package option % \pkgoptionfmt{newReIm=false}. % % \subsection{Poly symbol} % % \DescribeMacro{\poly} Can be typeset in $\poly(n)$ time. % % % \subsection{Bits and Bit Strings} % \label{sec:bits} % % \DescribeMacro{\bit} Format a bit value, for example |\bit{0}| or |\bit0| % gives $\bit0$ or $\bit1$. This command works both in math mode and text mode. % % \DescribeMacro{\bitstring} Format a bit string. For example % |\bitstring{01100101}| is rendered as \bitstring{01100101}. This command % works both in math mode and text mode. % % \subsection{Logical Gates} % \label{sec:gates} % % \DescribeMacro{\gate} Format a logical gate. Essentially, this command % typesets its argument in small-caps font. For example, with |\gate{C-not}| % you get \gate{C-not}. (The default formatting ignores the given % capitalization, but if you redefine this command you could exploit this, % e.g.\@ by making the ``C'' in ``Cnot'' larger than the ``not''.) % % This command works both in math mode and in text mode. % % \needspace{5\baselineskip} % \DescribeMacro{\AND} \DescribeMacro{\XOR} \DescribeMacro{\CNOT} % \DescribeMacro{\NOT} \DescribeMacro{\NOOP} Some standard gates. These typeset % respectively as \AND, \XOR, \CNOT, \NOT, and \NOOP. \vspace{3\baselineskip} % % % \section{Lie Groups and Algebras} % \label{sec:Lie-groups-algebras} % % \needspace{7\baselineskip} % \DescribeMacro{\uu(N)} \DescribeMacro{\UU(N)} \DescribeMacro{\su(N)} % \DescribeMacro{\SU(N)} \DescribeMacro{\so(N)} \DescribeMacro{\SO(N)} % \DescribeMacro{\slalg(N)} \DescribeMacro{\SL(N)} % \DescribeMacro{\GL(N)} \DescribeMacro{\SN(N)} % Format some common Lie groups and algebras. Note the use of |\slalg| instead % of |\sl| because of name conflict with \TeX's font command {\sl producing % slanted text}. % % |\SN(N)| is the symmetric group of $N$ items, and formats by default as % $\SN(N)$. % % \DescribeMacro{\phfqitLieGroup} \DescribeMacro{\phfqitLieAlgebra} % \DescribeMacro{\phfqitDiscreteGroup} % The macros |\phfqitLieGroup|, |\phfqitLieAlgebra|, and |\phfqitDiscreteGroup| % format the name for a standard Lie group, Lie algebra or discrete group along % with its argument. Redefine these macros with |\renewcommand| to change the % formatting font for Lie groups and algebras for instance. For instance, to % format standard Lie groups/algebras and the permutation group with simple % italic letters, you can use: % \begin{verbatim} % \renewcommand\phfqitLieAlgebra[2]{\mathit{#1}({#2})} % \renewcommand\phfqitLieGroup[2]{\mathit{#1}({#2})} % \renewcommand\phfqitDiscreteGroup[2]{\mathit{#1}_{#2}} % \end{verbatim} % % \verbdef\GLNverbatim=\GL(N)= % \changed[v2.0]{v2.0}{2018/02/28}{Added the macro \GLNverbatim} % \verbdef\SLNverbatim=\slalg(n),\SL(N)= % \changed[v3.0]{v3.0}{2020/07/31}{Added the macros \SLNverbatim, as well % as \phfverb{\phfqitLieAlgebra}, \phfverb{\phfqitLieGroup}, and % \phfverb{\phfqitDiscreteGroup}} % % \iffalse \vspace{3\baselineskip} <-- space for all the \SU(xx) listings in margin \fi % % \section{Bra-Ket Notation and Delimited Expressions} % % \subsection{Bras and kets} % \label{sec:bra-ket} % % All commands here work in math mode only. They all accept a size modifier as % described in \autoref{topic:size-specification-backtick}. (The size may also % be provided as an optional argument; the starred form of the command may also % be used to enclose the delimiters with |\left...\right| and have the size % determined automatically.) Example usage is: % \begin{center} % \begin{tabular}{lc} % |\ket{\psi}| & $\ket{\psi}$ \\[1em] % |\ket`\big{\psi}|~,~~|\ket[\big]{\psi}| & $\ket`\big{\psi}$ \\[1em] % |\ket`\Big{\psi}|~,~~|\ket[\Big]{\psi}| & $\ket`\Big{\psi}$ \\[1em] % |\ket`\bigg{\psi}|~,~~|\ket[\bigg]{\psi}| & $\ket`\bigg{\psi}$ \\[1em] % |\ket`\Bigg{\psi}|~,~~|\ket[\Bigg]{\psi}| & $\ket`\Bigg{\psi}$ \\[1em] % \begin{minipage}{7cm}\relax % \noindent|\ket`*{\displaystyle\sum_k \psi_k}|,\\ % \hspace*{2em}|\ket*{\displaystyle\sum_k \psi_k}| % \end{minipage} % & $\ket*{\displaystyle\sum_k \psi_k}$ % \end{tabular} % \end{center} % % \DescribeMacro{\ket} % Typeset a quantum mechanical ket. |\ket{\psi}| gives $\ket{\psi}$. % % \DescribeMacro{\bra} % Typeset a bra. |\bra{\psi}| gives $\bra{\psi}$. % % \DescribeMacro{\braket} % Typeset a bra-ket inner product. |\braket{\phi}{\psi}| gives $\braket{\phi}{\psi}$. % % \DescribeMacro{\ketbra} % Typeset a ket-bra outer product. |\ketbra{\phi}{\psi}| gives $\ketbra{\phi}{\psi}$. % % \DescribeMacro{\proj} % Typeset a rank-1 projector determined by a ket. |\proj{\psi}| gives $\proj{\psi}$. % % \DescribeMacro{\matrixel} Typeset a matrix element. % |\matrixel{\phi}{A}{\psi}| gives $\matrixel{\phi}{A}{\psi}$. % % \DescribeMacro{\dmatrixel} Typeset a diagonal matrix element of an operator. % |\dmatrixel{\phi}{A}| gives $\dmatrixel{\phi}{A}$. % % \DescribeMacro{\innerprod} Typeset an inner product using the mathematicians' notation. % |\innerprod{\phi}{\psi}| gives $\innerprod{\phi}{\psi}$. % % % \DescribeMacro{\oket} \DescribeMacro{\obra} \DescribeMacro{\obraket} % \DescribeMacro{\oketbra} \DescribeMacro{\oproj} \DescribeMacro{\omatrixel} % \DescribeMacro{\odmatrixel} This package also provides associated % double-bra-ket commands as is occasionally used to write ``vectors'' in % Hilbert-Schmidt operator space, such as $\oket{A}$, $\obraket{A}{\Ident}$, % $\oketbra{\Ident}{E_k}$, etc. The commands are named |\oket|, |\obra|, % |\obraket|, |\oketbra|, |\oproj|, |\omatrixel|, and |\odmatrixel|. % % The commands |\oket|, |\obra|, |\obraket|, etc.\@ offer the same syntax as % their corresponding |\ket|, |\bra|, etc.\@ counterparts. For instance, you can % type |\obra`\Big{\sum A_i}| to obtain $\obra`\Big{\sum A_i}$. % % \DescribeMacro{\llangle} \DescribeMacro{\rrangle} The \pkgname{phfqit} package % defines the |\llangle| and |\rrangle| delimiters, by taking the relevant % symbols from the \pkgname{MnSymbol} fonts. These double-angle bracket symbols % are used for the double-bra-ket type constructs (|\oket| and friends). % % If you'd like to provide your own definition of |\llangle| and |\rrangle|, or % if for any reason you would not want us to attempt to load the % \pkgname{MnSymbol} fonts at all, then you can set the package option % |llanglefrommnsymbolfonts=false|. % % If you provide your own definition of |\llangle| and |\rrangle|, then make % sure that they are proper \TeX\ delimiters, i.e., constructs of the form % |\left\llangle ... \right\rrangle| or |\bigl\llangle ... \bigr\rrangle| must % work. % % If your document never uses the double-bra-ket macros (i.e., none of the % |\oket|, |\obra|, and friends), then you may safely specifiy % |llanglefrommnsymbolfonts=false| to avoid loading the relevant symbols. % % % \subsection{Delimited expressions: norms, absolute value, etc.} % \label{sec:delimited} % % There are also some commonly used delimited expressions defined for % convenience. % % \DescribeMacro{\abs} The absolute value of an expression. |\abs{A}| gives % $\abs{A}$. % % \DescribeMacro{\avg} The average of an expression. |\avg`\big{\sum_k A_k}| % gives $\avg`\big{\sum_k A_k}$. % % \DescribeMacro{\norm} The norm of an expression. |\norm{A_k}| gives % $\norm{A_k}$. (If you'd like to define customized norms, e.g., to add % subscripts, then check out the |\phfqitDefineNorm| command discussed below.) % % \DescribeMacro{\intervalc} A closed interval. |\intervalc{x}{y}| gives % $\intervalc{x}{y}$. % % \DescribeMacro{\intervalo} An open interval. |\intervalo{x}{y}| gives % $\intervalo{x}{y}$. % % \DescribeMacro{\intervalco} A semi-open interval, closed on the lower bound % and open on the upper bound. |\intervalco{x}{y}| gives $\intervalco{x}{y}$. % % \DescribeMacro{\intervaloc} A semi-open interval, open on the lower bound % and closed on the upper bound. |\intervaloc{x}{y}| gives $\intervaloc{x}{y}$. % % % \DescribeMacro{\phfqitDefineNorm} The handy command |\phfqitDefineNorm| can be % used to define custom norms (e.g. 1-norm, infinity-norm, p/q-norms, etc.). % The syntax is |\phfqitDefineNorm|\meta{command name}\meta{before}\meta{after}, % for example: % \begin{verbatim} % \phfqitDefineNorm\onenorm{}{_1} % \phfqitDefineNorm\opnorm{}{_\infty} % \end{verbatim} % % \DescribeMacro{\phfqitDeclarePairedDelimiterXWithAltSizing} % \DescribeMacro{\phfqitDeclarePairedDelimiterXPPWithAltSizing} For defining % more advanced custom delimited expressions, you can use the % |\phfqitDeclarePairedDelimiterXWithAltSizing| and % |\phfqitDeclarePairedDelimiterXPPWithAltSizing| helpers. These macros wrap % the \pkgname{mathtools} package's |\DeclarePairedDelimiterX| and % |\DeclarePairedDelimiterX| macros, by furthermore enabling the newly defined % command to accept the size argument using the backtick syntax described in % \autoref{topic:size-specification-backtick}. These helpers are used % internally to define the commands for kets, bras, norms, etc. % % % \section{Entropy Measures and Other ``Qit Objects''} % % A ``Qit Object'' is any form of quantity which has several parameters and/or % arguments which are put together in some notation. The idea is to use % \LaTeX{} macros to represent an actual quantity and not just some set of % notational symbols. For example, for the ``old'' max-entropy % $H_\mathrm{max,old}(X)_\rho = \log\rank\rho$, you should use |\Hzero| % independently of whether it should be denoted by $H_0$, $H_\mathrm{max}$ or % $H_\mathrm{max,old}$. This allows you to change the notation by redefining % the command |\Hzero|, while making sure that the correct quantity is % addressed. (You might have both ``old''-style and ``new''-style max-entropy % in the same paper. Their meaning should never change, even if you change your % mind on the notation.) The macros |\Hmin|, |\Hzero|, |\Hmaxf| and |\HH| may % be redefined to change the subscript by using the following code (change % ``|\mathrm{max},0|'' to your favorite subscript text): % \begin{verbatim} % \renewcommand{\Hzero}{\Hbase{\HSym}{\mathrm{max},0}} % \end{verbatim} % % The \pkgname{phfqit} package provides a basic infrastructure allowing to % define such ``Qit Object'' implementations. This package provides the % following Qit Objects: entropy measures (|\Hbase|), an entropy function % (|\Hfnbase|), relative entropy measures (|\Dbase|), as well as coherent % relative entropy measures (|\DCohbase|). The more specific commands |\Hmin|, % |\Hzero|, etc.\@ are then defined based on these ``base commands.'' % % You may also define your own Qit Object implementations. See % \autoref{sec:QitObjectImpl} for documentation on that. % % The actual entropy measure definitions |\Hmin|, |\Hmaxf|, etc., can be % disabled by specifying the package option \pkgoptionfmt{qitobjdef=none}. % % % \subsection{Entropy, Conditional Entropy} % \label{sec:entropy-measures} % % These entropy measures all share the same syntax. This syntax is only % described for the min-entropy |\Hmin|, but the other entropy measures enjoy % the same features. % % These commands are robust, meaning they can be used for example in figure % captions and section headings. % % \DescribeMacro{\Hmin} Min-entropy. The general syntax is % |\Hmin|\hspace{0pt}\meta{size-spec}\relax % \hspace{0pt}\oarg{state}\hspace{0pt}\oarg{epsilon}\hspace{0pt}\relax % \marg{target system}\hspace{0pt}\oarg{conditioning system}. For example: % \begin{center} % \begin{tabular}{lc} % |\Hmin{X}| & $\Hmin{X}$ \\ % |\Hmin[\rho]{X}| & $\Hmin[\rho]{X}$ \\ % |\Hmin[\rho][\epsilon]{X}[Y]| & $\Hmin[\rho][\epsilon]{X}[Y]$ \\ % \verb+\Hmin[\rho|\rho][\epsilon]{X}[Y]+ % & $\Hmin[\rho\mid\rho][\epsilon]{X}[Y]$ \\ % |\Hmin[][\epsilon]{X}[Y]| & $\Hmin[][\epsilon]{X}[Y]$ \\[1ex] % |\Hmin`\Big[\rho]{X}[Y]| & $\Hmin`\Big[\rho][\epsilon]{X}[Y]$ \\[0.5ex] % |\Hmin`*[\rho]{\bigoplus_i X_i}[Y]| & % $\displaystyle\Hmin`*[\rho][\epsilon]{\bigoplus_i X_i}[Y]$ % \end{tabular} % \end{center} % % \DescribeMacro{\HH} Shannon/von Neumann entropy. This macro has the same % arguments as for |\Hmin| (even though, of course, there is no real use in % smoothing the Shannon/von Neumann entropy\ldots). For example, % |\HH[\rho]{X}[Y]| gives $\HH[\rho]{X}[Y]$. % % \DescribeMacro{\Hzero} R\'enyi-zero max-entropy. This macro has the same % arguments as for |\Hmin|. For example, |\Hzero[][\epsilon]{X}[Y]| gives % $\Hzero[][\epsilon]{X}[Y]$. % % \DescribeMacro{\Hmaxf} The max-entropy. This macro has the same % arguments as for |\Hmin|. For example, |\Hmaxf[][\epsilon]{X}[Y]| gives % $\Hmaxf[][\epsilon]{X}[Y]$. % % The commands |\Hmin|, |\HH|, |\Hzero|, and |\Hmaxf| are defined only if the % package option \pkgoptionfmt{qitobjdef=stdset} is set (which is the default). % % \DescribeMacro{\HSym} You may redefine this macro if you want to change the % ``$H$'' symbol of all entropy measures. % \begingroup \def\HSym{\spadesuit} For example, with % |\renewcommand\HSym{\spadesuit}|, |\Hmin{A}[B]| would give $\Hmin{A}[B]$. % \endgroup % % \paragraph{Appearance and alternative notation.} % You may change the notation of any of the above entropy measures by redefining % the corresponding commands as follows: % \begin{verbatim} % \renewcommand{\Hzero}{\Hbase{\HSym}{\mathrm{max}}} % \end{verbatim} % \begingroup\renewcommand{\Hzero}{\Hbase{\HSym}{\mathrm{max}}} % Then, |\Hzero[\rho]{A}[B]| would produce: $\Hzero[\rho]{A}[B]$.\endgroup % % \paragraph{Base entropy measure macro.} % \DescribeMacro{\Hbase} Base macro entropy for an entropy measure. The general % syntax is: % |\Hbase|\hspace{0pt}\marg{H-symbol}\hspace{0pt}\marg{subscript}\relax % \hspace{0pt}\oarg{state}\hspace{0pt}\oarg{epsilon}\hspace{0pt}\relax % \marg{target system}\hspace{0pt}\oarg{conditioning system} % % Using this macro it is easy to define custom special-purpose entropy measures, % for instance: % \begin{verbatim} % \newcommand\Hxyz{\Hbase{\tilde\HSym}{\mathrm{xyz}}} % \end{verbatim} % \begingroup\newcommand\Hxyz{\Hbase{\tilde\HSym}{\mathrm{xyz}}} % The above code defines the command |\Hxyz[\rho][\epsilon]{A}[B]| $\to$ % \fbox{$\Hxyz[\rho][\epsilon]{A}[B]$}. \endgroup % % See also the implementation documentation below for more specific information % on how to customize parts of the rendering, for instance. % % \subsection{Entropy Function} % \label{sec:entropy-function} % % \DescribeMacro{\Hfn} The entropy, written as a mathematical function. It is % useful to write, e.g., $\Hfn(p_1\rho_1 + p_2\rho_2)$ as \relax % |\Hfn(p_1\rho_1 + p_2\rho_2)|. Sizing specifications also work, e.g.\@ % |\Hfn`\big(x)| or |\Hfn`*(x)|. % % Usage is: |\Hfn|\hspace{0pt}\meta{size-spec}\hspace{0pt}|(|\meta{argument}|)| % % This macro doesn't allow for any subscript, any epsilon-like superscript nor % for any conditioning system. Define your own macro on top of |\Hfnbase| if % you need that. % % Note that the \meta{argument} may contain matching parentheses, e.g., % |\Hfn`\Big( g(x) + h(y) )| $\to$ \fbox{$\Hfn`\Big(g(x)+h(y))$}. % % \DescribeMacro{\Hfunc} % The alias |\Hfunc| is provided for backwards compatibility; same as |\Hfn|. % % The commands |\Hfn| and |\Hfunc| are defined only if the package option % \pkgoptionfmt{qitobjdef=stdset} is set (which is the default). % % \DescribeMacro{\Hfnbase} There is also a base macro for this kind of Qit % Object, |\Hfnbase|. It allows you to specify an arbitrary symbol to use for % ``$H$'', as well as custom subscripts and superscripts. The syntax is: % % |\Hfnbase|\marg{H-symbol}\hspace{0pt}\marg{sub}\hspace{0pt}\relax % \marg{sup}\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}|(|\meta{argument}|)|. % % % \subsection{Relative Entropy} % \label{sec:relative-entropies} % % Relative entropies also have a corresponding set of commands. % % The syntax varies from command to command, but all relative entropies accept % the final arguments \meta{size-spec}\marg{state}\marg{relative-to-state}. The % size-spec is as always given using the backtick syntax described in % \autoref{topic:size-specification-backtick}. % % \DescribeMacro{\DD} % Generic relative entropy. The syntax of this command is either of the following: % \par % |\DD|\hspace{0pt}\meta{size-spec}\hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state},\\ % |\DD_|\marg{subscript}\hspace{0pt}\meta{size-spec}\hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state},\\ % |\DD_|\marg{subscript}|^|\marg{superscript}\hspace{0pt}\meta{size-spec}\relax % \hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state},\\ % |\DD^|\marg{superscript}\hspace{0pt}\meta{size-spec}\hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state}. % % In all cases, the argument is typeset as: % $\bigl(\meta{state}\big\Vert\meta{relative-to state}\bigr)$. The size of the % delimiters can be set with a size specification using the standard backtick % syntax as described in \autoref{topic:size-specification-backtick} (as for the % other entropy measures). % % Examples: % \begin{center} % \begin{tabular}{lc} % |\DD{\rho}{\sigma}| & $\DD{\rho}{\sigma}$ \\[1ex] % |\DD`*{M_1^\dagger M_1}{\sigma}| & $\DD`*{M_1^\dagger M_1}{\sigma}$ \\[1ex] % |\DD`\Big{\rho}{\sigma}| & $\DD`\Big{\rho}{\sigma}$ \\ % \end{tabular} % \end{center} % % You can also play around with subscripts and superscripts, but it is % recommended to use the macros |\Dminf|, |\Dminz| and |\Dmax| directly. % Specifying the subscripts and superscripts to |\DD| should only be done within % new custom macros to define new relative entropy measures. % \begin{center} % \begin{tabular}{lc} % |\DD_{\mathrm{Rob}}^{\epsilon}{\rho}{\sigma}| & $\DD_{\mathrm{Rob}}^{\epsilon}{\rho}{\sigma}$ \\ % |\DD^{sup}{\rho}{\sigma}| & $\DD^{sup}{\rho}{\sigma}$ \\ % \end{tabular} % \end{center} % % \DescribeMacro{\Dmax} The max-relative entropy. The syntax is % |\Dmax|\hspace{0pt}\oarg{epsilon}\hspace{0pt}\meta{size-spec}\relax % \hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state} % % For example |\Dmax[\epsilon]{\rho}{\sigma}| gives % $\Dmax[\epsilon]{\rho}{\sigma}$ and |\Dmax[\epsilon]`\big{\rho}{\sigma}| gives % $\Dmax[\epsilon]`\big{\rho}{\sigma}$. % % \DescribeMacro{\Dminz} The ``old'' min-relative entropy, based on the % R\'enyi-zero relative entropy. The syntax is the same as for % |\Dmax|. % % \DescribeMacro{\Dminf} The ``new'' min-relative entropy, defined using the % fidelity. The syntax is the same as for |\Dmax|. % % \DescribeMacro{\Dr} The Rob-relative entropy. The syntax is the same as for % |\Dmax|. % % \DescribeMacro{\DHyp} \DescribeMacro{\Dhyp} The hypothesis testing relative % entropy (two possible variants). The syntax is the same as for |\Dmax|, % except that by default the optional argument is |\eta|. The symbols % `$\mathrm{H}$' and `$\mathrm{h}$' are used as subscripts, respectively, for % |\DHyp| and |\Dhyp|. Examples: The code |\DHyp{\rho}{\sigma}| gives % $\DHyp{\rho}{\sigma}$ and |\Dhyp[\eta']{\rho}{\sigma}| gives % $\Dhyp[\eta']{\rho}{\sigma}$. (This is because this quantity is directly % defined with a $\eta$ (or $\epsilon$) built in, and it is not a zero-error % quantity which is smoothed with the purified distance.) % % The commands |\DD|, |\Dmax|, |\Dminz|, |\Dminf|, |\Dr|, |\DHyp| and |\Dhyp| % are defined only if the package option \pkgoptionfmt{qitobjdef=stdset} is set % (which is the default). % % \changedreftext{v3.1-added-Dhyp-qitobjdef-stdset} % % \DescribeMacro{\DSym} The symbol to use to denote a relative entropy. You % may redefine this command to change the symbol. (This works like |\HSym| % above.) % % \paragraph{Appearance and alternative notation} % You may change the notation of any of the above relative entropy measures by % redefining the corresponding commands as follows: % \begin{verbatim} % \renewcommand{\Dminz}[1][]{\Dbase{\DSym}_{\mathrm{MIN}}^{#1}} % \end{verbatim} % \begingroup\renewcommand{\Dminz}[1][]{\Dbase{\DSym}_{\mathrm{MIN}}^{#1}} % The above command produces: |\Dminz[\epsilon]{\rho}{\sigma}| $\to$ % \fbox{$\Dminz[\epsilon]{\rho}{\sigma}$}.\endgroup % % % \paragraph{Base relative entropy command} % As for the $H$-type entropy measures, there is a ``base relative entropy % command'' |\Dbase|. Its syntax is: % \par |\Dbase|\marg{D-symbol}\hspace{0pt}\relax % [|_|\marg{subscript}][|^|\marg{superscript}]\hspace{0pt}\meta{size-spec}\relax % \hspace{0pt}\marg{state}\hspace{0pt}\marg{relative-to state} % % Example: |\Dbase{\hat\DSym}_{0}^{\eta'}`\Big{\rho}{\sigma}| $\to$ % \fbox{$\Dbase{\hat\DSym}_{0}^{\eta'}`\Big{\rho}{\sigma}$} % % The ``|_|\marg{subscript}'' and ``|^|\marg{superscript}'' parts are optional % and may be specified in any order. % % See also the implementation documentation below for more specific information % on how to customize parts of the rendering, for instance. % % % \subsection{Coherent Relative Entropy} % \label{sec:coh-rel-entr} % % A macro for the coherent relative entropy is also available. % % \DescribeMacro{\DCohx} Typeset a coherent relative entropy using an % alternative form for the reference system. The syntax is: % % |\DCohx|\hspace{0pt}\oarg{epsilon}\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}\marg{rho}\hspace{0pt}\relax % \marg{X}\hspace{0pt}\marg{X'}\hspace{0pt}\relax % \marg{$\Gamma_X$}\hspace{0pt}\marg{$\Gamma_{X'}$} % % For example, |\DCohx[\epsilon]{\rho}{X}{X'}{\Gamma_X}{\Gamma_{X'}}| gives % $\DCohx[\epsilon]{\rho}{X}{X'}{\Gamma_X}{\Gamma_{X'}}$. % % The subscript $X'R_X$ (or whatever the system names) is automatically added to % the \meta{rho} argument. The `$R$' symbol is used by default for designating % the reference system; you may change that by redefining |\DCohxRefSystemName| % (see below). If no subscript should be added to the \meta{rho} argument, then % begin the \meta{rho} argument with a star. For example, % |\DCoh{*\sigma_R\otimes\rho_{X'}}{X}{X'}{\Gamma_X}{\Gamma_{X'}}| gives % $\DCoh{*\sigma_R\otimes\rho_{X'}}{X}{X'}{\Gamma_X}{\Gamma_{X'}}$. % % The \meta{size-spec} is of course optional and follows the same syntax as % everywhere else (\autoref{topic:size-specification-backtick}). % % The command |\DCohx| is defined only if the package option % \pkgoptionfmt{qitobjdef=stdset} is set (which is the default). % % \DescribeMacro{\emptysystem} Use the |\emptysystem| macro to denote a trivial % system. For example, |\DCoh{\rho}{X}{\emptysystem}{\Gamma}{1}| gives % $\DCoh{\rho}{X}{\emptysystem}{\Gamma}{1}$. % % \DescribeMacro{\DCohxRefSystemName} When using |\DCohx|, the macro % |\DCohxRefSystemName| is invoked to produce the reference system name % corresponding to the input system name. By default, this is a $R_\cdot$ % symbol with subscript the input system name. You may redefine this macro if % you prefer another reference system name: % \begin{verbatim} % \renewcommand\DCohxRefSystemName[1]{E_{#1}} % \end{verbatim} % \begin{flushleft} % \begingroup\renewcommand\DCohxRefSystemName[1]{E_{#1}} % Then: |\DCohx{\rho}{X}{X'}{\Gamma_X}{\Gamma_{X'}}| $\to$ % $\DCohx{\rho}{X}{X'}{\Gamma_X}{\Gamma_{X'}}$ % \endgroup % \end{flushleft} % % \DescribeMacro{\DCSym} The symbol to use to denote a coherent relative % entropy. You may redefine this command to change the symbol. (This works % like |\HSym| and |\DSym| above.) % % \DescribeMacro{\DCoh} % Typeset a coherent relative entropy using the old notation. The syntax is: % % |\DCoh|\hspace{0pt}\oarg{epsilon}\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}\marg{rho}\hspace{0pt}\relax % \marg{R}\hspace{0pt}\marg{X'}\hspace{0pt}\relax % \marg{$\Gamma_R$}\hspace{0pt}\marg{$\Gamma_{X'}$} % % For example, |\DCoh[\epsilon]{\rho}{R}{X'}{\Gamma_R}{\Gamma_{X'}}| gives % $\DCoh[\epsilon]{\rho}{R}{X'}{\Gamma_R}{\Gamma_{X'}}$. % % The subscript $X'R$ (or whatever the system names) is automatically added to % the \meta{rho} argument. If this is not desired, then begin the \meta{rho} % argument with a star. For example, % |\DCoh{*\sigma_R\otimes\rho_{X'}}{R}{X'}{\Gamma_R}{\Gamma_{X'}}| gives % $\DCoh{*\sigma_R\otimes\rho_{X'}}{R}{X'}{\Gamma_R}{\Gamma_{X'}}$. % % The \meta{size-spec} is of course optional and follows the same syntax as % everywhere else (\autoref{topic:size-specification-backtick}). % % The command |\DCoh| is defined only if the package option % \pkgoptionfmt{qitobjdef=stdset} is set (which is the default). % % % \paragraph{Appearance and alternative notation} % You may change the notation of any of the above relative entropy measures by % redefining the corresponding commands as follows: % \begin{verbatim} % \renewcommand{\DCoh}{\DCohbase{\tilde\DSym}} % \end{verbatim} % \begingroup\renewcommand{\DCoh}{\DCohbase{\tilde\DSym}} % Then: |\DCoh[\epsilon]{\rho}{R}{X'}{\Gamma_R}{\Gamma_{X'}}| $\to$ % \fbox{$\DCoh[\epsilon]{\rho}{R}{X'}{\Gamma_R}{\Gamma_{X'}}$}.\endgroup % % % \paragraph{Base relative entropy command} % As for the other entropy measures, there is a ``base coherent relative entropy % command'' |\DCohbase|. Its syntax is: % \par |\DCohbase|\marg{D-symbol}\hspace{0pt}\relax % \hspace{0pt}\oarg{epsilon}\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}\marg{rho}\hspace{0pt}\relax % \marg{R}\hspace{0pt}\marg{X'}\hspace{0pt}\relax % \marg{$\Gamma_R$}\hspace{0pt}\marg{$\Gamma_{X'}$} % % See also the implementation documentation below for more specific information % on how to customize parts of the rendering, for instance. % % % % \subsection{Custom Qit Objects} % \label{sec:QitObjectImpl} % % \changedreftext{v2.0-qit-objects} % % You can create your own Qit Object Implementation as follows. You need two % components: a \emph{Parse} macro and a \emph{Render} macro. % % The \emph{Parse} macro is responsible for parsing input \LaTeX{} tokens as % necessary, and building an argument list (which will be passed on to the % \emph{Render} macro). % % \DescribeMacro{\qitobjAddArg} \DescribeMacro{\qitobjAddArgx} The \emph{Parse} % macro (or any helper macro it calls) should call |\qitobjAddArg| to add % arguments for the eventual call to \emph{Render}. The |\qitobjAddArg| macro % does not expand its argument. The |\qitobjAddArgx| works like % |\qitobjAddArg|, but it accepts a single \LaTeX{} command as its only % argument, expands it, and adds the contents as a single new argument for the % renderer. % % \DescribeMacro{\qitobjParseDone} % Once the parser is finished, it must call |\qitobjParseDone|. % % The \emph{Render} macro is responsible for displaying the final Qit Object. % It should accept mandatory arguments in the exact number as there were calls % to |\qitobjAddArg|/|\qitobjAddArgx|. % % \DescribeMacro{\qitobjDone} The \emph{Render} macro must call |\qitobjDone| % after it is finished, to do some cleaning up and to close the local \LaTeX{} % group generated by the Qit Ojbect infrastructure. % % \DescribeMacro{\DefineQitObject} Declare your new Qit Object using the % |\DefineQitObject| macro, using the syntax % |\DefineQitObject|\marg{name}\marg{ParseCommand}\marg{RenderCommand}. % This declares the command |\|\meta{name} as your Qit Object. % % You may define different Qit Objects (using different names) recycling the % same parsers/renderers if needed. For instance, |\Hfnbase| uses the same % renderer as |\Hbase|. % % \DescribeMacro{\DefineTunedQitObject} The |\DefineTunedQitObject| macro is a % bit more powerful. It allows you to specify some fixed initial arguments to % the parser, as well as to provide some local definitions which are in effect % only during parsing and rendering of the Qit Object. This is useful if you % would like to declare an alternative type of Qit Object to an existing one, % where you just change some aspect of the behavior of the original Qit Object. % % Usage: |\DefineTunedQitObject|\hspace{0pt}\marg{name}\relax % \marg{parse command}\hspace{0pt}\marg{render command}\hspace{0pt}\relax % \marg{fixed first argument(s)}\hspace{0pt}\marg{custom definitions}\relax % % The \marg{first fixed argument(s)} must be a single argument, i.e., a single % \LaTeX{} group, which may contain several arguments, for instance: |{{A}{B}}|. % % For instance, |\DCohx| is defined, using the same parser and renderer as for % |\DCoh|, as follows: % \begin{verbatim} %\def\DCohxRefSystemName#1{R_{#1}} %\def\DCohxStateSubscripts#1#2{#2\DCohxRefSystemName{#1}} %\DefineTunedQitObject{DCohx}{\DCohbaseParse}{\DCohbaseRender}% %{{\DCSym}}% initial args %{\let\DCohbaseStateSubscripts\DCohxStateSubscripts}% local defs % \end{verbatim} % % % \paragraph{Useful helpers} % % There are some useful helpers for both the \emph{Parse} and \emph{Render} % macros. More extensive documentation is available in the ``Implementation'' % section below. % % \DescribeMacro{\phfqit@parse@sizesarg} Parse a \meta{size-spec} optional % argument. % % \needspace{3\baselineskip} % \DescribeMacro{\phfqitParen} \DescribeMacro{\phfqitSquareBrackets} % \DescribeMacro{\phfqitCurlyBrackets} Produce a parenthetic expression (or % square or curly brackets) with the appropriate size and with the given % contents. % % \paragraph{Example} % Here is a simple example: let's build a work cost of transition Qit Object to % display something like ``$W(\sigma\to\rho)$.'' % % The arguments to be given are: they are \meta{$\sigma$} and \meta{$\rho$}. We % would also like to accept an optional size specification \meta{size-spec}. We % should decide on a convenient syntax to specify them. Here, we'll settle for % simply |\WorkCostTransition`\Big{\rho}{\sigma}|. % % We can now write the \emph{Parse} macro. We use the |\phfqit@parsesizearg| % helper, which stores the optional \meta{size-spec} into the % |\phfqit@val@sizearg| macro before deferring our second helper macro. We then % add arguments (for an eventual call to the \emph{Render} macro) using % |\qitobjAddArg| (or |\qitobjAddArgx|). % \begin{verbatim} % \makeatletter % \newcommand\WorkCostTransitionParse{% % \phfqit@parsesizearg\WorkCostTransitionParse@% % } % % Helper to parse further input arguments: % \newcommand\WorkCostTransitionParse@[2]{% {\rho}{\sigma} % \qitobjAddArgx\phfqit@val@sizearg% size arg % \qitobjAddArg{#1}% rho % \qitobjAddArg{#2}% sigma % \qitobjParseDone% % } % \makeatother % \end{verbatim} % % The render macro should simply display the quantity, with the arguments given % as usual mandatory arguments. We invoke the |\phfqitParens| helper, which % produces the parenthesis at the correct size given the size spec tokens. % \begin{verbatim} % \newcommand\WorkCostTransitionRender[3]{% {size-spec-tokens}{\rho}{\sigma} % W\phfqitParens#1{#2 \to #3}% % \qitobjDone % } % \end{verbatim} % % Now declare the Qit Object: % \begin{verbatim} % \DefineQitObject{WorkCostTransition}{\WorkCostTransitionParse}{\WorkCostTransitionRender} % \end{verbatim} % \begingroup\makeatletter % \newcommand\WorkCostTransitionParse{\relax % \phfqit@parsesizearg\WorkCostTransitionParse@} % \newcommand\WorkCostTransitionParse@[2]{\relax % \qitobjAddArgx\phfqit@val@sizearg\relax % \qitobjAddArg{#1}\relax % \qitobjAddArg{#2}\relax % \qitobjParseDone} % \newcommand\WorkCostTransitionRender[3]{W\phfqitParens#1{#2 \to #3}\qitobjDone} % \DefineQitObject{WorkCostTransition}{\WorkCostTransitionParse}{\WorkCostTransitionRender} % Then: |\WorkCostTransition`\Big{\rho}{\sigma}| $\to$ % \fbox{$\WorkCostTransition`\Big{\rho}{\sigma}$} % \endgroup % % You might want to check out the implementations of |\HbaseParse| and % |\HbaseRender|, or |\DbaseParse| and |\DbaseRender| if you'd like to see some % more involved examples. % % % % % % \StopEventually{\clearpage\PrintChanges % \vspace{2cm plus 2cm minus 2cm}\PrintIndex} % % \section{Implementation} % % First, load dependent packages. Toolboxes, fonts and so on. % \begin{macrocode} \RequirePackage{calc} \RequirePackage{etoolbox} \RequirePackage{amsmath} \RequirePackage{amssymb} \RequirePackage{dsfont} \RequirePackage{mathrsfs} \RequirePackage{mathtools} % \end{macrocode} % % Package \pkgname{xparse} is needed in order to get paren matching right for % |\Hfn|. % \begin{macrocode} \RequirePackage{xparse} % \end{macrocode} % % Package options are handled via \pkgname{xkeyval} \& \pkgname{kvoptions} (see % implementation doc for \pkgname{phfnote}). % \begin{macrocode} \RequirePackage{xkeyval} \RequirePackage{kvoptions} % \end{macrocode} % % \subsection{Simple Symbols and Shorthands} % % % \subsubsection{General Symbols} % % These symbols are documented in \autoref{sec:symbols}. % % \begin{macro}{\Hs} % Hilbert space. % \begin{macrocode} \newcommand{\Hs}{\mathscr{H}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Ident} % Identity operator, $\Ident$. % \begin{macrocode} \newcommand{\Ident}{\mathds{1}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\IdentProc} % Identity process. % % TODO: this could be implemented as a Qit Object. % \begin{macrocode} \def\IdentProc{% \phfqit@parsesizearg\phfqit@IdentProc@maybeA% } \newcommand\phfqit@IdentProc@maybeA[1][]{% \def\phfqit@IdentProc@val@A{#1}% \phfqit@IdentProc@maybeB% } \newcommand\phfqit@IdentProc@maybeB[1][]{% \def\phfqit@IdentProc@val@B{#1}% \phfqit@IdentProc@arg% } \def\phfqit@IdentProc@arg#1{% \def\phfqit@IdentProc@val@arg{#1}% % \end{macrocode} % % At this point, prepare the three arguments, each expanded exactly as they were when % given to these macros, and delegate the formatting to |\phfqit@IdentProc@do|. % \begin{macrocode} \edef\@tmp@args{% {\expandonce{\phfqit@IdentProc@val@A}}% {\expandonce{\phfqit@IdentProc@val@B}}% {\expandonce{\phfqit@IdentProc@val@arg}}% }% \expandafter\phfqit@IdentProc@do\@tmp@args% } \def\phfqit@IdentProc@do#1#2#3{% \operatorname{id}_{#1\notblank{#2}{\to #2}{}}% \notblank{#3}{\expandafter\phfqitParens\phfqit@val@sizearg{#3}}{}% } % \end{macrocode} % \end{macro} % % % % \begingroup\catcode`\^=12\relax % \begin{macro}{\ee^...} % Macro for the exponential. % % Because the character |^| might have different catcodes (e.g. with the % \pkgname{breqn} package), we use a hack with |\detokenize|. Basically this % boils down to |\def\ee^#1{\phfqitExpPowerExpression{#1}}| and % |\def\phfqitExpPowerExpression#1{e^{#1}}|, up to making sure that all the % |^| symbols are compared without catcodes. % % \changed[v4.0-fixed-ee-for-catcodes]{v4.0}{2021/10/07}{Fixed the definition % of \phfverb{\ee} in order to support the case where the catcode of % \phfverb{^} changes} % \begin{macrocode} \edef\phfqit@def@hat{\detokenize{^}} \expandafter\def\expandafter\phfqit@ee@gobblehat\phfqit@def@hat{% \phfqitExpPowerExpression} \def\phfqitExpPowerExpression#1{e^{#1}} \def\ee#1{\expandafter\phfqit@ee@gobblehat\detokenize{#1}} \robustify\phfqitExpPowerExpression \robustify\ee % \end{macrocode} % \end{macro} % \endgroup % % \subsubsection{Math Operators} % % See user documentation in \autoref{sec:math-operators}. % % \needspace{6\baselineskip} % \begin{macro}{\tr} % \begin{macro}{\supp} % \begin{macro}{\rank} % \begin{macro}{\linspan} % \begin{macro}{\spec} % \begin{macro}{\diag} % Some common math operators. Note that |\span| is already defined by \LaTeX{}, so we % resort to |\linspan| for the linear span of a set of vectors. % \begin{macrocode} \DeclareMathOperator{\tr}{tr} \DeclareMathOperator{\supp}{supp} \DeclareMathOperator{\rank}{rank} \DeclareMathOperator{\linspan}{span} \DeclareMathOperator{\spec}{spec} \DeclareMathOperator{\diag}{diag} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\phfqit@Realpart} % \begin{macro}{\phfqit@Imagpart} % Provide math operators for $\Re$ and $\Im$. The aliasing to the actual % commands |\Re| and |\Im| is done later, when we process the package options. % \begin{macrocode} \let\phfqit@Re\Re \DeclareMathOperator{\phfqit@Realpart}{Re}% \let\phfqit@Im\Im \DeclareMathOperator{\phfqit@Imagpart}{Im}% % \end{macrocode} % \end{macro} % \end{macro} % % % \subsubsection{Poly} % % \begin{macro}{\poly} % Poly symbol. % \iffalse meta-comment % \changed[v1.0-added-poly-command]{v1.0}{2015/05/22}{Added \phfverb\poly\space command} % \fi % \begin{macrocode} \DeclareMathOperator{\poly}{poly} % \end{macrocode} % \end{macro} % % \subsubsection{Bits and Bit Strings} % % See documentation in \autoref{sec:bits} % % \begin{macro}{\bit} % \begin{macro}{\bitstring} % Bits and bit strings. % \begin{macrocode} \newcommand\bit[1]{\texttt{#1}} \newcommand\bitstring[1]{\phfqit@bitstring{#1}} % \end{macrocode} % % The implementation of |\bitstring| needs some auxiliary internal macros. % \begin{macrocode} \def\phfqit@bitstring#1{% \begingroup% \setlength{\phfqit@len@bit}{\maxof{\widthof{\bit{0}}}{\widthof{\bit{1}}}}% \phfqitBitstringFormat{\phfqit@bitstring@#1\phfqit@END}% \endgroup% } % \end{macrocode} % % The internal |\phfqit@bitstring@| macro picks up the next bit, and puts it % into a \LaTeX{} |\makebox| on its own with a fixed width. % \begin{macrocode} \def\phfqit@bitstring@#1#2\phfqit@END{% \makebox[\phfqit@len@bit][c]{\phfqitBitstringFormatBit{#1}}% \if\relax\detokenize\expandafter{#2}\relax% \else% % \end{macrocode} % % If there are bits left, then recurse for the rest of the bitstring: % \begin{macrocode} \phfqitBitstringSep\phfqit@bitstring@#2\phfqit@END% \fi% } \newlength\phfqit@len@bit % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\phfqitBitstringSep} % \begin{macro}{\phfqitBitstringFormat} % Redefine these to customize the bit string appearance. % \begin{macrocode} \newcommand\phfqitBitstringSep{\hspace{0.3ex}} \newcommand\phfqitBitstringFormat[1]{\ensuremath{\underline{\overline{#1}}}} \def\phfqitBitstringFormatBit{\bit} % \end{macrocode} % \end{macro} % \end{macro} % % % \subsubsection{Logical Gates} % % See user documentation in \autoref{sec:gates}. % % \begin{macro}{\gate} % Generic macro to format a gate name. % \begin{macrocode} \DeclareRobustCommand\gate[1]{\ifmmode\textsc{\lowercase{#1}}% \else{\rmfamily\textsc{\lowercase{#1}}}\fi} % \end{macrocode} % \end{macro} % % \needspace{5\baselineskip} % \begin{macro}{\AND} % \begin{macro}{\XOR} % \begin{macro}{\CNOT} % \begin{macro}{\NOT} % \begin{macro}{\NOOP} % Some common gates. % \begin{macrocode} \newcommand{\AND}{\gate{And}} \newcommand{\XOR}{\gate{Xor}} \newcommand{\CNOT}{\gate{C-Not}} \newcommand{\NOT}{\gate{Not}} \newcommand{\NOOP}{\gate{No-Op}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \subsubsection{Lie Groups \& Algebras} % % \needspace{7\baselineskip} % \begin{macro}{\uu(N)} % \begin{macro}{\UU(N)} % \begin{macro}{\su(N)} % \begin{macro}{\SU(N)} % \begin{macro}{\so(N)} % \begin{macro}{\SO(N)} % \begin{macro}{\slalg(N)} % \begin{macro}{\SL(N)} % \begin{macro}{\GL(N)} % \begin{macro}{\SN(N)} % Some Lie Groups \& Algebras. See \autoref{sec:Lie-groups-algebras} % \begin{macrocode} \def\uu(#1){\phfqitLieAlgebra{u}{#1}} \def\UU(#1){\phfqitLieGroup{U}{#1}} \def\su(#1){\phfqitLieAlgebra{su}{#1}} \def\SU(#1){\phfqitLieGroup{SU}{#1}} \def\so(#1){\phfqitLieAlgebra{so}{#1}} \def\SO(#1){\phfqitLieGroup{SO}{#1}} \def\slalg(#1){\phfqitLieAlgebra{sl}{#1}} % \sl is "slanted font" in TeX \def\SL(#1){\phfqitLieGroup{SL}{#1}} \def\GL(#1){\phfqitLieGroup{GL}{#1}} \def\SN(#1){\phfqitDiscreteGroup{S}{#1}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\phfqitLieAlgebra} % \begin{macro}{\phfqitLieGroup} % \begin{macro}{\phfqitDiscreteGroup} % Override these to change the appearance of the group names or algebra names. % The first argument is the name of the group or algebra (e.g. |su| or |SU|), % and the second argument is the parenthesized argument e.g. ``N''. % \begin{macrocode} \newcommand\phfqitLieAlgebra[2]{\mathfrak{#1}({#2})} \newcommand\phfqitLieGroup[2]{\mathrm{#1}({#2})} \newcommand\phfqitDiscreteGroup[2]{\mathrm{#1}_{#2}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % % % \subsection{Helper for parsing a size argument} % % \begin{macro}{\phfqit@parsesizearg} % Utility to parse size argument with the backtick specification % (\autoref{topic:size-specification-backtick}). % % Parses a size argument, if any, and stores it into |\phfqit@val@sizearg|. % The value stored can directly be expanded as an optional argument to a % |\DeclarePairedDelimiter|-compatible command (see \pkgname{mathtools} package). % % |#1| should be a command token. It is the next action to take, after % argument has been parsed. % \begin{macrocode} \def\phfqit@parsesizearg#1{% \begingroup% \mathcode`\`="0060\relax% \gdef\phfqit@val@sizearg{}% \def\phfqit@tmp@contwithsize{\phfqit@parsesizearg@withsize{#1}}% \@ifnextchar`{\phfqit@tmp@contwithsize}{\endgroup#1}% } \def\phfqit@parsesizearg@withsize#1`#2{% \def\phfqit@tmp@x{#2}% \def\phfqit@tmp@star{*}% \ifx\phfqit@tmp@x\phfqit@tmp@star% \gdef\phfqit@val@sizearg{*}% \def\phfqit@tmp@cont{\endgroup#1}% \expandafter\phfqit@tmp@cont% \else% \gdef\phfqit@val@sizearg{[#2]}% \def\phfqit@tmp@cont{\endgroup#1}% \expandafter\phfqit@tmp@cont% \fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\phfqitDeclarePairedDelimiterXWithAltSizing} % \begin{macro}{\phfqitDeclarePairedDelimiterXPPWithAltSizing} % Macros that behave exactly like \pkgname{mathtools}' % |\DeclarePairedDelimiterX| and |\DeclarePairedDelimiterXPP|, except that % their size argument can also be specified by a backtick as for entropy % measures or other objects in this package (e.g., to define |\abs| such that % |$\abs`\Big{x - y}$| gives $\abs`\Big{x - y}$). % \changed[v4.0-new-phfqitDeclarePairedDelimiterxxx]{v4.0}{2021/10/07}{Added % \phfverb{\phfqitDeclarePairedDelimiterXWithAltSizing} and % \phfverb{\phfqitDeclarePairedDelimiterXPPWithAltSizing}} % \begin{macrocode} \def\phfqitDeclarePairedDelimiterXWithAltSizing{% \phfqitDeclareMathtoolsPairedDelimiterCmdWithAltSizing\DeclarePairedDelimiterX } \def\phfqitDeclarePairedDelimiterXPPWithAltSizing{% \phfqitDeclareMathtoolsPairedDelimiterCmdWithAltSizing\DeclarePairedDelimiterXPP } \def\phfqitDeclareMathtoolsPairedDelimiterCmdWithAltSizing#1#2{% \begingroup \escapechar=-1\relax \xdef\phfqit@tmp@thecmd{% \expandafter\noexpand\csname phfqit@paireddelim@def@\string#2\endcsname}% \endgroup \edef\x{% \noexpand\phfqit@paireddelim@parsesizearg{\expandonce\phfqit@tmp@thecmd}% }% \expandafter\DeclareRobustCommand\expandafter#2\expandafter{\x}% \expandafter#1\phfqit@tmp@thecmd } \def\phfqit@paireddelim@parsesizearg#1{% \phfqit@parsesizearg{\expandafter#1\phfqit@val@sizearg}% } % \end{macrocode} % \end{macro} % \end{macro} % % % \subsection{Bra-Ket Notation} % % % \begin{macro}{\phfqitKetsBarSpace} % \begin{macro}{\phfqitKetsRLAngleSpace} % These macros can be redefined to fine-tune the space that is inserted in % some of the ket/bra constructs. % % |\phfqitKetsBarSpace| is the space around the vertical bars, e.g., in a % bra-ket, or in matrix elements. (Previously, this space was hard-coded to % |\hspace*{0.2ex}|. Now, the spacing can be specified in this macro. We % furthermore use ``math units'' (|mu|), which are more suitable for % specifying space in math mode; recall that $1\,\mathrm{mu}$ is % $1/18\,\mathrm{em}$ in the math font.) % \begin{macrocode} \def\phfqitKetsBarSpace{\mkern 1.5mu\relax} % \end{macrocode} % The macro |\phfqitKetsRLAngleSpace| specifies the space between the right % angle bracket and the left angle bracket in ket-bra type constructs % ($\ketbra\phi\psi$). By default, it expands to negative space to bring the % angle brackets closer together. (Previously, this space was hard-coded to % |\hspace*{-0.25ex}|.) % \begin{macrocode} \def\phfqitKetsRLAngleSpace{\mkern -1.8mu\relax} % \end{macrocode} % \end{macro} % \end{macro} % % \needspace{7\baselineskip} % \begin{macro}{\ket} % \begin{macro}{\bra} % \begin{macro}{\braket} % \begin{macro}{\ketbra} % \begin{macro}{\proj} % \begin{macro}{\matrixel} % \begin{macro}{\dmatrixel} % Bras, kets, norms, some delimiter stuff. User documentation in % \autoref{sec:bra-ket}. % \begin{macrocode} \phfqitDeclarePairedDelimiterXWithAltSizing\ket[1]{\lvert}{\rangle}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\bra[1]{\langle}{\rvert}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\braket[2]{\langle}{\rangle}{% {#1}\phfqitKetsBarSpace\delimsize\vert\phfqitKetsBarSpace{#2}% } \phfqitDeclarePairedDelimiterXWithAltSizing\ketbra[2]{\lvert}{\rvert}{% {#1}\delimsize\rangle\phfqitKetsRLAngleSpace\delimsize\langle{#2}% } \phfqitDeclarePairedDelimiterXWithAltSizing\proj[1]{\lvert}{\rvert}{% {#1}\delimsize\rangle\phfqitKetsRLAngleSpace\delimsize\langle{#1}% } \phfqitDeclarePairedDelimiterXWithAltSizing\matrixel[3]{\langle}{\rangle}{% {#1}\phfqitKetsBarSpace\delimsize\vert\phfqitKetsBarSpace{#2}% \phfqitKetsBarSpace\delimsize\vert\phfqitKetsBarSpace{#3}% } \phfqitDeclarePairedDelimiterXWithAltSizing\dmatrixel[2]{\langle}{\rangle}{% {#1}\phfqitKetsBarSpace\delimsize\vert\phfqitKetsBarSpace{#2}% \phfqitKetsBarSpace\delimsize\vert\phfqitKetsBarSpace{#1}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\phfqitKetsBeforeCommaSpace} % \begin{macro}{\phfqitKetsAfterCommaSpace} % \begin{macro}{\innerprod} % We also provide the |\innerprod| macro at this point. Customize the inner % spacing before and after the comma with |\phfqitKetsBeforeCommaSpace| and % |\phfqitKetsAfterCommaSpace|. % \begin{macrocode} \def\phfqitKetsBeforeCommaSpace{} \def\phfqitKetsAfterCommaSpace{\mkern 1.5mu\relax} \phfqitDeclarePairedDelimiterXWithAltSizing\innerprod[2]{\langle}{\rangle}{% {#1}\phfqitKetsBeforeCommaSpace,\phfqitKetsAfterCommaSpace{#2}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\phfqitOKetsBarSpace} % \begin{macro}{\phfqitOKetsRLAngleSpace} % These macros are the same as |\phfqitKetsBarSpace| and % |\phfqitKetsRLAngleSpace|, except that they specify the corresponding % spacing for the |\oket| family of bra/ket-type constructs. % \begin{macrocode} \def\phfqitOKetsBarSpace{\phfqitKetsBarSpace} \def\phfqitOKetsRLAngleSpace{\phfqitKetsRLAngleSpace} % \end{macrocode} % \end{macro} % \end{macro} % % % \needspace{8\baselineskip} % \begin{macro}{\oket} % \begin{macro}{\obra} % \begin{macro}{\obraket} % \begin{macro}{\oketbra} % \begin{macro}{\oproj} % \begin{macro}{\omatrixel} % \begin{macro}{\odmatrixel} % Again Bras, kets, but for operator space this time. User documentation in % \autoref{sec:bra-ket}. These definitions depend on |\llangle| and % |\rrangle| being available and expanding to valid delimiter symbols. See % also the |llanglefrommnsymbolfonts| option. % % \changed[v4.1-okets-obras]{v4.1}{2021/10/08}{Added support for % \phfverb{\oket} and friends} % \begin{macrocode} \phfqitDeclarePairedDelimiterXWithAltSizing\oket[1]{\lvert}{\rrangle}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\obra[1]{\llangle}{\rvert}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\obraket[2]{\llangle}{\rrangle}{% {#1}\phfqitOKetsBarSpace\delimsize\vert\phfqitOKetsBarSpace{#2}% } \phfqitDeclarePairedDelimiterXWithAltSizing\oketbra[2]{\lvert}{\rvert}{% {#1}\delimsize\rrangle\phfqitOKetsRLAngleSpace\delimsize\llangle{#2}% } \phfqitDeclarePairedDelimiterXWithAltSizing\oproj[1]{\lvert}{\rvert}{% {#1}\delimsize\rrangle\phfqitOKetsRLAngleSpace\delimsize\llangle{#1}% } \phfqitDeclarePairedDelimiterXWithAltSizing\omatrixel[3]{\llangle}{\rrangle}{% {#1}\phfqitOKetsBarSpace\delimsize\vert\phfqitOKetsBarSpace{#2}% \phfqitOKetsBarSpace\delimsize\vert\phfqitOKetsBarSpace{#3}% } \phfqitDeclarePairedDelimiterXWithAltSizing\odmatrixel[2]{\llangle}{\rrangle}{% {#1}\phfqitOKetsBarSpace\delimsize\vert\phfqitOKetsBarSpace{#2}% \phfqitOKetsBarSpace\delimsize\vert\phfqitOKetsBarSpace{#1}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \subsection{Delimited Expressions} % Delimited expressions are documented in \autoref{sec:delimited}. % % \begin{macro}{\abs} % \begin{macro}{\avg} % \begin{macro}{\norm} % Other delimited expressions. % \begin{macrocode} \phfqitDeclarePairedDelimiterXWithAltSizing\abs[1]{\lvert}{\rvert}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\avg[1]{\langle}{\rangle}{{#1}} \phfqitDeclarePairedDelimiterXWithAltSizing\norm[1]{\lVert}{\rVert}{{#1}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\phfqitDefineNorm} % Use |\phfqitDefineNorm\opnorm{}{_\infty}| to define specific norms, with the % syntax |\phfqitDefineNorm|\meta{new command name}\meta{tokens % before}\meta{tokens after}. If you need arguments in the before/after % tokens, then your norm starts to be more complicated than what % |\phfqitDefineNorm| can handle, perhaps it's best you use % |\phfqitDeclarePairedDelimiterXPPWithAltSizing| directly. % % \changed[v4.0-new-phfqitDefineNorm]{v4.0}{2021/10/07}{Added % \phfverb{\phfqitDefineNorm}} % \begin{macrocode} \def\phfqitDefineNorm#1#2#3{% \phfqitDeclarePairedDelimiterXPPWithAltSizing#1[1]{#2}{\lVert}{\rVert}{#3}{{##1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\phfqit@insideinterval} % Format the contents of an interval. Utility for defining |\intervalc| and % friends. % \begin{macrocode} \def\phfqit@insideinterval#1#2{{#1\mathclose{},\mathopen{}#2}} % \end{macrocode} % \end{macro} % % \needspace{4\baselineskip} % \begin{macro}{\intervalc} % \begin{macro}{\intervalo} % \begin{macro}{\intervalco} % \begin{macro}{\intervaloc} % Open/Closed/Semi-Open Intervals % \begin{macrocode} \phfqitDeclarePairedDelimiterXWithAltSizing\intervalc[2]{[}{]}{% \phfqit@insideinterval{#1}{#2}} \phfqitDeclarePairedDelimiterXWithAltSizing\intervalo[2]{]}{[}{% \phfqit@insideinterval{#1}{#2}} \phfqitDeclarePairedDelimiterXWithAltSizing\intervalco[2]{[}{[}{% \phfqit@insideinterval{#1}{#2}} \phfqitDeclarePairedDelimiterXWithAltSizing\intervaloc[2]{]}{]}{% \phfqit@insideinterval{#1}{#2}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % % % \subsection{Entropy Measures and Other Qit Objects} % % \changed[v2.0-qit-objects]{v2.0}{2017/06/17}{Introduced the Qit Objects infrastructure} % % % \subsubsection{Some Internal Utilities} % % \begin{macro}{\phfqitParens} % Simple parenthesis-delimited expression, with % |\DeclarePairedDelimiterX|-compatible syntax. For example, % \par |\phfqitParens|\marg{content} \quad$\to$\quad % \fbox{\phfverb( \meta{content} \phfverb)} % \par |\phfqitParens*|\marg{content} \quad$\to$\quad % \fbox{\phfverb\left\phfverb( \meta{content} \phfverb\right\phfverb)} % \par |\phfqitParens[\big]|\marg{content} \quad$\to$\quad % \fbox{\phfverb\bigl\phfverb( \meta{content} \phfverb\bigr\phfverb)} % % \begin{macrocode} \DeclarePairedDelimiterX\phfqitParens[1]{(}{)}{#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\phfqitSquareBrackets} % Simple bracket-delimited expression, with % |\DeclarePairedDelimiterX|-compatible syntax. For example, % \par |\phfqitSquareBrackets|\marg{content} \quad$\to$\quad % \fbox{\phfverb[ \meta{content} \phfverb]} % \par |\phfqitSquareBrackets*|\marg{content} \quad$\to$\quad % \fbox{\phfverb\left\phfverb[ \meta{content} \phfverb\right\phfverb]} % \par |\phfqitSquareBrackets[\big]|\marg{content} \quad$\to$\quad % \fbox{\phfverb\bigl\phfverb[ \meta{content} \phfverb\bigr\phfverb]} % % \begin{macrocode} \DeclarePairedDelimiterX\phfqitSquareBrackets[1]{[}{]}{#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\phfqitCurlyBrackets} % Simple bracket-delimited expression, with % |\DeclarePairedDelimiterX|-compatible syntax. For example, % \par |\phfqitSquareBrackets|\marg{content} \quad$\to$\quad % \fbox{\phfverb\{ \meta{content} \phfverb\}} % \par |\phfqitSquareBrackets*|\marg{content} \quad$\to$\quad % \fbox{\phfverb\left\phfverb\{ \meta{content} \phfverb\right\phfverb\}} % \par |\phfqitSquareBrackets[\big]|\marg{content} \quad$\to$\quad % \fbox{\phfverb\bigl\phfverb\{ \meta{content} \phfverb\bigr\phfverb\}} % % \begin{macrocode} \DeclarePairedDelimiterX\phfqitCurlyBrackets[1]{\{}{\}}{#1} % \end{macrocode} % \end{macro} % % % % \subsubsection{Machinery for Qit Objects} % % See also user documentation in \autoref{sec:QitObjectImpl}. % % \begin{macro}{\QitObject} % The argument is the entropic quantity type or object kind (or ``entropic % quantity driver''): one of |Hbase|, |Hfnbase|, |Dbase|, |DCbase|, or any % other custom object. % \begin{macrocode} \newcommand\QitObject[1]{% \begingroup% \preto\QitObjectDone{\endgroup}% \QitObjectInit% \csname QitObj@reg@#1@initdefs\endcsname% %%\message{DEBUG: \detokenize{\QitObject{#1}}}% \def\QitObj@args{}% \def\qitobjParseDone{\QitObj@proceedToRender{#1}}% \def\qitobjDone{\QitObjectDone}% \csname QitObj@reg@#1@parse\endcsname% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\DefineQitObject} % \begin{macro}{\DefineTunedQitObject} % Define a new Qit Object implementation with this macro. A Qit Object % implementation is specified in its simplest form by a \emph{name}, a % \emph{Parser} and a \emph{Renderer} (a single \LaTeX{} macro each). The % more advanced |\DefineTunedQitObject| allows you in addition to specify % local definitions to override defaults, as well as some initial arguments to % the parser. % \begin{macrocode} \def\DefineQitObject#1#2#3{% \DefineTunedQitObject{#1}{#2}{#3}{}{}% }% \def\DefineTunedQitObject#1#2#3#4#5{% \csdef{#1}{\QitObject{#1}#4}% \expandafter\robustify\csname #1\endcsname% \cslet{QitObj@reg@#1@parse}#2% \cslet{QitObj@reg@#1@render}#3% \csdef{QitObj@reg@#1@initdefs}{#5}% } % \end{macrocode} % \end{macro} % \end{macro} % % % Here are some callbacks meant for Qit Object implementations % (``types''/``drivers''). % % \begin{macro}{\qitobjAddArg} % \begin{macro}{\qitobjAddArgx} % These macros should only be called from within a \emph{Parse} macro of a qit % object type. Append an argument in preparation for an eventual call to the % corresponding \emph{Render} macro. |\qitobjAddArg| does not expand its % contents. |\qitobjAddArgx| expects a single command name as argument; it % expands the command once and stores those tokens as a single new argument. % \begin{macrocode} \def\qitobjAddArg#1{% \appto\QitObj@args{{#1}}% } \def\qitobjAddArgx#1{% \expandafter\qitobjAddArg\expandafter{#1}% } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\qitobjParseDone} % \begin{macro}{\qitobjDone} % These macros MUST be called at the end of the respective \emph{Parse} % (|\qitobjParseDone|) and \emph{Render} (|\qitobjDone|) implementations % (otherwise processing doesn't proceed, \LaTeX{} groups won't be closed, and % it will be a mess). % % These macros are correctly defined in |\QitObject| actually. Here we provide % empty definitions so that the \emph{Render} and \emph{Parse} user % implementation macros can be called stand-alone, too. % \begin{macrocode} \def\qitobjParseDone{} \def\qitobjDone{} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\QitObjectDone} % A hook which gets called after a Qit Object is displayed. This should % really stay empty on the global scope. However you can locally append or % prepend to it in tuned definitions for |\DeclareTunedQitObject| to perform % additional actions at the end of the Qit Object, for instance to close an % additional \LaTeX{} group. % \begin{macrocode} \def\QitObjectDone{} % \end{macrocode} % \end{macro} % % \begin{macro}{\QitObjectInit} % A hook which gets called before the parsing phase of a Qit Object. This % should really stay empty on the global scope. However you can locally % append or prepend to it in tuned definitions for |\DeclareTunedQitObject| to % perform additional actions before parsing the Qit Object (but which have to % be made within the \LaTeX{} group of the Qit Object). You can use this to % prepend code to |\QitObjectDone| so that you code gets called \emph{before} % the inner \LaTeX{} group is closed. % \begin{macrocode} \def\QitObjectInit{} % \end{macrocode} % \end{macro} % % An internal helper; it's useful to keep it separate for readability and for % debugging. % \begin{macrocode} \def\QitObj@proceedToRender#1{% %%\message{DEBUG: Rendering #1|\detokenize\expandafter{\QitObj@args}|}% \expandafter\def\expandafter\x\expandafter{% \csname QitObj@reg@#1@render\endcsname}% \expandafter\x\QitObj@args% } % \end{macrocode} % % % \subsubsection{Qit Object Implementation: Entropy, Conditional Entropy} % % See also the user doc in \autoref{sec:entropy-measures}. % % \begin{macro}{\HbaseParse} % Base parser macro for usual entropy measures; possibly conditional and/or % smooth. % % USAGE: % |\Hbase|\marg{H-symbol}\hspace{0pt}\relax % \marg{subscript}\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}\oarg{state}\relax % \hspace{0pt}\oarg{epsilon}\hspace{0pt}\marg{target system}\hspace{0pt}\relax % \oarg{conditioning system} % % The argument \meta{size-spec} is optional, and is documented in % \autoref{topic:size-specification-backtick}. For example \meta{size-spec} = % |`*| or |`\Big|. % % Examples: % \par |\Hbase{\hat{H}}{\mathrm{max}}[\rho][\epsilon]{E}[X']| % \quad$\to$\quad % \fbox{$\Hbase{\hat{H}}{\mathrm{max}}[\rho][\epsilon]{E}[X']$} % \par |\Hbase{\hat{H}}{\mathrm{max}}`*[\rho][\epsilon]{\bigotimes_i E}[X']| % \quad$\to$\quad % \fbox{$\Hbase{\hat{H}}{\mathrm{max}}`*[\rho][\epsilon]{\displaystyle\bigotimes_i E}[X']$} % % The |\HbaseParse| macro is responsible for parsing the arguments to % |\Hbase|. We should parse the arguments using helper macros as needed, % adding rendering arguments with |\qitobjAddArg| or |\qitobjAddArgx|, and % then calling |\qitobjParseDone|. The arguments are then automatically % provided as arguments to the |\HbaseRender| function. We just have to make % sure we add the correct number of arguments in the correct order. % % \begin{macrocode} \def\HbaseParse#1#2{% % \end{macrocode} % % The first arguments are the mandatory arguments % \marg{H-symbol}\hspace{0pt}\marg{subscript}. Then defer to helper macros for % the rest of the parsing. % \begin{macrocode} \qitobjAddArg{#1}% \qitobjAddArg{#2}% \phfqit@parsesizearg\HbaseParse@% } % \end{macrocode} % % Store the delimiter size argument which |\phfqit@parsesizearg| has stored into % |\phfqit@val@sizearg|, then parse an optional \oarg{state} argument. % \begin{macrocode} \newcommand\HbaseParse@[1][]{% \qitobjAddArgx{\phfqit@val@sizearg}% \qitobjAddArg{#1}% \HbaseParse@@% } % \end{macrocode} % Then parse an optional \oarg{epsilon} argument, as well as a mandatory % \marg{target system} argument. % \begin{macrocode} \newcommand\HbaseParse@@[2][]{% \qitobjAddArg{#1}% \qitobjAddArg{#2}% \HbaseParse@@@% } % \end{macrocode} % Finally, parse an optional \oarg{conditioning system}. % \begin{macrocode} \newcommand\HbaseParse@@@[1][]{% \qitobjAddArg{#1}% \qitobjParseDone% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\HbaseRender} % Render the entropy measure. % \par |#1| = ``$H$'' symbol to use (e.g. |H|) % \par |#2| = subscript (type of entropy, e.g. |\marthrm{min},0|) % \par |#3| = possible size argument to expand in front of parens command (one % of \emph{(empty)}, |*|, or |[\big]| using a standard sizing command) % \par |#4| = the state (e.g. |\rho|), may be left empty % \par |#5| = epsilon argument (superscript to entropy measure), if any, or % leave argument empty % \par |#6| = system to measure entropy of % \par |#7| = conditioning system, if any, or else leave the argument empty % \begin{macrocode} \def\HbaseRender#1#2#3#4#5#6#7{% %%\message{DEBUG: HbaseRender\detokenize{{#1}{#2}{#3}{#4}{#5}{#6}{#7}}}% % \end{macrocode} % % Start with the entropy symbol (`H'), the subscript, and the superscript: % \begin{macrocode} \HbaseRenderSym{#1}_{\HbaseRenderSub{#2}}^{\HbaseRenderSup{#5}} % \end{macrocode} % Render the contents of the entropy (parenthetic expression with system \& % conditioning system), only if the system or conditioning system or state are % not empty: % \begin{macrocode} \notblank{#4#6#7}{% \HbaseRenderContents{#3}{#6}{#7}% % \end{macrocode} % Finally, add the state as subscript, if any: % \begin{macrocode} \HbaseRenderTail{#4}% }{}% % \end{macrocode} % We're done. % \begin{macrocode} \qitobjDone% } % \end{macrocode} % \end{macro} % % \needspace{5\baselineskip} % \begin{macro}{\HbaseRenderSym} % \begin{macro}{\HbaseRenderSub} % \begin{macro}{\HbaseRenderSup} % \begin{macro}{\HbaseRenderTail} % Macros to render different parts of the entropy measure. By default, don't % do anything special to them (but this might be locally overridden in a tuned % Qit Object, for instance). % \begin{macrocode} \def\HbaseRenderSym#1{#1}% \def\HbaseRenderSub#1{#1}% \def\HbaseRenderSup#1{#1}% \def\HbaseRenderTail#1{_{#1}}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\HbaseRenderContents} % For the main contents rendering macro, we need to do a little more work. % First, declare a token register in which we will prepare the contents of the % parenthetic expression. % \begin{macrocode} \newtoks\Hbase@tmp@toks \def\Hbase@addtoks#1\@Hbase@END@ADD@TOKS{% \Hbase@tmp@toks=\expandafter{\the\Hbase@tmp@toks#1}}% % \end{macrocode} % Now we need to define the macro which formats the contents of the entropy. % The arguments are |#1| = possible sizing argument, |#2| = system name, |#3| = % conditioning system if any. % \begin{macrocode} \def\HbaseRenderContents#1#2#3{% % \end{macrocode} % We need to construct the parenthetic argument to the entropy, which we will % store in the token register |\Hbase@tmp@toks|. Start with system name: % \begin{macrocode} \Hbase@tmp@toks={#2}% % \end{macrocode} % \ldots{} add conditional system, if specified: % \begin{macrocode} \notblank{#3}{% \Hbase@addtoks\mathclose{}\,\delimsize\vert\,\mathopen{}% #3% \@Hbase@END@ADD@TOKS% }{}% % \end{macrocode} % The tokens are ready now. Prepare the argument to the command % |\HbaseRenderContentsInnerParens| (normally just |\phfqitParens|), and go: % \begin{macrocode} \edef\tmp@args{\unexpanded{#1}{\the\Hbase@tmp@toks}}% \expandafter\HbaseRenderContentsInnerParens\tmp@args% } % \end{macrocode} % \end{macro} % % \begin{macro}{\X} % Macro which expands to the parenthetic expression type macro we would like % to use. By default, this is |\phfqitParens|. % \begin{macrocode} \def\HbaseRenderContentsInnerParens{\phfqitParens} % \end{macrocode} % \end{macro} % % % \begin{macro}{\Hbase} % Finally, we declare our base entropic quantity type: % \begin{macrocode} \DefineQitObject{Hbase}{\HbaseParse}{\HbaseRender} % \end{macrocode} % \end{macro} % % % \subsubsection{Qit Object Implementation: Entropy Function} % % See also the user doc in \autoref{sec:entropy-function}. % % \begin{macro}{\Hfnbase} % Base implementation of an entropy function. % % Usage: |\Hfnbase{H}{1}{2}(x)| $\to$ $\Hfnbase{H}{1}{2}(x)$, % |\Hfnbase{H}{1}{2}`*(x)| $\to$ $\Hfnbase{H}{1}{2}`*(x)$, % |\Hfnbase{H}{1}{2}`\big(x)| $\to$ $\Hfnbase{H}{1}{2}`\big(x)$. % % We can use the same renderer as |\Hbase|, we just need a different parser. % The parser first accepts the mandatory arguments % \marg{H-symbol}\hspace{0pt}\marg{subscript}\hspace{0pt}\marg{superscript}. % \begin{macrocode} \def\HfnbaseParse#1#2#3{% \qitobjAddArg{#1}% H-sym \qitobjAddArg{#2}% sub \phfqit@parsesizearg{\HfnbaseParse@{#3}}% } % \end{macrocode} % % Continue to parse a the argument given in parentheses. The first mandatory % argument is simply the subscript passed on from the previous macro. It might % be tempting to do simply |\def\HfnbaseParse@#1(#2){...}|, but this does not % allow for recursive use of parenthesis within the entropy argument, for % instance |\Hfn(g(x)+h(y))|. Because of this, we use \pkgname{xparse}'s % |\NewDocumentCommand| which can handle this. % \begin{macrocode} \NewDocumentCommand{\HfnbaseParse@}{mr()}{% \qitobjAddArgx{\phfqit@val@sizearg}% size-arg \qitobjAddArg{}% state \qitobjAddArg{#1}% epsilon \qitobjAddArg{#2}% system--main arg \qitobjAddArg{}% cond system %%\message{DEBUG: Hfnbase args are |\detokenize\expandafter{\QitObj@args}|}% \qitobjParseDone% } \DefineQitObject{Hfnbase}{\HfnbaseParse}{\HbaseRender} % \end{macrocode} % \end{macro} % % % \subsubsection{Qit Object Implementation: Relative Entropy} % % User documentation in \autoref{sec:relative-entropies}. % % % \begin{macro}{\DbaseParse} % Base macro for relative entropy macros. % % USAGE: % |\Dbase|\marg{D-symbol}\hspace{0pt}\relax % [|_|\meta{subscript}]\hspace{0pt}\relax % [|^|\meta{superscript}]\hspace{0pt}\relax % \meta{size-spec}\hspace{0pt}\marg{state}\hspace{0pt}\marg{relative to state} % % The subscript and superscripts are optional and don't have to be specified. % They may be specified in any order. Repetitions are allowed and % concatenates the arguments, e.g., |^{a}_{x}_{y}^{z}_{w}| is the same as % |_{xyw}^{az}|. % % The \meta{size-spec} is a backtick-style specification as always. % % \begin{macrocode} \def\DbaseParse#1{% \qitobjAddArg{#1}% D-sym \def\DbaseParse@val@sub{}% \def\DbaseParse@val@sup{}% \DbaseParse@% } \def\DbaseParse@{% \@ifnextchar_{\DbaseParse@parsesub}{\DbaseParse@@}% } \def\DbaseParse@@{% \@ifnextchar^{\DbaseParse@parsesup}{\DbaseParse@@@}% } \def\DbaseParse@parsesub_#1{% \appto\DbaseParse@val@sub{#1}% \DbaseParse@% return to maybe parsing other sub/superscripts } \def\DbaseParse@parsesup^#1{% \appto\DbaseParse@val@sup{#1}% \DbaseParse@% return to maybe parsing other sub/superscripts } \def\DbaseParse@@@{% \qitobjAddArgx\DbaseParse@val@sub% \qitobjAddArgx\DbaseParse@val@sup% \phfqit@parsesizearg\DbaseParse@rest% } \def\DbaseParse@rest#1#2{% \qitobjAddArgx\phfqit@val@sizearg% \qitobjAddArg{#1}% rho \qitobjAddArg{#2}% Gamma \qitobjParseDone% } % \end{macrocode} % \end{macro} % % % % % % \begin{macro}{\DbaseRender} % Macro which formats a relative entropy of the form % $D_\mathrm{sub}^\mathrm{sup}(A\Vert B)$: % \par |\DbaseRender{D}{\mathrm{min}}{\epsilon}{[\big]}{\rho}{\Gamma}| % \quad$\to$\quad % \fbox{$\DbaseRender{D}{\mathrm{min}}{\epsilon}{[\big]}{\rho}{\Gamma}$} % % \begin{macrocode} \def\DbaseRender#1#2#3#4#5#6{% %%\message{DEBUG: DbaseRender\detokenize{{#1}{#2}{#3}{#4}{#5}{#6}}}% % \end{macrocode} % % Start with the entropy symbol (`H'), the subscript, and the superscript: % \begin{macrocode} \DbaseRenderSym{#1}_{\DbaseRenderSub{#2}}^{\DbaseRenderSup{#3}} % \end{macrocode} % Render the contents of the entropy (parenthetic expression with the (one or) % two states), only if the arguments are non-empty: % \begin{macrocode} \notblank{#5#6}{% \DbaseRenderContents{#4}{#5}{#6}% }{}% % \end{macrocode} % We're done. % \begin{macrocode} \qitobjDone% } % \end{macrocode} % \end{macro} % % \needspace{5\baselineskip} % \begin{macro}{\DbaseRenderSym} % \begin{macro}{\DbaseRenderSub} % \begin{macro}{\DbaseRenderSup} % Macros to render different parts of the entropy measure. By default, don't % do anything special to them (but this might be locally overridden in a % tuned Qit Object). % \begin{macrocode} \def\DbaseRenderSym#1{#1}% \def\DbaseRenderSub#1{#1}% \def\DbaseRenderSup#1{#1}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\DbaseRenderContents} % Now we need to define the macro which formats the contents of the entropy. % First, define a useful token register. % \begin{macrocode} \newtoks\Dbase@tmp@toks \def\Dbase@addtoks#1\@Dbase@END@ADD@TOKS{% \Dbase@tmp@toks=\expandafter{\the\Dbase@tmp@toks#1}}% % \end{macrocode} % % The arguments are |#1| = possible sizing argument, |#2| = first state, |#3| = % second state (or operator), if any. % \begin{macrocode} \def\DbaseRenderContents#1#2#3{% % \end{macrocode} % We need to construct the parenthetic argument to the relative entropy, which % we will store in the token register |\Dbase@tmp@toks|. Start with system % name: % \begin{macrocode} \Dbase@tmp@toks={#2}% % \end{macrocode} % \ldots{} add conditional system, if specified: % \begin{macrocode} \notblank{#3}{% \Dbase@addtoks\mathclose{}\,\delimsize\Vert\,\mathopen{}% #3% \@Dbase@END@ADD@TOKS% }{}% % \end{macrocode} % The tokens are ready now. Prepare the argument to the command % |\DbaseRenderContentsInnerParens| (by default just |\phfqitParens|), and go: % \begin{macrocode} \edef\tmp@args{\unexpanded{#1}{\the\Dbase@tmp@toks}}% \expandafter\DbaseRenderContentsInnerParens\tmp@args% } % \end{macrocode} % \end{macro} % % \begin{macro}{\DbaseRenderContentsInnerParens} % Macro which expands to the parenthetic expression type macro we would like % to use. By default, this is |\phfqitParens|. % \begin{macrocode} \def\DbaseRenderContentsInnerParens{\phfqitParens} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dbase} % Finally, define the |\Dbase| macro by declaring a new qit object. % \begin{macrocode} \DefineQitObject{Dbase}{\DbaseParse}{\DbaseRender} % \end{macrocode} % \end{macro} % % % \subsubsection{Qit Object Type: Coherent Relative Entropy} % % See also user documentation in \autoref{sec:coh-rel-entr}. % % \begin{macro}{\DCohbaseParse} % Base macros for coherent relative entropy-type quantities of the form % ${\bar D}_{X\to X'}^{\epsilon}(\rho_{X'R}\Vert\Gamma_X,\Gamma_{X'})$. % % USAGE: % |\DCohbase|\marg{D symbol}\hspace{0pt}\relax % \oarg{epsilon}\hspace{0pt}\relax % \marg{state or \texttt{\textup{*}}fully-decorated-state}\hspace{0pt}\relax % \marg{System In}\hspace{0pt}\relax % \marg{System Out}\hspace{0pt}\relax % \marg{Gamma In}\hspace{0pt}\relax % \marg{Gamma Out} % % \begin{macrocode} \def\DCohbaseParse#1{% \qitobjAddArg{#1}% D-sym \DCohbaseParse@% } \newcommand\DCohbaseParse@[1][]{% \qitobjAddArg{#1}% epsilon \phfqit@parsesizearg\DCohbaseParse@rest% } \def\DCohbaseParse@rest#1#2#3#4#5{% % rho, X, X', \Gamma_X, \Gamma_{X'} \qitobjAddArgx\phfqit@val@sizearg% \DCohbaseParse@parserhosub#1\DCohbaseParse@ENDSTATE{#2}{#3}% \qitobjAddArg{#2}% \qitobjAddArg{#3}% \qitobjAddArg{#4}% \qitobjAddArg{#5}% \qitobjParseDone% } \def\DCohbaseParse@parserhosub{% \@ifnextchar*\DCohbaseParse@parserhosub@nosub% \DCohbaseParse@parserhosub@wsub% } \def\DCohbaseParse@parserhosub@nosub*#1\DCohbaseParse@ENDSTATE#2#3{% \qitobjAddArg{#1}% rho } \def\DCohbaseParse@parserhosub@wsub#1\DCohbaseParse@ENDSTATE#2#3{% \qitobjAddArg{#1_{\begingroup\let\emptysystem\relax% \DCohbaseStateSubscripts{#2}{#3}\endgroup}}% all this for "rho" arg } % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohbaseStateSubscripts} % Macro which produces the relevant subscript for the state. By default, % simply produce ``$X'R$'' (but don't produce an ``empty system'' % symbol). This macro may be overridden e.g. locally. % \begin{macrocode} \def\DCohbaseStateSubscripts#1#2{% #2#1% } % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohbaseRender} % Render the coherent relative entropy. % \par |#1| = ``$D$'' symbol % \par |#2| = superscript (epsilon) % \par |#3| = possible size argument tokens (i.e., |[\big]|) % \par |#4| = fully decorated state (i.e., with necessary subscripts as required) % \par |#5| = input system name % \par |#6| = output system name % \par |#7| = Gamma-in % \par |#8| = Gamma-out % \begin{macrocode} \def\DCohbaseRender#1#2#3#4#5#6#7#8{% % %%\message{DEBUG: DCohbaseRender here, args are |\detokenize{{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}|.}} % \DCohbaseRenderSym{#1}% _{\DCohbaseRenderSystems{#5}{#6}}% ^{\DCohbaseRenderSup{#2}}% \notblank{#4#7#8}{% \DCohbaseRenderContents{#3}{#4}{#7}{#8}% }{}% % \end{macrocode} % We're done. % \begin{macrocode} \qitobjDone% } % \end{macrocode} % \end{macro} % % \needspace{5\baselineskip} % \begin{macro}{\DCohbaseRenderSym} % \begin{macro}{\DCohbaseRenderSystems} % \begin{macro}{\DCohbaseRenderSup} % Macros to render different parts of the entropy measure. By default, don't % do anything special to them (but this might be locally overridden in a % tuned Qit Object) % \begin{macrocode} \def\DCohbaseRenderSym#1{#1}% \def\DCohbaseRenderSystems#1#2{#1\to #2}% \def\DCohbaseRenderSup#1{#1}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\DCohbaseRenderContents} % Now we define the macro which formats the contents of the entropy. % % Define first a useful token register for rendering the contents. % \begin{macrocode} \newtoks\DCohbase@tmp@toks \def\DCohbase@addtoks#1\@DCohbase@END@ADD@TOKS{% \DCohbase@tmp@toks=\expandafter{\the\DCohbase@tmp@toks#1}}% % \end{macrocode} % % The arguments are |#1| = possible sizing argument tokens, |#2| = decorated % state, |#3| = Gamma-X, |#4| = Gamma-{X'}. % \begin{macrocode} \def\DCohbaseRenderContents#1#2#3#4{% % \end{macrocode} % We need to construct the parenthetic argument to the coherent relative % entropy, which we will prepare in the token register |\DCohbase@tmp@toks|. % Start with the state: % \begin{macrocode} \DCohbase@tmp@toks={#2}% % \end{macrocode} % \ldots{} add conditional system, if specified: % \begin{macrocode} \notblank{#3}{% \DCohbase@addtoks\mathclose{}\,\delimsize\Vert\,\mathopen{}% #3\@DCohbase@END@ADD@TOKS% \notblank{#4}{% \DCohbase@addtoks\mathclose{},\mathopen{}% #4\@DCohbase@END@ADD@TOKS% }{}% }{% \notblank{#4}{% \PackageWarning{phfqit}{Value `#4' ignored because previous parameter was blank}% }{}% } % \end{macrocode} % The tokens are ready now. Prepare the argument to the command % |\DCohbaseRenderContentsInnerParens| (by default just |\phfqitParens|), and go: % \begin{macrocode} \edef\tmp@args{\unexpanded{#1}{\the\DCohbase@tmp@toks}}% \expandafter\DCohbaseRenderContentsInnerParens\tmp@args% } % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohbaseRenderContentsInnerParens} % Macro which expands to the parenthetic expression type macro we would like % to use. By default, this is |\phfqitParens|. % \begin{macrocode} \def\DCohbaseRenderContentsInnerParens{\phfqitParens} % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohbase} % Finally, define the |\DCohbase| macro by declaring a new qit object. % \begin{macrocode} \DefineQitObject{DCohbase}{\DCohbaseParse}{\DCohbaseRender} % \end{macrocode} % \end{macro} % % % \subsection{Additional helpers for entropy measures} % % \begin{macro}{\HSym} % Symbol to use to denote an entropy measure. % \begin{macrocode} \def\HSym{H} % \end{macrocode} % \end{macro} % % \begin{macro}{\DSym} % Symbol to use to denote a relative entropy measure. % \begin{macrocode} \newcommand\DSym{D} % \end{macrocode} % \end{macro} % % \begin{macro}{\DCSym} % Symbol to use for the coherent relative entropy measure. % \begin{macrocode} \newcommand\DCSym{\bar\DSym} % \end{macrocode} % \end{macro} % % \begin{macro}{\emptysystem} % Designates the trivial system (uses symbol for empty set). It is important % to this, because of the automatic indexes set on the ``rho'' argument. % \begin{macrocode} \def\emptysystem{\ensuremath{\emptyset}} % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohxRefSystemName} % \begin{macro}{\DCohxStateSubscripts} % Macros helpful for defining |\DCohx|. % \begin{macrocode} \def\DCohxRefSystemName#1{R_{#1}} \def\DCohxStateSubscripts#1#2{#2\DCohxRefSystemName{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % % Finally, some macros provided for backwards compatibility: % \begin{macrocode} \let\@HHbase\Hbase \let\@DDbase\Dbase \let\HHSym\HSym \let\DDSym\DSym % \end{macrocode} % % % \subsection{Handle package options} % % \changedreftext{v2.0-pkg-opt-qitobjdef} % \changedreftext{v2.0-pkg-opt-newReIm} % % Initialization code for \pkgname{kvoptions} for our package options. See % \autoref{sec:pkg-options}. % \begin{macrocode} \SetupKeyvalOptions{ family=phfqit, prefix=phfqit@opt@ } % \end{macrocode} % % Set of predefined qit objects to load. Either |stdset| (standard set, the % default) or |none| (none). % \begin{macrocode} \DeclareStringOption[stdset]{qitobjdef} % \end{macrocode} % % Whether we should load the |\llangle| and |\rrangle| delimiters from the % MnSymbol fonts. % \begin{macrocode} \DeclareBoolOption[true]{llanglefrommnsymbolfonts} % \end{macrocode} % % Whether to override \LaTeX{}'s default {\makeatletter $\phfqit@Re$ and % $\phfqit@Im$} symbols by our more readable $\Re$ and $\Im$. % \begin{macrocode} \DeclareBoolOption[true]{newReIm} % \end{macrocode} % % % Process package options. % \begin{macrocode} \ProcessKeyvalOptions* % \end{macrocode} % % % \subsubsection{Re/Im symbols} % % \begin{macro}{\Re} % \begin{macro}{\Im} % Provide |\Re| and |\Im| commands to override \LaTeX{}'s default if the % corresponding package option is set (which is the default). % \begin{macrocode} \ifphfqit@opt@newReIm \renewcommand{\Re}{\phfqit@Realpart} \renewcommand{\Im}{\phfqit@Imagpart} \fi % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Load \phfverb{\llangle} and \phfverb{\rrangle} from the % \emph{MnSymbol} fonts} % % We need to import |\llangle| and |\rrangle| from the |MnSymbol| % fonts.\footnote{see e.g. \url{https://tex.stackexchange.com/a/79701/32188}} % % \begin{macrocode} \ifphfqit@opt@llanglefrommnsymbolfonts \DeclareFontFamily{OMX}{MnSymbolE}{} \DeclareSymbolFont{phfqit@MnLargeSymbols}{OMX}{MnSymbolE}{m}{n} \SetSymbolFont{phfqit@MnLargeSymbols}{bold}{OMX}{MnSymbolE}{b}{n} \DeclareFontShape{OMX}{MnSymbolE}{m}{n}{ <-6> MnSymbolE5 <6-7> MnSymbolE6 <7-8> MnSymbolE7 <8-9> MnSymbolE8 <9-10> MnSymbolE9 <10-12> MnSymbolE10 <12-> MnSymbolE12 }{} \DeclareFontShape{OMX}{MnSymbolE}{b}{n}{ <-6> MnSymbolE-Bold5 <6-7> MnSymbolE-Bold6 <7-8> MnSymbolE-Bold7 <8-9> MnSymbolE-Bold8 <9-10> MnSymbolE-Bold9 <10-12> MnSymbolE-Bold10 <12-> MnSymbolE-Bold12 }{} \let\llangle\@undefined \let\rrangle\@undefined \DeclareMathDelimiter{\llangle}{\mathopen}% {phfqit@MnLargeSymbols}{'164}{phfqit@MnLargeSymbols}{'164} \DeclareMathDelimiter{\rrangle}{\mathclose}% {phfqit@MnLargeSymbols}{'171}{phfqit@MnLargeSymbols}{'171} \fi % \end{macrocode} % % \subsubsection{Standard entropy measures} % % Load the requested set of qit objects. % \begin{macrocode} \def\phfqit@tmp@str@none{none} \def\phfqit@tmp@str@stdset{stdset} \ifx\phfqit@opt@qitobjdef\phfqit@tmp@str@none% % \end{macrocode} % In this case, do not load any definitions. % \begin{macrocode} \else\ifx\phfqit@opt@qitobjdef\phfqit@tmp@str@stdset% % \end{macrocode} % In this case, provide our standard set of ``qit objects'' (i.e., entropy % measures). % % \needspace{4\baselineskip} % \begin{macro}{\HH} % \begin{macro}{\Hzero} % \begin{macro}{\Hmin} % \begin{macro}{\Hmaxf} % The definition of individual entropy macros just delegates to |\Hbase| % with the relevant subscript. % \begin{macrocode} \def\HH{\Hbase{\HSym}{}} \def\Hzero{\Hbase{\HSym}{\mathrm{max},0}} \def\Hmin{\Hbase{\HSym}{\mathrm{min}}} \def\Hmaxf{\Hbase{\HSym}{\mathrm{max}}} \def\Hfn{\Hfnbase{\HSym}{}{}} \let\Hfunc\Hfn% backwards compatibility % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\DD} % (Usual) quantum relative entropy. (Actually this is more versatile, because % you can also specify subscript and superscript, so you can make on-the-fly % custom relative entropy measures.) % \begin{macrocode} \def\DD{\Dbase{\DSym}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dminz} % ``Old'' min-relative entropy, based on the R\'enyi-zero relative entropy. % \begin{macrocode} \newcommand\Dminz[1][]{\Dbase{\DSym}_{\mathrm{min,0}}^{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dminf} % Min-relative entropy (``new'' version). % \begin{macrocode} \newcommand\Dminf[1][]{\Dbase{\DSym}_{\mathrm{min}}^{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dmax} % Max-relative entropy. % \begin{macrocode} \newcommand\Dmax[1][]{\Dbase{\DSym}_{\mathrm{max}}^{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dr} % Rob-relative entropy. % \begin{macrocode} \newcommand\Dr[1][]{\Dbase{\DSym}_{\mathrm{r}}^{#1}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\DHyp} % Hypothesis testing relative entropy. % \begin{macrocode} \newcommand\DHyp[1][\eta]{\Dbase{\DSym}_{\mathrm{H}}^{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Dhyp} % Hypothesis testing relative entropy (alternative definition). % \changed[v3.1-added-Dhyp-qitobjdef-stdset]{v3.1}{2021/07/27}{Added the % \phfverb{\Dhyp} variant of the hypothesis testing relative entropy} % \begin{macrocode} \newcommand\Dhyp[1][\eta]{\Dbase{\DSym}_{\mathrm{h}}^{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\DCoh} % Coherent relative entropy (old style). % \begin{macrocode} \DefineTunedQitObject{DCoh}{\DCohbaseParse}{\DCohbaseRender}{{\DCSym}}{} % \end{macrocode} % \end{macro} % % \begin{macro}{\DCohx} % Coherent relative entropy (new style). % \begin{macrocode} \DefineTunedQitObject{DCohx}{\DCohbaseParse}{\DCohbaseRender}% {{\DCSym}}{% \let\DCohbaseStateSubscripts\DCohxStateSubscripts% } % \end{macrocode} % \end{macro} % % % End case |qitobjdef=stdset|. Last case is the final |\else| branch which is an % error, as we have an unknown set of standard definitions to load. % \begin{macrocode} \else \PackageError{phfqit}{Invalid value `\phfqit@opt@qitobjdef' specified for package option `qitobjdef'. Please specify one of `stdset' (the default) or `none'}{You specified an invalid value to the `qitobjdef' package option of the `phfqit' package.} \fi \fi % \end{macrocode} % % % \Finale \endinput