How to center mathematical expression inside multi-line closed brackets? - tex

How could I center the two lines inside the brackets. The code so far is:
\documentclass[a4paper,12pt,oneside]{report}
\usepackage{amsmath}
\begin{equation}
x_{t}^{\ast }(n)=
\left\{\!\begin{aligned}
& \hfil {x_{t}}\\
\hfil & {0,\text{ otherwise}}
\end{aligned}\right\}
\end{equation}

Here are a couple of options:
\documentclass{article}
\usepackage{amsmath,eqparbox,xparse}
% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
\IfValueTF{#1}
{\def\eqmathbox###1##2{\eqmakebox[#1][#2]{$##1##2$}}}
{\def\eqmathbox###1##2{\eqmakebox{$##1##2$}}}
\mathpalette\eqmathbox#{#3}
}
\makeatother
\begin{document}
\[
\renewcommand{\arraystretch}{1.2}
x_t^* (n) =
\left\{\begin{array}{#{} c #{}}
x_t \\
0, \text{ otherwise}
\end{array}\right\}
\]
\[
x_t^* (n) =
\left\{\begin{aligned}
\eqmathbox[cond]{x_t} \\
\eqmathbox[cond]{0, \text{ otherwise}}
\end{aligned}\right\}
\]
\end{document}
The first uses an array with a single, centred column. The second uses aligned and sets each entry inside an \eqmathbox[<tag>] with the same <tag>. eqparbox then finds the maximum width of those elements with the same <tag>, and sets each element inside a box of that width (default <align>ment is centred \eqmathbox[<tag>][<align>]{<stuff>}).

Related

Conditional selection of tikz style classes

I try to achieve that different style classes are chosen in a self-defined tikz function depending on the input number.
However, the \ifnum command doesn't seem to work as I expect it.
The error message that I get is:
> thesis/image/outline_MWE.tex:46: Missing = inserted for \ifnum.
<to be read again>
}
l.46 \makeoutlinefig{1}
thesis/image/outline_MWE.tex:46: Missing number, treated as zero.
<to be read again>
}
l.46 \makeoutlinefig{1}
MWE:
\documentclass[varwidth=true]{standalone}
% \input{../preamble.tex}
% \input{../colors.tex}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,arrows.meta, calc, decorations.markings, backgrounds,fit,positioning,plotmarks, intersections, patterns, intersections,decorations.text,external,decorations.pathreplacing}
\begin{document}
\DeclareRobustCommand{\makeoutlinefig}[1]{
\centering
\def\threebw{16.7cm}
\begin{tikzpicture}
[auto, box/.style ={rectangle,
% font= \tiny,
draw=black,
thick,
% fill=blue!30,
text width=3.0cm,
minimum width=1.5cm,
align=center,
rounded corners,
minimum height=2.0cm,
dashed, thick},
activebox/.style = {box, draw=red,
thick,solid},
node distance = 0.5cm,
]
\node[style=\ifnum#1=1 activebox\else box\fi,
text width=\threebw] (b1) at (0,0) {\textbf{1. Chapter}};
\node[style=\ifnum#1=2 activebox\else box\fi,
text width=\threebw, below = of b1] (b2) {\textbf{2. Chapter}} ;
\draw [-Stealth,ultra thick] (b1) -- (b2);
\end{tikzpicture}
}
\makeoutlinefig{1}
\end{document}
You can avoid the problem like this:
\documentclass[varwidth=true]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,arrows.meta, calc, decorations.markings, backgrounds,fit,positioning,plotmarks, intersections, patterns, intersections,decorations.text,external,decorations.pathreplacing}
\begin{document}
\DeclareRobustCommand{\makeoutlinefig}[1]{
\centering
\def\threebw{16.7cm}
\begin{tikzpicture}[
auto,
box/.style = {
rectangle,
draw=black,
thick,
text width=3.0cm,
minimum width=1.5cm,
align=center,
rounded corners,
minimum height=2.0cm,
dashed,
thick
},
activebox/.style = {
box,
draw=red,
thick,
solid
},
node distance = 0.5cm,
]
\ifnum#1=1
\def\mystyle{activebox}
\else
\def\mystyle{box}
\fi
\node[\mystyle, text width=\threebw] (b1) at (0,0) {\textbf{1. Chapter}};
\ifnum#1=2
\def\mystyle{activebox}
\else
\def\mystyle{box}
\fi
\node[\mystyle, text width=\threebw, below = of b1] (b2) {\textbf{2. Chapter}} ;
\draw [-Stealth,ultra thick] (b1) -- (b2);
\end{tikzpicture}
}
\makeoutlinefig{2}
\end{document}

