created: 20160424150551727
modified: 20230615114519672
tags: Learning
title: Concatenating text and variables using macro substitution
type: text/vnd.tiddlywiki

!! Important

Since <<.from-version "5.3.0">> it is recommended to use [[substituted attributes|Substituted Attribute Values]] or the [[substitute filter operator|substitute Operator]] to concatenate text and variables.

It's a frequent use case in ~TiddlyWiki that you will want to put the results of variables together with various bits of strings of text. This process in some programming languages is often referred to as "concatenating" text.

---

!! What is Wrong

You might, for instance want to set up a template for your customer database, where links will automatically refer to additional contact information about your customer. Inside your tiddler, you might try something like this:

<<.bad-example "`[[Additional Info|<<currentTiddler>>-Contact]]`">>

But that won't work. If you try this, the link will be interpreted very literally, and will attempt to take you to:

```
<<currentTiddler>>-Contact
```

The solution is to use a macro to put the rendered value of `<<currentTiddler>>` together with the bit of additional text, `-Contact`.

Create a macro at the top of the tiddler like this:

```
\define linkup(link) [[Additional Info|$link$-Contact]]
```

You might be tempted to invoke the new macro like this:

<<.bad-example "`<<linkup <<currentTiddler>> >>`">>

But if you do, you will find that `<<currentTiddler>>` doesn't get rendered, but instead gets passed literally.

Instead, you could use the [[MacroCallWidget]] widget, like this:

```
<$macrocall $name="linkup" link=<<currentTiddler>> />
```

In this case, we passed the value of a variable directly to our macro. This is often a general way to go about this task. If you wanted to create more links based on other variables you could re-use the macro for each situation.

If, as in this case, the only variable you are using is `currentTiddler` then you could write a simple macro, like this:

```
\define linkup() [[Additional Info|$(currentTiddler)$-Contact]]
```

Notice that in this case we don't pass an argument. Instead, we reference the variable using the special syntax `$(variable)$`.  Since we don't pass an argument, we can invoke it without the `<$macrocall>` widget more simply, like this:

```
<<linkup>>
```