Skip to main content
SubtitleMatrix

Change Subtitle Position

Text and stylingMove subtitles on screen
Or paste subtitle text

Options

Nine preset cells plus a removal. The marker written is {\anN} in numeric-keypad order — 7/8/9 is the top row, 4/5/6 the middle, 1/2/3 the bottom — and it goes in front of each cue's first line. ASS and SSA read it back as a real alignment code; in SRT it is literal text that libass, VLC and mpv honour and simpler players print. Existing \pos coordinates are never touched. Choose the last option to strip position markers instead of adding one.

This page moves every cue in a subtitle file to one of nine screen positions, or clears the position marker off a file that already has one. It writes a `{\anN}` alignment code at the start of each cue's first line, where N numbers the cells the way a numeric keypad does: `7` `8` `9` across the top, `4` `5` `6` down the middle, `1` `2` `3` along the bottom. That layout is not a reading order, and the page's own examples exist mainly to make it impossible to pick top-left and get bottom-left by accident.

The marker is the one piece of placement three formats agree on. On ASS and SSA it is a legal override code, read back into the cue as its own field and re-emitted in the documented order behind any `\pos` — so a file that never leaves ASS survives the round trip exactly. On SRT there is no placement syntax at all, so the marker is written as literal text at the front of the line: libass-based players such as VLC and mpv honour it, and a player that does not know it will print the four characters on screen. The page says this plainly rather than promising placement it cannot guarantee.

Position is treated as a property of the whole cue, so the marker goes in front of the first line only, even when the cue is two or three lines long. An existing `\pos(x,y)` is left alone: a pixel coordinate pins the cue to one screen size and breaks on every other, while an alignment code lets the player compute the position itself, and moving a cue that someone positioned by hand is not what this page was asked to do.

Choosing Remove from the position list is a real instruction, not a tenth position. It strips the leading marker and the stored alignment from every cue — the only way to get an SRT back to its plain, marker-free form — while a marker written in the middle of a line is left where it is, because that one is dialogue rather than placement. Nothing is uploaded and the timecodes are never touched.

Examples

Two plain SRT cues moved to the top centre

Input

1
00:00:01,000 --> 00:00:02,000
Hello there.

2
00:00:03,000 --> 00:00:04,000
Second line.

Output

1
00:00:01,000 --> 00:00:02,000
{\an8}Hello there.

2
00:00:03,000 --> 00:00:04,000
{\an8}Second line.

`\an8` is the top-centre cell — the middle key of the top row of a numeric keypad. The marker goes at the start of the text rather than on a line of its own, and the timecodes, cue numbers and blank lines are untouched, so the file is still a valid SRT that simply carries four extra characters per cue.

The same file in the top-left and the bottom-left corner

Input

1
00:00:01,000 --> 00:00:02,000
Hello there.

Output

1
00:00:01,000 --> 00:00:02,000
{\an7}Hello there.

Top-left is `7`, while bottom-left is `1` — six apart, because the numbering follows a keypad rather than a reading order. That is the mapping most often got wrong by hand, and it is why every one of the nine presets has a case of its own on this page: a single transposed digit is otherwise invisible until someone watches the video.

Moving an ASS cue that was already top-left

Input

[Script Info]
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,{\an7\i1}Hello there{\i0}

Output

[Script Info]
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,{\an2}{\i1}Hello there{\i0}

The old `\an7` is cleared before `\an2` is written, so the cue carries one alignment rather than two — a duplicate would leave the player taking whichever comes last, which is a value nobody in this run chose. The italic pair stays exactly where it was. On ASS the marker is a real override code, so nothing here shows up as text on screen.

Removing markers from a file that has two different ones

Input

1
00:00:01,000 --> 00:00:02,000
{\an8}Hello there.

2
00:00:03,000 --> 00:00:04,000
{\an2}Second line.

Output

1
00:00:01,000 --> 00:00:02,000
Hello there.

2
00:00:03,000 --> 00:00:04,000
Second line.

Remove strips whatever was there rather than only the preset you would have chosen, and writes nothing back. A file that comes out of this run plays at the player's own default position, which is the point: it is the only way back from a marker to plain text, since no position is expressed as the absence of one.

Frequently asked questions

Which screen position is `{\an1}` on, and why does it not start at the top-left?

`1` is the bottom-left corner. The nine values follow the numeric keypad: `7` `8` `9` is the top row of cells, `4` `5` `6` the middle row, `1` `2` `3` the bottom row. So top-left is `7`, centre is `5`, and bottom-right is `3`. The page's position list is written in reading order and translated to these numbers for you, which is the main reason to use it rather than editing the marker by hand.

Does this page work on WebVTT, SAMI or TTML files?

No, and the list of accepted formats is short on purpose: SRT, ASS and SSA only. WebVTT and TTML have their own placement syntax — cue settings such as `line:` and `align:`, or `tts:` attributes — and this page does not write those; accepting them would mean the run reports a position change while the file comes out unchanged. The same reasoning excludes JSON, whose position field has five horizontal values rather than nine cells.

Is the marker visible as text in an SRT file?

It depends on the player, and this page cannot change that. SRT has no placement syntax, so `{\an8}` is stored as ordinary characters at the start of the line. Players built on libass — VLC and mpv among them — read it as an alignment instruction and place the cue accordingly; simpler players treat it as text and will show the four characters on screen. If you need a guaranteed placement on every device, the cue has to be burned into the picture, which is outside what a subtitle file can do.

Will an existing `\pos(x,y)` be overwritten by the new position?

No — `\pos` is left exactly as it was. A pixel coordinate and an alignment code are different instructions: `\an` asks the player to compute the position for the screen it is on, while `\pos` pins the cue to one point at one resolution. Removing a hand-placed `\pos` would undo deliberate work, so this page only writes alignment and only clears a previous alignment, never a coordinate.

A cue is two lines long — does each line get its own marker?

Only the first line is given one, because a position belongs to the cue rather than to the line. A marker on every line would be redundant at best, and on ASS it would be a second override block doing the same thing as the first. When the marker is removed the same rule applies in reverse: only a marker at the very front of the first line is stripped, and one written mid-sentence is treated as part of the dialogue.

What happens if I apply the same position twice?

Nothing — the second run produces a byte-identical file and reports that no cue changed. The page clears any existing marker before writing the new one, so re-applying a preset it already has removes and re-adds the same four characters. That matters when a file goes round a review loop: running the page again to be sure the position is applied cannot shift anything, and the download is the same file rather than a copy with something quietly different in it.

Related tools