
Estou tentando criar uma nova macro que use um tamanho de escala ou um parâmetro de escala diferente (por exemplo, largura = largura do texto) para dimensionar imagens. Aqui está o que eu tenho:
\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}}
Posteriormente em meu arquivo, tenho a seguinte linha:
\pic{1}{lpm_block.png}{Block diagram for the LPM multiplier}
que dá o erro "erro de keyval do pacote: escala = 1 indefinido". Sem a instrução 'if', funciona bem. O que preciso mudar? Existe uma maneira melhor de fazer isso? Obrigado!
EDITAR:
Aqui está mais código que deve ser compilado sem 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}
Meu objetivo ao tentar isso com o látex era aumentar a familiaridade com a criação de novos comandos usando instruções condicionais. Não percebi que as nuances tornariam tudo um pouco mais difícil. Obrigado pela contribuição até agora!
Responder1
Tomo isso como um exercício, como você diz. Comentários mais tarde.
O que você quer é decidir se =
aparece no primeiro 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}
A \checkequals
macro chama o auxiliar \check@equals
que recebe argumentos delimitados; caso =
não apareça, definimos \picarg
ser scale=#1
, assumindo que o fator de escala seja especificado. Caso contrário, o argumento original será armazenado em \picarg
.
Agora o problema é: você realmente quer essa macro? Não, por vários motivos.
Não há grande vantagem em
\pic{0.55}{x}{y}
over\pic{scale=0.55}{x}{y}
.scale
é a chave errada a ser usada, porque você provavelmente não sabe o tamanho da imagem, nem o tamanho final do documento. Uma pequena alteração na largura do texto forçará você a redimensionar várias imagens.Não há vantagem em se
figure
esconder\pic
; se você tiver duas imagens que cabem em uma linha, você pode colocá-las lado a lado.A
[H]
opção é perfeita para estragar seu documento. Se uma figura tiver que ficarlá e em nenhum outro lugar, então não precisa de legenda, porque sua descrição estará ao lado de qualquer maneira. O uso de carros alegóricos ajuda a organizar melhor o material para ter como bônus uma boa paginação.
Observação final. Seu código
%\usepackage{times} % Uncomment to use the Times New Roman font
está dizendo uma mentira. O times
pacote apenas mudaria otextofontes, não as fontes matemáticas. Se você realmente deseja usar o Times, faça
\usepackage{newtxtext}
\usepackage{newtxmath}% with possible option, see the manual for newtx
Responder2
O pacote keyval
usa a vírgula ,
como separador de pares de valores-chave e o sinal de igual =
para separar a chave do valor. Não expande macros. Portanto, esses caracteres de sintaxe não devem ficar ocultos nas macros.
O exemplo da pergunta é corrigido expandindo \arg
via \expandafter
before \includegraphics
process seu argumento opcional:
\if\instring{#1}{=}\def \arg{#1}\else\def\arg{scale=#1}\fi
\expandafter\includegraphics\expandafter[\arg]{#2}%
Responder3
Se você usar um argumento opcional cujo padrão é scale=1
então você não precisa verificar se ele está vazio ou não:
\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}
Isso produz as duas páginas a seguir:
Responder4
Observe que não acho que isso seja nada sábio e recomendo repensar seus desejos. No entanto, se eu tivesse a intenção de destruição desenfreada, usaria o LaTeX 3 para causar isso. Mas esse provavelmente não é o melhor lugar para começar se você está apenas aprendendo LaTeX 2e. Portanto, se você precisar fazer isso, uma maneira de tentar fazer isso é a seguinte.
\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}
No entanto, este é, na minha opinião, um design desajeitado que cospe nos seus utilizadores com desprezo. Portanto, eu não faria isso - pelo menos não se estivesse entre os usuários. Seus quilômetros podem, como sempre, variar.