El análisis condicional de la entrada de un nuevo comando da como resultado un "error de valor de clave del paquete: escala indefinida"

El análisis condicional de la entrada de un nuevo comando da como resultado un "error de valor de clave del paquete: escala indefinida"

Estoy intentando crear una nueva macro que tome un tamaño de escala o un parámetro de escala diferente (por ejemplo, ancho =\ancho de texto) para dimensionar las imágenes. Esto es lo que tengo:

\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}}

Más adelante en mi archivo, tengo la siguiente línea:

\pic{1}{lpm_block.png}{Block diagram for the LPM multiplier}

lo que da el error "error de valor de clave del paquete: escala = 1 indefinido". Sin la declaración 'si', funciona bien. ¿Qué necesito cambiar? ¿Hay una mejor manera de hacer esto? ¡Gracias!

EDITAR:

Aquí hay más código que debería compilarse sin problemas.

\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}

Mi objetivo al intentar esto con látex era aumentar la familiaridad con la creación de nuevos comandos utilizando declaraciones condicionales. No me di cuenta de que los matices lo harían un poco más difícil. ¡Gracias por el aporte hasta el momento!

Respuesta1

Lo tomo como un ejercicio, como dices. Comentarios más tarde.

Lo que quieres es decidir si =aparece en el primer argumento.

\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}

La \checkequalsmacro llama al auxiliar \check@equalsque toma argumentos delimitados; en caso =de que no aparezca, lo definimos \picargcomo scale=#1, asumiendo que se especifica el factor de escala. De lo contrario, el argumento original se almacena en \picarg.

ingrese la descripción de la imagen aquí

Ahora el problema es: ¿realmente quieres una macro así? No, por varias razones.

  1. No hay gran ventaja en \pic{0.55}{x}{y}over \pic{scale=0.55}{x}{y}.

  2. scaleEs la clave incorrecta, porque probablemente no conozca el tamaño de la imagen ni el tamaño final del documento. Un pequeño cambio en el ancho del texto te obligará a cambiar la escala de varias imágenes.

  3. No hay ninguna ventaja en figureesconderse \pic; Si tiene dos imágenes que caben en una línea, es posible que desee colocarlas una al lado de la otra.

  4. La [H]opción es una elección perfecta para estropear su documento. Si una figura tiene que quedarseallí y en ningún otro lugar, entonces no necesita título, porque su descripción estará al lado de todos modos. El uso de flotadores ayuda a organizar mejor el material para tener una buena paginación como beneficio adicional.

Observación final. Tu codigo

%\usepackage{times} % Uncomment to use the Times New Roman font

está diciendo una mentira. El timespaquete sólo cambiaría eltextofuentes, no las fuentes matemáticas. Si realmente quieres usar Times, hazlo

\usepackage{newtxtext}
\usepackage{newtxmath}% with possible option, see the manual for newtx

Respuesta2

El paquete keyvalutiliza la coma ,como separador de pares clave-valor y el signo igual =para separar la clave del valor. No expande macros. Por tanto, estos caracteres de sintaxis no deben ocultarse en las macros.

El ejemplo de la pregunta se soluciona expandiendo \argvia \expandafterbefore \includegraphicsprocesa su argumento opcional:

\if\instring{#1}{=}\def \arg{#1}\else\def\arg{scale=#1}\fi
\expandafter\includegraphics\expandafter[\arg]{#2}%

Respuesta3

Si utiliza un argumento opcional cuyo valor predeterminado es scale=1entonces no necesita verificar si está vacío o no:

\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}

Esto produce las siguientes dos páginas:

ingrese la descripción de la imagen aquí

Respuesta4

Tenga en cuenta que no creo que esto sea nada prudente y recomiendo reconsiderar sus deseos. Sin embargo, si tuviera la intención de realizar una destrucción sin sentido, usaría LaTeX 3 para hacerlo. Pero probablemente ese no sea el mejor lugar para comenzar si recién estás aprendiendo LaTeX 2e. Por lo tanto, si debe hacerlo, una forma de intentar hacerlo es la siguiente.

\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}

variaciones

Sin embargo, en mi opinión, este es un diseño tonto que escupe a sus usuarios con desprecio. Por lo tanto, no lo haría, al menos no si fuera a estar entre los usuarios. Tus kilómetros pueden, como siempre, variar.

información relacionada