You need another internal state to handle the tt muncher, this is @split. I just like labeling internal states of this macro state machine with names. In this case split splits off the last element of the list.
That state is used to extract the middle. This is recursion, the first @split case is the base case, where there was nothing else in the middle. The second @split case is the recursive case, where there are items in the middle.
Normally, Rust macros essentially behave like linked list pattern match. So you can pattern match (x:xs), but you cannot pattern match the end of the linked list (this is the case in many functional programming languages too).
However, by making use of recursion, you can move the entire middle of the list to another list, leaving you with the last part of a list.