Counting with Lua in tabularx (but not tabular) is three times as much as it should be

Counting the number of rows with a Lua variable in a tabularx environment always gives me a multiple of what it should be:
\documentclass{report}
\usepackage{environ}
\usepackage{tabularx}
\NewEnviron{funds}{%
\directlua{rows = 0}
\begin{tabularx}{2cm}{ |X|c| }
\BODY
\end{tabularx}
}
\newcommand\fundsadd{%
\directlua{rows = rows + 1}
a & b \tabularnewline
}
\begin{document}
\begin{funds}
\fundsadd
\fundsadd
\fundsadd
\end{funds}
Number of rows: \directlua{tex.sprint{rows}}
\end{document}
The result is
but the number of rows should be 3. It works fine in a tabular environment. Is there anything about tabularx that I am missing?
tabularx needs to process the content several time. You can work around the problem by resetting your counter at the start of the tabularx instead of before.
% !TeX TS-program = lualatex
\documentclass{report}
\usepackage{environ}
\usepackage{tabularx}
\NewEnviron{funds}{%
\begin{tabularx}{2cm}{ |X|c| }
\directlua{rows = 0}
\BODY
\end{tabularx}
}
\newcommand\fundsadd{%
\directlua{rows = rows + 1}
a & b \tabularnewline
}
\begin{document}
\begin{funds}
\fundsadd
\fundsadd
\fundsadd
\end{funds}
Number of rows: \directlua{tex.sprint{rows}}
\end{document}

for-loop LaTeX \i subtract

Currently, I'm working in LaTeX and want to make labels with a for-loop. For a certain reason I want to use the for-loop which goes from 4 to 7.
\documentclass{report}
\usepackage{circuitikz}
\begin{document}
\begin{circuitikz}
\foreach \i in {4,...,7}
{
\draw(0, -\i) node[anchor=north west] {Elektrode\textsubscript{\i-4} +};
}
\end{circuitikz}
\end{document}
What I want is that it will output: Elektrode0; Elektrode1, Elektrode2, Elektrode3
But what I get is: Elektrode4-4; Elektrode5-4, Elektrode6-4, Elektrode7-4.
What am I doing wrong?
There are many possible approaches, but one easy workaround is to use a second variable:
\documentclass{report}
\usepackage{circuitikz}
\begin{document}
\begin{circuitikz}
\foreach[count = \x from 0 ] \i in {4,...,7}
{
\draw(0, -\i) node[anchor=north west] {Elektrode\textsubscript{\x} +};
}
\end{circuitikz}
\end{document}

How to align math equations even when some variables are missing?

