Un TEXT_MARK representa una posición dentro de una línea de texto. Es conceptualmente similar a un iterador, aunque su uso es muy distinto.
Las posiciones guardadas en un TEXT_MARK son puntos inter-caracter. La posición 1 se refiere al punto a la izquierda del primer caracter. La posición 2 al punto entre el primer caracter y al segundo. En una línea de longitud n, la posición n+1 es el punto a la derecha del último caracter.
1 2 3 4 5 Índices en la cadena (line.text) +---+---+---+---+---+ | H | e | l | l | o | Caracteres +---+---+---+---+---+ 1 2 3 4 5 6 Posición (position)
Los TEXT_MARK trabajan en cooperación con TEXT_LINE. La propiedad importante es que se mantienen anclados a un punto lógico del texto en vez de a un índice físico.
Por ejemplo, supongamos que en el esquema anterior hay una marca m en la posición 5 (entre la "l" y la "o"). Si a la línea anterior se le realizan dos operaciones de borrado al principio (borrando la "H" y la "e", la marca se mueve a la posición 3, permaneciendo entre la "l" y la "o":
Antes: +---+---+---+---+---+ | H | e | l | l | o | +---+---+---+---+---+ ^ posición de m Después +---+---+---+ | l | l | o | +---+---+---+ ^ posición de m
Si despues se insertan dos caracteres al principio y uno al final, m vuelve a la posición 5, permaneciendo entre la "l" y la "o".
+---+---+---+---+---+---+ | Y | e | l | l | o | w | +---+---+---+---+---+---+ ^ posición de m
Puede saberse la línea asociada y la posición de un TEXT_MARK por sus atributos `line' y `position'. Pueden modificarse estas a través de `set_line' y `set_position'.
Las marcas multilíneas son casi idénticas a las TEXT_MARK, con la diferencia que el atributo line es de tipo MULTI_TEXT_LINE
El operador < permite comparar dos marcas. El resultado no tiene sentido si se comparas dos marcas que no están en la misma línea, o dos marcas multilínea que no están en el mismo texto.