+ CounterList::const_iterator it = counterList_.find(counter);
+ if (it == counterList_.end())
+ return from_ascii("??");
+ Counter const & ctr = it->second;
+ Counter::StringMap & sm = ctr.flatLabelStrings(appendix());
+ Counter::StringMap::iterator smit = sm.find(lang);
+ if (smit != sm.end())
+ return counterLabel(smit->second, lang);
+
+ vector<docstring> callers;
+ docstring const & fls = flattenLabelString(counter, appendix(),
+ lang, callers);
+ sm[lang] = fls;
+ return counterLabel(fls, lang);
+}
+
+
+docstring Counters::flattenLabelString(docstring const & counter,
+ bool in_appendix,
+ string const & lang,
+ vector<docstring> & callers) const
+{
+ docstring label;
+
+ if (find(callers.begin(), callers.end(), counter) != callers.end()) {
+ // recursion detected
+ lyxerr << "Warning: Recursion in label for counter `"
+ << counter << "' detected"
+ << endl;
+ return from_ascii("??");
+ }
+
+ CounterList::const_iterator it = counterList_.find(counter);
+ if (it == counterList_.end())