I want the variables and signs aligned in a set of equations.
Desired output:
What I am trying in Mathjax:
\[
\begin{align}
2&x_1 - x_2 &+ 1.5&x_3 &= 8 \\
&x_1 &- 4&x_3 &= -1
\end{align}
\]
What I got:
So, what do I have to do to have the same alignment as in the "desired output" image?
There are a number of ways to achieve this. Below I use an array (with appropriate stretch and spacing), alignat and align coupled with eqparbox for measuring similarly-tagged boxes (this latter approach requires two compilations with every change in the largest element associated with every <tag>):
\documentclass{article}
\usepackage{amsmath,eqparbox}
%\usepackage{xparse}% If you have LaTeX2e < 2020-10-01
% https://tex.stackexchange.com/a/34412/5764
\makeatletter
% \eqmathbox[<tag>][<align>]{<math>}
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
\IfValueTF{#1}
{\def\eqmathbox###1##2{\eqmakebox[#1][#2]{$##1##2$}}}
{\def\eqmathbox###1##2{\eqmakebox{$##1##2$}}}
\mathpalette\eqmathbox#{#3}
}
\makeatother
\begin{document}
\[
\renewcommand{\arraystretch}{1.2}
\setlength{\arraycolsep}{0pt}
\begin{array}{ r c r c r c r }
2 x_1 & {}-{} & x_2 & {}+{} & 1.5 x_3 & {}={} & 8 \\
x_1 & & & {}-{} & 4 x_3 & {}={} & -7
\end{array}
\]
\begin{alignat*}{4}
2 x_1 & {}-{} & x_2 & {}+{} & 1.5 x_3 = {} && 8 \\
x_1 & & & {}-{} & 4 x_3 = {} && -7
\end{alignat*}
\begin{align*}
\eqmathbox[x1][r]{2 x_1} - \eqmathbox[x2][r]{x_2} + \eqmathbox[x3][r]{1.5 x_3} &= \eqmathbox[c][r]{8} \\
\eqmathbox[x1][r]{ x_1} \phantom{{}-{}} \eqmathbox[x2][r]{} - \eqmathbox[x3][r]{4 x_3} &= \eqmathbox[c][r]{-7}
\end{align*}
\end{document}
All yield similar output:

put listing in tikzpicture

I use the following code to create a box for equations. It uses Tikz to create the box.
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{amsmath}
\usepackage{amsmath,amssymb}% pour les maths
\usepackage{enumitem}
\usepackage{varwidth}
\usepackage{listings}
\usetikzlibrary{calc}
\newcommand{\mybox}[4][\textwidth-\pgfkeysvalueof{/pgf/inner xsep}-2mm]{%
\begin{figure}[!h]
\centering
\begin{tikzpicture}
\node[line width=.5mm, rounded corners, draw=#2, inner ysep=10pt, text width=#1, outer sep=0] (one) {\vspace*{15pt}\\\begin{varwidth}{\textwidth}#4\end{varwidth}};
\node[text=white,anchor=north east,align=center, minimum height=20pt] (two) at (one.north east) {#3 \hspace*{.5mm}};
\path[fill=#2]
(one.north west|-two.west) --
($(two.west)+(-1.5cm,0)$)
to[out=0,in=180] (two.south west) --
(two.south east) [rounded corners] --
(one.north east) --
(one.north west) [sharp corners] -- cycle;
\node[text=white,anchor=north east,align=center, minimum height=20pt, text height=2ex] (three) at (one.north east) {#3 \hspace*{.5mm}};
\end{tikzpicture}
\end{figure}
}
\begin{document}
\mybox{green!70!black}{The Caption}{
\begin{enumerate}
\item Show that\\
$\displaystyle D_2f(x,y) = \frac{\partial {}}{\partial{y}} \biggl( \int_0^xg_1 (t,0) \ dt + \int_0^y g_2(x,s) \ ds \biggr)$
\item prove that\\
$\displaystyle \biggl(\forall x\in\mathbb{R} \biggr)\biggl(\forall y \in \mathbb{R} \biggr) x\neq y\, \text{ and } \, x+y \neq 2 \implies x^{2}-2x \neq y^2-2y$
\end{enumerate}
}
\end{document}
but Now I want to put listing inside the box
When I put the listing inside the mbox I got an error
\begin{lstlisting}[language=R]
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
[omitted statements]
if (graph)
par(pch="*", ...)
[more omissions]
}
\end{lstlisting}
the error is
! Argument of \lst#next has an extra }.
You cannot use listings inside arguments directly. You either need to escape and properly prepare the verbatim code or store it somewhere else. See section 6.1 of the listing manual for more information.
Store the listing in a box
\begin{document}
\begin{lrbox}{\mylisting}
\begin{lstlisting}[language=R]
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
[omitted statements]
if (graph)
par(pch="*", ...)
[more omissions]
}
\end{lstlisting}
\end{lrbox}
\mybox{green!70!black}{The Caption}{
\usebox\mylisting
}
\end{document}
Store the listing in an external file
\lstinputlisting{external_file.R}
Add line feeds ^^J
\begin{lstlisting}[language=R]^^J
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {^^J
[omitted statements]^^J
if (graph)^^J
par(pch="*", ...)^^J
[more omissions]^^J
}^^J
\end{lstlisting}
Note: You will probably need to resize your box for that long first line of code.

Resources