I’ve had these macros in my printer.cfg since I started playing with klipper and I don’t even remember which config example I copied them from.
[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
gcode:
  {% set E = params.E|default(1.7)|float %}
  {% set x_park = printer.toolhead.axis_maximum.x|float - 5.0 %}
  {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %}
  {% set max_z = printer.toolhead.axis_maximum.z|float %}
  {% set act_z = printer.toolhead.position.z|float %}
  {% if act_z < (max_z - 2.0) %}
      {% set z_safe = 2.0 %}
  {% else %}
      {% set z_safe = max_z - act_z %}
  {% endif %}
  SAVE_GCODE_STATE NAME=PAUSE_state
  BASE_PAUSE
  G91
  G1 E-{E} F2100
  G1 Z{z_safe} F900
  G90
  G0 X{x_park} Y{y_park} F6000
  G91
[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
    {% set E = params.E|default(1)|float %} # edit to your preferred retract length
    G91
    G1 E{E} F2100
    G90
    RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
    BASE_RESUME
While testing a filament runout switch, I started re-thinking of the whole M600, load/unload, pause/resume topic and revisited the above macros.
There is one thing I would like to clarify. If the “base” pause/resume commands already save & restore the current position , why do the new pause/resume macros save & restore a second time?