TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top
  • I'd like to define an custom function f(x).

  • For example \f{3} should print ln(3) + 3 if the function is set to ln(x) + 3.

  • One should be able change the function: \setfunc{sin(\x}}.

  • This should only affect future uses of \f{...}

  • And it should be possible to define the first three derivatives..

The commands do not have do be this way. There may be a more elegant/practical way. Warning: It should work in this environment: http://tex.stackexchange.com/a/299720/101053

Edit: Changed derivate to derivative; It's unclear what "define the derivative" should mean. I tried to say that I can simply add other functions (whether derivative or nor).

share|improve this question
    
Your final point can also be done manually, right? Say, \func{n} for the function, \func[1]{n} for the first or derivative, \func[2]{n} for the second order derivative, ... – Werner Mar 23 at 23:13
    
Please post a complete example. What's a derivate? Do you mean derivative? With Werner's suggestion, you could define the function using 4 arguments, say, \setfunc{}{}{}{}. I don't see how TeX can be expected to figure out the derivatives automatically. (Unless you restrict the set of possible functions so that they can be handled by an automatic algorithm, say.) – cfr Mar 23 at 23:54
    
Do you want to evaluate the functions, or just print their algebraic representation? – Werner Mar 24 at 0:44
    
@Werner is right. This could be done.cfr Yes I mean derivatives. Or in other words just other functions. They should be entered manually. But 4 arguments would be difficult to use because sometimes I may only use one or two functions. – Joel Duscha Mar 24 at 1:52
up vote 8 down vote accepted

If this works generally, I just got lucky. EDITED to do derivatives.

EDITED To be more true to math mode. EDITED to allow different function names with use of optional argument (default \f). EDITED to use more natural syntax \f(3) rather than \f{3}. EDITED to provide \listfunc macro. EDITED to work with amsmath.

Finally, EDITED to allow a more general syntax that can include primes, subscripts etc. in the function name itself.

\documentclass{article}
\usepackage{amsmath}% BREAKS ORIGINAL CODE; REQUIRES \protected@edef IN \setfunc
\makeatletter
\newcommand\setfunc[2][f]{\expandafter\protected@edef\csname#1\endcsname(##1){#2}}
\makeatother
\def\func#1(#2){\csname#1\endcsname(#2)}
\def\listfunc#1(#2){#1(#2)=\func#1(#2)}
\newcommand\x{(##1)}
\begin{document}
\setfunc{\sin\x} I can list the function: $\listfunc f(3)$\par
or I can just print out $\f(x+y)$.\par
or with a general input syntax: $\func f(x+y)$\par
\setfunc[g'_y]{\ln\x + 3\x^2} Now we can have $\listfunc g'_y(7)$\par
\medskip
Derivatives:\par
\setfunc[y]{4\x^5 - 2\x^2 +3}
\setfunc[y']{20\x^4 - 4\x}
\setfunc[y'']{80\x^3 - 4}
\setfunc[y''']{240\x^2}
\setfunc[y^{iv}]{480\x}
$\listfunc y(2)$\par
$\listfunc y'(2)$\par
$\listfunc y''(2)$\par
$\listfunc y'''(2)$\par
$\listfunc y^{iv}(2)$\par
\end{document}

enter image description here

NOTE: Joel noted that the method can get confused if the evaluation value itself contains a term in parentheses, for example, $\f ( \ln(a + 1.5) )$. The workaround for this is to embrace the inner argument, such as $\f({\ln(a + 1.5)})$ or $\listfunc y''({\ln(a + 1.5)})$.

share|improve this answer
    
Really impressive. Is there a way to add more functions like setfunc[2]{}? – Joel Duscha Mar 24 at 2:10
    
@JoelDuscha I've been tweaking the answer so I can name the target function \f or \g for example. But I'm not sure what functionality you mean by \setfunc[2]{}? – Steven B. Segletes Mar 24 at 2:14
1  
@JoelDuscha Fixed! – Steven B. Segletes Mar 24 at 10:19
1  
@JoelDuscha One last improvement... Function names can now have primes, subscripts, etc., and can be invoked, as in my MWE as \setfunc[g'_y]{\ln(\x) + 3\x^2} and displayed with \func. – Steven B. Segletes Mar 24 at 10:35
1  
@JoelDuscha You can use the existing code, if you embrace the argument inside the parens: $\listfunc y''({\ln(a + 1.5)})$ – Steven B. Segletes Mar 24 at 17:23

This raises more complications than it solves, in my opinion, but here's an idea:

\documentclass{article}

\makeatletter
\newcommand{\setfunc}[4]{%
  \@namedef{f@}##1{#1}%
  \@namedef{f@'}##1{#2}%
  \@namedef{f@''}##1{#3}%
  \@namedef{f@'''}##1{#4}%
}
\def\f#1#{\@nameuse{f@#1}}
\makeatother

\begin{document}

\setfunc{\sin(#1)}{\cos(#1)}{-\sin(#1)}{-\cos(#1)}
$\f{x}$ $\f'{1}$ $\f''{\pi}$ $\f'''{\pi/2}$

\setfunc{\log(#1)+1}{}{}{}
$\f{3}$

\end{document}

enter image description here

If you just want the function and not the derivatives, it's much simpler:

\newcommand{\setfunc}[1]{\renewcommand\f[1]{#1}}

Full example:

\documentclass{article}

\newcommand{\f}[1]{} % initialize
\newcommand{\setfunc}[1]{\renewcommand{\f}[1]{#1}}

\begin{document}

\setfunc{\sin(#1)}
$\f{x}+\f{3}$

\setfunc{\log(#1)+1}
$\f{3}$

\end{document}

enter image description here

A different implementation, where you can set any name you like (but beware of not redefining already existing commands)

\documentclass{article}

\newcommand{\setfunc}[2][\f]{\def#1##1{#2}}

\begin{document}

\setfunc{\sin(#1)}
$\f{x}+\f{3}$

\setfunc[\g]{\log(#1)+1}
$\g{3}$

\end{document}
share|improve this answer
    
This got somehow more upvotes than the other answers. I don't quite understand why. For my purpose this would make thinks messy I guess. But Maybe I overlook something here. – Joel Duscha Mar 24 at 10:20
1  
@JoelDuscha Wasn't you who asked for supporting also setting the first three derivatives? – egreg Mar 24 at 10:28
    
Which is just another function. I see I confused everyone. Sorry for that. – Joel Duscha Mar 24 at 10:51

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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