
Ich versuche, ein neues Makro zu erstellen, das entweder eine Skalierungsgröße oder einen anderen Skalierungsparameter (z. B. width=\textwidth) zur Größenanpassung von Bildern verwendet. Folgendes habe ich:
\newcommand{\pic}[3]{\begin{figure}[H]
\centering
\if\instring{#1}{=}\def \arg{#1}\else\def\arg{scale=#1}\fi
\includegraphics[\arg]{#2}
\caption{#3}
\end{figure}}
Später in meiner Datei habe ich die folgende Zeile:
\pic{1}{lpm_block.png}{Block diagram for the LPM multiplier}
was den Fehler "Paket-Keyval-Fehler: Skala=1 nicht definiert" ausgibt. Ohne die 'if'-Anweisung funktioniert es einwandfrei. Was muss ich ändern? Gibt es eine bessere Möglichkeit, dies zu tun? Danke!
BEARBEITEN:
Hier ist weiterer Code, der ohne Probleme kompiliert werden sollte.
\documentclass{article}
\usepackage{siunitx}
\usepackage{graphicx}
\usepackage{apacite}
\usepackage{amsmath} % Required for some math elements
\usepackage{multicol} % multiple columns
\usepackage{float} % place graphics
\usepackage{subfig} % graphics on same line
\usepackage{geometry} % fill empty margins
\usepackage[square,sort,comma,numbers]{natbib}
\usepackage[hyphens]{url}
\usepackage{minted}
\renewcommand\theFancyVerbLine{\normalsize\arabic{FancyVerbLine}}
\geometry{letterpaper, top=0.75in, left=0.75in, bottom=0.75in, right=0.75in}
\setlength\parindent{0pt} % Removes all indentation from paragraphs
%\usepackage{times} % Uncomment to use the Times New Roman font
\newcommand{\pic}[3]{\begin{figure}[H]
%\if\instring{#1}{=}\def \arg{#1}\else\def\arg{scale=#1}\fi
\centering
\includegraphics[scale=#1]{#2}
\caption{#3}
\end{figure}}
\begin{document}
\section{Design Files}
\subsection{Serial Multiplier}
\pic{0.55}{serial_block.png}{Block diagram for the serial multiplier. high9 and low8 are simply registers, so they do not have separate design files}
\end{document}
Mein Ziel bei diesem Versuch mit Latex war, die Vertrautheit mit dem Erstellen neuer Befehle mithilfe bedingter Anweisungen zu erhöhen. Mir war nicht klar, dass die Nuancen es ein bisschen schwieriger machen würden. Vielen Dank für die bisherigen Beiträge!
Antwort1
Ich betrachte das als eine Übung, wie Sie sagen. Kommentare später.
Sie möchten entscheiden, ob =
im ersten Argument erscheint.
\documentclass{article}
\usepackage{graphicx}
\newcommand{\pic}[3]{%
\begin{figure}
\centering
\checkequals{#1}%
\expandafter\includegraphics\expandafter[\picarg]{#2}
\caption{#3}
\end{figure}%
}
\makeatletter
\newcommand\checkequals[1]{\check@equals{#1}#1=\@nil}
\def\check@equals#1#2=#3\@nil{%
\if\relax\detokenize{#3}\relax
% no =
\def\picarg{scale=#2}%
\else
\def\picarg{#1}%
\fi
}
\makeatother
\begin{document}
\pic{0.55}{example-image}{First example}
\pic{scale=0.55}{example-image}{Second example}
\pic{width=2cm,height=1cm}{example-image}{Third example}
\end{document}
Das \checkequals
Makro ruft das Hilfselement auf \check@equals
, das durch Trennzeichen getrennte Argumente annimmt. Falls =
nicht angezeigt wird, definieren wir es \picarg
als scale=#1
, vorausgesetzt, der Skalierungsfaktor ist angegeben. Andernfalls wird das ursprüngliche Argument in gespeichert \picarg
.
Nun stellt sich die Frage: Wollen Sie wirklich ein solches Makro? Nein, und zwar aus mehreren Gründen.
Es gibt keinen großen Vorteil
\pic{0.55}{x}{y}
gegenüber\pic{scale=0.55}{x}{y}
.scale
ist der falsche Schlüssel, da Sie wahrscheinlich weder die Größe des Bildes noch die endgültige Größe des Dokuments kennen. Eine kleine Änderung der Textbreite zwingt Sie dazu, mehrere Bilder neu zu skalieren.Es hat keinen Vorteil, sich
figure
in zu verstecken\pic
. Wenn Sie zwei Bilder haben, die in eine Zeile passen, möchten Sie sie vielleicht nebeneinander platzieren.Die
[H]
Option ist eine perfekte Wahl, um Ihr Dokument zu verderben. Wenn eine Figur bleiben mussdort und nirgendwo sonst, dann braucht es keine Überschrift, da die Beschreibung sowieso daneben steht. Die Verwendung von Floats hilft bei der besseren Organisation des Materials, um als Bonus eine gute Seitennummerierung zu erhalten.
Schlussbemerkung. Ihr Code
%\usepackage{times} % Uncomment to use the Times New Roman font
ist eine Lüge. Das times
Paket würde nur dieTextSchriftarten, nicht die mathematischen Schriftarten. Wenn Sie wirklich Times verwenden möchten,
\usepackage{newtxtext}
\usepackage{newtxmath}% with possible option, see the manual for newtx
Antwort2
Das Paket keyval
verwendet das Komma ,
als Trennzeichen für Schlüssel-Wert-Paare und das Gleichheitszeichen, =
um den Schlüssel vom Wert zu trennen. Makros werden nicht erweitert. Daher dürfen diese Syntaxzeichen nicht in Makros versteckt werden.
Das Beispiel in der Frage wird behoben, indem das optionale Argument \arg
via \expandafter
vor der Verarbeitung erweitert wird:\includegraphics
\if\instring{#1}{=}\def \arg{#1}\else\def\arg{scale=#1}\fi
\expandafter\includegraphics\expandafter[\arg]{#2}%
Antwort3
Wenn Sie ein optionales Argument verwenden, dessen Standardwert scale=1
dann ist, müssen Sie nicht prüfen, ob es leer ist oder nicht:
\documentclass{article}
\usepackage{mwe}
\newcommand{\pic}[3][scale=1]{%
\begin{figure}
\centering
\includegraphics[#1]{#2}
\caption{#3}
\end{figure}%
}
\begin{document}
\pic{example-image-1x1}{Example image}
\pic[width=\textwidth]{example-image-1x1}{Wider image}
\end{document}
Dadurch werden die folgenden beiden Seiten erzeugt:
Antwort4
Beachten Sie, dass ich das überhaupt nicht für klug halte und empfehle, Ihre Wünsche zu überdenken. Wenn ich jedoch auf mutwillige Zerstörung aus wäre, würde ich LaTeX 3 verwenden, um sie anzurichten. Aber das ist wahrscheinlich nicht der beste Ausgangspunkt, wenn Sie gerade LaTeX 2e lernen. Wenn Sie es also tun müssen, können Sie es auf folgende Weise versuchen.
\documentclass{article}
\usepackage{graphicx,caption}
\makeatletter
\def\pict@aux#1=#2\@nil{#2}
\newcommand{\pict}[3]{%
\begin{figure}
\centering
\edef\tempa{\expandafter\pict@aux#1=\@nil}%
\edef\tempb{}%
\ifx\tempa\tempb
\includegraphics[scale=#1]{#2}%
\else
\includegraphics[#1]{#2}%
\fi
\captionof{figure}{#3}%
\end{figure}%
}
\makeatother
\begin{document}
\section{Design Files}
\subsection{Serial Multiplier}
\pict{0.55}{\jobname-cx}{Block diagram for the serial multiplier. high9 and low8 are simply registers, so they do not have separate design files}
\pict{width=0.55cm}{\jobname-cx}{Block diagram for the serial multiplier. high9 and low8 are simply registers, so they do not have separate design files}
\end{document}
Meiner Meinung nach ist dies jedoch ein plumpes Design, das seine Benutzer verächtlich beschimpft. Daher würde ich es nicht tun – zumindest nicht, wenn ich zu den Benutzern gehören würde. Ihre Kilometer können wie immer abweichen.