1 | initial version |

Hello, @sononicola! Let me answer your questions one by one:

**1. How to avoid \n:** When you write

```
\sagestr{SIsage(2442,"\kilo\metre\squared")}
```

Sage considers the `\k`

, `\m`

, `\s`

, and every character with a backslash as a escaped character for formatting. In particular, `\n`

means new line, and that is why `\newton`

shows only `ewton`

following a blank line. I imagine you are getting a warning message like

```
<input>:1: DeprecationWarning: invalid escape sequence \k
<input>:1: DeprecationWarning: invalid escape sequence \k
<input>:1: DeprecationWarning: invalid escape sequence \k
<ipython-input-3-de7d74516408>:1: DeprecationWarning: invalid escape sequence \k
SIsage(Integer(2442),"\kilo\metre\squared")
'\\SI{2442}{\\kilo\\metre\\squared}'
```

If you are using Sage-9.0 or superior.

In order to avoid this behavior, you can escape the escape character. For example, `\sagestr{SIsage(2442,"\\kilo\\metre\\squared")}`

, and also `\\newton`

. However, there is a more elegant solution: you can use raw strings, which are strings that Python (and Sage) write AS THEY ARE, without formatting them. You just have to write an `r`

before the string. For example, `\sagestr{SIsage(2442,r"\kilo\metre\squared")}`

or `r"\newton"`

.

**2. How to set an unique custom command \SISAGE** You can define the following LaTeX command:

```
\newcommand\sisage[2]{\sagestr{SIsage(#1, r"#2")}}
```

This should work like this:

```
\sisage{21}{\kilo\meter\squared}
\sisage{26}{}
```

should return $21\,\text{km}^2$ and $26$, respectively.

That should solve your problems. However, let me give you one additional advise. Your definition of `SIsage`

can be more efficient. In particular, you can eliminate the external `if-then-else`

:

```
\begin{sagesilent}
def SIsage(number,units=""):
if number in ZZ or number.parent()==QQ:
return r"\SI{"+ str(number) + "}" +"{"+ units + "}"
else:
return r"\SI{"+ str(float(number)) + "}" +"{"+ units + "}"
\end{sagesilent}
```

Another quite interesting thing you can do is define `\sisage`

to take the units argument as optional argument. This is going to be a little technical, and you should ignore it if you're not that experienced with LaTeX. I am putting this here for anyone who has a similar problem.

One alternative is to write in the preamble of your document (before `\begin{document}`

):

```
\newcommand\sisage[2][]{\sagestr{SIsage(#2, r"#1")}}
```

This will allow you to write something like:

```
\sisage[\kilo\meter\squared]{21}
\sisage{26}
```

That is, the units argument is now optional, but it should be specified as first argument.

The second alternative is to write in your preamble:

```
\makeatletter
\def\sisage#1{%
\@ifnextchar[{\@sisage{#1}}{\@sisage{#1}[]}%
}
\def\@sisage#1[#2]{%
\sagestr{SIsage(#1, r"#2")}%
}
\makeatother
```

This will allow you to write something like:

```
\sisage{21}[\kilo\meter\squared]
\sisage{26}
```

That is, the units argument is also optional, but it can now be specified as the second argument.

I hope this helps! Feel free to write me a comment if you have some additional question.

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.