diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/optidef/README.md | 43 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/optidef/optidef.pdf | bin | 239595 -> 279131 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/optidef/optidef.tex | 895 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/optidef/optidef.sty | 461 |
4 files changed, 851 insertions, 548 deletions
diff --git a/Master/texmf-dist/doc/latex/optidef/README.md b/Master/texmf-dist/doc/latex/optidef/README.md index 2567e27d26b..27b97b66675 100644 --- a/Master/texmf-dist/doc/latex/optidef/README.md +++ b/Master/texmf-dist/doc/latex/optidef/README.md @@ -7,21 +7,18 @@ Optidef is a small library that provides a standard set of environments for writ The most important features are: -- It automatically aligns the problems in the most convenient way allowing even two different output formats: - * Beginning of the words "minimize/argmin" and "subject to" - * Double format for the location of the constraints: either to the right of subject to aligned with the objective function or below subject to. - * The =, > and < signs of the constraints. - * Optionally, an alignment point for some constraints features. An example could be the constraints names, e.g. align (boundary constraint) with (dynamic constraint), or the index of the constraints, e.g. in the case of having something like h(xk,uk) < 0, k=0, ...,N, the third alignment point can align the constraint indexes k=0, ...,N across different constraint lines. +- Different alignment alternatives between the constraints, objective function and the other problem components. +- Implemenation of a short format where "minimize" is substituted by "min" and "subject to" by "s.t." -- It provides an easy interface to define optimization problem for three different reference situations: - * Where no equation is referenced/numbered. - * Where the problem is referenced with a single number. - * Where each equation has an individual reference. +- It references optimization problem using three different policies: + * No equation is referenced + * The problem is referenced with a single label + * Each equation has an individual reference. -- It also allows a definition of any optimization problem without a limitless number of constraints. +- Limitless number of constraints. -- It defines four types of optimization problems: +- Four types of optimization problems: * minimize * maximize * arg mini @@ -36,17 +33,16 @@ Import the package by directly adding \usepackage{optidef} to your LaTeX documen The syntax to define an optimization problem is given by: - >\begin{mini#}[Format] - {Optimization variable} - {Objective function \label{Objective function referece}} - {\label{Global referece of Optimization Problem}} - {Result of the optimization problem or any expression on the left - of the minimize word} - \addConstraint{LHS Constraint 1}{RHS Constraint 1 \label{Reference Constraint 1}}{Extra Info Constraint 1} - \addConstraint{LHS Constraint 2}{RHS Constraint 2 \label{Reference Constraint 2}}{Extra Info Constraint 2} + >\begin{mini#}|sizeFormat|[constraintFormat] + {optimizationVariable} + {objectiveFunction \label{objectiveReference}} + {\label{problemReference}} + {problemResult} + \addConstraint{LHS.1}{RHS.1 \label{Const.1}}{extraInfo.1} + \addConstraint{LHS.2}{RHS.2 \label{Const.2}}{extraInfo.2} . . - \addConstraint{LHS N}{RHSConstraint N \label{Reference Constraint N}}{Extra Info Constraint N} + \addConstraint{LHS.N}{RHS.N \label{Const.N}}{extraInfo.N} \end{mini#} @@ -56,10 +52,9 @@ where mini# takes any of the following values: - mini! for referencing each equation - mini for referencing with a single label the whole problem. -Notice that only the first two parameters will be really necessary in every definition, nevertheless and for the sake of having homogeneous definitions, we opted for requiring the 4 parameters in every definition and expecting empty parameters definitions, i.e. \{\}, when they are not needed. - -After the definition of this parameters, the environment accepts the definition of an infinite number of constraints. +The last two defined problem parameters, "\label{optimizationProblem}"" and "optimizationResult", are mandatory to allow line breaking between the 6 parameters. +After the definition of this parameters, the environment accepts the definition of an infinite number of constraints. Finally note that \begin{mini#} can be substituted by \begin{maxi#}, \begin{argmini#} or \begin{argmaxi#}. @@ -69,7 +64,7 @@ E-mail: jesus.lago.garcia@venus.uni-freiburg.de Github: https://github.com/jeslago/optidef -## Latest stable version: Optidef 1.2 +## Latest stable version: Optidef 2.0 CTAN: https://www.ctan.org/pkg/optidef diff --git a/Master/texmf-dist/doc/latex/optidef/optidef.pdf b/Master/texmf-dist/doc/latex/optidef/optidef.pdf Binary files differindex 4e816442e0e..1e53a7209ee 100644 --- a/Master/texmf-dist/doc/latex/optidef/optidef.pdf +++ b/Master/texmf-dist/doc/latex/optidef/optidef.pdf diff --git a/Master/texmf-dist/doc/latex/optidef/optidef.tex b/Master/texmf-dist/doc/latex/optidef/optidef.tex index 3932abe8297..067cb104208 100644 --- a/Master/texmf-dist/doc/latex/optidef/optidef.tex +++ b/Master/texmf-dist/doc/latex/optidef/optidef.tex @@ -1,13 +1,16 @@ -\documentclass[]{report} +\documentclass[a4paper]{article} \usepackage{remreset} \usepackage{optidef} \usepackage{listings} +\usepackage{enumitem} +\usepackage{hyperref} + \lstset{ language=TeX, breaklines=true, } % Title Page -\title{\textit{\textbf{Optidef}} \\ A Latex library for optimization problems\\ \textnormal{Version - 1.2}} +\title{\textit{\textbf{Optidef}} \\ A Latex library for optimization problems\\ \textnormal{Version - 2.0}} \author{Jesus Lago Garcia} @@ -20,174 +23,230 @@ \begin{document} \maketitle +\newpage + +\tableofcontents + +\newpage + \section{Introduction and features} -This small library provides a standard set of environments for writing minimization problems. The most important features are: -\begin{enumerate} - \item It automatically aligns the problems in the most convenient way allowing different output formats: - \begin{enumerate} - \item Alignment at the beginning of the words \textit{minimize/argmin} and \textit{subject to}: - \begin{mini*} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex1}}{} - \addConstraint{g(w)}{=0} - \end{mini*} - \item Double format for the location of the constraints: either to the right of \textit{subject to} aligned with the objective function or below \textit{subject to}. - \item Optional alignment at the $=,~>,~<$ signs of the constraints. - \begin{mini*} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex1}}{} - \addConstraint{g(w)+h(w)}{=0} - \addConstraint{l(w)}{=5w.} - \end{mini*} - \item Optionally, the user can add a third alignment point on the constraints to set some constraint features. A clear example could be the constraints names: - \begin{mini*} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex1}}{} - \addConstraint{g(w)+h(w)}{=0,}{\text{(Topological Constraint)}} - \addConstraint{l(w)}{=5w,\quad}{\text{(Boundary Constraint)}} - \end{mini*} - - or the index of the constraints: - \begin{mini*} - {w,u}{f(w)+ R(w+6x)} - {\label{eq:Ex1}}{} - \addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1} - \addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1} - \end{mini*} - \end{enumerate} - -\item It provides an easy interface to define optimization problem for three different reference situations: +This Latex library provides a standard set of environments for writing optimization problems. The most important features are: \begin{enumerate} - \item Where no equation is referenced/numbered. - \item Where the problem is referenced with a single number. - \item Where each equation has an individual reference. -\end{enumerate} +\item It references optimization problem using three different policies: no equation is referenced, the problem is referenced with a single label, each equation has an individual reference. +\item It defines two problem size formats: a long format and a short format. +\item It allows four different outputs for the location of the constraints. +\item It allows the definition of a limitless number of constraints. +\item Four different type of problems: \textit{minimize}, \textit{maximize}, \textit{arg min} and \textit{arg max}. +\end{enumerate} + +\section{Environment Syntax Definition} +Considering that \verb|Const.i| stands for constraint $i$, \verb|LHS.i| stands for the left-hand-side of constraint $i$, and \verb|RHS.i| for the right-hand-side counterpart, the basic structure to define a general optimization problem with $N$ constraints is: +\begin{verbatim} + +\begin{mini#}|sizeFormat|[constraintFormat] +{optimizationVariable} +{objectiveFunction\label{objective}} +{\label{optimizationProblem}} +{optimizationResult} + +\addConstraint{LHS.1}{RHS.1\label{Const1}}{extraConst1} +\addConstraint{LHS.2}{RHS.2\label{Const2}}{extraConst2} +. +. +\addConstraint{LHS.N}{RHS.N\label{ConstN}}{extraConstN} +\end{mini#} +\end{verbatim} + +\subsection{Definition of Problem parameters} + +\begin{enumerate}[label=(\roman*)] + \item \verb|mini#|: defines the type of environment and reference used. There are four environments: \verb|mini|, \verb|maxi|, \verb|argmini|, and \verb|argmaxi|. There are three types of referencing: \verb|mini|, \verb|mini*| and \verb|mini!|. Consult Section \ref{sec:environments} for more details. + \item (Optional) \verb|sizeFormat|: optional parameter to define the size format of the problem. The possible values are: + \begin{itemize} + \item l: for the long format as defined in Section \ref{sec:longshort}. + \item s: for the short format as defined in Section \ref{sec:longshort}. + \end{itemize} + \item (Optional) \verb|constraintFormat|: optional parameter to change the format of the constraints. The parameter \verb|constraintFormat| can take the following values: + \begin{itemize} + \item 0: for the Standard definition in Section \ref{sec:format}. + \item 1: for Alternative 1 in Section \ref{sec:format}. + \item 2: for Alternative 2 in Section \ref{sec:format} + \item 3: for Alternative 3 in Section \ref{sec:format} + \end{itemize} + \item \verb|optimizationVariable|: variable to be optimizated in the problem, e.g. $w \in \Re^N$. + \item \verb|objectiveFunction\label{objective}|: function to be minimized/maximized as a function of the optimization variable, e.g. $\|w\|_2$. If required, the objective function label should also be included withing this term + \item \verb|\label{optimizationProblem}|: it defines the main and general reference for the optimization problem. It is used for the \verb|mini| and \verb|mini!| enviroments. In the \verb|mini*| environment should be left blank, i.e. \{\}, \textbf{not to be ommited}. + \item \verb|optimizationResult|: a term expressing the result of the optimization problem, e.g. $J(w^*)~=$. If not needed leave it blank, \textbf{not to be ommited}. +\end{enumerate} + +The last two defined problem parameters, \verb|\label{optimizationProblem}| and \verb|optimizationResult|, could be made optional. However, in order to improve the problem readibility, line breaking between the 7 parametes was implemented; unfortunately, linea breaking and optional parameters are not compatible and these two parameters had to be made mandatory. + +\subsection{Adding Constraints} + +After the definition of the problem parameters, the environment accepts the definition of an infinite number of constraints. For this definitions the following command is used: +~\\ -\item It also allows a definition of any optimization problem without a limitless number of constraints. +\verb|\addConstraint{LHS.k}{RHS.k\label{Const.k}}{extraConst.k}| +~\\ +The command accepts three different parameters +\begin{enumerate} + \item \verb|LHS.k|: the left-hand side of the the constraint $k$, e.g. $3w^\top w$. + \item (Optional) \verb|RHS.k\label{Const.k}|: the right-hand side of the constraint k if the equations should be aligned in the equality or inequality signs, e.g. $\leq \|w\|_\infty$. If required, the constraint label should also be included in this term. + \item (Optional) \verb|extraConst.k|: optional parameter to add extra alignment point for additional constraint information. An example would be the constraint names. Look Example \ref{ex:extra} or the fourth described feature in Section \ref{sec:alignment}. \end{enumerate} -\section{Environment types} + +\subsubsection{Constraints referencing} +Notice that the label for the constraints is always included in the right hand side expression and it only makes sense for the case of using the \verb|mini!| enviroment. The label of the objective function can also be included in a similar way. + + +\section{Environment Types} +\label{sec:environments} There are three basic environments depending on the type of referencing that should be used. \begin{enumerate} \item The \textbf{mini} environment for defining problems with a single reference label: - \begin{mini} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex1}}{} - \addConstraint{g(w)}{=0} - \end{mini} + \begin{mini} + {w}{f(w)+ R(w+6x)} + {\label{eq:Ex1}}{} + \addConstraint{g(w)}{=0} + \end{mini} \item The \textbf{mini*} environment if the problem does not have to be referenced: - \begin{mini*} - {w}{f(w)+ R(w+6x)} - {}{} - \addConstraint{g(w)}{=0} - \end{mini*} + \begin{mini*} + {w}{f(w)+ R(w+6x)} + {}{} + \addConstraint{g(w)}{=0} + \end{mini*} \item The \textbf{mini!} environment if each equation should be referenced: - \begin{mini!} - {w}{f(w)+ R(w+6x)\label{eq:Ex2}} - {\label{eq:Ex1}}{} - \addConstraint{g(w)}{=0} - \end{mini!} + \begin{mini!} + {w}{f(w)+ R(w+6x)\label{eq:Ex2}} + {\label{eq:Ex1}}{} + \addConstraint{g(w)}{=0} + \end{mini!} \end{enumerate} -\section{Output formats} +\noindent Additionally, there are four basic definitions of optimization problems: + +\begin{enumerate} + \item The \textbf{mini} environment: + \begin{mini} + {w}{f(w)+ R(w+6x)} + {}{} + \addConstraint{g(w)}{=0} + \end{mini} + \item The \textbf{maxi} environment: + \begin{maxi} + {w}{f(w)+ R(w+6x)} + {}{} + \addConstraint{g(w)}{=0} + \end{maxi} + \item The \textbf{argmini} environment: + \begin{argmini} + {w}{f(w)+ R(w+6x)} + {}{} + \addConstraint{g(w)}{=0} + \end{argmini} + \item The \textbf{argmaxi} environment: + \begin{argmaxi} + {w}{f(w)+ R(w+6x)} + {}{} + \addConstraint{g(w)}{=0} + \end{argmaxi} +\end{enumerate} + +\section{Long and Short Output Formats} +\label{sec:longshort} +The library permits the definition of two different problem size: a long format and a short format. + +\subsection{Long Format} +Selected by \verb|sizeFormat|=l. It makes use of \textit{subject to} and \textit{minimize/maximize} +\begin{mini*}|l| + {w}{f(w)+ R(w+6x)}{}{} + \addConstraint{g(w)}{=0} +\end{mini*} +\subsection{Short Format} +Selected by \verb|sizeFormat|=s. It uses instead the shorter \textit{s.t.} and \textit{min/max} +\begin{mini*}|s| + {w}{f(w)+ R(w+6x)}{}{} + \addConstraint{g(w)}{=0} +\end{mini*} + +\section{Alignment of Equations} +\label{sec:alignment} + +\begin{enumerate} +\item Alignment at the beginning of the words \textit{minimize} and \textit{subject to}: +\begin{mini} +{w}{f(w)+ R(w+6x)}{}{} +\addConstraint{g(w)}{=0} +\end{mini} +\item (Optional) Alignment at the $=,~>,~<$ signs of the constraints. +\begin{mini*}[1] +{w}{f(w)+ R(w+6x)}{}{} +\addConstraint{g(w)+h(w)}{=0} +\addConstraint{l(w)}{=5w.} +\end{mini*} +\item (Optional) Alignment of the longest constraint and the objective function: +\begin{mini*} + {w}{f(w)+ R(w+6x)}{}{} + \addConstraint{g(w)+h(w)}{=0} + \addConstraint{l(w)}{=5w.} +\end{mini*} +\item (Optional) Third alignment point on the constraints to set some constraint features. A clear example could be the constraints names: +\begin{mini*} +{w}{f(w)+ R(w+6x)}{}{} +\addConstraint{g(w)+h(w)}{=0,}{\text{(Topological Constraint)}} +\addConstraint{l(w)}{=5w,\quad}{\text{(Boundary Constraint)}} +\end{mini*} +or the index of the constraints: +\begin{mini*} +{w,u}{f(w)+ R(w+6x)}{}{} +\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1} +\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1} +\end{mini*} +\end{enumerate} + +\section{Output Formats for the Constraints} \label{sec:format} -There are four basic output formats. - \begin{enumerate} - \item \textbf{Standard format}: by default the constraints are aligned with the objective function, to the right of \textit{subject to} and with a second alignment point at the $=,~\leq,~\geq$: +There are four basic output formats for the location of the constraints. They are controlled by the environment parameter \verb|constraintFormat|. +\subsection{Standard Format} + It is the default format and if \verb|constraintFormat| left blank it is used. Alternatively can be also set by selecting \verb|constraintFormat|=0. + + By default the constraints are aligned with the objective function, to the right of \textit{subject to} and with a second alignment point at the $=,~\leq,~\geq$: \begin{mini} {w}{f(w)+ R(w+6x)} {\label{eq:Ex1}}{} \addConstraint{g(w)+h(w)}{=0} \addConstraint{t(w)}{=0.} \end{mini} - \item \textbf{Alternative 1}: a possible variation is to locate the constraints below \textit{subject to}: +\subsection{Alternative 1} + Selected by \verb|constraintFormat|=1. It locates the constraints below \textit{subject to} and keeps them aligned at the inequality/equality signs: \begin{mini}[1] {w}{f(w)+ R(w+6x)} {\label{eq:Ex1}}{} \addConstraint{g(w)+h(w)}{=0} \addConstraint{t(w)}{=0.} \end{mini} - \item \textbf{Alternative 2}: a second variation is to copletely remove the second alignment point: + \subsection{Alternative 2} + Selected by \verb|constraintFormat|=2. It aligns all the constraints with the objective function. \begin{mini}[2] {w}{f(w)+ R(w+6x)} {\label{eq:Ex1}}{} \addConstraint{g(w)+h(w)}{=0} \addConstraint{t(w)}{=0.} \end{mini} - \item \textbf{Alternative 3}: a third variation would be the combination of both of them: + \subsection{Alternative 3} + Selected by \verb|constraintFormat|=3. It aligns all the constraints below \textit{subject to}: \begin{mini}[3] {w}{f(w)+ R(w+6x)} {\label{eq:Ex1}}{} \addConstraint{g(w)+h(w)}{=0} \addConstraint{t(w)}{=0.} \end{mini} - \end{enumerate} - -\section{Environment Syntaxes} -The three environments use the same syntax with the same number of parameters. In particular, considering that \textit{Const} stands for constraint ,\textit{LHS} stands for Left-hand-side and \textit{RHS} for Right-hand-side, the basic structure to define a general optimization problem is: -\begin{verbatim} - -\begin{mini#}[Format] - {Optimization variable} - {Objective function \label{Objective function referece}} - {\label{Global referece of Optimization Problem}} - {Result of the optimization problem or any expression on - the left of the minimize word} - - \addConstraint{LHS Const 1}{RHS Const 1 \label{Reference - Const 1}}{Extra Const 1 Info} - \addConstraint{LHS Const 2}{RHS Const 2 \label{Reference - Constraint 2}}{Extra Const 2 Info} - . - . - \addConstraint{LHS N}{RHS Const N \label{Reference - Const N}}{Extra Const N Info} -\end{mini#} -\end{verbatim} - -\noindent where \# $\in \{*, !, ~ \}$. -\subsection{Parameters definition} -The number of parameters that the environment uses is 6: - -\begin{enumerate} - \item \verb|Optimization variable|, e.g. $w \in \Re^N$. - \item \verb|Objective function|, e.g. $\|w\|_2$. - \item \verb|\label{Global referece of Optimization Problem}|: it defines the main and general reference for the optimization problem. It is used for the \verb|mini| and \verb|mini!| enviroments. In the \verb|mini*| environment leave it blank, i.e. \{\}. - \item \verb|Result of the optimization problem|: optionally a term expressing the result of the optimization problem, e.g. $J(w^*)~=$. - \item \verb|Format|: optional parameter to change the format of the constraints. By default the constraints are located at the right of \textit{subject to} and aligned on the $=,\leq,\geq$ signs. However, as represented in Section \ref{sec:format}), the following variations are possible: - \begin{enumerate} - \item If Format=1: same alignment as the default format but the constraints appear right below \textit{subject to}. Check Alternative 1 in Section \ref{sec:format}). - \item If Format=2: constraints are located on the right of \textit{subject to} but left aligned. Check Alternative 2 in Section \ref{sec:format}). - \item If Format=3: constraints are located below \textit{subject to} but left aligned. Check Alternative 3 in Section \ref{sec:format}). - \end{enumerate} - -\end{enumerate} - -\noindent Notice that only the first two mandatory parameters (variable and objective) will be really necessary in every definition, nevertheless and for the sake of having homogeneous definitions, we opted for requiring the 4 parameters in every definition and expecting empty parameters definitions, i.e. \{\}, when they are not needed. - - -After the definition of this parameters, the environment accepts the definition of an infinite number of constraints. For this definitions the command: -~\\ - -\verb|\addConstraint{LHS Constraint k}| - -\verb|{RHS Constraint k \label{Reference Constraint k}}| - -\verb|{Extra Infor Contraint k}| -~\\ - -\noindent has to be used, where: -\begin{enumerate} - \item \verb|LHS Constraint|: the left-hand side of the any constraint, e.g. $3w^\top w$. - \item \verb|RHS Constraint|: the right-hand side of the first constraints including the equal, less and greater signs, e.g. $\leq \|w\|_\infty$, as well as the constraint label.\textbf{ Keep in mind that this parameter is optional and if not included or leave it blank all the constraints will be aligned to the left (See alternative format 2 and 3 in Section \ref{sec:format}).} - \item \verb|Extra Info|: optional parameter to add extra info such as contraints set definition or constraint name. Look Example 8 or the fourth described feature in Section 1. -\end{enumerate} -\subsubsection{Constraints referencing} -Notice that the label for the constraints is always included in the right hand side expression and it only makes sense for the case of using the \verb|mini!| enviroment. The label of the objective function can also be included in a similar way. -\subsubsection{Example 1 - mini environment} +\section{Examples} +\subsection{Example 1 - mini environment} The code: \begin{verbatim} @@ -213,7 +272,7 @@ The code: \addConstraint{h(x)}{=0.} \end{mini} -\subsubsection{Example 2 - mini* environment} +\subsection{Example 2 - mini* environment} On the other hand: \begin{verbatim} @@ -239,7 +298,7 @@ On the other hand: \addConstraint{h(x)}{=0.} \end{mini*} -\subsubsection{Example 3 - mini! environment} +\subsection{Example 3 - mini! environment} \noindent Finally, the multireferencing environment outputs: @@ -265,7 +324,7 @@ On the other hand: \addConstraint{h(x)}{=0.\label{eq:C4Example3}} \end{mini!} -\subsubsection{Example 4 - mini + problem result} +\subsection{Example 4 - Problem Result} \noindent Adding the problem result: @@ -293,7 +352,35 @@ On the other hand: \addConstraint{h(x)}{=0.} \end{mini} -\subsubsection{Example 5 - second format} +\subsection{Example 5 - Short Format} + +\noindent Adding the short format parameter: + +\begin{verbatim} +\begin{mini}|s| +{w}{f(w)+ R(w+6x)} +{\label{eq:Example1}} +{} + +\addConstraint{g(w)}{=0} +\addConstraint{n(w)}{= 6} +\addConstraint{L(w)+r(x)}{=Kw+p} +\addConstraint{h(x)}{=0.} +\end{mini} +\end{verbatim} + +\noindent outputs: + +\begin{mini}|s| + {w}{f(w)+ R(w+6x)} + {\label{eq:Ex1}}{} + \addConstraint{g(w)}{=0} + \addConstraint{n(w)}{= 6} + \addConstraint{L(w)+r(x)}{=Kw+p} + \addConstraint{h(x)}{=0.} +\end{mini} + +\subsection{Example 6 - Alternative 1 for Constraints} \noindent If including a 1 as optional parameter, the first constraint will appear aligned to the left right below \textit{subject to}. @@ -321,7 +408,7 @@ On the other hand: \addConstraint{h(x)}{=0.} \end{mini} -\subsubsection{Example 6 - third format} +\subsection{Example 7 - Alternative 2 for Constraints} \noindent If including a 2 as optional parameter, the constraint will appear to the right of \textit{subject to} but a single alignment point. @@ -349,7 +436,7 @@ On the other hand: \addConstraint{h(x)}{=0.} \end{mini} -\subsubsection{Example 7 - fourth format} +\subsection{Example 8 - Alternative 3 for Constraints} \noindent If including a 3 as optional parameter, the first constraint will appear aligned to the left right below \textit{subject to} and with a single alignment point. @@ -377,8 +464,9 @@ On the other hand: \addConstraint{h(x)}{=0.} \end{mini} -\subsubsection{Example 8 - mini* + extra constraint alignment} -Adding the fourth optional alignment to add constraint names: +\subsection{Example 9 - Extra Alignment in the Constraints} +\label{ex:extra} +Adding optional alignment to add constraint names: \begin{verbatim} \begin{mini*} @@ -391,49 +479,19 @@ Adding the fourth optional alignment to add constraint names: \end{mini*} \end{verbatim} - -\begin{mini*} - {w}{f(w)+ R(w+6x)} - {}{} - \addConstraint{g(w)}{=0,}{ \quad \text{(Dynamic constraint)}} - \addConstraint{n(w)}{= 6,}{ \quad \text{(Boundary constraint)}} - \addConstraint{L(w)+r(x)}{=Kw+p,}{ \quad \text{(Random constraint)}} - \addConstraint{h(x)}{=0,}{ \quad \text{(Path constraint).}} -\end{mini*} - - -\subsubsection{Example 9 - mini environment on the unconstrained case} +\subsection{Example 10 - The \textit{argmini} Environment} +Similar to the \verb|mini|, \verb|mini*| and \verb|mini!| environments, the environments \verb|argmini|, \verb|argmini*| and \verb|argmini!| are very similar environments that use the same syntax but the output is slightly different: \begin{verbatim} +\begin{argmini} +{w}{f(w)+ R(w+6x)} -\begin{mini} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex4}} - {} -\end{mini} -\end{verbatim} - -\noindent outputs: - -\begin{mini} - {w}{f(w)+ R(w+6x)} - {\label{eq:Ex4}}{} -\end{mini} - +{\label{eq:Example1}}{w^*=} -\section{The \textit{argmini} environment} - Similar to the \verb|mini|, \verb|mini*| and \verb|mini!| environments, the environments \verb|argmini|, \verb|argmini*| and \verb|argmini!| are very similar environments that use the same syntax but the output is slightly different. The following code serves for illustration: - -\begin{verbatim} -\begin{argmini} - {w}{f(w)+ R(w+6x)} - - {\label{eq:Example1}}{w^*=} - - \addConstraint{g(w)}{=0} - \addConstraint{n(w)}{= 6} - \addConstraint{L(w)+r(x)}{=Kw+p} - \addConstraint{h(x)}{=0.} +\addConstraint{g(w)}{=0} +\addConstraint{n(w)}{= 6} +\addConstraint{L(w)+r(x)}{=Kw+p} +\addConstraint{h(x)}{=0.} \end{argmini} \end{verbatim} @@ -448,20 +506,20 @@ Adding the fourth optional alignment to add constraint names: \addConstraint{h(x)}{=0.} \end{argmini} -\section{The \textit{maxi} and \textit{argmaxi} environments} +\subsection{Example 11 - The \textit{maxi} and \textit{argmaxi} Environments} Exactly the same syntax and definition as the previous environments, but now for defining maximization environments. The following code serves for illustration: \begin{verbatim} \begin{maxi} - {w}{f(w)+ R(w+6x)} - {g(w)}{=0} +{w}{f(w)+ R(w+6x)} +{g(w)}{=0} - {\label{eq:Example1}}{} +{\label{eq:Example1}}{} - \addConstraint{g(w)}{=0} - \addConstraint{n(w)}{= 6} - \addConstraint{L(w)+r(x)}{=Kw+p} - \addConstraint{h(x)}{=0.} +\addConstraint{g(w)}{=0} +\addConstraint{n(w)}{= 6} +\addConstraint{L(w)+r(x)}{=Kw+p} +\addConstraint{h(x)}{=0.} \end{maxi} \end{verbatim} @@ -477,8 +535,32 @@ Exactly the same syntax and definition as the previous environments, but now for \end{maxi} -\section{Problems and limitations} -One current limitation is that the size of the optimization variables must be smaller than the word minimize, otherwise, the output is not properly aligned. Example: +\subsection{Example 12 - All Possible Parameters} + +\begin{verbatim} +\begin{mini*}|s|[1] +{w}{f(w)+ R(w+6x)} +{}{w^*=} +\addConstraint{g(w)}{=0,}{ \quad \text{(Dynamic constraint)}} +\addConstraint{n(w)}{= 6,}{ \quad \text{(Boundary constraint)}} +\addConstraint{L(w)+r(x)}{=Kw+p,}{ \quad \text{(Random constraint)}} +\addConstraint{h(x)}{=0,}{ \quad \text{(Path constraint).}} +\end{mini*} +\end{verbatim} + +\begin{mini!}|s|[2] + {w}{f(w)+ R(w+6x)\label{eq:ObjectiveExample3}} + {\label{eq:Example3}} + {w^*=} + \addConstraint{g(w)}{=0 \label{eq:C1Example3}} + \addConstraint{n(w)}{= 6 \label{eq:C2Example3}} + \addConstraint{L(w)+r(x)}{=Kw+p \label{eq:C3Example3}} + \addConstraint{h(x)}{=0.\label{eq:C4Example3}} +\end{mini!} + + +\section{Long Optimization Variables} +The standard appearance for long optimization variables is as follows: \begin{mini!} {x_0,u_0,x_1,\hdots,u_{N-1},x_N} @@ -489,7 +571,7 @@ One current limitation is that the size of the optimization variables must be sm \addConstraint{r(x_0,x_N)}{= 0. \label{dOCP:boundary}} \end{mini!} -\noindent A possible way to avoid this is to stack them with the command: \begin{verbatim} +\noindent A possible way to reduce the large variable spacing is to stack them with the command: \begin{verbatim} \substack{x_0,u_0,x_1,\hdots,\\u_{N-1},x_N} \end{verbatim} @@ -504,7 +586,7 @@ One current limitation is that the size of the optimization variables must be sm \section{Code definition} \begin{lstlisting} -% optidef - Version 1.2 +% optidef - Version 2.0 % %Copyright 2016 J. Lago Garcia % @@ -518,14 +600,34 @@ One current limitation is that the size of the optimization variables must be sm %This work consists of the file optidef.sty. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{optidef}[2016/06/28 - version=1.2, Package for defining optimization problems] +\ProvidesPackage{optidef}[2016/08/07 - version=2.0, Package for defining optimization problems] \RequirePackage{environ} \RequirePackage{mathtools} \RequirePackage{xifthen} \RequirePackage{etoolbox} \RequirePackage{xparse} -\RequirePackage{multirow} +\RequirePackage{calc} + +%%%%%%%%%%%%%%%%%%%%%%% +% DEFINING PACKAGE OPTIONS +%%%%%%%%%%%%%%%%%%%%%%% +% Default +\newcommand{\defaultProblemFormat}{l} + +\DeclareOption{short}{ +\renewcommand{\defaultProblemFormat}{s} +} + +\DeclareOption{long}{ +\renewcommand{\defaultProblemFormat}{l} +} + +\ProcessOptions\relax + +%%%%%%%%%%%%%%%%%%%%%%% +% VARIABLES DEFINITION +%%%%%%%%%%%%%%%%%%%%%%% % Toogle to indicate if during the addConstraint command the first constraint should be built together with "subject to" \newtoggle{bodyCon} @@ -536,63 +638,118 @@ One current limitation is that the size of the optimization variables must be sm \togglefalse{previousThird} \newcommand{\spanit}{} +% Variable used to define the subject to word for short and long versions +\newcommand{\bodySubjectTo}{Unset Subject to} + +% Variable used for defining if the long problem format or the short problem format is used +\newcommand{\localProblemFormat}{l} + +% Variable to storage which type of of local problem is being solved +\newcommand{\localProblemType}{minimize} + +% Defining variable to storage problem variable +\newcommand{\localOptimalVariable}{} -% Macros for objective definition, constraint definition and extra constraint definition -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -------- DEFINITION COMMAND OBJECTIVE ----------- -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newlength\stextwidth + +%%%%%%%%%%%%%%%%%%%%%%% +% OBJECTIVE COMMAND DEFINITION +%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bodyobj}[4] { \ifthenelse{\isempty{#4}} { -%&\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span } { -%#4 ~~ &\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span -#4 ~~ &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span +#4~ &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -------- DEFINITION DIFFERENT TYPE OF BODY CONSTRAINTS --------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LONG VERSION "minimize" instead of "min" +\newcommand{\bodyobjLong}[4] +{ +\ifthenelse{\isempty{#4}} +{ +&\mathmakebox[\widthof{$\underset{\displaystyle #1}{\mathrm{subject~to}}$}]{\underset{\displaystyle #1}{\mathrm{#3}}} \quad #2\span\span\span\span +} +{ +#4~ &\mathmakebox[\widthof{$\underset{\displaystyle #1}{\mathrm{subject~to}}$}]{\underset{\displaystyle #1}{\mathrm{#3}}} \quad #2\span\span\span\span +} +} +%% SHORT VERSION "min" instead of "minimize" +\newcommand{\bodyobjShort}[4] +{ +\ifthenelse{\isempty{#4}} +{ +&\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span +} +{ +#4 ~ &\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span +} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFINITION DIFFERENT TYPE OF BODY CONSTRAINTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% A BODY CONSTRAINT IS THE INITIAL CONSTRAINT DEFINED WITH THE 'SUBJECT TO', DEPENDING ON THE TYPE OF PROBLEM A DIFFERENT VERSION IS USED + + +% Main command. Dynamically redefined at every new problem definition. \DeclareDocumentCommand{\bodyconst}{m G{}} { \ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \quad & #2 +\\ &\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{subject~to}} \quad & #2 }{ -\\ &\mathrm{subject~to} \quad  & #2 +\\ &\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{subject~to}} \quad  & #2 } } -% Standard version -\DeclareDocumentCommand{\bodyconstRight}{m G{} G{}} -{ \ifthenelse{\equal{#3}{}}{ -\ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \quad & #2 -}{ -\\ &\mathrm{subject~to} \quad  & #2 +\newcommand{\bodySubjectToDefinition}{ +%## If the short version of "subject to", i.e. "s.t.", should be used the command \bodySubjectTo should be modified +\ifthenelse{\equal{\localProblemFormat}{s}} +{%% +\global\def\bodySubjectTo{\mathmakebox[\widthof{$\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{\localProblemType}}$}][c]{\mathmakebox[\widthof{$\mathrm{\localProblemType}$}][l]{\mathrm{\kern 0.1em s.t.}}}} +}{%% +\global\def\bodySubjectTo{\mathmakebox[\widthof{$\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{\,subject~to}}$}][c]{\mathmakebox[\widthof{$\mathrm{\localProblemType}$}][l]{\mathrm{subject~to}}}} +}%% +% } + +% Standard version. +\DeclareDocumentCommand{\bodyconstRight}{m G{} G{}} +{%%% +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" +\ifthenelse{\equal{#3}{}}{%% +\ifthenelse{\equal{#2}{}}{% +\\ & \bodySubjectTo \quad & #2 +}{% +\\ &\bodySubjectTo \quad  & #2 +}% \togglefalse{previousThird} -}{ -\ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \quad & #2 & -}{ -\\ &\mathrm{subject~to} \quad  & #2 & -} +}{%% +\ifthenelse{\equal{#2}{}}{% +\\ &\bodySubjectTo \quad & #2 & +}{% +\\ &\bodySubjectTo \quad  & #2 & +}% \toggletrue{previousThird} -} -} +}%% +}%%% -% Single alignment point + +% Single alignment point but next to subject to \DeclareDocumentCommand{\bodyconstOneAlign}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ -\\ &\mathrm{subject~to} \quad & #2 \togglefalse{previousThird} +\\ &\bodySubjectTo\quad & #2 \togglefalse{previousThird} }{ -\\ &\mathrm{subject~to} \quad & #2 & +\\ &\bodySubjectTo\quad & #2 & \toggletrue{previousThird} } } @@ -600,84 +757,96 @@ One current limitation is that the size of the optimization variables must be sm % Contraints below subject to and with a single alignment point \DeclareDocumentCommand{\bodyconstOneAlignBelow}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo \span\span\span\span \\ && #2 \togglefalse{previousThird} }{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo \span\span\span\span \\ && #2 & \toggletrue{previousThird} } } -% Contraints below subject to +% Contraints below subject to but with double alignment point \DeclareDocumentCommand{\bodyconstBelow}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ \ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo\span\span\span\span \\ && #2 }{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo \span\span\span\span \\ & & #2 } \togglefalse{previousThird} }{ \ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo \span\span\span\span \\ && #2 & }{ -\\ &\mathrm{subject~to} \span\span\span\span \\ +\\ &\bodySubjectTo\span\span\span\span \\ & & #2 & } \toggletrue{previousThird} } } -% Contraints below subject to for the case of having multiple equations +% Contraints below subject to for the case of having a reference/label for each individual equation \DeclareDocumentCommand{\bodyconstBelowMult}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ \ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 }{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo \span\span\span\span \nonumber \\ & & #2 } \togglefalse{previousThird} }{ \ifthenelse{\equal{#2}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 & }{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo \span\span\span\span \nonumber \\ & & #2 & } \toggletrue{previousThird} } } -% Contraints below subject to and with a single alignment point for the case of having several equations +% Contraints below subject to and with a single alignment point for the case of having a reference/label for each individual equation \DeclareDocumentCommand{\bodyconstOneAlignBelowMult}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 \togglefalse{previousThird} }{ -\\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ +\\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 && #3 \toggletrue{previousThird} } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -------- DEFINITION DIFFERENT TYPE OF ADDING CONSTRAINTS --- --% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFINITION DIFFERENT TYPE OF ADDING CONSTRAINTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Main command. Dynamically redefined at every problem definiton. \DeclareDocumentCommand{\addConstraint}{m G{} G{}}{ +% "If clause" selecting whether a third parameter (#3) defining extra constraint information is used \ifthenelse{\equal{#3}{}}{ +% Second "If clause" selecting whether two or 1 elements for the constraints are used \ifthenelse{\equal{#2}{}}{ \iftoggle{bodyCon}{ \bodyconst{#1} @@ -767,7 +936,7 @@ One current limitation is that the size of the optimization variables must be sm } } -% Adding constraints for a single alignment point +% Adding constraints with a single alignment point but next to subject to \DeclareDocumentCommand{\oneAlignAddConstraint}{m G{} G{}}{ \iftoggle{bodyCon}{ \bodyconstOneAlign{#1}{#2}{#3} @@ -799,7 +968,7 @@ One current limitation is that the size of the optimization variables must be sm } } -% Adding constraints below subject to for multiple references +% Adding constraints below "subject to" for multiple references \DeclareDocumentCommand{\BelowAddConstraintMult}{m G{} G{}}{ \iftoggle{bodyCon}{ \bodyconstBelowMult{#1}{#2}{#3} @@ -839,9 +1008,9 @@ One current limitation is that the size of the optimization variables must be sm } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ------------- SELECTING TYPE OF FORMAT -----------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%% +% SELECTING TYPE OF FORMAT +%%%%%%%%%%%%%%%%%%%% \newcommand{\selectConstraint}[1]{ \ifthenelse{\equal{#1}{1}}{ \let\addConstraint\BelowAddConstraint @@ -873,157 +1042,183 @@ One current limitation is that the size of the optimization variables must be sm } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ------------- SETTING DEFAULT FORMAT -------------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%% +% SETTING DEFAULT FORMAT +%%%%%%%%%%%%%%%%%%% \newcommand{\setStandardMini}{ \toggletrue{bodyCon} \let\addConstraint\standardAddConstraint } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% COMMANDS TO DEFINE ALL REQUIRED PROPERTIES TO CHOOSE SHORT/LONG FORMAT +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\setFormatShort}[1]{\global\def\localProblemFormat{s} \let\bodyobj\bodyobjShort \renewcommand{\localProblemType}{#1}} -\newcommand{\breakObjectiveOneConstraint}[1]{&&\\} - +\newcommand{\setFormatLong}[1]{\global\def\localProblemFormat{l} \let\bodyobj\bodyobjLong \renewcommand{\localProblemType}{#1}} +\newcommand{\breakObjectiveOneConstraint}[1]{&&\\} +%%%%%%%%%%%%%%%%%%%%% %MINIMIZATION ENVIRONMENTS +%%%%%%%%%%%%%%%%%%%% -\NewEnviron{mini}[5][]{% -\selectConstraint{#1} -\let\addConstraint\standardAddConstraint -\begin{equation} -#4 -\begin{alignedat}{5} -\bodyobj{#2}{#3}{minimize}{#5} -\BODY -\end{alignedat} -\end{equation} -\setStandardMini -} -\NewEnviron{argmini}[5][]{% +% BASE ENVIRONMENTS +% Base environment for the three possible types of referencing: 1 label, no label or multilabel +% Base environment defined using NewEnviron package because of \BODY command +\NewEnviron{BaseMini}[6]{% \selectConstraint{#1} +\renewcommand{\localOptimalVariable}{#2} \begin{equation} #4 \begin{alignedat}{5} -\bodyobj{#2}{#3}{arg~min}{#5} +\bodyobj{#2}{#3}{#6}{#5} \BODY \end{alignedat} -\end{equation} +\end{equation} \setStandardMini } -\NewEnviron{mini*}[5][]{% +\NewEnviron{BaseMiniStar}[5]{% \selectConstraint{#1} +\renewcommand{\localOptimalVariable}{#2} \begin{alignat*}{5} -\bodyobj{#2}{#3}{minimize}{#5} +\bodyobj{#2}{#3}{#5}{#4} \BODY \end{alignat*} \setStandardMini } -\NewEnviron{argmini*}[5][]{% -\selectConstraint{#1} -\begin{alignat*}{5} -\bodyobj{#2}{#3}{arg~mini}{#5} -\BODY -\end{alignat*} -\setStandardMini -} - -\NewEnviron{mini!}[5][]{% +\NewEnviron{BaseMiniExclam}[6]{% \selectConstraintMult{#1} +\renewcommand{\localOptimalVariable}{#2} \begin{subequations} #4 \begin{alignat}{5} -\bodyobj{#2}{#3}{minimize}{#5} +\bodyobj{#2}{#3}{#6}{#5} \BODY \end{alignat} \end{subequations} \setStandardMini } -\NewEnviron{argmini!}[5][]{% -\selectConstraintMult{#1} -\begin{subequations} -#4 -\begin{alignat}{5} -\bodyobj{#2}{#3}{arg~min}{#5} -\BODY -\end{alignat} -\end{subequations} -\setStandardMini -} - -%MAXIMIZATION ENVIRONMENTS -\NewEnviron{maxi}[5][]{% -\selectConstraint{#1} -\begin{equation} -#4 -\begin{alignedat}{5} -\bodyobj{#2}{#3}{maximize}{#5} -\BODY -\end{alignedat} -\end{equation} -\setStandardMini -} +% INDIVIDUAL AND SPECIFIC ENVIRONMENTS (mini, maxi, argmini*...) +% Specific environments defined with xparse package due to arguments options -\NewEnviron{argmaxi}[5][]{% -\selectConstraint{#1} -\begin{equation} -#4 -\begin{alignedat}{5} -\bodyobj{#2}{#3}{arg~maxi}{#5} -\BODY -\end{alignedat} -\end{equation} -\setStandardMini -} +%MINIMIZATION ENVIRONMENTS +% Single reference probems +\DeclareDocumentEnvironment{mini}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{min} \BaseMini{#2}{#3}{#4}{#5}{#6}{min}} +% Long version problem +{\setFormatLong{minimize} \BaseMini{#2}{#3}{#4}{#5}{#6}{minimize}} +}{\endBaseMini} + +\DeclareDocumentEnvironment{argmini}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~min} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~min}} +% Long version problem +{\setFormatLong{arg~min} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~min}} +}{\endBaseMini} + + +% No reference +\DeclareDocumentEnvironment{mini*}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{min} \BaseMiniStar{#2}{#3}{#4}{#6}{min}} +% Long version problem +{\setFormatLong{minimize} \BaseMiniStar{#2}{#3}{#4}{#6}{minimize}} +}{\textbf{\endBaseMiniStar}} + +\DeclareDocumentEnvironment{argmini*}{D||{l} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~min}\BaseMiniStar{#2}{#3}{#4}{#6}{arg~min}} +% Long version problem +{\setFormatLong{arg~min} \BaseMiniStar{#2}{#3}{#4}{#6}{arg~min}} +}{\textbf{\endBaseMiniStar}} + + +% Multiple reference +\DeclareDocumentEnvironment{mini!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{min} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{min}} +% Long version problem +{\setFormatLong{minimize} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{minimize}} +}{\endBaseMiniExclam} + +\DeclareDocumentEnvironment{argmini!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~min}\BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~min}} +% Long version problem +{\setFormatLong{arg~min} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~min}} +}{\endBaseMiniExclam} -\NewEnviron{maxi*}[5][]{% -\selectConstraint{#1} -\begin{alignat*}{5} -\bodyobj{#2}{#3}{maximize}{#5} -\BODY -\end{alignat*} -\setStandardMini -} -\NewEnviron{argmaxi*}[5][]{% -\selectConstraint{#1} -\begin{alignat*}{5} -\bodyobj{#2}{#3}{arg~maxi}{#5} -\BODY -\end{alignat*} -\setStandardMini -} -\NewEnviron{maxi!}[5][]{% -\selectConstraintMult{#1} -\begin{subequations} -#4 -\begin{alignat}{5} -\bodyobj{#2}{#3}{maximize}{#5} -\BODY -\end{alignat} -\end{subequations} -\setStandardMini -} +%MAXIMIZATION ENVIRONMENTS -\NewEnviron{argmaxi!}[5][]{% -\selectConstraintMult{#1} -\begin{subequations} -#4 -\begin{alignat}{5} -\bodyobj{#2}{#3}{arg~maxi}{#5} -\BODY -\end{alignat} -\end{subequations} -\setStandardMini -} +% Single reference probems +\DeclareDocumentEnvironment{maxi}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{max} \BaseMini{#2}{#3}{#4}{#5}{#6}{max}} +% Long version problem +{\setFormatLong{maximize} \BaseMini{#2}{#3}{#4}{#5}{#6}{maximize}} +}{\endBaseMini} + +\DeclareDocumentEnvironment{argmaxi}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~max} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~max}} +% Long version problem +{\setFormatLong{arg~max} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~max}} +}{\endBaseMini} + + +% No reference +\DeclareDocumentEnvironment{maxi*}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{max} \BaseMiniStar{#2}{#3}{#4}{#6}{max}} +% Long version problem +{\setFormatLong{maximize} \BaseMiniStar{#2}{#3}{#4}{#6}{maximize}} +}{\textbf{\endBaseMiniStar}} + +\DeclareDocumentEnvironment{argmaxi*}{D||{l} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~max}\BaseMiniStar{#2}{#3}{#4}{#6}{arg~max}} +% Long version problem +{\setFormatLong{arg~max} \BaseMiniStar{#2}{#3}{#4}{#6}{arg~max}} +}{\textbf{\endBaseMiniStar}} + + +% Multiple reference +\DeclareDocumentEnvironment{maxi!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{max} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{max}} +% Long version problem +{\setFormatLong{maximize} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{maximize}} +}{\endBaseMiniExclam} + +\DeclareDocumentEnvironment{argmaxi!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~max}\BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~max}} +% Long version problem +{\setFormatLong{arg~max} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~max}} +}{\endBaseMiniExclam} \end{lstlisting} \end{document} diff --git a/Master/texmf-dist/tex/latex/optidef/optidef.sty b/Master/texmf-dist/tex/latex/optidef/optidef.sty index 0bc5e994ddb..796992d5d22 100644 --- a/Master/texmf-dist/tex/latex/optidef/optidef.sty +++ b/Master/texmf-dist/tex/latex/optidef/optidef.sty @@ -1,4 +1,4 @@ -% optidef - Version 1.2 +% optidef - Version 2.0 % %Copyright 2016 J. Lago Garcia % @@ -12,14 +12,34 @@ %This work consists of the file optidef.sty. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{optidef}[2016/06/28 - version=1.2, Package for defining optimization problems] +\ProvidesPackage{optidef}[2016/08/07 - version=2.0, Package for defining optimization problems] \RequirePackage{environ} \RequirePackage{mathtools} \RequirePackage{xifthen} \RequirePackage{etoolbox} \RequirePackage{xparse} -\RequirePackage{multirow} +\RequirePackage{calc} + +%%%%%%%%%%%%%%%%%%%%%%% +% DEFINING PACKAGE OPTIONS +%%%%%%%%%%%%%%%%%%%%%%% +% Default +\newcommand{\defaultProblemFormat}{l} + +\DeclareOption{short}{ + \renewcommand{\defaultProblemFormat}{s} +} + +\DeclareOption{long}{ +\renewcommand{\defaultProblemFormat}{l} +} + +\ProcessOptions\relax + +%%%%%%%%%%%%%%%%%%%%%%% +% VARIABLES DEFINITION +%%%%%%%%%%%%%%%%%%%%%%% % Toogle to indicate if during the addConstraint command the first constraint should be built together with "subject to" \newtoggle{bodyCon} @@ -30,63 +50,118 @@ \togglefalse{previousThird} \newcommand{\spanit}{} +% Variable used to define the subject to word for short and long versions +\newcommand{\bodySubjectTo}{Unset Subject to} + +% Variable used for defining if the long problem format or the short problem format is used +\newcommand{\localProblemFormat}{l} + +% Variable to storage which type of of local problem is being solved +\newcommand{\localProblemType}{minimize} + +% Defining variable to storage problem variable +\newcommand{\localOptimalVariable}{} + +\newlength\stextwidth -% Macros for objective definition, constraint definition and extra constraint definition -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -------- DEFINITION COMMAND OBJECTIVE ----------- -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%% +% OBJECTIVE COMMAND DEFINITION +%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bodyobj}[4] { \ifthenelse{\isempty{#4}} { - %&\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span } { - %#4 ~~ &\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span - #4 ~~ &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span + #4~ &\underset{\displaystyle #1}{\mathrlap{\mathrm{#3}}\phantom{\mathrm{subject~to}}} \quad #2\span\span\span\span + } +} + + +%% LONG VERSION "minimize" instead of "min" +\newcommand{\bodyobjLong}[4] +{ + \ifthenelse{\isempty{#4}} + { + &\mathmakebox[\widthof{$\underset{\displaystyle #1}{\mathrm{subject~to}}$}]{\underset{\displaystyle #1}{\mathrm{#3}}} \quad #2\span\span\span\span + } + { + #4~ &\mathmakebox[\widthof{$\underset{\displaystyle #1}{\mathrm{subject~to}}$}]{\underset{\displaystyle #1}{\mathrm{#3}}} \quad #2\span\span\span\span + } +} + +%% SHORT VERSION "min" instead of "minimize" +\newcommand{\bodyobjShort}[4] +{ + \ifthenelse{\isempty{#4}} + { + &\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span + } + { + #4 ~ &\underset{\displaystyle #1}{\mathrm{#3}} \quad #2\span\span\span\span } } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFINITION DIFFERENT TYPE OF BODY CONSTRAINTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -------- DEFINITION DIFFERENT TYPE OF BODY CONSTRAINTS --------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% A BODY CONSTRAINT IS THE INITIAL CONSTRAINT DEFINED WITH THE 'SUBJECT TO', DEPENDING ON THE TYPE OF PROBLEM A DIFFERENT VERSION IS USED + +% Main command. Dynamically redefined at every new problem definition. \DeclareDocumentCommand{\bodyconst}{m G{}} { \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \quad & #2 + \\ &\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{subject~to}} \quad & #2 }{ - \\ &\mathrm{subject~to} \quad  & #2 + \\ &\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{subject~to}} \quad  & #2 } } -% Standard version -\DeclareDocumentCommand{\bodyconstRight}{m G{} G{}} -{ \ifthenelse{\equal{#3}{}}{ - \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \quad & #2 - }{ - \\ &\mathrm{subject~to} \quad  & #2 - } - \togglefalse{previousThird} - }{ - \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \quad & #2 & - }{ - \\ &\mathrm{subject~to} \quad  & #2 & - } - \toggletrue{previousThird} - } +\newcommand{\bodySubjectToDefinition}{ +%## If the short version of "subject to", i.e. "s.t.", should be used the command \bodySubjectTo should be modified +\ifthenelse{\equal{\localProblemFormat}{s}} +{%% +\global\def\bodySubjectTo{\mathmakebox[\widthof{$\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{\localProblemType}}$}][c]{\mathmakebox[\widthof{$\mathrm{\localProblemType}$}][l]{\mathrm{\kern 0.1em s.t.}}}} +}{%% +\global\def\bodySubjectTo{\mathmakebox[\widthof{$\underset{\displaystyle \phantom{\localOptimalVariable}}{\mathrm{\,subject~to}}$}][c]{\mathmakebox[\widthof{$\mathrm{\localProblemType}$}][l]{\mathrm{subject~to}}}} +}%% +% } -% Single alignment point +% Standard version. +\DeclareDocumentCommand{\bodyconstRight}{m G{} G{}} +{%%% +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" +\ifthenelse{\equal{#3}{}}{%% + \ifthenelse{\equal{#2}{}}{% + \\ & \bodySubjectTo \quad & #2 + }{% + \\ &\bodySubjectTo \quad  & #2 + }% + \togglefalse{previousThird} +}{%% + \ifthenelse{\equal{#2}{}}{% + \\ &\bodySubjectTo \quad & #2 & + }{% + \\ &\bodySubjectTo \quad  & #2 & + }% + \toggletrue{previousThird} +}%% +}%%% + + +% Single alignment point but next to subject to \DeclareDocumentCommand{\bodyconstOneAlign}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ - \\ &\mathrm{subject~to} \quad & #2 \togglefalse{previousThird} + \\ &\bodySubjectTo\quad & #2 \togglefalse{previousThird} }{ - \\ &\mathrm{subject~to} \quad & #2 & + \\ &\bodySubjectTo\quad & #2 & \toggletrue{previousThird} } } @@ -94,84 +169,96 @@ % Contraints below subject to and with a single alignment point \DeclareDocumentCommand{\bodyconstOneAlignBelow}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo \span\span\span\span \\ && #2 \togglefalse{previousThird} }{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo \span\span\span\span \\ && #2 & \toggletrue{previousThird} } } -% Contraints below subject to +% Contraints below subject to but with double alignment point \DeclareDocumentCommand{\bodyconstBelow}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo\span\span\span\span \\ && #2 }{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo \span\span\span\span \\ & & #2 } \togglefalse{previousThird} }{ \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo \span\span\span\span \\ && #2 & }{ - \\ &\mathrm{subject~to} \span\span\span\span \\ + \\ &\bodySubjectTo\span\span\span\span \\ & & #2 & } \toggletrue{previousThird} } } -% Contraints below subject to for the case of having multiple equations +% Contraints below subject to for the case of having a reference/label for each individual equation \DeclareDocumentCommand{\bodyconstBelowMult}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 }{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo \span\span\span\span \nonumber \\ & & #2 } \togglefalse{previousThird} }{ \ifthenelse{\equal{#2}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 & }{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo \span\span\span\span \nonumber \\ & & #2 & } \toggletrue{previousThird} } } -% Contraints below subject to and with a single alignment point for the case of having several equations +% Contraints below subject to and with a single alignment point for the case of having a reference/label for each individual equation \DeclareDocumentCommand{\bodyconstOneAlignBelowMult}{m G{} G{}} { +\bodySubjectToDefinition +%## Set the first constraint according to the format used for "subject to" \ifthenelse{\equal{#3}{}}{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 \togglefalse{previousThird} }{ - \\ &\mathrm{subject~to} \span\span\span\span \nonumber \\ + \\ &\bodySubjectTo\span\span\span\span \nonumber \\ && #2 && #3 \toggletrue{previousThird} } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -------- DEFINITION DIFFERENT TYPE OF ADDING CONSTRAINTS --- --% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFINITION DIFFERENT TYPE OF ADDING CONSTRAINTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Main command. Dynamically redefined at every problem definiton. \DeclareDocumentCommand{\addConstraint}{m G{} G{}}{ +% "If clause" selecting whether a third parameter (#3) defining extra constraint information is used \ifthenelse{\equal{#3}{}}{ + % Second "If clause" selecting whether two or 1 elements for the constraints are used \ifthenelse{\equal{#2}{}}{ \iftoggle{bodyCon}{ \bodyconst{#1} @@ -261,7 +348,7 @@ } } -% Adding constraints for a single alignment point +% Adding constraints with a single alignment point but next to subject to \DeclareDocumentCommand{\oneAlignAddConstraint}{m G{} G{}}{ \iftoggle{bodyCon}{ \bodyconstOneAlign{#1}{#2}{#3} @@ -293,7 +380,7 @@ } } -% Adding constraints below subject to for multiple references +% Adding constraints below "subject to" for multiple references \DeclareDocumentCommand{\BelowAddConstraintMult}{m G{} G{}}{ \iftoggle{bodyCon}{ \bodyconstBelowMult{#1}{#2}{#3} @@ -333,9 +420,9 @@ } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ------------- SELECTING TYPE OF FORMAT -----------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%% +% SELECTING TYPE OF FORMAT +%%%%%%%%%%%%%%%%%%%% \newcommand{\selectConstraint}[1]{ \ifthenelse{\equal{#1}{1}}{ \let\addConstraint\BelowAddConstraint @@ -367,154 +454,180 @@ } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ------------- SETTING DEFAULT FORMAT -------------% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%% +% SETTING DEFAULT FORMAT +%%%%%%%%%%%%%%%%%%% \newcommand{\setStandardMini}{ \toggletrue{bodyCon} \let\addConstraint\standardAddConstraint } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% COMMANDS TO DEFINE ALL REQUIRED PROPERTIES TO CHOOSE SHORT/LONG FORMAT +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\setFormatShort}[1]{\global\def\localProblemFormat{s} \let\bodyobj\bodyobjShort \renewcommand{\localProblemType}{#1}} -\newcommand{\breakObjectiveOneConstraint}[1]{&&\\} - +\newcommand{\setFormatLong}[1]{\global\def\localProblemFormat{l} \let\bodyobj\bodyobjLong \renewcommand{\localProblemType}{#1}} +\newcommand{\breakObjectiveOneConstraint}[1]{&&\\} +%%%%%%%%%%%%%%%%%%%%% %MINIMIZATION ENVIRONMENTS +%%%%%%%%%%%%%%%%%%%% -\NewEnviron{mini}[5][]{% -\selectConstraint{#1} -\let\addConstraint\standardAddConstraint - \begin{equation} - #4 - \begin{alignedat}{5} - \bodyobj{#2}{#3}{minimize}{#5} - \BODY - \end{alignedat} - \end{equation} -\setStandardMini -} -\NewEnviron{argmini}[5][]{% +% BASE ENVIRONMENTS +% Base environment for the three possible types of referencing: 1 label, no label or multilabel +% Base environment defined using NewEnviron package because of \BODY command +\NewEnviron{BaseMini}[6]{% \selectConstraint{#1} - \begin{equation} - #4 - \begin{alignedat}{5} - \bodyobj{#2}{#3}{arg~min}{#5} - \BODY - \end{alignedat} - \end{equation} +\renewcommand{\localOptimalVariable}{#2} +\begin{equation} +#4 +\begin{alignedat}{5} +\bodyobj{#2}{#3}{#6}{#5} +\BODY +\end{alignedat} +\end{equation} \setStandardMini } -\NewEnviron{mini*}[5][]{% +\NewEnviron{BaseMiniStar}[5]{% \selectConstraint{#1} - \begin{alignat*}{5} - \bodyobj{#2}{#3}{minimize}{#5} - \BODY - \end{alignat*} +\renewcommand{\localOptimalVariable}{#2} +\begin{alignat*}{5} +\bodyobj{#2}{#3}{#5}{#4} +\BODY +\end{alignat*} \setStandardMini } -\NewEnviron{argmini*}[5][]{% -\selectConstraint{#1} - \begin{alignat*}{5} - \bodyobj{#2}{#3}{arg~mini}{#5} - \BODY - \end{alignat*} -\setStandardMini -} - -\NewEnviron{mini!}[5][]{% -\selectConstraintMult{#1} +\NewEnviron{BaseMiniExclam}[6]{% + \selectConstraintMult{#1} + \renewcommand{\localOptimalVariable}{#2} \begin{subequations} #4 \begin{alignat}{5} - \bodyobj{#2}{#3}{minimize}{#5} + \bodyobj{#2}{#3}{#6}{#5} \BODY \end{alignat} \end{subequations} -\setStandardMini -} - -\NewEnviron{argmini!}[5][]{% -\selectConstraintMult{#1} - \begin{subequations} - #4 - \begin{alignat}{5} - \bodyobj{#2}{#3}{arg~min}{#5} - \BODY - \end{alignat} - \end{subequations} -\setStandardMini + \setStandardMini } -%MAXIMIZATION ENVIRONMENTS -\NewEnviron{maxi}[5][]{% -\selectConstraint{#1} - \begin{equation} - #4 - \begin{alignedat}{5} - \bodyobj{#2}{#3}{maximize}{#5} - \BODY - \end{alignedat} - \end{equation} -\setStandardMini -} +% INDIVIDUAL AND SPECIFIC ENVIRONMENTS (mini, maxi, argmini*...) +% Specific environments defined with xparse package due to arguments options -\NewEnviron{argmaxi}[5][]{% -\selectConstraint{#1} - \begin{equation} - #4 - \begin{alignedat}{5} - \bodyobj{#2}{#3}{arg~maxi}{#5} - \BODY - \end{alignedat} - \end{equation} -\setStandardMini -} +%MINIMIZATION ENVIRONMENTS +% Single reference probems +\DeclareDocumentEnvironment{mini}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{min} \BaseMini{#2}{#3}{#4}{#5}{#6}{min}} +% Long version problem +{\setFormatLong{minimize} \BaseMini{#2}{#3}{#4}{#5}{#6}{minimize}} +}{\endBaseMini} + +\DeclareDocumentEnvironment{argmini}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~min} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~min}} +% Long version problem +{\setFormatLong{arg~min} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~min}} +}{\endBaseMini} + + +% No reference +\DeclareDocumentEnvironment{mini*}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{min} \BaseMiniStar{#2}{#3}{#4}{#6}{min}} + % Long version problem + {\setFormatLong{minimize} \BaseMiniStar{#2}{#3}{#4}{#6}{minimize}} +}{\textbf{\endBaseMiniStar}} + +\DeclareDocumentEnvironment{argmini*}{D||{l} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} +% Short version problem +{\setFormatShort{arg~min}\BaseMiniStar{#2}{#3}{#4}{#6}{arg~min}} +% Long version problem +{\setFormatLong{arg~min} \BaseMiniStar{#2}{#3}{#4}{#6}{arg~min}} +}{\textbf{\endBaseMiniStar}} + + +% Multiple reference +\DeclareDocumentEnvironment{mini!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{min} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{min}} + % Long version problem + {\setFormatLong{minimize} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{minimize}} +}{\endBaseMiniExclam} + +\DeclareDocumentEnvironment{argmini!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{arg~min}\BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~min}} + % Long version problem + {\setFormatLong{arg~min} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~min}} +}{\endBaseMiniExclam} -\NewEnviron{maxi*}[5][]{% -\selectConstraint{#1} - \begin{alignat*}{5} - \bodyobj{#2}{#3}{maximize}{#5} - \BODY - \end{alignat*} -\setStandardMini -} -\NewEnviron{argmaxi*}[5][]{% -\selectConstraint{#1} - \begin{alignat*}{5} - \bodyobj{#2}{#3}{arg~maxi}{#5} - \BODY - \end{alignat*} -\setStandardMini -} -\NewEnviron{maxi!}[5][]{% -\selectConstraintMult{#1} - \begin{subequations} - #4 - \begin{alignat}{5} - \bodyobj{#2}{#3}{maximize}{#5} - \BODY - \end{alignat} - \end{subequations} -\setStandardMini -} +%MAXIMIZATION ENVIRONMENTS -\NewEnviron{argmaxi!}[5][]{% -\selectConstraintMult{#1} - \begin{subequations} - #4 - \begin{alignat}{5} - \bodyobj{#2}{#3}{arg~maxi}{#5} - \BODY - \end{alignat} - \end{subequations} -\setStandardMini -}
\ No newline at end of file +% Single reference probems +\DeclareDocumentEnvironment{maxi}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{max} \BaseMini{#2}{#3}{#4}{#5}{#6}{max}} + % Long version problem + {\setFormatLong{maximize} \BaseMini{#2}{#3}{#4}{#5}{#6}{maximize}} +}{\endBaseMini} + +\DeclareDocumentEnvironment{argmaxi}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{arg~max} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~max}} + % Long version problem + {\setFormatLong{arg~max} \BaseMini{#2}{#3}{#4}{#5}{#6}{arg~max}} +}{\endBaseMini} + + +% No reference +\DeclareDocumentEnvironment{maxi*}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{max} \BaseMiniStar{#2}{#3}{#4}{#6}{max}} + % Long version problem + {\setFormatLong{maximize} \BaseMiniStar{#2}{#3}{#4}{#6}{maximize}} +}{\textbf{\endBaseMiniStar}} + +\DeclareDocumentEnvironment{argmaxi*}{D||{l} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{arg~max}\BaseMiniStar{#2}{#3}{#4}{#6}{arg~max}} + % Long version problem + {\setFormatLong{arg~max} \BaseMiniStar{#2}{#3}{#4}{#6}{arg~max}} +}{\textbf{\endBaseMiniStar}} + + +% Multiple reference +\DeclareDocumentEnvironment{maxi!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{max} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{max}} + % Long version problem + {\setFormatLong{maximize} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{maximize}} +}{\endBaseMiniExclam} + +\DeclareDocumentEnvironment{argmaxi!}{D||{\defaultProblemFormat} O{0} m m m m} +{\ifthenelse{\equal{#1}{s}} + % Short version problem + {\setFormatShort{arg~max}\BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~max}} + % Long version problem + {\setFormatLong{arg~max} \BaseMiniExclam{#2}{#3}{#4}{#5}{#6}{arg~max}} +}{\endBaseMiniExclam}
\ No newline at end of file |