4

I need to strike out terms in equations. Based on the answers to this question, I've tried the cancel package, but the appearance of the resulting output does not convince me. Consider this example:

\documentclass{article}
\usepackage{cancel}
\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}
\begin{document}
\begin{equation}
  \cancelto{\mathrm{ignored}}{\pd{f}{x}} 
    + \cancelto{\mathrm{ignored}}{\pd{g}{y}} + \pd{h}{z}
\end{equation}
\end{document}

This gives the following output:

enter image description here

If I use the package option makeroom, I get:

enter image description here

This is obviously unsatisfactory. What I would like to be able to do:

  • Arrow shapes consistent with those used by TikZ.
  • Arrow that are parallel (I would imagine this is difficult to do, so I would be happy to specify the angles manually).
  • Ability to specify the anchor of the text at the arrow tip (so that the text could be anchored at the bottom center or bottom right, for example).
  • Ability to specify the font size of the text near the arrow tip (which I don't seem to be able to do with \cancelto).
  • Automatically add space between the terms similar to what makeroom does (nice to have, but not essential if I can change the font) size because I can fine-tune the spacing if necessary).

Thanks for your help.

8

Here is a proposal which comes with some pgfkeys that allow you to adjust the angle, the font and the arrow at will. (EDIT: Fixed an angle, big thanks to user1362373!)

\documentclass{article}
\usepackage{cancel}
\usepackage{tikz}
\usetikzlibrary{tikzmark,calc}
\tikzset{CancelTo/.is family,
CancelTo,
angle/.initial=60,
name/.initial=tmp,
node/.style={},
arrow/.style={-latex}}
\newcommand{\CancelTo}[3][]{\bgroup\tikzset{CancelTo/.cd,#1}
\tikzmarknode{\pgfkeysvalueof{/tikz/CancelTo/name}}{#3}
\begin{tikzpicture}[overlay,remember picture]
\draw[/tikz/CancelTo/arrow] let \p1=($(\pgfkeysvalueof{/tikz/CancelTo/name}.north)-(\pgfkeysvalueof{/tikz/CancelTo/name}.south)$),\n1={0.5*\y1*cot(\pgfkeysvalueof{/tikz/CancelTo/angle})},
\n2={\y1/sin(\pgfkeysvalueof{/tikz/CancelTo/angle})} 
in ([xshift=-\n1]\pgfkeysvalueof{/tikz/CancelTo/name}.south) -- ++ (\pgfkeysvalueof{/tikz/CancelTo/angle}:\n2+5pt) 
node[above right,/tikz/CancelTo/node] (tmplabel) {#2};
\path let \p1=($(tmplabel.north east)-(\pgfkeysvalueof{/tikz/CancelTo/name}.east)$) in
\pgfextra{\xdef\mydist{\x1}};
\end{tikzpicture}\egroup\vphantom{\cancelto{#2}{#3}}\hspace{\mydist}}
\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}
\begin{document}
An equation.
\begin{equation}
    \CancelTo{ignored}{\pd{f}{x}} 
  \CancelTo[arrow/.style={-stealth}]{ignored}{\pd{f}{x}} 
    + \CancelTo[node/.style={font=\tiny,text=blue}]{ignored}{\pd{g}{y}} + \pd{h}{z}
\end{equation}
Another equation with another angle.
\begin{equation}
    \CancelTo[angle=70]{ignored}{\pd{f}{x}} 
  \CancelTo[angle=70,name=mynode]{ignored}{\pd{f}{x}} 
    + \CancelTo[angle=70]{ignored}{\pd{g}{y}} + \pd{h}{z}
\end{equation}
Bonus: you can name nodes and use \tikzmarknode{this}{this} otherwise.
\begin{tikzpicture}[overlay,remember picture]
\draw[-latex,red] (this) to[bend right] (mynode);
\end{tikzpicture}
\end{document}

enter image description here

  • Thanks, this does mostly what I need, I can take care of some of the fine-tuning. One thing that would be nice would be for the vertical locations of the top and bottom of the arrows to be consistent. Now the bottom of the arrow for the dg/dy term is lower than for the df/dx term. – user1362373 Jan 14 '19 at 6:41
  • @user1362373 Yes, this is because y goes below the baseline whereas x does not. Would it be acceptable to just insert a \vphantom{y} in the derivatives w.r.t. x? One way to achieve this is to use \newcommand{\pd}[2]{\frac{\partial #1\vphantom{y}}{\partial #2\vphantom{y}}}. – user121799 Jan 14 '19 at 12:19
  • In \n2={\y1/sin(60), shouldn't you also use \pgfkeysvalueof{/tikz/CancelTo/angle}? – user1362373 Jan 17 '19 at 6:01
  • @user1362373 Absolutely! Thanks a lot! – user121799 Jan 17 '19 at 6:08
  • Another question: In \tikzmarknode{\pgfkeysvalueof{/tikz/CancelTo/name}}{#3}, I assume you're assigning the value of the third argument to the angle. But in that case, why doesn't it say /tikz/CancelTo/angle? (I'm asking because I'm trying to add further optional arguments to fine-tune the spacing, but failing miserably, so I'm trying to understand the details of what you've done.) – user1362373 Jan 17 '19 at 6:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.