Mangels vollständigem
Minimalbeispiel zu dem neuerlichen Problem, weiß ich nicht, wie bei Dir \ac definiert ist. Hier daher ein allgemeiner Vorschlag:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xstring}
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
\noexpandarg
\IfEndWith{#2}{:}
{\StrGobbleRight{#2}{1}[\idxentry]}
{\def\idxentry{#2}}%
\textbf{#2}{\expandafter\index\expandafter{\idxentry#1}}%
}
\begin{document}
\idx{Aal}
\idx{Apfel}
\clearpage
\idx{Aal:}
\idx{Apfel:}
\clearpage
\idx[@ABC]{\ac{ABC}}
\printindex
\end{document}
und eine Alternative dazu:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xstring}
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex
\newcommand\idxentry{}
\newcommand{\idx}[2][\idxentry]{%
\noexpandarg
\IfEndWith{#2}{:}
{\StrGobbleRight{#2}{1}[\idxentry]}
{\def\idxentry{#2}}%
\textbf{#2}\index{#1}%
}
\begin{document}
\idx{Aal}
\idx{Apfel}
\clearpage
\idx{Aal:}
\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex
\end{document}
Während man beim ersten Vorschlag den Indexeintrag über das optionale Argument nur ergänzen kann, ersetzt das optionale Argument (wenn es verwendet wird) den gesamten Indexeintrag. Man kann den zweiten Vorschlag auch noch so abändern, dass ggf. bei Verwendung des optionalen Arguments
xspace-Befehle gar nicht mehr verwendet werden:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xstring}
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
\if\relax\detokenize{#1}\relax
\noexpandarg
\IfEndWith{#2}{:}
{\StrGobbleRight{#2}{1}[\idxentry]}
{\def\idxentry{#2}}%
\textbf{#2}\index{\idxentry}%
\else
\textbf{#2}\index{#1}%
\fi
}
\begin{document}
\idx{Aal}
\idx{Apfel}
\clearpage
\idx{Aal:}
\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex
\end{document}
Bei neueren Versionen von KOMA-Script geht es etwas verständlicher:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xstring}
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
\IfArgIsEmpty{#1}{%
\noexpandarg
\IfEndWith{#2}{:}
{\StrGobbleRight{#2}{1}[\idxentry]}
{\def\idxentry{#2}}%
\textbf{#2}\index{\idxentry}%
}{%
\textbf{#2}\index{#1}%
}%
}
\begin{document}
\idx{Aal}
\idx{Apfel}
\clearpage
\idx{Aal:}
\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex
\end{document}
Leider hat aber der Online-Editor eine veraltete Version von KOMA-Script, die \IfArgIsEmpty noch nicht kennt.